diff options
| author | crupest <crupest@outlook.com> | 2020-10-27 19:21:35 +0800 | 
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2020-10-27 19:21:35 +0800 | 
| commit | 05ccb4d8f1bbe3fb64e117136b4a89bcfb0b0b33 (patch) | |
| tree | 929e514de85eb82a5acb96ecffc6e6d2d95f878f /FrontEnd/src/app/views/common/SearchInput.tsx | |
| parent | 986c6f2e3b858d6332eba0b42acc6861cd4d0227 (diff) | |
| download | timeline-05ccb4d8f1bbe3fb64e117136b4a89bcfb0b0b33.tar.gz timeline-05ccb4d8f1bbe3fb64e117136b4a89bcfb0b0b33.tar.bz2 timeline-05ccb4d8f1bbe3fb64e117136b4a89bcfb0b0b33.zip  | |
Split front and back end.
Diffstat (limited to 'FrontEnd/src/app/views/common/SearchInput.tsx')
| -rw-r--r-- | FrontEnd/src/app/views/common/SearchInput.tsx | 63 | 
1 files changed, 63 insertions, 0 deletions
diff --git a/FrontEnd/src/app/views/common/SearchInput.tsx b/FrontEnd/src/app/views/common/SearchInput.tsx new file mode 100644 index 00000000..9833d515 --- /dev/null +++ b/FrontEnd/src/app/views/common/SearchInput.tsx @@ -0,0 +1,63 @@ +import React, { useCallback } from "react"; +import clsx from "clsx"; +import { useTranslation } from "react-i18next"; +import { Spinner, Form, Button } from "react-bootstrap"; + +export interface SearchInputProps { +  value: string; +  onChange: (value: string) => void; +  onButtonClick: () => void; +  className?: string; +  loading?: boolean; +  buttonText?: string; +  placeholder?: string; +  additionalButton?: React.ReactNode; +} + +const SearchInput: React.FC<SearchInputProps> = (props) => { +  const { onChange, onButtonClick } = props; + +  const { t } = useTranslation(); + +  const onInputChange = useCallback( +    (event: React.ChangeEvent<HTMLInputElement>): void => { +      onChange(event.currentTarget.value); +    }, +    [onChange] +  ); + +  const onInputKeyPress = useCallback( +    (event: React.KeyboardEvent<HTMLInputElement>): void => { +      if (event.key === "Enter") { +        onButtonClick(); +      } +    }, +    [onButtonClick] +  ); + +  return ( +    <Form inline className={clsx("my-2", props.className)}> +      <Form.Control +        className="mr-sm-2 flex-grow-1" +        value={props.value} +        onChange={onInputChange} +        onKeyPress={onInputKeyPress} +        placeholder={props.placeholder} +      /> +      <div className="mt-2 mt-sm-0 order-sm-last ml-sm-3"> +        {props.additionalButton} +      </div> +      <div className="mt-2 mt-sm-0 ml-auto ml-sm-0"> +        {props.loading ? ( +          <Spinner variant="primary" animation="border" /> +        ) : ( +          <Button variant="outline-primary" onClick={props.onButtonClick}> +            {props.buttonText ?? t("search")} +          </Button> +        )} +      </div> +    </Form> +  ); +}; + +export default SearchInput;  | 
