# Component/DropdownFilter > Props: component-dropdownfilter.props.txt ## Examples ### Base ```tsx { args: { label: 'Label', options }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### Custom Max Height 최대 높이는 필터검색 및 하단 적용 bottom 버튼 영역을 제외한 옵션리스트 내부의 높이를 지정할 수 있습니다. ```tsx { args: { label: 'Label', leftIcon: , options, hasFilter: false, maxHeight: 100 }, parameters: { docs: { description: { story: '최대 높이는 필터검색 및 하단 적용 bottom 버튼 영역을 제외한 옵션리스트 내부의 높이를 지정할 수 있습니다.' } } }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### Custom Width ```tsx { args: { label: 'Label', leftIcon: , options, width: 250, optionsMatchRefWidth: true }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### Default Values ```tsx { args: { label: 'Label', options }, render: args => { const defaultValues = [1, 2, 5]; const [value, onChange] = useState<(string | number)[]>(defaultValues); return onChange(values)} />; } } ``` ### Disabled ```tsx { args: { label: 'Label', leftIcon: , options, disabled: true }, render: args => { return ; } } ``` ### Disabled Item ```tsx { args: { label: 'Label', leftIcon: , options: [{ label: 'apple', value: 1 }, { label: 'orange', value: 2, disabled: true }, { label: 'mango', value: 3 }, { label: 'lemon', value: 4, disabled: true }] }, render: args => { return ; } } ``` ### Error ```tsx { args: { label: 'Label', leftIcon: , options, status: 'error' }, render: args => { return ; } } ``` ### External Edit ```tsx { args: { label: 'Label', options }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); useEffect(() => { const timerId = setInterval(() => { onChange(() => Math.random() > 0.5 ? [Math.floor(Math.random() * 8) + 1] : []); }, 3000); return () => { clearInterval(timerId); }; }, []); return ; } } ``` ### Has Filter ```tsx { args: { label: 'Label', leftIcon: , options, hasFilter: true, optionFilter: (inputValue, { label }) => label.includes(inputValue) }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return { onChange(value); }} />; } } ``` ### Has Select All ```tsx { args: { label: 'Label', options, hasSelectAll: true }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return { onChange(value); }} />; } } ``` ### Helper Text ```tsx { args: { label: 'Label', helperText: 'info message', options }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### Label With Help Text `label`은 ReactNode이므로 도움말 아이콘 같은 부가 요소를 직접 조합할 수 있습니다. 요소 사이 간격은 컴포넌트가 4px로 처리합니다. `Popover`는 기본값이 hover로 열리므로 트리거의 mousedown과 충돌하지 않습니다. 클릭으로 열리는 요소를 넣어야 한다면 `onMouseDown`에서 이벤트 전파를 막아야 합니다. ```tsx { args: { leftIcon: , options, valueText: '선택한 값' }, parameters: { docs: { description: { story: ['`label`은 ReactNode이므로 도움말 아이콘 같은 부가 요소를 직접 조합할 수 있습니다. 요소 사이 간격은 컴포넌트가 4px로 처리합니다.', '`Popover`는 기본값이 hover로 열리므로 트리거의 mousedown과 충돌하지 않습니다. 클릭으로 열리는 요소를 넣어야 한다면 `onMouseDown`에서 이벤트 전파를 막아야 합니다.'].join('\n') } } }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return Label }> } value={value} onChange={onChange} />; } } ``` ### Selected ```tsx { args: { label: 'Label', leftIcon: , options }, render: args => { const [value, onChange] = useState<(string | number)[]>([2, 3, 6]); return onChange(value)} />; } } ``` ### Selection Group ```tsx { args: { label: 'Label', leftIcon: , hasFilter: true, optionFilter: (inputValue, { label }) => label.includes(inputValue), selectionGroup }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### Selection Radio Type ```tsx { args: { label: 'Label', leftIcon: , options, variant: 'radio' }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); const [group_value, onChangeGroup] = useState<(string | number)[]>([]); return 기본 Selection Group ; } } ``` ### Size ```tsx { args: { label: 'Label', leftIcon: , options, hasFilter: true }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return 기본 필터 사용 ; } } ``` ### Value Text Ellipsis 너비가 부족하면 레이블이 아니라 선택한 값이 말줄임 처리됩니다. ```tsx { args: { label: 'Label', options, width: 220, valueText: 'apple, orange, mango, lemon, lime, kiwi' }, parameters: { docs: { description: { story: '너비가 부족하면 레이블이 아니라 선택한 값이 말줄임 처리됩니다.' } } }, render: args => undefined} /> } ``` ### With Help Text ```tsx { args: { label: 'Label', leftIcon: , options, helperText: 'info message' }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### With Icon ```tsx { args: { label: 'Label', leftIcon: , options }, render: args => { const [value, onChange] = useState<(string | number)[]>([]); return ; } } ``` ### With Value Text `valueText`를 전달하면 레이블 우측에 구분선과 선택한 값이 함께 표시됩니다. 컴포넌트는 선택 상태를 어떤 문자열로 보여줄지 알 수 없으므로 표시할 값은 호출하는 쪽에서 계산합니다. `leftIcon`은 레이블 앞이 아니라 선택한 값 앞으로 이동합니다. ```tsx { args: { label: 'Label', leftIcon: , options }, parameters: { docs: { description: { story: ['`valueText`를 전달하면 레이블 우측에 구분선과 선택한 값이 함께 표시됩니다.', '컴포넌트는 선택 상태를 어떤 문자열로 보여줄지 알 수 없으므로 표시할 값은 호출하는 쪽에서 계산합니다.', '`leftIcon`은 레이블 앞이 아니라 선택한 값 앞으로 이동합니다.'].join('\n') } } }, render: args => { const [value, onChange] = useState<(string | number)[]>([2]); return ; } } ``` ### With Value Text Size ```tsx { args: { label: 'Label', leftIcon: , options, valueText: '선택한 값' }, render: args => undefined} /> undefined} /> undefined} /> undefined} /> } ``` ### With Value Text Status 구분선 색은 상태에 따라 달라집니다. 선택 상태는 accent, error 상태는 negative 계열을 사용합니다. ```tsx { args: { label: 'Label', leftIcon: , options, valueText: '선택한 값' }, parameters: { docs: { description: { story: '구분선 색은 상태에 따라 달라집니다. 선택 상태는 accent, error 상태는 negative 계열을 사용합니다.' } } }, render: args => 기본 undefined} /> 선택 undefined} /> Error undefined} /> Disabled undefined} /> } ```