aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordan <[email protected]>2023-08-31 11:57:33 -0400
committerdan <[email protected]>2023-08-31 11:57:33 -0400
commit016726b12fe4deb3b0beef24d5aefa29e35dfb1e (patch)
treed694e5ccfa208f533d814a75c45977ff1fa51ad9
parent25acd95886175d13d1aa9eb5cc333a97d11d3f2c (diff)
downloaddraggable-form-demo-016726b12fe4deb3b0beef24d5aefa29e35dfb1e.tar.gz
draggable-form-demo-016726b12fe4deb3b0beef24d5aefa29e35dfb1e.tar.bz2
draggable-form-demo-016726b12fe4deb3b0beef24d5aefa29e35dfb1e.zip
fix: editing label content should not cause fields to disappear
-rw-r--r--src/components/FormBuilder/index.js67
1 files changed, 36 insertions, 31 deletions
diff --git a/src/components/FormBuilder/index.js b/src/components/FormBuilder/index.js
index b9f0389..8a13bf0 100644
--- a/src/components/FormBuilder/index.js
+++ b/src/components/FormBuilder/index.js
@@ -28,25 +28,23 @@ export default function FormBuilder() {
const availableWidgets = {
label: {
name: "Label",
- element: (props) => (
+ element: ({ id, name, setName }) => (
<TextField
- id="outlined-basic"
+ id={id}
variant="standard"
- value={props?.name}
- onChange={(e) =>
- props?.setFormField({ ...props, name: e.target.value })
- }
+ value={name}
+ onChange={(e) => setName(e.target.value)}
fullWidth
/>
),
- finalElement: (props) => <div>{props?.id}</div>,
+ finalElement: ({ id }) => <div>{id}</div>,
},
number: {
name: "Number",
- element: (props) => (
+ element: ({ id }) => (
<TextField
- id="outlined-basic"
- label={props?.id ? `example field ${props.id}` : "Outlined"}
+ id={id}
+ label={id ? `example field ${id}` : "Outlined"}
variant="outlined"
type={"number"}
fullWidth
@@ -55,10 +53,10 @@ const availableWidgets = {
},
text: {
name: "Text",
- element: (props) => (
+ element: ({ id }) => (
<TextField
- id="outlined-basic"
- label={props?.id ? `example field ${props.id}` : "Outlined"}
+ id={id}
+ label={id ? `example field ${id}` : "Outlined"}
variant="outlined"
fullWidth
/>
@@ -66,10 +64,10 @@ const availableWidgets = {
},
multiline: {
name: "Multiline",
- element: (props) => (
+ element: ({ id }) => (
<TextField
- id="outlined-textarea"
- label={props?.id ? `example field ${props.id}` : "Multiline"}
+ id={id}
+ label={id ? `example field ${id}` : "Multiline"}
placeholder="Placeholder"
multiline
minRows={4}
@@ -127,7 +125,7 @@ function WidgetCard({ name, element, type, finalElement }) {
<CardHeader title={name} />
<CardContent>
<div style={disabledFieldOverlay}>
- {finalElement ? finalElement() : element()}
+ {finalElement ? finalElement({}) : element({})}
</div>
</CardContent>
</div>
@@ -137,35 +135,42 @@ function WidgetCard({ name, element, type, finalElement }) {
}
}
-function FormField(props) {
- if (!props?.type) {
- console.log("formfield render failed", props);
+function FormField({ formField, setFormField, deleteFormField }) {
+ const { id, type, name } = formField;
+
+ function setName(name) {
+ setFormField({ ...formField, name });
+ }
+
+ if (!type) {
return;
}
- const { element: Element } = availableWidgets[props?.type];
+ const { element: Element } = availableWidgets[type];
const dragHandleRef = useRef();
const [target, setTarget] = useState();
return (
<Stack
direction={"row"}
- sx={{ width: "100%", cursor: "grab" }}
+ sx={{ width: "100%" }}
alignItems={"center"}
justifyContent={"space-between"}
draggable
- onMouseDown={(e) => setTarget(e.target)}
+ onMouseDown={(e) => {
+ setTarget(e.target);
+ }}
onDragStart={(e) => {
if (dragHandleRef.current.contains(target)) {
- e.dataTransfer.setData("application/formwidgetid", props?.id);
+ e.dataTransfer.setData("application/formwidgetid", id);
} else {
e.preventDefault();
}
}}
>
- <span ref={dragHandleRef}>
+ <span ref={dragHandleRef} style={{ cursor: "grab" }}>
<DragIndicator />
</span>
- <Element {...props} />
- <IconButton onClick={() => props?.deleteFormField()}>
+ <Element id={id} name={name} setName={setName} type={type} />
+ <IconButton onClick={deleteFormField}>
<Clear />
</IconButton>
</Stack>
@@ -271,12 +276,12 @@ function Form({ initialForm, editable }) {
index={-1}
/>
)}
- {form?.fields?.map((props, i) => (
- <Grouping key={props?.id}>
+ {form?.fields?.map((formField, i) => (
+ <Grouping key={formField.id}>
<FormField
setFormField={(field) => updateFormField(field)}
- deleteFormField={() => deleteFormField(props.id)}
- {...props}
+ deleteFormField={() => deleteFormField(formField.id)}
+ formField={formField}
/>
{editable && (
<DropZone