Skip to content

Commit 273678c

Browse files
committed
feat(renderer): added deleted value prop
1 parent cf5b39b commit 273678c

File tree

7 files changed

+131
-18
lines changed

7 files changed

+131
-18
lines changed

packages/pf4-component-mapper/src/tests/field-array/__snapshots__/field-array.test.js.snap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ exports[`FieldArray should render array field correctly 1`] = `
136136
"change": [Function],
137137
"clearOnUnmount": false,
138138
"concat": [Function],
139+
"deletedValue": undefined,
139140
"destroyOnUnregister": false,
140141
"focus": [Function],
141142
"getFieldState": [Function],
@@ -197,6 +198,7 @@ exports[`FieldArray should render array field correctly 1`] = `
197198
"change": [Function],
198199
"clearOnUnmount": false,
199200
"concat": [Function],
201+
"deletedValue": undefined,
200202
"destroyOnUnregister": false,
201203
"focus": [Function],
202204
"getFieldState": [Function],
@@ -252,6 +254,7 @@ exports[`FieldArray should render array field correctly 1`] = `
252254
"change": [Function],
253255
"clearOnUnmount": false,
254256
"concat": [Function],
257+
"deletedValue": undefined,
255258
"destroyOnUnregister": false,
256259
"focus": [Function],
257260
"getFieldState": [Function],
@@ -308,6 +311,7 @@ exports[`FieldArray should render array field correctly 1`] = `
308311
"change": [Function],
309312
"clearOnUnmount": false,
310313
"concat": [Function],
314+
"deletedValue": undefined,
311315
"destroyOnUnregister": false,
312316
"focus": [Function],
313317
"getFieldState": [Function],
@@ -401,6 +405,7 @@ exports[`FieldArray should render array field correctly 1`] = `
401405
"change": [Function],
402406
"clearOnUnmount": false,
403407
"concat": [Function],
408+
"deletedValue": undefined,
404409
"destroyOnUnregister": false,
405410
"focus": [Function],
406411
"getFieldState": [Function],

packages/react-form-renderer/demo/index.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import ReactDOM from "react-dom";
44
import FormRenderer from '../src';
55
import layoutMapper from './layout-mapper';
66
import formFieldsMapper from './form-fields-mapper';
7-
import miqSchema from '../src/demo-schemas/miq-schemas/input';
87
import sandboxSchema from './sandbox'
9-
import { conditionalSchema, widgetSchema, uiWidgetSchema, arraySchema, uiArraySchema } from '../src/demo-schemas/mozilla-schemas';
108

119
const submitTest = (...args) => new Promise(resolve => {
1210
setTimeout(() => {
@@ -26,18 +24,20 @@ const FormButtons = props => {
2624
const App = () => (
2725
<div style={{ padding: 20 }}>
2826
<FormRenderer
27+
initialValues={{
28+
text_box_1: 'hue'
29+
}}
30+
deletedValue={null}
2931
layoutMapper={layoutMapper}
3032
formFieldsMapper={formFieldsMapper}
31-
onSubmit={submitTest}
33+
onSubmit={console.log}
3234
onCancel={console.log}
3335
canReset
3436
onReset={() => console.log('i am resseting')}
3537
schemaType="default"
3638
schema={sandboxSchema}
37-
uiSchema={uiArraySchema}
3839
buttonOrder={['cancel', 'reset', 'submit']}
3940
buttonClassName="Foo"
40-
onStateUpdate={console.log}
4141
renderFormButtons={FormButtons}
4242
/>
4343
</div>

packages/react-form-renderer/src/form-renderer/enhanced-on-change.js

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import isEmpty from 'lodash/isEmpty';
12
import { dataTypes } from '../constants';
23

34
/**
@@ -40,19 +41,45 @@ const convertType = (dataType, value) => ({
4041
[dataTypes.BOOLEAN]: castToBoolean(value),
4142
})[dataType] || value;
4243

44+
/**
45+
* Checks the value and returns undefined if its empty. Converst epmtry strings, arrays and objects.
46+
* If value is empty its overriden to undefined for further processing.
47+
* @param {Any} value Any JS variable to be check if is empty
48+
*/
49+
const checkEmpty = value => {
50+
if (typeof value === 'number') {
51+
return value;
52+
}
53+
54+
if (typeof value === 'string' && value.length > 0) {
55+
return value;
56+
}
57+
58+
if (!isEmpty(value)) {
59+
return value;
60+
}
61+
62+
return undefined;
63+
};
64+
4365
/**
4466
* Casts input value into selected data type
4567
* @param {FieldDataTypes} dataType intended data type of output value
4668
* @param {Function} onChange original function to be modified
69+
* @param {Any} initial initial value of field
4770
* @param {Any} value value to be type casted
4871
* @param {...any} args rest of orininal function arguments
4972
*/
50-
const enhancedOnChange = (dataType, onChange, value, ...args) => {
73+
const enhancedOnChange = (dataType, onChange, initial, deletedValue, value, ...args) => {
5174
const sanitizedValue = sanitizeValue(value);
52-
return onChange(
53-
Array.isArray(sanitizedValue)
54-
? sanitizedValue.map(item => convertType(dataType, sanitizeValue(item)))
55-
: convertType(dataType, sanitizedValue),
56-
...args);};
75+
const result = Array.isArray(sanitizedValue)
76+
? sanitizedValue.map(item => convertType(dataType, sanitizeValue(item)))
77+
: convertType(dataType, sanitizedValue);
78+
if (typeof checkEmpty(result) === 'undefined' && typeof initial !== 'undefined') {
79+
return onChange(deletedValue, ...args);
80+
}
81+
82+
return onChange(result, ...args);
83+
};
5784

5885
export default enhancedOnChange;

packages/react-form-renderer/src/form-renderer/field-provider.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class FieldProvider extends Component{
2828
{ ...fieldsProps }
2929
input={{
3030
...input,
31-
onChange: (...args) => enhancedOnChange(dataType, onChange, ...args),
31+
onChange: (...args) => {
32+
enhancedOnChange(dataType, onChange, fieldsProps.meta.initial, this.props.formOptions.deletedValue, ...args);
33+
},
3234
}}
3335
/>
3436
) } />;
@@ -39,7 +41,7 @@ class FieldProvider extends Component{
3941
...fieldsProps,
4042
input: {
4143
...input,
42-
onChange: (...args) => enhancedOnChange(dataType, onChange, ...args),
44+
onChange: (...args) => enhancedOnChange(dataType, onChange, fieldsProps.meta.initial, this.props.formOptions.deletedValue, ...args),
4345
},
4446
}) } />;
4547
}
@@ -51,7 +53,7 @@ class FieldProvider extends Component{
5153
Children.only(
5254
<ChildComponent
5355
{ ...fieldsProps }
54-
input={{ ...input, onChange: (...args) => enhancedOnChange(dataType, onChange, ...args) }}
56+
input={{ ...input, onChange: (...args) => enhancedOnChange(dataType, onChange, fieldsProps.meta.initial, this.props.formOptions.deletedValue, ...args) }}
5557
/>
5658
) }
5759
</Field>
@@ -64,6 +66,7 @@ FieldProvider.propTypes = {
6466
clearOnUnmount: PropTypes.bool,
6567
change: PropTypes.func,
6668
getFieldState: PropTypes.func,
69+
deletedValue: PropTypes.any,
6770
}),
6871
component: PropTypes.oneOfType(PropTypes.node, PropTypes.element, PropTypes.func),
6972
render: PropTypes.func,

packages/react-form-renderer/src/form-renderer/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const FormRenderer = ({
4242
onStateUpdate,
4343
renderFormButtons,
4444
subscription,
45+
deletedValue,
4546
}) => {
4647
const inputSchema = schemaMapper(schemaType)(schema, uiSchema);
4748
let schemaError;
@@ -80,6 +81,7 @@ const FormRenderer = ({
8081
onCancel,
8182
getState,
8283
valid,
84+
deletedValue,
8385
submit,
8486
handleSubmit,
8587
reset,
@@ -139,6 +141,7 @@ FormRenderer.propTypes = {
139141
onStateUpdate: PropTypes.func,
140142
renderFormButtons: PropTypes.oneOfType([ PropTypes.node, PropTypes.element, PropTypes.func ]),
141143
subscription: PropTypes.shape({ [PropTypes.string]: PropTypes.bool }),
144+
deletedValue: PropTypes.any,
142145
};
143146

144147
FormRenderer.defaultProps = {

0 commit comments

Comments
 (0)