Первый коммит существующего состояния. Ядро кладётся под git ради того, чтобы половины разъезжались в продуктовые репозитории через git subtree, а не копированием: subtree делает настоящий merge, хранит историю и умеет отдавать правки обратно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
41 lines
2.0 KiB
TypeScript
41 lines
2.0 KiB
TypeScript
// Слой сессии и прав. Опционален: панель без учёток и ролей (плоский список
|
|
// вкладок, доступных всем) обходится BasePageProps и в этот модуль не заходит.
|
|
|
|
// "*" в permissions — владелец, доступ ко всему в обход остальных проверок.
|
|
export const OWNER_PERMISSION = '*';
|
|
|
|
export function hasPermission(permissions: string[], perm: string): boolean {
|
|
return permissions.includes(OWNER_PERMISSION) || permissions.includes(perm);
|
|
}
|
|
|
|
// Что оболочка узнаёт о вошедшем. Отдаётся эндпоинтом сессии, адрес и форма
|
|
// ответа которого задаются в конфиге панели (loadSession).
|
|
export interface Session {
|
|
user: string | null;
|
|
userId: string | null;
|
|
role: string;
|
|
permissions: string[];
|
|
}
|
|
|
|
export const EMPTY_SESSION: Session = { user: null, userId: null, role: '', permissions: [] };
|
|
|
|
// Пропсы вкладки в панели без прав: вкладке нужен только токен и снэкбар.
|
|
export interface BasePageProps {
|
|
token: string;
|
|
showMsg: (text: string) => void;
|
|
}
|
|
|
|
// Пропсы вкладки в панели с сессией и правами.
|
|
export interface SessionPageProps extends BasePageProps {
|
|
username: string;
|
|
userId: string;
|
|
role: string;
|
|
permissions: string[];
|
|
// Все permission-строки, встречающиеся у вкладок — нужно только тем вкладкам,
|
|
// которые сами выдают права; остальные это поле игнорируют.
|
|
availablePermissions: string[];
|
|
// Переключить активную вкладку по её id из metadata.json. Роутера в панели
|
|
// нет — активная вкладка это состояние оболочки.
|
|
onNavigate: (tabId: string) => void;
|
|
}
|