Я обновил документацию, добавив обязательный шаг инициализации Monaco Editor через loader.config и loader.init, как вы указали. Это вынесено в отдельный важный блок, так как без этого компоненты редактора не будут работать.
Вот актуальная версия README.md:
isp-admin-ui-kit — это компонент базовой админ-панели для использования в других проектах. Библиотека предоставляет готовый каркас, навигацию, управление состоянием и типовые страницы, позволяя сосредоточиться на бизнес-логике.
- Возможности
- Установка и зависимости
- ⚙️ Настройка Monaco Editor
- Быстрый старт
- Настройка компонента AdminBase
- Работа с данными и Store
- Встроенные страницы
- Разработка и обновление версии
- Готовый Layout: Структура админ-панели с меню и навигацией.
- State Management: Redux Toolkit из коробки.
- UI Kit: Компоненты на базе Ant Design.
- Code Editor: Интеграция Monaco Editor.
- Базовые страницы: Пользователи, роли, логи, модули.
- Типизация: Полная поддержка TypeScript.
npm install isp-admin-ui-kitДля корректной работы необходимо установить следующие библиотеки:
npm install @monaco-editor/react antd axios dayjs monaco-editor react react-dom react-hook-form react-router-dom react-redux @reduxjs/toolkit swagger-ui-react isp-ui-kitТребуемые версии:
{
"@monaco-editor/react": "^4.7.0",
"@reduxjs/toolkit": "^2.2.3",
"antd": ">=5.12.2",
"axios": "^1.7.7",
"dayjs": "^1.11.10",
"isp-ui-kit": ">=1.0.0",
"monaco-editor": "^0.55.1",
"react": ">=18.2.0 <19",
"react-dom": ">=18.2.0 <19",
"react-hook-form": "^7.54.0",
"react-redux": "^9.1.0",
"react-router-dom": "^6.22.3",
"swagger-ui-react": "^5.31.0"
}
⚠️ Критически важно: Компоненты библиотеки, использующие редактор кода, не будут работать без предварительной инициализации loader.
Необходимо выполнить конфигурацию и инициализацию монико-редактора в точке входа вашего приложения (например, main.tsx или index.tsx) до рендеринга компонента AdminBase.
import * as monaco from 'monaco-editor';
import loader from '@monaco-editor/react';
// Конфигурация loader
loader.config({ monaco });
// Инициализация
loader.init().then(() => {
console.log('Monaco Editor initialized');
// Здесь можно запустить рендер приложения, если требуется гарантия загрузки
});Пример полной точки входа (main.tsx):
import React from 'react';
import ReactDOM from 'react-dom/client';
import * as monaco from 'monaco-editor';
import loader from '@monaco-editor/react';
import { baseSetupStore, AdminBase } from 'isp-admin-ui-kit';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
// 1. Настройка Monaco
loader.config({ monaco });
loader.init().then(() => {
// 2. Инициализация Store
const store = baseSetupStore();
// 3. Рендер приложения
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<AdminBase />
</BrowserRouter>
</Provider>
</React.StrictMode>
);
});🔧 Пример настройки
Добавьте конфигурацию до инициализации loader:
import { loader } from '@monaco-editor/react';
import * as monaco from 'monaco-editor';
// импорт worker-файлов
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
// настройка окружения Monaco
self.MonacoEnvironment = {
getWorker(_: unknown, label: string) {
if (label === 'json') return new jsonWorker();
if (label === 'css' || label === 'scss' || label === 'less') return new cssWorker();
if (label === 'html' || label === 'handlebars' || label === 'razor') return new htmlWorker();
if (label === 'typescript' || label === 'javascript') return new tsWorker();
return new editorWorker();
},
};
// конфигурация loader
loader.config({ monaco });
// инициализация
loader.init();После настройки Monaco Editor, базовое подключение выглядит следующим образом:
import { baseSetupStore, AdminBase } from 'isp-admin-ui-kit';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
const store = baseSetupStore();
const App = () => {
return (
<Provider store={store}>
<BrowserRouter>
<AdminBase />
</BrowserRouter>
</Provider>
);
};Компонент AdminBase поддерживает гибкую настройку через пропсы.
| Название | Описание | Пример |
|---|---|---|
customRouters |
Массив объектов маршрутов. | [{ route, element, label, key }] |
configProviderProps |
Пропсы для ConfigProvider (Ant Design). |
{ theme: lightTheme, locale: ru } |
defaultRoutePath |
Путь для редиректа с главной страницы (/). |
"/modules" |
excludePermissions |
Массив пермишенов для скрытия стандартных страниц. | [PermissionKeysType.user_view] |
⚠️ Важно: Для корректной работы пунктов меню значения полейrouteиkeyдолжны совпадать.
| Параметр | Тип | Описание |
|---|---|---|
route |
string |
Путь маршрута (URL). |
element |
ReactNode |
Компонент, отображаемый по маршруту. |
label |
string |
Название маршрута (текст в меню). |
key |
string |
Уникальный ключ маршрута (должен совпадать с route). |
permissions |
string[] |
Список разрешений для доступа. |
icon |
ReactNode |
Иконка маршрута. |
children |
Array |
Вложенные маршруты. |
className |
string |
Класс для оформления пункта меню. |
Пример:
const customRouters = [
{
route: '/dashboard',
key: 'dashboard', // Должно совпадать с route
label: 'Dashboard',
element: <Dashboard />,
permissions: ['admin', 'user'],
icon: <DashboardIcon />,
className: 'red-menu',
},
];
<AdminBase customRouters={customRouters} />;Для скрытия стандартных страниц используйте массив excludePermissions. Ключи импортируются через PermissionKeysType.
import { PermissionKeysType } from 'isp-admin-ui-kit';
const excludePermissions = [
PermissionKeysType.user_view,
PermissionKeysType.session_view,
];
<AdminBase excludePermissions={excludePermissions} />;<AdminBase
customRouters={customRouters}
configProviderProps={{ theme: lightTheme, locale: ru }}
defaultRoutePath="/dashboard"
excludePermissions={excludePermissions}
/>;import { baseSetupStore } from 'isp-admin-ui-kit';
import { Provider } from 'react-redux';
const store = baseSetupStore();
<Provider store={store}>
<App />
</Provider>;baseSetupStore принимает параметр apiServices для подключения пользовательских редьюсеров и RTK Query сервисов.
const apiServices = {
modulesServiceApi,
UIReducer,
};
const store = baseSetupStore(apiServices);import { baseApiServices } from 'isp-admin-ui-kit';
const { data, isLoading, isError } = baseApiServices.roleApi.useGetAllRolesQuery();Библиотека предоставляет готовый набор страниц:
- Приложения: Управление настройками приложений.
- Доступы приложений: Настройка методов доступа.
- Модули: Конфигурация системных модулей.
- Пользователи: Список и управление пользователями.
- Роли: Управление ролями и правами.
- Сессии: Журнал пользовательских сессий.
- Журналы ИБ: Просмотр событий безопасности.
# Установка зависимостей
npm install
# Сборка
npm run buildЧтобы обновить версию пакета:
- Обновите значение
versionвpackage.json. - Добавьте соответствующую запись в
CHANGELOG.md. - Закоммитьте изменения:
git commit -m "up version to X.Y.Z" git push
MIT License.