첫 커밋

This commit is contained in:
focp212@naver.com
2025-09-05 15:36:48 +09:00
commit 05238b04c1
825 changed files with 176358 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
import { DetailInfoSectionProps } from '../model/types';
import { InvoiceArrow } from './invoice-arrow';
export const DetailAmountInfoSection = ({
amountInfo,
show,
onClickToShowInfo
}: DetailInfoSectionProps) => {
return (
<>
<div className="txn-num-group">
<div className="txn-amount">
<div className="value">48,125,100<span className="unit"></span></div>
<button
className="chip-btn"
type="button"
>
<span></span> <InvoiceArrow show={ show }></InvoiceArrow>
</button>
</div>
<div className="amount-expand">
<ul className="amount-list">
<li className="amount-item">
<span className="label">·&nbsp;&nbsp;</span>
<span className="value">43,750,000 </span>
</li>
<li className="amount-item">
<span className="label">·&nbsp;&nbsp;VAT</span>
<span className="value">4,375,100 </span>
</li>
</ul>
</div>
<div className="txn-mid">
<span className="value">croquis01m</span>
</div>
<div className="txn-mid">
<span className="value">2025.08.19</span>
</div>
<div className="txn-doc">
<button className="doc-btn" type="button"></button>
<button className="doc-btn" type="button"></button>
</div>
</div>
</>
);
};

View File

@@ -0,0 +1,46 @@
import { DetailInfoSectionProps } from '../model/types';
export const DetailPublishInfoSection = ({
publishInfo,
show,
onClickToShowInfo
}: DetailInfoSectionProps) => {
return (
<>
<div className="txn-section">
<div className="section-title"> </div>
<ul className="kv-list">
<li className="kv-row">
<span className="k">MID</span>
<span className="v">nictest01m</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v">2025.06.01 ~ 2025.06.30</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v">2025.06.30</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v">PG </span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v"></span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v"></span>
</li>
<li className="kv-row">
<span className="k">Email</span>
<span className="v">test@nicepay.co.kr</span>
</li>
</ul>
</div>
</>
);
};

View File

@@ -0,0 +1,30 @@
import { DetailInfoSectionProps } from '../model/types';
export const DetailReceiverInfoSection = ({
receiverInfo,
show,
onClickToShowInfo
}: DetailInfoSectionProps) => {
return (
<>
<div className="txn-section">
<div className="section-title"> </div>
</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="v">123-12-12345</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v"></span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v"></span>
</li>
</ul>
</>
);
};

View File

@@ -0,0 +1,26 @@
import { DetailInfoSectionProps } from '../model/types';
export const DetailSupplierInfoSection = ({
supplierInfo,
show,
onClickToShowInfo
}: DetailInfoSectionProps) => {
return (
<>
<div className="txn-section">
<div className="section-title"> </div>
</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k"></span>
<span className="v">222-22-22222</span>
</li>
<li className="kv-row">
<span className="k"></span>
<span className="v"></span>
</li>
</ul>
</>
);
};

View File

@@ -0,0 +1,23 @@
import { useEffect, useState } from 'react';
import { IMAGE_ROOT } from '@/shared/constants/common';
import { AltMsgKeys, InvoiceArrowProps } from '../model/types';
export const InvoiceArrow = ({ show }: InvoiceArrowProps) => {
const [altMsg, setAltMsg] = useState<AltMsgKeys>(AltMsgKeys.Fold);
const [className, setClassName] = useState<string>('ic20 rot-180');
useEffect(() => {
setAltMsg((show)? AltMsgKeys.Fold: AltMsgKeys.UnFold);
setClassName(`ic20 ${(show)? 'rot-180': ''}`);
}, [show]);
return (
<>
<img
className={ className }
src={ IMAGE_ROOT + '/select_arrow.svg' }
alt={ altMsg }
/>
</>
);
};

View File

@@ -0,0 +1,143 @@
import { motion } from 'framer-motion';
import { IMAGE_ROOT } from '@/shared/constants/common';
import { InvoiceFilterProps } from '../model/types';
export const InvoiceFilter = ({
filterOn,
setFilterOn
}: InvoiceFilterProps) => {
const variants = {
hidden: { x: '100%' },
visible: { x: '0%' },
};
const onClickToClose = () => {
setFilterOn(false);
};
return (
<>
<motion.div
id="fullMenuModal"
className="full-menu-modal"
initial="hidden"
animate={ (filterOn)? 'visible': 'hidden' }
variants={ variants }
transition={{ duration: 0.3 }}
style={{
width: '100%',
height: '100%',
}}
>
<div className="full-menu-container">
<div className="full-menu-header">
<div className="full-menu-title center"></div>
<div className="full-menu-actions">
<button
className="full-menu-close"
onClick={ () => onClickToClose() }
>
<img
src={ IMAGE_ROOT + '/ico_close.svg' }
alt="닫기"
/>
</button>
</div>
</div>
<div className="option-list pb-120">
<div className="opt-field">
<div className="opt-label"></div>
<div className="opt-controls">
<select className="flex-1">
<option>nictest001m</option>
</select>
</div>
</div>
<div className="opt-field mt_top">
<div className="opt-label"></div>
<div className="opt-controls col below h36">
<div className="chip-row">
<span className="keyword-tag active"></span>
<span className="keyword-tag">2</span>
<span className="keyword-tag">3</span>
<span className="keyword-tag"></span>
</div>
<div className="range-row">
<div className="input-wrapper date">
<input
className="date-input"
type="text"
placeholder="날짜 선택"
value="2025.06.08"
readOnly={ true }
/>
<button
className="date-btn"
type="button"
>
<img
src={ IMAGE_ROOT + '/ico_date.svg' }
alt="날짜 선택"
/>
</button>
</div>
<span className="beetween">~</span>
<div className="input-wrapper date">
<input
className="date-input"
type="text"
placeholder="날짜 선택"
value="2025.06.08"
readOnly={ true }
/>
<button
className="date-btn"
type="button"
>
<img
src={ IMAGE_ROOT + '/ico_date.svg' }
alt="날짜 선택"
/>
</button>
</div>
</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 active"></span>
<span className="keyword-tag"></span>
<span className="keyword-tag"></span>
<span
className="keyword-tag"
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 active"></span>
<span className="keyword-tag"></span>
<span className="keyword-tag"></span>
<span className="keyword-tag"></span>
</div>
</div>
</div>
</div>
<div className="apply-row">
<button className="btn-50 btn-blue flex-1"></button>
</div>
</div>
</motion.div>
</>
);
};

View File

@@ -0,0 +1,117 @@
import { useEffect, useState } from 'react';
import { IMAGE_ROOT } from '@/shared/constants/common';
import { InvoiceFilter } from './invoice-filter';
import { SortOptionsBox } from './sort-options-box';
import { SortByKeys } from '../model/types';
import { InvoiceList } from './invoice-list';
export const InvoiceListWrap = () => {
const [filterOn, setFilterOn] = useState<boolean>(false);
const [sortBy, setSortBy] = useState<SortByKeys>(SortByKeys.New);
const [listItems, setListItems] = useState({});
const callList = () => {
setListItems({
'20250601': [
{tid: 'a1234567', pname: '와와디디', userid: 'nictest01m', idate: '20250630', kind: 'PG수수료', amount: 48125100},
{tid: 'b34534534', pname: '와와디디', userid: 'wadizcop@m', idate: '20250630', kind: 'PG수수료', amount: 23845000},
]
})
};
const onClickToOpenFIlter = () => {
setFilterOn(true);
};
const onCliCkToSort = (sort: SortByKeys) => {
setSortBy(sort);
};
useEffect(() => {
callList();
}, []);
return (
<>
<div className="summary-section">
<div className="credit-controls">
<div>
<input
type="text"
className="credit-period"
value="2025.06.01 ~ 2025.06.31"
readOnly={ true }
/>
<button
className="filter-btn"
onClick={ () => onClickToOpenFIlter() }
>
<img
src={ IMAGE_ROOT + '/ico_setting.svg' }
alt="검색옵션"
/>
</button>
</div>
<button className="download-btn">
<img
src={ IMAGE_ROOT + '/ico_download.svg' }
alt="다운로드"
/>
</button>
</div>
</div>
<div className="filter-section mt-10">
<SortOptionsBox
sortBy={ sortBy }
onCliCkToSort={ onCliCkToSort }
></SortOptionsBox>
</div>
<InvoiceList
listItems={ listItems }
></InvoiceList>
{/*
<div className="transaction-list">
<div className="date-group">
<div className="date-header">25.06</div>
<div className="transaction-item approved">
<div className="transaction-status">
<div className="status-dot blue"></div>
</div>
<div className="transaction-content">
<div className="transaction-title">와와디디 (nictest01m)</div>
<div className="transaction-details">
<span>2025.06.30</span>
<span className="separator">|</span>
<span>PG수수료</span>
</div>
</div>
<div className="transaction-amount">48,125,100원</div>
</div>
<div className="transaction-item refund">
<div className="transaction-status">
<div className="status-dot gray"></div>
</div>
<div className="transaction-content">
<div className="transaction-title">와와디디 (wadizcop@m)</div>
<div className="transaction-details">
<span>2025.06.30</span>
<span className="separator">|</span>
<span>PG수수료</span>
</div>
</div>
<div className="transaction-amount">23,845,000원</div>
</div>
</div>
</div>
*/
}
<div className="apply-row bottom-padding">
<button className="btn-50 btn-blue flex-1"></button>
</div>
<InvoiceFilter
filterOn={ filterOn }
setFilterOn={ setFilterOn }
></InvoiceFilter>
</>
);
};

View File

@@ -0,0 +1,29 @@
import { InvoiceListProps } from '../model/types';
import { ListDateGroup } from './list-date-group';
export const InvoiceList = ({
listItems
}: InvoiceListProps) => {
const getListDateGroup = () => {
let rs = [];
for (const [key, value] of Object.entries(listItems)) {
rs.push(
<ListDateGroup
key={ key }
date={ key }
items={ value }
></ListDateGroup>
);
}
return rs;
};
return (
<>
<div className="transaction-list">
{ getListDateGroup() }
</div>
</>
)
};

View File

@@ -0,0 +1,46 @@
import moment from 'moment';
import 'moment/dist/locale/ko';
import { ListDateGroupProps } from '../model/types';
import { ListItem } from './list-item';
export const ListDateGroup = ({
date,
items
}: ListDateGroupProps) => {
moment.locale('ko');
const getStateDate = () => {
let stateDate = moment(date).format('YY.MM');
return stateDate;
};
const getListItem = () => {
let rs = [];
if(!!items && items.length>0){
for(let i=0;i<items.length;i++){
let key = 'ListItem-'+i;
rs.push(
<ListItem
key={ key }
tid={ items[i]?.tid }
pname={ items[i]?.pname }
userid={ items[i]?.userid }
idate={ items[i]?.idate }
kind={ items[i]?.kind }
amount={ items[i]?.amount }
></ListItem>
)
}
}
return rs;
};
return (
<>
<div className="date-group">
<div className="date-header">{ getStateDate() }</div>
{ getListItem() }
</div>
</>
);
};

View File

@@ -0,0 +1,54 @@
import { NumericFormat } from 'react-number-format';
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { ListItemProps } from '../model/types';
import moment from 'moment';
export const ListItem = ({
tid,
pname,
userid,
idate,
kind,
amount
}: ListItemProps) => {
const { navigate } = useNavigate();
const onClickToNavigate = () => {
navigate(PATHS.tax.invoice.detail, {
state: {
tid: tid
}
});
};
return (
<>
<div
className="transaction-item approved"
onClick={ () => onClickToNavigate() }
>
<div className="transaction-status">
<div className="status-dot blue"></div>
</div>
<div className="transaction-content">
<div className="transaction-title">{ pname } ({ userid })</div>
<div className="transaction-details">
<span>{ moment(idate).format('YYYY.MM.DD') }</span>
<span className="separator">|</span>
<span>{ kind }</span>
</div>
</div>
<div className="transaction-amount">
<NumericFormat
value={ amount }
thousandSeparator
displayType="text"
suffix={ '원' }
></NumericFormat>
</div>
</div>
</>
);
};

View File

@@ -0,0 +1,25 @@
import {
SortByKeys,
SortOptionsBoxProps
} from '../model/types';
export const SortOptionsBox = ({
sortBy,
onCliCkToSort
}: SortOptionsBoxProps) => {
return (
<>
<div className="sort-options">
<button
className={ `sort-btn ${(sortBy === SortByKeys.New)? 'active': ''}` }
onClick={ () => onCliCkToSort(SortByKeys.New) }
></button>
<span className="sort-divider">|</span>
<button
className={ `sort-btn ${(sortBy === SortByKeys.Amount)? 'active': ''}` }
onClick={ () => onCliCkToSort(SortByKeys.Amount) }
></button>
</div>
</>
);
};

View File

@@ -0,0 +1,37 @@
import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import {
TaxTabKeys,
TaxTabProps
} from '../model/types';
export const TaxTab = ({
activeTab
}: TaxTabProps) => {
const { navigate } = useNavigate();
const onClickToNavigation = (tab: TaxTabKeys) => {
if(activeTab !== tab){
if(tab === TaxTabKeys.InvoiceList){
navigate(PATHS.tax.invoice.list);
}
else if(tab === TaxTabKeys.VatReference){
navigate(PATHS.tax.vatReference);
}
}
};
return(
<>
<div className="subTab">
<button
className={`subtab-btn ${(activeTab === TaxTabKeys.InvoiceList)? 'active': ''}` }
onClick={ () => onClickToNavigation(TaxTabKeys.InvoiceList) }
> </button>
<button
className={`subtab-btn ${(activeTab === TaxTabKeys.VatReference)? 'active': ''}` }
onClick={ () => onClickToNavigation(TaxTabKeys.VatReference) }
> </button>
</div>
</>
);
};

View File

@@ -0,0 +1,26 @@
export const VatReferenceReqFail = () => {
return (
<>
<div className="success-page">
<div className="success-body">
<div className="error-icon" aria-hidden="true"></div>
<h1 className="success-title">
<span> </span>
<br/>
<span> </span>
</h1>
<div className="success-result">
<p className="result-text align-left position_label">
<span> :</span>
<span>[9997] .<br/>NICEPAY로 .</span>
</p>
</div>
</div>
<div className="apply-row">
<button className="btn-50 btn-blue flex-1"></button>
</div>
</div>
</>
);
};

View File

@@ -0,0 +1,29 @@
export const VatReferenceReqSuccess = () => {
return (
<>
<div className="success-page">
<div className="success-body">
<div className="success-icon" aria-hidden="true"></div>
<h1 className="success-title">
<span> </span>
<br/>
<span> .</span>
</h1>
<p className="success-subtitle"> .</p>
<div className="success-result">
<p className="result-text">
<span> :</span> <span>2025.06.04</span>
<br/>
<span> :</span> <span>TEST@NICEPAY.CO.KR</span>
</p>
</div>
<p className="success-note dot"> <br/> .</p>
</div>
<div className="apply-row">
<button className="btn-50 btn-blue flex-1"></button>
</div>
</div>
</>
);
};

View File

@@ -0,0 +1,8 @@
export const VatReferenceWrap = () => {
return (
<>
</>
)
};