EN · DE · RU · FR · ES

#2664 : index.jsx

projectforge-webapp/src/components/design/input/index.jsx Type : JavaScript/React · Rôle : Composant · Source : projectforge-webapp/src/components/design/input/index.jsx 146 lignes · 132 code · 2 commentaires · 12 vides
Composant React pour la fonctionnalité de saisie de l'application web ProjectForge.

Structure du code

Hooks utilisés : Ref, Ref, State, LayoutEffect

Importations depuis : ../../../utilities/propTypes, ../TooltipIcon, ./Input.module.scss, @fortawesome/react-fontawesome, classnames, prop-types, react, reactstrap/lib/UncontrolledTooltip

Possède des PropTypes pour : Input

Utilise les modules CSS pour le style.

Code source (abrégé)

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,
) => {
    // Initialisation de inputRef
    let inputRef = React.useRef(null);
    const labelRef = React.useRef(null);

    // Remplacement de ref par la ref transmise
    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}
// ... (tronqué, total 146 lignes)

Historique Git

3685edd6c migration vers react 18 wip
5f2fb5f29 React : étrange : si value vaut 0, alors l'expression value || xxx ne fonctionne pas, car 0 === false !
e454662ce input/index.jsx : utilise désormais String.idify pour l'infobulle (nécessaire pour AttachmentPagesRest : attachment.password).
36bfe1dbe Nouvelle version de React, eslint revu par Fin.
c23bfbdf5 es-lint : révision avec Fin requise.