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 }; //----------------