UNPKG

magner

Version:

Universal admin panel magnetic to any backend

97 lines (96 loc) 3.69 kB
import type { RouteComponent, RouteLocationRaw } from 'vue-router'; import type { IconImport } from '../../../types/utils/useful'; import type { TranslateData } from '../../../utils/core/translate'; import type { RouteBase, Route, FinalNoLayoutRoute } from '../../../types/configs/routing/routing'; export type SupportedLayouts = 'main' | 'empty'; interface LayoutProps { } /** Default properties applicable to most of layouts */ export interface LayoutBase { layout: SupportedLayouts | RouteComponent | (() => Promise<RouteComponent>); name: string; path: string; props: LayoutProps; routes: FinalNoLayoutRoute[]; } /** Route configuration used in the Empty layout */ export interface EmptyLayoutRoute extends Route { } /** Layout with no wrapping around routes. Hence, empty */ export interface EmptyLayout extends LayoutBase { layout: 'empty'; routes: FinalNoLayoutRoute<EmptyLayoutRoute>[]; props: {}; } /** Route configuration used in the Main layout */ export interface MainLayoutRoute extends Route { /** Display title in the sidebar and a page */ title?: TranslateData; /** Whether to display in the sidebar or not */ visible?: boolean; /** Sidebar icon */ icon?: IconImport; /** Use this link to override the 'path' route property in the sidebar */ link?: RouteLocationRaw; } /** Group property of the main layout props. Lists the route names to visually group them in the sidebar */ export interface MainLayoutGroup<ROUTE = string> { /** Unique name of the group */ name: string; /** The names of routes to group together */ routes: ROUTE[]; /** Display group title in the sidebar */ title: TranslateData; /** Sidebar icon of the group */ icon?: IconImport; } /** Properties of the 'main' layout */ export interface MainLayoutProps extends LayoutProps { /** A wide icon to display as the project logo. Displayed when the sidebar is not collapsed */ headerIcon?: IconImport; /** Project logo small icon. Displayed when the sidebar is collapsed */ headerCollapsedIcon?: IconImport; /** Project title is written in the header **only** if `headerIcon` is not chosen */ headerTitle?: TranslateData; sidebarGroups?: MainLayoutGroup[]; } /** Main layout has a header and a sidebar with nested routes */ export interface MainLayout extends LayoutBase { layout: 'main'; routes: FinalNoLayoutRoute<MainLayoutRoute>[]; props: MainLayoutProps; } /** * Route configuration used in the Custom layout. * It is made for you to extend in any way possible with new properties */ export interface CustomLayoutRoute extends Route { [key: string | number]: unknown; } export interface CustomLayoutProps extends LayoutProps { [key: string | number]: unknown; } /** * Custom layout accepts your component as 'layout'.<br> * Read the guide in docs on how to extend it and use in your app */ export interface CustomLayout extends LayoutBase { layout: RouteComponent | (() => Promise<RouteComponent>); routes: FinalNoLayoutRoute<CustomLayoutRoute>[]; props: CustomLayoutProps; } /** Layout is a wrapper component over your routes. Can be custom, main or empty */ export type Layout = CustomLayout | EmptyLayout | MainLayout; export interface RouteLayout extends RouteBase { /** * Layout of the page. Supports several types: * * empty – blank page * * main – header, sidebar included * * custom – you pass your own layout as a component with <router-view> inside of it * * Other keys of the 'layout' object are used inside those layouts */ type: 'layout'; layout: Layout; } export {};