- 각 필터 키패드 가림 현상 수정

This commit is contained in:
HyeonJongKim
2025-11-20 18:51:50 +09:00
parent e0e22920cd
commit 61993298a7
22 changed files with 103 additions and 35 deletions

View File

@@ -13,6 +13,7 @@ import { getResultStatusBtnGroup, getSearchTypeOption } from '@/entities/additio
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const AccountHolderSearchFilter = ({ export const AccountHolderSearchFilter = ({
filterOn, filterOn,
@@ -33,7 +34,7 @@ export const AccountHolderSearchFilter = ({
setResultStatus setResultStatus
}: AccountHolderSearchFilterProps) => { }: AccountHolderSearchFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchType, setFilterSearchType] = useState<AccountHolderSearchCl>(searchType); const [filterSearchType, setFilterSearchType] = useState<AccountHolderSearchCl>(searchType);
const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword); const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword);
@@ -85,7 +86,7 @@ export const AccountHolderSearchFilter = ({
<div className="full-menu-actions"> <div className="full-menu-actions">
<FullMenuClose <FullMenuClose
addClass='full-menu-close' addClass='full-menu-close'
onClickToCallback={ onClickToClose } onClickToCallback={onClickToClose}
></FullMenuClose> ></FullMenuClose>
</div> </div>
</div> </div>
@@ -104,6 +105,7 @@ export const AccountHolderSearchFilter = ({
selectOptions={getSearchTypeOption(t)} selectOptions={getSearchTypeOption(t)}
inputValue={filterSearchKeyword} inputValue={filterSearchKeyword}
inputSetter={setFilterSearchKeyword} inputSetter={setFilterSearchKeyword}
handleInputFocus={handleInputFocus}
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
startDate={filterStartDate} startDate={filterStartDate}

View File

@@ -18,6 +18,7 @@ import { getArsOrderStatusBtnGroup, getArsPaymentStatusBtnGroup } from '../../..
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks/use-keyboard-aware';
export interface ArsFilterProps { export interface ArsFilterProps {
filterOn: boolean; filterOn: boolean;
@@ -60,7 +61,7 @@ export const ArsFilter = ({
setMinAmount, setMinAmount,
setMaxAmount setMaxAmount
}: ArsFilterProps) => { }: ArsFilterProps) => {
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterMoid, setFilterMoid] = useState<string>(moid); const [filterMoid, setFilterMoid] = useState<string>(moid);
const [filterFromDate, setFilterFromDate] = useState<string>(moment(fromDate).format('YYYYMMDD')); const [filterFromDate, setFilterFromDate] = useState<string>(moment(fromDate).format('YYYYMMDD'));
@@ -122,6 +123,7 @@ export const ArsFilter = ({
title={t('transaction.constants.orderNumber')} title={t('transaction.constants.orderNumber')}
inputValue={ filterMoid } inputValue={ filterMoid }
inputSetter={ setFilterMoid } inputSetter={ setFilterMoid }
handleInputFocus={ handleInputFocus }
></FilterInput> ></FilterInput>
<FilterCalendar <FilterCalendar
title={t('filter.period')} title={t('filter.period')}
@@ -148,6 +150,8 @@ export const ArsFilter = ({
maxAmount={ filterMaxAmount } maxAmount={ filterMaxAmount }
setMinAmount={ setFilterMinAmount } setMinAmount={ setFilterMinAmount }
setMaxAmount={ setFilterMaxAmount } setMaxAmount={ setFilterMaxAmount }
handleInputFocus={ handleInputFocus }
keyboardAwarePadding={ keyboardAwarePadding }
></FilterRangeAmount> ></FilterRangeAmount>
</div> </div>
<div className="apply-row"> <div className="apply-row">

View File

@@ -13,6 +13,7 @@ import { getAuthResultBtnGroup, getTransactionTypeBtnGroup } from '@/entities/ad
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const FaceAuthFilter = ({ export const FaceAuthFilter = ({
filterOn, filterOn,
@@ -31,6 +32,7 @@ export const FaceAuthFilter = ({
setAuthResult setAuthResult
}: FaceAuthFilterProps) => { }: FaceAuthFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterMemberId, setFilterMemberId] = useState<string>(userMallId); const [filterMemberId, setFilterMemberId] = useState<string>(userMallId);
@@ -89,6 +91,7 @@ export const FaceAuthFilter = ({
title={t('additionalService.faceAuth.merchantMemberId')} title={t('additionalService.faceAuth.merchantMemberId')}
inputValue={filterMemberId} inputValue={filterMemberId}
inputSetter={setFilterMemberId} inputSetter={setFilterMemberId}
handleInputFocus={ handleInputFocus }
></FilterInput> ></FilterInput>
<FilterCalendar <FilterCalendar

View File

@@ -18,6 +18,7 @@ import { getAlimtalkAlimClBtnGroupForGeneral, getAlimtalkAlimClBtnGroupForVBank,
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export interface AlimtalkFilterProps { export interface AlimtalkFilterProps {
filterOn: boolean; filterOn: boolean;
@@ -65,6 +66,7 @@ export const AlimtalkFilter = ({
setSendCl setSendCl
}: AlimtalkFilterProps) => { }: AlimtalkFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchCl, setFilterSearchCl] = useState<AlimtalkSearchCl>(searchCl); const [filterSearchCl, setFilterSearchCl] = useState<AlimtalkSearchCl>(searchCl);
@@ -126,7 +128,7 @@ export const AlimtalkFilter = ({
<div className="full-menu-actions"> <div className="full-menu-actions">
<FullMenuClose <FullMenuClose
addClass='full-menu-close' addClass='full-menu-close'
onClickToCallback={ onClickToClose } onClickToCallback={onClickToClose}
></FullMenuClose> ></FullMenuClose>
</div> </div>
</div> </div>
@@ -134,7 +136,7 @@ export const AlimtalkFilter = ({
<FilterSelectMid <FilterSelectMid
title={t('filter.merchant')} title={t('filter.merchant')}
selectSetter={setFilterMid} selectSetter={setFilterMid}
showType={ 'GID' } showType={'GID'}
></FilterSelectMid> ></FilterSelectMid>
<FilterSelectInput <FilterSelectInput
title={t('additionalService.alimtalk.orderOrTid')} title={t('additionalService.alimtalk.orderOrTid')}
@@ -143,6 +145,7 @@ export const AlimtalkFilter = ({
selectOptions={getAlimtalkSearchClOptionGroup(t)} selectOptions={getAlimtalkSearchClOptionGroup(t)}
inputValue={filterSearchValue} inputValue={filterSearchValue}
inputSetter={setFilterSearchValue} inputSetter={setFilterSearchValue}
handleInputFocus={handleInputFocus}
></FilterSelectInput> ></FilterSelectInput>
<FilterSelect <FilterSelect
title={t('filter.paymentMethod')} title={t('filter.paymentMethod')}

View File

@@ -13,6 +13,7 @@ import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export interface FundAccountResultFilterProps { export interface FundAccountResultFilterProps {
filterOn: boolean; filterOn: boolean;
@@ -55,7 +56,7 @@ export const FundAccountResultFilter = ({
setResultStatus setResultStatus
}: FundAccountResultFilterProps) => { }: FundAccountResultFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchCl, setFilterSearchCl] = useState<FundAccountSearchCl>(searchCl); const [filterSearchCl, setFilterSearchCl] = useState<FundAccountSearchCl>(searchCl);
const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue); const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue);
@@ -132,6 +133,7 @@ export const FundAccountResultFilter = ({
selectOptions={getFundAccountSearchClOptionsGroup(t)} selectOptions={getFundAccountSearchClOptionsGroup(t)}
inputValue={filterSearchValue} inputValue={filterSearchValue}
inputSetter={setFilterSearchValue} inputSetter={setFilterSearchValue}
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterButtonGroups <FilterButtonGroups
title={t('additionalService.fundAccount.searchCriteria')} title={t('additionalService.fundAccount.searchCriteria')}

View File

@@ -13,6 +13,7 @@ import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export interface FundAccountTransactionFilterProps { export interface FundAccountTransactionFilterProps {
filterOn: boolean; filterOn: boolean;
@@ -51,7 +52,7 @@ export const FundAccountTransactionFilter = ({
setStatus setStatus
}: FundAccountTransactionFilterProps) => { }: FundAccountTransactionFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchCl, setFilterSearchCl] = useState<FundAccountSearchCl>(searchCl); const [filterSearchCl, setFilterSearchCl] = useState<FundAccountSearchCl>(searchCl);
const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue); const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue);
@@ -126,6 +127,7 @@ export const FundAccountTransactionFilter = ({
selectOptions={getFundAccountSearchClOptionsGroup(t)} selectOptions={getFundAccountSearchClOptionsGroup(t)}
inputValue={filterSearchValue} inputValue={filterSearchValue}
inputSetter={setFilterSearchValue} inputSetter={setFilterSearchValue}
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
title={t('filter.period')} title={t('filter.period')}

View File

@@ -13,6 +13,7 @@ import { getKeyInPaymentPaymentStatusBtnGroup } from '@/entities/additional-serv
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const KeyInPaymentFilter = ({ export const KeyInPaymentFilter = ({
filterOn, filterOn,
@@ -31,6 +32,7 @@ export const KeyInPaymentFilter = ({
setMaxAmount setMaxAmount
}: KeyInPaymentFilterProps) => { }: KeyInPaymentFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterStartDate, setFilterStartDate] = useState<string>(startDate); const [filterStartDate, setFilterStartDate] = useState<string>(startDate);
@@ -69,7 +71,7 @@ export const KeyInPaymentFilter = ({
<div className="full-menu-actions"> <div className="full-menu-actions">
<FullMenuClose <FullMenuClose
addClass='full-menu-close' addClass='full-menu-close'
onClickToCallback={ onClickToClose } onClickToCallback={onClickToClose}
></FullMenuClose> ></FullMenuClose>
</div> </div>
</div> </div>
@@ -101,6 +103,8 @@ export const KeyInPaymentFilter = ({
maxAmount={filterMaxAmount} maxAmount={filterMaxAmount}
setMinAmount={setFilterMinAmount} setMinAmount={setFilterMinAmount}
setMaxAmount={setFilterMaxAmount} setMaxAmount={setFilterMaxAmount}
handleInputFocus={handleInputFocus}
keyboardAwarePadding={keyboardAwarePadding}
></FilterRangeAmount> ></FilterRangeAmount>
</div> </div>
<div className="apply-row"> <div className="apply-row">

View File

@@ -17,6 +17,7 @@ import { LinkPaymentHistoryFilterProps, LinkPaymentPaymentStatus, LinkPaymentSea
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const LinkPaymentHistoryFilter = ({ export const LinkPaymentHistoryFilter = ({
filterOn, filterOn,
@@ -39,7 +40,7 @@ export const LinkPaymentHistoryFilter = ({
setSendMethod setSendMethod
}: LinkPaymentHistoryFilterProps) => { }: LinkPaymentHistoryFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchCl, setFilterSearchCl] = useState<LinkPaymentSearchCl>(searchCl); const [filterSearchCl, setFilterSearchCl] = useState<LinkPaymentSearchCl>(searchCl);
const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue); const [filterSearchValue, setFilterSearchValue] = useState<string>(searchValue);
@@ -130,6 +131,7 @@ export const LinkPaymentHistoryFilter = ({
selectOptions={searchTypeOption} selectOptions={searchTypeOption}
inputValue={filterSearchValue} inputValue={filterSearchValue}
inputSetter={setFilterSearchValue} inputSetter={setFilterSearchValue}
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
startDate={filterStartDate} startDate={filterStartDate}

View File

@@ -14,6 +14,7 @@ import { useStore } from '@/shared/model/store';
import { LinkPaymentProcessStatus, LinkPaymentSearchCl, LinkPaymentSendMethod, LinkPaymentSendStatus, LinkPaymentWaitFilterProps } from '@/entities/additional-service/model/link-pay/types'; import { LinkPaymentProcessStatus, LinkPaymentSearchCl, LinkPaymentSendMethod, LinkPaymentSendStatus, LinkPaymentWaitFilterProps } from '@/entities/additional-service/model/link-pay/types';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const LinkPaymentWaitSendFilter = ({ export const LinkPaymentWaitSendFilter = ({
filterOn, filterOn,
@@ -34,7 +35,7 @@ export const LinkPaymentWaitSendFilter = ({
setProcessStatus setProcessStatus
}: LinkPaymentWaitFilterProps) => { }: LinkPaymentWaitFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchType, setFilterSearchType] = useState<LinkPaymentSearchCl>(searchCl); const [filterSearchType, setFilterSearchType] = useState<LinkPaymentSearchCl>(searchCl);
const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword); const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword);
@@ -114,6 +115,7 @@ export const LinkPaymentWaitSendFilter = ({
selectOptions={searchTypeOption} selectOptions={searchTypeOption}
inputValue={filterSearchKeyword} inputValue={filterSearchKeyword}
inputSetter={setFilterSearchKeyword} inputSetter={setFilterSearchKeyword}
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
startDate={filterStartDate} startDate={filterStartDate}

View File

@@ -13,6 +13,7 @@ import { useStore } from '@/shared/model/store';
import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant'; import { FilterMotionDuration, FilterMotionStyle, FilterMotionVariants } from '@/entities/common/model/constant';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const SmsPaymentFilter = ({ export const SmsPaymentFilter = ({
filterOn, filterOn,
setFilterOn, setFilterOn,
@@ -30,6 +31,7 @@ export const SmsPaymentFilter = ({
setSmsCl setSmsCl
}: SmsPaymentFilterProps) => { }: SmsPaymentFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchCl, setFilterSearchCl] = useState<SmsPaymentSearchCl>(searchCl); const [filterSearchCl, setFilterSearchCl] = useState<SmsPaymentSearchCl>(searchCl);
@@ -84,7 +86,7 @@ export const SmsPaymentFilter = ({
<div className="full-menu-actions"> <div className="full-menu-actions">
<FullMenuClose <FullMenuClose
addClass='full-menu-close' addClass='full-menu-close'
onClickToCallback={ onClickToClose } onClickToCallback={onClickToClose}
></FullMenuClose> ></FullMenuClose>
</div> </div>
</div> </div>
@@ -103,6 +105,7 @@ export const SmsPaymentFilter = ({
selectOptions={searchTypeOption} selectOptions={searchTypeOption}
inputValue={filterSearchValue} inputValue={filterSearchValue}
inputSetter={setFilterSearchValue} inputSetter={setFilterSearchValue}
handleInputFocus={handleInputFocus}
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
startDate={filterFromDate} startDate={filterFromDate}

View File

@@ -1,3 +1,5 @@
import { CSSProperties, FocusEvent } from 'react';
export enum AppLanguage { export enum AppLanguage {
// DEVICE = 'DEVICE', // DEVICE = 'DEVICE',
KO = 'ko', KO = 'ko',
@@ -54,6 +56,8 @@ export interface FilterRangeAmountProps {
maxAmount?: number; maxAmount?: number;
setMinAmount: (minAmount?: number) => void; setMinAmount: (minAmount?: number) => void;
setMaxAmount: (maxAmount?: number) => void; setMaxAmount: (maxAmount?: number) => void;
handleInputFocus?: (e: FocusEvent<HTMLInputElement>) => void;
keyboardAwarePadding?: CSSProperties;
}; };
export interface FilterButtonGroupsProps { export interface FilterButtonGroupsProps {
title: string; title: string;

View File

@@ -24,6 +24,7 @@ import {
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks/use-keyboard-aware';
export const AllTransactionFilter = ({ export const AllTransactionFilter = ({
filterOn, filterOn,
@@ -79,7 +80,7 @@ export const AllTransactionFilter = ({
const midOptions = useStore.getState().UserStore.selectOptionsMids; const midOptions = useStore.getState().UserStore.selectOptionsMids;
const [statusCodeBtns, setStatusCodeBtns] = useState<Array<Record<string, string>>>(); const [statusCodeBtns, setStatusCodeBtns] = useState<Array<Record<string, string>>>();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const moidTidOptionsGroup = getAllTransactionMoidTidOptionsGroup(t); const moidTidOptionsGroup = getAllTransactionMoidTidOptionsGroup(t);
const allTransactionStatusCode = getAllTransactionStatusCode(t); const allTransactionStatusCode = getAllTransactionStatusCode(t);
@@ -243,6 +244,7 @@ export const AllTransactionFilter = ({
selectOptions={ moidTidOptionsGroup } selectOptions={ moidTidOptionsGroup }
inputValue={ filterMoidTidValue } inputValue={ filterMoidTidValue }
inputSetter={ setFilterMoidTidValue } inputSetter={ setFilterMoidTidValue }
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
title={t('filter.period')} title={t('filter.period')}
@@ -274,6 +276,7 @@ export const AllTransactionFilter = ({
maxAmount={ filterMaxAmount } maxAmount={ filterMaxAmount }
setMinAmount={ setFilterMinAmount } setMinAmount={ setFilterMinAmount }
setMaxAmount={ setFilterMaxAmount } setMaxAmount={ setFilterMaxAmount }
handleInputFocus={ handleInputFocus }
></FilterRangeAmount> ></FilterRangeAmount>
{/* {/*
<FilterSelect <FilterSelect
@@ -290,6 +293,8 @@ export const AllTransactionFilter = ({
selectOptions={ searchClOptionsGroup } selectOptions={ searchClOptionsGroup }
inputValue={ filterSearchValue } inputValue={ filterSearchValue }
inputSetter={ setFilterSearchValue } inputSetter={ setFilterSearchValue }
handleInputFocus={ handleInputFocus}
keyboardAwarePadding={ keyboardAwarePadding }
></FilterSelectInput> ></FilterSelectInput>
</div> </div>

View File

@@ -29,6 +29,7 @@ import {
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const BillingFilter = ({ export const BillingFilter = ({
filterOn, filterOn,
@@ -55,7 +56,7 @@ export const BillingFilter = ({
setMaxAmount setMaxAmount
}: BillingFilterProps) => { }: BillingFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchType, setFilterSearchType] = useState<BillingSearchType>(searchType); const [filterSearchType, setFilterSearchType] = useState<BillingSearchType>(searchType);
const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword); const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword);
@@ -124,7 +125,7 @@ export const BillingFilter = ({
<div className="option-list pt-16 pb-86"> <div className="option-list pt-16 pb-86">
<FilterSelectMid <FilterSelectMid
title={t('filter.merchant')} title={t('filter.merchant')}
selectSetter={ setMid } selectSetter={ setFilterMid }
showType={ 'GID' } showType={ 'GID' }
></FilterSelectMid> ></FilterSelectMid>
<FilterSelectInput <FilterSelectInput
@@ -134,6 +135,7 @@ export const BillingFilter = ({
selectOptions={ searchTypeOptionsGroup } selectOptions={ searchTypeOptionsGroup }
inputValue={ searchKeyword } inputValue={ searchKeyword }
inputSetter={ setFilterSearchKeyword } inputSetter={ setFilterSearchKeyword }
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
title={t('filter.period')} title={t('filter.period')}
@@ -168,6 +170,8 @@ export const BillingFilter = ({
maxAmount={ filterMaxAmount } maxAmount={ filterMaxAmount }
setMinAmount={ setFilterMinAmount } setMinAmount={ setFilterMinAmount }
setMaxAmount={ setFilterMaxAmount } setMaxAmount={ setFilterMaxAmount }
handleInputFocus={ handleInputFocus }
keyboardAwarePadding={ keyboardAwarePadding }
></FilterRangeAmount> ></FilterRangeAmount>
</div> </div>

View File

@@ -27,6 +27,7 @@ import {
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const CashReceiptFilter = ({ export const CashReceiptFilter = ({
filterOn, filterOn,
@@ -49,7 +50,8 @@ export const CashReceiptFilter = ({
setSearchNumber setSearchNumber
}: CashReceiptFilterProps) => { }: CashReceiptFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterStartDate, setFilterStartDate] = useState<string>(startDate); const [filterStartDate, setFilterStartDate] = useState<string>(startDate);
const [filterEndDate, setFilterEndDate] = useState<string>(endDate); const [filterEndDate, setFilterEndDate] = useState<string>(endDate);
@@ -153,6 +155,8 @@ export const CashReceiptFilter = ({
selectOptions={ issueTypeOptionsGroup } selectOptions={ issueTypeOptionsGroup }
inputValue={ filterSearchNumber } inputValue={ filterSearchNumber }
inputSetter={ setFilterSearchNumber } inputSetter={ setFilterSearchNumber }
handleInputFocus={ handleInputFocus }
keyboardAwarePadding={ keyboardAwarePadding }
></FilterSelectInput> ></FilterSelectInput>
</div> </div>
<div className="apply-row"> <div className="apply-row">

View File

@@ -27,6 +27,7 @@ import {
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { FilterSelectMid } from '@/shared/ui/filter/select-mid'; import { FilterSelectMid } from '@/shared/ui/filter/select-mid';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const EscrowFilter = ({ export const EscrowFilter = ({
filterOn, filterOn,
@@ -51,7 +52,7 @@ export const EscrowFilter = ({
setMaxAmount setMaxAmount
}: EscrowFilterProps) => { }: EscrowFilterProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const [filterMid, setFilterMid] = useState<string>(mid); const [filterMid, setFilterMid] = useState<string>(mid);
const [filterSearchType, setFilterSearchType] = useState<EscrowSearchType>(searchType); const [filterSearchType, setFilterSearchType] = useState<EscrowSearchType>(searchType);
const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword); const [filterSearchKeyword, setFilterSearchKeyword] = useState<string>(searchKeyword);
@@ -127,6 +128,7 @@ export const EscrowFilter = ({
selectOptions={ searchTypeOptionsGroup } selectOptions={ searchTypeOptionsGroup }
inputValue={ filterSearchKeyword } inputValue={ filterSearchKeyword }
inputSetter={ setFilterSearchKeyword } inputSetter={ setFilterSearchKeyword }
handleInputFocus={ handleInputFocus }
></FilterSelectInput> ></FilterSelectInput>
<FilterCalendar <FilterCalendar
title={t('filter.period')} title={t('filter.period')}
@@ -155,6 +157,8 @@ export const EscrowFilter = ({
maxAmount={ filterMaxAmount } maxAmount={ filterMaxAmount }
setMinAmount={ setFilterMinAmount } setMinAmount={ setFilterMinAmount }
setMaxAmount={ setFilterMaxAmount } setMaxAmount={ setFilterMaxAmount }
handleInputFocus={ handleInputFocus }
keyboardAwarePadding={ keyboardAwarePadding }
></FilterRangeAmount> ></FilterRangeAmount>
</div> </div>

View File

@@ -16,6 +16,7 @@ import { useLocation } from 'react-router';
import { snackBar } from '@/shared/lib/toast'; import { snackBar } from '@/shared/lib/toast';
import { maskEmail, maskPhoneNumber } from '@/shared/lib/masking'; import { maskEmail, maskPhoneNumber } from '@/shared/lib/masking';
import { validatePassword } from '@/shared/lib/password-validation'; import { validatePassword } from '@/shared/lib/password-validation';
import { useKeyboardAware } from '@/shared/lib/hooks';
export const UserAddAccountPage = () => { export const UserAddAccountPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -23,6 +24,7 @@ export const UserAddAccountPage = () => {
const location = useLocation(); const location = useLocation();
const { mid } = location.state || {}; const { mid } = location.state || {};
const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware();
const { mutateAsync: userCreate, isPending } = useUserCreateMutation({ const { mutateAsync: userCreate, isPending } = useUserCreateMutation({
onError: (error) => { onError: (error) => {
type ErrorDetail = { type ErrorDetail = {
@@ -555,7 +557,10 @@ export const UserAddAccountPage = () => {
placeholder="example@domain.com" placeholder="example@domain.com"
value={displayValue} value={displayValue}
onChange={(e) => handleNewEmailChange(index, e.target.value)} onChange={(e) => handleNewEmailChange(index, e.target.value)}
onFocus={() => setEditableEmailIndex(index)} onFocus={(e) => {
handleInputFocus(e);
setEditableEmailIndex(index);
}}
onBlur={() => { onBlur={() => {
if (email && isValidEmail(email)) { if (email && isValidEmail(email)) {
setEditableEmailIndex(-1); setEditableEmailIndex(-1);
@@ -591,14 +596,19 @@ export const UserAddAccountPage = () => {
const displayValue = isReadOnly && phone ? maskPhoneNumber(phone) : phone; const displayValue = isReadOnly && phone ? maskPhoneNumber(phone) : phone;
return ( return (
<div className="ua-input-row" key={index}> <div className="ua-input-row" key={index}
style={keyboardAwarePadding}
>
<input <input
className="wid-100" className="wid-100"
type="tel" type="tel"
placeholder="01012345678" placeholder="01012345678"
value={displayValue} value={displayValue}
onChange={(e) => handleNewPhoneChange(index, e.target.value)} onChange={(e) => handleNewPhoneChange(index, e.target.value)}
onFocus={() => setEditablePhoneIndex(index)} onFocus={(e) => {
handleInputFocus(e);
setEditablePhoneIndex(index);
}}
onBlur={() => { onBlur={() => {
if (phone && isValidPhone(phone)) { if (phone && isValidPhone(phone)) {
setEditablePhoneIndex(-1); setEditablePhoneIndex(-1);

View File

@@ -221,9 +221,9 @@ export const KeyInPaymentPage = () => {
sortType sortType
]); ]);
if (!hasAccess) { // if (!hasAccess) {
return <AccessDeniedDialog />; // return <AccessDeniedDialog />;
} // }
return ( return (
<> <>

View File

@@ -9,9 +9,9 @@ export interface UseKeyboardAwareOptions {
export const useKeyboardAware = (options?: UseKeyboardAwareOptions) => { export const useKeyboardAware = (options?: UseKeyboardAwareOptions) => {
const { const {
defaultPadding = 60, defaultPadding = 0,
heightRatio = 0.7, heightRatio = 0.7,
maxPadding = 300, maxPadding = 320,
transition = 'padding-bottom 0.2s ease' transition = 'padding-bottom 0.2s ease'
} = options || {}; } = options || {};

View File

@@ -1,14 +1,16 @@
import { ChangeEvent } from 'react'; import { ChangeEvent, FocusEvent } from 'react';
export interface FilterInputProps { export interface FilterInputProps {
title: string; title: string;
inputValue: string; inputValue: string;
inputSetter: (value: any) => void; inputSetter: (value: any) => void;
handleInputFocus?: (e: FocusEvent<HTMLInputElement>) => void;
}; };
export const FilterInput = ({ export const FilterInput = ({
title, title,
inputValue, inputValue,
inputSetter inputSetter,
handleInputFocus
}: FilterInputProps) => { }: FilterInputProps) => {
return ( return (
@@ -25,6 +27,7 @@ export const FilterInput = ({
placeholder="" placeholder=""
value={ inputValue } value={ inputValue }
onChange={ (e: ChangeEvent<HTMLInputElement>) => inputSetter(e.target.value)} onChange={ (e: ChangeEvent<HTMLInputElement>) => inputSetter(e.target.value)}
onFocus={ handleInputFocus }
/> />
</div> </div>
</div> </div>

View File

@@ -1,4 +1,5 @@
import { FilterRangeAmountProps } from '@/entities/common/model/types'; import { FilterRangeAmountProps } from '@/entities/common/model/types';
import { useKeyboardAware } from '@/shared/lib/hooks/use-keyboard-aware';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useState } from 'react'; import { useState } from 'react';
import { ChangeEvent } from 'react'; import { ChangeEvent } from 'react';
@@ -10,9 +11,10 @@ export const FilterRangeAmount = ({
maxAmount, maxAmount,
setMinAmount, setMinAmount,
setMaxAmount, setMaxAmount,
handleInputFocus,
keyboardAwarePadding
}: FilterRangeAmountProps) => { }: FilterRangeAmountProps) => {
const [filterTitle, setFilterTitle] = useState<string>(title || '거래금액'); const [filterTitle, setFilterTitle] = useState<string>(title || '거래금액');
const onChangeMinAmount = (val?: number) => { const onChangeMinAmount = (val?: number) => {
setMinAmount(val || undefined); setMinAmount(val || undefined);
}; };
@@ -30,13 +32,14 @@ export const FilterRangeAmount = ({
className="opt-label" className="opt-label"
style={{ fontSize: 'var(--fs-14)' }} style={{ fontSize: 'var(--fs-14)' }}
>{ filterTitle }</div> >{ filterTitle }</div>
<div className="opt-controls"> <div className="opt-controls" style={keyboardAwarePadding}>
<div className="input-wrapper "> <div className="input-wrapper ">
<NumericFormat <NumericFormat
value={ minAmount } value={ minAmount }
allowNegative={ false } allowNegative={ false }
displayType="input" displayType="input"
onChange={(e: ChangeEvent<HTMLInputElement>) => onChangeMinAmount(parseInt(e.target.value)) } onChange={(e: ChangeEvent<HTMLInputElement>) => onChangeMinAmount(parseInt(e.target.value)) }
onFocus={handleInputFocus}
></NumericFormat> ></NumericFormat>
</div> </div>
<span> ~ </span> <span> ~ </span>
@@ -46,6 +49,7 @@ export const FilterRangeAmount = ({
allowNegative={ false } allowNegative={ false }
displayType="input" displayType="input"
onChange={(e: ChangeEvent<HTMLInputElement>) => onChangeMaxAmount(parseInt(e.target.value)) } onChange={(e: ChangeEvent<HTMLInputElement>) => onChangeMaxAmount(parseInt(e.target.value)) }
onFocus={handleInputFocus}
></NumericFormat> ></NumericFormat>
</div> </div>
</div> </div>

View File

@@ -1,4 +1,4 @@
import { ChangeEvent, useState } from 'react'; import { ChangeEvent, CSSProperties, FocusEvent } from 'react';
export interface FilterSelectInputProps { export interface FilterSelectInputProps {
title: string; title: string;
@@ -7,6 +7,8 @@ export interface FilterSelectInputProps {
selectOptions: Array<Record<string, string>>; selectOptions: Array<Record<string, string>>;
inputValue: string | undefined; inputValue: string | undefined;
inputSetter?: (value: any) => void; inputSetter?: (value: any) => void;
handleInputFocus?: (e: FocusEvent<HTMLInputElement>) => void;
keyboardAwarePadding?: CSSProperties;
}; };
export const FilterSelectInput = ({ export const FilterSelectInput = ({
title, title,
@@ -14,11 +16,10 @@ export const FilterSelectInput = ({
selectSetter, selectSetter,
selectOptions, selectOptions,
inputValue, inputValue,
inputSetter inputSetter,
handleInputFocus,
keyboardAwarePadding
}: FilterSelectInputProps) => { }: FilterSelectInputProps) => {
const [selectVal, setSelectVal] = useState();
const [inputVal, setInputVal] = useState();
const getSelectOptions = () => { const getSelectOptions = () => {
let rs = []; let rs = [];
for (let i = 0; i < selectOptions.length; i++) { for (let i = 0; i < selectOptions.length; i++) {
@@ -53,10 +54,10 @@ export const FilterSelectInput = ({
className="opt-label" className="opt-label"
style={{ fontSize: 'var(--fs-14)' }} style={{ fontSize: 'var(--fs-14)' }}
>{ title }</div> >{ title }</div>
<div className="opt-controls"> <div className="opt-controls" style={keyboardAwarePadding}>
<select <select
className="w-110" className="w-110"
value={ selectValue } value={ selectValue }
onChange={ onChangeSelect } onChange={ onChangeSelect }
> >
{ getSelectOptions() } { getSelectOptions() }
@@ -67,6 +68,7 @@ export const FilterSelectInput = ({
style={{ height: '38px' }} style={{ height: '38px' }}
value={inputValue} value={inputValue}
onChange={onChangeInput} onChange={onChangeInput}
onFocus={handleInputFocus}
/> />
</div> </div>
</div> </div>

View File

@@ -5,6 +5,7 @@ export interface FilterSelectProps {
selectValue: string; selectValue: string;
selectSetter: (value: any) => void; selectSetter: (value: any) => void;
selectOptions: Array<Record<string, string>>; selectOptions: Array<Record<string, string>>;
}; };
export const FilterSelect = ({ export const FilterSelect = ({
title, title,