Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] MultiGroup 컴포넌트 개발 #56

Merged
merged 20 commits into from
Jun 23, 2024
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
48d20bc
Squashed commit of refactor/switch-component
ghdtjgus76 Jun 13, 2024
0f25477
chore: package.json 수정
ghdtjgus76 Jun 13, 2024
a5ee7f1
chore: Story 템플릿 수정
ghdtjgus76 Jun 13, 2024
b153672
feat: MultiGroup 컴포넌트 구현
ghdtjgus76 Jun 13, 2024
2d7d00f
chore: Checkbox 스토리 및 테스트 코드 수정
ghdtjgus76 Jun 13, 2024
0716ad6
chore: Switch 컴포넌트 스토리 및 테스트 수정
ghdtjgus76 Jun 13, 2024
060ce5e
feat: MultiGroup 컴포넌트 빌드 설정 적용
ghdtjgus76 Jun 13, 2024
8c091a7
feat: docs에 MultiGroup 컴포넌트 적용
ghdtjgus76 Jun 13, 2024
cb7fd70
comment: jsdoc 추가
ghdtjgus76 Jun 13, 2024
1a34c54
docs: 스토리 코드 문서화 추가
ghdtjgus76 Jun 13, 2024
07d2b08
test: 테스트 코드 작성
ghdtjgus76 Jun 14, 2024
eeb3f7b
chore: 자잘한 수정사항 반영
ghdtjgus76 Jun 14, 2024
688c4f5
chore: useCheckedState 훅에서 disabled 상태 고려할 수 있도록 로직 개선
ghdtjgus76 Jun 17, 2024
b46863e
chore: group context 상태 구조 분해 할당으로 가져오도록 수정
ghdtjgus76 Jun 17, 2024
2ee9814
chore: MultiGroup 잘못된 variant 수정
ghdtjgus76 Jun 17, 2024
da36e9e
chore: 상태값 네이밍 변경
ghdtjgus76 Jun 17, 2024
ef8e679
chore: 개별 스위치, 체크박스에는 value default 값 지정
ghdtjgus76 Jun 17, 2024
d43be07
comment: gap, position 관련 주석 추가
ghdtjgus76 Jun 22, 2024
c8c0115
Merge branch 'main' into feature/multi-group-component
ghdtjgus76 Jun 23, 2024
38e12d3
fix: 머지 에러 해결
ghdtjgus76 Jun 23, 2024
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
17 changes: 15 additions & 2 deletions apps/wow-docs/app/page.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,32 @@
import Checkbox from "wowds-ui/Checkbox";
import Chip from "wowds-ui/Chip";
import MultiGroup from "wowds-ui/MultiGroup";
import RadioButton from "wowds-ui/RadioButton";
import RadioGroup from "wowds-ui/RadioGroup";
import Switch from "wowds-ui/Switch";

const Home = () => {
return (
<>
<Checkbox />
<Checkbox value="checkbox" />
<Chip label="Chip" />
<Switch />
<Switch value="switch" />
<RadioGroup defaultValue="1학년" name="학년">
<RadioButton label="1학년" value="1학년" />
<RadioButton label="2학년" value="2학년" />
</RadioGroup>
<MultiGroup variant="checkbox">
<Checkbox children="checkbox1" value="checkbox1" />
<Checkbox children="checkbox2" value="checkbox2" />
<Checkbox children="checkbox3" value="checkbox3" />
<Checkbox children="checkbox4" value="checkbox4" />
</MultiGroup>
<MultiGroup variant="switch">
<Switch label="switch1" value="switch1" />
<Switch label="switch2" value="switch2" />
<Switch label="switch3" value="switch3" />
<Switch label="switch4" value="switch4" />
</MultiGroup>
</>
);
};
Expand Down
1 change: 0 additions & 1 deletion packages/codegen/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"name": "codegen",
"version": "0.0.0",
"description": "",
"main": "index.js",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion packages/codegen/templates/Story.tsx.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const meta = {
},
argTypes: {
props1: {
description: "props1은 default 값이 있는 필수적인 속성입니다."",
description: "props1은 default 값이 있는 필수적인 속성입니다.",
table: {
// type, 필수가 아닐 경우 required 삭제
type: { summary: "string", required: true },
Expand Down
5 changes: 5 additions & 0 deletions packages/wow-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@
"require": "./dist/RadioGroup.cjs",
"import": "./dist/RadioGroup.js"
},
"./MultiGroup": {
"types": "./dist/components/MultiGroup/index.d.ts",
"require": "./dist/MultiGroup.cjs",
"import": "./dist/MultiGroup.js"
},
"./Chip": {
"types": "./dist/components/Chip/index.d.ts",
"require": "./dist/Chip.cjs",
Expand Down
1 change: 1 addition & 0 deletions packages/wow-ui/rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export default {
Switch: "./src/components/Switch",
RadioButton: "./src/components/RadioGroup/RadioButton",
RadioGroup: "./src/components/RadioGroup/RadioGroup",
MultiGroup: "./src/components/MultiGroup",
Chip: "./src/components/Chip",
Checkbox: "./src/components/Checkbox",
Button: "./src/components/Button",
Expand Down
32 changes: 25 additions & 7 deletions packages/wow-ui/src/components/Checkbox/Checkbox.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ const meta = {
},
},
disabled: {
description:
"disabled는 체크박스가 비활성화되어 있는지 여부를 나타냅니다.",
description: "체크박스가 비활성화되어 있는지 여부를 나타냅니다.",
table: {
type: { summary: "boolean" },
defaultValue: { summary: "false" },
Expand All @@ -34,7 +33,7 @@ const meta = {
},
},
checked: {
description: "checked는 외부에서 제어할 활성 상태를 나타냅니다.",
description: "외부에서 제어할 활성 상태를 나타냅니다.",
table: {
type: { summary: "boolean" },
},
Expand All @@ -51,7 +50,7 @@ const meta = {
control: false,
},
onChange: {
description: "외부 활성 상태가 변경될 때 호출될 콜백 함수를 나타냅니다.",
description: "외부 활성 상태가 변경될 때 호출되는 함수입니다.",
table: {
type: { summary: "() => void" },
defaultValue: { summary: null },
Expand All @@ -61,7 +60,7 @@ const meta = {
},
},
onClick: {
description: "체크박스 클릭 시 동작할 이벤트입니다.",
description: "체크박스 클릭 시 호출되는 함수입니다.",
table: {
type: { summary: "() => void" },
defaultValue: { summary: null },
Expand All @@ -72,7 +71,7 @@ const meta = {
},
onKeyDown: {
description:
"체크박스에 포커스 됐을 때 엔터 키 또는 스페이스 바를 눌렀을 때 동작할 이벤트입니다.",
"체크박스에 포커스 됐을 때 엔터 키 또는 스페이스 바를 눌렀을 때 호출되는 함수입니다.",
table: {
type: { summary: "() => void" },
defaultValue: { summary: null },
Expand Down Expand Up @@ -130,6 +129,15 @@ const meta = {
},
control: false,
},
className: {
description: "체크박스에 전달하는 커스텀 클래스를 설정합니다.",
table: {
type: { summary: "string" },
},
control: {
type: "text",
},
},
},
} satisfies Meta<typeof Checkbox>;

Expand All @@ -140,18 +148,21 @@ type Story = StoryObj<typeof meta>;
export const Default: Story = {
args: {
defaultChecked: false,
value: "checkbox",
},
};

export const Checked: Story = {
args: {
defaultChecked: true,
value: "checkbox",
},
};

export const Disabled: Story = {
args: {
disabled: true,
value: "checkbox",
},
};

Expand All @@ -160,6 +171,7 @@ export const Vertical: Story = {
checked: true,
children: "string",
position: "vertical",
value: "checkbox",
},
};

Expand All @@ -168,6 +180,7 @@ export const Horizontal: Story = {
checked: true,
children: "string",
position: "horizontal",
value: "checkbox",
},
};

Expand All @@ -178,9 +191,14 @@ const ControlledCheckBox = () => {
setIsChecked((prev) => !prev);
};

return <Checkbox checked={isChecked} onChange={handleChange} />;
return (
<Checkbox checked={isChecked} value="checkbox" onChange={handleChange} />
);
};

export const ControlledState: Story = {
render: () => <ControlledCheckBox />,
args: {
value: "checkbox",
},
};
6 changes: 5 additions & 1 deletion packages/wow-ui/src/components/Checkbox/Checkbox.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ import Checkbox from "./index";

describe("Checkbox component", () => {
const renderCheckbox = (props: Partial<CheckboxProps> = {}): RenderResult => {
return render(<Checkbox {...props}>Text</Checkbox>);
return render(
<Checkbox value="checkbox" {...props}>
Text
</Checkbox>
);
};

test("toggles checked state when clicked", async () => {
Expand Down
22 changes: 14 additions & 8 deletions packages/wow-ui/src/components/Checkbox/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@ import { useCheckedState } from "@/hooks";
* @param {boolean} [defaultChecked=false] 체크박스가 처음에 활성화되어 있는지 여부.
* @param {boolean} [disabled=false] 체크박스가 비활성화되어 있는지 여부.
* @param {boolean} [checked] 외부에서 제어할 활성 상태.
* @param {() => void} [onChange] 외부 활성 상태가 변경될 때 호출될 콜백 함수.
* @param {() => void} [onClick] 체크박스 클릭 시 동작할 이벤트.
* @param {() => void} [onKeyDown] 체크박스에 포커스 됐을 때 엔터 키 또는 스페이스 바를 눌렀을 때 동작할 이벤트.
* @param {string} value 체크박스 값.
* @param {() => void} [onChange] 외부 활성 상태가 변경될 때 호출되는 함수.
* @param {() => void} [onClick] 체크박스 클릭 시 호출되는 함수.
* @param {() => void} [onKeyDown] 체크박스에 포커스 됐을 때 엔터 키 또는 스페이스 바를 눌렀을 때 호출되는 함수.
* @param {() => void} [onMouseEnter] 마우스가 체크박스 위로 진입할 때 호출되는 함수.
* @param {() => void} [onMouseLeave] 마우스가 체크박스에서 벗어날 때 호출되는 함수.
* @param {"vertical" | "horizontal"} [position="horizontal"] 체크박스와 텍스트의 배치를 설정. 'vertical' 또는 'horizontal' 값을 가집니다.
* @param {InputHTMLAttributes<HTMLInputElement>} [inputProps] 체크박스의 기본 input 요소에 전달할 추가 속성들.
* @param {CSSProperties} [style] 체크박스의 커스텀 스타일을 설정합니다.
* @param {string} [className] 체크박스에 전달하는 커스텀 클래스를 설정합니다.
* @param {CSSProperties} [style] 체크박스의 커스텀 스타일.
* @param {string} [className] 체크박스에 전달하는 커스텀 클래스.
* @param {React.ReactNode} [children] 체크박스 오른쪽이나 위쪽에 들어갈 텍스트.
* @param {ComponentPropsWithoutRef<T>} rest 렌더링된 요소 또는 컴포넌트에 전달할 추가 props.
* @param {ComponentPropsWithRef<T>["ref"]} ref 렌더링된 요소 또는 컴포넌트에 연결할 ref.
Expand All @@ -35,6 +36,7 @@ export interface CheckboxProps extends PropsWithChildren {
defaultChecked?: boolean;
disabled?: boolean;
checked?: boolean;
value?: string;
onChange?: () => void;
onClick?: () => void;
onKeyDown?: () => void;
Expand All @@ -50,8 +52,9 @@ const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
(
{
defaultChecked = false,
disabled = false,
disabled: disabledProp = false,
checked: checkedProp,
value = "checkbox",
onClick,
onChange,
children,
Expand All @@ -68,6 +71,7 @@ const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
const {
checked,
pressed,
disabled,
handleClick,
handleKeyDown,
handleKeyUp,
Expand All @@ -76,7 +80,8 @@ const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
} = useCheckedState({
defaultChecked,
checked: checkedProp,
disabled,
disabled: disabledProp,
value,
onChange,
onClick,
onKeyDown,
Expand Down Expand Up @@ -112,7 +117,8 @@ const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(
type: disabled ? "disabled" : checked ? "checked" : "default",
})}
{...inputProps}
onClick={handleClick}
value={value}
ghdtjgus76 marked this conversation as resolved.
Show resolved Hide resolved
onClick={() => handleClick(value)}
/>
{checked && (
<styled.span
Expand Down
Loading