UNPKG

magner

Version:

Universal admin panel magnetic to any backend

70 lines (69 loc) 3.35 kB
import type { ButtonProps } from '../../types/form/fields/button'; import type { RouteLocationRaw, Router, RouteLocation } from 'vue-router'; import type { LStorage } from '../../utils/core/local-storage'; import type { TranslateData } from '../../utils/core/translate'; import { RouteComponent } from 'vue-router'; /** Return from the action function is an error string or boolean (true = error happened) */ export type ActionReturn = TranslateData | boolean; /** * Function that is passed as an argument to the ActionFunc. * Performs some user-defined action and returns a string error or boolean if error has happened */ export type ActionCallback<RESULT = any, DATA = any> = (info: { data: DATA; router: Router; lstorage: LStorage; }) => Promise<ActionReturn>; /** A wrapper around ActionCallback. Used by users as `action(() => {})`, * and the result is passed to the ActionWrapper */ export type ActionFunc = <RESULT = any, DATA = any, EMITTER = string>(cb: ActionCallback<RESULT, DATA>) => ActionCallback<RESULT, DATA>; /** Function accepts ActionCallback and passes `data` to it. Always used to invoke actions */ export type ActionWrapper = <RESULT = any, DATA = any>(data: DATA, cb: ActionCallback<RESULT, DATA>) => Promise<ActionReturn>; interface ActionButtonBase<ENTITY extends {}> { loading?: boolean; props: ButtonProps<ENTITY>; } /** Link actions are displayed as an `<el-button>` inside the `<router-link>` */ export interface ActionLink<ENTITY extends {}> extends ActionButtonBase<ENTITY> { type: 'link'; to: ((route: RouteLocation) => RouteLocationRaw) | RouteLocationRaw; external?: boolean; } /** * 'Action' action buttons are simple `<el-button`s, click on which calls the `action` function, * waits for it to finish and emits the `emits` event to the parent component to do another action. */ export interface ActionAction<EMITTER = string, ENTITY = {}> extends ActionButtonBase<ENTITY> { type: 'action'; action?: ActionCallback; emits?: EMITTER; } /** ActionButtons are either links or buttons. They are displayed in forms and table filters */ export type ActionButton<EMITTERS, ENTITY> = ActionLink<ENTITY> | ActionAction<EMITTERS, ENTITY>; /** * Typings for the specific actions: in card form, table etc. They differ in what data is passed to them */ interface ActionDataBase<ENTITY extends {}> { form: ENTITY; } interface ActionCardData<ENTITY extends {}> extends ActionDataBase<ENTITY> { id?: string | number | Record<string, unknown>; isNew: boolean; data: null | ENTITY; } export type ActionFuncCard = <ENTITY extends {}, RESULT = any, EMITTER = string>(cb: ActionCallback<RESULT, ActionCardData<ENTITY>>) => ActionCallback<RESULT, ActionCardData<ENTITY>>; interface ActionTableData<ENTITY extends {}> extends ActionDataBase<ENTITY> { selected: ENTITY[]; pagination: { items?: number | undefined; page?: number | undefined; }; filters: ENTITY | Record<string, any>; sort: ENTITY | Record<string, any>; } export type ActionFuncTable = <ENTITY extends {}, RESULT = any, EMITTER = string>(cb: ActionCallback<RESULT, ActionTableData<ENTITY>>) => ActionCallback<RESULT, ActionTableData<ENTITY>>; export interface CustomAction<EMITTER = string> { component: () => RouteComponent; emits?: EMITTER; } export {};