All files / react-app/src/components/RHF/utils initializer.ts

100% Statements 42/42
100% Branches 21/21
100% Functions 8/8
100% Lines 39/39

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78        74x 5x 5x       74x 15x 22x   22x 2x 2x 2x     22x 7x 1x           6x     22x   1x   1x 1x   1x 1x 1x   1x 1x 1x   2x 2x   1x 1x   1x 1x       1x 1x           13x 13x     22x     74x 3x 6x 6x      
import { RHFOption, RHFSlotProps, FormGroup, FormSchema } from "shared-types/forms";
 
type GL = Record<string, unknown>;
 
export const formGroupInitializer = (parentId?: string) => (ACC: GL, FORM: FormGroup) => {
  FORM.slots.reduce(slotInitializer(parentId), ACC);
  return ACC;
};
 
export const slotInitializer =
  (parentId?: string) =>
  (ACC: GL, SLOT: RHFSlotProps): GL => {
    const adjustedName = `${parentId ?? ""}${SLOT.name}`;
 
    const optionReducer = (OPT: RHFOption) => {
      if (OPT.form) OPT.form.reduce(formGroupInitializer(parentId), ACC);
      if (OPT.slots) OPT.slots.reduce(slotInitializer(parentId), ACC);
      return ACC;
    };
 
    const fieldInitializer = (ACC1: GL, SLOTC: RHFSlotProps): GL => {
      if (SLOTC.rhf === "FieldArray") {
        return {
          ...ACC1,
          [SLOTC.name]: [SLOTC.fields?.reduce(fieldInitializer, {})],
        };
      }
 
      return { ...ACC1, ...slotInitializer()(ACC1, SLOTC) };
    };
 
    switch (SLOT.rhf) {
      case "TextDisplay":
        break;
      case "Switch":
        ACC[adjustedName] = false;
        break;
      case "Checkbox":
        SLOT.props?.options.forEach(optionReducer);
        ACC[adjustedName] = [];
        break;
      case "Radio":
        SLOT.props?.options.forEach(optionReducer);
        ACC[adjustedName] = "";
        break;
      case "FieldArray":
        ACC[adjustedName] = [SLOT.fields?.reduce(fieldInitializer, {})];
        break;
      case "WrappedGroup":
        ACC = { ...ACC, ...SLOT.fields?.reduce(fieldInitializer, {}) };
        break;
      case "Upload":
        ACC[adjustedName] = [];
        break;
      // If switching from undefined to a Date causes an error from RHF,
      // DatePickerProps in inputs.ts may need to be adjusted:
      case "DatePicker":
        ACC[adjustedName] = undefined;
        break;
      case "Input":
      case "Select":
      case "Multiselect":
      case "Textarea":
      default:
        ACC[adjustedName] = "";
        break;
    }
 
    return ACC;
  };
 
export const documentInitializer = (document: FormSchema) => {
  return document.sections.reduce((ACC, SEC) => {
    SEC.form.reduce(formGroupInitializer(`${document.formId}_${SEC.sectionId}_`), ACC);
    return ACC;
  }, {});
};