EN · DE · RU · FR · ES

#2590: index.jsx

projectforge-webapp/src/components/base/dynamicLayout/components/select/task/index.jsx Type : JavaScript/React · Rôle : Tâche · Source : projectforge-webapp/src/components/base/dynamicLayout/components/select/task/index.jsx 215 lignes · 189 code · 5 commentaires · 21 vides
Composant React select/dropdown pour choisir des entités avec chargement asynchrone et auto-complétion.

Structure du code

Hooks utilisés : Context, State, State, State, State, Ref, ClickOutsideHandler, Effect, Effect, Memo

Importations depuis : ../../../../../../containers/panel/favorite/FavoritesPanel, ../../../../../../containers/panel/task/TaskTreePanel, ../../../../../../utilities/hooks, ../../../../../../utilities/rest, ../../../../../design, ../../../../../design/input/Input.module.scss, ../../../context, ./TaskPath, ./TaskSelect.module.scss, @fortawesome/free-solid-svg-icons, @fortawesome/react-fontawesome, prop-types, react, reactstrap

Possède PropTypes pour : DynamicTaskSelect

Utilise les modules CSS pour le style.

Code source (abrégé)

import { faBarsStaggered, faChevronDown } from '@fortawesome/free-solid-svg-icons';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import PropTypes from 'prop-types';
import React from 'react';
import { UncontrolledTooltip } from 'reactstrap';
import FavoritesPanel from '../../../../../../containers/panel/favorite/FavoritesPanel';
import TaskTreePanel from '../../../../../../containers/panel/task/TaskTreePanel';
import { useClickOutsideHandler } from '../../../../../../utilities/hooks';
import { getServiceURL, handleHTTPErrors } from '../../../../../../utilities/rest';
import { Button, Collapse } from '../../../../../design';
import inputStyle from '../../../../../design/input/Input.module.scss';
import { DynamicLayoutContext } from '../../../context';
import TaskPath from './TaskPath';
import taskStyle from './TaskSelect.module.scss';

function DynamicTaskSelect(
    {
        id,
        label,
        onKost2Changed,
        showRootForAdmins = false,
    },
) {
    const {
        setData, ui, variables, setVariables,
    } = React.useContext(DynamicLayoutContext);

    const [panelVisible, setPanelVisible] = React.useState(false);
    const [modalHighlight, setModalHighlight] = React.useState(undefined);
    const [task, setStateTask] = React.useState(undefined);
    const [favorites, setFavorites] = React.useState(undefined);
    const panelRef = React.useRef(null);

    // Gestion des événements de souris
    useClickOutsideHandler(panelRef, () => setPanelVisible(false), panelVisible);

    const fetchFavorites = (action, params = {}, callback = setFavorites) => fetch(
        getServiceURL(`task/favorites/${action}`, params),
        {
            method: 'GET',
            credentials: 'include',
            headers: {
                Accept: 'application/json',
            },
        },
    )
        .then(handleHTTPErrors)
        .then((response) => response.json())
        .then(callback)
        .catch((error) => alert(`Erreur interne : ${error}`));

    // Récupération initiale
    React.useEffect(() => {
        fetchFavorites('list');
    }, []);

    React.useEffect(() => {
        if (variables.task) {
            setStateTask(variables.task);
        }
    }, [setStateTask, variables]);

    return React.useMemo(() => {
        const setTask = (taskId, selectedTask) => {
            if (selectedTask) {
                setPanelVisible(false);
            }

            if (!taskId) {
                setStateTask(undefined);
                setData({ [id]: undefined });

                // Déclencher le gestionnaire onKost2Changed s'il est défini.
                if (onKost2Changed) {
                    onKost2Changed();
                }

                setModalHighlight(undefined);

                return;
            }

            fetch(
                getServiceURL(`task/info/${taskId}`),
                {
                    method: 'GET',
                    credentials: 'include',
                    headers: {
                        Accept: 'application/json',
                    },
                },
            )
                .then(handleHTTPErrors)
                .then((response) => response.json())
                .then((json) => {
                    setStateTask(json);

                    if (json) {
                        setData({ [id]: { id: json.id } });
                        setVariables({
                            ...variables,
                            task: json,
                        });
                        if (onKost2Changed) {
                            onKost2Changed(json.kost2List);
                        }

                        setStateTask(json);
                    }
                });
        };

        const handleFavoriteCreate = (name) => {
            if (task) {
                fetchFavorites('create', {
                    name,
                    taskId: task.id,
                });
            }
        };
// ... (tronqué, total 214 lignes)

Historique Git

3685edd6c mise à niveau vers react 18 wip
a0c602b8c Édition de feuille de temps : infobulle pour l'étoile de tâche favorite ajoutée.
06a8f9eaa Plus de fonctionnalités dans le nouveau calendrier (rafraîchissement, lien vers la liste des calendriers, infobulles, ...)
03060e7ba Édition de feuille de temps : mise à jour de la barre de consommation après changement de tâche sélectionnée.
38329872e Favoris améliorés (infobulles ajoutées, icônes améliorées, ...)