dbl-components
Version:
Framework based on bootstrap 5
121 lines (105 loc) • 3.74 kB
JSX
import React from "react";
import PropTypes from "prop-types";
import { eventHandler } from "dbl-utils";
import JsonRender from "../../json-render";
import Field from "./field";
import NoWrapField from "./no-wrap-field";
//TODO: al cambiar parpadea la validación o.O
export default class NewPasswordField extends Field {
static jsClass = 'NewPasswordField';
static propTypes = {
...Field.propTypes,
labelRepeat: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
placeholderRepeat: PropTypes.string,
dividerClasses: PropTypes.string,
patterns: PropTypes.arrayOf(PropTypes.shape({
pattern: PropTypes.string,
errorMessage: PropTypes.string
})),
mutations: PropTypes.func
}
static defaultProps = {
...Field.defaultProps,
dividerClasses: 'mb-3'
}
constructor(props) {
super(props);
const { mutations, ...jProps } = props;
this.jsonRender = new JsonRender(jProps, mutations);
}
get type() {
return 'password';
}
componentDidMount() {
super.componentDidMount();
eventHandler.subscribe(`${this.props.name}-repeat`, this.onUpdateRepeat, this.unique);
}
componentWillUnmount() {
super.componentWillUnmount();
eventHandler.unsubscribe(`${this.props.name}-repeat`, this.unique);
}
returnData(value = this.state.value, valueRepeat = this.state.valueRepeat) {
if (value === valueRepeat) super.returnData(value);
}
onUpdateRepeat = (data) => {
this.setState(
{ valueRepeat: data[this.props.name + '-repeat'] },
() => !this.isInvalid() && this.returnData()
);
}
isInvalid(value = this.state.value, valueRepeat = this.state.valueRepeat) {
const error = super.isInvalid(value);
const diff = (value !== valueRepeat);
eventHandler.dispatch(`update.${this.props.name}-repeat`, { error: diff });
return error;
}
get errorMessageNode() {
const { errorMessage: em, patterns } = this.props;
const { error, value } = this.state;
if (!error && !errorMessage || !patterns) return false;
const errorMessage = !patterns ? [em] : [
em, React.createElement('ul', {},
...Object.entries(patterns)
.map(([k, { pattern, errorMessage }]) => !value.match(pattern)
&& <li>{this.jsonRender.buildContent(errorMessage)}</li>)
.filter(p => !!p))
];
const errorNode = React.createElement('div', { className: "m-1 lh-1" },
React.createElement('small', { className: "text-danger" },
...errorMessage
)
);
return errorNode;
}
content(children = this.props.children) {
const { labelRepeat, placeholderRepeat, name,
errorMessageRepeat, dividerClasses, inlineFields } = this.props;
const cloneFieldProps = {
...this.props,
name: name + '-repeat',
type: this.type,
label: labelRepeat,
placeholder: placeholderRepeat,
errorMessage: errorMessageRepeat,
required: true
};
return inlineFields
? React.createElement('div', { className: "row" },
React.createElement('div', { className: "col" },
super.content(false)
),
React.createElement('div', { className: "col" },
React.createElement(NoWrapField, { ...cloneFieldProps })
),
React.createElement('div', { className: "col-12" },
children
)
)
: React.createElement(React.Fragment, {},
super.content(false),
React.createElement('div', { className: dividerClasses }),
React.createElement(NoWrapField, { ...cloneFieldProps }),
children
);
}
};