From 5c72753e01f1fc027fe0275ec7eae6d0cd65fcb4 Mon Sep 17 00:00:00 2001 From: Saurav Mishra Date: Thu, 8 Jan 2026 12:40:03 +0530 Subject: [PATCH] implement translation in dynamic form --- .../dynamicForm/DynamicFormController.java | 7 +-- .../common/data/translation/Translation.java | 25 +++++++++++ .../translation/TranslationRepo.java | 13 ++++++ .../dynamicForm/FormMasterService.java | 2 +- .../dynamicForm/FormMasterServiceImpl.java | 43 ++++++++++++++++--- 5 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/iemr/common/data/translation/Translation.java create mode 100644 src/main/java/com/iemr/common/repository/translation/TranslationRepo.java diff --git a/src/main/java/com/iemr/common/controller/dynamicForm/DynamicFormController.java b/src/main/java/com/iemr/common/controller/dynamicForm/DynamicFormController.java index a5f72bbf..3960e260 100644 --- a/src/main/java/com/iemr/common/controller/dynamicForm/DynamicFormController.java +++ b/src/main/java/com/iemr/common/controller/dynamicForm/DynamicFormController.java @@ -83,14 +83,15 @@ public ResponseEntity> deleteField(@PathVariable Long fieldId) { } @GetMapping(value = "form/{formId}/fields") - public ResponseEntity> getStructuredForm(@PathVariable String formId) { + public ResponseEntity> getStructuredForm(@PathVariable String formId, @RequestParam(name = "lang", defaultValue = "en") String lang) { try { - Object result = formMasterService.getStructuredFormByFormId(formId); + Object result = formMasterService.getStructuredFormByFormId(formId,lang); return ResponseEntity.status(HttpStatus.OK) .body(ApiResponse.success("Form structure fetched successfully", HttpStatus.OK.value(), result)); } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(ApiResponse.error("Failed to fetch form structure", HttpStatus.INTERNAL_SERVER_ERROR.value(), null)); + .body(ApiResponse.error("Failed to fetch form structure:"+e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR.value(), e)); } } diff --git a/src/main/java/com/iemr/common/data/translation/Translation.java b/src/main/java/com/iemr/common/data/translation/Translation.java new file mode 100644 index 00000000..91d9bee8 --- /dev/null +++ b/src/main/java/com/iemr/common/data/translation/Translation.java @@ -0,0 +1,25 @@ +package com.iemr.common.data.translation; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Table(name = "m_translation") +@Data +public class Translation { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + @Column(name = "label_key") + private String labelKey; + @Column(name = "english") + private String english; + @Column(name = "hindi_translation") + private String hindiTranslation; + @Column(name = "assamese_translation") + private String assameseTranslation; + @Column(name = "is_active") + private Boolean isActive; +} \ No newline at end of file diff --git a/src/main/java/com/iemr/common/repository/translation/TranslationRepo.java b/src/main/java/com/iemr/common/repository/translation/TranslationRepo.java new file mode 100644 index 00000000..f6a5dcb0 --- /dev/null +++ b/src/main/java/com/iemr/common/repository/translation/TranslationRepo.java @@ -0,0 +1,13 @@ +package com.iemr.common.repository.translation; + +import com.iemr.common.data.translation.Translation; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +@Repository +public interface TranslationRepo extends JpaRepository { + + Optional findByLabelKeyAndIsActive(String labelKey, boolean isActive); + +} diff --git a/src/main/java/com/iemr/common/service/dynamicForm/FormMasterService.java b/src/main/java/com/iemr/common/service/dynamicForm/FormMasterService.java index c603cd65..6d22e59a 100644 --- a/src/main/java/com/iemr/common/service/dynamicForm/FormMasterService.java +++ b/src/main/java/com/iemr/common/service/dynamicForm/FormMasterService.java @@ -16,7 +16,7 @@ public interface FormMasterService { List createField(List dto); FormField updateField(FieldDTO dto); - FormResponseDTO getStructuredFormByFormId(String formId); + FormResponseDTO getStructuredFormByFormId(String formId,String lang); void deleteField(Long fieldId); } diff --git a/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java b/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java index 19864742..98d93dbe 100644 --- a/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java +++ b/src/main/java/com/iemr/common/service/dynamicForm/FormMasterServiceImpl.java @@ -1,14 +1,17 @@ package com.iemr.common.service.dynamicForm; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.iemr.common.data.dynamic_from.FormDefinition; import com.iemr.common.data.dynamic_from.FormField; import com.iemr.common.data.dynamic_from.FormModule; +import com.iemr.common.data.translation.Translation; import com.iemr.common.dto.dynamicForm.*; import com.iemr.common.repository.dynamic_form.FieldRepository; import com.iemr.common.repository.dynamic_form.FormRepository; import com.iemr.common.repository.dynamic_form.ModuleRepository; +import com.iemr.common.repository.translation.TranslationRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.type.TypeReference; @@ -27,6 +30,9 @@ public class FormMasterServiceImpl implements FormMasterService { @Autowired private FormRepository formRepo; @Autowired private FieldRepository fieldRepo; + @Autowired + private TranslationRepo translationRepo; + @Override public FormModule createModule(ModuleDTO dto) { FormModule module = new FormModule(); @@ -97,7 +103,7 @@ public FormField updateField(FieldDTO dto) { } @Override - public FormResponseDTO getStructuredFormByFormId(String formId) { + public FormResponseDTO getStructuredFormByFormId(String formId,String lang) { FormDefinition form = formRepo.findByFormId(formId) .orElseThrow(() -> new IllegalArgumentException("Invalid form ID")); @@ -106,13 +112,31 @@ public FormResponseDTO getStructuredFormByFormId(String formId) { List fieldDtos = fields.stream() .map(field -> { + String labelKey = field.getFieldId(); // field label already contains label_key + + Translation t = translationRepo.findByLabelKeyAndIsActive(labelKey, true) + .orElse(null); + + String translatedLabel = field.getLabel(); // fallback + + if (t != null) { + if ("hi".equalsIgnoreCase(lang)) { + translatedLabel = t.getHindiTranslation(); + } else if("as".equalsIgnoreCase(lang)){ + translatedLabel = t.getAssameseTranslation(); + }else if("en".equalsIgnoreCase(lang)){ + translatedLabel = t.getEnglish(); + + } + } + FieldResponseDTO dto = new FieldResponseDTO(); dto.setId(field.getId()); dto.setVisible(field.getIsVisible()); dto.setFormId(field.getForm().getFormId()); dto.setSectionTitle(field.getSectionTitle()); dto.setFieldId(field.getFieldId()); - dto.setLabel(field.getLabel()); + dto.setLabel(translatedLabel); dto.setType(field.getType()); dto.setIsRequired(field.getIsRequired()); dto.setDefaultValue(field.getDefaultValue()); @@ -122,8 +146,14 @@ public FormResponseDTO getStructuredFormByFormId(String formId) { try { // Handle options if (field.getOptions() != null && !field.getOptions().isBlank()) { - List options = objectMapper.readValue(field.getOptions(), new TypeReference<>() {}); - dto.setOptions(options.isEmpty() ? null : options); + JsonNode node = objectMapper.readTree(field.getOptions()); + List options = null; + if (node.isArray()) { + options = objectMapper.convertValue(node, new TypeReference<>() {}); + } else if (node.has("options")) { + options = objectMapper.convertValue(node.get("options"), new TypeReference<>() {}); + } + dto.setOptions(options == null || options.isEmpty() ? null : options); } else { dto.setOptions(null); } @@ -143,7 +173,8 @@ public FormResponseDTO getStructuredFormByFormId(String formId) { } else { dto.setConditional(null); } - } catch (JsonProcessingException e) { + } catch (Exception e) { + System.err.println("JSON Parsing Error in field: " + field.getFieldId()); throw new RuntimeException("Failed to parse JSON for field: " + field.getFieldId(), e); } @@ -155,7 +186,7 @@ public FormResponseDTO getStructuredFormByFormId(String formId) { GroupedFieldResponseDTO singleSection = new GroupedFieldResponseDTO(); - singleSection.setSectionTitle("HBNC Form Fields"); // your custom section title + singleSection.setSectionTitle(singleSection.getSectionTitle()); // your custom section title singleSection.setFields(fieldDtos); FormResponseDTO response = new FormResponseDTO();