버튼그룹

This commit is contained in:
focp212@naver.com
2025-09-12 15:56:33 +09:00
parent 16eb81e433
commit 7cb48133e5
3 changed files with 96 additions and 74 deletions

View File

@@ -11,6 +11,7 @@ import {
} from '../../model/types'; } from '../../model/types';
import { FilterDateOptions } from '@/entities/common/model/types'; import { FilterDateOptions } from '@/entities/common/model/types';
import { FilterCalendar } from '@/shared/ui/filter/filter-calendar'; import { FilterCalendar } from '@/shared/ui/filter/filter-calendar';
import { FilterButtonGroups } from '@/shared/ui/filter/button-groups';
export const BillingFilter = ({ export const BillingFilter = ({
filterOn, filterOn,
@@ -102,6 +103,24 @@ export const BillingFilter = ({
setProcessResult(filterProcessResult); setProcessResult(filterProcessResult);
setPaymentMethod(filterPaymentMethod); setPaymentMethod(filterPaymentMethod);
}; };
let requestStatusBtnGroup = [
{name: '전체', value: BillingRequestStatus.ALL},
{name: '진행중', value: BillingRequestStatus.IN_PROGRESS},
{name: '성공', value: BillingRequestStatus.SUCCESS},
{name: '요청취소', value: BillingRequestStatus.REQUEST_CANCEL},
];
let processResultBtnGroup = [
{name: '전체', value: BillingProcessResult.ALL},
{name: '성공', value: BillingProcessResult.SUCCESS},
{name: '실패', value: BillingProcessResult.FAILURE},
];
let paymentMethodBtnGroup = [
{name: '전체', value: BillingPaymentMethod.ALL},
{name: '신용카드', value: BillingPaymentMethod.CREDIT_CARD},
{name: '가상계좌', value: BillingPaymentMethod.VIRTUAL_ACCOUNT},
{name: '휴대폰', value: BillingPaymentMethod.MOBILE_PAYMENT},
];
return ( return (
<> <>
<motion.div <motion.div
@@ -133,7 +152,7 @@ export const BillingFilter = ({
</div> </div>
</div> </div>
<div className="option-list pb-120"> <div className="option-list pt-16">
<div className="opt-field"> <div className="opt-field">
<div className="opt-label"></div> <div className="opt-label"></div>
<div className="opt-controls"> <div className="opt-controls">
@@ -169,77 +188,25 @@ export const BillingFilter = ({
setStartDate={ setFilterStartDate } setStartDate={ setFilterStartDate }
setEndDate={ setFilterEndDate } setEndDate={ setFilterEndDate }
></FilterCalendar> ></FilterCalendar>
<div className="opt-field">
<div className="opt-label"></div>
<div className="opt-controls col below h36">
<div className="chip-row">
<span
className={ `keyword-tag ${(filterRequestStatus === BillingRequestStatus.ALL)? 'active': ''}` }
onClick={ () => setFilterRequestStatus(BillingRequestStatus.ALL) }
></span>
<span
className={ `keyword-tag ${(filterRequestStatus === BillingRequestStatus.IN_PROGRESS)? 'active': ''}` }
onClick={ () => setFilterRequestStatus(BillingRequestStatus.IN_PROGRESS) }
></span>
<span
className={ `keyword-tag ${(filterRequestStatus === BillingRequestStatus.SUCCESS)? 'active': ''}` }
onClick={ () => setFilterRequestStatus(BillingRequestStatus.SUCCESS) }
></span>
<span
className={ `keyword-tag ${(filterRequestStatus === BillingRequestStatus.REQUEST_CANCEL)? 'active': ''}` }
onClick={ () => setFilterRequestStatus(BillingRequestStatus.REQUEST_CANCEL) }
></span>
</div>
</div>
</div>
<div className="opt-field"> <FilterButtonGroups
<div className="opt-label"></div> title='요청상태'
<div className="opt-controls col below h36"> activeValue={ filterRequestStatus }
<div className="chip-row"> btnGroups={ requestStatusBtnGroup }
<span setter={ setFilterRequestStatus }
className={ `keyword-tag ${(filterProcessResult === BillingProcessResult.ALL)? 'active': ''}` } ></FilterButtonGroups>
onClick={ () => setFilterProcessResult(BillingProcessResult.ALL) } <FilterButtonGroups
></span> title='처리결과'
<span activeValue={ filterProcessResult }
className={ `keyword-tag ${(filterProcessResult === BillingProcessResult.SUCCESS)? 'active': ''}` } btnGroups={ processResultBtnGroup }
onClick={ () => setFilterProcessResult(BillingProcessResult.SUCCESS) } setter={ setFilterProcessResult }
></span> ></FilterButtonGroups>
<span <FilterButtonGroups
className={ `keyword-tag ${(filterProcessResult === BillingProcessResult.FAILURE)? 'active': ''}` } title='결제수단'
onClick={ () => setFilterProcessResult(BillingProcessResult.FAILURE) } activeValue={ filterPaymentMethod }
></span> btnGroups={ paymentMethodBtnGroup }
<span setter={ setFilterPaymentMethod }
className="keyword-tag" ></FilterButtonGroups>
style={{ visibility: 'hidden' }}
></span>
</div>
</div>
</div>
<div className="opt-field">
<div className="opt-label"></div>
<div className="opt-controls col below h36">
<div className="chip-row">
<span
className={ `keyword-tag ${(filterPaymentMethod === BillingPaymentMethod.ALL)? 'active': ''}` }
onClick={ () => setFilterPaymentMethod(BillingPaymentMethod.ALL) }
></span>
<span
className={ `keyword-tag ${(filterPaymentMethod === BillingPaymentMethod.CREDIT_CARD)? 'active': ''}` }
onClick={ () => setFilterPaymentMethod(BillingPaymentMethod.CREDIT_CARD) }
></span>
<span
className={ `keyword-tag ${(filterPaymentMethod === BillingPaymentMethod.VIRTUAL_ACCOUNT)? 'active': ''}` }
onClick={ () => setFilterPaymentMethod(BillingPaymentMethod.VIRTUAL_ACCOUNT) }
></span>
<span
className={ `keyword-tag ${(filterPaymentMethod === BillingPaymentMethod.MOBILE_PAYMENT)? 'active': ''}` }
onClick={ () => setFilterPaymentMethod(BillingPaymentMethod.MOBILE_PAYMENT) }
></span>
</div>
</div>
</div>
<div className="opt-field"> <div className="opt-field">
<div className="opt-label"></div> <div className="opt-label"></div>

View File

@@ -30,3 +30,5 @@ main {
padding-bottom: 20px; padding-bottom: 20px;
z-index: 10; z-index: 10;
} }
/* calendar */

View File

@@ -0,0 +1,53 @@
interface FilterButtonGroupsProps {
title: string;
activeValue?: string;
btnGroups?: Array<ButtonItemProp>
setter: any;
};
interface ButtonItemProp {
name?: string;
value?: string;
};
export const FilterButtonGroups = ({
title,
activeValue,
btnGroups,
setter,
}: FilterButtonGroupsProps) => {
const getBtns = () => {
let rs = [];
if(!!btnGroups && btnGroups.length > 0){
let emptySpanCnt = 4 % btnGroups.length;
for(let i=0;i<btnGroups.length;i++){
rs.push(
<span
className={ `keyword-tag flex-1 ${(activeValue === btnGroups[i]?.value)? 'active': ''}` }
onClick={ () => setter(btnGroups[i]?.value) }
>{ btnGroups[i]?.name }</span>
)
}
for(let i=0;i<emptySpanCnt;i++){
rs.push(
<span
className="keyword-tag flex-1"
style={{ visibility: 'hidden' }}
></span>
);
}
}
return rs;
};
return (
<>
<div className="opt-field">
<div className="opt-label">{ title }</div>
<div className="opt-controls col below h36">
<div className="chip-row">
{ getBtns() }
</div>
</div>
</div>
</>
);
};