123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /* eslint-disable no-nested-ternary */
- import React, { PureComponent } from 'react';
- import classnames from 'classnames';
- import PropTypes from 'prop-types';
- import { noop } from 'lodash';
- import { checkboxClasses as css } from '@douyinfe/semi-foundation/checkbox/constants';
- import { Context } from './context';
- import { IconCheckboxTick, IconCheckboxIndeterminate } from '@douyinfe/semi-icons';
- export interface CheckboxInnerProps {
- 'aria-describedby'?: React.AriaAttributes['aria-describedby'];
- 'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
- 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
- 'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
- 'aria-required'?: React.AriaAttributes['aria-required'];
- indeterminate?: boolean;
- checked?: boolean;
- disabled?: boolean;
- prefixCls?: string;
- name?: string;
- isPureCardType?: boolean;
- ref?: React.MutableRefObject<CheckboxInner> | ((ref: CheckboxInner) => void);
- addonId?: string;
- extraId?: string;
- 'aria-label'?: React.AriaAttributes['aria-label'];
- focusInner?: boolean;
- onInputFocus?: (e: any) => void;
- onInputBlur?: (e: any) => void;
- preventScroll?: boolean;
- }
- class CheckboxInner extends PureComponent<CheckboxInnerProps> {
- static contextType = Context;
- static propTypes = {
- 'aria-describedby': PropTypes.string,
- 'aria-errormessage': PropTypes.string,
- 'aria-invalid': PropTypes.bool,
- 'aria-labelledby': PropTypes.string,
- 'aria-required': PropTypes.bool,
- checked: PropTypes.bool,
- disabled: PropTypes.bool,
- onChange: PropTypes.func,
- children: PropTypes.node,
- grouped: PropTypes.bool,
- value: PropTypes.any,
- isPureCardType: PropTypes.bool,
- addonId: PropTypes.string,
- extraId: PropTypes.string,
- focusInner: PropTypes.bool,
- onInputFocus: PropTypes.func,
- onInputBlur: PropTypes.func,
- preventScroll: PropTypes.bool,
- };
- static defaultProps = {
- onChange: noop,
- };
- inputEntity: HTMLInputElement;
- blur() {
- this.inputEntity.blur();
- }
- focus() {
- const { preventScroll } = this.props;
- this.inputEntity.focus({ preventScroll });
- }
- render() {
- const { indeterminate, checked, disabled, prefixCls, name, isPureCardType, addonId, extraId, focusInner, onInputFocus, onInputBlur } = this.props;
- const prefix = prefixCls || css.PREFIX;
- const wrapper = classnames(
- {
- [`${prefix}-inner`]: true,
- [`${prefix}-inner-checked`]: Boolean(checked),
- [`${prefix}-inner-pureCardType`]: isPureCardType,
- },
- css.WRAPPER
- );
- const inner = classnames({
- [`${prefix}-inner-display`]: true,
- [`${prefix}-focus`]: focusInner,
- [`${prefix}-focus-border`]: focusInner && !checked,
- });
- const icon = checked ? (
- <IconCheckboxTick />
- ) : indeterminate ? (
- <IconCheckboxIndeterminate />
- ) : null;
- const inputProps: React.InputHTMLAttributes<HTMLInputElement> = {
- type: "checkbox",
- 'aria-label': this.props['aria-label'],
- 'aria-disabled': disabled,
- 'aria-checked': checked,
- 'aria-labelledby': addonId,
- 'aria-describedby': extraId || this.props['aria-describedby'],
- 'aria-invalid': this.props['aria-invalid'],
- 'aria-errormessage': this.props['aria-errormessage'],
- 'aria-required': this.props['aria-required'],
- className: css.INPUT,
- onChange: noop,
- checked: checked,
- disabled: disabled,
- onFocus: onInputFocus,
- onBlur: onInputBlur,
- };
-
- name && (inputProps['name'] = name);
- return (
- <span className={wrapper}>
- <input
- {...inputProps}
- ref={ref => {
- this.inputEntity = ref;
- }}
- />
- <span className={inner}>{icon}</span>
- </span>
- );
- }
- }
- export default CheckboxInner;
|