# Select

Ein Select ermöglicht es Usern, eine einzelne Option aus einer vordefinierten Liste auszuwählen.

## Overview

# Playground

  Verwendung mit dynamisch erstellten Options

    Wenn die `Select`-Komponente ohne ein `key` Prop und mit dynamisch
    erstellten `Options` betrieben wird, kann dies dazu führen, dass die
    Komponente einfriert oder nicht mehr reagiert. Verwende ein `key` Prop auf
    der `Select`-Komponente, welches sich mit den dynamischen `Options` ändert.

Verwende `<Select />`, um einen Select darzustellen. Ein zugehöriges `<Label />`
sowie die gewünschte Anzahl an `<Option />`-Elementen werden innerhalb der
Component eingefügt.

```tsx
import {
  Label,
  Option,
  Select,
} from "@mittwald/flow-react-components";

<Select>
  <Label>App</Label>
  <Option>WordPress</Option>
  <Option>TYPO3</Option>
  <Option>Contao</Option>
  <Option>Drupal</Option>
  <Option>Joomla!</Option>
  <Option>Matomo</Option>
</Select>
```

---

# Default-Wert

Mit `defaultSelectedKey` kann eine Default-Option angegeben werden, die dem User
standardmäßig zuerst angezeigt wird.

```tsx
import {
  Label,
  Option,
  Select,
} from "@mittwald/flow-react-components";

<Select defaultSelectedKey="wordpress" isRequired>
  <Label>App</Label>
  <Option value="wordpress">WordPress</Option>
  <Option value="typo3">TYPO3</Option>
</Select>
```

---

# Kombiniere mit ...

## FieldDescription

Um wichtige Hinweise zu den Auswahloptionen des Select bereitzustellen, kann
unterhalb eine `<FieldDescription />` eingebaut werden.

```tsx
import {
  FieldDescription,
  Label,
  Option,
  Select,
} from "@mittwald/flow-react-components";

<Select>
  <Label>App</Label>
  <Option>WordPress</Option>
  <Option>TYPO3</Option>
  <Option>Contao</Option>
  <Option>Drupal</Option>
  <Option>Joomla!</Option>
  <Option>Matomo</Option>
  <FieldDescription>Weitere Informationen</FieldDescription>
</Select>
```

## Align

Benutze die [Align](/04-components/structure/align/overview) Component, um
beispielsweise einen Button neben dem Select zu platzieren.

```tsx
import {
  Align,
  Button,
  Select,
  Label,
  Option,
} from "@mittwald/flow-react-components";

<Align>
  <Select>
    <Label>App</Label>
    <Option>WordPress</Option>
    <Option>TYPO3</Option>
    <Option>Contao</Option>
    <Option>Drupal</Option>
    <Option>Joomla!</Option>
    <Option>Matomo</Option>
  </Select>
  <Button>Hinzufügen</Button>
</Align>
```

## ContextualHelp

Benutze das [ContextualHelp](/04-components/overlays/contextual-help/overview),
um weitere Informationen bereitstellen zu können.

```tsx
import {
  Button,
  ContextualHelp,
  ContextualHelpTrigger,
  Heading,
  Label,
  Option,
  Select,
  Text,
} from "@mittwald/flow-react-components";

<Select>
  <Label>
    App
    <ContextualHelpTrigger>
      <Button />
      <ContextualHelp>
        <Heading>Weitere Informationen</Heading>
        <Text>
          Hier gibt es weitere Informationen, die zu lang
          für die FieldDescription sind.
        </Text>
      </ContextualHelp>
    </ContextualHelpTrigger>
  </Label>
  <Option>WordPress</Option>
  <Option>TYPO3</Option>
  <Option>Contao</Option>
  <Option>Drupal</Option>
  <Option>Joomla!</Option>
  <Option>Matomo</Option>
</Select>
```

## React Hook Form

```tsx
import {
  Label,
  Option,
  Section,
  Select,
} from "@mittwald/flow-react-components";
import { useForm } from "react-hook-form";
import {
  Form,
  SubmitButton,
  typedField,
} from "@mittwald/flow-react-components/react-hook-form";
import { sleep } from "@/content/04-components/actions/action/examples/lib";

export default () => {
  const form = useForm<{ app: string }>();
  const Field = typedField(form);

  return (
    <Section>
      <Form form={form} onSubmit={sleep}>
        <Field
          name="app"
          rules={{
            required: "Bitte wähle eine App aus",
          }}
        >
          <Select>
            <Label>App</Label>
            <Option value="wordpress">WordPress</Option>
            <Option value="typo3">TYPO3</Option>
          </Select>
        </Field>
        <SubmitButton>Speichern</SubmitButton>
      </Form>
    </Section>
  );
}
```

