diff --git a/apps/storybook/stories/DatePicker.stories.tsx b/apps/storybook/stories/DatePicker.stories.tsx index 147b9f4bc4..948a8dfc7f 100644 --- a/apps/storybook/stories/DatePicker.stories.tsx +++ b/apps/storybook/stories/DatePicker.stories.tsx @@ -11,7 +11,7 @@ export const Default = () => { const [selected, setSelected] = useState(new Date()); return (
- {/* */} +
); }; diff --git a/apps/storybook/stories/DateRangePicker.stories.tsx b/apps/storybook/stories/DateRangePicker.stories.tsx new file mode 100644 index 0000000000..154ace1bdc --- /dev/null +++ b/apps/storybook/stories/DateRangePicker.stories.tsx @@ -0,0 +1,45 @@ +import { ComponentMeta, ComponentStory } from "@storybook/react"; +import "@wojtekmaj/react-daterange-picker/dist/DateRangePicker.css"; +import { useState } from "react"; + +import DateRangePicker from "@calcom/ui/v2/core/form/date-range-picker/DateRangePicker"; +import "@calcom/ui/v2/core/form/date-range-picker/styles.css"; + +function getISOLocalDate(date) { + const year = padStart(date.getFullYear(), 4); + const month = padStart(date.getMonth() + 1); + const day = padStart(date.getDate()); + + return [`${year}-${month}-${day}`]; +} + +function padStart(num, val = 2) { + const numStr = `${num}`; + if (numStr.length >= val) { + return num; + } + + return `0000${numStr}`.slice(-val); +} + +export default { + title: "Date Range Picker", + component: DateRangePicker, +} as ComponentMeta; + +export const Default: ComponentStory = () => { + const [startDate, setStartDate] = useState(new Date()); + const [endDate, setEndDate] = useState(new Date()); + return ( +
+ { + setStartDate(startDate); + setEndDate(endDate); + }} + /> +
+ ); +}; diff --git a/apps/storybook/styles/globals.css b/apps/storybook/styles/globals.css index bef875f992..19ed75475a 100755 --- a/apps/storybook/styles/globals.css +++ b/apps/storybook/styles/globals.css @@ -2,6 +2,9 @@ @tailwind components; @tailwind utilities; +@import "../../../packages/ui/v2/core/form/date-range-picker/styles.css"; +@import "../../../node_modules/@wojtekmaj/react-daterange-picker/dist/DateRangePicker.css"; + :root { --brand-color: #292929; --brand-text-color: #ffffff; diff --git a/apps/web/components/v2/eventtype/EventLimitsTab.tsx b/apps/web/components/v2/eventtype/EventLimitsTab.tsx index 3a39e14a7b..3eb1d66755 100644 --- a/apps/web/components/v2/eventtype/EventLimitsTab.tsx +++ b/apps/web/components/v2/eventtype/EventLimitsTab.tsx @@ -7,8 +7,7 @@ import { classNames } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { PeriodType } from "@calcom/prisma/client"; import { Select, Switch, Label } from "@calcom/ui/v2"; - -import { DateRangePicker } from "@components/ui/form/DateRangePicker"; +import DateRangePicker from "@calcom/ui/v2/core/form/date-range-picker/DateRangePicker"; export const EventLimitsTab = (props: Pick) => { const { t } = useLocale(); @@ -112,7 +111,7 @@ export const EventLimitsTab = (props: Pick) />
- + & { + calendarClassName?: string; + onChange: (value: [Date, Date]) => void; + value: [Date, Date]; + clearIcon: JSX.Element | null; + calendarIcon: JSX.Element | null; + rangeDivider: JSX.Element | null; + disabled?: boolean | null; + nextLabel?: JSX.Element | null; + prevLabel?: JSX.Element | null; + }; + export default function DateRangePicker(props: DateRangePickerCalendarProps): JSX.Element; +} diff --git a/packages/ui/v2/core/Avatar.tsx b/packages/ui/v2/core/Avatar.tsx index 63c88c2bf0..d1fde9b46c 100644 --- a/packages/ui/v2/core/Avatar.tsx +++ b/packages/ui/v2/core/Avatar.tsx @@ -54,13 +54,15 @@ export default function Avatar(props: AvatarProps) { ); return title ? ( - - {avatar} - - - {title} - - + + + {avatar} + + + {title} + + + ) : ( <>{avatar} ); diff --git a/packages/ui/v2/core/form/date-range-picker/DateRangePicker.tsx b/packages/ui/v2/core/form/date-range-picker/DateRangePicker.tsx new file mode 100644 index 0000000000..f945ad3719 --- /dev/null +++ b/packages/ui/v2/core/form/date-range-picker/DateRangePicker.tsx @@ -0,0 +1,36 @@ +// @see: https://github.com/wojtekmaj/react-daterange-picker/issues/91 +import "@wojtekmaj/react-daterange-picker/dist/DateRangePicker.css"; +import PrimitiveDateRangePicker from "@wojtekmaj/react-daterange-picker/dist/entry.nostyle"; +import React from "react"; + +import { Icon } from "@calcom/ui/Icon"; +import "@calcom/ui/v2/core/form/date-range-picker/styles.css"; + +type Props = { + disabled?: boolean | undefined; + startDate: Date; + endDate: Date; + onDatesChange?: ((arg: { startDate: Date; endDate: Date }) => void) | undefined; +}; + +const DateRangePicker = ({ disabled, startDate, endDate, onDatesChange }: Props) => { + return ( + <> + } + rangeDivider={} + value={[startDate, endDate]} + onChange={([startDate, endDate]: [Date, Date]) => { + if (typeof onDatesChange === "function") onDatesChange({ startDate, endDate }); + }} + nextLabel={} + prevLabel={} + /> + + ); +}; + +export default DateRangePicker; diff --git a/packages/ui/v2/core/form/date-range-picker/styles.css b/packages/ui/v2/core/form/date-range-picker/styles.css new file mode 100644 index 0000000000..0c2b760620 --- /dev/null +++ b/packages/ui/v2/core/form/date-range-picker/styles.css @@ -0,0 +1,158 @@ +.react-daterange-picker > .react-daterange-picker__wrapper { + padding: .625rem .75rem; + font-size: .875rem; + line-height: 1.25rem; + border-radius: .375rem; + border-color: #E5E7EB; + width: 360px; + display: flex; + flex-direction: row; + align-items: center; + height: 36px; +} + +.react-daterange-picker__wrapper > .react-daterange-picker__calendar-button.react-daterange-picker__button { + padding: 4px 0; +} + +.react-daterange-picker > .react-daterange-picker__wrapper > .react-daterange-picker__inputGroup { + height: auto; +} +.react-daterange-picker.react-daterange-picker--disabled { + background-color: transparent; +} + +.react-daterange-picker.react-daterange-picker--disabled > .react-daterange-picker__wrapper { + background-color: #F3F4F6; +} + +.react-daterange-picker > .react-daterange-picker__wrapper:focus-within, +.react-daterange-picker > .react-daterange-picker__wrapper:focus-within:hover { + border-color: #111827; + border-width: 2px; +} + + +.react-daterange-picker > .react-daterange-picker__wrapper input { + margin: 0; + height: auto; + border-radius: .125rem; +} + +.react-daterange-picker__calendar.react-daterange-picker__calendar--open { + width: 360px; +} + +.react-daterange-picker__calendar > .react-calendar{ + padding: 0.5rem; + border-radius: 0.375rem; + border-width: 1px; + border-color: #E5E7EB; + width: 360px; + margin-top: 4px; +} + +.react-calendar__navigation > .react-calendar__navigation__arrow { + display: flex; + justify-content: center; + align-items: center; + border-radius: 6px; +} + +.react-calendar__navigation > .react-calendar__navigation__arrow.react-calendar__navigation__prev2-button, +.react-calendar__navigation > .react-calendar__navigation__arrow.react-calendar__navigation__next2-button { + display: none; +} + +.react-calendar__navigation > .react-calendar__navigation__label { + display: flex; + padding-left: 0.5rem; + padding-right: 0.5rem; + color: #111827; + order: -9999; + justify-content: flex-start; + align-items: center; + font-size: 16px; +} + +.react-calendar__navigation > .react-calendar__navigation__arrow { + text-align: center; + color: #6b7280; +} + +.react-calendar__month-view__weekdays__weekday > abbr { + font-weight: 500; + text-decoration: none; + font-size: 12px; +} + +.react-calendar__month-view__days { + padding: 0.25rem; + gap: 0.25rem; + font-size: 14px; +} + +button.react-calendar__tile.react-calendar__month-view__days__day { + flex : 0 0 13.25% !important; + border-radius: 0.375rem; + padding-top: 13px; + padding-bottom: 13px; + position: relative; +} + +.react-calendar__tile--now, +.react-calendar__tile.react-calendar__tile--hover:not(.react-calendar__tile--active) { + background-color: #E5E7EB !important; +} + +.react-calendar__month-view__days > .react-calendar__tile.react-calendar__tile--hasActive, +.react-calendar__month-view__days > .react-calendar__tile.react-calendar__tile--active, +.react-calendar__month-view__days > button.react-calendar__tile.react-calendar__tile--active:hover { + background-color: #111827; + color: #ffffff; +} + +.react-calendar__tile.react-calendar__tile--active.react-calendar__month-view__days__day--weekend { + color: #ffffff; +} + +.react-calendar__tile.react-calendar__month-view__days__day--weekend { + color: #111827; +} + +.react-calendar__tile.react-calendar__month-view__days__day--neighboringMonth { + color: #9ca3af; +} + + +.react-calendar__tile--now::before { + content:"\A"; + width: 4px; + height: 4px; + border-radius: 50%; + position: absolute; + background-color: #111827; + left: 50%; + transform: translateX(-50%); + bottom: 0; + z-index: inherit; +} + +button.react-calendar__tile.react-calendar__month-view__days__day:hover, +.react-calendar__tile.react-calendar__year-view__months__month:hover { + background-color: #D1D5DB; + color: #111827; +} + +.react-daterange-picker > .react-daterange-picker__wrapper:hover { + border-color: #9CA3AF; +} + +.react-daterange-picker.react-daterange-picker--disabled > .react-daterange-picker__wrapper:hover { + border-color: #E5E7EB; +} + +.react-calendar__navigation button.react-calendar__navigation__label:enabled:hover, +.react-calendar__navigation button.react-calendar__navigation__label:enabled:focus { + background-color: transparent; +} \ No newline at end of file