Skip to content
Snippets Groups Projects
Commit 69a7e138 authored by Gabriel Silva Hermida's avatar Gabriel Silva Hermida
Browse files

Issue #19: Correção de problemas na tela de criação de formulários

parent 04ebf3a5
No related branches found
No related tags found
3 merge requests!58Version 1.1,!54Issue #53: Fix password info,!18Issue #19: Correção de problemas na tela de criação de formulários
...@@ -2,16 +2,13 @@ import React, { useEffect } from "react"; ...@@ -2,16 +2,13 @@ import React, { useEffect } from "react";
import { makeStyles } from "@material-ui/core/styles"; import { makeStyles } from "@material-ui/core/styles";
import Grid from "@material-ui/core/Grid"; import Grid from "@material-ui/core/Grid";
import Paper from "@material-ui/core/Paper"; import Paper from "@material-ui/core/Paper";
import TextField from "@material-ui/core/TextField";
import api from "../../api"; import api from "../../api";
import FieldFooterOptions from "./FieldFooterOptions"; import FieldFooterOptions from "./FieldFooterOptions";
import Select from "@material-ui/core/Select"; import Select from "@material-ui/core/Select";
import MenuItem from "@material-ui/core/MenuItem"; import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl"; import FormControl from "@material-ui/core/FormControl";
import InputLabel from "@material-ui/core/InputLabel"; import InputLabel from "@material-ui/core/InputLabel";
import InfoIcon from "@material-ui/icons/Info";
import { Draggable } from "react-beautiful-dnd"; import { Draggable } from "react-beautiful-dnd";
import Tooltip from "@material-ui/core/Tooltip";
import DefaultField from "./DefaultField"; import DefaultField from "./DefaultField";
/** CSS styles used on page components. */ /** CSS styles used on page components. */
...@@ -57,11 +54,6 @@ const useStyles = makeStyles((theme) => ({ ...@@ -57,11 +54,6 @@ const useStyles = makeStyles((theme) => ({
width: "80%", width: "80%",
}, },
}, },
tooltipAdjustment: {
["@media (max-width: 600px)"]: {
flexDirection: "column-reverse",
},
},
footerOptsAdjustment: { footerOptsAdjustment: {
["@media (min-width: 600px)"]: { ["@media (min-width: 600px)"]: {
marginBottom: "3%", marginBottom: "3%",
...@@ -71,27 +63,13 @@ const useStyles = makeStyles((theme) => ({ ...@@ -71,27 +63,13 @@ const useStyles = makeStyles((theme) => ({
/** Function that returns the component to select te subform to be used. */ /** Function that returns the component to select te subform to be used. */
function SubformSelect(props) { function SubformSelect(props) {
/** State to store the form being used. */
const [usedForm, setUsedForm] = React.useState({});
/** Style class. */ /** Style class. */
const classes = useStyles(); const classes = useStyles();
/** State to manage errors. */
const [error, setError] = React.useState(true);
/** Functions that handle the input changes to save it at the father component. */ /** Functions that handle the input changes to save it at the father component. */
const handleChange = (event) => { const handleChange = (event) => {
setUsedForm(props.array.filter((x) => x.id === event.target.value)); console.log(event.target);
props.setSubformId(event.target.value, props.idq); props.setSubformId(event.target.value, props.idq);
setError(false);
}; };
/** Initial error state setting. */
useEffect(() => {
if (
props.error.errorMsg.subformUsage ||
props.error.errorMsg.subformSelected
)
setError(true);
}, []);
return ( return (
<FormControl variant="outlined" className={classes.subformSelect}> <FormControl variant="outlined" className={classes.subformSelect}>
<InputLabel <InputLabel
...@@ -105,12 +83,11 @@ function SubformSelect(props) { ...@@ -105,12 +83,11 @@ function SubformSelect(props) {
<Select <Select
labelId="demo-simple-select-outlined-label" labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined" id="demo-simple-select-outlined"
value={usedForm.title} value={props.subformId}
renderValue={usedForm.title}
onChange={handleChange} onChange={handleChange}
label="Selecione um subformulário" label="Selecione um subformulário"
style={{ width: "100%" }} style={{ width: "100%" }}
error={error ? true : false} error={props.subformId ? false : true}
> >
{props.array.length > 0 ? ( {props.array.length > 0 ? (
props.array.map((form) => ( props.array.map((form) => (
...@@ -155,8 +132,8 @@ export default function FormFieldSubform(props) { ...@@ -155,8 +132,8 @@ export default function FormFieldSubform(props) {
{...provided.dragHandleProps} {...provided.dragHandleProps}
> >
<Grid container> <Grid container>
<Grid container item className={classes.tooltipAdjustment}> <Grid container item>
<Grid container item xs={11}> <Grid container item xs={12}>
<DefaultField <DefaultField
question={props.question} question={props.question}
description={props.description} description={props.description}
...@@ -166,21 +143,6 @@ export default function FormFieldSubform(props) { ...@@ -166,21 +143,6 @@ export default function FormFieldSubform(props) {
error={props.error} error={props.error}
/> />
</Grid> </Grid>
<Grid
container
item
xs={12}
sm={1}
className={classes.questionsGrid}
>
<Tooltip
// style={{ position: "absolute" }}
title="Por favor, reordene este campo antes de lhe atribuir valor"
aria-label="Por favor, reordene este campo antes de lhe atribuir valor"
>
<InfoIcon />
</Tooltip>
</Grid>
</Grid> </Grid>
<Grid item xs={12} sm={6} className={classes.questionsGrid}> <Grid item xs={12} sm={6} className={classes.questionsGrid}>
<SubformSelect <SubformSelect
...@@ -188,6 +150,8 @@ export default function FormFieldSubform(props) { ...@@ -188,6 +150,8 @@ export default function FormFieldSubform(props) {
setSubformId={props.setSubformId} setSubformId={props.setSubformId}
idq={props.idq} idq={props.idq}
error={props.error} error={props.error}
subformId={props.subformId}
subformId={props.subformId}
/> />
</Grid> </Grid>
<Grid item sm={2} xs={12} className={classes.errorGridSubform}> <Grid item sm={2} xs={12} className={classes.errorGridSubform}>
......
import React, { useEffect } from "react"; import React from "react";
import { makeStyles } from "@material-ui/core/styles"; import { makeStyles } from "@material-ui/core/styles";
import Grid from "@material-ui/core/Grid"; import Grid from "@material-ui/core/Grid";
import Paper from "@material-ui/core/Paper"; import Paper from "@material-ui/core/Paper";
...@@ -10,10 +10,10 @@ import Tooltip from "@material-ui/core/Tooltip"; ...@@ -10,10 +10,10 @@ import Tooltip from "@material-ui/core/Tooltip";
import AddCircleIcon from "@material-ui/icons/AddCircle"; import AddCircleIcon from "@material-ui/icons/AddCircle";
import FormControl from "@material-ui/core/FormControl"; import FormControl from "@material-ui/core/FormControl";
import InputLabel from "@material-ui/core/InputLabel"; import InputLabel from "@material-ui/core/InputLabel";
import InfoIcon from "@material-ui/icons/Info";
import { Draggable } from "react-beautiful-dnd"; import { Draggable } from "react-beautiful-dnd";
import FieldFooterOptions from "./FieldFooterOptions"; import FieldFooterOptions from "./FieldFooterOptions";
import DefaultField from "./DefaultField"; import DefaultField from "./DefaultField";
import CloseIcon from "@material-ui/icons/Close";
/** CSS styles used on page components. */ /** CSS styles used on page components. */
const useStyles = makeStyles((theme) => ({ const useStyles = makeStyles((theme) => ({
...@@ -43,40 +43,23 @@ const useStyles = makeStyles((theme) => ({ ...@@ -43,40 +43,23 @@ const useStyles = makeStyles((theme) => ({
row: { row: {
display: "flex", display: "flex",
flexDirection: "row", flexDirection: "row",
["@media (max-width:600px)"]: {
flexDirection: "column",
marginTop: "5%",
},
}, },
})); }));
/** Main function that returns the content of the option 'question'. */ /** Main function that returns the content of the option 'question'. */
function FormFieldText(props) { function FormFieldText(props) {
/** Style class. */ /** Style class. */
const classes = useStyles(); const classes = useStyles();
/** Representation of the possible 'extra' validations to be used. */ /** Representation of the possible 'extra' validations to be used.
* The types are equivalent to the backend.
*/
const validationOpts = [ const validationOpts = [
{ type: "minChar", name: "Mínimo de caracteres", value: "" }, { type: 3, name: "Mínimo de caracteres", value: "" },
{ type: "maxChar", name: "Máximo de caracteres", value: "" }, { type: 4, name: "Máximo de caracteres", value: "" },
]; ];
/** State to store the validation being used. */
const [usedValidation, setUsedValidation] = React.useState();
/** State to manage error properties. */
const [error, setError] = React.useState(true);
/** An specific handle change function that updates the type of the chosen validation. */
const handleChangeType = (event) => {
setUsedValidation(validationOpts[event.target.value]);
setError(false);
};
/** An specific handle change function that updates the value of the chosen validation. */
const handleChangeValue = (event) => {
setUsedValidation({
type: usedValidation.type,
name: usedValidation.name,
value: event.target.value,
});
};
/** useEffect being used as a handle change function to send data (the chosen type of validation and the value) to the father component. */
useEffect(() => {
if (usedValidation) {
props.setValidation(usedValidation, props.idq);
}
}, [usedValidation]);
return ( return (
<Draggable key={props.id} draggableId={props.id} index={props.idq}> <Draggable key={props.id} draggableId={props.id} index={props.idq}>
...@@ -113,7 +96,6 @@ function FormFieldText(props) { ...@@ -113,7 +96,6 @@ function FormFieldText(props) {
alignItems="flex-end" alignItems="flex-end"
xs={12} xs={12}
sm={4} sm={4}
className={classes.row}
> >
<FieldFooterOptions <FieldFooterOptions
deleteFromForm={props.deleteFromForm} deleteFromForm={props.deleteFromForm}
...@@ -136,46 +118,51 @@ function FormFieldText(props) { ...@@ -136,46 +118,51 @@ function FormFieldText(props) {
<Select <Select
labelId="demo-simple-select-outlined-label" labelId="demo-simple-select-outlined-label"
id="demo-simple-select-outlined" id="demo-simple-select-outlined"
onChange={handleChangeType} onChange={(event) =>
props.setValidationType(event.target.value, props.idq)
}
value={props.validationType}
label="Selecione uma validação" label="Selecione uma validação"
style={{ minWidth: "250px" }} style={{ minWidth: "250px" }}
error={error ? true : false} error={props.validationType ? false : true}
> >
{validationOpts.map((x, index) => ( {validationOpts.map((x) => (
<MenuItem key={index} value={index}> <MenuItem key={x.type} value={x.type}>
{x.name} {x.name}
</MenuItem> </MenuItem>
))} ))}
</Select> </Select>
</Grid> </Grid>
<Grid {props.validationType ? (
container <Grid item xs={12} sm={5} className={classes.questionsGrid}>
item
xs={12}
sm={1}
className={classes.questionsGrid}
>
<Tooltip
// style={{ position: "absolute" }}
title="Por favor, reordene este campo antes de lhe atribuir valor"
aria-label="Por favor, reordene este campo antes de lhe atribuir valor"
>
<InfoIcon />
</Tooltip>
</Grid>
{usedValidation ? (
<Grid item xs={12} sm={4} className={classes.questionsGrid}>
<TextField <TextField
style={{ width: "45%" }} style={{ width: "45%" }}
label="Quantidade" label="Quantidade"
value={usedValidation.value} value={props.validationValue}
onChange={handleChangeValue} onChange={(event) =>
props.setValidationValue(event.target.value, props.idq)
}
/> />
<Grid className={classes.errorGrid}> <Grid className={classes.errorGrid}>
{props.error.errorMsg.validation.value} {props.error.errorMsg.validation.value}
</Grid> </Grid>
</Grid> </Grid>
) : null} ) : null}
<Grid item xs={1}>
<Tooltip
title="Remover a validação"
aria-label="Remover a validação"
>
<IconButton
aria-label="remove validation"
onClick={() => {
props.removeValidation(props.idq);
}}
>
<CloseIcon />
</IconButton>
</Tooltip>
</Grid>
</FormControl> </FormControl>
) : ( ) : (
<Grid <Grid
......
...@@ -65,11 +65,10 @@ function setValidation(form) { ...@@ -65,11 +65,10 @@ function setValidation(form) {
arguments: [], arguments: [],
}); });
else if (form.type === "question" && form.validation.length > 1) { else if (form.type === "question" && form.validation.length > 1) {
if (form.validation[1].type === "maxChar") { val.push({
val.push({ type: 3, arguments: [form.validation[1].value] }); type: form.validation[1].type,
} else { arguments: [form.validation[1].value],
val.push({ type: 4, arguments: [form.validation[1].value] }); });
}
} else } else
val.push({ val.push({
type: 2, type: 2,
......
...@@ -82,7 +82,6 @@ export async function testSubformSchema(form, index) { ...@@ -82,7 +82,6 @@ export async function testSubformSchema(form, index) {
.validate(form) .validate(form)
.then((x) => { .then((x) => {
form[index].error.errorMsg.subformUsage = ""; form[index].error.errorMsg.subformUsage = "";
form[index].error.errorMsg.subformSelected = false;
}) })
.catch((err) => { .catch((err) => {
form[index].error.errorMsg.subformUsage = err.message; form[index].error.errorMsg.subformUsage = err.message;
...@@ -139,7 +138,7 @@ export function verifyError(form) { ...@@ -139,7 +138,7 @@ export function verifyError(form) {
} }
} }
if (x.type === "subForm") { if (x.type === "subForm") {
if (x.error.errorMsg.subformUsage || x.error.errorMsg.subformSelected) { if (x.error.errorMsg.subformUsage || !x.subformId) {
valid = false; valid = false;
return; return;
} }
......
...@@ -25,7 +25,6 @@ import SideMenu from "../components/fieldsCreateForm/SideMenu"; ...@@ -25,7 +25,6 @@ import SideMenu from "../components/fieldsCreateForm/SideMenu";
import api from "../api"; import api from "../api";
import Tooltip from "@material-ui/core/Tooltip"; import Tooltip from "@material-ui/core/Tooltip";
/** CSS styles used on page components */ /** CSS styles used on page components */
const useStyles = makeStyles((theme) => ({ const useStyles = makeStyles((theme) => ({
app: { app: {
...@@ -217,7 +216,6 @@ function CreateForm() { ...@@ -217,7 +216,6 @@ function CreateForm() {
question: "Este campo é obrigatório!", question: "Este campo é obrigatório!",
description: "", description: "",
subformUsage: "", subformUsage: "",
subformSelected: true,
}, },
}, },
}, },
...@@ -275,8 +273,8 @@ function CreateForm() { ...@@ -275,8 +273,8 @@ function CreateForm() {
} }
/** Function to update the title, used on FormFieldTitle. */ /** Function to update the title, used on FormFieldTitle. */
async function setTitleField(value) { async function setTitleField(value) {
await testQuestionTextSchema(form, value, 0);
form[0].title = value; form[0].title = value;
await testQuestionTextSchema(form, value, 0);
setForm([...form]); setForm([...form]);
} }
/** Function to store the selected subform Id on it's corresponding object. */ /** Function to store the selected subform Id on it's corresponding object. */
...@@ -285,10 +283,21 @@ function CreateForm() { ...@@ -285,10 +283,21 @@ function CreateForm() {
await testSubformSchema(form, index); await testSubformSchema(form, index);
setForm([...form]); setForm([...form]);
} }
/** Function used on FormFieldText to set the chosen validation, currently min and max char. */ /** Function used on FormFieldText to set the chosen validation type, currently min and max char. */
async function setValidation(value, index) { async function setValidationType(value, index) {
form[index].validation[1] = value; form[index].validation[1].type = value;
await testTextValidation(form, index, value.value);
setForm([...form]);
}
/** Function used on FormFieldText to set the value of the validation*/
async function setValidationValue(value, index) {
form[index].validation[1].value = value;
await testTextValidation(form, index, value);
setForm([...form]);
}
/** Function used on FormFieldText to remove the validaiton. */
function removeValidation(index) {
form[index].validation.splice(-1, 1);
setForm([...form]); setForm([...form]);
} }
/** The submit function. It's triggered when the submit button is pressed on the interface. */ /** The submit function. It's triggered when the submit button is pressed on the interface. */
...@@ -366,7 +375,15 @@ function CreateForm() { ...@@ -366,7 +375,15 @@ function CreateForm() {
error={x.error} error={x.error}
validation={x.validation} validation={x.validation}
addValidation={addValidation} addValidation={addValidation}
setValidation={setValidation} setValidationType={setValidationType}
setValidationValue={setValidationValue}
removeValidation={removeValidation}
validationValue={
x.validation[1] ? x.validation[1].value : null
}
validationType={
x.validation[1] ? x.validation[1].type : null
}
/> />
); );
else if (x.type === "select") else if (x.type === "select")
...@@ -441,6 +458,7 @@ function CreateForm() { ...@@ -441,6 +458,7 @@ function CreateForm() {
id={x.id} id={x.id}
error={x.error} error={x.error}
validToSend={validToSend} validToSend={validToSend}
subformId={x.subformId ? x.subformId : null}
/> />
); );
else if (x.type === "title") else if (x.type === "title")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment