diff --git a/panels/eqs_tech_cond_forecast/admin_tab.js b/panels/eqs_tech_cond_forecast/admin_tab.js
index 599dcbc..0643458 100644
--- a/panels/eqs_tech_cond_forecast/admin_tab.js
+++ b/panels/eqs_tech_cond_forecast/admin_tab.js
@@ -22,6 +22,7 @@ import {
DS_RN_DEFAULT,
useEquipDataSelectionList,
useEquipDataSelectionClassMachineList,
+ useEquipDataSelectionClassMachineCard,
useEquipDataSelectionClassMachineFilesList,
useEquipDataSelectionClassMachineModelsList
} from "./admin_tab_hooks"; //Вспомогательные хуки
@@ -31,7 +32,13 @@ import {
//---------
//Начальное состояние флагов обновления
-const REFRESH_INITIAL = { action: null, dataSelection: null, dataSelectionClassMachine: null, dataSelectionClassMachineFilesList: 0 };
+const REFRESH_INITIAL = {
+ action: null,
+ dataSelection: null,
+ dataSelectionClassMachine: null,
+ dataSelectionClassMachineCard: 0,
+ dataSelectionClassMachineFilesList: 0
+};
//Стили
const STYLES = {
@@ -69,6 +76,12 @@ const AdminTab = () => {
//Загрузка классов оборудования выбранной выборки данных
const { equipDataSelectionClassMachineList } = useEquipDataSelectionClassMachineList(equipDataSelection, refresh.dataSelectionClassMachine);
+ //Загрузка карточки класса оборудования
+ const { equipDataSelectionClassMachineCard } = useEquipDataSelectionClassMachineCard(
+ equipDataSelectionClassMachine,
+ refresh.dataSelectionClassMachineCard
+ );
+
//Загрузка файлов класса оборудования
const { equipDataSelectionClassMachineFilesList } = useEquipDataSelectionClassMachineFilesList(
equipDataSelectionClassMachine,
@@ -112,9 +125,9 @@ const AdminTab = () => {
const handleAddEquipDataSelectionClassMachine = () => setDialogs(pv => ({ ...pv, dataSelectionClassMachineIU: true }));
//При нажатии на "Удалить класс оборудования"
- const handleDeleteEquipDataSelectionClassMachine = async rn => {
- await executeStored({ stored: "UDO_PKG_EQUIPDS.CM_DEL", args: { NRN: rn } });
- setRefresh(pv => ({ ...pv, dataSelectionClassMachine: rn * 2, action: "DEL" }));
+ const handleDeleteEquipDataSelectionClassMachine = async equipDSCM => {
+ await executeStored({ stored: "UDO_PKG_EQUIPDS.CM_DEL", args: { NRN: equipDSCM } });
+ setRefresh(pv => ({ ...pv, dataSelectionClassMachine: equipDSCM * 2, action: "DEL" }));
setDataSelectionClassMachine(null);
};
@@ -142,15 +155,37 @@ const AdminTab = () => {
};
//При нажатии "Сформировать" в списке файлов карточки класса оборудования
- const handleMakeEquipDataSelectionClassMachineFiles = (rn, procedure) => {
+ const handleMakeEquipDataSelectionClassMachineFiles = (equipDSCM, procedure) => {
pOnlineUserProcedure({
code: procedure,
- inputParameters: [{ name: "NEQUIPDSCM", value: rn }],
+ inputParameters: [{ name: "NEQUIPDSCM", value: equipDSCM }],
callBack: res =>
res.success ? setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 })) : null
});
};
+ //При нажатии "Загрузить на сервер" в списке файлов карточки класса оборудования
+ const handleUploadEquipDataSelectionClassMachineFiles = async equipDSCM => {
+ await executeStored({
+ stored: "UDO_PKG_EQUIPDS.CMFL_UPLOAD",
+ args: {
+ NEQUIPDSCM: equipDSCM
+ }
+ });
+ setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 }));
+ };
+
+ //При нажатии "Передать внешней системе" в списке файлов карточки класса оборудования
+ const handleSendMdEquipDataSelectionClassMachineFiles = async equipDSCM => {
+ await executeStored({
+ stored: "UDO_PKG_EQUIPDS.CMFL_SEND_MD",
+ args: {
+ NEQUIPDSCM: equipDSCM
+ }
+ });
+ setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 }));
+ };
+
//При изменении списка выборок данных
useEffect(() => {
if (refresh.action == "INS" && refresh.dataSelection) {
@@ -209,11 +244,13 @@ const AdminTab = () => {
diff --git a/panels/eqs_tech_cond_forecast/admin_tab_hooks.js b/panels/eqs_tech_cond_forecast/admin_tab_hooks.js
index 7bb2693..ccd144e 100644
--- a/panels/eqs_tech_cond_forecast/admin_tab_hooks.js
+++ b/panels/eqs_tech_cond_forecast/admin_tab_hooks.js
@@ -98,6 +98,40 @@ const useEquipDataSelectionClassMachineList = (dataSelection, refresh) => {
return { equipDataSelectionClassMachineList: data, equipDataSelectionClassMachineListIsLoading: isLoading };
};
+//Загрузка карточки класса оборудования
+const useEquipDataSelectionClassMachineCard = (classMachine, refresh) => {
+ //Собственное состояние - флаг загрузки
+ const [isLoading, setLoading] = useState(false);
+
+ //Собственное состояние - данные карточки
+ const [data, setData] = useState({});
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored } = useContext(BackEndСtx);
+
+ //Загрузка данных при изменении зависимостей
+ useEffect(() => {
+ const loadData = async () => {
+ try {
+ setLoading(true);
+ const data = await executeStored({
+ stored: "UDO_PKG_EQUIPDS.CM_CARD",
+ args: { NEQUIPDSCM: classMachine },
+ respArg: "COUT",
+ loader: false
+ });
+ setData(data.XEQUIPDSCM);
+ } finally {
+ setLoading(false);
+ }
+ };
+ if (classMachine) loadData();
+ }, [classMachine, refresh, executeStored]);
+
+ //Вернём данные
+ return { equipDataSelectionClassMachineCard: data, equipDataSelectionClassMachineCardIsLoading: isLoading };
+};
+
//Загрузка списка файлов класса оборудования
const useEquipDataSelectionClassMachineFilesList = (classMachine, refresh) => {
//Собственное состояние - флаг загрузки
@@ -192,6 +226,7 @@ export {
DS_RN_DEFAULT,
useEquipDataSelectionList,
useEquipDataSelectionClassMachineList,
+ useEquipDataSelectionClassMachineCard,
useEquipDataSelectionClassMachineFilesList,
useEquipDataSelectionClassMachineModelsList
};
diff --git a/panels/eqs_tech_cond_forecast/admin_tab_layout.js b/panels/eqs_tech_cond_forecast/admin_tab_layout.js
index 67015c3..49dbec4 100644
--- a/panels/eqs_tech_cond_forecast/admin_tab_layout.js
+++ b/panels/eqs_tech_cond_forecast/admin_tab_layout.js
@@ -84,7 +84,19 @@ const STYLES = {
FL_ML_TABLE: {
height: `200px`,
...SCROLL_STYLES
- }
+ },
+ EXTRA_CAPTION_BUTTON_CONTAINER: (theme, maxWidth) => ({
+ borderWidth: "1px",
+ borderStyle: "solid",
+ borderColor: theme.palette.grey[400],
+ maxWidth,
+ borderRadius: theme.shape.borderRadius,
+ paddingLeft: "10px",
+ paddingRight: "10px",
+ paddingTop: "2px",
+ paddingBottom: "2px"
+ }),
+ EXTRA_CAPTION_BUTTON_TITLE: { whiteSpace: "nowrap", textOverflow: "ellipsis", overflow: "hidden" }
};
//------------------------------------
@@ -145,6 +157,78 @@ IUDFormTextField.propTypes = {
dictionary: PropTypes.func
};
+//Кнопка с дополнительной подписью
+const ExtraCaptionButton = ({ caption, title, subtitle, maxWidth, onClick, theme }) => {
+ //При нажатии на кнопку
+ const handleClick = () => (onClick ? onClick() : null);
+
+ //Генерация содержимого
+ return (
+
+
+
+ {title} {subtitle}
+
+
+ );
+};
+
+//Контроль свойств - Кнопка с дополнительной подписью
+ExtraCaptionButton.propTypes = {
+ caption: PropTypes.string.isRequired,
+ title: PropTypes.string.isRequired,
+ subtitle: PropTypes.string.isRequired,
+ maxWidth: PropTypes.string,
+ onClick: PropTypes.func,
+ theme: PropTypes.object.isRequired
+};
+
+//Формирование значения для колонки "Состояние" файла класса оборудования выборки данных
+const formatFileStateValue = (theme, value, err) => {
+ const [text, icon, color] =
+ value == 0
+ ? ["Зарегистрирован", "app_registration", null]
+ : value == 1
+ ? ["Загружается на сервер", "file_upload", theme.palette.warning.main]
+ : value == 2
+ ? ["Успешно загружен на сервер", "dns", theme.palette.primary.main]
+ : value == 3
+ ? [`Ошибка загрузки на сервер: ${err}`, "error", theme.palette.error.main]
+ : value == 4
+ ? ["Загружается во внешнюю систему", "cloud_upload", theme.palette.warning.main]
+ : value == 5
+ ? ["Успешно передан внешней системе", "cloud_done", theme.palette.success.main]
+ : [`Ошибка передачи внешней системе: ${err}`, "error", theme.palette.error.main];
+ return (
+
+ {icon}
+ {text}
+
+ );
+};
+
+//Форматирование колонок таблицы файлов класса оборудования выборки данных
+const filesListDataCellRender = ({ row, columnDef, theme }) => {
+ switch (columnDef.name) {
+ case "NSTATUS":
+ return {
+ cellProps: { align: "left" },
+ data: formatFileStateValue(theme, row.NSTATUS, row.SERR)
+ };
+ }
+};
+
+//Форматирование ячеек заголовка таблиц файлов и моделей класса оборудования выборки данных
+const classMachineCardTableHeadCellRender = ({ columnDef }) => {
+ switch (columnDef.name) {
+ case "NSTATUS":
+ return {
+ stackProps: { justifyContent: "left" },
+ cellProps: { align: "left" }
+ };
+ }
+};
+
//-----------
//Тело модуля
//-----------
@@ -371,7 +455,15 @@ EquipDataSelectionClassMachineList.propTypes = {
};
//Карточка класса оборудования выборки данных
-const EquipDataSelectionClassMachineCard = ({ card, filesList, modelsList, onCardDelete, onClassMachineFilesMake }) => {
+const EquipDataSelectionClassMachineCard = ({
+ card,
+ filesList,
+ modelsList,
+ onCardDelete,
+ onClassMachineFilesMake,
+ onClassMachineFilesUpload,
+ onClassMachineFilesSendMd
+}) => {
//Подключаемся к теме
const theme = useTheme();
@@ -381,72 +473,98 @@ const EquipDataSelectionClassMachineCard = ({ card, filesList, modelsList, onCar
//При нажатии на "Сформировать" для файлов данных
const handleClassMachineFilesMakeClick = () => (onClassMachineFilesMake ? onClassMachineFilesMake(card.NRN, card.SUSERPROCS_DATA) : null);
+ //При нажатии на "Загрузить на сервер" для файлов данных
+ const handleClassMachineFilesUploadClick = () => (onClassMachineFilesUpload ? onClassMachineFilesUpload(card.NRN) : null);
+
+ //При нажатии на "Загрузить на сервер" для файлов данных
+ const handleClassMachineFilesSendMdClick = () => (onClassMachineFilesSendMd ? onClassMachineFilesSendMd(card.NRN) : null);
+
//Генерация содержимого
return (
-
-
-
-
-
- Наименование технического объекта
-
-
- delete
-
-
-
- Состояние: готов к ...
+ {card.NRN ? (
+
+
+
+ {card.SNAME}
- фывафывафва
-
-
-
-
-
-
- Файлы данных
-
-
-
- filesListDataCellRender({ ...prms, theme })}
- />
-
-
-
-
-
- Модели
-
-
-
-
-
+
+ delete
+
+
+
+
+
+
+ Файлы данных
+
+
+
+
+
+ filesListDataCellRender({ ...prms, theme })}
+ />
+
+
+
+
+
+
+ Модели
+
+
+
+
+
+
+ ) : null}
);
};
@@ -457,53 +575,9 @@ EquipDataSelectionClassMachineCard.propTypes = {
filesList: PropTypes.object.isRequired,
modelsList: PropTypes.object.isRequired,
onCardDelete: PropTypes.func,
- onClassMachineFilesMake: PropTypes.func
-};
-
-//Формирование значения для колонки "Состояние" проекта
-const formatFileStateValue = (theme, value, err) => {
- const [text, icon, color] =
- value == 0
- ? ["Зарегистрирован", "app_registration", null]
- : value == 1
- ? ["Загружается на сервер", "file_upload", theme.palette.warning.main]
- : value == 2
- ? ["Успешно загружен на сервер", "dns", theme.palette.primary.main]
- : value == 3
- ? [`Ошибка загрузки на сервер: ${err}`, "error", theme.palette.error.main]
- : value == 4
- ? ["Загружается во внешнюю систему", "cloud_upload", theme.palette.warning.main]
- : value == 5
- ? ["Успешно загружен во внешнюю систему", "cloud_done", theme.palette.success.main]
- : [`Ошибка загрузки во внешнюю систему: ${err}`, "error", theme.palette.error.main];
- return (
-
- {icon}
- {text}
-
- );
-};
-
-//Форматирование колонок таблицы файлов класса оборудования выборки данных
-const filesListDataCellRender = ({ row, columnDef, theme }) => {
- switch (columnDef.name) {
- case "NSTATUS":
- return {
- cellProps: { align: "left" },
- data: formatFileStateValue(theme, row.NSTATUS, row.SERR)
- };
- }
-};
-
-//Генерация представления ячейки заголовка
-const filesListHeadCellRender = ({ columnDef }) => {
- switch (columnDef.name) {
- case "NSTATUS":
- return {
- stackProps: { justifyContent: "left" },
- cellProps: { align: "left" }
- };
- }
+ onClassMachineFilesMake: PropTypes.func,
+ onClassMachineFilesUpload: PropTypes.func,
+ onClassMachineFilesSendMd: PropTypes.func
};
//----------------