diff --git a/src/components/app-wrapper.jsx b/src/components/app-wrapper.jsx index 9b93b54415..9c3f6f0b61 100644 --- a/src/components/app-wrapper.jsx +++ b/src/components/app-wrapper.jsx @@ -104,8 +104,6 @@ import backend_locale_en from '../translations/external/backend-locale-en'; import backend_locale_fr from '../translations/external/backend-locale-fr'; import dynamic_mapping_models_en from '../translations/external/dynamic-mapping-models-en'; import dynamic_mapping_models_fr from '../translations/external/dynamic-mapping-models-fr'; -import csv_locale_en from '../translations/dynamic/csv-locale-en'; -import csv_locale_fr from '../translations/dynamic/csv-locale-fr'; import filter_locale_en from '../translations/dynamic/filter-locale-en'; import filter_locale_fr from '../translations/dynamic/filter-locale-fr'; import menu_locale_en from '../translations/dynamic/menu-locale-en'; @@ -435,7 +433,6 @@ const messages = { ...grid_en, ...backend_locale_en, ...dynamic_mapping_models_en, - ...csv_locale_en, ...filter_locale_en, ...menu_locale_en, ...table_locale_en, @@ -482,7 +479,6 @@ const messages = { ...grid_fr, ...backend_locale_fr, ...dynamic_mapping_models_fr, - ...csv_locale_fr, ...filter_locale_fr, ...menu_locale_fr, ...table_locale_fr, diff --git a/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx b/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx index 73099727a7..6349c5f309 100644 --- a/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx +++ b/src/components/dialogs/network-modifications/limit-sets/limit-sets-modification-dialog.tsx @@ -4,21 +4,19 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { - AMOUNT_TEMPORARY_LIMITS, - CSV_FILENAME, - MODIFICATIONS_TABLE, - OLGS_MODIFICATION_TYPE, - TYPE, -} from '../../../utils/field-constants'; import { useIntl } from 'react-intl'; import { CustomFormProvider, - formatModification, - ModificationType, - OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE, + limitSetsTabularModificationEmptyFormData, + LimitSetsTabularModificationForm, + type LimitSetsTabularModificationDto, + limitSetsTabularModificationDtoToForm, + limitSetsTabularModificationFormSchema, + limitSetsTabularModificationFormToDto, + type LimitSetsTabularModificationFormType, snackWithFallback, useSnackMessage, + ModificationType, } from '@gridsuite/commons-ui'; import { SubmitHandler, useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; @@ -29,23 +27,12 @@ import { ModificationDialog } from '../../commons/modificationDialog'; import type { UUID } from 'node:crypto'; import { CurrentTreeNode } from '../../../graph/tree-node.type'; import { FetchStatus } from 'services/utils.type'; -import { LimitSetsTabularModificationForm } from './limit-sets-tabular-modification-form'; import { createTabularModification } from '../../../../services/study/network-modifications'; -import { - emptyFormData, - formatBackToFront, - formatOperationalLimitGroupsFrontToBack, - formatSelectedOperationalGroupId, - formSchema, - LimitSetModificationMetadata, - SchemaType, - LIMIT_SETS_TABULAR_MODIFICATION_EQUIPMENTS, -} from './limit-sets-tabular-modification-utils'; interface LimitSetsModificationDialogProps { studyUuid: UUID; currentNode: CurrentTreeNode; - editData: LimitSetModificationMetadata; + editData: LimitSetsTabularModificationDto; isUpdate: boolean; editDataFetchStatus: FetchStatus; } @@ -62,26 +49,25 @@ export function LimitSetsModificationDialog({ const intl = useIntl(); const { snackError } = useSnackMessage(); - const formMethods = useForm({ - defaultValues: emptyFormData, - resolver: yupResolver(formSchema), + const formMethods = useForm({ + defaultValues: limitSetsTabularModificationEmptyFormData, + resolver: yupResolver(limitSetsTabularModificationFormSchema), }); const { reset, - getValues, formState: { errors }, } = formMethods; const disableSave = Object.keys(errors).length > 0; const clear = useCallback(() => { - reset(emptyFormData); + reset(limitSetsTabularModificationEmptyFormData); }, [reset]); useEffect(() => { if (editData) { - reset(formatBackToFront(editData)); + reset(limitSetsTabularModificationDtoToForm(editData)); } }, [editData, reset, intl]); @@ -89,41 +75,23 @@ export function LimitSetsModificationDialog({ return isUpdate && editDataFetchStatus === FetchStatus.RUNNING; }, [editDataFetchStatus, isUpdate]); - const onSubmit = useCallback>( + const onSubmit = useCallback>( (formData) => { - const amountMaxTemporaryLimits = getValues(AMOUNT_TEMPORARY_LIMITS); - const equipmentModificationType = LIMIT_SETS_TABULAR_MODIFICATION_EQUIPMENTS[formData[TYPE]]; - const modifications = formData[MODIFICATIONS_TABLE]?.map((row) => { - let modification = formatModification(row); - Object.keys(modification).forEach((key) => { - modification[key] = row[key]; - }); - modification.operationalLimitsGroups = [ - formatOperationalLimitGroupsFrontToBack(modification, amountMaxTemporaryLimits), - ]; - formatSelectedOperationalGroupId(modification); - modification.type = equipmentModificationType; // ex: LINE_MODIFICATION - if (row.modificationType === OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE.REPLACE) { - // when 'modificationType' CSV column is REPLACE : activate the 'replace' back-end mode to delete - // all existing limit sets before adding a new one. - modification[OLGS_MODIFICATION_TYPE] = OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE.REPLACE; - } - return modification; - }); + const { modificationType, modifications, csvFilename } = limitSetsTabularModificationFormToDto(formData); createTabularModification({ studyUuid, nodeUuid: currentNodeUuid, - modificationType: equipmentModificationType, + modificationType, modifications, modificationUuid: editData?.uuid, tabularType: ModificationType.LIMIT_SETS_TABULAR_MODIFICATION, - csvFilename: formData[CSV_FILENAME], + csvFilename, }).catch((error) => { snackWithFallback(snackError, error, { headerId: 'TabularModificationError' }); }); }, - [currentNodeUuid, editData, getValues, snackError, studyUuid] + [currentNodeUuid, editData, snackError, studyUuid] ); const open = useOpenShortWaitFetching({ @@ -133,7 +101,7 @@ export function LimitSetsModificationDialog({ }); return ( - + ) { - const intl = useIntl(); - const [isFetching, setIsFetching] = useState(dataFetching); - const [repeatableColumns, setRepeatableColumns] = useState([]); - const tableRef = useRef>(null); - - const { setValue, clearErrors, getValues, setError, trigger } = useFormContext(); - - const language = useSelector((state: AppState) => state.computedLanguage); - - const getTypeLabel = useCallback((type: string) => intl.formatMessage({ id: type }), [intl]); - - const csvColumns = useMemo(() => { - return [...LIMIT_SETS_TABULAR_MODIFICATION_FIXED_FIELDS, ...repeatableColumns]; - }, [repeatableColumns]); - - const requiredColumns = useMemo( - () => csvColumns.filter((column) => column.required).map((column) => column.id), - [csvColumns] - ); - - const amountTemporaryLimits = useWatch({ - name: AMOUNT_TEMPORARY_LIMITS, - }); - const equipmentType = useWatch({ - name: TYPE, - }); - - const [selectedFile, setSelectedFile] = useState(); - const [fileErrorMessage, setFileErrorMessage] = useState(); - - const parseConfig = useMemo>>>( - () => ({ - dynamicTyping: true, - transformHeader: (header) => { - // transform header to modification field - const transformedHeader = LIMIT_SETS_TABULAR_MODIFICATION_FIXED_FIELDS.find( - (field) => intl.formatMessage({ id: field.id }) === header - )?.id; - return transformedHeader ?? header; - }, - transform: (value) => transformIfFrenchNumber(value, language), - }), - [intl, language] - ); - - const getDataFromCsvFile = useCallback( - (results: Papa.ParseResult>, file: File) => { - clearErrors(MODIFICATIONS_TABLE); - let requiredFieldNameInError: string = ''; - let fieldTypeInError: string = ''; - let expectedTypeForFieldInError: string = ''; - let expectedValues: string[] | undefined; - - let keyLabel: string = ''; - // check if the csv contains an error - if ( - results.data - .flatMap((result) => Object.entries(result)) - .some(([key, value]) => { - //Detection of repeatable fields - const fieldDef = csvColumns?.find((field) => { - return ( - field.id === key || - (LIMIT_SETS_TABULAR_MODIFICATION_REPEATABLE_FIELDS.includes(field) && - key.startsWith(field.id)) - ); - }); - keyLabel = `${intl.formatMessage({ id: fieldDef?.name ?? fieldDef?.id })}${fieldDef?.index ? ` ${fieldDef?.index}` : ''}`; - - // check required fields are defined - if (fieldDef !== undefined && fieldDef.required && (value === undefined || value === null)) { - requiredFieldNameInError = keyLabel; - return true; // “yes, we found an error here” → break loop - } - - // check the field types - if (!isFieldTypeOk(value, fieldDef)) { - fieldTypeInError = keyLabel; - expectedTypeForFieldInError = fieldDef?.type ?? ''; - expectedValues = fieldDef?.options; - return true; // “yes, we found an error here” → break loop - } - return false; // keep looking - }) - ) { - if (requiredFieldNameInError !== '') { - setError(MODIFICATIONS_TABLE, { - type: 'custom', - message: intl.formatMessage({ id: 'FieldRequired' }, { requiredFieldNameInError: keyLabel }), - }); - } - setFieldTypeError( - fieldTypeInError, - expectedTypeForFieldInError, - MODIFICATIONS_TABLE, - setError, - intl, - expectedValues - ); - } - - setValue(CSV_FILENAME, file.name); - return results.data.map((row) => ({ - [FieldConstants.AG_GRID_ROW_UUID]: uuid4(), - ...row, - })); - }, - [clearErrors, csvColumns, intl, setError, setValue] - ); - - const computeRepeatableColumns = useCallback(() => { - const columns: TabularField[] = []; - trigger(AMOUNT_TEMPORARY_LIMITS).then((valid) => { - if (valid) { - for (let i = 1; i <= amountTemporaryLimits; i++) { - LIMIT_SETS_TABULAR_MODIFICATION_REPEATABLE_FIELDS.forEach((field) => - columns.push({ - ...field, - id: field.id + i, - name: field.id, - index: i, - }) - ); - } - setRepeatableColumns(columns); - } - }); - }, [amountTemporaryLimits, trigger]); - - const csvTranslatedColumns = useMemo(() => { - return csvColumns.map(({ id, name, index }) => { - return `${intl.formatMessage({ id: name ?? id })}${index ? ` ${index}` : ''}`; - }); - }, [csvColumns, intl]); - - const commentLines = useMemo(() => { - const commentKey = `TabularLimitSetsModificationSkeletonComment`; - const separator = getCsvDelimiter(language); - let commentData: string[][] = []; - if (csvTranslatedColumns) { - commentData.push(csvTranslatedColumns.map((column, index) => (index === 0 ? `#${column}` : column))); - if (commentKey && intl.messages[commentKey]) { - commentData.push(intl.formatMessage({ id: commentKey }).split(separator)); - } - } - return commentData; - }, [intl, csvTranslatedColumns, language]); - - const resetOnTypeChange = useCallback(() => { - setValue(CSV_FILENAME, undefined); - setSelectedFile(undefined); - setFileErrorMessage(undefined); - clearErrors(MODIFICATIONS_TABLE); - tableRef.current?.replace([]); - }, [clearErrors, setValue]); - - const csvFilename = getValues(CSV_FILENAME); - - useEffect(() => { - computeRepeatableColumns(); - }, [computeRepeatableColumns]); - - useEffect(() => { - setSelectedFile(csvFilename ? new File([], csvFilename) : undefined); - }, [csvFilename]); - - useEffect(() => { - setIsFetching(dataFetching); - }, [dataFetching]); - - const equipmentTypeField = ( - getTypeLabel(option as string)} - size={'small'} - formProps={{ variant: 'outlined' }} - shouldOpenPopup={() => hasNonEmptyRows(getValues(MODIFICATIONS_TABLE))} - onValueChange={resetOnTypeChange} - message="changeTypeMessage" - validateButtonLabel="button.changeType" - /> - ); - - const columnDefs = useMemo( - () => - csvColumns.map(({ id, name, type, index }) => ({ - field: id, - pinned: id === EQUIPMENT_ID ? true : undefined, - headerName: `${intl.formatMessage({ id: name ?? id })} ${index ?? ''}`, - cellRenderer: type === BOOLEAN ? BooleanNullableCellRenderer : DefaultCellRenderer, - })), - [csvColumns, intl] - ); - - const limitSetModificationsDefaultColDef = useMemo( - () => ({ - lockPinned: true, - resizable: false, - wrapHeaderText: true, - sortable: true, - autoHeaderHeight: true, - cellRenderer: DefaultCellRenderer, - }), - [] - ); - - const makeDefaultRowData = useCallback( - () => ({ - [FieldConstants.AG_GRID_ROW_UUID]: uuid4(), - ...Object.fromEntries(csvColumns.map((column) => [column.id, null])), - }), - [csvColumns] - ); - - const getTemplateData = useCallback( - () => [csvColumns.map((column) => column.id), ...commentLines], - [csvColumns, commentLines] - ); - - const getTableData = useCallback(() => { - const headers = csvColumns.map((column) => column.id); - const rows = (getValues(MODIFICATIONS_TABLE) ?? []) as Record[]; - return [...getTemplateData(), ...rows.map((row) => headers.map((id) => row[id] ?? ''))]; - }, [csvColumns, getValues, getTemplateData]); - - const csvProps = useMemo( - () => ({ - fileName: 'limitset_modification_template', - language, - getTableData, - }), - [language, getTableData] - ); - - return ( - - {equipmentTypeField} - {equipmentType && ( - <> - - - - - - - - - - - > - label="UploadCSV" - requiredColumns={requiredColumns} - language={language} - parseConfig={parseConfig} - selectedFile={selectedFile} - onFileChange={setSelectedFile} - onFileError={setFileErrorMessage} - getTableData={() => getValues(MODIFICATIONS_TABLE)} - onReplace={(results, file) => - tableRef.current?.replace(getDataFromCsvFile(results, file)) - } - onAppend={(results, file) => - tableRef.current?.append(getDataFromCsvFile(results, file)) - } - /> - - - {fileErrorMessage && ( - - {fileErrorMessage} - - )} - - - - - )} - - ); -} diff --git a/src/components/dialogs/network-modifications/limit-sets/limit-sets-tabular-modification-utils.ts b/src/components/dialogs/network-modifications/limit-sets/limit-sets-tabular-modification-utils.ts deleted file mode 100644 index 65398f3287..0000000000 --- a/src/components/dialogs/network-modifications/limit-sets/limit-sets-tabular-modification-utils.ts +++ /dev/null @@ -1,263 +0,0 @@ -/** - * Copyright (c) 2025, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -import { - AMOUNT_TEMPORARY_LIMITS, - APPLICABILITY_FIELD, - CSV_FILENAME, - EQUIPMENT_ID, - IS_ACTIVE, - LIMIT_GROUP_NAME, - MODIFICATION_TYPE, - MODIFICATIONS_TABLE, - PERMANENT_LIMIT, - SELECTED_OPERATIONAL_LIMITS_GROUP_ID1, - SELECTED_OPERATIONAL_LIMITS_GROUP_ID2, - SIDE, - TEMPORARY_LIMIT_DURATION, - TEMPORARY_LIMIT_NAME, - TEMPORARY_LIMIT_VALUE, - TEMPORARY_LIMITS_MODIFICATION_TYPE, - TYPE, -} from '../../../utils/field-constants'; -import * as yup from 'yup'; -import type { UUID } from 'node:crypto'; -import { - APPLICABILITY, - AttributeModification, - EquipmentType, - MODIFICATION_TYPES, - MODIFICATIONS_REQUIRED_TAB_ERROR, - OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE, - type TabularField, - TEMPORARY_LIMIT_MODIFICATION_TYPE, - toModificationOperation, -} from '@gridsuite/commons-ui'; -import { BOOLEAN, ENUM, NUMBER } from '../../../network/constants'; -import { AMOUNT_TEMPORARY_LIMITS_ERROR } from '../../../../utils/translationKeys'; - -export const LIMIT_SETS_TABULAR_MODIFICATION_EQUIPMENTS: { [key: string]: string } = { - LINE: MODIFICATION_TYPES.LINE_MODIFICATION.type, - TWO_WINDINGS_TRANSFORMER: MODIFICATION_TYPES.TWO_WINDINGS_TRANSFORMER_MODIFICATION.type, -}; - -export const LIMIT_SETS_TABULAR_MODIFICATION_FIXED_FIELDS: TabularField[] = [ - { id: EQUIPMENT_ID, required: true }, - { - id: SIDE, - required: true, - type: ENUM, - options: Object.values(APPLICABILITY).map((applicability) => applicability.id), - }, - { id: LIMIT_GROUP_NAME, required: true }, - { id: IS_ACTIVE, required: false, type: BOOLEAN }, - { id: PERMANENT_LIMIT, required: false, type: NUMBER }, - { - id: MODIFICATION_TYPE, - required: true, - type: ENUM, - options: Object.values(OPERATIONAL_LIMITS_GROUPS_MODIFICATION_TYPE), - }, - { - id: TEMPORARY_LIMITS_MODIFICATION_TYPE, - required: false, - type: ENUM, - options: Object.values(TEMPORARY_LIMIT_MODIFICATION_TYPE), - }, -]; - -export const LIMIT_SETS_TABULAR_MODIFICATION_REPEATABLE_FIELDS: TabularField[] = [ - { id: TEMPORARY_LIMIT_NAME, required: false }, - { id: TEMPORARY_LIMIT_DURATION, required: false, type: NUMBER }, - { id: TEMPORARY_LIMIT_VALUE, required: false, type: NUMBER }, -]; - -type TemporaryLimit = { - name: AttributeModification; - value: AttributeModification; - acceptableDuration: AttributeModification; -}; - -type CurrentLimits = { - permanentLimit: number; - temporaryLimits: TemporaryLimit[]; -}; - -type OperationalLimitGroup = { - id: string; - modificationType: string; - temporaryLimitsModificationType: string; - selectedOperationalLimitsGroupId: string; - applicability: string; - currentLimits: CurrentLimits; - type: string; -}; - -type LimitSetModification = { - uuid: string; - type: string; - activated: boolean; - date: string; - equipmentId: string; - operationalLimitsGroups: OperationalLimitGroup[]; - selectedOperationalLimitsGroupId1: AttributeModification; - selectedOperationalLimitsGroupId2: AttributeModification; - stashed: boolean; -}; - -export type LimitSetModificationMetadata = { - activated: boolean; - date: string; - modificationType: string; - modifications: LimitSetModification[]; - stashed: boolean; - type: string; - uuid: UUID; - csvFilename: string; -}; - -const DEFAULT_TEMPORARY_LIMITS = 1; - -const getAmountTemporaryLimits = (editData: LimitSetModificationMetadata) => { - // We check all modifications to determine the max limits number. - let maxLength = DEFAULT_TEMPORARY_LIMITS; - for (const mod of editData.modifications) { - for (const limit of mod?.operationalLimitsGroups ?? []) { - const temporaryLimitsLength = limit.currentLimits?.temporaryLimits?.length ?? 0; - maxLength = Math.max(maxLength, temporaryLimitsLength); - } - } - return maxLength; -}; - -export const formatTemporaryLimitsFrontToBack = (modification: ModificationRow, amountMaxTemporaryLimits: number) => { - const temporaryLimits = []; - for (let i = 1; i <= amountMaxTemporaryLimits; i++) { - temporaryLimits.push({ - name: toModificationOperation(modification[TEMPORARY_LIMIT_NAME + i]), - value: toModificationOperation(modification[TEMPORARY_LIMIT_VALUE + i]), - acceptableDuration: toModificationOperation(modification[TEMPORARY_LIMIT_DURATION + i]), - modificationType: modification[TEMPORARY_LIMITS_MODIFICATION_TYPE], - }); - } - return temporaryLimits; -}; -export const formatSelectedOperationalGroupId = (modification: ModificationRow) => { - if (modification[IS_ACTIVE]) { - if (modification[SIDE] === APPLICABILITY.SIDE1.id) { - modification.selectedOperationalLimitsGroupId1 = toModificationOperation(modification[LIMIT_GROUP_NAME]); - } else if (modification[SIDE] === APPLICABILITY.SIDE2.id) { - modification.selectedOperationalLimitsGroupId2 = toModificationOperation(modification[LIMIT_GROUP_NAME]); - } else if (modification[SIDE] === APPLICABILITY.EQUIPMENT.id) { - modification.selectedOperationalLimitsGroupId1 = toModificationOperation(modification[LIMIT_GROUP_NAME]); - modification.selectedOperationalLimitsGroupId2 = toModificationOperation(modification[LIMIT_GROUP_NAME]); - } - } -}; - -export const formatOperationalLimitGroupsFrontToBack = ( - modification: ModificationRow, - amountMaxTemporaryLimits: number -) => { - return { - id: modification[LIMIT_GROUP_NAME], - applicability: modification[SIDE], - modificationType: modification[MODIFICATION_TYPE], - temporaryLimitsModificationType: modification[TEMPORARY_LIMITS_MODIFICATION_TYPE], - currentLimits: { - permanentLimit: modification[PERMANENT_LIMIT], - temporaryLimits: formatTemporaryLimitsFrontToBack(modification, amountMaxTemporaryLimits), - }, - }; -}; -const formatTemporaryLimitsBackToFront = (temporaryLimits: TemporaryLimit[]) => { - const modification: ModificationRow = {}; - for (let i = 0; i < temporaryLimits.length; i++) { - const index = i + 1; // Fields are 1-indexed - const tempLimit = temporaryLimits[i]; - - modification[TEMPORARY_LIMIT_NAME + index] = tempLimit.name?.value; - modification[TEMPORARY_LIMIT_VALUE + index] = tempLimit.value?.value; - modification[TEMPORARY_LIMIT_DURATION + index] = tempLimit.acceptableDuration?.value; - } - return modification; -}; - -const getEquipmentTypeFromLimitSetModificationType = (type: string) => { - return Object.keys(LIMIT_SETS_TABULAR_MODIFICATION_EQUIPMENTS).find( - (key) => LIMIT_SETS_TABULAR_MODIFICATION_EQUIPMENTS[key] === type - ); -}; - -export const formatBackToFront = (editData: LimitSetModificationMetadata) => { - const operationalLimitGroups = formatOperationalLimitGroupsBackToFront(editData); - return { - [TYPE]: getEquipmentTypeFromLimitSetModificationType(editData.modificationType), - [AMOUNT_TEMPORARY_LIMITS]: getAmountTemporaryLimits(editData), - [MODIFICATIONS_TABLE]: operationalLimitGroups, - [CSV_FILENAME]: editData.csvFilename, - }; -}; - -const mapOperationalLimitGroupBackToFront = ( - modification: LimitSetModification, - group: OperationalLimitGroup -): ModificationRow => { - let row: ModificationRow = {}; - row[EQUIPMENT_ID] = modification[EQUIPMENT_ID]; - row[IS_ACTIVE] = - (modification[SELECTED_OPERATIONAL_LIMITS_GROUP_ID1]?.value === group.id && - group.applicability === APPLICABILITY.SIDE1.id) || - (modification[SELECTED_OPERATIONAL_LIMITS_GROUP_ID2]?.value === group.id && - group.applicability === APPLICABILITY.SIDE2.id) || - (modification[SELECTED_OPERATIONAL_LIMITS_GROUP_ID2]?.value === group.id && - modification[SELECTED_OPERATIONAL_LIMITS_GROUP_ID1]?.value === group.id && - group.applicability === APPLICABILITY.EQUIPMENT.id); - row[SIDE] = group[APPLICABILITY_FIELD]; - row[LIMIT_GROUP_NAME] = group.id; - row[MODIFICATION_TYPE] = group.modificationType; - row[TEMPORARY_LIMITS_MODIFICATION_TYPE] = group.temporaryLimitsModificationType; - row[PERMANENT_LIMIT] = group.currentLimits.permanentLimit; - - const tempLimitFields = formatTemporaryLimitsBackToFront(group.currentLimits.temporaryLimits); - return { - ...row, - ...tempLimitFields, - }; -}; - -const formatOperationalLimitGroupsBackToFront = (group: LimitSetModificationMetadata): OperationalLimitGroup[] => { - const modifications: OperationalLimitGroup[] = []; - for (let modification of group.modifications) { - for (let operationalLimitGroup of modification?.operationalLimitsGroups ?? []) { - modifications.push(mapOperationalLimitGroupBackToFront(modification, operationalLimitGroup)); - } - } - - return modifications; -}; -export const formSchema = yup - .object() - .shape({ - [TYPE]: yup.string().nullable().required(), - [AMOUNT_TEMPORARY_LIMITS]: yup - .number() - .min(1, AMOUNT_TEMPORARY_LIMITS_ERROR) - .max(50, AMOUNT_TEMPORARY_LIMITS_ERROR) - .required(), - [MODIFICATIONS_TABLE]: yup.array().min(1, MODIFICATIONS_REQUIRED_TAB_ERROR).required(), - [CSV_FILENAME]: yup.string().nullable().required(), - }) - .required(); -export type SchemaType = yup.InferType; -export type ModificationRow = SchemaType[typeof MODIFICATIONS_TABLE][number]; - -export const emptyFormData: SchemaType = { - [TYPE]: EquipmentType.LINE, - [AMOUNT_TEMPORARY_LIMITS]: DEFAULT_TEMPORARY_LIMITS, - [MODIFICATIONS_TABLE]: [], - [CSV_FILENAME]: '', -}; diff --git a/src/components/utils/field-constants.ts b/src/components/utils/field-constants.ts index 9363f28eff..2773c56eec 100644 --- a/src/components/utils/field-constants.ts +++ b/src/components/utils/field-constants.ts @@ -41,16 +41,6 @@ export const EXPORT_PARAMETERS = 'exportParameters'; export const EXPORT_DESTINATION = 'exportDestination'; export const TYPE = 'type'; -export const AMOUNT_TEMPORARY_LIMITS = 'amountTemporaryLimits'; -export const MODIFICATION_TYPE = 'modificationType'; -export const TEMPORARY_LIMITS_MODIFICATION_TYPE = 'temporaryLimitsModificationType'; -export const SIDE = 'side'; -export const LIMIT_GROUP_NAME = 'limitGroupName'; -export const IS_ACTIVE = 'isActive'; -export const SELECTED_OPERATIONAL_LIMITS_GROUP_ID1 = 'selectedOperationalLimitsGroupId1'; -export const SELECTED_OPERATIONAL_LIMITS_GROUP_ID2 = 'selectedOperationalLimitsGroupId2'; -export const MODIFICATIONS_TABLE = 'modificationsTable'; -export const CSV_FILENAME = 'csvFilename'; export const CHARACTERISTICS = 'characteristics'; export const R = 'r'; @@ -63,8 +53,6 @@ export const CURRENT_LIMITS = 'currentLimits'; export const LIMITS_PROPERTIES = 'limitsProperties'; export const OLG_IS_DUPLICATE = 'operationalLimitsGroupsIsDuplicate'; export const ENABLE_OLG_MODIFICATION = 'enableOLGModification'; -export const OLGS_MODIFICATION_TYPE = 'operationalLimitsGroupsModificationType'; -export const PERMANENT_LIMIT = 'permanentLimit'; export const CONNECTIVITY_1 = 'connectivity1'; export const CONNECTIVITY_2 = 'connectivity2'; export const LINE_SEGMENTS = 'lineSegments'; @@ -125,9 +113,6 @@ export const TAB_HEADER = 'tabHeader'; export const LIMIT_SET_NAME = 'limitSetName'; export const LIMIT_VALUE = 'limitValue'; export const TEMPORARY_LIMITS = 'temporaryLimits'; -export const TEMPORARY_LIMIT_NAME = 'name'; -export const TEMPORARY_LIMIT_DURATION = 'acceptableDuration'; -export const TEMPORARY_LIMIT_VALUE = 'value'; export const SEGMENT_DISTANCE_VALUE = 'segmentDistanceValue'; export const SEGMENT_TYPE_VALUE = 'segmentTypeValue'; diff --git a/src/translations/dynamic/csv-locale-en.ts b/src/translations/dynamic/csv-locale-en.ts deleted file mode 100644 index 3294274aa7..0000000000 --- a/src/translations/dynamic/csv-locale-en.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2024, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -const csv_locale_en = { - // Used in the limit sets tabular modification - TabularLimitSetsModificationSkeletonComment: - '#,SIDE1 | SIDE2 | EQUIPMENT,,true | false,,ADD | MODIFY | MODIFY_OR_ADD | DELETE | REPLACE,ADD | MODIFY | MODIFY_OR_ADD | DELETE | REPLACE (taken into account only when modificationType is set on modifying)', -}; - -export default csv_locale_en; diff --git a/src/translations/dynamic/csv-locale-fr.ts b/src/translations/dynamic/csv-locale-fr.ts deleted file mode 100644 index 6d84c4db1d..0000000000 --- a/src/translations/dynamic/csv-locale-fr.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2024, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -const csv_locale_fr = { - // Used in the limit sets tabular modification - TabularLimitSetsModificationSkeletonComment: - '#;SIDE1 | SIDE2 | EQUIPMENT;;true | false;;ADD | MODIFY | MODIFY_OR_ADD | DELETE | REPLACE;ADD | MODIFY | MODIFY_OR_ADD | DELETE | REPLACE (pris en compte uniquement lorsque modificationType est défini sur modifier)', -}; - -export default csv_locale_fr; diff --git a/src/translations/messages-en.ts b/src/translations/messages-en.ts index 6d91037915..eea1c96302 100644 --- a/src/translations/messages-en.ts +++ b/src/translations/messages-en.ts @@ -549,17 +549,6 @@ const messages_en = { LccCreationError: 'Error while creating HVDC (LCC)', LimitSetNamingError: "Two limits sets can't have the same name and be applicable on a same side.", LimitSetCreationEmptyError: "Limit sets names can't be empty", - LimitSetsTabularModification: 'Tabular modification of limits sets', - TabularLimitSets: 'Limit sets', - amountTemporaryLimits: 'Number of temporary limits', - amountTemporaryLimitsError: 'Limits number between 1 and 50', - acceptableDuration: 'Duration (s)', - value: 'Value (A)', - side: 'Side', - limitGroupName: 'Limits set name', - isActive: 'Active', - modificationType: 'Modification type', - temporaryLimitsModificationType: 'Temporary limits modification type', NbModificationToPaste: 'Paste {nb} modification{several}', NbModificationToRestore: 'Restore {nb} modification{several}', diff --git a/src/translations/messages-fr.ts b/src/translations/messages-fr.ts index 13d3f31f38..b759a176b5 100644 --- a/src/translations/messages-fr.ts +++ b/src/translations/messages-fr.ts @@ -557,17 +557,6 @@ const messages_fr = { LccCreationError: "Erreur lors de la création d'une HVDC (LCC)", LimitSetNamingError: "Deux jeux de limites ne peuvent pas avoir le même nom et s'appliquer d'un même côté.", LimitSetCreationEmptyError: 'Les noms de jeux de limites ne peuvent pas être vides.', - LimitSetsTabularModification: 'Modification tabulaire de jeux de limites', - TabularLimitSets: 'Jeux de limite', - amountTemporaryLimits: 'Nombre de limites temporaires', - amountTemporaryLimitsError: 'Nombre de limites entre 1 et 50', - acceptableDuration: 'Tempo (s)', - value: 'Valeur (A)', - side: 'Côté', - isActive: 'Actif', - limitGroupName: 'Nom du jeu de limites', - modificationType: 'Type de modification', - temporaryLimitsModificationType: 'Type de modification des limites temporaires', NbModificationToPaste: 'Coller {nb} modification{several}', NbModificationToRestore: 'Restaurer {nb} modification{several}', diff --git a/src/utils/translationKeys.ts b/src/utils/translationKeys.ts index 1abbfa7622..fd121e2505 100644 --- a/src/utils/translationKeys.ts +++ b/src/utils/translationKeys.ts @@ -15,5 +15,4 @@ export const DC_RESISTANCE_MUST_BE_GREATER_OR_EQUAL_TO_ZERO = 'dcResistanceMustB export const MAX_P_MUST_BE_GREATER_OR_EQUAL_TO_ZERO = 'maxPMustBeGreaterOrEqualToZero'; export const ACTIVE_POWER_SETPOINT_MAX_VALUE_ERROR = 'activePowerSetpointMaxValueError'; export const ACTIVE_POWER_SETPOINT_MIN_VALUE_ERROR = 'activePowerSetpointMinValueError'; -export const AMOUNT_TEMPORARY_LIMITS_ERROR = 'amountTemporaryLimitsError'; export const POWER_FACTOR_INTERVAL_VALUE_ERROR = 'powerFactorIntervalValueError';