From 1c94ae8354a7f3e4d5bd1dcafc5107ea639d31e8 Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Thu, 27 Jul 2023 17:00:30 +0200
Subject: [PATCH 1/8] front: refacto clone infra workflow
---
.../InfraSelectorEditionActionsBar.tsx | 27 ++++++++------
.../InfraSelectorEditionActionsBarDelete.jsx | 4 +--
.../InfraSelectorEditionItem.jsx | 6 ++--
.../InfraSelector/InfraSelectorModal.tsx | 35 ++++++-------------
.../InfraSelectorModalBodyEdition.tsx | 12 +++----
5 files changed, 38 insertions(+), 46 deletions(-)
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
index a2630becba9..d4ca3528937 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
@@ -5,25 +5,27 @@ import { post, get, put } from 'common/requests';
import { MdCancel, MdCheck } from 'react-icons/md';
import fileDownload from 'js-file-download';
import { Infra, osrdEditoastApi } from 'common/api/osrdEditoastApi';
+import { useDispatch } from 'react-redux';
+import { setFailure } from 'reducers/main';
import { INFRA_URL } from './Consts';
type ActionBarProps = {
infra: Infra;
isFocused?: number;
setIsFocused: (focus?: number) => void;
- getInfrasList: () => void;
+ // getInfrasList: () => void;
inputValue: string;
};
-export default function ActionsBar({
+export default function ActionsBar2({
infra,
isFocused,
setIsFocused,
- getInfrasList,
inputValue,
}: ActionBarProps) {
const { t } = useTranslation('infraManagement');
const [isWaiting, setIsWaiting] = useState(false);
+ const dispatch = useDispatch();
const [cloneInfra] = osrdEditoastApi.usePostInfraByIdCloneMutation();
@@ -32,7 +34,7 @@ export default function ActionsBar({
setIsWaiting(true);
try {
await post(`${INFRA_URL}${infra.id}/${action}/`, {});
- getInfrasList();
+ // getInfrasList();
setIsWaiting(false);
} catch (e) {
setIsWaiting(false);
@@ -57,14 +59,19 @@ export default function ActionsBar({
if (!isWaiting) {
setIsWaiting(true);
try {
- await cloneInfra({ id: infra.id, name: `${infra.name}_copy` }).unwrap();
- setIsWaiting(false);
+ await cloneInfra({ id: infra.id, name: `${infra.name}_copy` });
} catch (e) {
+ if (e instanceof Error) {
+ dispatch(
+ setFailure({
+ name: e.name,
+ message: e.message,
+ })
+ );
+ }
+ } finally {
setIsWaiting(false);
}
- setTimeout(() => {
- getInfrasList();
- }, 1000);
}
}
@@ -73,7 +80,7 @@ export default function ActionsBar({
setIsWaiting(true);
try {
await put(`${INFRA_URL}${infra.id}/`, { name: inputValue });
- getInfrasList();
+ // getInfrasList();
setIsFocused(undefined);
setIsWaiting(false);
} catch (e) {
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
index 5772f9af00f..47b5b83a68f 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
@@ -13,7 +13,7 @@ export default function InfraSelectorEditionActionsBarDelete(props) {
try {
await deleteRequest(`${INFRA_URL}${infra.id}/`);
setRunningDelete(undefined);
- getInfrasList();
+ // getInfrasList();
} catch (e) {
/* empty */
}
@@ -61,7 +61,7 @@ export default function InfraSelectorEditionActionsBarDelete(props) {
}
InfraSelectorEditionActionsBarDelete.propTypes = {
- getInfrasList: PropTypes.func.isRequired,
+ // getInfrasList: PropTypes.func.isRequired,
infra: PropTypes.object.isRequired,
setRunningDelete: PropTypes.func.isRequired,
};
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx b/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
index 626bdd61caf..3f1bc17b8e6 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
@@ -27,7 +27,7 @@ export default function InfraSelectorEditionItem(props) {
) : null}
{isFocused === infra.id ? null : (
@@ -81,7 +81,7 @@ export default function InfraSelectorEditionItem(props) {
infra={infra}
isFocused={isFocused}
setIsFocused={setIsFocused}
- getInfrasList={getInfrasList}
+ // getInfrasList={getInfrasList}
inputValue={value}
/>
@@ -100,5 +100,5 @@ InfraSelectorEditionItem.propTypes = {
setIsFocused: PropTypes.func.isRequired,
runningDelete: PropTypes.number,
setRunningDelete: PropTypes.func.isRequired,
- getInfrasList: PropTypes.func.isRequired,
+ // getInfrasList: PropTypes.func.isRequired,
};
diff --git a/front/src/common/InfraSelector/InfraSelectorModal.tsx b/front/src/common/InfraSelector/InfraSelectorModal.tsx
index 4a5d50042ae..2b644695655 100644
--- a/front/src/common/InfraSelector/InfraSelectorModal.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorModal.tsx
@@ -20,52 +20,37 @@ const InfraSelectorModal = ({
onInfraChange,
onlySelectionMode = false,
}: InfraSelectorModalProps) => {
- const [infrasList, setInfrasList] = useState([]);
const { t } = useTranslation(['translation', 'infraManagement']);
const [filter, setFilter] = useState('');
const [filteredInfrasList, setFilteredInfrasList] = useState([]);
const [editionMode, setEditionMode] = useState(false);
- const [isFetching, setIsFetching] = useState(false);
- const [getInfra] = osrdEditoastApi.endpoints.getInfra.useLazyQuery();
+ const { data: infrasList, isSuccess, isLoading } = osrdEditoastApi.useGetInfraQuery();
const debouncedFilter = useDebounce(filter, 250);
function filterInfras(infrasListLocal: Infra[]) {
if (debouncedFilter && debouncedFilter !== '') {
- infrasListLocal = infrasList.filter((infra) =>
+ infrasListLocal = infrasListLocal.filter((infra) =>
infra.name.toLowerCase().includes(debouncedFilter.toLowerCase())
);
}
const filteredInfrasListLocal = infrasListLocal
.slice()
.sort((a, b) => a.name.localeCompare(b.name));
-
setFilteredInfrasList(filteredInfrasListLocal);
}
- const getInfrasList = () => {
- setIsFetching(true);
- getInfra()
- .unwrap()
- .then(({ results }) => {
- setInfrasList(results as Infra[]);
- filterInfras(results as Infra[]);
- setIsFetching(false);
- })
- .catch(() => setIsFetching(false));
- };
-
useEffect(() => {
- if (infrasList) {
- filterInfras(infrasList);
+ if (infrasList?.results) {
+ filterInfras(infrasList.results);
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
}, [debouncedFilter]);
useEffect(() => {
- getInfrasList();
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
+ if (isSuccess && infrasList?.results && infrasList.results.length > 0) {
+ filterInfras(infrasList.results);
+ }
+ }, [isSuccess, infrasList]);
return (
<>
@@ -101,7 +86,7 @@ const InfraSelectorModal = ({
- {isFetching && (
+ {isLoading && (
@@ -111,7 +96,7 @@ const InfraSelectorModal = ({
infrasList={filteredInfrasList}
setFilter={setFilter}
filter={filter}
- getInfrasList={getInfrasList}
+ // getInfrasList={getInfrasList}
/>
) : (
>;
filter: string;
- getInfrasList: () => void;
+ // getInfrasList: () => void;
};
const InfraSelectorModalBodyEdition = ({
infrasList,
setFilter,
filter = '',
- getInfrasList,
-}: InfraSelectorModalBodyEditionProps) => {
+}: // getInfrasList,
+InfraSelectorModalBodyEditionProps) => {
const [isFocused, setIsFocused] = useState(undefined);
const [runningDelete, setRunningDelete] = useState(undefined);
const [nameNewInfra, setNameNewInfra] = useState('');
@@ -71,14 +71,14 @@ const InfraSelectorModalBodyEdition = ({
.unwrap()
.then(() => {
setSelectedFile(undefined);
- getInfrasList();
+ // getInfrasList();
setErrorMessage(undefined);
});
} else {
postInfra({ body: { name: nameNewInfra } })
.unwrap()
.then(() => {
- getInfrasList();
+ // getInfrasList();
setErrorMessage(undefined);
});
}
@@ -110,7 +110,7 @@ const InfraSelectorModalBodyEdition = ({
runningDelete={runningDelete}
setRunningDelete={setRunningDelete}
setIsFocused={setIsFocused}
- getInfrasList={getInfrasList}
+ // getInfrasList={getInfrasList}
/>
))}
From 43d99a55effd8c17b7b3a88226d6ef641b96f3bd Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Thu, 27 Jul 2023 17:19:52 +0200
Subject: [PATCH 2/8] front: migrate rename infra with rtk
---
.../InfraSelectorEditionActionsBar.tsx | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
index d4ca3528937..f0ac1c8cef6 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
@@ -1,7 +1,7 @@
import React, { useState } from 'react';
import { FaCopy, FaDownload, FaLock, FaLockOpen, FaPencilAlt } from 'react-icons/fa';
import { useTranslation } from 'react-i18next';
-import { post, get, put } from 'common/requests';
+import { post, get } from 'common/requests';
import { MdCancel, MdCheck } from 'react-icons/md';
import fileDownload from 'js-file-download';
import { Infra, osrdEditoastApi } from 'common/api/osrdEditoastApi';
@@ -28,6 +28,7 @@ export default function ActionsBar2({
const dispatch = useDispatch();
const [cloneInfra] = osrdEditoastApi.usePostInfraByIdCloneMutation();
+ const [updateInfra] = osrdEditoastApi.usePutInfraByIdMutation();
async function handleLockedState(action: string) {
if (!isWaiting) {
@@ -79,11 +80,18 @@ export default function ActionsBar2({
if (!isWaiting) {
setIsWaiting(true);
try {
- await put(`${INFRA_URL}${infra.id}/`, { name: inputValue });
- // getInfrasList();
+ await updateInfra({ id: infra.id, body: { name: inputValue } });
setIsFocused(undefined);
- setIsWaiting(false);
} catch (e) {
+ if (e instanceof Error) {
+ dispatch(
+ setFailure({
+ name: e.name,
+ message: e.message,
+ })
+ );
+ }
+ } finally {
setIsWaiting(false);
}
}
From 69be280ed087d81cd753405af8b22a9eb73c128e Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Thu, 27 Jul 2023 17:52:05 +0200
Subject: [PATCH 3/8] front: migrate lock unlock infra with rtk
---
front/src/common/InfraSelector/Consts.jsx | 2 -
.../InfraSelectorEditionActionsBar.tsx | 38 +++++++++++--------
.../InfraSelectorEditionActionsBarDelete.jsx | 2 +-
front/src/common/InfraSelector/consts.ts | 4 ++
4 files changed, 28 insertions(+), 18 deletions(-)
delete mode 100644 front/src/common/InfraSelector/Consts.jsx
create mode 100644 front/src/common/InfraSelector/consts.ts
diff --git a/front/src/common/InfraSelector/Consts.jsx b/front/src/common/InfraSelector/Consts.jsx
deleted file mode 100644
index a3ca67aaa44..00000000000
--- a/front/src/common/InfraSelector/Consts.jsx
+++ /dev/null
@@ -1,2 +0,0 @@
-export const INFRA_URL = '/editoast/infra/';
-export const INFRA_URL_OLD = '/infra/';
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
index f0ac1c8cef6..4b528eb1678 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
@@ -1,43 +1,51 @@
import React, { useState } from 'react';
import { FaCopy, FaDownload, FaLock, FaLockOpen, FaPencilAlt } from 'react-icons/fa';
import { useTranslation } from 'react-i18next';
-import { post, get } from 'common/requests';
+import { get } from 'common/requests';
import { MdCancel, MdCheck } from 'react-icons/md';
import fileDownload from 'js-file-download';
import { Infra, osrdEditoastApi } from 'common/api/osrdEditoastApi';
import { useDispatch } from 'react-redux';
import { setFailure } from 'reducers/main';
-import { INFRA_URL } from './Consts';
+import { INFRA_URL, InfraLockState } from './consts';
type ActionBarProps = {
infra: Infra;
isFocused?: number;
setIsFocused: (focus?: number) => void;
- // getInfrasList: () => void;
inputValue: string;
};
-export default function ActionsBar2({
- infra,
- isFocused,
- setIsFocused,
- inputValue,
-}: ActionBarProps) {
+export default function ActionsBar({ infra, isFocused, setIsFocused, inputValue }: ActionBarProps) {
const { t } = useTranslation('infraManagement');
const [isWaiting, setIsWaiting] = useState(false);
const dispatch = useDispatch();
+ const [lockInfra] = osrdEditoastApi.usePostInfraByIdLockMutation();
+ const [unlockInfra] = osrdEditoastApi.usePostInfraByIdUnlockMutation();
const [cloneInfra] = osrdEditoastApi.usePostInfraByIdCloneMutation();
const [updateInfra] = osrdEditoastApi.usePutInfraByIdMutation();
- async function handleLockedState(action: string) {
+ async function handleLockedState(action: InfraLockState) {
if (!isWaiting) {
setIsWaiting(true);
try {
- await post(`${INFRA_URL}${infra.id}/${action}/`, {});
- // getInfrasList();
- setIsWaiting(false);
+ if (action === InfraLockState.LOCK) {
+ await lockInfra({ id: infra.id });
+ }
+ if (action === InfraLockState.UNLOCK) {
+ await unlockInfra({ id: infra.id });
+ }
} catch (e) {
+ if (e instanceof Error) {
+ dispatch(
+ setFailure({
+ name: e.name,
+ message: e.message,
+ })
+ );
+ }
+ } finally {
setIsWaiting(false);
}
}
@@ -137,7 +145,7 @@ export default function ActionsBar2({
className="infraslist-item-action unlock"
type="button"
title={t('infraManagement:actions.unlock')}
- onClick={() => handleLockedState('unlock')}
+ onClick={() => handleLockedState(InfraLockState.UNLOCK)}
>
@@ -146,7 +154,7 @@ export default function ActionsBar2({
className="infraslist-item-action lock"
type="button"
title={t('infraManagement:actions.lock')}
- onClick={() => handleLockedState('lock')}
+ onClick={() => handleLockedState(InfraLockState.LOCK)}
>
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
index 47b5b83a68f..c03d098dc63 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { deleteRequest } from 'common/requests';
import { useTranslation } from 'react-i18next';
import Countdown from 'react-countdown';
-import { INFRA_URL } from './Consts';
+import { INFRA_URL } from './consts';
export default function InfraSelectorEditionActionsBarDelete(props) {
const { getInfrasList, setRunningDelete, infra } = props;
diff --git a/front/src/common/InfraSelector/consts.ts b/front/src/common/InfraSelector/consts.ts
new file mode 100644
index 00000000000..d2918565439
--- /dev/null
+++ b/front/src/common/InfraSelector/consts.ts
@@ -0,0 +1,4 @@
+enum InfraLockState {
+ LOCK,
+ UNLOCK,
+}
From 4698c47a0c6ec3d46f72d7f663a9ed6a302e2129 Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Thu, 27 Jul 2023 18:02:52 +0200
Subject: [PATCH 4/8] front: migrate export railjson with rtk
---
.../InfraSelectorEditionActionsBar.tsx | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
index 4b528eb1678..25ddd32f04b 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
@@ -1,13 +1,12 @@
import React, { useState } from 'react';
import { FaCopy, FaDownload, FaLock, FaLockOpen, FaPencilAlt } from 'react-icons/fa';
import { useTranslation } from 'react-i18next';
-import { get } from 'common/requests';
import { MdCancel, MdCheck } from 'react-icons/md';
import fileDownload from 'js-file-download';
import { Infra, osrdEditoastApi } from 'common/api/osrdEditoastApi';
import { useDispatch } from 'react-redux';
import { setFailure } from 'reducers/main';
-import { INFRA_URL, InfraLockState } from './consts';
+import { InfraLockState } from './consts';
type ActionBarProps = {
infra: Infra;
@@ -23,6 +22,7 @@ export default function ActionsBar({ infra, isFocused, setIsFocused, inputValue
const [lockInfra] = osrdEditoastApi.usePostInfraByIdLockMutation();
const [unlockInfra] = osrdEditoastApi.usePostInfraByIdUnlockMutation();
+ const [getRailjson] = osrdEditoastApi.useLazyGetInfraByIdRailjsonQuery();
const [cloneInfra] = osrdEditoastApi.usePostInfraByIdCloneMutation();
const [updateInfra] = osrdEditoastApi.usePutInfraByIdMutation();
@@ -55,10 +55,18 @@ export default function ActionsBar({ infra, isFocused, setIsFocused, inputValue
if (!isWaiting) {
setIsWaiting(true);
try {
- const railjson = await get(`${INFRA_URL}${infra.id}/railjson/`);
+ const railjson = await getRailjson({ id: infra.id });
fileDownload(JSON.stringify(railjson), `${infra.name}.id${infra.id}.railjson.json`);
- setIsWaiting(false);
} catch (e) {
+ if (e instanceof Error) {
+ dispatch(
+ setFailure({
+ name: e.name,
+ message: e.message,
+ })
+ );
+ }
+ } finally {
setIsWaiting(false);
}
}
From d69d21ca495334c049ba165761a4965608861998 Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Fri, 28 Jul 2023 09:58:21 +0200
Subject: [PATCH 5/8] front: refacto delete infra component to tsx and rtk
---
front/public/locales/fr/infraManagement.json | 1 +
.../InfraSelectorEditionActionsBar.tsx | 2 +-
... InfraSelectorEditionActionsBarDelete.tsx} | 50 ++++++++++++-------
.../InfraSelectorEditionItem.jsx | 10 +---
.../InfraSelector/InfraSelectorModal.tsx | 1 -
.../InfraSelectorModalBodyEdition.tsx | 7 +--
front/src/common/InfraSelector/consts.ts | 2 +
7 files changed, 40 insertions(+), 33 deletions(-)
rename front/src/common/InfraSelector/{InfraSelectorEditionActionsBarDelete.jsx => InfraSelectorEditionActionsBarDelete.tsx} (53%)
diff --git a/front/public/locales/fr/infraManagement.json b/front/public/locales/fr/infraManagement.json
index 2e9908802bc..b470e045c64 100644
--- a/front/public/locales/fr/infraManagement.json
+++ b/front/public/locales/fr/infraManagement.json
@@ -24,6 +24,7 @@
"goToEditionMode": "Éditer",
"goToStandardMode": "Retour à la sélection",
"infraChoice": "Infrastructures",
+ "infraDeleted": "L'infrastructure {{name}} a bien été supprimée.",
"infraManagement": "Gestion des infrastructures",
"infraName": "Nom de l'infrastructure",
"infrasFound_zero": "Aucune insfrastructure trouvée",
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
index 25ddd32f04b..0b0001466f8 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBar.tsx
@@ -6,7 +6,7 @@ import fileDownload from 'js-file-download';
import { Infra, osrdEditoastApi } from 'common/api/osrdEditoastApi';
import { useDispatch } from 'react-redux';
import { setFailure } from 'reducers/main';
-import { InfraLockState } from './consts';
+import InfraLockState from './consts';
type ActionBarProps = {
infra: Infra;
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx b/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.tsx
similarity index 53%
rename from front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
rename to front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.tsx
index c03d098dc63..1d32117bdd0 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionActionsBarDelete.tsx
@@ -1,31 +1,53 @@
import React from 'react';
-import PropTypes from 'prop-types';
-import { deleteRequest } from 'common/requests';
import { useTranslation } from 'react-i18next';
import Countdown from 'react-countdown';
-import { INFRA_URL } from './consts';
+import { Infra, osrdEditoastApi } from 'common/api/osrdEditoastApi';
+import { useDispatch } from 'react-redux';
+import { setFailure, setSuccess } from 'reducers/main';
-export default function InfraSelectorEditionActionsBarDelete(props) {
- const { getInfrasList, setRunningDelete, infra } = props;
+type InfraSelectorEditionActionsBarDeleteProps = {
+ infra: Infra;
+ setRunningDelete: (infraId?: number) => void;
+};
+
+export default function InfraSelectorEditionActionsBarDelete({
+ infra,
+ setRunningDelete,
+}: InfraSelectorEditionActionsBarDeleteProps) {
const { t } = useTranslation('infraManagement');
+ const dispatch = useDispatch();
+
+ const [deleteInfra] = osrdEditoastApi.useDeleteInfraByIdMutation();
- async function deleteInfra() {
+ async function handleDeleteInfra() {
try {
- await deleteRequest(`${INFRA_URL}${infra.id}/`);
+ await deleteInfra({ id: infra.id });
setRunningDelete(undefined);
- // getInfrasList();
+ dispatch(
+ setSuccess({
+ title: t('infraDeleted', { name: infra.name }),
+ text: '',
+ })
+ );
} catch (e) {
- /* empty */
+ if (e instanceof Error) {
+ dispatch(
+ setFailure({
+ name: e.name,
+ message: e.message,
+ })
+ );
+ }
}
}
- const countDownDelete = ({ seconds, completed }) => {
+ const countDownDelete = ({ seconds, completed }: { seconds: number; completed: boolean }) => {
if (completed) {
return (
@@ -59,9 +81,3 @@ export default function InfraSelectorEditionActionsBarDelete(props) {
);
}
-
-InfraSelectorEditionActionsBarDelete.propTypes = {
- // getInfrasList: PropTypes.func.isRequired,
- infra: PropTypes.object.isRequired,
- setRunningDelete: PropTypes.func.isRequired,
-};
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx b/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
index 3f1bc17b8e6..ad55c832230 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
@@ -9,7 +9,7 @@ import ActionsBar from './InfraSelectorEditionActionsBar';
import InfraSelectorEditionActionsBarDelete from './InfraSelectorEditionActionsBarDelete';
export default function InfraSelectorEditionItem(props) {
- const { infra, isFocused, setIsFocused, runningDelete, setRunningDelete, getInfrasList } = props;
+ const { infra, isFocused, setIsFocused, runningDelete, setRunningDelete } = props;
const [value, setValue] = useState(infra.name);
const { t } = useTranslation('infraManagement');
@@ -24,11 +24,7 @@ export default function InfraSelectorEditionItem(props) {
) : null}
{runningDelete === infra.id ? (
-
+
) : null}
{isFocused === infra.id ? null : (
@@ -100,5 +95,4 @@ InfraSelectorEditionItem.propTypes = {
setIsFocused: PropTypes.func.isRequired,
runningDelete: PropTypes.number,
setRunningDelete: PropTypes.func.isRequired,
- // getInfrasList: PropTypes.func.isRequired,
};
diff --git a/front/src/common/InfraSelector/InfraSelectorModal.tsx b/front/src/common/InfraSelector/InfraSelectorModal.tsx
index 2b644695655..3ed26db8e73 100644
--- a/front/src/common/InfraSelector/InfraSelectorModal.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorModal.tsx
@@ -96,7 +96,6 @@ const InfraSelectorModal = ({
infrasList={filteredInfrasList}
setFilter={setFilter}
filter={filter}
- // getInfrasList={getInfrasList}
/>
) : (
>;
filter: string;
- // getInfrasList: () => void;
};
const InfraSelectorModalBodyEdition = ({
infrasList,
setFilter,
filter = '',
-}: // getInfrasList,
-InfraSelectorModalBodyEditionProps) => {
+}: InfraSelectorModalBodyEditionProps) => {
const [isFocused, setIsFocused] = useState(undefined);
const [runningDelete, setRunningDelete] = useState(undefined);
const [nameNewInfra, setNameNewInfra] = useState('');
@@ -71,14 +69,12 @@ InfraSelectorModalBodyEditionProps) => {
.unwrap()
.then(() => {
setSelectedFile(undefined);
- // getInfrasList();
setErrorMessage(undefined);
});
} else {
postInfra({ body: { name: nameNewInfra } })
.unwrap()
.then(() => {
- // getInfrasList();
setErrorMessage(undefined);
});
}
@@ -110,7 +106,6 @@ InfraSelectorModalBodyEditionProps) => {
runningDelete={runningDelete}
setRunningDelete={setRunningDelete}
setIsFocused={setIsFocused}
- // getInfrasList={getInfrasList}
/>
))}
diff --git a/front/src/common/InfraSelector/consts.ts b/front/src/common/InfraSelector/consts.ts
index d2918565439..e5b797fa68a 100644
--- a/front/src/common/InfraSelector/consts.ts
+++ b/front/src/common/InfraSelector/consts.ts
@@ -2,3 +2,5 @@ enum InfraLockState {
LOCK,
UNLOCK,
}
+
+export default InfraLockState;
From f9faf1a13e3414b5ce9ddce4604fc0f6baad0a42 Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Fri, 28 Jul 2023 10:11:53 +0200
Subject: [PATCH 6/8] front: refacto infra item selection in tsx
---
...nItem.jsx => InfraSelectorEditionItem.tsx} | 31 +++++++++----------
.../InfraSelectorModalBodyEdition.tsx | 3 --
2 files changed, 14 insertions(+), 20 deletions(-)
rename front/src/common/InfraSelector/{InfraSelectorEditionItem.jsx => InfraSelectorEditionItem.tsx} (84%)
diff --git a/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx b/front/src/common/InfraSelector/InfraSelectorEditionItem.tsx
similarity index 84%
rename from front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
rename to front/src/common/InfraSelector/InfraSelectorEditionItem.tsx
index ad55c832230..fadeadc9ec7 100644
--- a/front/src/common/InfraSelector/InfraSelectorEditionItem.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorEditionItem.tsx
@@ -1,16 +1,26 @@
import React, { useState } from 'react';
-import PropTypes from 'prop-types';
import nextId from 'react-id-generator';
import { FaLock, FaTrash } from 'react-icons/fa';
import InputSNCF from 'common/BootstrapSNCF/InputSNCF';
import { useTranslation } from 'react-i18next';
-import { editoastUpToDateIndicator } from './InfraSelectorModalBodyStandard';
+import { Infra } from 'common/api/osrdEditoastApi';
import ActionsBar from './InfraSelectorEditionActionsBar';
+import { editoastUpToDateIndicator } from './InfraSelectorModalBodyStandard';
import InfraSelectorEditionActionsBarDelete from './InfraSelectorEditionActionsBarDelete';
-export default function InfraSelectorEditionItem(props) {
- const { infra, isFocused, setIsFocused, runningDelete, setRunningDelete } = props;
+type InfraSelectorEditionItemProps = {
+ infra: Infra;
+ isFocused?: number;
+ setIsFocused: (infraId?: number) => void;
+};
+
+export default function InfraSelectorEditionItem({
+ infra,
+ isFocused,
+ setIsFocused,
+}: InfraSelectorEditionItemProps) {
const [value, setValue] = useState(infra.name);
+ const [runningDelete, setRunningDelete] = useState(undefined);
const { t } = useTranslation('infraManagement');
const handleRunningDelete = () => {
@@ -83,16 +93,3 @@ export default function InfraSelectorEditionItem(props) {
);
}
-
-InfraSelectorEditionItem.defaultProps = {
- isFocused: undefined,
- runningDelete: undefined,
-};
-
-InfraSelectorEditionItem.propTypes = {
- infra: PropTypes.object.isRequired,
- isFocused: PropTypes.number,
- setIsFocused: PropTypes.func.isRequired,
- runningDelete: PropTypes.number,
- setRunningDelete: PropTypes.func.isRequired,
-};
diff --git a/front/src/common/InfraSelector/InfraSelectorModalBodyEdition.tsx b/front/src/common/InfraSelector/InfraSelectorModalBodyEdition.tsx
index 2935360ecbf..445b9fa0b63 100644
--- a/front/src/common/InfraSelector/InfraSelectorModalBodyEdition.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorModalBodyEdition.tsx
@@ -18,7 +18,6 @@ const InfraSelectorModalBodyEdition = ({
filter = '',
}: InfraSelectorModalBodyEditionProps) => {
const [isFocused, setIsFocused] = useState(undefined);
- const [runningDelete, setRunningDelete] = useState(undefined);
const [nameNewInfra, setNameNewInfra] = useState('');
const [errorMessage, setErrorMessage] = useState('');
const [selectedFile, setSelectedFile] = useState(undefined);
@@ -103,8 +102,6 @@ const InfraSelectorModalBodyEdition = ({
infra={infra}
key={nextId()}
isFocused={isFocused}
- runningDelete={runningDelete}
- setRunningDelete={setRunningDelete}
setIsFocused={setIsFocused}
/>
))}
From 072c6f21c10d91cd19ed0556994660903cf8ca28 Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Fri, 28 Jul 2023 10:23:40 +0200
Subject: [PATCH 7/8] front: refacto infras list component in tsx
---
...jsx => InfraSelectorModalBodyStandard.tsx} | 47 ++++++++++---------
1 file changed, 26 insertions(+), 21 deletions(-)
rename front/src/common/InfraSelector/{InfraSelectorModalBodyStandard.jsx => InfraSelectorModalBodyStandard.tsx} (78%)
diff --git a/front/src/common/InfraSelector/InfraSelectorModalBodyStandard.jsx b/front/src/common/InfraSelector/InfraSelectorModalBodyStandard.tsx
similarity index 78%
rename from front/src/common/InfraSelector/InfraSelectorModalBodyStandard.jsx
rename to front/src/common/InfraSelector/InfraSelectorModalBodyStandard.tsx
index ed1d83c53bb..ae41fd7f52e 100644
--- a/front/src/common/InfraSelector/InfraSelectorModalBodyStandard.jsx
+++ b/front/src/common/InfraSelector/InfraSelectorModalBodyStandard.tsx
@@ -1,5 +1,4 @@
import React, { useContext } from 'react';
-import PropTypes from 'prop-types';
import nextId from 'react-id-generator';
import { FaLock } from 'react-icons/fa';
import InputSNCF from 'common/BootstrapSNCF/InputSNCF';
@@ -8,21 +7,41 @@ import { getInfraID } from 'reducers/osrdconf/selectors';
import { updateInfraID, deleteItinerary } from 'reducers/osrdconf';
import { useTranslation } from 'react-i18next';
import { ModalContext } from 'common/BootstrapSNCF/ModalSNCF/ModalProvider';
+import { Infra } from 'common/api/osrdEditoastApi';
+
+type InfraSelectorModalBodyStandardProps = {
+ filter: string;
+ setFilter: (filterInput: string) => void;
+ infrasList: Infra[];
+ onlySelectionMode: boolean;
+ onInfraChange?: (infraId: number) => void;
+};
// Test coherence between actual & generated version, eg. if editoast is up to date with data
-export function editoastUpToDateIndicator(v, genv) {
- return ●;
+export function editoastUpToDateIndicator(
+ infraVersion: string,
+ infraGeneratedVersion: string | null
+) {
+ return (
+
+ ●
+
+ );
}
-export default function InfraSelectorModalBodyStandard(props) {
- const { infrasList, filter, setFilter, onlySelectionMode, onInfraChange } = props;
-
+export default function InfraSelectorModalBodyStandard({
+ filter = '',
+ setFilter,
+ infrasList,
+ onlySelectionMode = false,
+ onInfraChange,
+}: InfraSelectorModalBodyStandardProps) {
const { t } = useTranslation(['translation', 'infraManagement']);
const dispatch = useDispatch();
const infraID = useSelector(getInfraID);
const { closeModal } = useContext(ModalContext);
- function setInfraID(id) {
+ function setInfraID(id: number) {
dispatch(updateInfraID(id));
if (onInfraChange) onInfraChange(id);
dispatch(deleteItinerary());
@@ -83,17 +102,3 @@ export default function InfraSelectorModalBodyStandard(props) {
>
);
}
-
-InfraSelectorModalBodyStandard.defaultProps = {
- filter: '',
- onlySelectionMode: false,
- onInfraChange: undefined,
-};
-
-InfraSelectorModalBodyStandard.propTypes = {
- filter: PropTypes.string,
- infrasList: PropTypes.array.isRequired,
- setFilter: PropTypes.func.isRequired,
- onlySelectionMode: PropTypes.bool,
- onInfraChange: PropTypes.func,
-};
From 6e6bbb58eaf6b026b7624c5cdbfc167d8d0ffeb8 Mon Sep 17 00:00:00 2001
From: SharglutDev
Date: Fri, 28 Jul 2023 11:24:26 +0200
Subject: [PATCH 8/8] front: fix max infras in the list
---
editoast/openapi.yaml | 20 +++++++++++++++++--
editoast/openapi_legacy.yaml | 20 +++++++++++++++++--
.../InfraSelector/InfraSelectorModal.tsx | 6 +++++-
front/src/common/api/osrdEditoastApi.ts | 14 ++++++++++---
4 files changed, 52 insertions(+), 8 deletions(-)
diff --git a/editoast/openapi.yaml b/editoast/openapi.yaml
index be86cba360e..a62eb35d12d 100644
--- a/editoast/openapi.yaml
+++ b/editoast/openapi.yaml
@@ -2486,6 +2486,22 @@ paths:
description: Check if Editoast is running correctly
/infra/:
get:
+ parameters:
+ - description: Page number
+ in: query
+ name: page
+ schema:
+ default: 1
+ minimum: 1
+ type: integer
+ - description: Number of elements by page
+ in: query
+ name: page_size
+ schema:
+ default: 25
+ maximum: 10000
+ minimum: 1
+ type: integer
responses:
'200':
content:
@@ -2505,8 +2521,8 @@ paths:
- next
- previous
type: object
- description: The infra list
- summary: List all available infra
+ description: The infras list
+ summary: Paginated list of all available infras
tags:
- infra
post:
diff --git a/editoast/openapi_legacy.yaml b/editoast/openapi_legacy.yaml
index 49e367d48ba..7ddb3c226fa 100644
--- a/editoast/openapi_legacy.yaml
+++ b/editoast/openapi_legacy.yaml
@@ -173,10 +173,26 @@ paths:
get:
tags:
- infra
- summary: List all available infra
+ summary: Paginated list of all available infras
+ parameters:
+ - description: Page number
+ in: query
+ name: page
+ schema:
+ default: 1
+ minimum: 1
+ type: integer
+ - description: Number of elements by page
+ in: query
+ name: page_size
+ schema:
+ default: 25
+ maximum: 10000
+ minimum: 1
+ type: integer
responses:
200:
- description: The infra list
+ description: The infras list
content:
application/json:
schema:
diff --git a/front/src/common/InfraSelector/InfraSelectorModal.tsx b/front/src/common/InfraSelector/InfraSelectorModal.tsx
index 3ed26db8e73..e8cd1d81735 100644
--- a/front/src/common/InfraSelector/InfraSelectorModal.tsx
+++ b/front/src/common/InfraSelector/InfraSelectorModal.tsx
@@ -24,7 +24,11 @@ const InfraSelectorModal = ({
const [filter, setFilter] = useState('');
const [filteredInfrasList, setFilteredInfrasList] = useState([]);
const [editionMode, setEditionMode] = useState(false);
- const { data: infrasList, isSuccess, isLoading } = osrdEditoastApi.useGetInfraQuery();
+ const {
+ data: infrasList,
+ isSuccess,
+ isLoading,
+ } = osrdEditoastApi.useGetInfraQuery({ pageSize: 1000 });
const debouncedFilter = useDebounce(filter, 250);
diff --git a/front/src/common/api/osrdEditoastApi.ts b/front/src/common/api/osrdEditoastApi.ts
index 3ede3e6be0e..ab08574a01b 100644
--- a/front/src/common/api/osrdEditoastApi.ts
+++ b/front/src/common/api/osrdEditoastApi.ts
@@ -72,7 +72,10 @@ const injectedRtkApi = api
query: () => ({ url: `/health/` }),
}),
getInfra: build.query({
- query: () => ({ url: `/infra/` }),
+ query: (queryArg) => ({
+ url: `/infra/`,
+ params: { page: queryArg.page, page_size: queryArg.pageSize },
+ }),
providesTags: ['infra'],
}),
postInfra: build.mutation({
@@ -660,13 +663,18 @@ export type GetElectricalProfileSetByIdLevelOrderApiArg = {
};
export type GetHealthApiResponse = unknown;
export type GetHealthApiArg = void;
-export type GetInfraApiResponse = /** status 200 The infra list */ {
+export type GetInfraApiResponse = /** status 200 The infras list */ {
count: number;
next: any;
previous: any;
results?: Infra[];
};
-export type GetInfraApiArg = void;
+export type GetInfraApiArg = {
+ /** Page number */
+ page?: number;
+ /** Number of elements by page */
+ pageSize?: number;
+};
export type PostInfraApiResponse = /** status 201 The created infra */ Infra;
export type PostInfraApiArg = {
/** Name of the infra to create */