Skip to content

Commit 75969cb

Browse files
committed
feat(select): add custom display value renderer
1 parent 58ed1c4 commit 75969cb

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

packages/components/base/src/select/index.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ const Select = ({
8080
position,
8181
excludeAutoPosition = defaultExclude,
8282
ref,
83+
displayValueRenderer,
8384
...props
8485
}: Readonly<SelectProps>): React.ReactElement => {
8586
const selectRef = useRef<HTMLSelectElement | null>(null);
@@ -94,7 +95,7 @@ const Select = ({
9495
const valueSlotRef = useRef<HTMLDivElement>(null);
9596

9697
const computedSkin = useMemo(
97-
() => formFieldContext?.skin ?? skin ?? "default",
98+
() => formFieldContext?.skin ?? skin,
9899
[formFieldContext?.skin, skin],
99100
);
100101

@@ -186,26 +187,32 @@ const Select = ({
186187

187188
/** Compute value label to display */
188189

189-
const displayValue = useMemo(() => {
190+
const displayValue = useMemo<React.ReactNode>(() => {
190191
if (selectedValuesList.length === 0) return;
191192

192-
const displayValue = childrenData.filter(
193+
const selectedChildrenData = childrenData.filter(
193194
(i) => i.computedValue && selectedValuesList.includes(i.computedValue),
194195
);
195196

197+
if (displayValueRenderer) {
198+
return displayValueRenderer(selectedChildrenData);
199+
}
200+
196201
const node = (
197202
<>
198-
{displayValue.map((i, k) => (
203+
{selectedChildrenData.map((i, k) => (
199204
<span key={i.textContent} className={styles.display_value_item}>
200205
{i.displayValue ?? i.textContent}
201-
{displayValue.length > 1 && k < displayValue.length - 1 && displayValueDivider}
206+
{selectedChildrenData.length > 1 &&
207+
k < selectedChildrenData.length - 1 &&
208+
displayValueDivider}
202209
</span>
203210
))}
204211
</>
205212
);
206213

207214
return node;
208-
}, [childrenData, selectedValuesList, displayValueDivider]);
215+
}, [selectedValuesList, childrenData, displayValueRenderer, displayValueDivider]);
209216

210217
/** Actions to do when dropdown closes */
211218
useEffect(() => {

packages/components/base/src/select/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ export interface SelectProps
7373
displayValueDivider?: React.ReactNode;
7474
/** Whether the select should take the full width of the parent container */
7575
fullWidth?: boolean;
76+
/** Custom display value renderer */
77+
displayValueRenderer?: (data: SelectChildrenData[]) => React.ReactNode;
7678
}
7779

7880
/**

0 commit comments

Comments
 (0)