This repository has been archived on 2024-10-29. You can view files and clone it, but cannot push or open issues or pull requests.
FunctionProject/website/components/FunctionForm.js

161 lines
7.6 KiB
JavaScript
Raw Normal View History

import { Fragment, useState, useEffect } from 'react';
import Loader from './Loader';
import htmlParser from 'html-react-parser';
2020-04-20 17:53:44 +02:00
import dynamic from 'next/dynamic';
import api from '../utils/api';
2020-04-20 17:53:44 +02:00
import fr from 'date-fns/locale/fr';
import { registerLocale } from "react-datepicker";
import date from 'date-and-time';
import "react-datepicker/dist/react-datepicker.css";
registerLocale('fr', fr);
const FunctionForm = (props) => {
2020-04-20 17:53:44 +02:00
const [inputState, setInputState] = useState({});
const [message, setMessage] = useState("");
const [isLoading, setIsLoading] = useState(false);
// inputState par défaut
useEffect(() => {
const inputStateNew = { ...inputState };
props.inputsArray.forEach((input) => {
if (input.type === "select" && input.options.length > 0) {
inputStateNew[input.name] = input.options[0].value;
}
});
setInputState(inputStateNew);
}, []);
const handleSubmit = (event) => {
2020-03-25 18:46:23 +01:00
setIsLoading(true);
event.preventDefault();
api.post(`/functions/${props.slug}`, inputState)
.then((response) => {
setMessage(response.data.resultHTML);
2020-03-25 18:46:23 +01:00
setIsLoading(false);
})
.catch((error) => {
setMessage(error.response.data.message);
2020-03-25 18:46:23 +01:00
setIsLoading(false);
});
}
const handleChange = (event) => {
const inputStateNew = { ...inputState };
inputStateNew[event.target.name] = event.target.value;
setInputState(inputStateNew);
}
if (props.inputsArray.length <= 0) {
return (
<div className="FunctionComponent__slide text-center">
<p>La fonction n'est pas encore disponible.</p>
</div>
);
}
return (
<Fragment>
<form onSubmit={handleSubmit}>
{props.inputsArray.map((input, index) => {
2020-04-20 17:53:44 +02:00
switch (input.type) {
case "text":
return (
<div key={index} className="form-group">
2020-04-21 18:03:16 +02:00
<label className="form-label" htmlFor={input.name}>{input.label}</label>
<input onChange={handleChange} type="text" name={input.name} id={input.name} placeholder={input.placeholder} className="form-control" />
</div>
);
case "integer":
case "float":
return (
<div key={index} className="form-group">
<label className="form-label" htmlFor={input.name}>{input.label}</label>
<input onChange={handleChange} type="number" step={(input.type === "integer") ? "1" : "0.01"} name={input.name} id={input.name} placeholder={input.placeholder} className="form-control" />
2020-04-20 17:53:44 +02:00
</div>
);
case "calendar":
// Permet au datepicker de prendre la hauteur
if (typeof window != 'undefined') {
const newScript = document.createElement("script");
newScript.src = "/js/extraHeightCSS.js";
document.body.appendChild(newScript);
}
const DatePicker = dynamic(
() => import('react-datepicker'),
{ ssr: false }
);
return (
<div key={index} className="form-group">
<label className="form-label" htmlFor={input.name}>{input.label}</label>
<br/>
<DatePicker
selected={(() => {
try {
if (inputState[input.name] != undefined) {
const dateArray = inputState[input.name].split('/');
const year = dateArray[2];
const month = dateArray[1];
const day = dateArray[0];
return new Date(year, parseInt(month) - 1, parseInt(day) + 1);
}
throw "Not a valid date";
} catch {
return new Date();
}
})()}
locale="fr"
dateFormat="dd/MM/yyyy"
fixedHeight
placeholderText={input.placeholder}
onChange={(dateObject) => {
try {
const formattedDate = date.format(dateObject, 'DD/MM/YYYY', true);
handleChange({
target: {
name: input.name,
value: formattedDate
}
});
} catch {}
}}
/>
</div>
);
2020-04-21 18:03:16 +02:00
case "select":
return (
<div key={index} className="form-group">
<label className="form-label" htmlFor={input.name}>{input.label}</label>
<select onChange={handleChange} name={input.name} id={input.name} value={inputState[input.name] || input.options[0]} className="form-control">
{input.options.map((option, optionIndex) => {
return (
<option key={optionIndex} value={option.value}>{option.name}</option>
);
})}
</select>
</div>
);
default:
2020-04-20 17:53:44 +02:00
return (
<p>Erreur, l'input n'est pas valide...</p>
);
}
})}
<div className="form-group text-center">
<button type="submit" className="btn btn-dark">Envoyer</button>
</div>
</form>
<div className="form-result text-center">
{
(isLoading) ?
<Loader />
:
htmlParser(message)
}
</div>
</Fragment>
);
}
export default FunctionForm;