Skip to content

Commit

Permalink
select support multiple options text value
Browse files Browse the repository at this point in the history
  • Loading branch information
riccardoperra committed Oct 31, 2024
1 parent 0d569d6 commit 7670c75
Showing 1 changed file with 28 additions and 10 deletions.
38 changes: 28 additions & 10 deletions packages/kit/src/components/Select/Select.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
SelectItemProps as KSelectItemProps,
SelectRootProps as KSelectRootProps,
} from "@kobalte/core/select";
import { Accessor, JSX, JSXElement, ParentProps, Show, splitProps } from "solid-js";
import { Accessor, For, JSX, JSXElement, ParentProps, Show, splitProps } from "solid-js";
import { CheckIcon } from "../../icons/CheckIcon";
import { SelectorIcon } from "../../icons/SelectorIcon";
import { mergeClasses } from "../../utils/css";
Expand All @@ -19,7 +19,7 @@ import * as styles from "./Select.css";
import { SlotProp } from "../../utils/component";

// TODO: add to base field slot that respect the BaseFieldProps signature?
type SelectSlot = "root" | "input" | "label" | "errorLabel";
type SelectSlot = "root" | "input" | "label" | "errorLabel" | "itemValue";

export type SelectProps<Option, OptGroup = never> = KSelectRootProps<
Option,
Expand All @@ -33,6 +33,7 @@ export type SelectProps<Option, OptGroup = never> = KSelectRootProps<
} & FieldWithErrorMessageSupport & {
itemLabel?: (item: Option) => JSXElement;
valueComponent?: (state: Accessor<Option>) => JSXElement;
valueComponentMultiple?: (state: Accessor<Option[]>) => JSXElement;
} & SlotProp<SelectSlot>;

function SelectContent(props: ParentProps<KSelectContentProps>) {
Expand Down Expand Up @@ -76,8 +77,8 @@ export function Select<Option, OptGroup = never>(props: ParentProps<SelectProps<

const labelProps = createFieldLabelProps<"span">({
get class() {
return props.slotClasses?.label
}
return props.slotClasses?.label;
},
});

const descriptionProps = createFieldMessageProps({});
Expand All @@ -101,13 +102,30 @@ export function Select<Option, OptGroup = never>(props: ParentProps<SelectProps<
aria-label={local["aria-label"]}
class={mergeClasses(baseFieldProps.baseStyle(), styles.selectField)}
>
<KSelect.Value<Option>>
<KSelect.Value<Option> class={others.slotClasses?.itemValue}>
{state => {
const value = state.selectedOption();
if (!value) return null;
return local.valueComponent
? local.valueComponent(state.selectedOption)
: (state.selectedOption() as string);

return (
<Show
fallback={(() => {
const value = state.selectedOption();
if (!value) return null;
return local.valueComponent
? local.valueComponent(state.selectedOption)
: (state.selectedOption() as string);
})()}
when={props.multiple}>
<Show
fallback={state.selectedOptions().join(", ")}
when={props.valueComponentMultiple}>
{callback => (
<>
{callback()(state.selectedOptions)}
</>
)}
</Show>
</Show>
);
}}
</KSelect.Value>
<KSelect.Icon>
Expand Down

0 comments on commit 7670c75

Please sign in to comment.