import { HTMLTemplateResult, LitElement, TemplateResult } from "lit";
import { Ref } from "lit-html/directives/ref.js";
import { FButtonState, FDividerState, FEmojiPickerCustomEmojiData, FEmojiPickerExcludesCategories, FEmojiPickerIncludesCategories, FFileUploadFileType, FFileUploadSizeProp, FIconButtonSize, FIconButtonState, FIconButtonType, FIconButtonVariant, FSelectOptions, FSuggestSuggestions, FSelectOptionTemplate, FDateTimePickerState, FDateOption, DateDisableType, FRootTooltip, FColorPickerState, FSelectMaxOptionsWidth, FSuggestWhen } from "@nonfx/flow-core";
import { BetweenParams } from "./modules/validation/rules/between";
import { SimpleSubject } from "@nonfx/flow-core-config";
import { MaxParams } from "./modules/validation/rules/max";
import { MinParams } from "./modules/validation/rules/min";
import { MaxValueParams } from "./modules/validation/rules/max-value";
import { MinValueParams } from "./modules/validation/rules/min-value";
import { RegexParams } from "./modules/validation/rules/regex";
export type FormBuilderFieldEvents = {
onClick?: (event: PointerEvent) => void;
onInput?: (event: Event) => void;
onFocus?: (event: FocusEvent) => void;
onKeyPress?: (event: KeyboardEvent) => void;
onKeyDown?: (event: KeyboardEvent) => void;
onKeyUp?: (event: KeyboardEvent) => void;
onMouseOver?: (event: MouseEvent) => void;
};
export type FormBuilderBaseField = {
id?: string;
state?: "default" | "success" | "danger" | "warning" | "primary";
className?: string;
qaId?: string;
label?: FormBuilderLabel;
ariaLabel?: string;
layout?: "label-left";
validationRules?: FormBuilderValidationRules;
disabled?: boolean;
helperText?: string | HTMLTemplateResult;
showWhen?: FormBuilderShowCondition;
} & FormBuilderFieldEvents;
export type FormBuilderArrayField = FormBuilderBaseField & {
type: "array";
field: FormBuilderField;
label: FormBuilderLabel;
allowEmpty?: boolean;
};
export type FormBuilderColorPickerField = FormBuilderBaseField & {
type: "color";
state?: FColorPickerState;
readOnly?: boolean;
};
export type FormBuilderSeparatorField = FormBuilderFieldEvents & {
id?: string;
state?: FDividerState;
className?: string;
type: "separator";
title?: string;
showWhen?: FormBuilderShowCondition;
qaId?: string;
direction?: "vertical" | "horizontal";
};
export type FormBuilderHiddenField = {
id?: string;
className?: string;
type: "hidden";
qaId?: string;
showWhen?: undefined;
};
export type CanValidateFields = Exclude;
export type FormBuilderObjectField = FormBuilderBaseField & {
type: "object";
direction?: "vertical" | "horizontal";
gap?: "small" | "medium" | "large" | "x-small";
variant?: "normal" | "compact";
isCollapsible?: boolean;
isCollapsed?: boolean;
fields: Record;
fieldSeparator?: boolean;
};
export type FormBuilderTextInputField = FormBuilderBaseField & {
type: "text" | "email" | "password" | "url" | "tel" | "number";
placeholder?: string;
iconLeft?: string;
iconRight?: string;
prefix?: string;
suffix?: string;
maxLength?: number;
loading?: boolean;
readonly?: boolean;
clear?: boolean;
autofocus?: boolean;
autocomplete?: string;
suffixWhen?: FormBuilderSuffixCondition;
};
export type FormBuilderEmojiField = FormBuilderBaseField & {
type: "emoji";
placeholder?: string;
recent?: string[];
include?: FEmojiPickerIncludesCategories;
exclude?: FEmojiPickerExcludesCategories;
excludeEmojis?: string[];
custom?: FEmojiPickerCustomEmojiData;
closeOnSelect?: boolean;
clear?: boolean;
disabled?: boolean;
};
export type FormBuilderDatetimeField = FormBuilderBaseField & {
type: "datetime";
mode?: "date-time" | "date-only" | "time-only";
placeholder?: string;
state?: FDateTimePickerState;
minDate?: FDateOption;
maxDate?: FDateOption;
disableDate?: DateDisableType;
clear?: boolean;
isRange?: boolean;
inline?: boolean;
weekNumber?: boolean;
disabled?: boolean;
loading?: boolean;
};
export type FormBuilderSuggestField = FormBuilderBaseField & {
type: "suggest";
placeholder?: string;
iconLeft?: string;
iconRight?: string;
prefix?: string;
suffix?: string;
maxLength?: number;
loading?: boolean;
readonly?: boolean;
clear?: boolean;
optionsMaxHeight?: string;
suggestions?: FSuggestSuggestions;
suffixWhen?: FormBuilderSuffixCondition;
suggestWhen?: FSuggestWhen;
};
export type FormBuilderFileField = FormBuilderBaseField & {
type: "file";
multiple?: boolean;
placeholder?: string;
fileType?: FFileUploadFileType;
maxSize?: FFileUploadSizeProp;
disabled?: boolean;
loading?: boolean;
};
export type FormBuilderCheckboxField = FormBuilderBaseField & {
type: "checkbox";
options: CheckboxOptions;
direction?: "vertical" | "horizontal";
gap?: "large" | "medium" | "small" | "x-small";
};
export type FormBuilderRadioField = FormBuilderBaseField & {
type: "radio";
options: RadioOptions;
direction?: "vertical" | "horizontal";
gap?: "large" | "medium" | "small" | "x-small";
};
export type FormBuilderSwitchField = FormBuilderBaseField & {
type: "switchButton";
};
export type FormBuilderSelectField = FormBuilderBaseField & {
type: "select";
selection?: "single" | "multiple";
placeholder?: string;
options: FSelectOptions;
optionTemplate?: FSelectOptionTemplate;
iconLeft?: string;
height?: number;
width?: string | number;
maxOptionsWidth?: FSelectMaxOptionsWidth;
searchable?: boolean;
clear?: boolean;
checkbox?: boolean;
selectionLimit?: number;
createOption?: boolean;
loading?: boolean;
useVirtualizer?: boolean;
};
export type FormBuilderTextAreaField = FormBuilderBaseField & {
type: "textarea";
placeholder?: string;
maxLength?: number;
readonly?: boolean;
clear?: boolean;
rows?: string;
resizable?: boolean;
maskValue?: boolean;
};
export type FormBuilderButtonField = Omit & {
type: "button";
label: string;
category?: "fill" | "outline" | "transparent";
variant?: "round" | "curved" | "block";
size?: "large" | "medium" | "small" | "x-small";
state?: FButtonState;
iconLeft?: string;
iconRight?: string;
counter?: string;
loading?: boolean;
disabled?: boolean;
onMouseLeave?: (event: MouseEvent) => void;
};
export type FormBuilderIconButtonField = Omit & {
type: "icon-button";
icon: string;
state?: FIconButtonState;
counter?: string;
loading?: boolean;
disabled?: boolean;
variant?: FIconButtonVariant;
category?: FIconButtonType;
size?: FIconButtonSize;
onMouseLeave?: (event: MouseEvent) => void;
};
export type CheckboxOption = {
id: string;
qaId?: string;
title?: string | HTMLTemplateResult;
description?: string;
iconTooltip?: FRootTooltip;
subTitle?: string;
disabled?: boolean;
};
export type RadioOption = CheckboxOption;
export type CheckboxOptions = CheckboxOption[];
export type RadioOptions = RadioOption[];
export type FormBuilderField = FormBuilderTextInputField | FormBuilderCheckboxField | FormBuilderTextAreaField | FormBuilderRadioField | FormBuilderSwitchField | FormBuilderSelectField | FormBuilderButtonField | FormBuilderIconButtonField | FormBuilderArrayField | FormBuilderObjectField | FormBuilderSuggestField | FormBuilderFileField | FormBuilderSeparatorField | FormBuilderEmojiField | FormBuilderHiddenField | FormBuilderDatetimeField | FormBuilderColorPickerField;
export type FormBuilderShowCondition = (value: T) => boolean;
export type FormBuilderSuffixCondition = (value: string) => boolean;
export type FormBuilderLabel = {
title: string | HTMLTemplateResult;
description?: string;
iconTooltip?: FRootTooltip;
subTitle?: string | HTMLTemplateResult;
};
export type FormBuilderValidationRuleTriggers = "blur" | "keyup" | "click" | "keypress" | "focus" | "input" | "change";
export type FormBuilderValidationMessage = (name: string, value: Type) => string;
export type FormBuilderValidationRule = {
when?: FormBuilderValidationRuleTriggers[];
message?: string | FormBuilderValidationMessage;
params?: Record;
};
export type FormBuilderValidationRequiredRule = FormBuilderValidationRule & {
name: "required";
};
export type FormBuilderValidationEmailRule = FormBuilderValidationRule & {
name: "email";
};
export type FormBuilderValidationBetweenRule = FormBuilderValidationRule & {
name: "between";
params: BetweenParams;
};
export type FormBuilderValidationMaxRule = FormBuilderValidationRule & {
name: "max";
params: MaxParams;
};
export type FormBuilderValidationMinRule = FormBuilderValidationRule & {
name: "min";
params: MinParams;
};
export type FormBuilderValidationMaxValueRule = FormBuilderValidationRule & {
name: "max-value";
params: MaxValueParams;
};
export type FormBuilderValidationMinValueRule = FormBuilderValidationRule & {
name: "min-value";
params: MinValueParams;
};
export type FormBuilderValidationRegexRule = FormBuilderValidationRule & {
name: "regex";
params: RegexParams;
};
export type FormBuilderCustomValidationRule = FormBuilderValidationRule & {
name: "custom";
when?: FormBuilderValidationRuleTriggers[];
validate: FormBuilderValidatorFunction | FormBuilderAsyncValidatorFunction;
};
export type FormBuilderValidatorFunction> = (value: TValue, params?: TParams) => boolean;
export type FormBuilderAsyncValidatorFunction> = (value: TValue, params?: TParams) => Promise;
export type FormBuilderGenericValidationRule = FormBuilderValidationRequiredRule | FormBuilderCustomValidationRule | FormBuilderValidationEmailRule | FormBuilderValidationBetweenRule | FormBuilderValidationMaxRule | FormBuilderValidationMinRule | FormBuilderValidationMinValueRule | FormBuilderValidationMaxValueRule | FormBuilderValidationRegexRule;
export type FormBuilderValidationRules = FormBuilderGenericValidationRule[];
export type FomrBuilderSuffixStateObject = {
suffixFunction?: FormBuilderSuffixCondition;
suffix?: string;
};
export type FormBuilderFieldRenderFunction = (name: string, field: FormBuilderField, fieldRef: Ref, value: unknown) => TemplateResult;
export type FFormInputElements = {
value: FormBuilderValues;
state?: "primary" | "default" | "success" | "warning" | "danger";
validate: (silent: boolean) => FormBuilderValidationPromise;
showWhenSubject: SimpleSubject;
} & LitElement;
export type FormBuilderValidationPromise = Promise<{
result: boolean;
message: string | null;
name: string;
label?: FormBuilderLabel | string;
rule: FormBuilderGenericValidationRule["name"];
}>;
export type FormBuilderValues = Record | Record[] | string[] | string | number | number[];
export type ValidationResults = ({
result: boolean;
message: string | null;
name: string;
rule: FormBuilderGenericValidationRule["name"];
} | ValidationResults)[];
export type ValidationResult = {
result: boolean;
message: string | null;
name: string;
rule: FormBuilderGenericValidationRule["name"];
};
export type FormBuilderState = {
errors?: ValidationResult[];
isValid: boolean;
isChanged: boolean;
};
export type FormBuilderSize = "medium" | "small";
export type FormBuilderVariant = "curved" | "round" | "block";
export type FormBuilderCategory = "fill" | "outline" | "transparent";
export type FormBuilderGap = "large" | "medium" | "small" | "x-small";