magner
Version:
Universal admin panel magnetic to any backend
139 lines (113 loc) • 4.55 kB
text/typescript
/* eslint-disable no-use-before-define */
import type { RouteComponent } from 'vue-router';
import type { TranslateData } from 'lib/utils/core/translate';
import { MixedChecker } from 'lib/utils/core/mixed-check';
import type { GenericComponent, InnerConditions } from './index';
interface FormLayoutBase<ENTITY extends {}> {
title?: TranslateData,
layout?: GenericFormLayout<ENTITY>[],
fields?: GenericComponent<ENTITY>[],
}
interface LayoutPropsBase<ENTITY extends {}> {
/** Add any class to the layout block */
class?: string,
/** Sets shadow and a padding to the block, visually taking it out of the form */
isPaper?: boolean,
/** What type of styles to apply to the title of the block:<br>
* • label – small text that can group fields in one row<br>
* • heading – h2 tag that visually separates the group from the form
*/
titleType?: 'label' | 'heading',
/** Style object to be applied to the row or column */
styles?: Record<string, string>,
/** Style object to be applied to the row or column of mobile breakpoint */
mobileStyles?: Record<string, string>,
/** Hides the layout if 'true' */
hidden?: boolean | MixedChecker<ENTITY>;
/** Magner's inner properties. No need to change */
inner?: Partial<InnerConditions<ENTITY>>
}
/** RowBase defines element-ui el-row's attributes:
* https://element-plus.org/#/en-US/component/layout#row-attributes */
interface RowBase <ENTITY extends {}> extends LayoutPropsBase<ENTITY> {
/** Grid spacing */
gutter?: number,
/** Horizontal alignment of flex layout */
justify?: 'start' | 'end' | 'center' | 'space-around' | 'space-between',
/** Vertical alignment of flex layout */
align?: 'top' | 'middle' | 'bottom',
/** Whether nested elements of the row should take full width or not */
elementsGrow?: boolean,
/** Custom element tag */
tag?: string,
}
/** Define different column types */
interface RowFields<ENTITY extends {}> extends FormLayoutBase<ENTITY> {
type: 'row',
props: RowBase<ENTITY>,
layout?: never,
component?: never,
fields: GenericComponent<ENTITY>[],
}
interface RowLayout<ENTITY extends {}> extends FormLayoutBase<ENTITY> {
type: 'row',
props: RowBase<ENTITY>,
layout: GenericFormLayout<ENTITY>[],
component?: never,
fields?: never,
}
export type FormLayoutRow<ENTITY extends {}> = RowLayout<ENTITY> | RowFields<ENTITY>;
/** ColumnBase defines element-ui el-col's attributes:
* https://element-plus.org/#/en-US/component/layout#col-attributes */
interface ColumnBase <ENTITY extends {}> extends LayoutPropsBase<ENTITY> {
/** Number of column the grid spans */
span?: number,
/** Number of spacing on the left side of the grid */
offset?: number,
/** Number of columns that grid moves to the right */
push?: number,
/** Number of columns that grid moves to the left */
pull?: number,
/** Column Span for <768px */
xs?: number | { span: number, offset: number },
/** Column Span for ≥768px */
sm?: number | { span: number, offset: number },
/** Column Span for ≥992px */
md?: number | { span: number, offset: number },
/** Column Span for ≥1200px */
lg?: number | { span: number, offset: number },
/** Column Span for ≥1920px */
xl?: number | { span: number, offset: number },
/** Custom element tag */
tag?: string,
}
/** Define different column types */
export interface ColumnFields<ENTITY extends {}> extends FormLayoutBase<ENTITY> {
type: 'column',
props: ColumnBase<ENTITY>,
layout?: never,
component?: never,
fields: GenericComponent<ENTITY>[],
}
export interface ColumnLayout<ENTITY extends {}> extends FormLayoutBase<ENTITY>, ColumnBase<ENTITY> {
type: 'column',
props: ColumnBase<ENTITY>,
layout: GenericFormLayout<ENTITY>[],
component?: never,
fields?: never,
}
export type FormLayoutColumn<ENTITY extends {}> = ColumnLayout<ENTITY> | ColumnFields<ENTITY>;
/** Custom layout allows adding your own components */
export interface FormLayoutCustom<ENTITY extends {}> extends FormLayoutBase<ENTITY> {
type: 'custom',
layout?: never,
fields?: never,
component: () => (RouteComponent | (() => Promise<RouteComponent>)),
props: Record<string, any>,
}
export type GenericFormLayout<ENTITY extends {}> =
| FormLayoutRow<ENTITY>
| FormLayoutColumn<ENTITY>
| FormLayoutCustom<ENTITY>;
/** Form layout. Allows creating infinitely-nested layouts of rows, columns and custom components */
export type FormLayout<ENTITY extends {}> = GenericFormLayout<ENTITY> | GenericComponent<ENTITY>[];