forked from CITKParus/P8-Panels
WEBAPP+Документация: Примеры и документация P8PIndicator
This commit is contained in:
parent
416eae7d88
commit
e4683cf991
55
README.md
55
README.md
@ -2941,6 +2941,61 @@ export { Cyclogram };
|
|||||||
|
|
||||||
Полные актуальные исходные коды примеров можно увидеть в "db/PKG_P8PANELS_SAMPLES.pck" и "app/panels/samples/cyclogram.js" данного репозитория соответственно.
|
Полные актуальные исходные коды примеров можно увидеть в "db/PKG_P8PANELS_SAMPLES.pck" и "app/panels/samples/cyclogram.js" данного репозитория соответственно.
|
||||||
|
|
||||||
|
##### Индикатор "P8PIndicator"
|
||||||
|
|
||||||
|
Компонент предназначен для отображения данных в виде индикатора. Поддерживается:
|
||||||
|
|
||||||
|
- Цветовая индикация предопределёнными цветами в зависимости от состояния (не определено, позитивное, негативное, пограничное)
|
||||||
|
- Цветовая индикация пользовательскими цветами
|
||||||
|
- Обработка нажатий
|
||||||
|
- Отображение иконки
|
||||||
|
- Упрвление внешним видом (парение, рамка)
|
||||||
|
- Интерактивные подсказки
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**Подключение**
|
||||||
|
|
||||||
|
Клиентская часть индикатора реализована в компоненте `P8PIndicator`, объявленном в "app/components/p8p_indicator". Для использования компонента на панели его необходимо импортировать:
|
||||||
|
|
||||||
|
```
|
||||||
|
import { P8PIndicator } from "../../components/p8p_indicator";
|
||||||
|
|
||||||
|
const MyPanel = () => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<P8PIndicator .../>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Свойства**
|
||||||
|
|
||||||
|
`caption` - обязательный, строка, подпись индикатора\
|
||||||
|
`value` - обязательный, строка, значение индикатора\
|
||||||
|
`icon` - необязательный, строка, код иконки индикатора из символов шрифта [Google Material Icons](https://fonts.google.com/icons?icon.set=Material+Icons) (по умолчанию - не указана, если указана - отображается в левой части области индикатора)\
|
||||||
|
`state` - необязательный, строка, состояние индикатора, принимает значения `UNDEFINED|OK|ERR|WARN` (по умолчанию - `UNDEFINED`, см. константу `P8P_INDICATOR_STATE` в исходном коде компонента), определяет цвет заливки индикатора, если не указаны пользовательские цвета (см. ниже свойства `backgroundColor`и`color`)\
|
||||||
|
`square` - необязательный, логический, определяет необходимость скругления углов области индикатора (по умолчанию - `false`)\
|
||||||
|
`elevation` - необязательный, число, высота парения индикатора (по умолчанию - 3, используется только при `variant = 'elevation'`)\
|
||||||
|
`variant` - необязательный, строка, вариант исполнения, принимает значения `elevation|outlined` (по умолчанию - `elevation`, см. константу `P8P_INDICATOR_VARIANT` в исходном коде компонента), определяет внешний вид индикатора - парящая область или область с рамкой\
|
||||||
|
`hint` - необязательный, строка, текст подсказки для индикатора (если указан - слева от значения индикатора формируется кнопка открытия диалога с текстом подсказки, поддерживается HTML-форматирование)\
|
||||||
|
`onClick` - необязательный, функция, будет вызвана при нажатии пользователем на индикатор (если указана - индикатор формируется в виде кнопки), сигнатура функции `f()`, результат функции не интерпретируется\
|
||||||
|
`backgroundColor` - необязательный, строка, HTML-код пользовательского цвета фона, если указан - будет использован (вне зависимости от `state`) для заливки области индикатора (по умолчанию - не указан) \
|
||||||
|
`color` - необязательный, строка, HTML-код пользовательского цвета шрифта, если указан - будет использован (вне зависимости от `state`) для значения, подписи и иконки индикатора (по умолчанию - не указан)
|
||||||
|
|
||||||
|
**API на сервере БД**
|
||||||
|
|
||||||
|
Компонент `P8PIndicator` требует от разработчика передачи данных в определённом формате. С целью снижения трудозатрат на приведение собранных хранимым объектом данных Системы к форматам, потребляемым `P8PIndicator`, реализован специальный API на стороне сервера БД.
|
||||||
|
|
||||||
|
Для индикатора это (см. детальные описания программных интерфейсов в пакете `PKG_P8PANELS_VISUAL`):
|
||||||
|
`PKG_P8PANELS_VISUAL.TINDICATOR_MAKE` - функция, инициализация индикатора, возвращает объект для хранения его описания\
|
||||||
|
`PKG_P8PANELS_VISUAL.TINDICATOR_TO_XML` - функция, производит сериализацию объекта, описывающего индикатор, в специальный XML-формат, корректно интерпретируемый клиентским компонентом `P8PIndicator` при передаче в WEB-приложение
|
||||||
|
|
||||||
|
**Пример**
|
||||||
|
|
||||||
|
Полный актуальный исходный код примера можно увидеть в "app/panels/samples/indicator.js" данного репозитория.
|
||||||
|
|
||||||
### Ограничения дизайна пользовательского интерфейса
|
### Ограничения дизайна пользовательского интерфейса
|
||||||
|
|
||||||
Фреймворк позволяет реализовать любые пользовательские интерфейсы, вёрстка которых не противоречит возможностям современного HTML. Тем не менее, при разработке пользовательских интерфейсов панелей важно придерживаться предложенных ниже правил. Это позволит создавать их в едином ключе и упростит работу конечного пользователя при их освоении.
|
Фреймворк позволяет реализовать любые пользовательские интерфейсы, вёрстка которых не противоречит возможностям современного HTML. Тем не менее, при разработке пользовательских интерфейсов панелей важно придерживаться предложенных ниже правил. Это позволит создавать их в едином ключе и упростит работу конечного пользователя при их освоении.
|
||||||
|
156
app/panels/samples/indicator.js
Normal file
156
app/panels/samples/indicator.js
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга - Примеры для разработчиков
|
||||||
|
Пример: Индикатор "P8PIndicator"
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import React, { useContext } from "react"; //Классы React
|
||||||
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
|
import { Typography, Stack, Divider } from "@mui/material"; //Интерфейсные элементы
|
||||||
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
|
import { P8P_INDICATOR_VARIANT, P8P_INDICATOR_STATE, P8PIndicator } from "../../components/p8p_indicator"; //Индикатор
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Стили
|
||||||
|
const STYLES = {
|
||||||
|
CONTAINER: { textAlign: "center", paddingTop: "20px" },
|
||||||
|
TITLE: { paddingBottom: "15px" },
|
||||||
|
DIVIDER: { margin: "15px" }
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------
|
||||||
|
//Тело модуля
|
||||||
|
//-----------
|
||||||
|
|
||||||
|
//Пример: Индикатор "P8PIndicator"
|
||||||
|
const Indicator = ({ title }) => {
|
||||||
|
//Подключение к контексту сообщений
|
||||||
|
const { showMsgInfo } = useContext(MessagingСtx);
|
||||||
|
|
||||||
|
//Генерация содержимого
|
||||||
|
return (
|
||||||
|
<div style={STYLES.CONTAINER}>
|
||||||
|
<Typography sx={STYLES.TITLE} variant={"h6"}>
|
||||||
|
{title}
|
||||||
|
</Typography>
|
||||||
|
<Divider>Иконка</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{/* Индикатор (без иконки) */}
|
||||||
|
<P8PIndicator caption={"Без иконки"} value={10} />
|
||||||
|
{/* Индикатор (с иконкой 1) */}
|
||||||
|
<P8PIndicator caption={"С иконкой - Back Hand"} value={20} icon={"back_hand"} />
|
||||||
|
{/* Индикатор (с иконкой 2) */}
|
||||||
|
<P8PIndicator caption={"С иконкой - Scoreboard"} value={30} icon={"scoreboard"} />
|
||||||
|
</Stack>
|
||||||
|
<Divider>Состояние</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{/* Индикатор (нейтральный) */}
|
||||||
|
<P8PIndicator caption={"Нейтральное состояние"} value={10} icon={"sentiment_neutral"} />
|
||||||
|
{/* Индикатор (позитивный) */}
|
||||||
|
<P8PIndicator caption={"Позитивное состояние"} value={20} state={P8P_INDICATOR_STATE.OK} icon={"check_circle"} />
|
||||||
|
{/* Индикатор (пограничный) */}
|
||||||
|
<P8PIndicator caption={"Пограничное состояние"} value={30} state={P8P_INDICATOR_STATE.WARN} icon={"warning"} />
|
||||||
|
{/* Индикатор (негативный) */}
|
||||||
|
<P8PIndicator caption={"Негативное состояния"} value={40} state={P8P_INDICATOR_STATE.ERR} icon={"dangerous"} />
|
||||||
|
</Stack>
|
||||||
|
<Divider>Скругление</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{/* Индикатор (скругленный) */}
|
||||||
|
<P8PIndicator caption={"Скругленный"} />
|
||||||
|
{/* Индикатор (квадратный) */}
|
||||||
|
<P8PIndicator caption={"Квадрадтный"} square={true} />
|
||||||
|
</Stack>
|
||||||
|
<Divider>Парение</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{/* Индикатор (парение - 0) */}
|
||||||
|
<P8PIndicator caption={"Парение"} value={0} state={P8P_INDICATOR_STATE.OK} elevation={0} />
|
||||||
|
{/* Индикатор (парение - 3) */}
|
||||||
|
<P8PIndicator caption={"Парение (по умолчанию)"} value={3} state={P8P_INDICATOR_STATE.WARN} elevation={3} />
|
||||||
|
{/* Индикатор (парение - 6) */}
|
||||||
|
<P8PIndicator caption={"Парение"} value={6} state={P8P_INDICATOR_STATE.OK} elevation={6} />
|
||||||
|
{/* Индикатор (парение - 12) */}
|
||||||
|
<P8PIndicator caption={"Парение"} value={12} state={P8P_INDICATOR_STATE.OK} elevation={12} />
|
||||||
|
{/* Индикатор (парение - 18) */}
|
||||||
|
<P8PIndicator caption={"Парение"} value={18} state={P8P_INDICATOR_STATE.OK} elevation={18} />
|
||||||
|
</Stack>
|
||||||
|
<Divider>Исполнение</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{/* Индикатор (парение) */}
|
||||||
|
<P8PIndicator caption={"Парящий (по умолчанию)"} value={123} />
|
||||||
|
{/* Индикатор (рамка) */}
|
||||||
|
<P8PIndicator caption={"Рамка"} value={321} variant={P8P_INDICATOR_VARIANT.OUTLINED} />
|
||||||
|
</Stack>
|
||||||
|
<Divider>Подсказка</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{/* Индикатор (подсказка без форматирования) */}
|
||||||
|
<P8PIndicator
|
||||||
|
caption={"Подсказка (без форматирования)"}
|
||||||
|
value={42}
|
||||||
|
icon={"desktop_windows"}
|
||||||
|
hint={"Ответ на главный вопрос жизни, вселенной и всего такого..."}
|
||||||
|
/>
|
||||||
|
{/* Индикатор (подсказка с форматирование) */}
|
||||||
|
<P8PIndicator
|
||||||
|
caption={"Подсказка (с форматированием)"}
|
||||||
|
value={3.14}
|
||||||
|
icon={"radio_button_unchecked"}
|
||||||
|
hint={`Математическая <b>постоянная</b>, равная <b style='color:red'>отношению</b> <b style='color:green'>длины окружности</b>
|
||||||
|
к её <b style='color:blue'>диаметру</b>:
|
||||||
|
<p style='text-align: center'>π = <span style='color:green'>L</span>/<span style='color:blue'>d</span></p>`}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
<Divider>Активность</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{[P8P_INDICATOR_STATE.UNDEFINED, P8P_INDICATOR_STATE.OK, P8P_INDICATOR_STATE.WARN, P8P_INDICATOR_STATE.ERR].map(
|
||||||
|
(indicatorState, i) => (
|
||||||
|
<P8PIndicator
|
||||||
|
key={i}
|
||||||
|
caption={`Нажми на меня #${i + 1}`}
|
||||||
|
value={i + 1}
|
||||||
|
state={indicatorState}
|
||||||
|
icon={"chat"}
|
||||||
|
onClick={() => showMsgInfo(`Нажатие на индикатор #${i + 1}`)}
|
||||||
|
hint={`Подсказка индикатора #${i + 1}`}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</Stack>
|
||||||
|
<Divider>Пользовательские цвета</Divider>
|
||||||
|
<Stack direction={"row"} spacing={2} p={5}>
|
||||||
|
{[
|
||||||
|
["yellow", "black"],
|
||||||
|
["darkred", "yellow"],
|
||||||
|
["orange", "darkblue"],
|
||||||
|
["magenta", "darkmagenta"]
|
||||||
|
].map((userColor, i) => (
|
||||||
|
<P8PIndicator
|
||||||
|
key={i}
|
||||||
|
caption={`Текст: ${userColor[0]}, Заливка: ${userColor[1]}`}
|
||||||
|
value={i + 1}
|
||||||
|
state={P8P_INDICATOR_STATE.WARN}
|
||||||
|
icon={"palette"}
|
||||||
|
color={userColor[0]}
|
||||||
|
backgroundColor={userColor[1]}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</Stack>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
//Контроль свойств - Пример: Индикатор "P8PIndicator"
|
||||||
|
Indicator.propTypes = {
|
||||||
|
title: PropTypes.string.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export { Indicator };
|
@ -19,6 +19,7 @@ import { Chart } from "./chart"; //Пример: Графики "P8PChart"
|
|||||||
import { Gantt } from "./gantt"; //Пример: Диаграмма Ганта "P8PGantt"
|
import { Gantt } from "./gantt"; //Пример: Диаграмма Ганта "P8PGantt"
|
||||||
import { Svg } from "./svg"; //Пример: Интерактивные изображения "P8PSVG"
|
import { Svg } from "./svg"; //Пример: Интерактивные изображения "P8PSVG"
|
||||||
import { Cyclogram } from "./cyclogram"; //Пример: Циклограмма "P8PCyclogram"
|
import { Cyclogram } from "./cyclogram"; //Пример: Циклограмма "P8PCyclogram"
|
||||||
|
import { Indicator } from "./indicator"; //Пример: Индикатор "P8PIndicator"
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -34,7 +35,8 @@ const MODES = {
|
|||||||
CHART: { name: "CHART", caption: 'Графики "P8PChart"', component: Chart },
|
CHART: { name: "CHART", caption: 'Графики "P8PChart"', component: Chart },
|
||||||
GANTT: { name: "GANTT", caption: 'Диаграмма Ганта "P8PGantt"', component: Gantt },
|
GANTT: { name: "GANTT", caption: 'Диаграмма Ганта "P8PGantt"', component: Gantt },
|
||||||
SVG: { name: "SVG", caption: 'Интерактивные изображения "P8PSVG"', component: Svg },
|
SVG: { name: "SVG", caption: 'Интерактивные изображения "P8PSVG"', component: Svg },
|
||||||
CYCLOGRAM: { name: "CYCLOGRAM", caption: 'Циклограмма "P8PCyclogram"', component: Cyclogram }
|
CYCLOGRAM: { name: "CYCLOGRAM", caption: 'Циклограмма "P8PCyclogram"', component: Cyclogram },
|
||||||
|
INDICATOR: { name: "INDICATOR", caption: 'Индикатор "P8PIndicator"', component: Indicator }
|
||||||
};
|
};
|
||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
|
Binary file not shown.
BIN
docs/img/74.png
Normal file
BIN
docs/img/74.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 145 KiB |
Loading…
x
Reference in New Issue
Block a user