From f2255eaec97147ab8dfb1d3771061abd02248d83 Mon Sep 17 00:00:00 2001 From: UNCANNY69 Date: Sun, 9 Feb 2025 12:33:01 +0530 Subject: [PATCH 1/6] Adding conformation modal for empty form --- src/empty-form-conformation-modal.tsx | 42 +++++++ src/empty-formconformation-modal.scss | 13 +++ src/provider/form-factory-helper.ts | 19 ++++ src/provider/form-factory-provider.tsx | 145 ++++++++++++++++--------- 4 files changed, 168 insertions(+), 51 deletions(-) create mode 100644 src/empty-form-conformation-modal.tsx create mode 100644 src/empty-formconformation-modal.scss diff --git a/src/empty-form-conformation-modal.tsx b/src/empty-form-conformation-modal.tsx new file mode 100644 index 00000000..ff6cec33 --- /dev/null +++ b/src/empty-form-conformation-modal.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import { ComposedModal, ModalHeader, ModalBody, ModalFooter, Button } from '@carbon/react'; +import { useTranslation } from 'react-i18next'; +import styles from './empty-formconformation-modal.scss' + +interface EmptyFormConfirmationModalProps { + onDiscard: () => void; + onConfirmation: () => void; + open: boolean; +} + +const IncompleteFormConfirmationModal: React.FC = ({ + onDiscard, + onConfirmation, + open, +}) => { + const { t } = useTranslation(); + + return ( + + + +

+ {t( + 'EmptyFormConfirmation', + 'All fields are Empty. Are you sure you want to submit the form?', + )} +

+
+ + + + +
+ ); +}; + +export default IncompleteFormConfirmationModal; diff --git a/src/empty-formconformation-modal.scss b/src/empty-formconformation-modal.scss new file mode 100644 index 00000000..0c0d6eb9 --- /dev/null +++ b/src/empty-formconformation-modal.scss @@ -0,0 +1,13 @@ +@use '@carbon/react/scss/colors'; + + +.customModal { + :global(.cds--modal-close) { + position: fixed; + } + + :global( .cds--btn--primary) { + background-color: #f4f4f4; + } + +} \ No newline at end of file diff --git a/src/provider/form-factory-helper.ts b/src/provider/form-factory-helper.ts index 7af8c60d..ba70be2d 100644 --- a/src/provider/form-factory-helper.ts +++ b/src/provider/form-factory-helper.ts @@ -5,6 +5,7 @@ import { evaluatePostSubmissionExpression } from '../utils/post-submission-actio import { type PostSubmissionActionMeta } from '../hooks/usePostSubmissionActions'; import { type TFunction } from 'react-i18next'; import { type SessionMode } from '../types'; +import { Console } from 'console'; export function validateForm(context: FormContextProps) { const { @@ -46,6 +47,24 @@ export function validateForm(context: FormContextProps) { return errors.length === 0; } +export function validateEmptyFields(context: FormContextProps){ + const { + formFields, + formFieldValidators, + patient, + sessionMode, + addInvalidField, + updateFormField, + methods: { getValues, trigger }, + } = context; + const values = getValues(); + return Object.values(values).every(value => + value === null || + value === undefined || + (Array.isArray(value) && value.length === 0) + ); +} + export async function processPostSubmissionActions( postSubmissionHandlers: PostSubmissionActionMeta[], submissionResults: OpenmrsResource[], diff --git a/src/provider/form-factory-provider.tsx b/src/provider/form-factory-provider.tsx index 019387f8..bc7215db 100644 --- a/src/provider/form-factory-provider.tsx +++ b/src/provider/form-factory-provider.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useCallback, useContext, useEffect, useRef } from 'react'; +import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react'; import { type FormField, type FormSchema, type SessionMode } from '../types'; import { EncounterFormProcessor } from '../processors/encounter/encounter-form-processor'; import { @@ -11,9 +11,10 @@ import { } from '@openmrs/esm-framework'; import { type FormProcessorConstructor } from '../processors/form-processor'; import { type FormContextProps } from './form-provider'; -import { processPostSubmissionActions, validateForm } from './form-factory-helper'; +import { processPostSubmissionActions, validateForm, validateEmptyFields } from './form-factory-helper'; import { useTranslation } from 'react-i18next'; import { usePostSubmissionActions } from '../hooks/usePostSubmissionActions'; +import IncompleteFormConfirmationModal from '../empty-form-conformation-modal'; interface FormFactoryProviderContextProps { patient: fhir.Patient; @@ -57,7 +58,7 @@ interface FormFactoryProviderProps { const FormFactoryProviderContext = createContext(undefined); -export const FormFactoryProvider: React.FC = ({ +export const FormFactoryProvider: React.FC = React.memo(({ patient, sessionMode, sessionDate, @@ -79,9 +80,72 @@ export const FormFactoryProvider: React.FC = ({ const layoutType = useLayoutType(); const { isSubmitting, setIsSubmitting, onSubmit, onError, handleClose } = formSubmissionProps; const postSubmissionHandlers = usePostSubmissionActions(formJson.postSubmissionActions); + const [isEmptyFormModalOpen, setIsEmptyFormModalOpen] = useState(false); const abortController = new AbortController(); + const handleFormSubmission = useCallback( + async (forms: FormContextProps[]) => { + try { + const results = await Promise.all( + forms.map((formContext) => formContext.processor.processSubmission(formContext, abortController)), + ); + + formSubmissionProps.setIsSubmitting(false); + + if (sessionMode === 'edit') { + showSnackbar({ + title: t('updatedRecord', 'Record updated'), + subtitle: t('updatedRecordDescription', 'The patient encounter was updated'), + kind: 'success', + isLowContrast: true, + }); + } else { + showSnackbar({ + title: t('submittedForm', 'Form submitted'), + subtitle: t('submittedFormDescription', 'Form submitted successfully'), + kind: 'success', + isLowContrast: true, + }); + } + + if (postSubmissionHandlers) { + await processPostSubmissionActions(postSubmissionHandlers, results, patient, sessionMode, t); + } + + hideFormCollapseToggle(); + if (onSubmit) { + onSubmit(results); + } else { + handleClose(); + } + } catch (errorObject: Error | ToastDescriptor | any) { + setIsSubmitting(false); + if (errorObject instanceof Error) { + showToast({ + title: t('errorProcessingFormSubmission', 'Error processing form submission'), + kind: 'error', + description: errorObject.message, + critical: true, + }); + } else { + showToast(errorObject); + } + } + }, + [ + abortController, + formSubmissionProps, + sessionMode, + t, + postSubmissionHandlers, + patient, + hideFormCollapseToggle, + onSubmit, + handleClose, + ], + ); + const registerForm = useCallback((formId: string, isSubForm: boolean, context: FormContextProps) => { if (isSubForm) { subForms.current[formId] = context; @@ -95,62 +159,34 @@ export const FormFactoryProvider: React.FC = ({ EncounterFormProcessor: EncounterFormProcessor, }); + const handleIncompleteFormConfirmation = useCallback(() => { + const forms = [rootForm.current, ...Object.values(subForms.current)]; + handleFormSubmission(forms); // To Use the reusable function + setIsEmptyFormModalOpen(false); + }, [handleFormSubmission]); + + const handleIncompleteFormDiscard = useCallback(() => { + setIsEmptyFormModalOpen(false); + setIsSubmitting(false); + }, [setIsSubmitting]); + useEffect(() => { if (isSubmitting) { - // TODO: find a dynamic way of managing the form processing order const forms = [rootForm.current, ...Object.values(subForms.current)]; - // validate all forms const isValid = forms.every((formContext) => validateForm(formContext)); + const isEmpty = forms.some((formContext) => validateEmptyFields(formContext)); + if (isValid) { - Promise.all(forms.map((formContext) => formContext.processor.processSubmission(formContext, abortController))) - .then(async (results) => { - formSubmissionProps.setIsSubmitting(false); - if (sessionMode === 'edit') { - showSnackbar({ - title: t('updatedRecord', 'Record updated'), - subtitle: t('updatedRecordDescription', 'The patient encounter was updated'), - kind: 'success', - isLowContrast: true, - }); - } else { - showSnackbar({ - title: t('submittedForm', 'Form submitted'), - subtitle: t('submittedFormDescription', 'Form submitted successfully'), - kind: 'success', - isLowContrast: true, - }); - } - if (postSubmissionHandlers) { - await processPostSubmissionActions(postSubmissionHandlers, results, patient, sessionMode, t); - } - hideFormCollapseToggle(); - if (onSubmit) { - onSubmit(results); - } else { - handleClose(); - } - }) - .catch((errorObject: Error | ToastDescriptor) => { - setIsSubmitting(false); - if (errorObject instanceof Error) { - showToast({ - title: t('errorProcessingFormSubmission', 'Error processing form submission'), - kind: 'error', - description: errorObject.message, - critical: true, - }); - } else { - showToast(errorObject); - } - }); + if (isEmpty) { + setIsEmptyFormModalOpen(true); + } else { + handleFormSubmission(forms); + } } else { setIsSubmitting(false); } } - return () => { - abortController.abort(); - }; - }, [isSubmitting]); + }, [isSubmitting, handleFormSubmission]); return ( = ({ handleConfirmQuestionDeletion, setIsFormDirty, }}> + {isEmptyFormModalOpen && ( + + )} {formProcessors.current && children} ); -}; +}); export const useFormFactory = () => { const context = useContext(FormFactoryProviderContext); From cf4b9e5c823e4d518236269547f606740ac6fc47 Mon Sep 17 00:00:00 2001 From: UNCANNY69 Date: Tue, 11 Feb 2025 03:06:41 +0530 Subject: [PATCH 2/6] Adding Empty Form conformation modal --- src/empty-form-conformation-modal.tsx | 42 ------ src/empty-formconformation-modal.scss | 13 -- src/form-engine.component.tsx | 3 + src/provider/form-factory-helper.ts | 3 +- src/provider/form-factory-provider.tsx | 174 +++++++++++-------------- 5 files changed, 79 insertions(+), 156 deletions(-) delete mode 100644 src/empty-form-conformation-modal.tsx delete mode 100644 src/empty-formconformation-modal.scss diff --git a/src/empty-form-conformation-modal.tsx b/src/empty-form-conformation-modal.tsx deleted file mode 100644 index ff6cec33..00000000 --- a/src/empty-form-conformation-modal.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import { ComposedModal, ModalHeader, ModalBody, ModalFooter, Button } from '@carbon/react'; -import { useTranslation } from 'react-i18next'; -import styles from './empty-formconformation-modal.scss' - -interface EmptyFormConfirmationModalProps { - onDiscard: () => void; - onConfirmation: () => void; - open: boolean; -} - -const IncompleteFormConfirmationModal: React.FC = ({ - onDiscard, - onConfirmation, - open, -}) => { - const { t } = useTranslation(); - - return ( - - - -

- {t( - 'EmptyFormConfirmation', - 'All fields are Empty. Are you sure you want to submit the form?', - )} -

-
- - - - -
- ); -}; - -export default IncompleteFormConfirmationModal; diff --git a/src/empty-formconformation-modal.scss b/src/empty-formconformation-modal.scss deleted file mode 100644 index 0c0d6eb9..00000000 --- a/src/empty-formconformation-modal.scss +++ /dev/null @@ -1,13 +0,0 @@ -@use '@carbon/react/scss/colors'; - - -.customModal { - :global(.cds--modal-close) { - position: fixed; - } - - :global( .cds--btn--primary) { - background-color: #f4f4f4; - } - -} \ No newline at end of file diff --git a/src/form-engine.component.tsx b/src/form-engine.component.tsx index 7ad4def6..6bf9e421 100644 --- a/src/form-engine.component.tsx +++ b/src/form-engine.component.tsx @@ -32,6 +32,7 @@ interface FormEngineProps { onCancel?: () => void; handleClose?: () => void; handleConfirmQuestionDeletion?: (question: Readonly) => Promise; + handleEmptyFormSubmission?: () => Promise; markFormAsDirty?: (isDirty: boolean) => void; } @@ -47,6 +48,7 @@ const FormEngine = ({ onCancel, handleClose, handleConfirmQuestionDeletion, + handleEmptyFormSubmission, markFormAsDirty, }: FormEngineProps) => { const { t } = useTranslation(); @@ -127,6 +129,7 @@ const FormEngine = ({ provider={session?.currentProvider} visit={visit} handleConfirmQuestionDeletion={handleConfirmQuestionDeletion} + handleEmptyFormSubmission={handleEmptyFormSubmission} isFormExpanded={isFormExpanded} formSubmissionProps={{ isSubmitting, diff --git a/src/provider/form-factory-helper.ts b/src/provider/form-factory-helper.ts index ba70be2d..c6733b90 100644 --- a/src/provider/form-factory-helper.ts +++ b/src/provider/form-factory-helper.ts @@ -5,7 +5,6 @@ import { evaluatePostSubmissionExpression } from '../utils/post-submission-actio import { type PostSubmissionActionMeta } from '../hooks/usePostSubmissionActions'; import { type TFunction } from 'react-i18next'; import { type SessionMode } from '../types'; -import { Console } from 'console'; export function validateForm(context: FormContextProps) { const { @@ -47,7 +46,7 @@ export function validateForm(context: FormContextProps) { return errors.length === 0; } -export function validateEmptyFields(context: FormContextProps){ +export function validateEmptyForm(context: FormContextProps){ const { formFields, formFieldValidators, diff --git a/src/provider/form-factory-provider.tsx b/src/provider/form-factory-provider.tsx index bc7215db..2b8d426e 100644 --- a/src/provider/form-factory-provider.tsx +++ b/src/provider/form-factory-provider.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react'; +import React, { createContext, useCallback, useContext, useEffect, useRef } from 'react'; import { type FormField, type FormSchema, type SessionMode } from '../types'; import { EncounterFormProcessor } from '../processors/encounter/encounter-form-processor'; import { @@ -11,10 +11,9 @@ import { } from '@openmrs/esm-framework'; import { type FormProcessorConstructor } from '../processors/form-processor'; import { type FormContextProps } from './form-provider'; -import { processPostSubmissionActions, validateForm, validateEmptyFields } from './form-factory-helper'; +import { processPostSubmissionActions, validateForm, validateEmptyForm } from './form-factory-helper'; import { useTranslation } from 'react-i18next'; import { usePostSubmissionActions } from '../hooks/usePostSubmissionActions'; -import IncompleteFormConfirmationModal from '../empty-form-conformation-modal'; interface FormFactoryProviderContextProps { patient: fhir.Patient; @@ -53,12 +52,13 @@ interface FormFactoryProviderProps { }; hideFormCollapseToggle: () => void; handleConfirmQuestionDeletion?: (question: Readonly) => Promise; + handleEmptyFormSubmission?: () => Promise; setIsFormDirty: (isFormDirty: boolean) => void; } const FormFactoryProviderContext = createContext(undefined); -export const FormFactoryProvider: React.FC = React.memo(({ +export const FormFactoryProvider: React.FC = ({ patient, sessionMode, sessionDate, @@ -71,6 +71,7 @@ export const FormFactoryProvider: React.FC = React.mem children, formSubmissionProps, hideFormCollapseToggle, + handleEmptyFormSubmission, handleConfirmQuestionDeletion, setIsFormDirty, }) => { @@ -80,72 +81,9 @@ export const FormFactoryProvider: React.FC = React.mem const layoutType = useLayoutType(); const { isSubmitting, setIsSubmitting, onSubmit, onError, handleClose } = formSubmissionProps; const postSubmissionHandlers = usePostSubmissionActions(formJson.postSubmissionActions); - const [isEmptyFormModalOpen, setIsEmptyFormModalOpen] = useState(false); const abortController = new AbortController(); - const handleFormSubmission = useCallback( - async (forms: FormContextProps[]) => { - try { - const results = await Promise.all( - forms.map((formContext) => formContext.processor.processSubmission(formContext, abortController)), - ); - - formSubmissionProps.setIsSubmitting(false); - - if (sessionMode === 'edit') { - showSnackbar({ - title: t('updatedRecord', 'Record updated'), - subtitle: t('updatedRecordDescription', 'The patient encounter was updated'), - kind: 'success', - isLowContrast: true, - }); - } else { - showSnackbar({ - title: t('submittedForm', 'Form submitted'), - subtitle: t('submittedFormDescription', 'Form submitted successfully'), - kind: 'success', - isLowContrast: true, - }); - } - - if (postSubmissionHandlers) { - await processPostSubmissionActions(postSubmissionHandlers, results, patient, sessionMode, t); - } - - hideFormCollapseToggle(); - if (onSubmit) { - onSubmit(results); - } else { - handleClose(); - } - } catch (errorObject: Error | ToastDescriptor | any) { - setIsSubmitting(false); - if (errorObject instanceof Error) { - showToast({ - title: t('errorProcessingFormSubmission', 'Error processing form submission'), - kind: 'error', - description: errorObject.message, - critical: true, - }); - } else { - showToast(errorObject); - } - } - }, - [ - abortController, - formSubmissionProps, - sessionMode, - t, - postSubmissionHandlers, - patient, - hideFormCollapseToggle, - onSubmit, - handleClose, - ], - ); - const registerForm = useCallback((formId: string, isSubForm: boolean, context: FormContextProps) => { if (isSubForm) { subForms.current[formId] = context; @@ -159,34 +97,79 @@ export const FormFactoryProvider: React.FC = React.mem EncounterFormProcessor: EncounterFormProcessor, }); - const handleIncompleteFormConfirmation = useCallback(() => { - const forms = [rootForm.current, ...Object.values(subForms.current)]; - handleFormSubmission(forms); // To Use the reusable function - setIsEmptyFormModalOpen(false); - }, [handleFormSubmission]); - - const handleIncompleteFormDiscard = useCallback(() => { - setIsEmptyFormModalOpen(false); - setIsSubmitting(false); - }, [setIsSubmitting]); - useEffect(() => { - if (isSubmitting) { - const forms = [rootForm.current, ...Object.values(subForms.current)]; - const isValid = forms.every((formContext) => validateForm(formContext)); - const isEmpty = forms.some((formContext) => validateEmptyFields(formContext)); - - if (isValid) { + const handleFormSubmission = async () => { + if (isSubmitting) { + const forms = [rootForm.current, ...Object.values(subForms.current)]; + // Check if the form is empty + const isEmpty = forms.every((formContext) => validateEmptyForm(formContext)); + // Validate all forms + const isValid = forms.every((formContext) => validateForm(formContext)); + if (isEmpty) { - setIsEmptyFormModalOpen(true); + if (handleEmptyFormSubmission && typeof handleEmptyFormSubmission === 'function') { + try { + await handleEmptyFormSubmission(); + } catch (error) { + setIsSubmitting(false); + } + } + } + + if (isValid) { + try { + const results = await Promise.all( + forms.map((formContext) => formContext.processor.processSubmission(formContext, abortController)) + ); + formSubmissionProps.setIsSubmitting(false); + if (sessionMode === 'edit') { + showSnackbar({ + title: t('updatedRecord', 'Record updated'), + subtitle: t('updatedRecordDescription', 'The patient encounter was updated'), + kind: 'success', + isLowContrast: true, + }); + } else { + showSnackbar({ + title: t('submittedForm', 'Form submitted'), + subtitle: t('submittedFormDescription', 'Form submitted successfully'), + kind: 'success', + isLowContrast: true, + }); + } + if (postSubmissionHandlers) { + await processPostSubmissionActions(postSubmissionHandlers, results, patient, sessionMode, t); + } + hideFormCollapseToggle(); + if (onSubmit) { + onSubmit(results); + } else { + handleClose(); + } + } catch (errorObject) { + setIsSubmitting(false); + if (errorObject instanceof Error) { + showToast({ + title: t('errorProcessingFormSubmission', 'Error processing form submission'), + kind: 'error', + description: errorObject.message, + critical: true, + }); + } else { + showToast(errorObject); + } + } } else { - handleFormSubmission(forms); + console.log("Helll") + setIsSubmitting(false); } - } else { - setIsSubmitting(false); } - } - }, [isSubmitting, handleFormSubmission]); + }; + handleFormSubmission(); + return () => { + abortController.abort(); + }; + }, [isSubmitting]); return ( = React.mem handleConfirmQuestionDeletion, setIsFormDirty, }}> - {isEmptyFormModalOpen && ( - - )} {formProcessors.current && children} ); -}); +}; export const useFormFactory = () => { const context = useContext(FormFactoryProviderContext); @@ -224,4 +200,4 @@ export const useFormFactory = () => { throw new Error('useFormFactoryContext must be used within a FormFactoryProvider'); } return context; -}; +}; \ No newline at end of file From 02903419215aca91e57f5538616249f383e904a8 Mon Sep 17 00:00:00 2001 From: UNCANNY69 Date: Tue, 11 Feb 2025 23:07:09 +0530 Subject: [PATCH 3/6] Refactored the modal --- src/form-engine.component.tsx | 1 + src/provider/form-factory-provider.tsx | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/form-engine.component.tsx b/src/form-engine.component.tsx index 6bf9e421..8bf4e576 100644 --- a/src/form-engine.component.tsx +++ b/src/form-engine.component.tsx @@ -130,6 +130,7 @@ const FormEngine = ({ visit={visit} handleConfirmQuestionDeletion={handleConfirmQuestionDeletion} handleEmptyFormSubmission={handleEmptyFormSubmission} + handleDiscardForm={handleClose} isFormExpanded={isFormExpanded} formSubmissionProps={{ isSubmitting, diff --git a/src/provider/form-factory-provider.tsx b/src/provider/form-factory-provider.tsx index 2b8d426e..3c4aaa07 100644 --- a/src/provider/form-factory-provider.tsx +++ b/src/provider/form-factory-provider.tsx @@ -51,6 +51,7 @@ interface FormFactoryProviderProps { handleClose: () => void; }; hideFormCollapseToggle: () => void; + handleDiscardForm: () => void; handleConfirmQuestionDeletion?: (question: Readonly) => Promise; handleEmptyFormSubmission?: () => Promise; setIsFormDirty: (isFormDirty: boolean) => void; @@ -71,6 +72,7 @@ export const FormFactoryProvider: React.FC = ({ children, formSubmissionProps, hideFormCollapseToggle, + handleDiscardForm, handleEmptyFormSubmission, handleConfirmQuestionDeletion, setIsFormDirty, @@ -110,8 +112,10 @@ export const FormFactoryProvider: React.FC = ({ if (handleEmptyFormSubmission && typeof handleEmptyFormSubmission === 'function') { try { await handleEmptyFormSubmission(); + handleDiscardForm() + return setIsSubmitting(false) } catch (error) { - setIsSubmitting(false); + return setIsSubmitting(false); } } } From 8e6a800292db46e22d70f108a2210ea8c5d18fa8 Mon Sep 17 00:00:00 2001 From: UNCANNY69 Date: Wed, 12 Feb 2025 21:16:26 +0530 Subject: [PATCH 4/6] Making requested changes --- src/provider/form-factory-provider.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/provider/form-factory-provider.tsx b/src/provider/form-factory-provider.tsx index 3c4aaa07..6aeb0ac9 100644 --- a/src/provider/form-factory-provider.tsx +++ b/src/provider/form-factory-provider.tsx @@ -103,12 +103,12 @@ export const FormFactoryProvider: React.FC = ({ const handleFormSubmission = async () => { if (isSubmitting) { const forms = [rootForm.current, ...Object.values(subForms.current)]; - // Check if the form is empty - const isEmpty = forms.every((formContext) => validateEmptyForm(formContext)); // Validate all forms const isValid = forms.every((formContext) => validateForm(formContext)); + // Check if the form is empty + const isEmpty = forms.every((formContext) => validateEmptyForm(formContext)); - if (isEmpty) { + if (isEmpty && isValid) { if (handleEmptyFormSubmission && typeof handleEmptyFormSubmission === 'function') { try { await handleEmptyFormSubmission(); @@ -164,7 +164,6 @@ export const FormFactoryProvider: React.FC = ({ } } } else { - console.log("Helll") setIsSubmitting(false); } } From bbb4d15015a98c94589493081755bca59e70d5aa Mon Sep 17 00:00:00 2001 From: ganeshdevisetti Date: Sun, 20 Apr 2025 18:07:58 +0530 Subject: [PATCH 5/6] Changes according to the comments --- src/form-engine.component.tsx | 6 ++---- src/provider/form-factory-provider.tsx | 7 ++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/form-engine.component.tsx b/src/form-engine.component.tsx index 0b56e102..632846ba 100644 --- a/src/form-engine.component.tsx +++ b/src/form-engine.component.tsx @@ -130,14 +130,12 @@ const FormEngine = ({ visit={visit} handleConfirmQuestionDeletion={handleConfirmQuestionDeletion} handleEmptyFormSubmission={handleEmptyFormSubmission} - handleDiscardForm={handleClose} isFormExpanded={isFormExpanded} formSubmissionProps={{ isSubmitting, setIsSubmitting, - onSubmit, - onError: () => {}, - handleClose: () => {}, + onSubmit, + handleClose: handleClose, }} hideFormCollapseToggle={hideFormCollapseToggle} setIsFormDirty={setIsFormDirty}> diff --git a/src/provider/form-factory-provider.tsx b/src/provider/form-factory-provider.tsx index 6aeb0ac9..bcefd294 100644 --- a/src/provider/form-factory-provider.tsx +++ b/src/provider/form-factory-provider.tsx @@ -47,11 +47,9 @@ interface FormFactoryProviderProps { isSubmitting: boolean; setIsSubmitting: (isSubmitting: boolean) => void; onSubmit: (data: any) => void; - onError: (error: any) => void; handleClose: () => void; }; hideFormCollapseToggle: () => void; - handleDiscardForm: () => void; handleConfirmQuestionDeletion?: (question: Readonly) => Promise; handleEmptyFormSubmission?: () => Promise; setIsFormDirty: (isFormDirty: boolean) => void; @@ -72,7 +70,6 @@ export const FormFactoryProvider: React.FC = ({ children, formSubmissionProps, hideFormCollapseToggle, - handleDiscardForm, handleEmptyFormSubmission, handleConfirmQuestionDeletion, setIsFormDirty, @@ -81,7 +78,7 @@ export const FormFactoryProvider: React.FC = ({ const rootForm = useRef(); const subForms = useRef>({}); const layoutType = useLayoutType(); - const { isSubmitting, setIsSubmitting, onSubmit, onError, handleClose } = formSubmissionProps; + const { isSubmitting, setIsSubmitting, onSubmit, handleClose } = formSubmissionProps; const postSubmissionHandlers = usePostSubmissionActions(formJson.postSubmissionActions); const abortController = new AbortController(); @@ -112,7 +109,7 @@ export const FormFactoryProvider: React.FC = ({ if (handleEmptyFormSubmission && typeof handleEmptyFormSubmission === 'function') { try { await handleEmptyFormSubmission(); - handleDiscardForm() + handleClose() return setIsSubmitting(false) } catch (error) { return setIsSubmitting(false); From 19470098d8de7b0e95580640630527256cd53a7f Mon Sep 17 00:00:00 2001 From: ganeshdevisetti Date: Mon, 21 Apr 2025 21:16:45 +0530 Subject: [PATCH 6/6] Modification to the vvalidate function --- src/provider/form-factory-helper.ts | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/provider/form-factory-helper.ts b/src/provider/form-factory-helper.ts index c6733b90..2c336ffc 100644 --- a/src/provider/form-factory-helper.ts +++ b/src/provider/form-factory-helper.ts @@ -46,22 +46,9 @@ export function validateForm(context: FormContextProps) { return errors.length === 0; } -export function validateEmptyForm(context: FormContextProps){ - const { - formFields, - formFieldValidators, - patient, - sessionMode, - addInvalidField, - updateFormField, - methods: { getValues, trigger }, - } = context; - const values = getValues(); - return Object.values(values).every(value => - value === null || - value === undefined || - (Array.isArray(value) && value.length === 0) - ); +export function validateEmptyForm(context: FormContextProps) { + const { methods: { formState: { dirtyFields } } } = context; + return Object.keys(dirtyFields).length === 0; } export async function processPostSubmissionActions(