WEB APP: В контекст приложения добавлена API-фанкция для открытия закладки "ПАРУС 8 Онлайн"

This commit is contained in:
Mikhail Chechnev 2023-09-25 13:33:42 +03:00
parent e46214df89
commit 085364f4e8
4 changed files with 37 additions and 4 deletions

View File

@ -34,7 +34,7 @@ const P8O_API = window.parent?.parus?.clientApi;
export const ApplicationСtx = createContext(); export const ApplicationСtx = createContext();
//Провайдер контекста приложения //Провайдер контекста приложения
export const ApplicationContext = ({ children }) => { export const ApplicationContext = ({ guidGenerator, children }) => {
//Подключим редьюсер состояния //Подключим редьюсер состояния
const [state, dispatch] = useReducer(applicationReducer, INITIAL_STATE); 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); 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 Онлайн" //Отображение раздела "ПАРУС 8 Онлайн"
const pOnlineShowUnit = useCallback( const pOnlineShowUnit = useCallback(
({ unitCode, showMethod = "main", inputParameters }) => { ({ unitCode, showMethod = "main", inputParameters }) => {
@ -130,6 +142,7 @@ export const ApplicationContext = ({ children }) => {
<ApplicationСtx.Provider <ApplicationСtx.Provider
value={{ value={{
findPanelByName, findPanelByName,
pOnlineShowTab,
pOnlineShowUnit, pOnlineShowUnit,
pOnlineShowDocument, pOnlineShowDocument,
pOnlineShowDictionary, pOnlineShowDictionary,
@ -145,5 +158,6 @@ export const ApplicationContext = ({ children }) => {
//Контроль свойств - Провайдер контекста приложения //Контроль свойств - Провайдер контекста приложения
ApplicationContext.propTypes = { ApplicationContext.propTypes = {
guidGenerator: PropTypes.func.isRequired,
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]) children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
}; };

View File

@ -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 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 };

View File

@ -34,7 +34,7 @@ const PrjJobs = () => {
const { showMsgErr, showMsgWarn, showMsgInfo } = useContext(MessagingСtx); 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 => { 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 ( return (
<div> <div>
@ -71,6 +81,8 @@ const PrjJobs = () => {
<br /> <br />
<Button onClick={() => navigateRoot()}>Домой</Button> <Button onClick={() => navigateRoot()}>Домой</Button>
<br /> <br />
<Button onClick={openTab}>Открыть закладку</Button>
<br />
<Button onClick={() => makeReq(false)}>Без Exception</Button> <Button onClick={() => makeReq(false)}>Без Exception</Button>
<br /> <br />
<Button onClick={() => makeReq(true)}>С Exception</Button> <Button onClick={() => makeReq(true)}>С Exception</Button>

View File

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