index.jsxИспользуемые хуки: Context, State, State, State, State, Ref, ClickOutsideHandler, Effect, Effect, Memo
Импорты из: ../../../../../../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
Имеет PropTypes для: DynamicTaskSelect
Использует CSS-модули для стилизации.
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);
// Обработка событий мыши
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(`Внутренняя ошибка: ${error}`));
// Первоначальная загрузка
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 });
// Вызвать обработчик onKost2Changed, если определён.
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,
});
}
};
// ... (сокращено, всего 214 строк)
3685edd6c переход на React 18 wip a0c602b8c Редактирование табеля: добавлена подсказка для звёздочки избранных задач. 06a8f9eaa Новые возможности в новом календаре (обновление, ссылка на список календарей, подсказки, ...) 03060e7ba Редактирование табеля: обновление индикатора потребления после изменения выбранной задачи. 38329872e Улучшены избранные (добавлены подсказки, улучшены иконки, ...)