diff --git a/src/main/java/com/iemr/common/data/dynamic_from/FormField.java b/src/main/java/com/iemr/common/data/dynamic_from/FormField.java index 1b195db9..08534239 100644 --- a/src/main/java/com/iemr/common/data/dynamic_from/FormField.java +++ b/src/main/java/com/iemr/common/data/dynamic_from/FormField.java @@ -62,6 +62,9 @@ public class FormField { @Column(name = "created_at") private LocalDateTime createdAt = LocalDateTime.now(); + @Column(name = "option_key") + private String optionKey; + } diff --git a/src/main/java/com/iemr/common/data/dynamic_from/FormFieldOption.java b/src/main/java/com/iemr/common/data/dynamic_from/FormFieldOption.java new file mode 100644 index 00000000..8cfeb0de --- /dev/null +++ b/src/main/java/com/iemr/common/data/dynamic_from/FormFieldOption.java @@ -0,0 +1,34 @@ +package com.iemr.common.data.dynamic_from; + +import jakarta.persistence.*; +import lombok.Data; + +@Entity +@Table(name = "form_field_options") +@Data +public class FormFieldOption { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column(name = "option_key") + private String optionKey; + + @Column(name = "value") + private String value; + + @Column(name = "label_en") + private String labelEn; + + @Column(name = "label_hi") + private String labelHi; + + @Column(name = "label_as") + private String labelAs; + + @Column(name = "sort_order") + private Integer sortOrder; + + // getters/setters +} \ No newline at end of file diff --git a/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java b/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java index e41f8e80..dbf241ae 100644 --- a/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java +++ b/src/main/java/com/iemr/common/dto/dynamicForm/FieldResponseDTO.java @@ -20,7 +20,7 @@ public class FieldResponseDTO { private Integer sequence; private Boolean isEditable; private Integer stateCode; - private List options; + public List> options; private Map validation; private Map conditional; } \ No newline at end of file diff --git a/src/main/java/com/iemr/common/repository/dynamic_form/FormFieldOptionRepository.java b/src/main/java/com/iemr/common/repository/dynamic_form/FormFieldOptionRepository.java new file mode 100644 index 00000000..3f258ae4 --- /dev/null +++ b/src/main/java/com/iemr/common/repository/dynamic_form/FormFieldOptionRepository.java @@ -0,0 +1,14 @@ +package com.iemr.common.repository.dynamic_form; +import com.iemr.common.data.dynamic_from.FormFieldOption; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FormFieldOptionRepository + extends JpaRepository { + + List findByOptionKeyOrderBySortOrderAsc(String optionKey); + +} \ No newline at end of file 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 acbcb4e7..0bf1c2fe 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.FormFieldOption; import com.iemr.common.data.dynamic_from.FormModule; import com.iemr.common.data.translation.Translation; import com.iemr.common.data.users.UserServiceRole; import com.iemr.common.dto.dynamicForm.*; import com.iemr.common.repository.dynamic_form.FieldRepository; +import com.iemr.common.repository.dynamic_form.FormFieldOptionRepository; import com.iemr.common.repository.dynamic_form.FormRepository; import com.iemr.common.repository.dynamic_form.ModuleRepository; import com.iemr.common.repository.translation.TranslationRepo; @@ -43,6 +46,9 @@ public class FormMasterServiceImpl implements FormMasterService { @Autowired private JwtUtil jwtUtil; + @Autowired + private FormFieldOptionRepository formFieldOptionRepo ; + @Override public FormModule createModule(ModuleDTO dto) { FormModule module = new FormModule(); @@ -135,24 +141,40 @@ public FormResponseDTO getStructuredFormByFormId(String formId, String lang, Str Integer finalStateId = stateId; List fieldDtos = fields.stream().filter(formField -> (formField.getStateCode().equals(0) || formField.getStateCode().equals(finalStateId))) .map(field -> { - String labelKey = field.getFieldId(); // field label already contains label_key + String labelKey = field.getFieldId(); + + Translation label = translationRepo.findByLabelKeyAndIsActive(labelKey, true) + .orElse(null); - Translation t = translationRepo.findByLabelKeyAndIsActive(labelKey, true) + Translation placeHolder = translationRepo.findByLabelKeyAndIsActive("placeholder_"+labelKey, true) .orElse(null); - String translatedLabel = field.getLabel(); // fallback + String translatedLabel = field.getLabel(); + String translatedPlaceHolder = field.getPlaceholder(); - if (t != null) { + if (label != null) { if ("hi".equalsIgnoreCase(lang)) { - translatedLabel = t.getHindiTranslation(); + translatedLabel = label.getHindiTranslation(); } else if ("as".equalsIgnoreCase(lang)) { - translatedLabel = t.getAssameseTranslation(); + translatedLabel = label.getAssameseTranslation(); } else if ("en".equalsIgnoreCase(lang)) { - translatedLabel = t.getEnglish(); + translatedLabel = label.getEnglish(); } } + if (placeHolder != null) { + if ("hi".equalsIgnoreCase(lang)) { + translatedPlaceHolder= placeHolder.getHindiTranslation(); + } else if ("as".equalsIgnoreCase(lang)) { + translatedPlaceHolder = placeHolder.getAssameseTranslation(); + } else if ("en".equalsIgnoreCase(lang)) { + translatedPlaceHolder = placeHolder.getEnglish(); + + } + } + + FieldResponseDTO dto = new FieldResponseDTO(); dto.setId(field.getId()); dto.setIsEditable(field.getIsEditable()); @@ -165,27 +187,32 @@ public FormResponseDTO getStructuredFormByFormId(String formId, String lang, Str dto.setType(field.getType()); dto.setIsRequired(field.getIsRequired()); dto.setDefaultValue(field.getDefaultValue()); - dto.setPlaceholder(field.getPlaceholder()); + dto.setPlaceholder(translatedPlaceHolder); dto.setSequence(field.getSequence()); + try { - // Handle options - if (field.getOptions() != null && !field.getOptions().isBlank()) { - 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); + if (field.getOptionKey() != null && !field.getOptionKey().isBlank()) { + List dbOptions = formFieldOptionRepo + .findByOptionKeyOrderBySortOrderAsc(field.getOptionKey()); + + List> translatedOptions = dbOptions.stream() + .map(opt -> { + Map map = new LinkedHashMap<>(); + map.put("id", opt.getId()); + map.put("value", opt.getValue()); + if ("hi".equalsIgnoreCase(lang)) map.put("label", opt.getLabelHi()); + else if ("as".equalsIgnoreCase(lang)) map.put("label", opt.getLabelAs()); + else map.put("label", opt.getLabelEn()); + return map; + }) + .collect(Collectors.toList()); + + dto.setOptions(translatedOptions.isEmpty() ? null : translatedOptions); + } else { dto.setOptions(null); } - - // Handle validation if (field.getValidation() != null && !field.getValidation().isBlank()) { Map validation = objectMapper.readValue(field.getValidation(), new TypeReference<>() { }); @@ -194,7 +221,6 @@ public FormResponseDTO getStructuredFormByFormId(String formId, String lang, Str dto.setValidation(null); } - // Handle conditional if (field.getConditional() != null && !field.getConditional().isBlank()) { Map conditional = objectMapper.readValue(field.getConditional(), new TypeReference<>() { });