Маршрут /admin (вкладки «Пользователи» и «Матрица прав») и пункт «Система → Пользователи и роли» в меню; без USERS_ADMIN в /me — экран «Нет доступа», таблицы не монтируются и запросов к /admin/* нет, пункт меню скрыт. Почему без Redux: данные экрана нужны только ему, после каждой правки перечитываются с сервера — хватает локального state и маленького хука useAsyncData (отбрасывает устаревшие ответы и ответы после ухода со страницы). Клиент один — api/client.ts (Bearer из sessionStorage, ошибки сервера -> ApiError с кодом и текстом); ошибки показываются через App.useApp().message (корень обёрнут в antd App). Экран показывает только серверное состояние: при отказе (409 LAST_ADMIN и др.) — уведомление и перечитывание, матрица сохраняет роли по очереди. РАИСА появится в auth/: токен даст SSO вместо dev-входа; этот экран и клиент не меняются. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import { createRoot } from 'react-dom/client';
|
||
import './index.css';
|
||
import { App as AntApp, ConfigProvider } from 'antd';
|
||
import App from './App';
|
||
|
||
const rootElement = document.getElementById('root');
|
||
if (!rootElement) {
|
||
throw new Error('Элемент #root не найден');
|
||
}
|
||
|
||
createRoot(rootElement).render(
|
||
// <StrictMode>
|
||
<ConfigProvider
|
||
theme={{
|
||
token: {
|
||
colorPrimary: 'rgba(0, 255, 0, 0.5)',
|
||
colorPrimaryHover: 'rgba(0, 255, 0, 1)',
|
||
colorBgLayout: 'rgb(247, 248, 250)',
|
||
},
|
||
components: {
|
||
Layout: {
|
||
siderBg: '#fff',
|
||
},
|
||
Button: {
|
||
// textHoverBg: "green",
|
||
colorBorder: 'rgba(0,0,0,0.5)',
|
||
defaultActiveBorderColor: 'rgba(0,0,0,0.5)',
|
||
defaultBorderColor: 'rgba(0,0,0,0.5)',
|
||
},
|
||
Input: {
|
||
activeBorderColor: 'rgba(46, 166, 75, 0.35)',
|
||
activeShadow: '0 0 0 1px #2ea64b59,0 1px 2px #0000000f',
|
||
hoverBorderColor: 'rgba(46, 166, 75, 0.35)',
|
||
},
|
||
},
|
||
}}
|
||
>
|
||
{/* AntApp даёт message/notification через App.useApp() с темой ConfigProvider; component={false} — без лишнего div */}
|
||
<AntApp component={false}>
|
||
<App />
|
||
</AntApp>
|
||
</ConfigProvider>,
|
||
// </StrictMode>,
|
||
);
|