From 51b741df7745cc7701cbc2678504f66fd7e3d4a4 Mon Sep 17 00:00:00 2001 From: Harsh Date: Fri, 18 Jul 2025 14:45:28 +0530 Subject: [PATCH] Fixes 1528 we can create same subject type with same name --- src/adminApp/SubjectType/SubjectTypeCreate.js | 15 ++++++++++++++- src/adminApp/SubjectType/SubjectTypeEdit.js | 12 ++++++++++++ yarn.lock | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/adminApp/SubjectType/SubjectTypeCreate.js b/src/adminApp/SubjectType/SubjectTypeCreate.js index 8a8c00d4d..de94b0cf7 100644 --- a/src/adminApp/SubjectType/SubjectTypeCreate.js +++ b/src/adminApp/SubjectType/SubjectTypeCreate.js @@ -34,6 +34,7 @@ const SubjectTypeCreate = ({ organisationConfig }) => { const [locationTypes, setLocationsTypes] = useState([]); const [file, setFile] = React.useState(); const [removeFile, setRemoveFile] = React.useState(false); + const [subjectTypes, setSubjectTypes] = useState([]); // <-- Add state for all subject types const [{ rules, templates, templateFetchError }, rulesDispatch] = useReducer(MessageReducer, { rules: [], templates: [] @@ -49,11 +50,14 @@ const SubjectTypeCreate = ({ organisationConfig }) => { rulesDispatch({ type: "setRules", payload: rules }); }; - const consumeFormMappingResult = (formMap, forms) => { + // Modified to also get subjectTypes + const consumeFormMappingResult = (formMap, forms, subjectTypesList) => { setFormList(forms); setFormMappings(formMap); + if (subjectTypesList) setSubjectTypes(subjectTypesList); }; + // Pass 3rd arg to get subjectTypes useFormMappings(consumeFormMappingResult); useLocationType(types => setLocationsTypes(types)); @@ -68,7 +72,16 @@ const SubjectTypeCreate = ({ organisationConfig }) => { return; } + // Duplicate name check (case-insensitive) + const duplicate = subjectTypes.some(st => st.name && st.name.trim().toLowerCase() === subjectType.name.trim().toLowerCase()); + if (duplicate) { + setError("Subject type with this name already exists."); + setNameValidation(false); + return; + } + setNameValidation(false); + setError(""); if (!groupValidationError) { const [s3FileKey, error] = await uploadImage(subjectType.iconFileS3Key, file, MediaFolder.ICONS); diff --git a/src/adminApp/SubjectType/SubjectTypeEdit.js b/src/adminApp/SubjectType/SubjectTypeEdit.js index a9f8c5cf2..24ff52089 100644 --- a/src/adminApp/SubjectType/SubjectTypeEdit.js +++ b/src/adminApp/SubjectType/SubjectTypeEdit.js @@ -87,6 +87,18 @@ const SubjectTypeEdit = ({ organisationConfig, ...props }) => { return; } + // Duplicate name check (case-insensitive, exclude self) + const duplicate = + subjectTypes && + subjectTypes.some( + st => st.id !== subjectType.id && st.name && st.name.trim().toLowerCase() === subjectType.name.trim().toLowerCase() + ); + if (duplicate) { + setError("Subject type with this name already exists."); + setNameValidation(false); + return; + } + setNameValidation(false); if (!groupValidationError) { const [s3FileKey, error] = await uploadImage(subjectType.iconFileS3Key, file, MediaFolder.ICONS); diff --git a/yarn.lock b/yarn.lock index 5c30cebb7..d8b7eb8cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15292,4 +15292,4 @@ yauzl@^2.10.0: zen-observable@^0.8.6: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== \ No newline at end of file