magner
Version:
Universal admin panel magnetic to any backend
126 lines (125 loc) • 4.75 kB
TypeScript
import type { RouteComponent } from 'vue-router';
import type { TranslateData } from '../../utils/core/translate';
import { MixedChecker } from '../../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>[];
export {};