diff --git a/apps/api/src/modules/training/application/use-cases/complex.use-cases.ts b/apps/api/src/modules/training/application/use-cases/complex.use-cases.ts index 4b8abec..374c265 100644 --- a/apps/api/src/modules/training/application/use-cases/complex.use-cases.ts +++ b/apps/api/src/modules/training/application/use-cases/complex.use-cases.ts @@ -94,9 +94,6 @@ export class ComplexUseCase { } // 2. Validate the data - if (!data.name) { - throw new BadRequestException('Complex name is required'); - } if (!data.exercises) { throw new BadRequestException('Exercises are required'); } @@ -114,7 +111,6 @@ export class ComplexUseCase { // 5. Create the complex const complex = new Complex(); - complex.name = data.name; complex.complexCategory = complexCategory; complex.description = data.description || ''; @@ -144,16 +140,16 @@ export class ComplexUseCase { await this.complexRepository.save(complex); // 9. Get the created complex - const created = await this.complexRepository.getOne(complex.id, coachFilterConditions); - if (!created) { + const complexCreated = await this.complexRepository.getOne(complex.id, coachFilterConditions); + if (!complexCreated) { throw new NotFoundException('Complex not found'); } // 10. Map the complex - const dto = ComplexMapper.toDto(created); + const complexDto = ComplexMapper.toDto(complexCreated); // 11. Present the complex - return ComplexPresenter.presentOne(dto); + return ComplexPresenter.presentCreationSuccess(complexDto); } catch (error) { return ComplexPresenter.presentCreationError(error as Error); } @@ -177,10 +173,6 @@ export class ComplexUseCase { } // 4. Update the complex properties - if (data.name) { - complexToUpdate.name = data.name; - } - if (data.description !== undefined) { complexToUpdate.description = data.description; } diff --git a/apps/api/src/modules/training/application/use-cases/exercise.use-cases.ts b/apps/api/src/modules/training/application/use-cases/exercise.use-cases.ts index 8f8aae2..4773852 100644 --- a/apps/api/src/modules/training/application/use-cases/exercise.use-cases.ts +++ b/apps/api/src/modules/training/application/use-cases/exercise.use-cases.ts @@ -169,7 +169,7 @@ export class ExerciseUseCase { const exerciseDto = ExerciseMapper.toDto(createdExercise); //7. Return exercise - return ExercisePresenter.presentOne(exerciseDto); + return ExercisePresenter.presentCreationSuccess(exerciseDto); } catch (error) { return ExercisePresenter.presentCreationError(error as Error); } diff --git a/apps/api/src/modules/training/domain/complex.entity.ts b/apps/api/src/modules/training/domain/complex.entity.ts index ca79b84..086bc9e 100644 --- a/apps/api/src/modules/training/domain/complex.entity.ts +++ b/apps/api/src/modules/training/domain/complex.entity.ts @@ -24,9 +24,6 @@ export class Complex { ) exercises = new Collection(this); - @Property() - name!: string; - @Property({ nullable: true }) description?: string; diff --git a/apps/api/src/modules/training/interface/mappers/complex.mapper.ts b/apps/api/src/modules/training/interface/mappers/complex.mapper.ts index d4fbce9..7ea90c7 100644 --- a/apps/api/src/modules/training/interface/mappers/complex.mapper.ts +++ b/apps/api/src/modules/training/interface/mappers/complex.mapper.ts @@ -5,7 +5,6 @@ export const ComplexMapper = { toDto(complex: Complex): ComplexDto { return { id: complex.id, - name: complex.name, complexCategory: { id: complex.complexCategory.id, name: complex.complexCategory.name, diff --git a/apps/api/src/modules/training/interface/mappers/workout.mapper.ts b/apps/api/src/modules/training/interface/mappers/workout.mapper.ts index 4143623..cb45f7d 100644 --- a/apps/api/src/modules/training/interface/mappers/workout.mapper.ts +++ b/apps/api/src/modules/training/interface/mappers/workout.mapper.ts @@ -51,7 +51,6 @@ export const WorkoutMapper = { type: 'complex' as const, complex: { id: element.complex.id, - name: element.complex.name, description: element.complex.description, complexCategory: { id: element.complex.complexCategory.id, diff --git a/apps/api/src/modules/training/interface/presenters/complex.presenter.ts b/apps/api/src/modules/training/interface/presenters/complex.presenter.ts index 985a549..3a59882 100644 --- a/apps/api/src/modules/training/interface/presenters/complex.presenter.ts +++ b/apps/api/src/modules/training/interface/presenters/complex.presenter.ts @@ -23,10 +23,10 @@ export const ComplexPresenter = { }; }, - presentCreationSuccess(message: string) { + presentCreationSuccess(complexDto: ComplexDto) { return { status: 201 as const, - body: { message }, + body: complexDto, }; }, diff --git a/apps/api/src/modules/training/interface/presenters/exercise.presenter.ts b/apps/api/src/modules/training/interface/presenters/exercise.presenter.ts index 9191a72..dad362d 100644 --- a/apps/api/src/modules/training/interface/presenters/exercise.presenter.ts +++ b/apps/api/src/modules/training/interface/presenters/exercise.presenter.ts @@ -23,10 +23,10 @@ export const ExercisePresenter = { }; }, - presentCreationSuccess(message: string) { + presentCreationSuccess(exerciseDto: ExerciseDto) { return { status: 201 as const, - body: { message }, + body: exerciseDto, }; }, diff --git a/apps/api/src/seeders/complex.seeder.ts b/apps/api/src/seeders/complex.seeder.ts index 56c04b3..2ec4161 100644 --- a/apps/api/src/seeders/complex.seeder.ts +++ b/apps/api/src/seeders/complex.seeder.ts @@ -6,7 +6,7 @@ import { seedExercises } from './exercise.seeder'; export async function seedComplexes( em: EntityManager -): Promise> { +): Promise { const exercisesMap = await seedExercises(em); @@ -41,7 +41,6 @@ export async function seedComplexes( const complexesToCreate = [ { - name: 'EMOM Technique Arraché', category: 'EMOM', description: "Focus sur la technique de l'arraché", exercises: [ @@ -60,7 +59,6 @@ export async function seedComplexes( ], }, { - name: 'Complex Épaulé-Jeté', category: 'Technique Épaulé-Jeté', description: "Focus sur la technique de l'épaulé-jeté", exercises: [ @@ -83,7 +81,6 @@ export async function seedComplexes( ], }, { - name: 'TABATA Force', category: 'TABATA', description: 'Focus sur la force', exercises: [ @@ -102,7 +99,6 @@ export async function seedComplexes( ], }, { - name: 'Technique Arraché Complet', category: 'Technique Arraché', description: "Focus sur la technique de l'arraché", exercises: [ @@ -121,7 +117,6 @@ export async function seedComplexes( ], }, { - name: 'EMOM Épaulé', category: 'EMOM', description: "Focus sur l'épaulé", exercises: [ @@ -141,10 +136,9 @@ export async function seedComplexes( }, ]; - const complexesMap: Record = {}; + const complexesCreated: Complex[] = []; for (const complexData of complexesToCreate) { const complex = new Complex(); - complex.name = complexData.name; complex.description = complexData.description; complex.complexCategory = complexCategoriesMap[complexData.category]; complex.createdBy = null; @@ -163,9 +157,9 @@ export async function seedComplexes( await em.persistAndFlush(exerciseComplex); } - console.log('Complex created:', complex.name); - complexesMap[complex.name] = complex; + console.log('Complex created:', complex); + complexesCreated.push(complex); } - return complexesMap; + return complexesCreated; } diff --git a/apps/api/src/seeders/workout.seeder.ts b/apps/api/src/seeders/workout.seeder.ts index d7de2d5..8c001f2 100644 --- a/apps/api/src/seeders/workout.seeder.ts +++ b/apps/api/src/seeders/workout.seeder.ts @@ -9,7 +9,8 @@ import { seedComplexes } from './complex.seeder'; export async function seedWorkouts(em: EntityManager): Promise { - const complexesMap = await seedComplexes(em); + // Creation of complexes and their categories + const complexes = await seedComplexes(em); // Exercises are already created by seedComplexes const exercisesMap: Record = {}; @@ -53,7 +54,7 @@ export async function seedWorkouts(em: EntityManager): Promise { elements: [ { type: WORKOUT_ELEMENT_TYPES.COMPLEX, - id: 'EMOM Technique Arraché', // EMOM Technique Arraché + complexIndex: 0, // Premier complex créé (EMOM Technique Arraché) order: 0, sets: 4, reps: 1, @@ -72,7 +73,7 @@ export async function seedWorkouts(em: EntityManager): Promise { }, { type: WORKOUT_ELEMENT_TYPES.COMPLEX, - id: 'Complex Épaulé-Jeté', // Complex Épaulé-Jeté + complexIndex: 1, // Deuxième complex créé (Complex Épaulé-Jeté) order: 2, sets: 3, reps: 1, @@ -97,7 +98,7 @@ export async function seedWorkouts(em: EntityManager): Promise { elements: [ { type: WORKOUT_ELEMENT_TYPES.COMPLEX, - id: 'Technique Arraché Complet', // Technique Arraché Complet + complexIndex: 3, // Quatrième complex créé (Technique Arraché Complet) order: 0, sets: 3, reps: 2, @@ -115,7 +116,7 @@ export async function seedWorkouts(em: EntityManager): Promise { }, { type: WORKOUT_ELEMENT_TYPES.COMPLEX, - id: 'EMOM Épaulé', // EMOM Épaulé + complexIndex: 4, // Cinquième complex créé (EMOM Épaulé) order: 2, sets: 3, reps: 2, @@ -140,7 +141,7 @@ export async function seedWorkouts(em: EntityManager): Promise { elements: [ { type: WORKOUT_ELEMENT_TYPES.COMPLEX, - id: 'TABATA Force', // TABATA Force + complexIndex: 2, // Troisième complex créé (TABATA Force) order: 0, sets: 4, reps: 1, @@ -194,18 +195,16 @@ export async function seedWorkouts(em: EntityManager): Promise { continue; } } else { - // Trouver le complex par son nom - const complex = await em.findOne(Complex, { - name: element.id, - }); + // Utiliser l'index du complex + const complex = complexes[element.complexIndex]; if (!complex) { - console.warn(`Complex ${element.id} not found, skipping element`); + console.warn(`Complex at index ${element.complexIndex} not found, skipping element`); continue; } workoutElement.complex = complex; } - em.persist(workoutElement); + await em.persistAndFlush(workoutElement); } console.log('Workout created:', workout.title); diff --git a/apps/api/src/test/complex.integration.spec.ts b/apps/api/src/test/complex.integration.spec.ts index 1d97ae0..0bbcecb 100644 --- a/apps/api/src/test/complex.integration.spec.ts +++ b/apps/api/src/test/complex.integration.spec.ts @@ -85,7 +85,7 @@ export async function runComplexTests(orm: MikroORM): Promise { exerciseCategory: exerciseCategory.id, }, testData.organization.id, testData.adminUser.id); - if (exercise1Result.status !== 200 || exercise2Result.status !== 200 || exercise3Result.status !== 200) { + if (exercise1Result.status !== 201 || exercise2Result.status !== 201 || exercise3Result.status !== 201) { throw new Error('Failed to create exercises'); } @@ -100,7 +100,6 @@ export async function runComplexTests(orm: MikroORM): Promise { // Test 2: Créer un complex via use case console.log('🧪 Testing complex creation via use case...'); const complex1Result = await complexUseCase.create({ - name: 'Arraché simple', complexCategory: complexCategory.id, exercises: [ { @@ -122,7 +121,7 @@ export async function runComplexTests(orm: MikroORM): Promise { description: 'Pour monter en gamme tranquillement', }, testData.organization.id, testData.adminUser.id); - if (complex1Result.status !== 200) { + if (complex1Result.status !== 201) { throw new Error(`Failed to create complex: ${complex1Result.body.message}`); } @@ -130,7 +129,6 @@ export async function runComplexTests(orm: MikroORM): Promise { expect(complex1).toBeDefined(); expect(complex1.id).toBeDefined(); - expect(complex1.name).toBe('Arraché simple'); expect(complex1.exercises).toHaveLength(3); // Test 3: Créer un autre complex @@ -147,7 +145,7 @@ export async function runComplexTests(orm: MikroORM): Promise { exerciseCategory: exerciseCategory.id, }, testData.organization.id, testData.adminUser.id); - if (exercise4Result.status !== 200 || exercise5Result.status !== 200) { + if (exercise4Result.status !== 201 || exercise5Result.status !== 201) { throw new Error('Failed to create exercises for second complex'); } @@ -155,7 +153,6 @@ export async function runComplexTests(orm: MikroORM): Promise { const exercise5 = exercise5Result.body; const complex2Result = await complexUseCase.create({ - name: 'Complex Push-Pull', description: 'Complexe push-pull', complexCategory: complexCategory.id, exercises: [ @@ -164,14 +161,13 @@ export async function runComplexTests(orm: MikroORM): Promise { ], }, testData.organization.id, testData.adminUser.id); - if (complex2Result.status !== 200) { + if (complex2Result.status !== 201) { throw new Error(`Failed to create second complex: ${complex2Result.body.message}`); } const complex2 = complex2Result.body; expect(complex2).toBeDefined(); - expect(complex2.name).toBe('Complex Push-Pull'); expect(complex2.exercises).toHaveLength(2); // Test 4: Récupérer tous les complexes via use case @@ -195,14 +191,12 @@ export async function runComplexTests(orm: MikroORM): Promise { const singleComplex = singleComplexResult.body; expect(singleComplex.id).toBe(complex1.id); - expect(singleComplex.name).toBe('Arraché simple'); // Test 6: Mettre à jour un complex via use case console.log('🧪 Testing complex update via use case...'); const updatedComplexResult = await complexUseCase.update( complex1.id, { - name: 'Arraché simple Modifié', description: 'Description modifiée', }, testData.organization.id, @@ -214,7 +208,6 @@ export async function runComplexTests(orm: MikroORM): Promise { } const updatedComplex = updatedComplexResult.body; - expect(updatedComplex.name).toBe('Arraché simple Modifié'); expect(updatedComplex.description).toBe('Description modifiée'); // Test 7: Supprimer un complex via use case diff --git a/apps/api/src/test/exercise.integration.spec.ts b/apps/api/src/test/exercise.integration.spec.ts index bf3a83c..6cfa63f 100644 --- a/apps/api/src/test/exercise.integration.spec.ts +++ b/apps/api/src/test/exercise.integration.spec.ts @@ -55,7 +55,7 @@ export async function runExerciseTests(orm: MikroORM): Promise { exerciseCategory: exerciseCategory.id, }, testData.organization.id, testData.adminUser.id); - if (exercise1Result.status !== 200) { + if (exercise1Result.status !== 201) { throw new Error(`Failed to create exercise1: ${exercise1Result.body.message}`); } @@ -71,7 +71,7 @@ export async function runExerciseTests(orm: MikroORM): Promise { exerciseCategory: exerciseCategory.id, }, testData.organization.id, testData.adminUser.id); - if (exercise2Result.status !== 200) { + if (exercise2Result.status !== 201) { throw new Error(`Failed to create exercise2: ${exercise2Result.body.message}`); } @@ -87,7 +87,7 @@ export async function runExerciseTests(orm: MikroORM): Promise { shortName: 'FS', }, testData.organization.id, testData.adminUser.id); - if (exercise3Result.status !== 200) { + if (exercise3Result.status !== 201) { throw new Error(`Failed to create exercise3: ${exercise3Result.body.message}`); } diff --git a/apps/api/src/test/workout.integration.spec.ts b/apps/api/src/test/workout.integration.spec.ts index 7b63935..767ca99 100644 --- a/apps/api/src/test/workout.integration.spec.ts +++ b/apps/api/src/test/workout.integration.spec.ts @@ -93,7 +93,7 @@ export async function runWorkoutTests(orm: MikroORM): Promise { exerciseCategory: exerciseCategory.id, }, testData.organization.id, testData.adminUser.id); - if (exercise1Result.status !== 200 || exercise2Result.status !== 200) { + if (exercise1Result.status !== 201 || exercise2Result.status !== 201) { throw new Error('Failed to create exercises'); } @@ -101,7 +101,6 @@ export async function runWorkoutTests(orm: MikroORM): Promise { const exercise2 = exercise2Result.body; const complexResult = await complexUseCase.create({ - name: 'Complex Test', complexCategory: complexCategory.id, exercises: [ { @@ -117,7 +116,7 @@ export async function runWorkoutTests(orm: MikroORM): Promise { ], }, testData.organization.id, testData.adminUser.id); - if (complexResult.status !== 200) { + if (complexResult.status !== 201) { throw new Error(`Failed to create complex: ${complexResult.body.message}`); } diff --git a/apps/web/src/features/complex/complex-card.tsx b/apps/web/src/features/complex/complex-card.tsx index d57859f..3377fa7 100644 --- a/apps/web/src/features/complex/complex-card.tsx +++ b/apps/web/src/features/complex/complex-card.tsx @@ -28,7 +28,9 @@ export function ComplexCard({ complex, onClick }: ComplexCardProps) { onClick={onClick} > - {complex.name} + + {complex.complexCategory?.name || 'Sans catégorie'} + + -
- -

- {complex.description || 'Pas de description'} -

+
+ +

+ {complex.description || 'Pas de description'} +

+
diff --git a/apps/web/src/features/exercises/exercise-creation-form.tsx b/apps/web/src/features/exercises/exercise-creation-form.tsx index 082e62b..c209e81 100644 --- a/apps/web/src/features/exercises/exercise-creation-form.tsx +++ b/apps/web/src/features/exercises/exercise-creation-form.tsx @@ -47,7 +47,7 @@ export function ExerciseCreationForm({ }, }); - const { mutate: createExerciseMutation } = useMutation({ + const { mutateAsync: createExerciseMutation } = useMutation({ mutationFn: async (data: CreateExercise) => { const response = await api.exercise.createExercise({ body: data }); if (response.status !== 201) { @@ -56,6 +56,7 @@ export function ExerciseCreationForm({ return response.body; }, onSuccess: (data) => { + console.log('Exercice créé avec succès:', data); toast({ title: 'Exercice créé avec succès', description: "L'exercice a été créé avec succès", @@ -71,11 +72,11 @@ export function ExerciseCreationForm({ }, }); - const handleSubmit = (formValues: z.infer) => { + const handleSubmit = async (formValues: z.infer) => { setIsLoading(true); try { - createExerciseMutation(formValues); + await createExerciseMutation(formValues); } finally { setIsLoading(false); } diff --git a/apps/web/src/features/planning/training-session-detail.tsx b/apps/web/src/features/planning/training-session-detail.tsx index 1801bcf..81209e8 100644 --- a/apps/web/src/features/planning/training-session-detail.tsx +++ b/apps/web/src/features/planning/training-session-detail.tsx @@ -205,7 +205,7 @@ export function TrainingSessionDetail({ {element.type === WORKOUT_ELEMENT_TYPES.EXERCISE ? (
{element.exercise.name}
) : ( -
{element.complex.name}
+
{element.complex.complexCategory?.name || 'Complex'}
)}
diff --git a/apps/web/src/features/workout/sortable-workout-element.tsx b/apps/web/src/features/workout/sortable-workout-element.tsx index b276d2e..fd4f039 100644 --- a/apps/web/src/features/workout/sortable-workout-element.tsx +++ b/apps/web/src/features/workout/sortable-workout-element.tsx @@ -24,7 +24,7 @@ import { createWorkoutSchema, } from '@dropit/schemas'; import { GripVertical, Trash2 } from 'lucide-react'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Control } from 'react-hook-form'; import { z } from 'zod'; @@ -63,7 +63,8 @@ export function SortableWorkoutElement({ const [editingReps, setEditingReps] = useState(false); const [editingWeight, setEditingWeight] = useState(false); const [editingRest, setEditingRest] = useState(false); - const [editingElement, setEditingElement] = useState(true); + const [editingElement, setEditingElement] = useState(false); + const selectRef = useRef(null); const { attributes, @@ -228,10 +229,15 @@ export function SortableWorkoutElement({ } setEditingElement(false); }} + onOpenChange={(open) => { + if (!open) { + setEditingElement(false); + } + }} value={field.value} > - + ( - {complex.name} + {complex.complexCategory?.name || 'Complex'} ))} @@ -258,12 +264,18 @@ export function SortableWorkoutElement({ ) : ( )} @@ -277,7 +289,11 @@ export function SortableWorkoutElement({
('exercise'); + const [createExerciseModalOpen, setCreateExerciseModalOpen] = useState(false); + const [createComplexModalOpen, setCreateComplexModalOpen] = useState(false); + const queryClient = useQueryClient(); // Queries pour récupérer les données nécessaires const { data: exercises } = useQuery({ @@ -114,26 +115,194 @@ export function WorkoutElementsStep({ }); }; + const handleExerciseCreationSuccess = async () => { + // Rafraîchir la liste des exercices + await queryClient.invalidateQueries({ queryKey: ['exercises'] }); + setCreateExerciseModalOpen(false); + }; + + const handleComplexCreationSuccess = async () => { + // Rafraîchir la liste des complexes + await queryClient.invalidateQueries({ queryKey: ['complexes'] }); + setCreateComplexModalOpen(false); + }; + // Filtrer les exercices et complexes selon la recherche const filteredExercises = exercises?.filter(exercise => exercise.name.toLowerCase().includes(exerciseSearch.toLowerCase()) ) || []; const filteredComplexes = complexes?.filter(complex => - complex.name.toLowerCase().includes(complexSearch.toLowerCase()) + complex.complexCategory?.name?.toLowerCase().includes(complexSearch.toLowerCase()) ) || []; return (
- {/* Titre */} -
-

Éléments de l'entraînement

-
{/* Layout principal : 2 colonnes */} -
- {/* Colonne gauche : Éléments sélectionnés */} -
+
+ + {/* Colonne gauche : Liste des éléments disponibles */} +
+
+

Éléments disponibles

+

+ Cliquez pour ajouter à votre entraînement +

+
+ + + +
+ {/* Tabs List */} +
+ + +
+ + {/* Tab Content */} +
+ {activeTab === 'exercise' && ( +
+
+ + setExerciseSearch(e.target.value)} + className="pl-10" + /> +
+ +
+ +
+ +
+ {filteredExercises.map((exercise) => ( +
+
+
+
{exercise.name}
+

+ {exercise.exerciseCategory.name} +

+
+ +
+
+ ))} +
+
+ )} + + {activeTab === 'complex' && ( +
+
+ + setComplexSearch(e.target.value)} + className="pl-10" + /> +
+ +
+ +
+ +
+ {filteredComplexes.map((complex) => ( +
+
+
+
{complex.complexCategory?.name || 'Complex'}
+

+ {complex.exercises.length} exercices +

+
+ +
+
+ ))} +
+
+ )} +
+
+
+
+
+ + {/* Colonne droite : Éléments sélectionnés */} +

Éléments sélectionnés

@@ -141,17 +310,20 @@ export function WorkoutElementsStep({

- - + + {fields.length > 0 && ( +
+ )} + {fields.length === 0 ? (

Aucun élément sélectionné

-

Ajoutez des exercices ou complexes depuis le panneau de droite

+

Ajoutez des exercices ou complexes depuis le panneau de gauche

) : ( -
+
field.id)} strategy={verticalListSortingStrategy} > -
+
{fields.map((field, index) => ( - + style={{ + gridRow: `span ${ + field.type === WORKOUT_ELEMENT_TYPES.COMPLEX ? 2 : 1 + }`, + }} + > + +
))}
@@ -181,105 +364,10 @@ export function WorkoutElementsStep({
- - {/* Colonne droite : Liste des éléments disponibles */} -
-
-

Éléments disponibles

-

- Cliquez pour ajouter à votre entraînement -

-
- - - - - - Exercices - Complexes - - - -
- - setExerciseSearch(e.target.value)} - className="pl-10" - /> -
- -
- {filteredExercises.map((exercise) => ( -
-
-
-
{exercise.name}
-

- {exercise.exerciseCategory.name} -

-
- -
-
- ))} -
-
- - -
- - setComplexSearch(e.target.value)} - className="pl-10" - /> -
- -
- {filteredComplexes.map((complex) => ( -
-
-
-
{complex.name}
-

- {complex.exercises.length} exercices -

-
- -
-
- ))} -
-
-
-
-
-
{/* Boutons de navigation */} -
+
@@ -290,6 +378,32 @@ export function WorkoutElementsStep({
+ + {/* Modales de création */} + + setCreateExerciseModalOpen(false)} + /> + + + + setCreateComplexModalOpen(false)} + /> +
); } diff --git a/apps/web/src/features/workout/steps/workout-info-step.tsx b/apps/web/src/features/workout/steps/workout-info-step.tsx index 0cbfa4c..6745d01 100644 --- a/apps/web/src/features/workout/steps/workout-info-step.tsx +++ b/apps/web/src/features/workout/steps/workout-info-step.tsx @@ -57,14 +57,15 @@ export function WorkoutInfoStep({

Informations générales

+
( - Titre - - + Nom + + @@ -77,7 +78,7 @@ export function WorkoutInfoStep({ render={({ field }) => ( Description - +