diff --git a/app/core/utils.js b/app/core/utils.js index 3ebd3d4..69492d1 100644 --- a/app/core/utils.js +++ b/app/core/utils.js @@ -7,7 +7,7 @@ //Подключение библиотек //--------------------- -import { XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML +import { XMLParser, XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML import dayjs from "dayjs"; //Работа с датами //--------- @@ -56,6 +56,26 @@ const object2Base64XML = (obj, builderOptions) => { return btoa(unescape(encodeURIComponent(builder.build(obj)))); }; +//Конвертация XML в JSON +const xml2JSON = ({ xmlDoc, attributeValueProcessor, isArray }) => { + return new Promise((resolve, reject) => { + try { + let opts = { + ignoreDeclaration: true, + ignoreAttributes: false, + parseAttributeValue: true, + attributeNamePrefix: "" + }; + if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor; + if (isArray) opts.isArray = isArray; + const parser = new XMLParser(opts); + resolve(parser.parse(xmlDoc)); + } catch (e) { + reject(e); + } + }); +}; + //Форматирование даты в формат РФ const formatDateRF = value => (value ? dayjs(value).format("DD.MM.YYYY") : null); @@ -75,4 +95,14 @@ const genGUID = () => //Интерфейс модуля //---------------- -export { hasValue, getDisplaySize, deepCopyObject, object2Base64XML, formatDateRF, formatDateJSONDateOnly, formatNumberRFCurrency, genGUID }; +export { + hasValue, + getDisplaySize, + deepCopyObject, + object2Base64XML, + xml2JSON, + formatDateRF, + formatDateJSONDateOnly, + formatNumberRFCurrency, + genGUID +}; diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js index 10fd417..0218ff8 100644 --- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js +++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js @@ -15,9 +15,8 @@ import { MessagingСtx } from "../../context/messaging"; //Контекст со import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта -import { formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции +import { xml2JSON, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции import { useFilteredPlans } from "./hooks"; //Вспомогательные хуки -import { XMLParser } from "fast-xml-parser"; //--------- //Константы @@ -49,23 +48,12 @@ const STYLES = { //------------------------------------ //Разбор XML с данными спецификации производственной программы -const parseProdPlanSpXML = xmlDoc => { - return new Promise((resolve, reject) => { - try { - const parser = new XMLParser({ - ignoreDeclaration: true, - ignoreAttributes: false, - parseAttributeValue: true, - attributeNamePrefix: "", - attributeValueProcessor: (name, val) => - name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val - }); - const data = parser.parse(xmlDoc); - resolve(data.XDATA); - } catch (e) { - reject(e); - } +const parseProdPlanSpXML = async xmlDoc => { + const data = await xml2JSON({ + xmlDoc, + attributeValueProcessor: (name, val) => (name == "numb" ? undefined : ["start", "end"].includes(name) ? formatDateJSONDateOnly(val) : val) }); + return data.XDATA; }; //Список планов