|
@@ -23,6 +23,7 @@ const dictionary = {
|
|
|
inputType: "text",
|
|
|
minLength: 2,
|
|
|
maxLength: 32,
|
|
|
+ isInput: true,
|
|
|
regex: regex.azAZ09_,
|
|
|
errors: {
|
|
|
format: t("general:invalidUsernameFormat", { characters: `a-z, A-Z, 0-9${ t("general:and") } _` }),
|
|
@@ -32,6 +33,7 @@ const dictionary = {
|
|
|
inputType: "email",
|
|
|
minLength: 3,
|
|
|
maxLength: 254,
|
|
|
+ isInput: true,
|
|
|
regex: regex.emailSimple,
|
|
|
errors: {
|
|
|
format: t("general:invalidEmailFormat"),
|
|
@@ -41,6 +43,7 @@ const dictionary = {
|
|
|
inputType: "password",
|
|
|
minLength: 6,
|
|
|
maxLength: 200,
|
|
|
+ isInput: true,
|
|
|
regex: regex.password,
|
|
|
errors: {
|
|
|
format: t("general:invalidPasswordFormat", { characters: "$@$!%*?&" }),
|
|
@@ -50,6 +53,7 @@ const dictionary = {
|
|
|
inputType: "text",
|
|
|
minLength: 8,
|
|
|
maxLength: 8,
|
|
|
+ isInput: true,
|
|
|
regex: regex.azAZ09,
|
|
|
errors: {
|
|
|
length: t("general:invalidCodeLength", { length: 8 }),
|
|
@@ -60,6 +64,7 @@ const dictionary = {
|
|
|
inputType: "text",
|
|
|
minLength: 2,
|
|
|
maxLength: 16,
|
|
|
+ isInput: true,
|
|
|
regex: regex.az09_,
|
|
|
errors: {
|
|
|
//format: t("general:invalidUsernameFormat", { characters: `a-z, A-Z, 0-9${ t("general:and") } _` }),
|
|
@@ -70,6 +75,7 @@ const dictionary = {
|
|
|
inputType: "text",
|
|
|
minLength: 2,
|
|
|
maxLength: 32,
|
|
|
+ isInput: true,
|
|
|
regex: regex.azAZ09_,
|
|
|
errors: {
|
|
|
//format: t("general:invalidUsernameFormat", { characters: `a-z, A-Z, 0-9${ t("general:and") } _` }),
|
|
@@ -83,11 +89,29 @@ const dictionary = {
|
|
|
isTextarea: true,
|
|
|
errors: {},
|
|
|
},
|
|
|
+ stationPrivacy: {
|
|
|
+ isRadio: true,
|
|
|
+ options: [
|
|
|
+ {
|
|
|
+ text: "Public - Lorem ipsum lorem ipsum lorem ipsum",
|
|
|
+ value: "public",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ text: "Unlisted - Lorem ipsum lorem ipsum lorem ipsum",
|
|
|
+ value: "unlisted",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ text: "Private - Lorem ipsum lorem ipsum lorem ipsum",
|
|
|
+ value: "private",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
export default class CustomInput extends Component {
|
|
|
static propTypes = {
|
|
|
type: PropTypes.string,
|
|
|
+ original: PropTypes.string,
|
|
|
name: PropTypes.string,
|
|
|
label: PropTypes.string,
|
|
|
//showLabel: PropTypes.boolean,
|
|
@@ -97,6 +121,7 @@ export default class CustomInput extends Component {
|
|
|
|
|
|
static defaultProps = {
|
|
|
type: "",
|
|
|
+ original: "",
|
|
|
name: "",
|
|
|
label: "",
|
|
|
//showLabel: true,
|
|
@@ -138,8 +163,11 @@ export default class CustomInput extends Component {
|
|
|
this.state = {
|
|
|
inputType: dictionary[props.type].inputType,
|
|
|
isTextarea: (typeof dictionary[props.type].isTextarea === "boolean") ? dictionary[props.type].isTextarea : false,
|
|
|
+ isInput: (typeof dictionary[props.type].isInput === "boolean") ? dictionary[props.type].isInput : false,
|
|
|
+ isRadio: (typeof dictionary[props.type].isRadio === "boolean") ? dictionary[props.type].isRadio : false,
|
|
|
+ options: (typeof dictionary[props.type].options === "object") ? dictionary[props.type].options : null,
|
|
|
value: "",
|
|
|
- original: "",
|
|
|
+ original: this.props.original,
|
|
|
errors: [],
|
|
|
pristine: true,
|
|
|
disabled: false,
|
|
@@ -176,7 +204,11 @@ export default class CustomInput extends Component {
|
|
|
value,
|
|
|
};
|
|
|
if (original) state.original = value;
|
|
|
- this.setState(state);
|
|
|
+ this.setState(state, () => {
|
|
|
+ if (this.state.isRadio) {
|
|
|
+ this.validate();
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
getValue = () => {
|
|
@@ -212,36 +244,90 @@ export default class CustomInput extends Component {
|
|
|
};
|
|
|
|
|
|
validate = (cb = () => {}) => {
|
|
|
- const errors = [];
|
|
|
- const info = dictionary[this.props.type];
|
|
|
- const value = this.state.value;
|
|
|
- if (!isLength(value, info.minLength, info.maxLength)) errors.push((info.errors.length) ? info.errors.length : t("general:valueMustBeBetween", { min: info.minLength, max: info.maxLength }));
|
|
|
- if (info.regex && !info.regex.test(value)) errors.push(info.errors.format);
|
|
|
- this.setState({
|
|
|
- errors,
|
|
|
- valid: errors.length === 0,
|
|
|
- }, cb);
|
|
|
+ if (!this.state.isRadio) {
|
|
|
+ const errors = [];
|
|
|
+ const info = dictionary[this.props.type];
|
|
|
+ const value = this.state.value;
|
|
|
+ if (!isLength(value, info.minLength, info.maxLength)) errors.push((info.errors.length) ? info.errors.length : t("general:valueMustBeBetween", {
|
|
|
+ min: info.minLength,
|
|
|
+ max: info.maxLength
|
|
|
+ }));
|
|
|
+ if (info.regex && !info.regex.test(value)) errors.push(info.errors.format);
|
|
|
+ this.setState({
|
|
|
+ errors,
|
|
|
+ valid: errors.length === 0,
|
|
|
+ }, cb);
|
|
|
+ } else {
|
|
|
+ this.setState({
|
|
|
+ valid: this.state.value !== null,
|
|
|
+ }, cb);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
+ componentWillMount() {
|
|
|
+ if (this.props.original) {
|
|
|
+ this.setValue(this.props.original, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ componentDidUpdate(prevProps, prevState) {
|
|
|
+ if (this.props.original !== prevProps.original) {
|
|
|
+ this.setValue(this.props.original, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
- const ElementType = (!this.state.isTextarea) ? "input" : "textarea";
|
|
|
-
|
|
|
- return (
|
|
|
- <label htmlFor={ this.props.name }>
|
|
|
- {(this.props.showLabel) ? <span>{ this.props.label }</span> : null}
|
|
|
- <ElementType
|
|
|
- placeholder={ this.props.placeholder }
|
|
|
- type={ this.state.inputType }
|
|
|
- name={ this.props.name }
|
|
|
- value={ this.state.value }
|
|
|
- className={ (this.state.errors.length > 0) ? "has-validation-errors" : "" }
|
|
|
- onBlur={ this.onBlur }
|
|
|
- onFocus={ this.onFocus }
|
|
|
- onChange={ this.onChange }
|
|
|
- ref={ (input) => this.inputElement = input }
|
|
|
- />
|
|
|
- { this.listErrors() }
|
|
|
- </label>
|
|
|
- );
|
|
|
+ if (this.state.isTextarea || this.state.isInput) {
|
|
|
+ const ElementType = (this.state.isInput) ? "input" : "textarea";
|
|
|
+
|
|
|
+ return (
|
|
|
+ <label htmlFor={this.props.name}>
|
|
|
+ {(this.props.showLabel) ? <span>{this.props.label}</span> : null}
|
|
|
+ <ElementType
|
|
|
+ placeholder={this.props.placeholder}
|
|
|
+ type={this.state.inputType}
|
|
|
+ name={this.props.name}
|
|
|
+ value={this.state.value}
|
|
|
+ className={(this.state.errors.length > 0) ? "has-validation-errors" : ""}
|
|
|
+ onBlur={this.onBlur}
|
|
|
+ onFocus={this.onFocus}
|
|
|
+ onChange={this.onChange}
|
|
|
+ ref={(input) => this.inputElement = input}
|
|
|
+ />
|
|
|
+ {this.listErrors()}
|
|
|
+ </label>
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ let optionsArr = this.state.options.map((option) => {
|
|
|
+ let checked = option.value === this.state.value;
|
|
|
+ return (
|
|
|
+ <label key={ option.value }>
|
|
|
+ <input type="radio" name={ this.props.type } value={ option.value } checked={ checked } onChange={ this.onChange }/>
|
|
|
+ <span>{ option.text }</span>
|
|
|
+ </label>
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ return (
|
|
|
+ <label htmlFor={this.props.name}>
|
|
|
+ {(this.props.showLabel) ? <span>{this.props.label}</span> : null}
|
|
|
+ <div>
|
|
|
+ { optionsArr }
|
|
|
+ {/*<ElementType
|
|
|
+ placeholder={this.props.placeholder}
|
|
|
+ type={this.state.inputType}
|
|
|
+ name={this.props.name}
|
|
|
+ value={this.state.value}
|
|
|
+ className={(this.state.errors.length > 0) ? "has-validation-errors" : ""}
|
|
|
+ onBlur={this.onBlur}
|
|
|
+ onFocus={this.onFocus}
|
|
|
+ onChange={this.onChange}
|
|
|
+ ref={(input) => this.inputElement = input}
|
|
|
+ />*/}
|
|
|
+ </div>
|
|
|
+ {this.listErrors()}
|
|
|
+ </label>
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|
|
|
}
|