From b1b1288e600e68f8a3c0e080ac09ac8bdd5a45b8 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sun, 4 May 2025 18:00:17 +0300 Subject: [PATCH] =?UTF-8?q?WEBAPP:=20=D0=A1=D0=B2=D0=B5=D0=B6=D0=B0=D1=8F?= =?UTF-8?q?=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/p8-panels.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/p8-panels.js b/dist/p8-panels.js index b3d3793..b2ef45f 100644 --- a/dist/p8-panels.js +++ b/dist/p8-panels.js @@ -236,7 +236,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BackEndContext: () => (/* binding */ BackEndContext),\n/* harmony export */ \"BackEndСtx\": () => (/* binding */ BackEndСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Взаимодействие с серверным API\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Контекст сообщений\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Структура объекта клиента\nconst BACKEND_CONTEXT_CLIENT_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n SERV_DATA_TYPE_STR: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n SERV_DATA_TYPE_NUMB: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n SERV_DATA_TYPE_DATE: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n SERV_DATA_TYPE_CLOB: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n isRespErr: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n getRespErrMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n getRespPayload: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n executeStored: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n getConfig: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст взаимодействия с серверным API\nconst BackEndСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста взаимодействия с серверным API\nconst BackEndContext = ({\n client,\n children\n}) => {\n //Подключение к контексту сообщений\n const {\n showLoader,\n hideLoader,\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Проверка ответа на наличие ошибки\n const isRespErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.isRespErr(resp), [client]);\n\n //Извлечение ошибки из ответа\n const getRespErrMessage = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespErrMessage(resp), [client]);\n\n //Извлечение полезного содержимого из ответа\n const getRespPayload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespPayload(resp), [client]);\n\n //Запуск хранимой процедуры\n const executeStored = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true,\n fullResponse = false,\n spreadOutArguments = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.executeStored({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError,\n spreadOutArguments\n });\n if (fullResponse === true || isRespErr(result)) return result;else return result.XPAYLOAD;\n } catch (e) {\n if (showErrorMessage) {\n //Разбираем текст ошибки\n let errMsg = (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatErrorMessage)(e.message);\n //Отображаем ошибку\n showMsgErr(errMsg.text, null, errMsg.fullErrorText);\n }\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, isRespErr, showMsgErr, client]);\n\n //Загрузка настроек панелей\n const getConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.getConfig({\n throwError\n });\n return result;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, showMsgErr, client]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BackEndСtx.Provider, {\n value: {\n SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE: client.SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB: client.SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста взаимодействия с серверным API\nBackEndContext.propTypes = {\n client: BACKEND_CONTEXT_CLIENT_SHAPE.isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_3___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/backend.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BackEndContext: () => (/* binding */ BackEndContext),\n/* harmony export */ \"BackEndСtx\": () => (/* binding */ BackEndСtx)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"./node_modules/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ \"./node_modules/prop-types/index.js\");\n/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _messaging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./messaging */ \"./app/context/messaging.js\");\n/* harmony import */ var _core_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../core/utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Контекст: Взаимодействие с серверным API\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //ReactJS\n //Контроль свойств компонента\n //Контекст сообщений\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Структура объекта клиента\nconst BACKEND_CONTEXT_CLIENT_SHAPE = prop_types__WEBPACK_IMPORTED_MODULE_3___default().shape({\n SERV_DATA_TYPE_STR: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n SERV_DATA_TYPE_NUMB: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n SERV_DATA_TYPE_DATE: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n SERV_DATA_TYPE_CLOB: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().string).isRequired,\n isRespErr: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n getRespErrMessage: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n getRespPayload: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n executeStored: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired,\n getConfig: (prop_types__WEBPACK_IMPORTED_MODULE_3___default().func).isRequired\n});\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n//Контекст взаимодействия с серверным API\nconst BackEndСtx = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)();\n\n//Провайдер контекста взаимодействия с серверным API\nconst BackEndContext = ({\n client,\n children\n}) => {\n //Подключение к контексту сообщений\n const {\n showLoader,\n hideLoader,\n showMsgErr\n } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(_messaging__WEBPACK_IMPORTED_MODULE_1__[\"MessagingСtx\"]);\n\n //Проверка ответа на наличие ошибки\n const isRespErr = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.isRespErr(resp), [client]);\n\n //Извлечение ошибки из ответа\n const getRespErrMessage = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespErrMessage(resp), [client]);\n\n //Извлечение полезного содержимого из ответа\n const getRespPayload = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(resp => client.getRespPayload(resp), [client]);\n\n //Запуск хранимой процедуры\n const executeStored = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true,\n fullResponse = false,\n spreadOutArguments = true,\n signal = null\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.executeStored({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError,\n spreadOutArguments,\n signal\n });\n if (fullResponse === true || isRespErr(result)) return result;else return result.XPAYLOAD;\n } catch (e) {\n if (showErrorMessage) {\n //Разбираем текст ошибки\n let errMsg = (0,_core_utils__WEBPACK_IMPORTED_MODULE_2__.formatErrorMessage)(e.message);\n //Отображаем ошибку\n showMsgErr(errMsg.text, null, errMsg.fullErrorText);\n }\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, isRespErr, showMsgErr, client]);\n\n //Загрузка настроек панелей\n const getConfig = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async ({\n loader = true,\n loaderMessage = \"\",\n throwError = true,\n showErrorMessage = true\n } = {}) => {\n try {\n if (loader !== false) showLoader(loaderMessage);\n let result = await client.getConfig({\n throwError\n });\n return result;\n } catch (e) {\n if (showErrorMessage) showMsgErr(e.message);\n throw e;\n } finally {\n if (loader !== false) hideLoader();\n }\n }, [showLoader, hideLoader, showMsgErr, client]);\n\n //Вернём компонент провайдера\n return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(BackEndСtx.Provider, {\n value: {\n SERV_DATA_TYPE_STR: client.SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB: client.SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE: client.SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB: client.SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n }\n }, children);\n};\n\n//Контроль свойств - Провайдер контекста взаимодействия с серверным API\nBackEndContext.propTypes = {\n client: BACKEND_CONTEXT_CLIENT_SHAPE.isRequired,\n children: prop_types__WEBPACK_IMPORTED_MODULE_3___default().oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_3___default().node)), (prop_types__WEBPACK_IMPORTED_MODULE_3___default().node)])\n};\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/context/backend.js?"); /***/ }), @@ -280,7 +280,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\nconst ERR_UNAUTH = \"Сеанс завершен. Пройдите аутентификацию повторно.\"; //Ошибка аутентификации\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = async (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => await (0,_utils__WEBPACK_IMPORTED_MODULE_3__.xml2JSON)({\n xmlDoc,\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n useDefaultPatterns: true\n});\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n }\n });\n } catch (e) {\n //Сетевая ошибка\n throw new Error(`${ERR_NETWORK}: ${e.message}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Проверим на наличие редиректа к аутентификации (возникает, если сеанс окончен)\n if (response.redirected && response.url.toLowerCase().includes(\"auth?returnurl\")) throw new Error(ERR_UNAUTH);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(JSON.parse(JSON.stringify(responseJSON.XRESPOND)));\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray,\n tagValueProcessor,\n attributeValueProcessor\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fast-xml-parser */ \"./node_modules/fast-xml-parser/src/fxp.js\");\n/* harmony import */ var fast_xml_parser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dayjs */ \"./node_modules/dayjs/dayjs.min.js\");\n/* harmony import */ var dayjs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dayjs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _app_config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../app.config */ \"./app.config.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./app/core/utils.js\");\n/*\r\n Парус 8 - Панели мониторинга\r\n Ядро: Клиент для взаимодействия с сервером приложений \"Парус 8 Онлайн\"\r\n*/\n\n//---------------------\n//Подключение библиотек\n//---------------------\n\n //Конвертация XML в JSON и JSON в XML\n //Работа с датами\n //Настройки приложения\n //Вспомогательные функции\n\n//---------\n//Константы\n//---------\n\n//Коды функций сервера\nconst SRV_FN_CODE_EXEC_STORED = \"EXEC_STORED\"; //Код функции сервера \"Запуск хранимой процедуры\"\n\n//Типы данных сервера\nconst SERV_DATA_TYPE_STR = \"STR\"; //Тип данных \"строка\"\nconst SERV_DATA_TYPE_NUMB = \"NUMB\"; //Тип данных \"число\"\nconst SERV_DATA_TYPE_DATE = \"DATE\"; //Тип данных \"дата\"\nconst SERV_DATA_TYPE_CLOB = \"CLOB\"; //Тип данных \"текст\"\n\n//Состояния ответов сервера\nconst RESP_STATUS_OK = \"OK\"; //Успех\nconst RESP_STATUS_ERR = \"ERR\"; //Ошибка\n\n//Типовые ошибки клиента\nconst ERR_APPSERVER = \"Ошибка сервера приложений\"; //Общая ошибка клиента\nconst ERR_UNEXPECTED = \"Неожиданный ответ сервера\"; //Неожиданный ответ сервера\nconst ERR_NETWORK = \"Ошибка соединения с сервером\"; //Ошибка сети\nconst ERR_UNAUTH = \"Сеанс завершен. Пройдите аутентификацию повторно.\"; //Ошибка аутентификации\nconst ERR_ABORTED = \"Запрос прерван принудительно\";\n\n//-----------\n//Тело модуля\n//-----------\n\n//Определение типа данных значения аргумента\nconst getServerDataType = value => {\n let res = SERV_DATA_TYPE_STR;\n if (typeof value == \"number\") res = SERV_DATA_TYPE_NUMB;\n if (value instanceof Date) res = SERV_DATA_TYPE_DATE;\n return res;\n};\n\n//Формирование стандартного ответа - ошибка\nconst makeRespErr = ({\n message\n}) => ({\n SSTATUS: RESP_STATUS_ERR,\n SMESSAGE: message\n});\n\n//Разбор XML\nconst parseXML = async (xmlDoc, isArray, transformTagName, tagValueProcessor, attributeValueProcessor) => await (0,_utils__WEBPACK_IMPORTED_MODULE_3__.xml2JSON)({\n xmlDoc,\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n useDefaultPatterns: true\n});\n\n//Формирование XML\nconst buildXML = jsonObj => {\n return new Promise((resolve, reject) => {\n try {\n const builder = new fast_xml_parser__WEBPACK_IMPORTED_MODULE_0__.XMLBuilder({\n ignoreAttributes: false,\n oneListGroup: true\n });\n resolve(builder.build(jsonObj));\n } catch (e) {\n reject(e);\n }\n });\n};\n\n//Проверка ответа на наличие ошибки\nconst isRespErr = resp => resp && resp?.SSTATUS && resp?.SSTATUS === RESP_STATUS_ERR;\n\n//Извлечение ошибки из ответа\nconst getRespErrMessage = resp => isRespErr(resp) && resp.SMESSAGE ? resp.SMESSAGE : \"\";\n\n//Извлечение полезного содержимого из ответа\nconst getRespPayload = resp => resp && resp.XPAYLOAD ? resp.XPAYLOAD : null;\n\n//Исполнение действия на сервере\nconst executeAction = async ({\n serverURL,\n action,\n payload = {},\n isArray,\n transformTagName,\n tagValueProcessor,\n attributeValueProcessor,\n signal = null\n} = {}) => {\n console.log(`EXECUTING ${action ? action : \"\"} ON ${serverURL} WITH PAYLOAD:`);\n console.log(payload ? payload : \"NO PAYLOAD\");\n let response = null;\n let responseJSON = null;\n try {\n //Сформируем типовой запрос\n const rqBody = {\n XREQUEST: {\n SACTION: action,\n XPAYLOAD: payload\n }\n };\n //Выполняем запрос\n response = await fetch(serverURL, {\n method: \"POST\",\n body: await buildXML(rqBody),\n headers: {\n \"content-type\": \"application/xml\"\n },\n ...(signal ? {\n signal\n } : {})\n });\n } catch (e) {\n //Прервано принудительно\n if (signal?.aborted === true) throw new Error(ERR_ABORTED);\n //Сетевая ошибка\n else throw new Error(`${ERR_NETWORK}: ${e.message || \"неопределённая ошибка\"}`);\n }\n //Проверим на наличие ошибок HTTP - если есть вернём их\n if (!response.ok) throw new Error(`${ERR_APPSERVER}: ${response.statusText}`);\n //Проверим на наличие редиректа к аутентификации (возникает, если сеанс окончен)\n if (response.redirected && response.url.toLowerCase().includes(\"auth?returnurl\")) throw new Error(ERR_UNAUTH);\n //Ошибок нет - пробуем разобрать\n try {\n let responseText = await response.text();\n //console.log(\"SERVER RESPONSE TEXT:\");\n //console.log(responseText);\n responseJSON = await parseXML(responseText, isArray, transformTagName, tagValueProcessor, attributeValueProcessor);\n } catch (e) {\n //Что-то пошло не так при парсинге\n throw new Error(ERR_UNEXPECTED);\n }\n //Разобрали, проверяем структуру ответа на обязательные атрибуты\n if (!responseJSON?.XRESPOND || !responseJSON?.XRESPOND?.SSTATUS || ![RESP_STATUS_ERR, RESP_STATUS_OK].includes(responseJSON?.XRESPOND?.SSTATUS) || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_OK && responseJSON?.XRESPOND?.XPAYLOAD == undefined || responseJSON?.XRESPOND?.SSTATUS === RESP_STATUS_ERR && responseJSON?.XRESPOND?.SMESSAGE == undefined) throw new Error(ERR_UNEXPECTED);\n //Всё хорошо - возвращаем (без корня, он не нужен)\n console.log(\"SERVER RESPONSE JSON:\");\n console.log(JSON.parse(JSON.stringify(responseJSON.XRESPOND)));\n return responseJSON.XRESPOND;\n};\n\n//Запуск хранимой процедуры\nconst executeStored = async ({\n stored,\n args,\n respArg,\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n throwError = true,\n spreadOutArguments = false,\n signal = null\n} = {}) => {\n let res = null;\n try {\n let serverArgs = [];\n if (args) for (const arg in args) {\n let typedArg = false;\n if (args[arg] && Object.hasOwn(args[arg], \"VALUE\") && Object.hasOwn(args[arg], \"SDATA_TYPE\") && args[arg]?.SDATA_TYPE) typedArg = true;\n const dataType = typedArg ? args[arg].SDATA_TYPE : getServerDataType(args[arg]);\n let value = typedArg ? args[arg].VALUE : args[arg];\n if (dataType === SERV_DATA_TYPE_DATE) value = dayjs__WEBPACK_IMPORTED_MODULE_1___default()(value).format(\"YYYY-MM-DDTHH:mm:ss\");\n serverArgs.push({\n XARGUMENT: {\n SNAME: arg,\n VALUE: value,\n SDATA_TYPE: dataType\n }\n });\n }\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}Process`,\n action: SRV_FN_CODE_EXEC_STORED,\n payload: {\n SSTORED: stored,\n XARGUMENTS: serverArgs,\n SRESP_ARG: respArg\n },\n isArray,\n tagValueProcessor,\n attributeValueProcessor,\n signal\n });\n if (spreadOutArguments === true && Array.isArray(res?.XPAYLOAD?.XOUT_ARGUMENTS)) {\n let spreadArgs = {};\n for (let arg of res.XPAYLOAD.XOUT_ARGUMENTS) spreadArgs[arg.SNAME] = arg.VALUE;\n delete res.XPAYLOAD.XOUT_ARGUMENTS;\n res.XPAYLOAD = {\n ...res.XPAYLOAD,\n ...spreadArgs\n };\n }\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//Чтение конфигурации плагина\nconst getConfig = async ({\n throwError = true\n} = {}) => {\n let res = null;\n try {\n res = await executeAction({\n serverURL: `${_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER}${!_app_config__WEBPACK_IMPORTED_MODULE_2__[\"default\"].SYSTEM.SERVER.endsWith(\"/\") ? \"/\" : \"\"}GetConfig`\n });\n } catch (e) {\n if (throwError) throw e;else return makeRespErr({\n message: e.message\n });\n }\n if (res.SSTATUS === RESP_STATUS_ERR && throwError === true) throw new Error(res.SMESSAGE);\n return res;\n};\n\n//----------------\n//Интерфейс модуля\n//----------------\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\n SERV_DATA_TYPE_STR,\n SERV_DATA_TYPE_NUMB,\n SERV_DATA_TYPE_DATE,\n SERV_DATA_TYPE_CLOB,\n isRespErr,\n getRespErrMessage,\n getRespPayload,\n executeStored,\n getConfig\n});\n\n//# sourceURL=webpack://parus_8_panels_plugin/./app/core/client.js?"); /***/ }),