|
@@ -1,4 +1,4 @@
|
|
|
-import type { FC } from 'react';
|
|
|
|
|
|
|
+import type { CSSProperties, FC } from 'react';
|
|
|
import React, {
|
|
import React, {
|
|
|
memo, useCallback, useEffect, useRef, useState,
|
|
memo, useCallback, useEffect, useRef, useState,
|
|
|
} from 'react';
|
|
} from 'react';
|
|
@@ -9,12 +9,17 @@ import AutosizeInput from 'react-input-autosize';
|
|
|
import type { AlertInfo } from '~/client/util/input-validator';
|
|
import type { AlertInfo } from '~/client/util/input-validator';
|
|
|
import { AlertType, inputValidator } from '~/client/util/input-validator';
|
|
import { AlertType, inputValidator } from '~/client/util/input-validator';
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+// for react-input-autosize
|
|
|
|
|
+type InputRefCallback = (instance: HTMLInputElement | null) => void;
|
|
|
|
|
+
|
|
|
export type ClosableTextInputProps = {
|
|
export type ClosableTextInputProps = {
|
|
|
value?: string
|
|
value?: string
|
|
|
placeholder?: string
|
|
placeholder?: string
|
|
|
validationTarget?: string,
|
|
validationTarget?: string,
|
|
|
useAutosizeInput?: boolean
|
|
useAutosizeInput?: boolean
|
|
|
inputClassName?: string,
|
|
inputClassName?: string,
|
|
|
|
|
+ inputStyle?: CSSProperties,
|
|
|
onPressEnter?(inputText: string): void
|
|
onPressEnter?(inputText: string): void
|
|
|
onPressEscape?(inputText: string): void
|
|
onPressEscape?(inputText: string): void
|
|
|
onBlur?(inputText: string): void
|
|
onBlur?(inputText: string): void
|
|
@@ -24,10 +29,12 @@ export type ClosableTextInputProps = {
|
|
|
const ClosableTextInput: FC<ClosableTextInputProps> = memo((props: ClosableTextInputProps) => {
|
|
const ClosableTextInput: FC<ClosableTextInputProps> = memo((props: ClosableTextInputProps) => {
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
|
const {
|
|
const {
|
|
|
- validationTarget, onPressEnter, onPressEscape, onBlur, onChange,
|
|
|
|
|
|
|
+ validationTarget,
|
|
|
|
|
+ onPressEnter, onPressEscape, onBlur, onChange,
|
|
|
} = props;
|
|
} = props;
|
|
|
|
|
|
|
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
|
|
|
+
|
|
|
const [inputText, setInputText] = useState(props.value ?? '');
|
|
const [inputText, setInputText] = useState(props.value ?? '');
|
|
|
const [currentAlertInfo, setAlertInfo] = useState<AlertInfo | null>(null);
|
|
const [currentAlertInfo, setAlertInfo] = useState<AlertInfo | null>(null);
|
|
|
const [isAbleToShowAlert, setIsAbleToShowAlert] = useState(false);
|
|
const [isAbleToShowAlert, setIsAbleToShowAlert] = useState(false);
|
|
@@ -116,7 +123,6 @@ const ClosableTextInput: FC<ClosableTextInputProps> = memo((props: ClosableTextI
|
|
|
const inputProps = {
|
|
const inputProps = {
|
|
|
'data-testid': 'closable-text-input',
|
|
'data-testid': 'closable-text-input',
|
|
|
value: inputText || '',
|
|
value: inputText || '',
|
|
|
- ref: inputRef,
|
|
|
|
|
type: 'text',
|
|
type: 'text',
|
|
|
placeholder: props.placeholder,
|
|
placeholder: props.placeholder,
|
|
|
name: 'input',
|
|
name: 'input',
|
|
@@ -129,12 +135,13 @@ const ClosableTextInput: FC<ClosableTextInputProps> = memo((props: ClosableTextI
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const inputClassName = `form-control ${props.inputClassName ?? ''}`;
|
|
const inputClassName = `form-control ${props.inputClassName ?? ''}`;
|
|
|
|
|
+ const inputStyle = props.inputStyle;
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
<div>
|
|
<div>
|
|
|
{ props.useAutosizeInput
|
|
{ props.useAutosizeInput
|
|
|
- ? <AutosizeInput inputClassName={inputClassName} {...inputProps} />
|
|
|
|
|
- : <input className={inputClassName} {...inputProps} />
|
|
|
|
|
|
|
+ ? <AutosizeInput inputRef={inputRef as unknown as InputRefCallback} inputClassName={inputClassName} inputStyle={inputStyle} {...inputProps} />
|
|
|
|
|
+ : <input ref={inputRef} className={inputClassName} style={inputStyle} {...inputProps} />
|
|
|
}
|
|
}
|
|
|
{isAbleToShowAlert && <AlertInfo />}
|
|
{isAbleToShowAlert && <AlertInfo />}
|
|
|
</div>
|
|
</div>
|