EN · DE · RU · FR · ES

#2664: index.jsx

projectforge-webapp/src/components/design/input/index.jsx Тип: JavaScript/React · Роль: Компонент · Источник: projectforge-webapp/src/components/design/input/index.jsx 146 строк · 132 кода · 2 комментария · 12 пустых
React-компонент для функционала ввода веб-приложения ProjectForge.

Структура кода

Используемые хуки: Ref, Ref, State, LayoutEffect

Импорты из: ../../../utilities/propTypes, ../TooltipIcon, ./Input.module.scss, @fortawesome/react-fontawesome, classnames, prop-types, react, reactstrap/lib/UncontrolledTooltip

Имеет PropTypes для: Input

Использует CSS-модули для стилизации.

Исходный код (сокращён)

import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import UncontrolledTooltip from 'reactstrap/lib/UncontrolledTooltip';
import { colorPropType } from '../../../utilities/propTypes';
import TooltipIcon from '../TooltipIcon';
import styles from './Input.module.scss';

const Input = React.forwardRef((
    {
        additionalLabel,
        autoFocus = false,
        className,
        color,
        icon,
        iconProps,
        id,
        label,
        onBlur,
        onFocus,
        noStyle = false,
        selectOnFocus = false,
        tooltip,
        value,
        ...props
    },
    ref,
) => {
    // Инициализация inputRef
    let inputRef = React.useRef(null);
    const labelRef = React.useRef(null);

    // Переопределение ref переданным ref
    if (ref) {
        inputRef = ref;
    }

    const [isActive, setIsActive] = React.useState(false);

    const handleBlur = (event) => {
        if (onBlur) {
            onBlur(event);
        }

        setIsActive(false);
    };

    const handleFocus = (event) => {
        if (onFocus) {
            onFocus(event);
        }

        if (selectOnFocus) {
            setTimeout(() => {
                if (inputRef.current) {
                    inputRef.current.select();
                }
            }, 100);
        }

        setIsActive(true);
    };

    React.useLayoutEffect(() => {
        if (autoFocus && inputRef.current) {
            inputRef.current.focus();
        }
    }, [autoFocus]);

    return (
        <div
            className={classNames(
                styles.inputField,
                className,
                { [styles.noLabel]: !label },
            )}
        >
            <label
                className={classNames(
                    styles.inputContainer,
                    {
                        [styles.isActive]: value !== undefined || isActive,
                        [styles.withMargin]: !noStyle,
                        [styles.noStyle]: noStyle,
                    },
                    styles[color],
                )}
                htmlFor={id}
            >
                {icon && (
                    <FontAwesomeIcon
                        icon={icon}
                        {...iconProps}
                        className={classNames(styles.icon, iconProps && iconProps.className)}
                    />
                )}
                <input
                    ref={inputRef}
                    id={id}
                    {...props}
                    onBlur={handleBlur}
                    onFocus={handleFocus}
                    value={value}
                />
                <span
                    ref={labelRef}
                    className={styles.labelText}
                    id={`input-label-${String.idify(id)}`}
                >
                    {label}
                    {tooltip && <TooltipIcon />}
                </span>
            </label>
            {additionalLabel && (
                <span className={styles.additionalLabel}>{additionalLabel}</span>
            )}
            {tooltip && (
                <UncontrolledTooltip placement="auto" target={`input-label-${String.idify(id)}`}>
                    {tooltip}
// ... (сокращено, всего 146 строк)

История Git

3685edd6c поднятие до react 18 wip
5f2fb5f29 React: Странно: если value равно 0, то выражение value || xxx не работает, потому что 0 === false!
e454662ce input/index.jsx: теперь использует String.idify для подсказки (необходимо для AttachmentPagesRest: attachment.password).
36bfe1dbe Новая версия react, проверено eslint, Fin.
c23bfbdf5 es-lint: проверка с Fin обязательна.