UNPKG

2.31 kBJavaScriptView Raw
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { AvGroup, AvFeedback } from 'availity-reactstrap-validation';
4import classNames from 'classnames';
5import { Label } from 'reactstrap';
6
7import AvSelect from './AvSelect';
8
9class AvSelectField extends Component {
10 getChildContext() {
11 if (this.context.FormCtrl) {
12 this.FormCtrl = { ...this.context.FormCtrl };
13 const registerValidator = this.FormCtrl.register;
14 this.FormCtrl.register = (
15 input,
16 updater = input && input.forceUpdate
17 ) => {
18 registerValidator(input, () => {
19 this.forceUpdate();
20 if (updater) updater();
21 });
22 };
23 return {
24 FormCtrl: this.FormCtrl,
25 };
26 }
27 return {
28 FormCtrl: this.context.FormCtrl,
29 };
30 }
31
32 render() {
33 const {
34 label,
35 labelHidden,
36 id = this.props.name,
37 feedbackClass,
38 groupClass,
39 labelClass,
40 ...attributes
41 } = this.props;
42
43 const validation = this.context.FormCtrl
44 ? this.context.FormCtrl.getInputState(this.props.name)
45 : {};
46 let feedback = null;
47 if (validation.errorMessage) {
48 const feedbackClasses = classNames('d-block', feedbackClass);
49 feedback = (
50 <AvFeedback className={feedbackClasses}>
51 {validation.errorMessage}
52 </AvFeedback>
53 );
54 }
55
56 let thisLabel = false;
57 if (label) {
58 let forLabel = id;
59 if (attributes.inputId) {
60 forLabel = attributes.inputId;
61 } else {
62 attributes.inputId = id;
63 }
64 thisLabel = (
65 <Label for={forLabel} hidden={labelHidden} className={labelClass}>
66 {label}
67 </Label>
68 );
69 }
70
71 return (
72 <AvGroup className={groupClass}>
73 {thisLabel}
74 <AvSelect {...attributes} />
75 {feedback}
76 </AvGroup>
77 );
78 }
79}
80
81AvSelectField.propTypes = {
82 label: PropTypes.node,
83 labelHidden: PropTypes.bool,
84 id: PropTypes.string,
85 feedbackClass: PropTypes.string,
86 groupClass: PropTypes.string,
87 labelClass: PropTypes.string,
88 name: PropTypes.string.isRequired,
89};
90
91AvSelectField.contextTypes = {
92 FormCtrl: PropTypes.object,
93};
94
95AvSelectField.childContextTypes = {
96 FormCtrl: PropTypes.object,
97};
98
99export default AvSelectField;