Skip to content

Commit 2a5ba22

Browse files
committed
Add validationResults getter, disableSubmitOnValidationError prop
1 parent 79a8652 commit 2a5ba22

File tree

13 files changed

+70
-37
lines changed

13 files changed

+70
-37
lines changed

dist/components/form/FormConsumer.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,12 @@ function (_Component) {
7878
instance = _this$props.instance,
7979
hideFormBorder = _this$props.hideFormBorder,
8080
width = _this$props.width;
81+
var style = width ? {
82+
width: this.props.width
83+
} : {};
8184
return _react["default"].createElement("div", {
8285
className: "__rjfe__ rjfe-form-consumer",
83-
style: width ? {
84-
width: this.props.width
85-
} : {}
86+
style: style
8687
}, _react["default"].createElement(_FormTitle["default"], null), _react["default"].createElement("div", {
8788
className: "form-sections",
8889
style: this.getDerivedStyles(hideFormBorder)

dist/components/form/FormField/FormControl.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function (_Component) {
7474
value: function renderErrors(id) {
7575
var instance = this.props.instance;
7676

77-
var _instance$getValidati = instance.getValidationResultByTag(id),
77+
var _instance$getValidati = instance.getValidationResultById(id),
7878
messages = _instance$getValidati.messages;
7979

8080
return Object.keys(messages).map(function (key) {

dist/components/form/FormSubsection/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
4141

4242
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
4343

44-
var FormSubsection = (_dec = (0, _mobxReact.inject)('instance', 'hideFormTitle', 'hideSubsectionTitles', 'hideSubsectionSubtitles'), _dec(_class = (0, _mobxReact.observer)(_class = (_temp = _class2 =
44+
var FormSubsection = (_dec = (0, _mobxReact.inject)('instance', 'hideFormTitle', 'hideSubsectionTitles', 'hideSubsectionSubtitles', 'submitButtonLabel'), _dec(_class = (0, _mobxReact.observer)(_class = (_temp = _class2 =
4545
/*#__PURE__*/
4646
function (_Component) {
4747
_inherits(FormSubsection, _Component);

dist/components/form/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ Form.propTypes = {
145145
hideFormBorder: _propTypes["default"].bool,
146146
hideSubsectionTitles: _propTypes["default"].bool,
147147
hideSubsectionSubtitles: _propTypes["default"].bool,
148+
disableSubmitOnValidationError: _propTypes["default"].bool,
148149
width: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].string]),
149150
onSubmit: _propTypes["default"].func.isRequired,
150151
onUpdate: _propTypes["default"].func

dist/form-engine/index.js

+21-12
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,6 @@ function () {
631631
/**
632632
* Evaluate the show condition of the field
633633
* @param field
634-
* @param tag
635634
* @returns {*}
636635
*/
637636

@@ -694,18 +693,28 @@ function () {
694693
});
695694
});
696695
Object.keys(this.fields).forEach(function (id) {
697-
_this11.validationMap.fields[id] = _validationService["default"].isError(_this11.getValidationStatusByTag(id));
696+
_this11.validationMap.fields[id] = _validationService["default"].isError(_this11.getValidationStatusById(id));
698697
});
699698
}
699+
/**
700+
* Get the ValidationResults object
701+
* @returns {ValidationResults}
702+
*/
703+
704+
}, {
705+
key: "getValidationResults",
706+
value: function getValidationResults() {
707+
return this.validationResults;
708+
}
700709
/**
701710
* Get validation results by field id
702711
* @param id
703712
* @returns {{status: (*|string), messages: (*|Array)}}
704713
*/
705714

706715
}, {
707-
key: "getValidationResultByTag",
708-
value: function getValidationResultByTag(id) {
716+
key: "getValidationResultById",
717+
value: function getValidationResultById(id) {
709718
return this.validationResults.getResults(id);
710719
}
711720
/**
@@ -715,9 +724,9 @@ function () {
715724
*/
716725

717726
}, {
718-
key: "getValidationStatusByTag",
719-
value: function getValidationStatusByTag(id) {
720-
return this.getValidationResultByTag(id).status;
727+
key: "getValidationStatusById",
728+
value: function getValidationStatusById(id) {
729+
return this.getValidationResultById(id).status;
721730
}
722731
/**
723732
* Recursively check for validation statuses, and return
@@ -727,10 +736,10 @@ function () {
727736
*/
728737

729738
}, {
730-
key: "getDeepValidationStatusByTag",
731-
value: function getDeepValidationStatusByTag(id) {
732-
var status = this.getValidationResultByTag(id).status;
733-
var newStatus = this.findValidationStatus(this.getField(id)[FIELD.FIELDS], this.getDeepValidationStatusByTag.bind(this), true);
739+
key: "getDeepValidationStatusById",
740+
value: function getDeepValidationStatusById(id) {
741+
var status = this.getValidationResultById(id).status;
742+
var newStatus = this.findValidationStatus(this.getField(id)[FIELD.FIELDS], this.getDeepValidationStatusById.bind(this), true);
734743

735744
if (_validationService["default"].isMoreSevereStatus(newStatus, status)) {
736745
status = newStatus;
@@ -772,7 +781,7 @@ function () {
772781
}, {
773782
key: "getSubsectionStatus",
774783
value: function getSubsectionStatus(subsection) {
775-
return this.findValidationStatus(subsection.fields, this.getDeepValidationStatusByTag.bind(this), true);
784+
return this.findValidationStatus(subsection.fields, this.getDeepValidationStatusById.bind(this), true);
776785
}
777786
/**
778787
* Return the validation status of a section

src/components/form/FormConsumer.jsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import TabbedSections from './FormSection/TabbedSections';
1212
'hideFormBorder',
1313
'hideSubsectionTitles',
1414
'hideSubsectionSubtitles',
15-
'submitButtonLabel'
15+
'submitButtonLabel',
16+
'disableSubmitOnValidationError'
1617
)
1718
@observer
1819
class FormConsumer extends Component {
@@ -38,8 +39,10 @@ class FormConsumer extends Component {
3839
render() {
3940
const { instance, hideFormBorder, width } = this.props;
4041

42+
const style = width ? { width: this.props.width } : {};
43+
4144
return (
42-
<div className="__rjfe__ rjfe-form-consumer" style={width ? { width: this.props.width } : {}}>
45+
<div className="__rjfe__ rjfe-form-consumer" style={style}>
4346
<FormTitle />
4447
<div className="form-sections" style={this.getDerivedStyles(hideFormBorder)}>
4548
{this.renderSections(instance.getSections())}

src/components/form/FormField/FormControl.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class FormControl extends Component {
2525

2626
renderErrors(id) {
2727
const { instance } = this.props;
28-
const { messages } = instance.getValidationResultByTag(id);
28+
const { messages } = instance.getValidationResultById(id);
2929
return Object.keys(messages).map(key => (
3030
<FormControlHint key={key} icon="asterisk" className="is-danger" text={messages[key].message} />
3131
));

src/components/form/FormSubsection/index.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import FormField from '../FormField/';
66
import FormSubsectionTitle from '../util/FormSubsectionTitle';
77
import FormSubmitButton from '../util/FormSubmitButton';
88

9-
@inject('instance', 'hideFormTitle', 'hideSubsectionTitles', 'hideSubsectionSubtitles')
9+
@inject('instance', 'hideFormTitle', 'hideSubsectionTitles', 'hideSubsectionSubtitles', 'submitButtonLabel')
1010
@observer
1111
class FormSubsection extends Component {
1212
static propTypes = {

src/components/form/index.jsx

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class Form extends Component {
6969
onUpdate={this.onUpdate}
7070
hideFormTitle={this.props.hideFormTitle}
7171
hideFormBorder={this.props.hideFormBorder}
72+
disableSubmitOnValidationError={this.props.disableSubmitOnValidationError}
7273
hideSubsectionTitles={this.props.hideSubsectionTitles}
7374
hideSubsectionSubtitles={this.props.hideSubsectionSubtitles}
7475
submitButtonLabel={this.props.submitButtonLabel}
@@ -86,6 +87,7 @@ Form.propTypes = {
8687
hideFormBorder: PropTypes.bool,
8788
hideSubsectionTitles: PropTypes.bool,
8889
hideSubsectionSubtitles: PropTypes.bool,
90+
disableSubmitOnValidationError: PropTypes.bool,
8991
width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
9092
onSubmit: PropTypes.func.isRequired,
9193
onUpdate: PropTypes.func

src/components/form/util/FormSubmitButton.jsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ import React, { Component } from 'react';
22
import PropTypes from 'prop-types';
33
import { inject, observer } from 'mobx-react';
44

5-
@inject('onSubmit', 'submitButtonLabel')
5+
@inject('instance', 'onSubmit', 'submitButtonLabel', 'disableSubmitOnValidationError')
66
@observer
77
class FormSubmitButton extends Component {
88
static propTypes = {
99
onSubmit: PropTypes.func.isRequired,
1010
submitButtonLabel: PropTypes.string
1111
};
1212
render() {
13+
const { instance, submitButtonLabel, onSubmit, disableSubmitOnValidationError } = this.props;
14+
const disable = disableSubmitOnValidationError && instance.formHasError();
1315
return (
14-
<button className="button is-link" onClick={this.props.onSubmit}>
15-
{this.props.submitButtonLabel || 'Submit'}
16+
<button className="button is-link" onClick={onSubmit} disabled={disable}>
17+
{submitButtonLabel || 'Submit'}
1618
</button>
1719
);
1820
}

src/components/form/util/FormTitle.jsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import FormSubmitButton from './FormSubmitButton';
77

88
const DEFAULT_THEME = 'is-dark';
99

10-
@inject('instance', 'hideFormTitle', 'submitButtonLabel')
10+
@inject('instance', 'hideFormTitle', 'submitButtonLabel', 'disableSubmitOnValidationError')
1111
@observer
1212
class FormTitle extends Component {
1313
static propTypes = {

src/form-engine/index.js

+25-10
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,6 @@ class FormEngine {
496496
/**
497497
* Evaluate the show condition of the field
498498
* @param field
499-
* @param tag
500499
* @returns {*}
501500
*/
502501
isVisible(field) {
@@ -521,7 +520,7 @@ class FormEngine {
521520
validate(comprehensive = false) {
522521
this.validationResults = FormValidator.validate(this, this.validationResults, comprehensive);
523522
this.buildObservableValidationMap();
524-
return this.validationResults.hasError();
523+
return this.formHasError();
525524
}
526525

527526
/**
@@ -549,16 +548,24 @@ class FormEngine {
549548
});
550549
});
551550
Object.keys(this.fields).forEach(id => {
552-
this.validationMap.fields[id] = ValidationService.isError(this.getValidationStatusByTag(id));
551+
this.validationMap.fields[id] = ValidationService.isError(this.getValidationStatusById(id));
553552
});
554553
}
555554

555+
/**
556+
* Get the ValidationResults object
557+
* @returns {ValidationResults}
558+
*/
559+
getValidationResults() {
560+
return this.validationResults;
561+
}
562+
556563
/**
557564
* Get validation results by field id
558565
* @param id
559566
* @returns {{status: (*|string), messages: (*|Array)}}
560567
*/
561-
getValidationResultByTag(id) {
568+
getValidationResultById(id) {
562569
return this.validationResults.getResults(id);
563570
}
564571

@@ -567,8 +574,8 @@ class FormEngine {
567574
* @param id
568575
* @returns {*|string}
569576
*/
570-
getValidationStatusByTag(id) {
571-
return this.getValidationResultByTag(id).status;
577+
getValidationStatusById(id) {
578+
return this.getValidationResultById(id).status;
572579
}
573580

574581
/**
@@ -577,11 +584,11 @@ class FormEngine {
577584
* @param id
578585
* @returns {*|string}
579586
*/
580-
getDeepValidationStatusByTag(id) {
581-
let status = this.getValidationResultByTag(id).status;
587+
getDeepValidationStatusById(id) {
588+
let status = this.getValidationResultById(id).status;
582589
const newStatus = this.findValidationStatus(
583590
this.getField(id)[FIELD.FIELDS],
584-
this.getDeepValidationStatusByTag.bind(this),
591+
this.getDeepValidationStatusById.bind(this),
585592
true
586593
);
587594
if (ValidationService.isMoreSevereStatus(newStatus, status)) {
@@ -617,7 +624,7 @@ class FormEngine {
617624
getSubsectionStatus(subsection) {
618625
return this.findValidationStatus(
619626
subsection.fields,
620-
this.getDeepValidationStatusByTag.bind(this),
627+
this.getDeepValidationStatusById.bind(this),
621628
true
622629
);
623630
}
@@ -657,6 +664,14 @@ class FormEngine {
657664
sectionHasError(sectionId) {
658665
return this.validationMap.sections[sectionId] || false;
659666
}
667+
668+
/**
669+
* Determine if the form has a validation error
670+
* @returns {boolean}
671+
*/
672+
formHasError() {
673+
return this.validationMap.form;
674+
}
660675
}
661676

662677
decorate(FormEngine, {

stories/util/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@ export const logInstance = instance => {
99
};
1010

1111
export const buildFormComponent = (instance, options = {}) => {
12-
const { submitButtonLabel = 'Submit', height, width } = options;
12+
const { submitButtonLabel = 'Submit', width } = options;
1313

1414
const buttonLabel = text('submitButtonLabel', submitButtonLabel);
1515
return (
1616
<Form
17-
{...height && { height }}
1817
{...width && { width }}
1918
hideFormTitle={boolean('hideFormTitle', false)}
2019
hideFormBorder={boolean('hideFormBorder', false)}
2120
hideSubsectionTitles={boolean('hideSubsectionTitles', false)}
2221
hideSubsectionSubtitles={boolean('hideSubsectionSubtitles', false)}
22+
disableSubmitOnValidationError={boolean('disableSubmitOnValidationError', true)}
2323
submitButtonLabel={buttonLabel}
2424
instance={instance}
2525
onSubmit={logInstance(instance).action(buttonLabel)}

0 commit comments

Comments
 (0)