diff --git a/app/admin/members/page.tsx b/app/admin/members/page.tsx index 3ddb977..2847071 100644 --- a/app/admin/members/page.tsx +++ b/app/admin/members/page.tsx @@ -38,13 +38,14 @@ export default function AdminMembersPage() { ); return ( -
+
+ {/* 헤더 */}
-

회원 관리

+

회원 관리

가입 회원 목록 및 결제 현황

- + 총 {members.length}명
@@ -64,28 +65,25 @@ export default function AdminMembersPage() {
+ ) : filtered.length === 0 ? ( +
회원 데이터가 없습니다
) : ( -
- - - - - - - - - - - - - {filtered.length === 0 ? ( - - + <> + {/* PC 테이블 뷰 */} +
+
이메일이름가입일구독결제 건수총 결제액
- 회원 데이터가 없습니다 -
+ + + + + + + + - ) : ( - filtered.map((m) => ( + + + {filtered.map((m) => ( @@ -111,11 +109,57 @@ export default function AdminMembersPage() { {m.totalPaid > 0 ? `₩${m.totalPaid.toLocaleString()}` : '-'} - )) - )} - -
이메일이름가입일구독결제 건수총 결제액
{m.email ?? '-'} {m.full_name ?? '-'}
-
+ ))} + + +
+ + {/* 모바일 카드 뷰 */} +
+ {filtered.map((m) => ( +
+ {/* 이메일 + 이름 */} +
+
+

{m.email ?? '-'}

+

{m.full_name ?? '이름 없음'}

+
+ {m.activeSub && ( + + {PLAN_LABELS[m.activeSub.product_id] ?? m.activeSub.product_id} + + )} +
+ + {/* 상세 정보 그리드 */} +
+
+

가입일

+

{new Date(m.created_at).toLocaleDateString('ko-KR')}

+
+
+

결제 건수

+ 0 ? 'bg-green-900/40 text-green-400' : 'bg-slate-700 text-slate-500'}`}> + {m.orderCount}건 + +
+
+

총 결제액

+

+ {m.totalPaid > 0 ? `₩${m.totalPaid.toLocaleString()}` : '-'} +

+
+
+ + {m.activeSub && ( +

+ 구독 만료: {new Date(m.activeSub.expires_at).toLocaleDateString('ko-KR')} +

+ )} +
+ ))} +
+ )}
); diff --git a/app/admin/quotes/page.tsx b/app/admin/quotes/page.tsx index 9094e0a..dc8de6e 100644 --- a/app/admin/quotes/page.tsx +++ b/app/admin/quotes/page.tsx @@ -70,17 +70,17 @@ export default function AdminQuotesPage() { } return ( -
+
{/* 헤더 */} -
+
-

견적서 관리

+

견적서 관리

고객에게 제시할 견적서를 작성하고 관리합니다

@@ -103,97 +104,193 @@ export default function AdminQuotesPage() {

위 버튼을 눌러 첫 번째 견적서를 작성해보세요

) : ( -
- - - - - - - - - - - - - {quotes.map((q) => { - const st = STATUS[q.status] ?? STATUS.draft; - const total = calcTotal(q.items ?? []); - return ( - - - - - - - - + + ); + })} + +
견적서명고객합계상태유효기간작성일 -
- - {q.title} - - -
{q.client_name || '—'}
-
{q.client_email || ''}
-
- {total > 0 ? `${total.toLocaleString()}원` : '—'} - - - {st.label} - - - {q.valid_until ? q.valid_until.slice(0, 10) : '—'} - - {new Date(q.created_at).toLocaleDateString('ko-KR')} - -
- {/* 공개 링크 복사 */} - - {/* 편집 */} - - - - + <> + {/* PC 테이블 뷰 */} +
+ + + + + + + + + + + + + {quotes.map((q) => { + const st = STATUS[q.status] ?? STATUS.draft; + const total = calcTotal(q.items ?? []); + return ( + + + + + + + + - - ); - })} - -
견적서명고객합계상태유효기간작성일 +
+ + {q.title} - {/* 삭제 */} - +
{q.client_name || '—'}
+
{q.client_email || ''}
+
+ {total > 0 ? `${total.toLocaleString()}원` : '—'} + + + {st.label} + + + {q.valid_until ? q.valid_until.slice(0, 10) : '—'} + + {new Date(q.created_at).toLocaleDateString('ko-KR')} + +
+ + - + - )} - -
-
-
+ + +
+
+
+ + {/* 모바일 카드 뷰 */} +
+ {quotes.map((q) => { + const st = STATUS[q.status] ?? STATUS.draft; + const total = calcTotal(q.items ?? []); + return ( +
+ {/* 제목 + 상태 */} +
+ + {q.title} + + + {st.label} + +
+ + {/* 고객 정보 */} + {(q.client_name || q.client_email) && ( +
+ {q.client_name &&

{q.client_name}

} + {q.client_email &&

{q.client_email}

} +
+ )} + + {/* 상세 정보 */} +
+
+

합계

+

+ {total > 0 ? `${total.toLocaleString()}원` : '—'} +

+
+
+

유효기간

+

{q.valid_until ? q.valid_until.slice(0, 10) : '—'}

+
+
+

작성일

+

{new Date(q.created_at).toLocaleDateString('ko-KR')}

+
+
+ + {/* 액션 버튼 */} +
+ + + + + + 편집 + + +
+
+ ); + })} +
+ )}
);