diff --git a/packages/react/src/components/Forms/Select/index.scss b/packages/react/src/components/Forms/Select/index.scss index 24b88ce..e205f96 100644 --- a/packages/react/src/components/Forms/Select/index.scss +++ b/packages/react/src/components/Forms/Select/index.scss @@ -62,6 +62,14 @@ font-size: var(--c--components--forms-select--font-size); background-color: var(--c--components--forms-select--background-color); } + + &__input { + &--hidden { + // Using display: none makes impossible to focus the input. + position: absolute; + height: 0; + } + } } &__actions { diff --git a/packages/react/src/components/Forms/Select/index.tsx b/packages/react/src/components/Forms/Select/index.tsx index f33e2aa..56dbb04 100644 --- a/packages/react/src/components/Forms/Select/index.tsx +++ b/packages/react/src/components/Forms/Select/index.tsx @@ -1,11 +1,27 @@ -import React, { forwardRef, PropsWithChildren } from "react"; +import React, { forwardRef, PropsWithChildren, ReactNode } from "react"; import { SelectMulti } from ":/components/Forms/Select/multi"; -import { Option, SelectMono } from ":/components/Forms/Select/mono"; +import { SelectMono } from ":/components/Forms/Select/mono"; import { FieldProps } from ":/components/Forms/Field"; export * from ":/components/Forms/Select/mono"; export * from ":/components/Forms/Select/multi"; +export type OptionWithRender = { + disabled?: boolean; + value: string; + label: string; + render: () => ReactNode; +}; + +export type Option = + | { + disabled?: boolean; + value?: string; + label: string; + render?: undefined; + } + | OptionWithRender; + export interface SelectHandle { blur: () => void; } @@ -28,6 +44,7 @@ export type SelectProps = PropsWithChildren & disabled?: boolean; clearable?: boolean; multi?: boolean; + showLabelWhenSelected?: boolean; }; export const Select = forwardRef((props, ref) => { if (props.defaultValue && props.value) { diff --git a/packages/react/src/components/Forms/Select/mono-common.tsx b/packages/react/src/components/Forms/Select/mono-common.tsx index b1f3a77..ee2848a 100644 --- a/packages/react/src/components/Forms/Select/mono-common.tsx +++ b/packages/react/src/components/Forms/Select/mono-common.tsx @@ -5,8 +5,8 @@ import { useCunningham } from ":/components/Provider"; import { Field } from ":/components/Forms/Field"; import { LabelledBox } from ":/components/Forms/LabelledBox"; import { Button } from ":/components/Button"; -import { Option } from ":/components/Forms/Select/mono"; -import { SelectProps } from ":/components/Forms/Select"; +import { Option, SelectProps } from ":/components/Forms/Select"; +import { isOptionWithRender } from ":/components/Forms/Select/utils"; export function getOptionsFilter(inputValue?: string) { return (option: Option) => { @@ -22,10 +22,20 @@ export const optionToString = (option: Option | null) => { return option ? option.label : ""; }; +/** + * Returns underlying value of option. + */ export const optionToValue = (option: Option) => { return option.value ?? option.label; }; +export const renderOption = (option: Option) => { + if (isOptionWithRender(option)) { + return option.render(); + } + return option.label; +}; + export interface SubProps extends SelectProps { defaultSelectedItem?: Option; downshiftProps: { @@ -159,12 +169,12 @@ export const SelectMonoAux = ({