Skip to content

Commit

Permalink
🎨 Review ben
Browse files Browse the repository at this point in the history
  • Loading branch information
VioMrqs committed Feb 14, 2025
1 parent 5805a2a commit 3640fba
Show file tree
Hide file tree
Showing 3 changed files with 168 additions and 157 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,177 +2,27 @@
'use client';

import Button from '@codegouvfr/react-dsfr/Button';
import Input from '@codegouvfr/react-dsfr/Input';
import React, { useState } from 'react';
import Select from '@codegouvfr/react-dsfr/SelectNext';
import React from 'react';

import { Routes } from '@potentiel-applications/routes';
import { Candidature } from '@potentiel-domain/candidature';

import { Heading3 } from '@/components/atoms/headings';

import { Form } from '../../../atoms/form/Form';
import { SubmitButton } from '../../../atoms/form/SubmitButton';
import { getTechnologieTypeLabel } from '../../candidature/helpers';

import { modifierLauréatAction } from './modifierLauréat.action';
import { ModifierLauréatPageProps } from './ModifierLauréat.page';

type FieldProps<T> = { candidature: T; lauréat: T; estEnCoursDeModification?: boolean };
type ProjectFieldProps<T> = FieldProps<T> & { label: string; name: string };
import {
ActionnaireField,
ReprésentantLégalField,
TechnologieField,
} from './ModifierLauréatFields';

const FormRow = ({ children }: { children: React.ReactNode }) => (
<div className="flex flex-row items-center gap-4 mt-4">{children}</div>
);

const ProjectField = <T extends string | number>({
candidature,
lauréat,
label,
name,
estEnCoursDeModification,
}: ProjectFieldProps<T>) => {
const [linked, setLinked] = useState(candidature === lauréat);
const [candidatureValue, setCandidatureValue] = useState(candidature);
const [lauréatValue, setLauréatValue] = useState(lauréat);

const onButtonClick = () => {
setLinked((l) => !l);
setLauréatValue(candidatureValue);
};

return (
<div className="flex flex-row items-center gap-4 w-full">
<div className="flex-1 font-semibold">{label}</div>
<div className="flex-1 flex ">
<input
name={`candidature.${name}`}
type="hidden"
value={candidatureValue}
disabled={candidatureValue === candidature}
/>
<Input
label=""
nativeInputProps={{
value: candidatureValue,
onChange: (ev) => {
setCandidatureValue(ev.target.value as T);
if (linked) {
setLauréatValue(ev.target.value as T);
}
},
}}
/>
</div>
<div className="flex-1 flex flex-row gap-2 items-center">
<input
name={`laureat.${name}`}
type="hidden"
value={lauréatValue}
disabled={lauréatValue === lauréat}
/>
<Input
disabled={estEnCoursDeModification || linked}
label=""
nativeInputProps={{
value: lauréatValue,
onChange: (ev) => {
setLauréatValue(ev.target.value as T);
if (linked) {
setCandidatureValue(ev.target.value as T);
}
},
}}
addon={
<Button
type="button"
iconId={linked ? 'fr-icon-lock-unlock-fill' : 'fr-icon-lock-fill'}
title="Appliquer les changements au projet"
onClick={onButtonClick}
disabled={estEnCoursDeModification}
nativeButtonProps={{ 'aria-label': 'Appliquer les changements au projet' }}
/>
}
/>
</div>
</div>
);
};

const ActionnaireField = ({
candidature,
lauréat,
estEnCoursDeModification,
}: FieldProps<string>) => {
return (
<ProjectField
candidature={candidature}
lauréat={lauréat}
estEnCoursDeModification={estEnCoursDeModification}
label="Actionnaire(s)"
name="actionnaire"
/>
);
};

const ReprésentantLégalField = ({
candidature,
lauréat,
estEnCoursDeModification,
}: FieldProps<string>) => {
return (
<ProjectField
candidature={candidature}
lauréat={lauréat}
estEnCoursDeModification={estEnCoursDeModification}
label="Nom représentant légal"
name="nomRepresentantLegal"
/>
);
};

const TechnologieField = ({ candidature, lauréat }: FieldProps<string>) => {
const [candidatureValue, setCandidatureValue] = useState(candidature);

return (
<div className="flex flex-row items-center gap-4 w-full">
<div className="flex-1 font-semibold">Technologie</div>
<div className="flex-1 flex ">
<input
name={`candidature.technologie`}
type="hidden"
value={candidatureValue}
disabled={candidatureValue === candidature}
/>
<Select
label=""
nativeSelectProps={{
defaultValue: candidature,
required: true,
'aria-required': true,
onChange: (ev) => {
setCandidatureValue(ev.target.value);
},
}}
options={Candidature.TypeTechnologie.types.map((type) => ({
value: type,
label: getTechnologieTypeLabel(type),
}))}
/>
</div>
<div className="flex-1 flex flex-row gap-2 items-center">
<Input
disabled
label=""
nativeInputProps={{
value: lauréat,
}}
/>
</div>
</div>
);
};

export type ModifierLauréatFormProps = ModifierLauréatPageProps;

export const ModifierLauréatForm: React.FC<ModifierLauréatFormProps> = ({
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/* eslint-disable react/jsx-props-no-spreading */
'use client';

import Button from '@codegouvfr/react-dsfr/Button';
import Input from '@codegouvfr/react-dsfr/Input';
import { useState } from 'react';
import Select from '@codegouvfr/react-dsfr/SelectNext';

import { Candidature } from '@potentiel-domain/candidature';

import { getTechnologieTypeLabel } from '../../candidature/helpers';

type FieldProps<T> = { candidature: T; lauréat: T; estEnCoursDeModification?: boolean };
type ProjectFieldProps<T> = FieldProps<T> & { label: string; name: string };

const ProjectField = <T extends string | number>({
candidature,
lauréat,
label,
name,
estEnCoursDeModification,
}: ProjectFieldProps<T>) => {
const [linked, setLinked] = useState(candidature === lauréat);
const [candidatureValue, setCandidatureValue] = useState(candidature);
const [lauréatValue, setLauréatValue] = useState(lauréat);

const onButtonClick = () => {
setLinked((l) => !l);
setLauréatValue(candidatureValue);
};

return (
<div className="flex flex-row items-center gap-4 w-full">
<div className="flex-1 font-semibold">{label}</div>
<div className="flex-1 flex ">
<input
name={`candidature.${name}`}
type="hidden"
value={candidatureValue}
disabled={candidatureValue === candidature}
/>
<Input
label=""
nativeInputProps={{
value: candidatureValue,
onChange: (ev) => {
setCandidatureValue(ev.target.value as T);
if (linked) {
setLauréatValue(ev.target.value as T);
}
},
}}
/>
</div>
<div className="flex-1 flex flex-row gap-2 items-center">
<input
name={`laureat.${name}`}
type="hidden"
value={lauréatValue}
disabled={lauréatValue === lauréat}
/>
<Input
disabled={estEnCoursDeModification || linked}
label=""
nativeInputProps={{
value: lauréatValue,
onChange: (ev) => {
setLauréatValue(ev.target.value as T);
if (linked) {
setCandidatureValue(ev.target.value as T);
}
},
}}
addon={
<Button
type="button"
iconId={linked ? 'fr-icon-lock-unlock-fill' : 'fr-icon-lock-fill'}
title="Appliquer les changements au projet"
onClick={onButtonClick}
disabled={estEnCoursDeModification}
nativeButtonProps={{ 'aria-label': 'Appliquer les changements au projet' }}
/>
}
/>
</div>
</div>
);
};

export const ActionnaireField = ({
candidature,
lauréat,
estEnCoursDeModification,
}: FieldProps<string>) => {
return (
<ProjectField
candidature={candidature}
lauréat={lauréat}
estEnCoursDeModification={estEnCoursDeModification}
label="Actionnaire(s)"
name="actionnaire"
/>
);
};

export const ReprésentantLégalField = ({
candidature,
lauréat,
estEnCoursDeModification,
}: FieldProps<string>) => {
return (
<ProjectField
candidature={candidature}
lauréat={lauréat}
estEnCoursDeModification={estEnCoursDeModification}
label="Nom représentant légal"
name="nomRepresentantLegal"
/>
);
};

export const TechnologieField = ({ candidature, lauréat }: FieldProps<string>) => {
const [candidatureValue, setCandidatureValue] = useState(candidature);

return (
<div className="flex flex-row items-center gap-4 w-full">
<div className="flex-1 font-semibold">Technologie</div>
<div className="flex-1 flex ">
<input
name={`candidature.technologie`}
type="hidden"
value={candidatureValue}
disabled={candidatureValue === candidature}
/>
<Select
label=""
nativeSelectProps={{
defaultValue: candidature,
required: true,
'aria-required': true,
onChange: (ev) => {
setCandidatureValue(ev.target.value);
},
}}
options={Candidature.TypeTechnologie.types.map((type) => ({
value: type,
label: getTechnologieTypeLabel(type),
}))}
/>
</div>
<div className="flex-1 flex flex-row gap-2 items-center">
<Input
disabled
label=""
nativeInputProps={{
value: lauréat,
}}
/>
</div>
</div>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ export const financementCollectifCsvSchema = ouiNonSchema;
export const gouvernancePartagéeCsvSchema = ouiNonSchema;
export const historiqueAbandonCsvSchema = z.enum(['1', '2', '3', '4']);
export const typeGarantiesFinancieresCsvSchema = optionalEnum(z.enum(['1', '2', '3']));
export const territoireProjetCsvSchema = optionalStringSchema;
export const notifiedOnCsvSchema = z.undefined({
invalid_type_error: 'Le champs notifiedOn ne peut pas être présent',
});
Expand Down

0 comments on commit 3640fba

Please sign in to comment.