added form ordering and validation for s78

This commit is contained in:
2022-04-06 16:52:22 +01:00
parent c485559b22
commit 093cba5d70
21 changed files with 2093 additions and 1058 deletions
+604 -82
View File
@@ -12,6 +12,17 @@ import pickListLookup from "../../data/picklistLookups.json";
import useTranslation from "next-translate/useTranslation";
import FileUpload from "../newappeal/fileupload";
import Dropzone, { useDropzone } from "react-dropzone";
import _ from "lodash";
import { connect, useDispatch } from "react-redux";
import {
addYears,
addMonths,
addDays,
subYears,
subMonths,
subDays,
} from "date-fns";
const RenderTextfield = ({
id,
@@ -50,86 +61,204 @@ const RenderTextfield = ({
};
export function Textfield(props) {
const { name, label, validate, ticketnumber } = props;
const {
name,
label,
validation,
ticketnumber,
form,
formProps,
parentField,
parentFieldShowOnValue,
hint,
} = props;
const required = (value) => (value ? undefined : "Required");
if (name == "pinswg_name") {
let { t } = useTranslation();
return (
<div className="govuk-form-group">
<label className="govuk-label " htmlFor={props.name}>
{label}
</label>
<input
type="text"
name={name}
id={props.name}
component={RenderCaseID}
value={ticketnumber}
className="govuk-input govuk-input--width-20"
disabled
/>
</div>
<>
<div className="govuk-form-group">
<label className="govuk-label " htmlFor={props.name}>
{label}
</label>
<input
type="text"
name={name}
id={props.name}
component={RenderCaseID}
value={ticketnumber}
className="govuk-input govuk-input--width-20"
disabled
/>
</div>
<div className="govuk-body">{t(hint)}</div>
</>
);
} else {
var showIfHasParentShowValue =
(parentField != false &&
!_.isEmpty(formProps[form]) &&
_.has(formProps[form].values, parentField) &&
formProps[form].values[parentField]) == parentFieldShowOnValue;
// console.log(parentField, showIfHasParentShowValue);
// console.log(parentField, formProps, form);
//console.log("validation props:", validation);
return (
<Field
name={props.name}
id={props.name}
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
//validate={[required]}
label={props.label}
errorMsg="Is required"
/>
<div className="govuk-form-group">
{parentField != false ? (
showIfHasParentShowValue && (
<Field
name={props.name}
id={props.name}
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={eval(validation)}
label={props.label}
errorMsg="Is required"
/>
)
) : (
<Field
name={props.name}
id={props.name}
component={RenderTextfield}
type="text"
className="govuk-input govuk-input--width-20"
validate={eval(validation)}
label={props.label}
errorMsg="Is required"
/>
)}
</div>
);
}
}
const RenderMultiline = ({
id,
className,
rows,
datafieldname,
name,
label,
input,
errorMsg,
meta: { touched, error },
...custom
}) => {
return (
<>
<textarea {...input} rows={rows} className={className}></textarea>
<div
className={
touched && error
? "govuk-form-group govuk-form-group--error"
: "govuk-form-group "
}
>
<label className="govuk-label " htmlFor={id} id={id + "_label"}>
{FieldsTranslations(label)}
</label>
{touched && error && (
<span id={id + "-error"} className="govuk-error-message">
<span className="govuk-visually-hidden">Error:</span>{" "}
{touched &&
((error && (
<span>{errorMsg ? errorMsg : error}</span>
)) ||
(warning && <span>{warning}</span>))}
</span>
)}
<textarea
{...input}
rows={rows}
className={className}
></textarea>
</div>
</>
);
};
export function MultiLinefield(props) {
const { name, label } = props;
const {
name,
label,
parentField,
form,
formProps,
parentFieldShowOnValue,
validation,
} = props;
const required = (value) => (value ? undefined : "Is required");
var showIfHasParentShowValue =
(parentField != false &&
!_.isEmpty(formProps[form]) &&
_.has(formProps[form].values, parentField) &&
formProps[form].values[parentField]) == parentFieldShowOnValue;
// console.log(parentField, showIfHasParentShowValue);
return (
<div className="govuk-form-group">
<h1 className="govuk-label-wrapper">
<label className="govuk-label" htmlFor={props.name}>
{FieldsTranslations(props.label)}
</label>
</h1>
<div
id={props.name + "-hint"}
className="govuk-hint govuk-!-font-size-14"
>
Do not include personal or financial information, like your
National Insurance number or credit card details.
</div>
<>
{parentField != false ? (
showIfHasParentShowValue && (
<div>
<h1 className="govuk-label-wrapper">
<label className="govuk-label" htmlFor={props.name}>
{FieldsTranslations(props.label)}
</label>
</h1>
<div
id={props.name + "-hint"}
className="govuk-hint govuk-!-font-size-14"
>
Do not include personal or financial information.
</div>
<Field
name={props.name}
id={props.name}
component={RenderMultiline}
type="text"
rows="5"
className="govuk-textarea govuk-input--width-30"
aria-describedby={props.name + "-hint"}
validate={eval(validation)}
/>
</div>
)
) : (
<div className="govuk-form-group">
<h1 className="govuk-label-wrapper">
<label className="govuk-label" htmlFor={props.name}>
{FieldsTranslations(props.label)}
</label>
</h1>
<div
id={props.name + "-hint"}
className="govuk-hint govuk-!-font-size-14"
>
Do not include personal or financial information.
</div>
<Field
name={props.name}
id={props.name}
component={RenderMultiline}
type="text"
rows="5"
className="govuk-textarea govuk-input--width-30"
aria-describedby={props.name + "-hint"}
/>
</div>
<Field
name={props.name}
id={props.name}
component={RenderMultiline}
type="text"
rows="5"
className="govuk-textarea govuk-input--width-30"
aria-describedby={props.name + "-hint"}
validate={eval(validation)}
/>
</div>
)}
</>
);
}
@@ -145,6 +274,42 @@ const RenderDatePicker = ({
}) => {
const router = useRouter();
registerLocale("cy", cy);
var startDateArr =
custom.dateStart != "0" ? custom.dateStart.split("") : custom.dateStart;
var endDateArr =
custom.dateEnd != "0" ? custom.dateEnd.split("") : custom.dateEnd;
var minDate =
startDateArr == 0
? new Date()
: startDateArr[0] == "-"
? startDateArr[2] == "y"
? subYears(new Date(), startDateArr[1])
: startDateArr[2] == "m"
? subMonths(new Date(), startDateArr[1])
: subDays(new Date(), startDateArr[1])
: startDateArr[2] == "y"
? addYears(new Date(), startDateArr[1])
: startDateArr[2] == "m"
? addMonths(new Date(), startDateArr[1])
: addDays(new Date(), startDateArr[1]);
var maxDate =
endDateArr == 0
? new Date()
: startDateArr[0] == "-"
? startDateArr[2] == "y"
? subYears(new Date(), startDateArr[1])
: startDateArr[2] == "m"
? subMonths(new Date(), startDateArr[1])
: subDays(new Date(), startDateArr[1])
: startDateArr[2] == "y"
? addYears(new Date(), startDateArr[1])
: startDateArr[2] == "m"
? addMonths(new Date(), startDateArr[1])
: addDays(new Date(), startDateArr[1]);
return (
<>
<div
@@ -185,6 +350,9 @@ const RenderDatePicker = ({
dateFormat="dd/MM/yyyy"
onChange={onChange}
selected={value || null}
className="govuk-input govuk-input--width-10"
minDate={minDate}
maxDate={maxDate}
// value={!value ? null : new Date(value)}
/>
@@ -195,18 +363,53 @@ const RenderDatePicker = ({
};
export function DateFieldPicker(props) {
const { name, label } = props;
const {
name,
label,
parentField,
form,
formProps,
parentFieldShowOnValue,
validation,
dateStart,
dateEnd,
} = props;
const required = (value) => (value ? undefined : "Required");
var showIfHasParentShowValue =
(parentField != false &&
!_.isEmpty(formProps[form]) &&
_.has(formProps[form].values, parentField) &&
formProps[form].values[parentField]) == parentFieldShowOnValue;
return (
<Field
name={name}
id={name}
label={label}
component={RenderDatePicker}
//validate={[required]}
errorMsg="Select a date"
/>
<div className="govuk-form-group">
{parentField != false ? (
showIfHasParentShowValue && (
<Field
name={name}
id={name}
label={label}
component={RenderDatePicker}
validate={eval(validation)}
errorMsg="Select a date"
dateStart={dateStart}
dateEnd={dateEnd}
/>
)
) : (
<Field
name={name}
id={name}
label={label}
component={RenderDatePicker}
validate={eval(validation)}
errorMsg="Select a date"
dateStart={dateStart}
dateEnd={dateEnd}
/>
)}
</div>
);
}
@@ -332,7 +535,13 @@ const RenderYesNo = ({
{errorMsg}
</span>
)}
<div className="govuk-radios govuk-radios--inline govuk-radios--small">
<div
className={
custom.inline == false
? "govuk-radios govuk-radios--small"
: "govuk-radios govuk-radios--inline govuk-radios--small"
}
>
{Object.keys(options).map((key, index) => (
<div
className="govuk-radios__item"
@@ -346,6 +555,31 @@ const RenderYesNo = ({
type="radio"
className="govuk-radios__input"
value={options[key]}
onChange={(e) => {
let docListObj = custom.documentList;
if (
custom.requiredDocumentValue ==
"Yes" ||
custom.requiredDocumentValue ==
"Ydw"
) {
e.target.value == "Ydw" ||
e.target.value == "Yes"
? (docListObj = Object.assign(
docListObj,
{
["documentCheckList_" +
id]:
custom.requiredDocumentLabel,
}
))
: delete docListObj[
"documentCheckList_" + id
];
console.log(docListObj);
custom.setDocumentsList(docListObj);
}
}}
/>
<label
className="govuk-label govuk-radios__label"
@@ -365,7 +599,7 @@ const RenderYesNo = ({
export function YesNofield(props) {
const router = useRouter();
const { name, label } = props;
const { name, label, inline, validation } = props;
const yesNo = router.locale == "cy" ? ["Ydw", "Na"] : ["Yes", "No"];
const required = (value) => (value ? undefined : "Required");
@@ -376,10 +610,291 @@ export function YesNofield(props) {
label={props.label}
options={yesNo}
id={props.name}
className="govuk-radios__input"
//validate={[required]}
className={"govuk-radios__input"}
validate={eval(validation)}
errorMsg="Select an option"
component={RenderYesNo}
inline={_.has(props, "inline") ? props.inline : "true"}
requiredDocumentLabel={props.requiredDocumentLabel}
requiredDocumentValue={props.requiredDocumentValue}
setDocumentsList={props.setDocumentsList}
documentList={props.documentList}
/>
);
}
const RenderRadio = ({
datafieldname,
name,
label,
id,
errorMsg,
options,
input: { onChange, value },
meta: { touched, error },
...custom
}) => {
let { t } = useTranslation();
return (
<>
<div
className={
touched && error
? "govuk-form-group govuk-form-group--error"
: "govuk-form-group "
}
>
<fieldset
className="govuk-fieldset"
aria-describedby={name + "-hint"}
>
<legend className="govuk-fieldset__legend govuk-fieldset__legend--s govuk-!-font-weight-regular">
<label
className="govuk-fieldset__heading govuk-body-m"
id={id + "_label"}
>
{FieldsTranslations(label)}
</label>
</legend>
{touched && error && (
<span
id={id + "-error"}
className="govuk-error-message"
>
<span className="govuk-visually-hidden">
Error:
</span>{" "}
{errorMsg}
</span>
)}
<div
className={
custom.inline == false
? "govuk-radios govuk-radios--small"
: "govuk-radios govuk-radios--inline govuk-radios--small"
}
>
{" "}
{custom.hint != false && (
<div class="govuk-hint">{t(custom.hint)}</div>
)}
{Object.keys(options).map((key, index) => (
<div
className="govuk-radios__item"
data-children-count={key}
key={key}
>
<Field
id={id + "_" + index}
name={id}
component="input"
type="radio"
className="govuk-radios__input"
value={options[key].split("|")[0]}
onChange={(e) => {
let docListObj = custom.documentList;
if (
custom.requiredDocumentValue ==
"Yes"
) {
e.target.value != "846040000"
? (docListObj = Object.assign(
docListObj,
{
["documentCheckList_" +
id]:
custom.requiredDocumentLabel,
}
))
: delete docListObj[
"documentCheckList_" + id
];
custom.setDocumentsList(docListObj);
}
}}
/>
<label
className="govuk-label govuk-radios__label"
htmlFor={id + "_" + index}
>
{t(options[key].split("|")[1])}
</label>
</div>
))}
</div>
</fieldset>
</div>
</>
);
};
export function Radiofield(props) {
const {
name,
label,
datafieldname,
parentField,
form,
formProps,
parentFieldShowOnValue,
validation,
} = props;
const router = useRouter();
const required = (value) => (value ? undefined : "Required");
// console.log(props.options);
const fieldOptions = props.options
.slice(1, props.options.length - 1)
.split(",");
//parentFieldShowOnValue
var showIfHasParentShowValue =
parentField != false &&
!_.isEmpty(formProps[form]) &&
_.has(formProps[form].values, parentField) &&
parentFieldShowOnValue.indexOf(
formProps[form].values[parentField].toString()
) > -1;
// console.log(showIfHasParentShowValue);
return (
<>
{parentField != false ? (
showIfHasParentShowValue && (
<Field
name={name}
datafieldname={datafieldname}
label={label}
options={fieldOptions}
id={name}
//validate={[required]}
errorMsg="Select an option"
component={RenderRadio}
inline={props.inline}
hint={props.hint}
validate={eval(validation)}
requiredDocumentLabel={props.requiredDocumentLabel}
requiredDocumentValue={props.requiredDocumentValue}
setDocumentsList={props.setDocumentsList}
documentList={props.documentList}
/>
)
) : (
<Field
name={name}
datafieldname={datafieldname}
label={label}
options={fieldOptions}
id={name}
//validate={[required]}
errorMsg="Select an option"
component={RenderRadio}
inline={props.inline}
hint={props.hint}
validate={eval(validation)}
requiredDocumentLabel={props.requiredDocumentLabel}
requiredDocumentValue={props.requiredDocumentValue}
setDocumentsList={props.setDocumentsList}
documentList={props.documentList}
/>
)}
</>
);
}
const RenderCheckBox = ({
datafieldname,
name,
label,
id,
errorMsg,
options,
input: { onChange, value },
meta: { touched, error },
...custom
}) => {
return (
<>
<div
className={
touched && error
? "govuk-form-group govuk-form-group--error"
: "govuk-form-group "
}
>
<fieldset
className="govuk-fieldset"
aria-describedby={name + "-hint"}
>
<legend className="govuk-fieldset__legend govuk-fieldset__legend--s govuk-!-font-weight-regular">
<label
className="govuk-fieldset__heading govuk-body-m"
id={id + "_label"}
>
{FieldsTranslations(label)}
</label>
</legend>
{touched && error && (
<span
id={id + "-error"}
className="govuk-error-message"
>
<span className="govuk-visually-hidden">
Error:
</span>{" "}
{errorMsg}
</span>
)}
<div className="govuk-checkboxes ">
{Object.keys(options).map((key, index) => (
<div
className="govuk-checkboxes__item"
data-children-count={key}
key={key}
>
<Field
id={id + "_" + index}
name={id + "_" + index}
component="input"
type="checkbox"
className="govuk-checkboxes__input"
value={options[key]}
/>
<label
className="govuk-label govuk-checkboxes__label"
htmlFor={id + "_" + index}
>
{options[key]}
</label>
</div>
))}
</div>
</fieldset>
</div>
</>
);
};
export function CheckBoxfield(props) {
const router = useRouter();
console.log(props);
const required = (value) => (value ? undefined : "Required");
const fieldOptions =
router.locale == "cy" ? ["Ydw", "Na", "2323"] : ["Yes", "No", "23232"];
return (
<Field
name={props.name}
datafieldname={props.datafieldname}
label={props.label}
options={fieldOptions}
id={props.id}
className={props.className}
//validate={[required]}
errorMsg="Select an option"
component={RenderCheckBox}
/>
);
}
@@ -438,7 +953,8 @@ export function PickList(props) {
}
export function NumericField(props) {
const { name, label } = props;
const { name, label, validation } = props;
const required = (value) => (value ? undefined : "Required");
return (
<div className="govuk-form-group">
@@ -448,7 +964,6 @@ export function NumericField(props) {
<Field
name={props.name}
id={props.name}
component="input"
type="number"
className="govuk-input govuk-input--width-20"
spellCheck="false"
@@ -456,13 +971,16 @@ export function NumericField(props) {
pattern="[0-9]*"
inputMode="numeric"
parse={Number}
validate={eval(validation)}
component={RenderTextfield}
/>
</div>
);
}
export function DecimalField(props) {
const { name, label } = props;
const { name, label, validation } = props;
const required = (value) => (value ? undefined : "Required");
return (
<div className="govuk-form-group">
@@ -472,7 +990,7 @@ export function DecimalField(props) {
<Field
name={props.name}
id={props.name}
component="input"
// component="input"
type="number"
className="govuk-input govuk-input--width-10"
spellCheck="false"
@@ -480,6 +998,8 @@ export function DecimalField(props) {
pattern="[0-9]*"
inputMode="numeric"
parse={Number}
validate={eval(validation)}
component={RenderTextfield}
/>
</div>
);
@@ -491,24 +1011,26 @@ export function ReadOnlyfield(props) {
const { name, label, value } = props;
//console.log(props.value.refno);
return (
<div className="govuk-form-group">
<label className="govuk-label " htmlFor={props.name}>
{FieldsTranslations(props.label)}
</label>
<input
type="text"
name={props.name}
id={props.name}
component={RenderCaseID}
value={value}
className="govuk-input govuk-input--width-20"
disabled
/>
</div>
<>
<div className="govuk-form-group">
<label className="govuk-label " htmlFor={props.name}>
{FieldsTranslations(props.label)}
</label>
<input
type="text"
name={props.name}
id={props.name}
component={RenderCaseID}
value={value}
className="govuk-input govuk-input--width-20"
disabled
/>
</div>
</>
);
}
const FieldsTranslations = (label) => {
export const FieldsTranslations = (label) => {
const router = useRouter();
const { locale } = router;
const { appealtypes } = router.query;