import React from "react"; import BaseWidget, { WidgetProps, WidgetState } from "./BaseWidget"; import { WidgetType } from "constants/WidgetConstants"; import ButtonComponent, { ButtonType, } from "components/designSystems/blueprint/ButtonComponent"; import { EventType, ExecutionResult } from "constants/ActionConstants"; import { BASE_WIDGET_VALIDATION, WidgetPropertyValidationType, } from "utils/ValidationFactory"; import { VALIDATION_TYPES } from "constants/WidgetValidation"; import { TriggerPropertiesMap } from "utils/WidgetFactory"; class FormButtonWidget extends BaseWidget< FormButtonWidgetProps, FormButtonWidgetState > { onButtonClickBound: (event: React.MouseEvent) => void; constructor(props: FormButtonWidgetProps) { super(props); this.onButtonClickBound = this.onButtonClick.bind(this); this.state = { isLoading: false, }; } static getPropertyValidationMap(): WidgetPropertyValidationType { return { ...BASE_WIDGET_VALIDATION, text: VALIDATION_TYPES.TEXT, disabledWhenInvalid: VALIDATION_TYPES.BOOLEAN, buttonStyle: VALIDATION_TYPES.TEXT, buttonType: VALIDATION_TYPES.TEXT, // onClick: VALIDATION_TYPES.ACTION_SELECTOR, }; } static getTriggerPropertyMap(): TriggerPropertiesMap { return { onClick: true, }; } onButtonClick() { if (this.props.onClick) { this.setState({ isLoading: true, }); super.executeAction({ dynamicString: this.props.onClick, event: { type: EventType.ON_CLICK, callback: this.handleActionResult, }, }); } else if (this.props.resetFormOnClick && this.props.onReset) { this.props.onReset(); } } handleActionResult = (result: ExecutionResult) => { this.setState({ isLoading: false, }); if (result.success) { if (this.props.resetFormOnClick && this.props.onReset) this.props.onReset(); } }; getPageView() { const disabled = this.props.disabledWhenInvalid && "isFormValid" in this.props && !this.props.isFormValid; return ( ); } getWidgetType(): WidgetType { return "FORM_BUTTON_WIDGET"; } } export type ButtonStyle = | "PRIMARY_BUTTON" | "SECONDARY_BUTTON" | "SUCCESS_BUTTON" | "DANGER_BUTTON"; export interface FormButtonWidgetProps extends WidgetProps { text?: string; buttonStyle?: ButtonStyle; onClick?: string; isVisible?: boolean; buttonType: ButtonType; isFormValid?: boolean; resetFormOnClick?: boolean; onReset?: () => void; disabledWhenInvalid?: boolean; } export interface FormButtonWidgetState extends WidgetState { isLoading: boolean; } export default FormButtonWidget;