form-control.tsx 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import React, { forwardRef } from 'react'
  2. import { Form, FormControlProps as BS5FormControlProps } from 'react-bootstrap'
  3. import classnames from 'classnames'
  4. export type OLBS5FormControlProps = BS5FormControlProps & {
  5. prepend?: React.ReactNode
  6. append?: React.ReactNode
  7. rows?: number
  8. }
  9. const FormControl = forwardRef<HTMLInputElement, OLBS5FormControlProps>(
  10. ({ prepend, append, className, ...props }, ref) => {
  11. if (prepend || append) {
  12. const wrapperClassNames = classnames('form-control-wrapper', {
  13. 'form-control-wrapper-sm': props.size === 'sm',
  14. 'form-control-wrapper-lg': props.size === 'lg',
  15. 'form-control-wrapper-disabled': props.disabled,
  16. })
  17. const formControlClassNames = classnames(className, {
  18. 'form-control-offset-start': prepend,
  19. 'form-control-offset-end': append,
  20. })
  21. return (
  22. <div className={wrapperClassNames}>
  23. {prepend && (
  24. <span className="form-control-start-icon">{prepend}</span>
  25. )}
  26. <Form.Control
  27. {...props}
  28. className={formControlClassNames}
  29. ref={ref}
  30. />
  31. {append && <span className="form-control-end-icon">{append}</span>}
  32. </div>
  33. )
  34. }
  35. return <Form.Control ref={ref} className={className} {...props} />
  36. }
  37. )
  38. FormControl.displayName = 'FormControl'
  39. export default FormControl