import React from "react"; import styled from "styled-components"; import { labelStyle } from "constants/DefaultTheme"; import { ComponentProps } from "components/designSystems/appsmith/BaseComponent"; import { Intent, NumericInput, IconName, InputGroup, Button, Label, Text, Classes, ControlGroup, TextArea, } from "@blueprintjs/core"; import { InputType } from "widgets/InputWidget"; import { WIDGET_PADDING } from "constants/WidgetConstants"; import { Colors } from "constants/Colors"; /** * All design system component specific logic goes here. * Ex. Blueprint has a sperarate numeric input and text input so switching between them goes here * Ex. To set the icon as currency, blue print takes in a set of defined types * All generic logic like max characters for phone numbers should be 10, should go in the widget */ const InputComponentWrapper = styled(ControlGroup)<{ isTextArea: boolean }>` &&&& { .${Classes.INPUT} { box-shadow: none; border: 1px solid ${Colors.GEYSER_LIGHT}; border-radius: ${props => props.theme.radii[1]}px; height: ${props => (props.isTextArea ? "100%" : "inherit")}; &:active { border: 1px solid ${Colors.HIT_GRAY}; } &:focus { border: 3px solid ${Colors.MYSTIC}; } } .${Classes.INPUT_GROUP} { display: block; margin: 0; } .${Classes.CONTROL_GROUP} { justify-content: flex-start; } height: ${props => (props.isTextArea ? "100%" : "auto")}; align-items: center; label { ${labelStyle} flex: 0 1 30%; margin: 7px ${WIDGET_PADDING * 2}px 0 0; text-align: right; align-self: flex-start; } } `; class InputComponent extends React.Component< InputComponentProps, InputComponentState > { constructor(props: InputComponentProps) { super(props); this.state = { showPassword: false }; } onTextChange = ( event: | React.ChangeEvent | React.ChangeEvent, ) => { this.props.onValueChange(event.target.value); }; onNumberChange = (valueAsNum: number, valueAsString: string) => { this.props.onValueChange(valueAsString); }; isNumberInputType(inputType: InputType) { return ( inputType === "INTEGER" || inputType === "NUMBER" || inputType === "CURRENCY" ); } getIcon(inputType: InputType) { switch (inputType) { case "PHONE_NUMBER": return "phone"; case "SEARCH": return "search"; case "EMAIL": return "envelope"; default: return undefined; } } getType(inputType: InputType) { switch (inputType) { case "PASSWORD": return this.state.showPassword ? "text" : "password"; case "EMAIL": return "email"; case "SEARCH": return "search"; default: return "text"; } } private numericInputComponent = () => ( ); private textAreaInputComponent = (