From 10fa71e2a7073ee7312d70d511a3446e505757e4 Mon Sep 17 00:00:00 2001 From: Lebaud Antoine Date: Mon, 22 May 2023 17:00:25 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(react)=20add=20DatePicker=20component?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on the Figma DS design by Alex, a mono date-picker component has been added. It uses react-aria headless ui component capabilities, with downshift headless ui component. React-aria was not supporting by default dropdown menus to select months and years. We could not reuse Popover component from react-aria because we are not using their headless ui component for the button one. Clicking on the toggle calendar button triggers both the button and the popover click outside events. React-aria button uses a custom onPress props that is disabled by their popover. Instead, I have implemented a simple custom hook. This is the first acceptable version of the component. Some minor user interaction are missing. This first component doesn't support time selection. --- .changeset/new-buckets-accept.md | 5 + .../components/Forms/DatePicker/Calendar.tsx | 323 +++++ .../Forms/DatePicker/CalendarCell.tsx | 44 + .../Forms/DatePicker/CalendarGrid.tsx | 71 ++ .../components/Forms/DatePicker/DateField.tsx | 88 ++ .../src/components/Forms/DatePicker/index.mdx | 114 ++ .../components/Forms/DatePicker/index.scss | 291 +++++ .../Forms/DatePicker/index.spec.tsx | 1087 +++++++++++++++++ .../Forms/DatePicker/index.stories.tsx | 104 ++ .../src/components/Forms/DatePicker/index.tsx | 174 +++ .../src/components/Forms/DatePicker/tokens.ts | 23 + .../src/components/Forms/Select/index.scss | 2 +- .../react/src/components/Popover/index.scss | 5 +- packages/react/src/cunningham-tokens.css | 19 + packages/react/src/cunningham-tokens.js | 2 +- packages/react/src/cunningham-tokens.ts | 2 +- packages/react/src/index.scss | 1 + packages/react/src/locales/en-US.json | 11 + packages/react/src/locales/fr-FR.json | 11 + packages/react/src/utils/index.scss | 4 + 20 files changed, 2377 insertions(+), 4 deletions(-) create mode 100644 .changeset/new-buckets-accept.md create mode 100644 packages/react/src/components/Forms/DatePicker/Calendar.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/CalendarCell.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/CalendarGrid.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/DateField.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/index.mdx create mode 100644 packages/react/src/components/Forms/DatePicker/index.scss create mode 100644 packages/react/src/components/Forms/DatePicker/index.spec.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/index.stories.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/index.tsx create mode 100644 packages/react/src/components/Forms/DatePicker/tokens.ts diff --git a/.changeset/new-buckets-accept.md b/.changeset/new-buckets-accept.md new file mode 100644 index 0000000..d72857f --- /dev/null +++ b/.changeset/new-buckets-accept.md @@ -0,0 +1,5 @@ +--- +"@openfun/cunningham-react": minor +--- + +add datepicker component diff --git a/packages/react/src/components/Forms/DatePicker/Calendar.tsx b/packages/react/src/components/Forms/DatePicker/Calendar.tsx new file mode 100644 index 0000000..4372ce3 --- /dev/null +++ b/packages/react/src/components/Forms/DatePicker/Calendar.tsx @@ -0,0 +1,323 @@ +import React, { useEffect, useMemo, useRef } from "react"; +import { + CalendarDate, + createCalendar, + DateValue, + GregorianCalendar, + toCalendar, +} from "@internationalized/date"; +import { useDateFormatter, useLocale } from "@react-aria/i18n"; +import { useCalendarState } from "@react-stately/calendar"; +import { useCalendar } from "@react-aria/calendar"; +import { + useSelect, + UseSelectReturnValue, + UseSelectStateChange, +} from "downshift"; +import classNames from "classnames"; +import { CalendarProps } from "react-aria"; +import { range } from ":/utils"; +import { Button } from ":/components/Button"; +import { CalendarGrid } from ":/components/Forms/DatePicker/CalendarGrid"; +import { useCunningham } from ":/components/Provider"; + +// todo to be factorized with the select component +interface Option { + value: number; + label: string; + disabled?: boolean; +} + +// todo to be factorized with the select component +const optionToString = (option: Option | null) => { + return option ? option.label : ""; +}; + +type DropdownValuesProps = { + options: Array