Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
73ad80e
rename: 컨벤션에 맞게 파일명 변경
Yejiin21 Feb 26, 2025
643ee1f
feat: SecondaryButton 컴포넌트에 size prop 추가 및 스토리북 수정
Yejiin21 Feb 26, 2025
e0316f2
feat: TertiaryButton 컴포넌트에 size prop 추가
Yejiin21 Feb 26, 2025
1076f69
feat: DashboardLayout 배경색 prop 추가
Yejiin21 Feb 26, 2025
4656985
feat: 구매/참가자 관리 페이지 퍼블리싱 및 체크버튼 상태관리 구현
Yejiin21 Feb 26, 2025
b6187ec
design: text-11 추가와 TertiaryButton 버튼 크기 조정
Yejiin21 Feb 26, 2025
8aeefc0
feat: 참가자 승인하기 버튼 zustand 상태관리 구현
Yejiin21 Feb 26, 2025
96211ae
feat: 체크인 여부 필터 모달과 상태관리 구현
Yejiin21 Feb 26, 2025
2d46b72
refact: 필터 관련 변경에 대한 로직 ParticipantsFilterBar로 분리
Yejiin21 Feb 26, 2025
fa2ad46
refact: 이메일 입력 폼 공통 컴포넌트로 분리
Yejiin21 Feb 26, 2025
2614cbf
feat: TertiaryButton에 medium 사이즈 버튼 추가
Yejiin21 Feb 26, 2025
208988f
feat: 선택 이메일 보내기 모달 구현
Yejiin21 Feb 26, 2025
efadda8
feat: 티켓별 이메일 보내기 모달창 구현
Yejiin21 Feb 26, 2025
9af6369
feat: 전체 이메일 보내기 클릭시 input창에 이메일 주소 생성 구현
Yejiin21 Feb 27, 2025
e97d872
design: label 이름 수정
Yejiin21 Feb 27, 2025
68fcaa2
feat: 대시보드 사이드바에 회원관리 라우터 설정
Yejiin21 Feb 27, 2025
8371eed
refact: 이메일 태그 입력 공통 컴포넌트로 분리
Yejiin21 Feb 27, 2025
2e8a90d
feat: 이메일 예약 발송 페이지에 전체 이메일 보내기 기능 적용
Yejiin21 Feb 27, 2025
83c27d3
refact: placeholder 문구 수정
Yejiin21 Feb 27, 2025
fb6df02
feat: 반응형 CSS 적용
Yejiin21 Feb 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions design-system/stories/buttons/SecondaryButton.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ const meta = {
description: '버튼 색상',
defaultValue: 'pink',
},
size: {
control: 'radio',
options: ['large', 'small'],
description: '버튼 크기',
defaultValue: 'large',
},
onClick: {
action: 'clicked',
description: '버튼 클릭 핸들러',
Expand All @@ -36,19 +42,30 @@ export const Default: Story = {
args: {
label: 'Default Button',
color: 'pink',
size: 'large',
},
};

export const Pink: Story = {
export const SmallPink: Story = {
args: {
label: '전송하기',
label: '작은 버튼',
color: 'pink',
size: 'small',
},
};

export const BigBlack: Story = {
args: {
label: '큰 버튼',
color: 'black',
size: 'large',
},
};

export const Black: Story = {
export const SmallBlack: Story = {
args: {
label: '로그인',
label: '작은 검은 버튼',
color: 'black',
size: 'small',
},
};
33 changes: 33 additions & 0 deletions design-system/stories/buttons/TertiaryButton.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,24 @@ const meta = {
description: '버튼에 표시될 텍스트',
defaultValue: 'Button',
},
type: {
control: 'radio',
options: ['button', 'submit'],
description: '버튼 타입',
defaultValue: 'button',
},
color: {
control: 'radio',
options: ['pink', 'black'],
description: '버튼 색상',
defaultValue: 'pink',
},
size: {
control: 'radio',
options: ['small', 'medium', 'large'], // medium 추가
description: '버튼 크기',
defaultValue: 'large',
},
onClick: {
action: 'clicked',
description: '버튼 클릭 핸들러',
Expand All @@ -37,6 +49,7 @@ export const Default: Story = {
label: 'Default Button',
type: 'button',
color: 'pink',
size: 'large',
},
};

Expand All @@ -45,6 +58,7 @@ export const Pink: Story = {
label: '전송하기',
type: 'button',
color: 'pink',
size: 'large',
},
};

Expand All @@ -53,5 +67,24 @@ export const Black: Story = {
label: '로그인',
type: 'button',
color: 'black',
size: 'large',
},
};

export const Small: Story = {
args: {
label: '작은 버튼',
type: 'button',
color: 'pink',
size: 'small',
},
};

export const Medium: Story = {
args: {
label: '중간 버튼',
type: 'button',
color: 'pink',
size: 'medium',
},
};
18 changes: 12 additions & 6 deletions design-system/ui/buttons/SecondaryButton.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
interface SecondaryButtonProps {
label: string;
color: 'pink' | 'black';
size: 'small' | 'large';
onClick?: () => void;
className?: string;
}

const SecondaryButton = ({ label, color, onClick, className }: SecondaryButtonProps) => {
const baseStyle = `font-bold text-white
text-sm sm:px-3 sm:py-2 sm:text-xs sm:rounded
md:px-3.5 md:py-2.5 md:text-sm md:rounded-md
lg:px-4 lg:py-2.5 lg:text-base lg:rounded-md`;
const SecondaryButton = ({ label, color, size, onClick, className }: SecondaryButtonProps) => {
const baseStyle = `font-bold text-white rounded`;

const sizeStyle =
size === 'large'
? `text-sm sm:px-3 sm:py-2 sm:text-xs sm:rounded
md:px-3.5 md:py-2.5 md:text-sm md:rounded-md
lg:px-4 lg:py-2.5 lg:text-base lg:rounded-md`
: `px-2 py-1 text-xs`;

const colorStyle = color === 'pink' ? 'bg-main' : 'bg-black';

return (
<button className={`${baseStyle} ${colorStyle} ${className}`} onClick={onClick}>
<button className={`${baseStyle} ${sizeStyle} ${colorStyle} ${className}`} onClick={onClick}>
{label}
</button>
);
Expand Down
18 changes: 12 additions & 6 deletions design-system/ui/buttons/TertiaryButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,28 @@ interface TertiaryButtonProps {
label: string;
type: 'button' | 'submit';
color: 'pink' | 'black';
size: 'small' | 'medium' | 'large';
onClick?: () => void;
className?: string;
}

const TertiaryButton = ({ label, type, color, onClick, className }: TertiaryButtonProps) => {
const baseStyle = `flex justify-center items-center border
text-sm sm:px-2.5 sm:py-2 sm:text-xs sm:rounded
md:px-3 md:py-2.5 md:text-sm md:rounded-md
lg:px-3 lg:py-2.5 lg:text-base lg:rounded-md`;
const TertiaryButton = ({ label, type, color, size, onClick, className }: TertiaryButtonProps) => {
const baseStyle = `flex justify-center items-center border rounded`;

const sizeClasses = {
small: 'px-1.5 py-0.5 text-11 md:px-2 md:text-11',
medium: 'px-4 py-1 text-sm',
large:
'text-sm sm:px-2.5 sm:py-2 sm:text-xs sm:rounded md:px-3 md:py-2.5 md:text-sm md:rounded-md lg:px-3 lg:py-2.5 lg:text-base lg:rounded-md',
};

const colorStyle =
color === 'pink'
? 'border-main text-main hover:bg-main hover:text-white hover:font-bold'
: 'border-black text-black hover:bg-black hover:text-white hover:font-bold';

return (
<button type={type} className={`${baseStyle} ${colorStyle} ${className}`} onClick={onClick}>
<button type={type} className={`${baseStyle} ${sizeClasses[size]} ${colorStyle} ${className}`} onClick={onClick}>
{label}
</button>
);
Expand Down
72 changes: 34 additions & 38 deletions design-system/ui/modals/ButtonModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@ import { useState } from 'react';
import { flexCenter, flexColumn } from '../../styles/flex';

interface ButtonModalProps {
onClick: () => void;
onApply: (filters: string[]) => void;
onClose: () => void;
className?: string;
}

const ButtonModal = ({ onClick, onClose, className = '' }: ButtonModalProps) => {
const [open, setOpen] = useState(false);
const ButtonModal = ({ onApply, onClose, className = '' }: ButtonModalProps) => {
const [selectedFilter, setSelectedFilter] = useState<string[]>([]);

const options = ['전체', '체크인 완료', '체크인 전'];
Expand All @@ -21,46 +20,43 @@ const ButtonModal = ({ onClick, onClose, className = '' }: ButtonModalProps) =>
};

return (
<div>
<button onClick={() => setOpen(true)}>필터</button>
{!open && (
<div className={`w-80 h-full space-y-4 px-6 py-5 rounded-[5px] border border-black ${className}`}>
<h1 className="text-sm text-black font-semibold">티켓 필터</h1>
<hr />
<div className={`${flexColumn} space-y-2`}>
<h2 className="text-sm text-black font-semibold">체크인</h2>
<div className="flex gap-1">
{options.map(option => (
<button
key={option}
onClick={() => handleSelectOption(option)}
className={`${flexCenter} w-full h-7 mb-3 bg-white text-sm border-[0.3px] rounded-[2px] ${
selectedFilter.includes(option)
? 'border-main text-main'
: 'border-placeholderText text-placeholderText'
}`}
>
{option}
</button>
))}
</div>
<div className="flex text-sm font-normal text-black space-x-2">
<div className="fixed inset-0 flex items-center justify-center w-full max-w-lg h-full mx-auto bg-black bg-opacity-30 z-30">
<div className={`w-[95%] space-y-3 px-6 py-5 rounded-[5px] bg-white ${className}`}>
<h1 className="text-sm text-black font-semibold">티켓 필터</h1>
<hr />
<div className={`${flexColumn} space-y-2`}>
<h2 className="text-sm text-black font-semibold">체크인</h2>
<div className="flex gap-2.5">
{options.map(option => (
<button
onClick={onClose}
className="w-full h-7 rounded-[4px] border-[0.3px] border-black hover:bg-main hover:border-main hover:text-white"
key={option}
onClick={() => handleSelectOption(option)}
className={`${flexCenter} px-3 py-1 mb-6 bg-white text-sm border-[0.3px] rounded-[5px] ${
selectedFilter.includes(option)
? 'border-main text-main'
: 'border-placeholderText text-placeholderText'
}`}
>
취소
{option}
</button>
<button
onClick={onClick}
className="w-full h-7 rounded-[4px] border-[0.3px] border-black hover:bg-main hover:border-main hover:text-white"
>
적용하기
</button>
</div>
))}
</div>
<div className="flex text-sm font-normal text-black space-x-2">
<button
onClick={onClose}
className="w-full h-7 rounded-[4px] border-[0.3px] border-black hover:bg-main hover:border-main hover:text-white"
>
취소
</button>
<button
onClick={() => onApply(selectedFilter)}
className="w-full h-7 rounded-[4px] border-[0.3px] border-black hover:bg-main hover:border-main hover:text-white"
>
확인
</button>
</div>
</div>
)}
</div>
</div>
);
};
Expand Down
10 changes: 10 additions & 0 deletions public/assets/dashboard/participants-management/Filter.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions public/assets/dashboard/participants-management/Ticket.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 10 additions & 5 deletions src/app/routes/Router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import TicketCreatePage from '../../pages/dashboard/ui/ticket/TicketCreatePage';
import HostInfoPage from '../../pages/menu/ui/HostInfoPage';
import EmailPage from '../../pages/dashboard/ui/EmailPage';
import EventDetailsPage from '../../pages/event/ui/EventDetailsPage';
import ParticipantsManagementPage from '../../pages/dashboard/ui/ParticipantsMangementPage';

const routesConfig = [
{
Expand Down Expand Up @@ -55,6 +56,11 @@ const routesConfig = [
element: <EventDetailsPage />,
requiresAuth: false,
},
{
path: MAIN_ROUTES.search,
element: <SearchPage />,
requiresAuth: false,
},
{
path: MAIN_ROUTES.menu,
element: <MenuPage />,
Expand Down Expand Up @@ -86,8 +92,8 @@ const routesConfig = [
requiresAuth: false,
},
{
path: MAIN_ROUTES.search,
element: <SearchPage />,
path: MENU_ROUTES.hostInfo,
element: <HostInfoPage />,
requiresAuth: false,
},
{
Expand Down Expand Up @@ -125,10 +131,9 @@ const routesConfig = [
element: <EmailPage />,
requiresAuth: false,
},

{
path: MENU_ROUTES.hostInfo,
element: <HostInfoPage />,
path: DASHBOARD_ROUTES.participantsMangement,
element: <ParticipantsManagementPage />,
requiresAuth: false,
},
];
Expand Down
1 change: 1 addition & 0 deletions src/app/routes/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,5 @@ export const DASHBOARD_ROUTES = {
ticket: `${MAIN_ROUTES.dashbord}/ticket`,
ticketCreate: `${MAIN_ROUTES.dashbord}/ticket/create`,
email: `${MAIN_ROUTES.dashbord}/email`,
participantsMangement: `${MAIN_ROUTES.dashbord}/participants-mangement`,
};
Loading
Loading