diff --git a/app/panels/samples/chart.js b/app/panels/samples/chart.js
index d432d61..79218f0 100644
--- a/app/panels/samples/chart.js
+++ b/app/panels/samples/chart.js
@@ -22,8 +22,8 @@ import { ApplicationСtx } from "../../context/application"; //Контекст
const STYLES = {
CONTAINER: { textAlign: "center", paddingTop: "20px" },
TITLE: { paddingBottom: "15px" },
- CHART: { maxHeight: "500px", display: "flex", justifyContent: "center" },
- CHART_PAPER: { height: "100%", padding: "5px" }
+ CHART: { minWidth: "80vw", maxHeight: "80vw", display: "flex", justifyContent: "center" },
+ CHART_PAPER: { padding: "25px" }
};
//-----------
@@ -67,14 +67,12 @@ const Chart = ({ title }) => {
{title}
-
-
-
-
+
+
+
{chart.loaded ? : null}
-
);
diff --git a/app/panels/samples/gantt.js b/app/panels/samples/gantt.js
new file mode 100644
index 0000000..4883581
--- /dev/null
+++ b/app/panels/samples/gantt.js
@@ -0,0 +1,164 @@
+/*
+ Парус 8 - Панели мониторинга - Примеры для разработчиков
+ Пример: Диаграмма Ганта "P8PGantt"
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React, { useState, useContext, useCallback, useEffect } from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Grid, Stack, Icon, Box } from "@mui/material"; //Интерфейсные элементы
+import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
+import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
+import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
+
+//---------
+//Константы
+//---------
+
+//Высота диаграммы Ганта
+const GANTT_HEIGHT = "600px";
+
+//Ширина диаграммы Ганта
+const GANTT_WIDTH = "98vw";
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center", paddingTop: "20px" },
+ TITLE: { paddingBottom: "15px" },
+ GANTT_CONTAINER: { height: GANTT_HEIGHT, width: GANTT_WIDTH }
+};
+
+//---------------------------------------------
+//Вспомогательные функции форматирования данных
+//---------------------------------------------
+
+//Формирование значения для колонки "Тип задачи"
+const formatTaskTypeValue = value => {
+ const [text, icon] = value == 0 ? ["Этап проекта", "check"] : ["Работа проекта", "work_outline"];
+ return (
+
+ {icon}
+ {text}
+
+ );
+};
+
+//Генерация кастомных представлений атрибутов задачи в редакторе
+const taskAttributeRenderer = ({ task, attribute }) => {
+ switch (attribute.name) {
+ case "type":
+ return formatTaskTypeValue(task.type);
+ default:
+ return null;
+ }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Пример: Диаграмма Ганта "P8Gantt"
+const Gantt = ({ title }) => {
+ //Собственное состояние
+ const [state, setState] = useState({
+ init: false,
+ dataLoaded: false,
+ ident: null,
+ ganttDef: {},
+ ganttTasks: []
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Загрузка данных диаграммы с сервера
+ const loadData = useCallback(async () => {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_SAMPLES.GANTT",
+ args: { NIDENT: state.ident },
+ attributeValueProcessor: (name, val) =>
+ name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val,
+ respArg: "COUT"
+ });
+ setState(pv => ({ ...pv, dataLoaded: true, ganttDef: { ...data.XGANTT_DEF }, ganttTasks: [...data.XGANTT_TASKS] }));
+ }, [state.ident, executeStored]);
+
+ //Инициализация данных диаграммы
+ const initData = useCallback(async () => {
+ if (!state.init) {
+ const data = await executeStored({ stored: "PKG_P8PANELS_SAMPLES.GANTT_INIT", args: { NIDENT: state.ident } });
+ setState(pv => ({ ...pv, init: true, ident: data.NIDENT }));
+ }
+ }, [state.init, state.ident, executeStored]);
+
+ //Изменение данных диаграммы
+ const modifyData = useCallback(
+ async ({ rn, start, end }) => {
+ try {
+ await executeStored({
+ stored: "PKG_P8PANELS_SAMPLES.GANTT_MODIFY",
+ args: { NIDENT: state.ident, NRN: rn, DDATE_FROM: new Date(start), DDATE_TO: new Date(end) }
+ });
+ } finally {
+ loadData();
+ }
+ },
+ [state.ident, executeStored, loadData]
+ );
+
+ //Обработка измненения сроков задачи в диаграмме Гантта
+ const handleTaskDatesChange = ({ task, start, end, isMain }) => {
+ if (isMain) modifyData({ rn: task.rn, start, end });
+ };
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ if (state.ident) loadData();
+ }, [state.ident, loadData]);
+
+ //При подключении компонента к странице
+ useEffect(() => {
+ initData();
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ //Генерация содержимого
+ return (
+
+
+ {title}
+
+
+
+ {state.dataLoaded ? (
+
+
+
+ ) : null}
+
+
+
+ );
+};
+
+//Контроль свойств - Пример: Диаграмма Ганта "P8Gantt"
+Gantt.propTypes = {
+ title: PropTypes.string.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { Gantt };
diff --git a/app/panels/samples/mui.js b/app/panels/samples/mui.js
index 151ec5f..ec2138a 100644
--- a/app/panels/samples/mui.js
+++ b/app/panels/samples/mui.js
@@ -109,8 +109,8 @@ const Mui = ({ title }) => {
{title}
-
-
+
+