From e89d2fc4c34a99c6b67827bb895ad31a5eff10e6 Mon Sep 17 00:00:00 2001 From: Luc SORIGNET Date: Mon, 1 Sep 2025 11:08:21 +0200 Subject: [PATCH] feat: Ajout FormTemplateBuilder [N3WTS-17] --- Front-End/src/app/[locale]/page.js | 3 +- .../src/components/Form/AddFieldModal.js | 354 +++++++++++ Front-End/src/components/Form/FormRenderer.js | 26 +- .../components/Form/FormTemplateBuilder.js | 596 ++++++++++++++++++ Front-End/src/components/Form/FormTypes.js | 14 + Front-End/src/components/Form/IconSelector.js | 145 +++++ docs/manuels/installation/premier-pas.md | 94 +++ 7 files changed, 1229 insertions(+), 3 deletions(-) create mode 100644 Front-End/src/components/Form/AddFieldModal.js create mode 100644 Front-End/src/components/Form/FormTemplateBuilder.js create mode 100644 Front-End/src/components/Form/FormTypes.js create mode 100644 Front-End/src/components/Form/IconSelector.js create mode 100644 docs/manuels/installation/premier-pas.md diff --git a/Front-End/src/app/[locale]/page.js b/Front-End/src/app/[locale]/page.js index 8f13814..831066e 100644 --- a/Front-End/src/app/[locale]/page.js +++ b/Front-End/src/app/[locale]/page.js @@ -4,6 +4,7 @@ import React from 'react'; import Button from '@/components/Form/Button'; import Logo from '@/components/Logo'; // Import du composant Logo import FormRenderer from '@/components/Form/FormRenderer'; +import FormTemplateBuilder from '@/components/Form/FormTemplateBuilder'; export default function Home() { const t = useTranslations('homePage'); @@ -14,7 +15,7 @@ export default function Home() {

{t('welcomeParents')}

{t('pleaseLogin')}

+ + +
+ ( + { + onChange(e.target.value); + setCurrentField({ + ...currentField, + type: e.target.value, + }); + }} + choices={FIELD_TYPES} + placeHolder="Sélectionner un type" + required + /> + )} + /> + + {![ + 'paragraph', + 'heading1', + 'heading2', + 'heading3', + 'heading4', + 'heading5', + 'heading6', + ].includes(currentField.type) && ( + <> + ( + { + onChange(e.target.value); + setCurrentField({ + ...currentField, + label: e.target.value, + }); + }} + required + /> + )} + /> + + ( + { + onChange(e.target.value); + setCurrentField({ + ...currentField, + placeholder: e.target.value, + }); + }} + /> + )} + /> + +
+ ( + { + onChange(e.target.checked); + setCurrentField({ + ...currentField, + required: e.target.checked, + }); + }} + className="mr-2" + /> + )} + /> + +
+ + {(currentField.type === 'text' || + currentField.type === 'email' || + currentField.type === 'date') && ( +
+ + ( +
+
+ {currentField.icon && + LucideIcons[currentField.icon] ? ( + <> + {React.createElement( + LucideIcons[currentField.icon], + { + size: 20, + className: 'text-gray-600', + } + )} + + {currentField.icon} + + + ) : ( + + Aucune icône sélectionnée + + )} +
+
+ )} + /> +
+ )} + + )} + + {[ + 'paragraph', + 'heading1', + 'heading2', + 'heading3', + 'heading4', + 'heading5', + 'heading6', + ].includes(currentField.type) && ( + ( +
+ +