From 085364f4e8d7b76ee78e9a3e73ce7de0dabce8ca Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Mon, 25 Sep 2023 13:33:42 +0300 Subject: [PATCH] =?UTF-8?q?WEB=20APP:=20=D0=92=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20API-=D1=84=D0=B0=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA?= =?UTF-8?q?=D0=B8=20"=D0=9F=D0=90=D0=A0=D0=A3=D0=A1=208=20=D0=9E=D0=BD?= =?UTF-8?q?=D0=BB=D0=B0=D0=B9=D0=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/context/application.js | 16 +++++++++++++++- app/core/utils.js | 8 +++++++- app/panels/prj_jobs/prj_jobs.js | 14 +++++++++++++- app/root.js | 3 ++- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/app/context/application.js b/app/context/application.js index aceb819..0d45ecd 100644 --- a/app/context/application.js +++ b/app/context/application.js @@ -34,7 +34,7 @@ const P8O_API = window.parent?.parus?.clientApi; export const ApplicationСtx = createContext(); //Провайдер контекста приложения -export const ApplicationContext = ({ children }) => { +export const ApplicationContext = ({ guidGenerator, children }) => { //Подключим редьюсер состояния const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE); @@ -56,6 +56,18 @@ export const ApplicationContext = ({ children }) => { //Поиск раздела по имени const findPanelByName = name => state.panels.find(panel => panel.name == name); + //Отображение закладки "ПАРУС 8 Онлайн" с указанным URL + const pOnlineShowTab = useCallback( + ({ id, url, caption, onClose }) => { + if (P8O_API) { + const _id = id || guidGenerator(); + P8O_API.ui.openTab({ id: _id, url, caption, onClose: () => (onClose ? onClose(_id) : null) }); + return _id; + } else showMsgErr(ERROR.P8O_API_UNAVAILABLE); + }, + [showMsgErr, guidGenerator] + ); + //Отображение раздела "ПАРУС 8 Онлайн" const pOnlineShowUnit = useCallback( ({ unitCode, showMethod = "main", inputParameters }) => { @@ -130,6 +142,7 @@ export const ApplicationContext = ({ children }) => { { //Контроль свойств - Провайдер контекста приложения ApplicationContext.propTypes = { + guidGenerator: PropTypes.func.isRequired, children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]) }; diff --git a/app/core/utils.js b/app/core/utils.js index 3f50da5..a93545a 100644 --- a/app/core/utils.js +++ b/app/core/utils.js @@ -62,8 +62,14 @@ const formatDateRF = value => (value ? dayjs(value).format("DD.MM.YYYY") : null) //Форматирование числа в "Денежном" формате РФ const formatNumberRFCurrency = value => (hasValue(value) ? new Intl.NumberFormat("ru-RU", { minimumFractionDigits: 2 }).format(value) : null); +//Формирование уникального идентификатора +const genGUID = () => + "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c => + (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + ); + //---------------- //Интерфейс модуля //---------------- -export { hasValue, getDisplaySize, deepCopyObject, object2Base64XML, formatDateRF, formatNumberRFCurrency }; +export { hasValue, getDisplaySize, deepCopyObject, object2Base64XML, formatDateRF, formatNumberRFCurrency, genGUID }; diff --git a/app/panels/prj_jobs/prj_jobs.js b/app/panels/prj_jobs/prj_jobs.js index 0a7b66d..2ef43aa 100644 --- a/app/panels/prj_jobs/prj_jobs.js +++ b/app/panels/prj_jobs/prj_jobs.js @@ -34,7 +34,7 @@ const PrjJobs = () => { const { showMsgErr, showMsgWarn, showMsgInfo } = useContext(MessagingСtx); //Подключение к контексту приложения - const { pOnlineShowDocument, pOnlineShowDictionary, pOnlineUserProcedure, pOnlineUserReport } = useContext(ApplicationСtx); + const { pOnlineShowTab, pOnlineShowDocument, pOnlineShowDictionary, pOnlineUserProcedure, pOnlineUserReport } = useContext(ApplicationСtx); //Выполнение запроса к серверу const makeReq = async throwError => { @@ -54,6 +54,16 @@ const PrjJobs = () => { } }; + //Отображение закладки + const openTab = () => { + const id = pOnlineShowTab({ id: "123", url: "Modules/p8-panels/#/prj_fin", caption: "Экономика проектов", onClose: handleTabClose }); + if (id) console.log(`Открыта закладка ${id}`); + else console.log("Закладка не открыта"); + }; + + //При сокрытии закладки + const handleTabClose = id => console.log(`Закрыта закладка ${id}`); + //Генерация содержимого return (
@@ -71,6 +81,8 @@ const PrjJobs = () => {

+ +

diff --git a/app/root.js b/app/root.js index da6a908..c9507fb 100644 --- a/app/root.js +++ b/app/root.js @@ -12,6 +12,7 @@ import { MessagingContext } from "./context/messaging"; //Контекст со import { BackEndContext } from "./context/backend"; //Контекст взаимодействия с сервером import { ApplicationContext } from "./context/application"; //Контекст приложения import { App } from "./app"; //Приложение +import { genGUID } from "./core/utils"; //Вспомогательные функции //----------- //Тело модуля @@ -22,7 +23,7 @@ const Root = () => { return ( - +