Skip to content

Commit 1f3e3d3

Browse files
Bindu, Tarun | BAH-1017 | MOBN-1551 | Fix renderWithControls method in Preview tab (#7) (#61)
* Bindu, Tarun | MOBN-1551 | Fix renderWithControls method in Preview tab * Bindu, Tarun | MOBN-1551 | Fix unit tests Co-authored-by: Himabindu Thungathurty <[email protected]> Co-authored-by: tarunkumar-tw <[email protected]>
1 parent 597dcba commit 1f3e3d3

File tree

2 files changed

+47
-60
lines changed

2 files changed

+47
-60
lines changed

Diff for: src/form-builder/components/FormPreviewModal.jsx

+36-33
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import React from 'react';
2+
import ReactDOM from 'react-dom';
23
import PropTypes from 'prop-types';
34
import 'bahmni-form-controls/dist/helpers.js';
45
import { Exception } from 'form-builder/helpers/Exception';
6+
import { Container } from 'bahmni-form-controls';
57

68

79
export default class FormPreviewModal extends React.Component {
@@ -18,70 +20,71 @@ export default class FormPreviewModal extends React.Component {
1820
const defaultLocale = (window.localStorage
1921
&& window.localStorage.getItem('openmrsDefaultLocale')) || 'en';
2022
this.state = {
21-
formData: {},
22-
container: {},
2323
defaultLocale,
24+
recordTree: {},
2425
};
2526
this.onSave = this.onSave.bind(this);
26-
this.setContainer = this.setContainer.bind(this);
27+
this.updateContainer = this.updateContainer.bind(this);
28+
this.onValueUpdated = this.onValueUpdated.bind(this);
2729
}
2830

2931
componentDidMount() {
3032
try {
31-
this.setContainer([]);
33+
this.updateContainer([]);
3234
} catch (e) {
3335
this.props.setErrorMessage(new Exception(FormPreviewModal.formatErrors(e)).getException());
3436
}
3537
}
3638

3739
onSave() {
3840
const formJson = this.props.formJson;
39-
if (this.state.container.state && formJson.events.onFormSave) {
41+
if (Object.keys(this.state.recordTree).length > 0 && formJson.events.onFormSave) {
4042
/* eslint-disable no-undef */
4143
try {
42-
const records = runEventScript(this.state.container.state.data, formJson.events.onFormSave);
44+
const records = runEventScript(this.state.recordTree, formJson.events.onFormSave);
4345
unMountForm(document.getElementById('form-container'));
44-
this.setContainer(getObservations(records));
46+
this.updateContainer(getObservations(records));
4547
} catch (e) {
4648
this.props.setErrorMessage(new Exception(FormPreviewModal.formatErrors(e)).getException());
4749
}
4850
}
4951
}
5052

51-
setContainer(observations) {
53+
onValueUpdated(data) {
54+
this.setState({ recordTree: data });
55+
}
56+
57+
updateContainer(observations) {
5258
const metadata = this.props.formJson;
5359
if (metadata) {
54-
const container = renderWithControls(metadata, observations, 'form-container', false, null,
55-
false, this.state.defaultLocale, '');
56-
this.setState({ container });
60+
const container = React.createElement(Container,
61+
{ metadata, observations, validate: true, validateForm: false,
62+
collapse: false, patient: null, locale: this.state.defaultLocale, translations: '',
63+
onValueUpdated: this.onValueUpdated });
64+
ReactDOM.render(container, document.getElementById('form-container'));
5765
}
5866
}
5967

6068
render() {
6169
if (this.props.formJson) {
6270
return (
63-
<div className="preview-container">
64-
<div className="preview-header">
65-
<div>Preview</div>
66-
<i className="fa fa-times" onClick={this.props.close}></i>
67-
</div>
68-
<div className="preview-body">
69-
<div className="disable-image-and-video-upload" id="form-container"> </div>
70-
</div>
71-
<div className="preview-footer">
72-
<button className="button btn--highlight" onClick={this.onSave}
73-
type="submit"
74-
>
75-
Save
76-
</button>
77-
<button className="btn preview-close-btn"
78-
onClick={this.props.close}
79-
type="reset"
80-
>
81-
Close
82-
</button>
83-
</div>
84-
</div>);
71+
<div className="preview-container">
72+
<div className="preview-header">
73+
<div>Preview</div>
74+
<i className="fa fa-times" onClick={this.props.close}></i>
75+
</div>
76+
<div className="preview-body">
77+
<div className="disable-image-and-video-upload" id="form-container"> </div>
78+
</div>
79+
<div className="preview-footer">
80+
<button className="button btn--highlight" onClick={this.onSave} type="submit">
81+
Save
82+
</button>
83+
<button className="btn preview-close-btn" onClick={this.props.close} type="reset">
84+
Close
85+
</button>
86+
</div>
87+
</div>);
8588
}
8689
return null;
8790
}

Diff for: test/form-builder/components/FormPreviewModal.spec.js

+11-27
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('FormPreviewModal', () => {
1212
let wrapper;
1313
let closeSpy;
1414
let setErrorMessageSpy;
15-
let renderWithControlsCounter = 0;
15+
let updateContainerStub;
1616

1717
const formJson = {
1818
name: 'Groovy',
@@ -52,14 +52,17 @@ describe('FormPreviewModal', () => {
5252
beforeEach(() => {
5353
closeSpy = sinon.spy();
5454
setErrorMessageSpy = sinon.spy();
55-
renderWithControlsCounter = 0;
56-
window.renderWithControls = function renderWithControls() {
57-
renderWithControlsCounter++;
58-
return 'container';
59-
};
55+
});
56+
57+
afterEach(() => {
58+
if (updateContainerStub) {
59+
updateContainerStub.restore();
60+
}
6061
});
6162

6263
function mountComponent(formJsonMetadata) {
64+
updateContainerStub = sinon.stub(FormPreviewModal.prototype, 'updateContainer')
65+
.callsFake(() => {});
6366
wrapper = mount(
6467
<FormPreviewModal
6568
close={closeSpy}
@@ -74,7 +77,6 @@ describe('FormPreviewModal', () => {
7477
const container = wrapper.find('.preview-container');
7578
expect(container).to.have.length(1);
7679
expect(container.children().length).to.be.equal(3);
77-
expect(renderWithControlsCounter).to.be.equal(1);
7880
});
7981

8082
it('should not render create form modal when form data doesnot exist', () => {
@@ -83,7 +85,6 @@ describe('FormPreviewModal', () => {
8385
const container = wrapper.find('Container');
8486
expect(container).to.be.length(0);
8587
expect(modal).to.be.length(0);
86-
expect(renderWithControlsCounter).to.be.equal(0);
8788
});
8889

8990
it('should call close modal function when close button is clicked', () => {
@@ -109,7 +110,7 @@ describe('FormPreviewModal', () => {
109110
it('should call 3 window methods and set container to state on click of save button', () => {
110111
mountComponent(formJson);
111112
const button = wrapper.find('.btn--highlight');
112-
wrapper.setState({ container: { state: { data: {} } } });
113+
wrapper.setState({ recordTree: { record: '' } });
113114
let runEventScriptCounter = 0;
114115
let unMountFormCounter = 0;
115116
let getObservationsCounter = 0;
@@ -130,13 +131,6 @@ describe('FormPreviewModal', () => {
130131
expect(getObservationsCounter).to.equal(1);
131132
});
132133

133-
it('should set renderWithControls return value to state variable container on componentDidMount',
134-
() => {
135-
mountComponent(formJson);
136-
expect(renderWithControlsCounter).to.be.equal(1);
137-
expect(wrapper.state().container).to.equal('container');
138-
});
139-
140134
it('should return error message for single error object', () => {
141135
const errorMessage = FormPreviewModal.formatErrors({ message: 'It is an error' });
142136

@@ -162,7 +156,7 @@ describe('FormPreviewModal', () => {
162156
it('should call setErrorMessage when runEventScript throws exception', () => {
163157
mountComponent(formJson);
164158
const button = wrapper.find('.btn--highlight');
165-
wrapper.setState({ container: { state: { data: {} } } });
159+
wrapper.setState({ recordTree: { record: '' } });
166160
window.runEventScript = function runEventScript() {
167161
throw Object.assign(new Error('Error'));
168162
};
@@ -176,14 +170,4 @@ describe('FormPreviewModal', () => {
176170
sinon.assert.calledOnce(setErrorMessageSpy);
177171
sinon.assert.calledWith(setErrorMessageSpy, { type: 'Exception', message: 'Error' });
178172
});
179-
180-
it('should call setErrorMessage when renderWithControls throws exception', () => {
181-
window.renderWithControls = function renderWithControls() {
182-
throw Object.assign(new Error('Error'));
183-
};
184-
mountComponent(formJson);
185-
186-
sinon.assert.calledOnce(setErrorMessageSpy);
187-
sinon.assert.calledWith(setErrorMessageSpy, { type: 'Exception', message: 'Error' });
188-
});
189173
});

0 commit comments

Comments
 (0)