Поддержка
Кастомизация

Страницы

Добавление кастомных страниц в навигацию без создания модуля

Pages — это легковесный способ добавить кастомную страницу в навигацию Frame. В отличие от модулей, Pages не требуют composer-пакета, ServiceProvider или бэкенд-логики — всё настраивается на фронтенде.

Когда использовать

PagesМодули
БэкендНетServiceProvider, Controller, routes
НавигацияСекция «Разделы»Секция «Модули»
АвторизацияНет (или вручную)Gate через ModuleManager
ПоискАвтоматически в глобальном поискеЧерез SearchService
ПакетизацияНетComposer-пакет
Use caseДашборды, гайды, статические страницыАудит, интеграции, сложная логика

Быстрый старт

Для добавления страницы нужны две вещи: регистрация в навигации через useMenu() и регистрация роута через extendRoutes().

resources/js/frame.js
import { useMenu } from '@frame/core'
import { extendRoutes, DashboardLayout } from '@frame/vue'
import { IconChartBar } from '@tabler/icons-vue'

const { addPage } = useMenu()

addPage({
  name: 'analytics',
  label: 'Аналитика',
  icon: IconChartBar,
  to: '/analytics',
  caption: 'Статистика и графики',
})

extendRoutes([{
  path: '/analytics',
  name: 'analytics',
  component: () => import('./pages/AnalyticsPage.vue'),
  meta: { layout: DashboardLayout },
}])
Регистрируйте страницы до вызова app.use(FramePlugin, ...) — роуты должны быть добавлены до создания роутера.

useMenu()

Composable с реактивным состоянием. Можно вызывать из любого места — навигация обновится автоматически.

import { useMenu } from '@frame/core'

const { pages, addPage, removePage, clear } = useMenu()

Методы

addPage
(page: MenuPage) => void
Добавляет страницу в навигацию. Если страница с таким name уже существует — обновляет её.
removePage
(name: string) => void
Удаляет страницу из навигации по имени.
clear
() => void
Удаляет все зарегистрированные страницы.
pages
MenuPage[]
Реактивный массив всех зарегистрированных страниц. Можно использовать для чтения.
name
string
Уникальное имя страницы. Используется как ключ и как имя роута.
label
string
Отображаемое название. Будет пропущено через translate().
icon
Component
Vue-компонент иконки (например, из @tabler/icons-vue).
to
string
Путь роута (например /analytics).
caption
string
Описание, отображается в выпадающем меню и в глобальном поиске.
order
number
Порядок в меню. По умолчанию 0. Меньше — выше.

Навигация

Зарегистрированные страницы появляются в навигации в секции Разделы — выпадающий список, аналогичный секции «Модули».

Глобальный поиск

Страницы автоматически индексируются в глобальном поиске. Поиск производится по label и caption на стороне фронтенда.

Компонент страницы

pages/AnalyticsPage.vue
<template>
  <Page
    :title="translate('Аналитика')"
    :breadcrumbs="[
      { label: translate('Home'), to: '/' },
      { label: translate('Аналитика') },
    ]"
  >
    <!-- содержимое страницы -->
  </Page>
</template>

<script lang="ts" setup>
import { translate } from '@frame/core'
import { Page } from '@frame/vue'
</script>

Используйте компонент Page из @frame/vue для единообразного оформления с breadcrumbs и заголовком.