ma7engine: ядро, шаблон панели, скаффолдер и доктор
Первый коммит существующего состояния. Ядро кладётся под git ради того, чтобы половины разъезжались в продуктовые репозитории через git subtree, а не копированием: subtree делает настоящий merge, хранит историю и умеет отдавать правки обратно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
// Слой сессии и прав. Опционален: панель без учёток и ролей (плоский список
|
||||
// вкладок, доступных всем) обходится 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;
|
||||
}
|
||||
Reference in New Issue
Block a user