WEB APP: "P8PTable" - поддержка подсказок для колонок таблицы

This commit is contained in:
Mikhail Chechnev 2023-10-20 22:29:21 +03:00
parent 361f2b8881
commit 4d32c51d4a

View File

@ -30,7 +30,8 @@ import {
Button, Button,
TextField, TextField,
Chip, Chip,
Container Container,
Link
} from "@mui/material"; //Интерфейсные компоненты } from "@mui/material"; //Интерфейсные компоненты
import { P8PAppInlineError } from "./p8p_app_message"; //Встраиваемое сообщение об ошибке import { P8PAppInlineError } from "./p8p_app_message"; //Встраиваемое сообщение об ошибке
@ -231,6 +232,28 @@ P8PTableColumnMenu.propTypes = {
onItemClick: PropTypes.func onItemClick: PropTypes.func
}; };
//Диалог подсказки
const P8PTableColumnHintDialog = ({ columnDef, okBtnCaption, onOk }) => {
return (
<Dialog open={true} aria-labelledby="filter-dialog-title" aria-describedby="filter-dialog-description" onClose={() => (onOk ? onOk() : null)}>
<DialogTitle id="filter-dialog-title">{columnDef.caption}</DialogTitle>
<DialogContent>
<div dangerouslySetInnerHTML={{ __html: columnDef.hint }}></div>
</DialogContent>
<DialogActions>
<Button onClick={() => (onOk ? onOk() : null)}>{okBtnCaption}</Button>
</DialogActions>
</Dialog>
);
};
//Контроль свойств - Диалог подсказки
P8PTableColumnHintDialog.propTypes = {
columnDef: PropTypes.object.isRequired,
okBtnCaption: PropTypes.string.isRequired,
onOk: PropTypes.func
};
//Диалог фильтра //Диалог фильтра
const P8PTableColumnFilterDialog = ({ const P8PTableColumnFilterDialog = ({
columnDef, columnDef,
@ -440,9 +463,15 @@ const P8PTable = ({
//Собственное состояние - развёрнутые строки //Собственное состояние - развёрнутые строки
const [expanded, setExpanded] = useState({}); const [expanded, setExpanded] = useState({});
//Собственное состояние - колонка с отображаемой подсказкой
const [displayHintColumn, setDisplayHintColumn] = useState(null);
//Описание фильтруемой колонки //Описание фильтруемой колонки
const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null; const filterColumnDef = filterColumn ? columnsDef.find(columnDef => columnDef.name == filterColumn) || null : null;
//Описание колонки с отображаемой подсказкой
const displayHintColumnDef = displayHintColumn ? columnsDef.find(columnDef => columnDef.name == displayHintColumn) || null : null;
//Значения фильтра фильтруемой колонки //Значения фильтра фильтруемой колонки
const [filterColumnFrom, filterColumnTo] = filterColumn const [filterColumnFrom, filterColumnTo] = filterColumn
? (() => { ? (() => {
@ -528,6 +557,12 @@ const P8PTable = ({
if (onPagesCountChanged) onPagesCountChanged(); if (onPagesCountChanged) onPagesCountChanged();
}; };
//Отработка нажатия на элемент отображения подсказки по колонке
const handleColumnShowHintClick = columnName => setDisplayHintColumn(columnName);
//Отработка сокрытия подсказки по колонке
const handleHintOk = () => setDisplayHintColumn(null);
//Отработка нажатия на кнопку раскрытия элемента //Отработка нажатия на кнопку раскрытия элемента
const handleExpandClick = rowIndex => { const handleExpandClick = rowIndex => {
if (expanded[rowIndex] === true) if (expanded[rowIndex] === true)
@ -547,6 +582,9 @@ const P8PTable = ({
//Генерация содержимого //Генерация содержимого
return ( return (
<> <>
{displayHintColumn ? (
<P8PTableColumnHintDialog columnDef={displayHintColumnDef} okBtnCaption={okFilterBtnCaption} onOk={handleHintOk} />
) : null}
{filterColumn ? ( {filterColumn ? (
<P8PTableColumnFilterDialog <P8PTableColumnFilterDialog
columnDef={filterColumnDef} columnDef={filterColumnDef}
@ -596,7 +634,21 @@ const P8PTable = ({
sx={{ ...STYLES.TABLE_COLUMN_STACK, ...customRender.stackStyle }} sx={{ ...STYLES.TABLE_COLUMN_STACK, ...customRender.stackStyle }}
{...customRender.stackProps} {...customRender.stackProps}
> >
{customRender.data ? customRender.data : columnDef.caption} {customRender.data ? (
customRender.data
) : columnDef.hint ? (
<Link
component="button"
variant="body2"
align="left"
underline="always"
onClick={() => handleColumnShowHintClick(columnDef.name)}
>
{columnDef.caption}
</Link>
) : (
columnDef.caption
)}
<P8PTableColumnToolBar <P8PTableColumnToolBar
columnDef={columnDef} columnDef={columnDef}
orders={orders} orders={orders}