import { PpHttpOptions } from '@penpencil/common'; import { PpButton } from '../components/button/button.type'; import { PpIcon } from '../components/icon/icon.type'; import { EventEmitter } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { PpRelativeValidation } from './relative-validation'; export interface PpForm { discriminator: 'formConfig'; type: 'create' | 'edit'; formFields: PpFormField[]; formButton: PpButton; dataSource?: any; getApi?: PpHttpOptions; existingData?: any; hasAction?: boolean; apiDataKey?: string; submitApi?: SubmitApi; columnPerRow: number; maxWidth?: number; header?: string; submitSuccessMessage?: string; sendAll?: boolean; resetEvent?: EventEmitter; selectSearchDebounceWait?: number; showPreview?: boolean; } export interface SubmitApi extends PpHttpOptions { relativeApiInfo?: { queryParams?: PpParamInfo[]; }; } export interface PpFormField { name: string; type: 'text' | 'number' | 'password' | 'radio' | 'checkbox' | 'multicheckbox' | 'select' | 'date' | 'time' | 'toggle' | 'rich-textarea' | 'autocomplete' | 'image' | 'document' | 'tags' | 'group' | 'textarea' | 'hidden' | 'array'; formFields?: PpFormField[]; disabled?: boolean; defaultValue?: any; isDataPopulated?: boolean; populatedData?: any; value?: string; required?: PpBooleanValidation; placeholder: string; pattern?: PpStringValidation; fieldChangeCapture?: boolean | false; fieldsDependentOnCurrentField?: string[]; logicFunction?: Function; checkbox?: { activeValue: string | boolean; inActiveValue: string | boolean; text?: { active: string; inActive: string; }; }; isGrouped?: boolean; groupedValues?: PpGroupedValueItem[]; values?: PpValueItem[]; multipleSelect?: boolean; selectAll?: boolean; date?: { enabledTime?: boolean; dateRange?: { minDate?: Date; maxDate?: Date; }; enabledRange?: boolean; }; file?: { api: PpHttpOptions; apiKey: string; acceptType: string; multipleSelect: boolean; limit?: number; sizeLimitInMbs?: number; dimensions?: ImageDimension; payloadName?: string; viewValue?: { apiViewValueKey: string; viewValueKeySeparator?: Array; value?: string; }; src?: { dataSource?: any; srcDataKey?: string; srcForImage?: string; srcKeySeparator?: string[]; }; isAudio?: boolean; isS3Signed?: boolean; }; tags?: { type: 'default' | 'select'; }; helperText?: string; columnPerRow?: number; selectionLimit?: { value: number; message: string; }; select?: { type: 'api' | 'local' | 'relative'; needAddButton?: boolean; addButtonConfig?: PpSelectButtonConfig; api?: PpHttpOptions; apiDataKey?: string; apiValueKey?: string; apiViewValueKey?: string; viewValueSeparators?: Array; viewValueKey?: { format: string; keys: string[]; }; convertType?: 'string'; relativeApiInfo?: { queryParams?: PpParamInfo[]; }; offSetComplete?: boolean; pagination?: { pageKey: string; limit: string; initialOffSet: string; }; dataSource?: Array; mode?: string; searchable?: boolean; searchConfig?: { searchKey: string; placeholder?: string; pattern?: PpStringValidation; }; }; autoComplete?: { type: 'local' | 'api'; api?: PpHttpOptions; autocompleteParamKeys?: Array; apiDataKey?: string; apiValueKey?: string; apiViewValueKey?: string; viewValueSeparators?: Array; convertType?: 'string'; dataSource?: Array; autocompleteSearchText?: string; minCharacters?: number; }; relativeValidation?: PpRelativeValidation[]; relatedTo?: Array; send?: 'alwaysSend' | 'notSend' | 'sendOnModified'; relativeSetFields?: Array; relativeSetValues?: Array; relativeSetDynamically?: PpRelativeSetDynamicalValue; hideFormFields?: PpHideFormFields; isHidden?: boolean; formArray?: { addButton?: PpButton; deleteButton?: PpButton; deleteLastElement?: number; limit?: number; }; asyncValidation?: AsyncValidation; outline?: boolean; prefixIcon?: PpIcon; suffixIcon?: PpIcon; displayCondition?: PpConditionConfig; formControl?: FormControl; controlId?: string; searchFormControl?: FormControl; isArrayChild?: boolean; siblings?: PpFormField[]; parentFormGroup?: FormGroup; permissionNames?: string[]; } export interface PpSelectButtonConfig { buttonName: string; buttonComponent: any; componentHeader?: string; inputData?: PpFormsModalActionInput[]; } export declare type PpFormsModalActionInput = { key: string; value: any; }; export interface PpNumberValidation { value: number; errorMessage: string; } export interface PpStringValidation { value: string; errorMessage: string; } export interface PpBooleanValidation { value: boolean; errorMessage?: string; } export interface PpParamInfo { key: string; value: string; regex?: boolean; isOptional?: boolean; date?: 'isStartOfDay' | 'isEndOfDay'; } /** * Relative Field Ineterface * * Use in Case of Form Field Relation */ export interface PpRelativeSetField { key: string; value?: string; type: 'same' | 'different' | 'auto-pickup'; differentType?: 'dataSource' | 'local'; differentValueExtractor?: Function; } export interface PpRelativeSetDynamicalValue { type: 'formula'; formula: string; keys: string[]; key: string; } export interface PpRelativeSetValue { key: string; } /** * Relative Field Hide Interface * * Use in Case of Hide form Field on related Property */ export interface PpHideFormFields { keys: string[]; value: any; operator: 'equals' | 'notEquals'; } /** * Async Validation Interface */ export interface AsyncValidation { api: PpHttpOptions; apiDataKey?: string; condition: PpConditionConfig; minCharacters?: number; errorMessage: string; apiParamKey: string; } /** * Use in Case of Select & Autocomplete */ export interface PpValueItem { value: string; viewValue: string; [string: string]: string; } export interface PpGroupedValueItem { group: string; values: PpValueItem[]; } /** * Conditions Interface * * Use in case of conditional validate * * Single Condition Match */ export interface PpConditionConfig { type: 'single' | 'group'; match?: { key?: string; value?: any; operator: 'equals' | 'notEquals' | 'empty' | 'notEmpty' | 'includes'; }; group?: PpGroupCondition; } /** * Group Conditions Interface * * Use in case of conditional validate * * Group Condition Match */ export interface PpGroupCondition { type: 'and' | 'or'; values: PpConditionConfig[]; } export interface ImageDimension { width: { min?: number; max?: number; }; height: { min?: number; max?: number; }; }