From cebc1164bb31a5904f5467a884114d71b847dd2b Mon Sep 17 00:00:00 2001 From: JAESEON PARK Date: Wed, 4 Mar 2026 23:24:04 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20ControlBox=20=EC=BB=A4=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=A7=88=EC=9D=B4=EC=A7=95,=20WorkspaceSetting=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EC=98=81=EC=97=AD=EC=97=90=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/controlbox/ControlBox.tsx | 72 +++++++++++++++---- src/pages/workspace/WorkspaceSetting.tsx | 38 +++++----- 2 files changed, 73 insertions(+), 37 deletions(-) diff --git a/src/components/common/controlbox/ControlBox.tsx b/src/components/common/controlbox/ControlBox.tsx index c0b92b3f..2cbd29a0 100644 --- a/src/components/common/controlbox/ControlBox.tsx +++ b/src/components/common/controlbox/ControlBox.tsx @@ -1,4 +1,5 @@ -import type { HTMLAttributes } from "react"; +import type { HTMLAttributes, ReactNode } from "react"; +import type React from "react"; import { twMerge } from "tailwind-merge"; import Button from "../button/Button"; @@ -8,6 +9,15 @@ interface IControlBoxProps extends HTMLAttributes { description: string; buttonText: string; onButtonClick: () => void; + containerClassName?: string; + titleClassName?: string; + descriptionClassName?: string; + buttonVariant?: React.ComponentProps["variant"]; + buttonSize?: React.ComponentProps["size"]; + buttonClassName?: string; + buttonSlot?: ReactNode; + leadingSlot?: ReactNode; + contentClassName?: string; } export default function ControlBox({ @@ -16,30 +26,62 @@ export default function ControlBox({ buttonText, onButtonClick, className, + containerClassName, + titleClassName, + descriptionClassName, + buttonVariant = "primary", + buttonSize = "small", + buttonClassName, + buttonSlot, + leadingSlot, + contentClassName, ...rest }: IControlBoxProps) { return (
-
-

{title}

-

- {description} -

-
- + {leadingSlot ?
{leadingSlot}
: null} +
+

+ {title} +

+

+ {description} +

+
+
+ + {buttonSlot ?? ( + + )} ); } diff --git a/src/pages/workspace/WorkspaceSetting.tsx b/src/pages/workspace/WorkspaceSetting.tsx index 22e89818..3eb83ae1 100644 --- a/src/pages/workspace/WorkspaceSetting.tsx +++ b/src/pages/workspace/WorkspaceSetting.tsx @@ -3,6 +3,7 @@ import { useNavigate, useParams } from "react-router-dom"; import { toast } from "sonner"; import Button from "@/components/common/button/Button"; +import ControlBox from "@/components/common/controlbox/ControlBox"; import Input from "@/components/common/input/Input"; import Modal from "@/components/common/modal/Modal"; import TextareaField from "@/components/common/textarea/TextareaField"; @@ -211,28 +212,21 @@ export default function WorkspaceSetting() { {saving ? "저장 중.." : "변경사항 저장하기"} -
-
- -
-
- 워크스페이스 삭제 -
-

- 워크스페이스를 삭제하면 모든 데이터가 영구적으로 삭제됩니다. -
이 작업은 되돌릴 수 없습니다. -

-
-
- +
+ } + />
Date: Wed, 4 Mar 2026 23:41:45 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=EC=BD=94=EB=93=9C=EB=9E=98=EB=B9=97?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/controlbox/ControlBox.tsx | 5 ++++- src/pages/workspace/WorkspaceSetting.tsx | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/common/controlbox/ControlBox.tsx b/src/components/common/controlbox/ControlBox.tsx index 2cbd29a0..ced102b7 100644 --- a/src/components/common/controlbox/ControlBox.tsx +++ b/src/components/common/controlbox/ControlBox.tsx @@ -15,6 +15,7 @@ interface IControlBoxProps extends HTMLAttributes { buttonVariant?: React.ComponentProps["variant"]; buttonSize?: React.ComponentProps["size"]; buttonClassName?: string; + buttonDisabled?: boolean; buttonSlot?: ReactNode; leadingSlot?: ReactNode; contentClassName?: string; @@ -32,6 +33,7 @@ export default function ControlBox({ buttonVariant = "primary", buttonSize = "small", buttonClassName, + buttonDisabled, buttonSlot, leadingSlot, contentClassName, @@ -74,8 +76,9 @@ export default function ControlBox({ variant={buttonVariant} size={buttonSize} onClick={onButtonClick} + disabled={buttonDisabled} className={twMerge( - "shrink-0 !h-button-big px-8 !rounded-component-md", + "shrink-0 px-8 !rounded-component-md", buttonClassName, )} > diff --git a/src/pages/workspace/WorkspaceSetting.tsx b/src/pages/workspace/WorkspaceSetting.tsx index 3eb83ae1..c978b0c9 100644 --- a/src/pages/workspace/WorkspaceSetting.tsx +++ b/src/pages/workspace/WorkspaceSetting.tsx @@ -225,6 +225,7 @@ export default function WorkspaceSetting() { buttonVariant="dangerSoft" buttonSize="big" buttonClassName="px-8 !rounded-component-md" + buttonDisabled={saving || deleting} leadingSlot={} />