From 27333e941de95b0dd6208233185f044ca495de4b Mon Sep 17 00:00:00 2001 From: jasquat Date: Sat, 19 Nov 2022 19:44:21 -0500 Subject: [PATCH] added basic form builder. w/ burnettk --- src/interfaces.ts | 6 + src/routes/AdminRoutes.tsx | 5 + src/routes/JsonSchemaFormBuilder.tsx | 199 +++++++++++++++++++++++++++ src/routes/ReactFormEditor.tsx | 13 ++ 4 files changed, 223 insertions(+) create mode 100644 src/routes/JsonSchemaFormBuilder.tsx diff --git a/src/interfaces.ts b/src/interfaces.ts index aceca04..3f86d99 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -102,3 +102,9 @@ export interface PermissionCheckResult { export interface PermissionCheckResponseBody { results: PermissionCheckResult; } + +export interface FormField { + id: string; + title: string; + required: boolean; +} diff --git a/src/routes/AdminRoutes.tsx b/src/routes/AdminRoutes.tsx index 5649682..91ae7ab 100644 --- a/src/routes/AdminRoutes.tsx +++ b/src/routes/AdminRoutes.tsx @@ -21,6 +21,7 @@ import ErrorContext from '../contexts/ErrorContext'; import ProcessInstanceLogList from './ProcessInstanceLogList'; import MessageInstanceList from './MessageInstanceList'; import Configuration from './Configuration'; +import JsonSchemaFormBuilder from './JsonSchemaFormBuilder'; export default function AdminRoutes() { const location = useLocation(); @@ -108,6 +109,10 @@ export default function AdminRoutes() { } /> } /> } /> + } + /> ); } diff --git a/src/routes/JsonSchemaFormBuilder.tsx b/src/routes/JsonSchemaFormBuilder.tsx new file mode 100644 index 0000000..7f0cb67 --- /dev/null +++ b/src/routes/JsonSchemaFormBuilder.tsx @@ -0,0 +1,199 @@ +import { useEffect, useState } from 'react'; +// @ts-ignore +import { Button, ButtonSet, Form, Stack, TextInput } from '@carbon/react'; +import { useParams } from 'react-router-dom'; +import { FormField } from '../interfaces'; +import { modifyProcessModelPath, slugifyString } from '../helpers'; +import HttpService from '../services/HttpService'; + +export default function JsonSchemaFormBuilder() { + const params = useParams(); + const [formTitle, setFormTitle] = useState(''); + const [formDescription, setFormDescription] = useState(''); + const [formId, setFormId] = useState(''); + const [formFields, setFormFields] = useState([]); + const [showNewFormField, setShowNewFormField] = useState(false); + const [formIdHasBeenUpdatedByUser, setFormIdHasBeenUpdatedByUser] = + useState(false); + const [formFieldIdHasBeenUpdatedByUser, setFormFieldIdHasBeenUpdatedByUser] = + useState(false); + + const [formFieldId, setFormFieldId] = useState(''); + const [formFieldTitle, setFormFieldTitle] = useState(''); + + const modifiedProcessModelId = modifyProcessModelPath( + `${params.process_model_id}` + ); + + useEffect(() => {}, []); + + const renderFormJson = () => { + const formJson = { + title: formTitle, + description: formDescription, + properties: {}, + required: [], + }; + formFields.forEach((formField: FormField) => { + (formJson.properties as any)[formField.id] = { + type: 'string', + title: formField.title, + }; + }); + + return JSON.stringify(formJson, null, 2); + }; + + const renderFormUiJson = () => { + const uiOrder = formFields.map((formField: FormField) => { + return formField.id; + }); + return JSON.stringify({ 'ui:order': uiOrder }, null, 2); + }; + + const onFormFieldTitleChange = (newFormFieldTitle: string) => { + console.log('newFormFieldTitle', newFormFieldTitle); + console.log( + 'setFormFieldIdHasBeenUpdatedByUser', + formFieldIdHasBeenUpdatedByUser + ); + if (!formFieldIdHasBeenUpdatedByUser) { + setFormFieldId(slugifyString(newFormFieldTitle)); + } + setFormFieldTitle(newFormFieldTitle); + }; + + const onFormTitleChange = (newFormTitle: string) => { + if (!formIdHasBeenUpdatedByUser) { + setFormId(slugifyString(newFormTitle)); + } + setFormTitle(newFormTitle); + }; + + const createNewFormField = () => { + const newFormField: FormField = { + id: formFieldId, + title: formFieldTitle, + required: false, + }; + + setFormFieldIdHasBeenUpdatedByUser(false); + setShowNewFormField(false); + setFormFields([...formFields, newFormField]); + }; + + const newFormFieldComponent = () => { + if (showNewFormField) { + return ( + <> + { + onFormFieldTitleChange(event.srcElement.value); + }} + /> + { + setFormFieldIdHasBeenUpdatedByUser(true); + setFormFieldId(event.srcElement.value); + }} + /> + + + ); + } + return null; + }; + + const formFieldArea = () => { + if (formFields.length > 0) { + return formFields.map((formField: FormField) => { + return

Form Field: {formField.id}

; + }); + } + return null; + }; + + const handleSaveCallback = (result: any) => { + console.log('result', result); + }; + + const uploadFile = (file: File) => { + const url = `/process-models/${modifiedProcessModelId}/files`; + const httpMethod = 'POST'; + const formData = new FormData(); + formData.append('file', file); + formData.append('fileName', file.name); + + HttpService.makeCallToBackend({ + path: url, + successCallback: handleSaveCallback, + httpMethod, + postBody: formData, + }); + }; + + const saveFile = () => { + const formJsonFileName = `${formId}-schema.json`; + const formUiJsonFileName = `${formId}-uischema.json`; + + uploadFile(new File([renderFormJson()], formJsonFileName)); + uploadFile(new File([renderFormUiJson()], formUiJsonFileName)); + }; + + const jsonFormArea = () => { + return ( + <> + + { + onFormTitleChange(event.srcElement.value); + }} + /> + { + setFormIdHasBeenUpdatedByUser(true); + setFormId(event.srcElement.value); + }} + /> + { + setFormDescription(event.srcElement.value); + }} + /> + + {formFieldArea()} + {newFormFieldComponent()} + + ); + }; + + return <>{jsonFormArea()}; +} diff --git a/src/routes/ReactFormEditor.tsx b/src/routes/ReactFormEditor.tsx index 8abf56f..92d7256 100644 --- a/src/routes/ReactFormEditor.tsx +++ b/src/routes/ReactFormEditor.tsx @@ -175,6 +175,19 @@ export default function ReactFormEditor() { + {params.file_name ? null : ( + + )} {params.file_name ? (