135 lines
5.1 KiB
JavaScript
135 lines
5.1 KiB
JavaScript
/*
|
|
Парус 8 - Панели мониторинга - Редактор панелей
|
|
Дополнительная разметка и вёрстка клиентских элементов
|
|
*/
|
|
|
|
//---------------------
|
|
//Подключение библиотек
|
|
//---------------------
|
|
|
|
import React, { useState } from "react"; //Классы React
|
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
|
import { InputLabel, Input, IconButton, Icon, Button } from "@mui/material"; //Интерфейсные компоненты
|
|
import { TEXTS } from "../../../app.text"; //Общие текстовые ресурсы приложения
|
|
import { P8PAppProgress } from "../../components/p8p_app_progress"; //Индикатор процесса
|
|
|
|
//---------
|
|
//Константы
|
|
//---------
|
|
|
|
//Стили
|
|
const STYLES = {
|
|
INPUT_FILE: { display: "none" },
|
|
INPUT_LABEL: { display: "contents" }
|
|
};
|
|
|
|
//-----------
|
|
//Тело модуля
|
|
//-----------
|
|
|
|
//Компонент "Загрузка из файла"
|
|
const ImportPanel = ({ id, buttonView, onClick, disabled = false }) => {
|
|
//Состояние загрузки файла
|
|
const [loading, setLoading] = useState(false);
|
|
|
|
//При выборе файла
|
|
const handleChange = event => {
|
|
//Если файл выбран
|
|
if (event.target.files[0]) {
|
|
//Инициализируем считыватель файла
|
|
const reader = new FileReader();
|
|
//Обработчик начала считывания данных
|
|
reader.onloadstart = () => setLoading(true);
|
|
//Обработчик считывания данных
|
|
reader.onload = async e => {
|
|
//Обрабатываем текст файла
|
|
onClick(e.target.result);
|
|
setLoading(false);
|
|
};
|
|
//Обработчик ошибки считывания данных
|
|
reader.onerror = () => setLoading(false);
|
|
//Загружаем данные из файла
|
|
reader.readAsText(event.target.files[0]);
|
|
}
|
|
//Очищаем значение
|
|
event.target.value = null;
|
|
};
|
|
|
|
//Генерация содержимого
|
|
return (
|
|
<>
|
|
{loading ? <P8PAppProgress open={true} text={TEXTS.LOADING} /> : null}
|
|
<InputLabel htmlFor={id} sx={STYLES.INPUT_LABEL}>
|
|
<Input
|
|
id={id}
|
|
type="file"
|
|
hidden
|
|
onChange={handleChange}
|
|
sx={STYLES.INPUT_FILE}
|
|
inputProps={{ accept: ".xml" }}
|
|
disabled={disabled}
|
|
/>
|
|
{buttonView}
|
|
</InputLabel>
|
|
</>
|
|
);
|
|
};
|
|
|
|
//Контроль свойств - Компонент "Загрузка из файла"
|
|
ImportPanel.propTypes = {
|
|
id: PropTypes.string.isRequired,
|
|
buttonView: PropTypes.object.isRequired,
|
|
onClick: PropTypes.func.isRequired,
|
|
disabled: PropTypes.bool
|
|
};
|
|
|
|
//Генерация действия "Загрузить из файла" меню действий
|
|
export const toolbarImportRenderer = ({ icon, title, disabled, onClick }) => {
|
|
//Представление кнопки загрузки
|
|
let importButtonView = (
|
|
<IconButton title={title} disabled={disabled}>
|
|
<Icon>{icon}</Icon>
|
|
</IconButton>
|
|
);
|
|
//Генерация содержимого
|
|
return <ImportPanel id={"input-file-loader-toolbar"} buttonView={importButtonView} onClick={onClick} disabled={disabled} />;
|
|
};
|
|
|
|
//Компонент кнопки импорта панели из файла
|
|
export const ImportPanelButton = ({ id, startIcon, title, onClick }) => {
|
|
//Представление кнопки загрузки
|
|
let importButtonView = (
|
|
<Button startIcon={startIcon ? <Icon>{startIcon}</Icon> : null} component="span">
|
|
{title}
|
|
</Button>
|
|
);
|
|
//Генерация содержимого
|
|
return <ImportPanel id={id} buttonView={importButtonView} onClick={onClick} />;
|
|
};
|
|
|
|
//Контроль свойств - Компонент кнопки импорта панели из файла
|
|
ImportPanelButton.propTypes = {
|
|
id: PropTypes.string.isRequired,
|
|
startIcon: PropTypes.string,
|
|
title: PropTypes.string.isRequired,
|
|
onClick: PropTypes.func.isRequired
|
|
};
|
|
|
|
//Выгрузка XML файла
|
|
export const exportXMLFile = (data, fileName) => {
|
|
//Переводим в данные для файла
|
|
const blobData = new Blob([data], { type: "text/plain" });
|
|
//Формируем URL
|
|
const url = URL.createObjectURL(blobData);
|
|
//Делаем линк и устанавливаем параметры, после добавляем в DOM
|
|
const a = document.createElement("a");
|
|
a.href = url;
|
|
a.download = `${fileName.replace(/[/\\?%*:|"<>.,;= ]/g, "_")}.xml`;
|
|
document.body.appendChild(a);
|
|
//Выполняем открытие ссылки
|
|
a.click();
|
|
//Очищаем от лишних данных
|
|
document.body.removeChild(a);
|
|
URL.revokeObjectURL(url);
|
|
};
|