# 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} />
}
```