v1.4.7
A complete library of reusable fields and forms (inputs, selectors, date pickers, submissions, etc.). It relies on `@jeremiemeunier/core` for styles and cross-cutting components.
Bibliothèque complète de champs et formulaires réutilisables (inputs, selecteurs, date pickers, soumissions…). Elle s’appuie sur @jeremiemeunier/core pour les styles et composants transverses.
.npmrc à la racine de votre projet :
@jeremiemeunier:registry=https://npm.pkg.github.com
npm install @jeremiemeunier/core @jeremiemeunier/form
import { Input, Select, Submit } from "@jeremiemeunier/form";
| Commande | Description |
|---|---|
npm run lint | Analyse statique avec ESLint. |
npm run build | Compile la bibliothèque avec tsup et publie les artefacts dans dist/. |
npm run pub | Construit puis publie la version courante sur GitHub Packages. |
npm run pubbeta | Variante de publication qui publie la version courante avec le tag beta. |
npm install npm run lint npm run build # npm run pub # publication stable (connexion à GitHub Packages requise) # npm run pubbeta # publication d'une préversion
Ce package ne fournit pas encore de suite de tests automatisés.
Le package est déjà compilé et publié, aucune étape de build supplémentaire n'est requise pour la consommation depuis un projet React. Après l’installation, importez simplement le composant souhaité :
import { Form, Input, Submit } from "@jeremiemeunier/form";
<Adresse><AutoComplete><Checkbox><CheckboxSlider><DatePicker><DragAndDrop><FileInput><Form><Group><Input><Message><Password><Progress><Radio><Select><Submit><TagInput><TextArea><TotpInput>| Props name | Required | Type | Default | Components |
|---|---|---|---|---|
label | optional | String | all | |
content | required | ReactState | all | |
setContent | required | ReactSetState | all | |
error | optional | ReactState | all | |
size | optional | Integer | all | |
readOnly | optional | Boolean | all | |
tagline | optional | Object | all | |
otherAction | optional | Object | Submit | |
type | optional | String | text | all |
maxLength | optional | Integer | all | |
placeHolder | optional | String | all | |
locked | optional | Boolean | all | |
regex | optional | RegexPattern | all | |
regexLabel | optional | String | all | |
required | optional | Boolean | all | |
name | optional | String | all | |
accept | required | Array | FileInput | |
isNew | optional | Boolean | Password | |
rows | optional | Integer | TextArea | |
data | required | Object | AutoComplete | |
values | required | Object | Radio | |
blockedDate | optional | Object | DatePicker |
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <Select label={"My select label"} content={content} setContent={setContent} error={error} size={integer} locked={true|false}> <option>my select option</option> <option>my select option</option> <option>my select option</option> <option>my select option</option> <option>my select option</option> </Select>
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <Input label={"My input label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} type={"url"|"text"|"mail"|...} maxLength={integer} placeHolder={"My input placeholder"} locked={true|false} regex={regexPattern} regexLabel={"My error text for regex"} required={true|false} name={optional: "my_input_name"} />
For type props see <input> : The Input (Form Input) element
Vous devez utiliser un FormData et ajouter enctype="multipart/form-data" lors de l'utilisation de ce composant.
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <FileInput label={"My file input label"} setContent={setContent} error={error} size={integer} required={true|false} accept={["jpg", "xlsx", ...]} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <Password label={"My password input label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} maxLength={integer} placeHolder={"My input placeholder"} locked={true|false} regex={regexPattern} regexLabel={"My error text for regex"} required={true|false} name={optional: "my_input_name"} isNew={true|false} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <TextArea label={"My textarea label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} maxLength={integer} placeHolder={"My textarea placeholder"} locked={true|false} regex={regexPattern} regexLabel={"My error text for regex"} required={true|false} name={optional: "my_input_name"} rows={optional: integer} />
<Message label={"My message label"} content={"Message content"} size={integer} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} type={"info"|"danger"|"warning"} />
const [content, setContent] = useState(true|false); const [error, setError] = useState(""); ... <Checkbox label={"My checkbox label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} required={true|false} name={optional: "my_checkbox_name"} />
const [content, setContent] = useState(true|false); const [error, setError] = useState(""); ... <CheckboxSlider label={"My checkbox slider label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} required={true|false} name={optional: "my_checkbox_slider_name"} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <Radio label={"My radio label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} values={{ valueKey: "Value" }} required={true|false} name={optional: "my_radio_name"} />
const [content, setContent] = useState({ selectKey: "selectValue", inputKey: "inputValue" }); const [error, setError] = useState({ selectKey: "", inputKey: "" }); ... <Group label={"My group label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_group_name"}> <Select label={"My select label"} content={content.selectKey} setContent={(value) => setContent({ ...content, selectKey: value })} error={error.selectKey} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_select_name"}> <option>my select option</option> <option>my select option</option> <option>my select option</option> <option>my select option</option> <option>my select option</option> </Select> <Input label={"My input label"} content={content.inputKey} setContent={(value) => setContent({ ...content, inputKey: value })} error={error.inputKey} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_input_name"} /> </Group>
const [content, setContent] = useState({ inputKey: "", selectKey: "" }); const [error, setError] = useState({ inputKey: "", selectKey: "" }); ... const mySubmitHandler = (event) => { event.preventDefault(); ... }; const myErrorHandler = (event) => { event.preventDefault(); ... }; <Form content={content} setContent={setContent} error={error} setError={setError} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} submit={{ "label": "My submit button label", "action": mySubmitHandler, "appearance": "primary" }} otherAction={{ "label": "My other button label", "action": myErrorHandler, "appearance": "secondary" }} locked={true|false} name={optional: "my_form_name"}> <Input ... /> <Select ... /> <Checkbox ... /> <CheckboxSlider ... /> <Radio ... /> </Form>
const [content, setContent] = useState(0); const [error, setError] = useState(""); ... <Progress label={"My progress label"} content={content} setContent={setContent} error={error} size={integer} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} required={true|false} name={optional: "my_progress_name"} />
const mySubmitHandler = (event) => { event.preventDefault(); ... }; <Submit label={"My submit button label"} action={mySubmitHandler} appearance={"primary"} locked={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <DragAndDrop label={"My drag and drop label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_drag_and_drop_name"} />
const [content, setContent] = useState(["Tag 1", "Tag 2"]); const [error, setError] = useState(""); ... <TagInput label={"My tag input label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_tag_input_name"} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <TotpInput label={"My TOTP input label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_totp_input_name"} />
const [content, setContent] = useState(new Date()); const [error, setError] = useState(""); ... <DatePicker label={"My date picker label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_date_picker_name"} blockedDate={{ type: "array", values: ["2023-01-01", "2023-01-02"] }} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); const data = [ { value: "FR", label: "France" }, { value: "DE", label: "Allemagne" } ]; ... <AutoComplete label={"My autocomplete label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_autocomplete_name"} data={data} />
const [content, setContent] = useState({ address: "", city: "", zip: "" }); const [error, setError] = useState({ address: "", city: "", zip: "" }); ... <Adresse label={"My address label"} content={content} setContent={setContent} error={error} size={integer} readOnly={true|false} tagline={{ "link": "https://digitalteacompany.fr", "label": "DigitalTeacompany" }} locked={true|false} required={true|false} name={optional: "my_address_name"} />
const [content, setContent] = useState(""); const [error, setError] = useState(""); ... <FileInput label={"My file input label"} setContent={setContent} error={error} size={integer} required={true|false} accept={["jpg", "xlsx", ...]} dropZone={true|false} />