diff --git a/forms-flow-web/src/apiManager/services/FormServices.js b/forms-flow-web/src/apiManager/services/FormServices.js index 080234798a..c04222a151 100644 --- a/forms-flow-web/src/apiManager/services/FormServices.js +++ b/forms-flow-web/src/apiManager/services/FormServices.js @@ -93,6 +93,17 @@ export const validateFormName = (title, name, id) => { return RequestService.httpGETRequest(url); }; +export const validatePathName = (path, name, id) => { + let url = `${API.VALIDATE_FORM_NAME}?path=${path}`; + if (name) { + url += `&name=${encodeURIComponent(name)}`; + } + if (id) { + url += `&id=${encodeURIComponent(id)}`; + } + return RequestService.httpGETRequest(url); +}; + export const getFormExport = (form_id) => { const exportFormUrl = replaceUrl(API.EXPORT_FORM, "",form_id); return RequestService.httpGETRequest(exportFormUrl); diff --git a/forms-flow-web/src/components/CustomComponents/MultiSelect.js b/forms-flow-web/src/components/CustomComponents/MultiSelect.js index dc14ead35d..7d495a58a2 100644 --- a/forms-flow-web/src/components/CustomComponents/MultiSelect.js +++ b/forms-flow-web/src/components/CustomComponents/MultiSelect.js @@ -73,7 +73,6 @@ const RoleSelector = ({ allRoles = [], selectedRoles = [], setSelectedRoles }) = onChange={handleRoleInputChange} onFocus={() => setIsDropdownOpen(true)} // Open dropdown when input is focused className="role-input" - placeholder="Type to filter roles" ref={inputRef} // Reference to input for outside click handling /> diff --git a/forms-flow-web/src/components/Form/EditForm/FormSettings.js b/forms-flow-web/src/components/Form/EditForm/FormSettings.js index c5f5412725..329811a483 100644 --- a/forms-flow-web/src/components/Form/EditForm/FormSettings.js +++ b/forms-flow-web/src/components/Form/EditForm/FormSettings.js @@ -21,6 +21,7 @@ import { useTranslation } from "react-i18next"; import { copyText } from "../../../apiManager/services/formatterService"; import _camelCase from "lodash/camelCase"; import _cloneDeep from "lodash/cloneDeep"; +import { validateFormName, validatePathName } from "../../../apiManager/services/FormServices"; //CONST VARIABLES const DESIGN = "DESIGN"; @@ -55,7 +56,10 @@ const FormSettings = forwardRef((props, ref) => { display: display, }); const [isAnonymous, setIsAnonymous] = useState(processListData.anonymous); - + const [errors, setErrors] = useState({ + name: "", + path: "", + }); const [formAccessCopy, setFormAccessCopy] = useState(_cloneDeep(formAccess)); const [submissionAccessCopy, setSubmissionAccessCopy] = useState( _cloneDeep(submissionAccess) @@ -81,21 +85,48 @@ const FormSettings = forwardRef((props, ref) => { }, }); + /* ------------------------- validating form name and path ------------------------ */ + + const validateField = async (field, value) => { + let errorMessage = ""; + if (!value.trim()) { + errorMessage = `${field} is required`; + } else { + try { + const response = field === 'name' ? await validateFormName(value) : await validatePathName(value); + const data = response?.data; + if (data && data.code === "FORM_EXISTS") { + errorMessage = data.message; + } + } catch (error) { + errorMessage = error.response?.data?.message || + `An error occurred while validating the ${field}.`; + console.error(`Error validating ${field}:`, errorMessage); + } + } + setErrors((prev) => ({ ...prev, [field]: errorMessage })); + }; + + + /* ---------------------- handling form details change ---------------------- */ + const handleFormDetailsChange = (e) => { const { name, value, type } = e.target; // if form name or path changed need to call validation api based on that let updatedValue = name === "path" ? _camelCase(value).toLowerCase() : value; + if (type === "checkbox") { - updatedValue = e.target.checked ? "wizard" : "form"; + setFormDetails((prev) => ({ ...prev, [name]: e.target.checked ? "wizard" : "form" })); + } else { + setFormDetails((prev) => ({ ...prev, [name]: updatedValue })); + if (name === "title" || name === "path") { + validateField(name === "title" ? 'name' : 'path', updatedValue); + } } - setFormDetails((prev) => ({ ...prev, [name]: updatedValue })); - - // if(name == "path" || name =="title"){ - // validationapi call - // } }; + /* ---------------------------- Fetch user roles ---------------------------- */ useEffect(() => { @@ -178,7 +209,9 @@ const FormSettings = forwardRef((props, ref) => { dataTestid="form-name" name="title" ariaLabel={t("Form Name")} - /> + onBlur={() => validateField('name', formDetails.title)} + /> + {errors.name &&
{errors.name}
} { className="url-edit" name="path" onChange={handleFormDetailsChange} - /> + onBlur={() => validateField('path', formDetails.path)} /> {copied ? : } + {errors.path &&
{errors.path}
} +