vorteil/direktiv

View on GitHub
ui/src/design/Timepicker/index.stories.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import { ArrowRight, Plus, X } from "lucide-react";
import { Command, CommandGroup, CommandList } from "~/design/Command";
import { Popover, PopoverContent, PopoverTrigger } from "~/design/Popover";
import TimePicker, { getTimeString } from "./";

import Button from "~/design/Button";
import { ButtonBar } from "~/design/ButtonBar";
import { Datepicker } from "../Datepicker";
import Input from "~/design/Input";
import { InputWithButton } from "~/design/InputWithButton";
import type { Meta } from "@storybook/react";
import { format } from "date-fns";
import { useState } from "react";

const meta = {
  title: "Components/Timepicker",
  component: TimePicker,
} satisfies Meta<typeof TimePicker>;

export default meta;

export const Default = () => {
  const [date, setDate] = useState<Date>(new Date());

  return (
    <TimePicker
      hoursLabel="Hours"
      minutesLabel="Minutes"
      secondsLabel="Seconds"
      date={date}
      setDate={setDate}
    />
  );
};

export const TimepickerInButtonBar = () => {
  const [date, setDate] = useState<Date>(new Date());
  const time = getTimeString(date);
  const [name, setName] = useState<string>(() => "filename.yaml");

  return (
    <div className="m-2 flex flex-row flex-wrap gap-2">
      <ButtonBar>
        <Button variant="outline" asChild>
          <label>name</label>
        </Button>
        <Popover>
          <PopoverTrigger asChild>
            <Button variant="outline">
              <span>{name}</span>
            </Button>
          </PopoverTrigger>
          <PopoverContent className="w-auto">
            <Command>
              <CommandList>
                <CommandGroup heading="filter by name">
                  <InputWithButton>
                    <Input
                      autoFocus
                      placeholder="filename.yaml"
                      value={name}
                      onChange={(event) => setName(event.target.value)}
                    />
                    <Button icon variant="ghost">
                      <ArrowRight />
                    </Button>
                  </InputWithButton>
                </CommandGroup>
              </CommandList>
            </Command>
          </PopoverContent>
        </Popover>
        <Button variant="outline" icon>
          <X />
        </Button>
      </ButtonBar>

      <ButtonBar>
        <Button variant="outline" asChild>
          <label>created after</label>
        </Button>
        <Popover>
          <PopoverTrigger asChild>
            <Button variant="outline">
              <span>{time}</span>
            </Button>
          </PopoverTrigger>
          <PopoverContent className="w-auto">
            <Command>
              <CommandList>
                <CommandGroup heading="filter by time">
                  <TimePicker
                    hoursLabel="Hours"
                    minutesLabel="Minutes"
                    secondsLabel="Seconds"
                    date={date}
                    setDate={setDate}
                  />
                </CommandGroup>
              </CommandList>
            </Command>
          </PopoverContent>
        </Popover>
        <Button variant="outline" icon>
          <X />
        </Button>
      </ButtonBar>
    </div>
  );
};

export const ButtonBarWithCombinationOfDatepickerAndTimepicker = () => {
  const defaultDate = new Date();

  const [date, setDate] = useState<Date>(() => defaultDate);

  const time = getTimeString(date);
  return (
    <div className="m-2 flex flex-row flex-wrap gap-2">
      <ButtonBar>
        <Button variant="outline" asChild>
          <label>Created after</label>
        </Button>
        <Popover>
          <PopoverTrigger asChild>
            <Button variant="outline">
              {date ? format(date, "PPP") : <span>Pick a date</span>}
            </Button>
          </PopoverTrigger>
          <PopoverContent className="w-auto">
            <Command>
              <CommandList>
                <CommandGroup heading="filter by date">
                  <Datepicker
                    mode="single"
                    selected={date}
                    onDayClick={setDate}
                    initialFocus
                  />
                </CommandGroup>
              </CommandList>
            </Command>
          </PopoverContent>
        </Popover>
        <Popover>
          <PopoverTrigger asChild>
            <Button variant="outline">
              <span>{time}</span>
            </Button>
          </PopoverTrigger>
          <PopoverContent className="w-auto">
            <Command>
              <CommandList>
                <CommandGroup heading="filter by time">
                  <TimePicker
                    hoursLabel="Hours"
                    minutesLabel="Minutes"
                    secondsLabel="Seconds"
                    date={date}
                    setDate={setDate}
                  />
                </CommandGroup>
              </CommandList>
            </Command>
          </PopoverContent>
        </Popover>
        <Button variant="outline" icon>
          <X />
        </Button>
      </ButtonBar>
      <Button variant="outline">
        <Plus />
      </Button>
    </div>
  );
};