Skip to content

Commit

Permalink
[#46] Merge branch 'main' into feature/46-question-group-list
Browse files Browse the repository at this point in the history
  • Loading branch information
wayangalihpratama committed Jul 24, 2023
2 parents c57c78f + 1b8b3c7 commit fd55389
Show file tree
Hide file tree
Showing 23 changed files with 615 additions and 22 deletions.
4 changes: 2 additions & 2 deletions app/src/form/fields/TypeDate.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import { styles } from '../styles';
import { Input } from '@rneui/themed';
import DateTimePicker from '@react-native-community/datetimepicker';

const TypeDate = ({ onChange, values, keyform, id, name }) => {
const TypeDate = ({ onChange, values, keyform, id, name, required, requiredSign }) => {
const now = new Date();
const [showDatepicker, setShowDatePicker] = React.useState(false);

return (
<View>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
<Input
inputContainerStyle={styles.inputFieldContainer}
onPressIn={() => setShowDatePicker(true)}
Expand Down
7 changes: 5 additions & 2 deletions app/src/form/fields/TypeGeo.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { FieldLabel } from '../support';
import { styles } from '../styles';
import { loc } from '../../lib';

const TypeGeo = ({ onChange, values, keyform, id, name }) => {
const TypeGeo = ({ onChange, values, keyform, id, name, required, requiredSign }) => {
const [location, setLocation] = useState(null);
const [errorMsg, setErrorMsg] = useState(null);
const { latitude, longitude } = MapState.useState((s) => s);
Expand Down Expand Up @@ -56,6 +56,9 @@ const TypeGeo = ({ onChange, values, keyform, id, name }) => {
}, [errorMsg, location, latitude, longitude]);

useEffect(() => {
if (!onChange) {
return;
}
if ((text && !values?.[id]) || (values?.[id] && values[id] !== text)) {
onChange(id, text);
}
Expand All @@ -64,7 +67,7 @@ const TypeGeo = ({ onChange, values, keyform, id, name }) => {
const [latText, lngText] = text?.split('|');
return (
<View>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
<View style={styles.inputGeoContainer}>
{latText && lngText ? (
<View>
Expand Down
4 changes: 2 additions & 2 deletions app/src/form/fields/TypeImage.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { FieldLabel } from '../support';
// TODO: getImageBase64 (ARF)
// TODO: convertImageToBase64 (ARF)

const TypeImage = ({ onChange, keyform, id, name }) => {
const TypeImage = ({ onChange, keyform, id, name, required, requiredSign }) => {
const [showDialog, setShowDialog] = React.useState(false);
const [selectedImage, setSelectedImage] = React.useState(null);

Expand Down Expand Up @@ -101,7 +101,7 @@ const TypeImage = ({ onChange, keyform, id, name }) => {

return (
<View>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
<View style={styles.fieldImageContainer}>
{selectedImage != null ? (
<Image
Expand Down
14 changes: 12 additions & 2 deletions app/src/form/fields/TypeInput.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,20 @@ export const addSuffix = (addonAfter) => {
};
};

const TypeInput = ({ onChange, values, keyform, id, name, addonAfter, addonBefore }) => {
const TypeInput = ({
onChange,
values,
keyform,
id,
name,
addonAfter,
addonBefore,
required,
requiredSign,
}) => {
return (
<View>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
<Input
inputContainerStyle={styles.inputFieldContainer}
onChangeText={(val) => {
Expand Down
13 changes: 11 additions & 2 deletions app/src/form/fields/TypeMultipleOption.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,23 @@ import { styles } from '../styles';
import { CheckBox } from '@rneui/themed';
import { MultiSelect } from 'react-native-element-dropdown';

const TypeMultipleOption = ({ onChange, values, keyform, id, name, option = [] }) => {
const TypeMultipleOption = ({
onChange,
values,
keyform,
id,
name,
option = [],
required,
requiredSign,
}) => {
const isCheckBox = React.useMemo(() => {
return option.length <= 3;
}, [option]);

return (
<View style={styles.multipleOptionContainer}>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
{isCheckBox ? (
option.map((opt, opti) => (
<CheckBox
Expand Down
14 changes: 12 additions & 2 deletions app/src/form/fields/TypeNumber.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,20 @@ import { styles } from '../styles';
import { Input } from '@rneui/themed';
import { addPreffix, addSuffix } from './TypeInput';

const TypeNumber = ({ onChange, values, keyform, id, name, addonAfter, addonBefore }) => {
const TypeNumber = ({
onChange,
values,
keyform,
id,
name,
addonAfter,
addonBefore,
required,
requiredSign,
}) => {
return (
<View>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
<Input
inputContainerStyle={styles.inputFieldContainer}
keyboardType="numeric"
Expand Down
13 changes: 11 additions & 2 deletions app/src/form/fields/TypeOption.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,23 @@ import { styles } from '../styles';
import { CheckBox } from '@rneui/themed';
import { Dropdown } from 'react-native-element-dropdown';

const TypeOption = ({ onChange, values, keyform, id, name, option = [] }) => {
const TypeOption = ({
onChange,
values,
keyform,
id,
name,
option = [],
required,
requiredSign,
}) => {
const isRadioGroup = React.useMemo(() => {
return option.length <= 3;
}, [option]);

return (
<View style={styles.optionContainer}>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
{isRadioGroup ? (
option.map((opt, opti) => (
<CheckBox
Expand Down
4 changes: 2 additions & 2 deletions app/src/form/fields/TypeText.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import { FieldLabel } from '../support';
import { styles } from '../styles';
import { Input } from '@rneui/themed';

const TypeText = ({ onChange, values, keyform, id, name }) => {
const TypeText = ({ onChange, values, keyform, id, name, required, requiredSign }) => {
return (
<View>
<FieldLabel keyform={keyform} name={name} />
<FieldLabel keyform={keyform} name={name} requiredSign={required ? requiredSign : null} />
<Input
inputContainerStyle={styles.inputFieldContainer}
multiline={true}
Expand Down
30 changes: 30 additions & 0 deletions app/src/form/fields/__test__/TypeDate.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,34 @@ describe('TypeDate component', () => {
const dateField = getByTestId('type-date');
expect(dateField.props.value).toBe(initialValue.toLocaleDateString());
});

it('should not show required sign if required param is false and requiredSign is not defined', () => {
const wrapper = render(<TypeDate id="dateField" name="Date Field" required={false} />);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is false but requiredSign is defined', () => {
const wrapper = render(
<TypeDate id="dateField" name="Date Field" required={false} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is true and requiredSign defined', () => {
const wrapper = render(
<TypeDate id="dateField" name="Date Field" required={true} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeTruthy();
});

it('should show required sign with custom requiredSign', () => {
const wrapper = render(
<TypeDate id="dateField" name="Date Field" required={true} requiredSign="**" />,
);
const requiredIcon = wrapper.getByText('**');
expect(requiredIcon).toBeTruthy();
});
});
30 changes: 30 additions & 0 deletions app/src/form/fields/__test__/TypeGeo.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,34 @@ describe('TypeGeo', () => {
expect(navigation.navigate).toHaveBeenCalledWith('MapView', { latitude, longitude });
});
});

it('should not show required sign if required param is false and requiredSign is not defined', () => {
const wrapper = render(<TypeGeo id="geoField" name="Geolocation" required={false} />);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is false but requiredSign is defined', () => {
const wrapper = render(
<TypeGeo id="geoField" name="Geolocation" required={false} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is true and requiredSign defined', () => {
const wrapper = render(
<TypeGeo id="geoField" name="Geolocation" required={true} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeTruthy();
});

it('should show required sign with custom requiredSign', () => {
const wrapper = render(
<TypeGeo id="geoField" name="Geolocation" required={true} requiredSign="**" />,
);
const requiredIcon = wrapper.getByText('**');
expect(requiredIcon).toBeTruthy();
});
});
30 changes: 30 additions & 0 deletions app/src/form/fields/__test__/TypeImage.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,36 @@ describe('TypeImage component', () => {
fireEvent.press(getByTestId('btn-remove'));
expect(setSelectedImage).toHaveBeenCalledTimes(1);
});

it('should not show required sign if required param is false and requiredSign is not defined', () => {
const wrapper = render(<TypeImage id="imageField" name="Image" required={false} />);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is false but requiredSign is defined', () => {
const wrapper = render(
<TypeImage id="imageField" name="Image" required={false} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is true and requiredSign defined', () => {
const wrapper = render(
<TypeImage id="imageField" name="Image" required={true} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeTruthy();
});

it('should show required sign with custom requiredSign', () => {
const wrapper = render(
<TypeImage id="imageField" name="Image" required={true} requiredSign="**" />,
);
const requiredIcon = wrapper.getByText('**');
expect(requiredIcon).toBeTruthy();
});
});

describe('Request access external storage', () => {
Expand Down
30 changes: 30 additions & 0 deletions app/src/form/fields/__test__/TypeInput.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,36 @@ describe('TypeInput component', () => {
expect(inputElement.props.value).toBe(initialValue);
});

it('should not show required sign if required param is false and requiredSign is not defined', () => {
const wrapper = render(<TypeInput id="inputField" name="Field Name" required={false} />);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is false but requiredSign is defined', () => {
const wrapper = render(
<TypeInput id="inputField" name="Field Name" required={false} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is true and requiredSign defined', () => {
const wrapper = render(
<TypeInput id="inputField" name="Field Name" required={true} requiredSign="*" />,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeTruthy();
});

it('should show required sign with custom requiredSign', () => {
const wrapper = render(
<TypeInput id="inputField" name="Field Name" required={true} requiredSign="**" />,
);
const requiredIcon = wrapper.getByText('**');
expect(requiredIcon).toBeTruthy();
});

test.failing('should not show input preffix if addonBefore not defined', () => {
const wrapper = render(<TypeInput id="inputField" name="Field Label" />);

Expand Down
51 changes: 51 additions & 0 deletions app/src/form/fields/__test__/TypeMultipleOption.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,55 @@ describe('TypeMultipleOption', () => {
const multipleDropdown = getByTestId('type-multiple-option-dropdown');
expect(multipleDropdown).toBeDefined();
});

it('should not show required sign if required param is false and requiredSign is not defined', () => {
const wrapper = render(
<TypeMultipleOption
id="multipleOptionField"
name="Multiple Option Field Name"
required={false}
/>,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is false but requiredSign is defined', () => {
const wrapper = render(
<TypeMultipleOption
id="multipleOptionField"
name="Multiple Option Field Name"
required={false}
requiredSign="*"
/>,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeFalsy();
});

it('should not show required sign if required param is true and requiredSign defined', () => {
const wrapper = render(
<TypeMultipleOption
id="multipleOptionField"
name="Multiple Option Field Name"
required={true}
requiredSign="*"
/>,
);
const requiredIcon = wrapper.queryByTestId('field-required-icon');
expect(requiredIcon).toBeTruthy();
});

it('should show required sign with custom requiredSign', () => {
const wrapper = render(
<TypeMultipleOption
id="multipleOptionField"
name="Multiple Option Field Name"
required={true}
requiredSign="**"
/>,
);
const requiredIcon = wrapper.getByText('**');
expect(requiredIcon).toBeTruthy();
});
});
Loading

0 comments on commit fd55389

Please sign in to comment.