UNPKG

magner

Version:

Universal admin panel magnetic to any backend

68 lines (67 loc) 3.55 kB
import type { SupportedDataTypes } from '../../utils/form/form'; import type { TranslateData } from '../../utils/core/translate'; import type { MixedChecker } from '../../utils/core/mixed-check'; import type { SupportedValidators } from '../../types'; import type { GenericComponent, GenericForm, InnerConditions } from './index'; export type SupportedComponentTypes = 'button' | 'input' | 'input-phone' | 'textarea' | 'checkbox' | 'radio' | 'switch' | 'select' | 'dropzone' | 'datetime' | 'editor' | 'collection' | 'custom' | 'color-picker'; export interface BaseProps<ENTITY extends {}> { class?: string; /** Displays the red asterisk next to the field label. Does not influence any validations! */ required?: boolean; /** Whether the field is disabled. Accepts static boolean or the dynamic * MixedChecker function with access to the user's role and form's state */ disabled?: boolean | MixedChecker<ENTITY>; /** Hides the field from the form if 'true' */ hidden?: boolean | MixedChecker<ENTITY>; /** If 'true', the field gets a design made for the better readability */ readOnly?: boolean | MixedChecker<ENTITY>; /** If 'true', the field set class 'changed' */ changed?: boolean | MixedChecker<ENTITY>; hiddenCollectionAddButton?: boolean | MixedChecker<ENTITY>; /** If `readOnly: true`, parse the value of the form field to display as a string */ readOnlyFormatter?: (val: any) => string; /** Magner's inner properties. No need to change */ inner?: Partial<InnerConditions<ENTITY>>; } export interface BaseValidation { /** Choose any supported validators to speed up the validation process */ type: SupportedValidators; /** An event that triggers the validation to start */ trigger: 'blur' | 'change' | 'input'; } export interface FormInteractionsData<ENTITY extends {}> { form: Record<string, any>; getField: <FIELD extends GenericComponent<ENTITY> = GenericComponent<ENTITY>>(name: keyof ENTITY) => FIELD | undefined; config: GenericForm<ENTITY>; isNew: boolean; data?: unknown; } export type FieldInteractions<ENTITY extends {}> = (arg_1: FormInteractionsData<ENTITY>, currentCollectionItem?: Record<string, any>) => void; export interface BaseField<ENTITY extends {}> { /** Choose any supported type of the field */ type: SupportedComponentTypes; /** Unique name identifier of the field. It is required to be the same one incoming or outcoming to the backend */ name: keyof ENTITY; /** A label to be displayed next to the field component */ label?: TranslateData; labelWidth?: string; /** If you need to explain what some field means, put the hint there. HTML is allowed in the tooltip */ hint?: TranslateData; /** Any attributes passed to the base HTML-tag */ props: BaseProps<ENTITY>; /** How and when to validate the field */ validation?: BaseValidation | BaseValidation[]; /** Needed to setup initial values for the fields. Default is 'string' that returns and empty string '' */ dataType?: SupportedDataTypes; /** Hides the fields with v-show, so that Vue can display it later with some transition */ hidden?: boolean; /** * When the field value is changed, this action is triggered. Use it to change other fields * configuration. Can be used in cases like dynamic displaying/disabling of hidden fields etc. */ changeAction?: FieldInteractions<ENTITY>; /** * pointer to parent element in collection */ parent?: unknown; }