da65cf4bf7
- AdminLayout: отдельный sidebar теало-нуар с под-брендом ADMIN (red error 10px JBM uppercase) + 4 nav (Тенанты 142 / Биллинг / Инциденты 3 / Система) + topbar с crumb «Админка → currentPage» + admin-user-chip с error-color avatar. - AdminTenantsView (/admin/tenants): page-head + 5-stats + Экспорт + search/Статус/Тариф фильтры + v-data-table 7 колонок (Тенант с двухстрочным name+inn / Статус-chip 4 цвета / Тариф / Баланс ₽ с error-color при <0 / Желаем×факт / MRR с «—» / Активность). - mockTenants.ts соответствует schema v8.7 §3: 4 статуса × 5 тарифов, 7 mock с разнообразием (active/trial/overdue/suspended) + AdminStats (142/128/9/5/ 1 248 600 ₽). - AdminPlaceholderView универсальный для Биллинг/Инциденты/Система с описаниями ссылающимися на schema v8.7 (incidents_log §9 / system_settings §10). - AppShell расширен meta.layout='admin'. Router: /admin redirect на /tenants + 4 admin-route'а с lazy-imports. Web.php fallback покрывает /admin/*. - cspell-words.txt: Екб. Vitest +11 (всего 129/129 за 10.02s): - заголовок + 5 stats (regex nbsp в 1 248 600 ₽) + 7 columns + 7 rows + Окна Москва ИНН + overdue −1 200 + trial 4 дня + suspended + search filter «Натяжные» → 1 row + Экспорт/Статус/Тариф кнопки. Регресс: lint+type+format OK; vitest 129/129; vite build (admin views в lazy-chunks; main 104.99 KB); story:build 21/28 за 30.32s; Pest 48/48 за 4.89s. CLAUDE.md v1.30->v1.31, реестр Открытых_вопросов v1.39->v1.40. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
28 lines
1.2 KiB
Vue
28 lines
1.2 KiB
Vue
<script setup lang="ts">
|
|
/**
|
|
* Корневой shell приложения. Мапит meta.layout текущего route'а на layout-компонент.
|
|
*
|
|
* meta.layout = 'auth' → AuthLayout (двухпанельный для login/register/2fa/forgot/recovery).
|
|
* meta.layout = 'error' → RouterView напрямую (ErrorView сам предоставляет v-app + теало-нуар bg).
|
|
* meta.layout не задан или 'app' → AppLayout (sidebar + topbar для авторизованных страниц).
|
|
*
|
|
* Источник дизайна: liderra_v8_handoff/concepts/v8_login.html (auth),
|
|
* v8_dashboard.html (app), v8_errors.html (error).
|
|
*/
|
|
import { computed } from 'vue';
|
|
import { RouterView, useRoute } from 'vue-router';
|
|
import AdminLayout from '../layouts/AdminLayout.vue';
|
|
import AppLayout from '../layouts/AppLayout.vue';
|
|
import AuthLayout from '../layouts/AuthLayout.vue';
|
|
|
|
const route = useRoute();
|
|
const layoutName = computed(() => route.meta.layout ?? 'app');
|
|
</script>
|
|
|
|
<template>
|
|
<AuthLayout v-if="layoutName === 'auth'" />
|
|
<RouterView v-else-if="layoutName === 'error'" />
|
|
<AdminLayout v-else-if="layoutName === 'admin'" />
|
|
<AppLayout v-else />
|
|
</template>
|