• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

akvo / nmis-mobile / 6082918337

05 Sep 2023 09:43AM UTC coverage: 87.81% (+0.3%) from 87.486%
6082918337

push

github

dedenbangkit
[#146] Type autofield various tests

764 of 945 branches covered (0.0%)

Branch coverage included in aggregate %.

78 of 78 new or added lines in 2 files covered. (100.0%)

1642 of 1795 relevant lines covered (91.48%)

20.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.1
/app/src/form/components/QuestionField.js
1
import React, { useEffect, useState } from 'react';
2
import {
3
  TypeDate,
4
  TypeImage,
5
  TypeInput,
6
  TypeMultipleOption,
7
  TypeOption,
8
  TypeText,
9
  TypeNumber,
10
  TypeGeo,
11
  TypeCascade,
12
  TypeAutofield,
13
} from '../fields';
14
import { useField } from 'formik';
15
import { View, Text } from 'react-native';
16
import { styles } from '../styles';
17
import { FormState } from '../../store';
18
import { cascades } from '../../lib';
19

20
const QuestionField = ({ keyform, field: questionField, setFieldValue, values, validate }) => {
3✔
21
  const [field, meta, helpers] = useField({ name: questionField.id, validate });
280✔
22
  const [cascadeData, setCascadeData] = useState([]);
280✔
23

24
  useEffect(() => {
280✔
25
    if (meta.error && field.name) {
50✔
26
      FormState.update((s) => {
1✔
27
        const removedErrorValues = Object.keys(s.questionGroupListCurrentValues)
1✔
28
          .filter((key) => key.toString() !== field.name.toString())
9✔
29
          .reduce((acc, curr) => ({ ...acc, [curr]: s.questionGroupListCurrentValues[curr] }), {});
8✔
30
        s.questionGroupListCurrentValues = removedErrorValues;
1✔
31
      });
32
    } else {
33
      FormState.update((s) => {
49✔
34
        s.questionGroupListCurrentValues = { ...s.questionGroupListCurrentValues, ...values };
49✔
35
      });
36
    }
37
  }, [meta.error, field.name, values]);
38

39
  const handleOnChangeField = (id, value) => {
280✔
40
    helpers.setTouched({ [field.name]: true });
×
41
    FormState.update((s) => {
×
42
      s.currentValues = { ...s.currentValues, [id]: value };
×
43
    });
44
    setFieldValue(id, value);
×
45
  };
46

47
  const loadCascadeDataSource = async (source) => {
280✔
48
    const { rows } = await cascades.loadDataSource(source);
×
49
    setCascadeData(rows._array);
×
50
  };
51

52
  useEffect(() => {
280✔
53
    if (questionField?.type === 'cascade' && questionField?.source?.file) {
49!
54
      const cascadeSource = questionField.source;
×
55
      loadCascadeDataSource(cascadeSource);
×
56
    }
57
  }, []);
58

59
  const renderField = () => {
280✔
60
    switch (questionField?.type) {
280!
61
      case 'date':
62
        return (
34✔
63
          <TypeDate
64
            keyform={keyform}
65
            onChange={handleOnChangeField}
66
            values={values}
67
            {...questionField}
68
          />
69
        );
70
      case 'photo':
71
        return (
×
72
          <TypeImage
73
            keyform={keyform}
74
            onChange={handleOnChangeField}
75
            values={values}
76
            {...questionField}
77
          />
78
        );
79
      case 'multiple_option':
80
        return (
×
81
          <TypeMultipleOption
82
            keyform={keyform}
83
            onChange={handleOnChangeField}
84
            values={values}
85
            {...questionField}
86
          />
87
        );
88
      case 'option':
89
        return (
136✔
90
          <TypeOption
91
            keyform={keyform}
92
            onChange={handleOnChangeField}
93
            values={values}
94
            {...questionField}
95
          />
96
        );
97
      case 'text':
98
        return (
34✔
99
          <TypeText
100
            keyform={keyform}
101
            onChange={handleOnChangeField}
102
            values={values}
103
            {...questionField}
104
          />
105
        );
106
      case 'number':
107
        return (
42✔
108
          <TypeNumber
109
            keyform={keyform}
110
            onChange={handleOnChangeField}
111
            values={values}
112
            {...questionField}
113
          />
114
        );
115
      case 'geo':
116
        return (
×
117
          <TypeGeo
118
            keyform={keyform}
119
            onChange={handleOnChangeField}
120
            values={values}
121
            {...questionField}
122
          />
123
        );
124
      case 'cascade':
125
        return (
×
126
          <TypeCascade
127
            keyform={keyform}
128
            onChange={handleOnChangeField}
129
            values={values}
130
            {...questionField}
131
            dataSource={cascadeData}
132
          />
133
        );
134
      case 'autofield':
135
        return (
×
136
          <TypeAutofield
137
            keyform={keyform}
138
            onChange={handleOnChangeField}
139
            values={values}
140
            {...questionField}
141
          />
142
        );
143
      default:
144
        return (
34✔
145
          <TypeInput
146
            keyform={keyform}
147
            onChange={handleOnChangeField}
148
            values={values}
149
            {...questionField}
150
          />
151
        );
152
    }
153
  };
154

155
  return (
280✔
156
    <View>
157
      {renderField()}
158
      {meta.touched && meta.error ? (
747✔
159
        <Text style={styles.validationErrorText}>{meta.error}</Text>
160
      ) : null}
161
    </View>
162
  );
163
};
164

165
export default QuestionField;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc