WEBAPP: единая функция xml2JSON в utils.js, P8PGantt - передача зависимостей всегда массивом
This commit is contained in:
parent
ba4914d368
commit
31310c3da0
@ -7,9 +7,10 @@
|
|||||||
//Подключение библиотек
|
//Подключение библиотек
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
import { XMLParser, XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML
|
import { XMLBuilder } from "fast-xml-parser"; //Конвертация XML в JSON и JSON в XML
|
||||||
import dayjs from "dayjs"; //Работа с датами
|
import dayjs from "dayjs"; //Работа с датами
|
||||||
import config from "../../app.config"; //Настройки приложения
|
import config from "../../app.config"; //Настройки приложения
|
||||||
|
import { xml2JSON } from "./utils"; //Вспомогательные функции
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
//Константы
|
//Константы
|
||||||
@ -34,26 +35,6 @@ const ERR_UNEXPECTED = "Неожиданный ответ сервера"; //Н
|
|||||||
const ERR_NETWORK = "Ошибка соединения с сервером"; //Ошибка сети
|
const ERR_NETWORK = "Ошибка соединения с сервером"; //Ошибка сети
|
||||||
const ERR_UNAUTH = "Сеанс завершен. Пройдите аутентификацию повторно."; //Ошибка аутентификации
|
const ERR_UNAUTH = "Сеанс завершен. Пройдите аутентификацию повторно."; //Ошибка аутентификации
|
||||||
|
|
||||||
//Типовые пути конвертации в массив (при переводе XML -> JSON)
|
|
||||||
const XML_ALWAYS_ARRAY_PATHS = [
|
|
||||||
"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS",
|
|
||||||
"XRESPOND.XPAYLOAD.XROWS",
|
|
||||||
"XRESPOND.XPAYLOAD.XCOLUMNS_DEF",
|
|
||||||
"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values",
|
|
||||||
"XRESPOND.XPAYLOAD.XGROUPS",
|
|
||||||
"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes",
|
|
||||||
"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors",
|
|
||||||
"XRESPOND.XPAYLOAD.XGANTT_TASKS",
|
|
||||||
"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies",
|
|
||||||
"XRESPOND.XPAYLOAD.XCHART.labels",
|
|
||||||
"XRESPOND.XPAYLOAD.XCHART.datasets",
|
|
||||||
"XRESPOND.XPAYLOAD.XCHART.datasets.data",
|
|
||||||
"XRESPOND.XPAYLOAD.XCHART.datasets.items"
|
|
||||||
];
|
|
||||||
|
|
||||||
//Типовой постфикс тега для массива (при переводе XML -> JSON)
|
|
||||||
const XML_ALWAYS_ARRAY_POSTFIX = "__SYSTEM__ARRAY__";
|
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
//-----------
|
//-----------
|
||||||
@ -70,26 +51,8 @@ const getServerDataType = value => {
|
|||||||
const makeRespErr = ({ message }) => ({ SSTATUS: RESP_STATUS_ERR, SMESSAGE: message });
|
const makeRespErr = ({ message }) => ({ SSTATUS: RESP_STATUS_ERR, SMESSAGE: message });
|
||||||
|
|
||||||
//Разбор XML
|
//Разбор XML
|
||||||
const parseXML = (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => {
|
const parseXML = async (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) =>
|
||||||
return new Promise((resolve, reject) => {
|
await xml2JSON({ xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor, useDefaultPatterns: true });
|
||||||
try {
|
|
||||||
let opts = {
|
|
||||||
ignoreDeclaration: true,
|
|
||||||
ignoreAttributes: false,
|
|
||||||
parseAttributeValue: true,
|
|
||||||
attributeNamePrefix: ""
|
|
||||||
};
|
|
||||||
if (isArray) opts.isArray = isArray;
|
|
||||||
if (transformTagName) opts.transformTagName = transformTagName;
|
|
||||||
if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;
|
|
||||||
if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;
|
|
||||||
const parser = new XMLParser(opts);
|
|
||||||
resolve(parser.parse(xmlDoc));
|
|
||||||
} catch (e) {
|
|
||||||
reject(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
//Формирование XML
|
//Формирование XML
|
||||||
const buildXML = jsonObj => {
|
const buildXML = jsonObj => {
|
||||||
@ -160,7 +123,7 @@ const executeAction = async ({ serverURL, action, payload = {}, isArray, transfo
|
|||||||
throw new Error(ERR_UNEXPECTED);
|
throw new Error(ERR_UNEXPECTED);
|
||||||
//Всё хорошо - возвращаем (без корня, он не нужен)
|
//Всё хорошо - возвращаем (без корня, он не нужен)
|
||||||
console.log("SERVER RESPONSE JSON:");
|
console.log("SERVER RESPONSE JSON:");
|
||||||
console.log(responseJSON.XRESPOND);
|
console.log(JSON.parse(JSON.stringify(responseJSON.XRESPOND)));
|
||||||
return responseJSON.XRESPOND;
|
return responseJSON.XRESPOND;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -192,8 +155,7 @@ const executeStored = async ({
|
|||||||
serverURL: `${config.SYSTEM.SERVER}${!config.SYSTEM.SERVER.endsWith("/") ? "/" : ""}Process`,
|
serverURL: `${config.SYSTEM.SERVER}${!config.SYSTEM.SERVER.endsWith("/") ? "/" : ""}Process`,
|
||||||
action: SRV_FN_CODE_EXEC_STORED,
|
action: SRV_FN_CODE_EXEC_STORED,
|
||||||
payload: { SSTORED: stored, XARGUMENTS: serverArgs, SRESP_ARG: respArg },
|
payload: { SSTORED: stored, XARGUMENTS: serverArgs, SRESP_ARG: respArg },
|
||||||
isArray: (name, jPath) =>
|
isArray,
|
||||||
XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 || jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) || (isArray ? isArray(name, jPath) : false),
|
|
||||||
tagValueProcessor,
|
tagValueProcessor,
|
||||||
attributeValueProcessor
|
attributeValueProcessor
|
||||||
});
|
});
|
||||||
|
@ -30,6 +30,42 @@ const DISPLAY_SIZE = {
|
|||||||
[DISPLAY_SIZE_CODE.LG]: { WIDTH_FROM: 1200, WIDTH_TO: 1000000 } //Large - большой экран >= 1200px
|
[DISPLAY_SIZE_CODE.LG]: { WIDTH_FROM: 1200, WIDTH_TO: 1000000 } //Large - большой экран >= 1200px
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Типовые пути конвертации в массив (при переводе XML -> JSON)
|
||||||
|
const XML_ALWAYS_ARRAY_PATHS = [
|
||||||
|
"XRESPOND.XPAYLOAD.XOUT_ARGUMENTS",
|
||||||
|
"XRESPOND.XPAYLOAD.XROWS",
|
||||||
|
"XRESPOND.XPAYLOAD.XCOLUMNS_DEF",
|
||||||
|
"XRESPOND.XPAYLOAD.XCOLUMNS_DEF.values",
|
||||||
|
"XRESPOND.XPAYLOAD.XGROUPS",
|
||||||
|
"XRESPOND.XPAYLOAD.XGANTT_DEF.taskAttributes",
|
||||||
|
"XRESPOND.XPAYLOAD.XGANTT_DEF.taskColors",
|
||||||
|
"XRESPOND.XPAYLOAD.XGANTT_TASKS",
|
||||||
|
"XRESPOND.XPAYLOAD.XGANTT_TASKS.dependencies",
|
||||||
|
"XRESPOND.XPAYLOAD.XCHART.labels",
|
||||||
|
"XRESPOND.XPAYLOAD.XCHART.datasets",
|
||||||
|
"XRESPOND.XPAYLOAD.XCHART.datasets.data",
|
||||||
|
"XRESPOND.XPAYLOAD.XCHART.datasets.items"
|
||||||
|
];
|
||||||
|
|
||||||
|
//Типовые шаблоны конвертации в массив (при переводе XML -> JSON)
|
||||||
|
const XML_ALWAYS_ARRAY_PATH_PATTERNS = [
|
||||||
|
/(.*)XROWS$/,
|
||||||
|
/(.*)XCOLUMNS_DEF$/,
|
||||||
|
/(.*)XCOLUMNS_DEF.values$/,
|
||||||
|
/(.*)XGROUPS$/,
|
||||||
|
/(.*)XGANTT_DEF.taskAttributes$/,
|
||||||
|
/(.*)XGANTT_DEF.taskColors$/,
|
||||||
|
/(.*)XGANTT_TASKS$/,
|
||||||
|
/(.*)XGANTT_TASKS.dependencies$/,
|
||||||
|
/(.*)XCHART.labels$/,
|
||||||
|
/(.*)XCHART.datasets$/,
|
||||||
|
/(.*)XCHART.datasets.data$/,
|
||||||
|
/(.*)XCHART.datasets.items$/
|
||||||
|
];
|
||||||
|
|
||||||
|
//Типовой постфикс тега для массива (при переводе XML -> JSON)
|
||||||
|
const XML_ALWAYS_ARRAY_POSTFIX = "__SYSTEM__ARRAY__";
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
//Тело модуля
|
//Тело модуля
|
||||||
//-----------
|
//-----------
|
||||||
@ -57,7 +93,7 @@ const object2Base64XML = (obj, builderOptions) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//Конвертация XML в JSON
|
//Конвертация XML в JSON
|
||||||
const xml2JSON = ({ xmlDoc, attributeValueProcessor, isArray }) => {
|
const xml2JSON = ({ xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor, useDefaultPatterns = true }) => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
let opts = {
|
let opts = {
|
||||||
@ -66,8 +102,16 @@ const xml2JSON = ({ xmlDoc, attributeValueProcessor, isArray }) => {
|
|||||||
parseAttributeValue: true,
|
parseAttributeValue: true,
|
||||||
attributeNamePrefix: ""
|
attributeNamePrefix: ""
|
||||||
};
|
};
|
||||||
|
if (useDefaultPatterns)
|
||||||
|
opts.isArray = (name, jPath, isLeafNode, isAttribute) =>
|
||||||
|
XML_ALWAYS_ARRAY_PATHS.indexOf(jPath) !== -1 ||
|
||||||
|
XML_ALWAYS_ARRAY_PATH_PATTERNS.some(pattern => pattern.test(jPath)) ||
|
||||||
|
jPath.endsWith(XML_ALWAYS_ARRAY_POSTFIX) ||
|
||||||
|
(isArray ? isArray(name, jPath, isLeafNode, isAttribute) : undefined);
|
||||||
|
else if (isArray) opts.isArray = isArray;
|
||||||
|
if (transformTagName) opts.transformTagName = transformTagName;
|
||||||
|
if (tagValueProcessor) opts.tagValueProcessor = tagValueProcessor;
|
||||||
if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;
|
if (attributeValueProcessor) opts.attributeValueProcessor = attributeValueProcessor;
|
||||||
if (isArray) opts.isArray = isArray;
|
|
||||||
const parser = new XMLParser(opts);
|
const parser = new XMLParser(opts);
|
||||||
resolve(parser.parse(xmlDoc));
|
resolve(parser.parse(xmlDoc));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user