@plone/volto
Version:
Volto
105 lines (96 loc) • 2.45 kB
JSX
import { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import { Input } from 'semantic-ui-react';
import Icon from '@plone/volto/components/theme/Icon/Icon';
import FormFieldWrapper from '@plone/volto/components/manage/Widgets/FormFieldWrapper';
const TextWidget = (props) => {
const {
id,
value,
onChange,
onBlur,
onClick,
icon,
iconAction,
minLength,
maxLength,
placeholder,
isDisabled,
focus,
} = props;
const ref = useRef();
useEffect(() => {
if (focus) {
ref.current.focus();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<FormFieldWrapper {...props} className="text">
<Input
id={`field-${id}`}
name={id}
value={value || ''}
disabled={isDisabled}
icon={icon || null}
placeholder={placeholder}
onChange={({ target }) =>
onChange(id, target.value === '' ? undefined : target.value)
}
ref={ref}
onBlur={({ target }) =>
onBlur(id, target.value === '' ? undefined : target.value)
}
onClick={() => onClick()}
minLength={minLength || null}
maxLength={maxLength || null}
/>
{icon && iconAction && (
<button className={`field-${id}-action-button`} onClick={iconAction}>
<Icon name={icon} size="18px" />
</button>
)}
</FormFieldWrapper>
);
};
export default TextWidget;
TextWidget.propTypes = {
id: PropTypes.string.isRequired,
title: PropTypes.string.isRequired,
description: PropTypes.string,
required: PropTypes.bool,
error: PropTypes.arrayOf(PropTypes.string),
value: PropTypes.string,
focus: PropTypes.bool,
onChange: PropTypes.func,
onBlur: PropTypes.func,
onClick: PropTypes.func,
onEdit: PropTypes.func,
onDelete: PropTypes.func,
icon: PropTypes.shape({
xmlns: PropTypes.string,
viewBox: PropTypes.string,
content: PropTypes.string,
}),
iconAction: PropTypes.func,
minLength: PropTypes.number,
maxLength: PropTypes.number,
wrapped: PropTypes.bool,
placeholder: PropTypes.string,
};
TextWidget.defaultProps = {
description: null,
required: false,
error: [],
value: null,
onChange: () => {},
onBlur: () => {},
onClick: () => {},
onEdit: null,
onDelete: null,
focus: false,
icon: null,
iconAction: null,
minLength: null,
maxLength: null,
};