diff --git a/.changeset/flat-spoons-double.md b/.changeset/flat-spoons-double.md new file mode 100644 index 0000000000..a242ecc20a --- /dev/null +++ b/.changeset/flat-spoons-double.md @@ -0,0 +1,7 @@ +--- +"@/storybook": patch +"@/web": patch +"flowbite-react": patch +--- + +feat(datepicker): add showOutsideDays prop and css fixes diff --git a/apps/storybook/src/Datepicker.stories.tsx b/apps/storybook/src/Datepicker.stories.tsx index 231e7f0cde..0345e4460e 100644 --- a/apps/storybook/src/Datepicker.stories.tsx +++ b/apps/storybook/src/Datepicker.stories.tsx @@ -86,6 +86,7 @@ ControlledDefaultEmpty.args = { autoHide: true, showClearButton: true, showTodayButton: true, + showOutsideDays: true, value: null, minDate: undefined, maxDate: undefined, @@ -100,6 +101,7 @@ Default.args = { autoHide: true, showClearButton: true, showTodayButton: true, + showOutsideDays: true, value: undefined, minDate: undefined, maxDate: undefined, @@ -113,6 +115,7 @@ NullDateValue.args = { autoHide: true, showClearButton: true, showTodayButton: true, + showOutsideDays: true, minDate: undefined, maxDate: undefined, language: "en", @@ -125,6 +128,7 @@ DateValueSet.args = { autoHide: true, showClearButton: true, showTodayButton: true, + showOutsideDays: true, minDate: undefined, maxDate: undefined, language: "en", @@ -138,6 +142,7 @@ EmptyDates.args = { autoHide: true, showClearButton: true, showTodayButton: true, + showOutsideDays: true, defaultValue: undefined, value: undefined, minDate: undefined, @@ -154,6 +159,7 @@ FilterWeekdaysOnly.args = { autoHide: false, showClearButton: true, showTodayButton: true, + showOutsideDays: true, defaultValue: undefined, value: undefined, minDate: undefined, @@ -177,6 +183,7 @@ FilterEvenDatesOnly.args = { autoHide: false, showClearButton: true, showTodayButton: true, + showOutsideDays: true, defaultValue: undefined, value: undefined, minDate: undefined, diff --git a/apps/web/content/docs/components/datepicker.mdx b/apps/web/content/docs/components/datepicker.mdx index 7e3e317019..ff34e1fb4e 100644 --- a/apps/web/content/docs/components/datepicker.mdx +++ b/apps/web/content/docs/components/datepicker.mdx @@ -83,6 +83,12 @@ Use ``. Pass `null` +## Outside days + +Use the `showOutsideDays` prop to show or hide the days falling into other months. + + + ## Theme To learn more about how to customize the appearance of components, please see the [Theme docs](/docs/customize/theme). diff --git a/apps/web/examples/datepicker/datepicker.showOutsideDays.tsx b/apps/web/examples/datepicker/datepicker.showOutsideDays.tsx new file mode 100644 index 0000000000..74dd23b040 --- /dev/null +++ b/apps/web/examples/datepicker/datepicker.showOutsideDays.tsx @@ -0,0 +1,25 @@ +import { Datepicker } from "flowbite-react"; +import type { CodeData } from "~/components/code-demo"; + +const code = ` +import { Datepicker } from "flowbite-react"; + +export function Component() { + return ; +} +`; + +export function Component() { + return ; +} + +export const showOutsideDays: CodeData = { + type: "single", + code: { + fileName: "index", + language: "tsx", + code, + }, + githubSlug: "datepicker/datepicker.showOutsideDays.tsx", + component: , +}; diff --git a/apps/web/examples/datepicker/index.ts b/apps/web/examples/datepicker/index.ts index f477842dc4..fe4ee29994 100644 --- a/apps/web/examples/datepicker/index.ts +++ b/apps/web/examples/datepicker/index.ts @@ -6,4 +6,5 @@ export { range } from "./datepicker.range"; export { root } from "./datepicker.root"; export { title } from "./datepicker.title"; export { value } from "./datepicker.value"; +export { showOutsideDays } from "./datepicker.showOutsideDays"; export { weekStart } from "./datepicker.weekStart"; diff --git a/packages/ui/src/components/Datepicker/Datepicker.tsx b/packages/ui/src/components/Datepicker/Datepicker.tsx index 7267a3e0f5..2c7a7abfef 100644 --- a/packages/ui/src/components/Datepicker/Datepicker.tsx +++ b/packages/ui/src/components/Datepicker/Datepicker.tsx @@ -99,6 +99,7 @@ export interface DatepickerProps labelClearButton?: string; showTodayButton?: boolean; labelTodayButton?: string; + showOutsideDays?: boolean; minDate?: Date; maxDate?: Date; filterDate?: (date: Date, view: Views) => boolean; @@ -126,6 +127,7 @@ export const Datepicker = forwardRef((props, ref labelClearButton = "Clear", showTodayButton = true, labelTodayButton = "Today", + showOutsideDays = true, defaultValue, minDate, maxDate, @@ -158,7 +160,7 @@ export const Datepicker = forwardRef((props, ref // Triggers when user select the date function changeSelectedDate(date: Date | null, useAutohide: boolean) { setSelectedDate(date); - + if (date) setViewDate(date); if ((date === null || date) && onChange) { onChange(date); } @@ -282,6 +284,7 @@ export const Datepicker = forwardRef((props, ref maxDate, filterDate, weekStart, + showOutsideDays, isOpen, setIsOpen, view, diff --git a/packages/ui/src/components/Datepicker/DatepickerContext.tsx b/packages/ui/src/components/Datepicker/DatepickerContext.tsx index d00a88ed94..51b3d352f4 100644 --- a/packages/ui/src/components/Datepicker/DatepickerContext.tsx +++ b/packages/ui/src/components/Datepicker/DatepickerContext.tsx @@ -8,6 +8,7 @@ export interface DatepickerContextValue { theme: DatepickerTheme; language: string; weekStart: WeekStart; + showOutsideDays: boolean; minDate?: Date; maxDate?: Date; filterDate?: (date: Date, view: Views) => boolean; diff --git a/packages/ui/src/components/Datepicker/Views/Days.tsx b/packages/ui/src/components/Datepicker/Views/Days.tsx index f91a0843fa..5d056da69d 100644 --- a/packages/ui/src/components/Datepicker/Views/Days.tsx +++ b/packages/ui/src/components/Datepicker/Views/Days.tsx @@ -10,6 +10,7 @@ import { isDateEqual, isDateInRange, isDateToday, + isMonthEqual, Views, } from "../helpers"; @@ -24,6 +25,8 @@ export interface DatepickerViewsDaysTheme { base: string; selected: string; disabled: string; + outside: string; + hidden: string; today: string; }; }; @@ -35,6 +38,7 @@ export function DatepickerViewsDays() { weekStart, minDate, maxDate, + showOutsideDays, filterDate, viewDate, selectedDate, @@ -65,10 +69,12 @@ export function DatepickerViewsDays() { const isDisabled = !isDateInRange(currentDate, minDate, maxDate) || (filterDate && !filterDate(currentDate, Views.Days)); const isToday = isDateToday(currentDate); + const isOutsideDay = !isMonthEqual(currentDate, viewDate); + const isHidden = isOutsideDay && !showOutsideDays; return (