All files / Settings/EditableSettingsList/EditableSettingsListFieldArray EditableSettingsListFieldArray.js

86.66% Statements 13/15
66.66% Branches 4/6
83.33% Functions 5/6
85.71% Lines 12/14

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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121              27x                         4x       4x     4x         4x 4x                                       4x 4x                                         27x                   3x   4x                                     27x                            
import { useCallback, useMemo, useState } from 'react';
 
import PropTypes from 'prop-types';
import { Field } from 'react-final-form';
 
import { SettingField } from '../SettingField';
 
const EditableSettingsListField = ({
  allowEdit,
  fields,
  handleSave,
  index,
  intlKey,
  intlNS,
  labelOverrides,
  render,
  setting,
  settingData: passedSettingData,
}) => {
  // Handle editing or not at this level
  const [editing, setEditing] = useState(false);
  // This is really grim.
  // Set up whether this setting is submitting or not.
  // Submitting in the form level applies to ALL
  const [settingSubmitting, setSettingSubmitting] = useState(false);
 
 
  const settingData = useMemo(() => ({
    currentSetting: passedSettingData.settings[index],
    ...passedSettingData,
  }), [index, passedSettingData]);
 
  const DefaultField = useCallback(() => {
    return (
      <Field
        allowEdit={allowEdit}
        component={SettingField}
        data-testid={`editableSettingsListFieldArray[${index}]`}
        editing={editing}
        intlKey={intlKey}
        intlNS={intlNS}
        labelOverrides={labelOverrides}
        name={`${setting}.value`}
        onSave={handleSave}
        parse={v => v}
        setEditing={setEditing}
        setSettingSubmitting={setSettingSubmitting}
        settingData={settingData}
        settingSubmitting={settingSubmitting}
      />
    );
  }, [allowEdit, editing, handleSave, index, intlKey, intlNS, labelOverrides, setting, settingData, settingSubmitting]);
 
  Eif (!render || !(render instanceof Function)) {
    return <DefaultField key={`${setting}-default-field`} />;
  }
 
  return render({
    allowEdit,
    DefaultField,
    editing,
    fields,
    handleSave,
    index,
    intlKey,
    intlNS,
    setEditing,
    setSettingSubmitting,
    setting,
    settingData,
    SettingFieldComponent: SettingField,
    settingSubmitting
  });
};
 
const EditableSettingsListFieldArray = ({
  allowEdit: passedAllowEdit = true,
  fields: passedFields,
  intlKey: passedIntlKey,
  intlNS: passedIntlNS,
  labelOverrides = {},
  onSave,
  render,
  settingData
}) => {
  return (
    passedFields.map((setting, i) => {
      return (
        <EditableSettingsListField
          key={setting}
          allowEdit={passedAllowEdit}
          fields={passedFields}
          handleSave={onSave}
          index={i}
          intlKey={passedIntlKey}
          intlNS={passedIntlNS}
          labelOverrides={labelOverrides}
          render={render}
          setting={setting}
          settingData={settingData}
        />
      );
    })
  );
};
 
EditableSettingsListFieldArray.propTypes = {
  allowEdit: PropTypes.bool,
  fields: PropTypes.object,
  intlKey: PropTypes.string,
  intlNS: PropTypes.string,
  labelOverrides: PropTypes.object,
  onSave: PropTypes.func,
  data: PropTypes.shape({
    refdatavalues: PropTypes.arrayOf(PropTypes.object)
  }),
  initialValues: PropTypes.object
};
 
export default EditableSettingsListFieldArray;