@yamada-ui/calendar
Version:
Yamada UI calendar component
1 lines • 14.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/calendar-utils.ts"],"sourcesContent":["import type { Dayjs } from \"dayjs\"\nimport type { MutableRefObject, RefObject } from \"react\"\nimport { isActiveElement } from \"@yamada-ui/utils\"\nimport dayjs from \"dayjs\"\n\nexport type MaybeDate = Date | Dayjs\n\nexport const getFirstOfWeek = (\n date: Date,\n firstDayOfWeek: \"monday\" | \"sunday\",\n): Date => {\n const value = new Date(date)\n const day = value.getDay() || 7\n const sunday = firstDayOfWeek === \"sunday\"\n\n const clampToFirstDay = sunday ? day : day - 1\n\n if ((sunday && day !== 0) || day !== 1) value.setHours(-24 * clampToFirstDay)\n\n return value\n}\n\nexport const getLastOfWeek = (\n date: Date,\n firstDayOfWeek: \"monday\" | \"sunday\",\n): Date => {\n const value = new Date(date)\n const day = value.getDay()\n const sunday = firstDayOfWeek === \"sunday\"\n\n const clampToLastDay = 7 - (sunday ? day + 1 : day)\n\n if ((sunday && day !== 6) || day !== 0)\n value.setDate(value.getDate() + clampToLastDay)\n\n return value\n}\n\nexport const getWeekdays = (\n locale: string,\n firstDayOfWeek: \"monday\" | \"sunday\",\n format = \"dd\",\n): string[] => {\n let weekdays: string[] = []\n\n const date = getFirstOfWeek(new Date(), firstDayOfWeek)\n\n for (let i = 0; i < 7; i += 1) {\n const weekday = dayjs(date).locale(locale).format(format)\n\n weekdays = [...weekdays, weekday]\n\n date.setDate(date.getDate() + 1)\n }\n\n return weekdays\n}\n\nexport const getMonthDays = (\n date: Date,\n firstDayOfWeek: \"monday\" | \"sunday\",\n): Date[][] => {\n const currentMonth = date.getMonth()\n const firstOfMonth = new Date(date.getFullYear(), currentMonth, 1)\n const lastOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0)\n const endDate = getLastOfWeek(lastOfMonth, firstDayOfWeek)\n const firstDate = getFirstOfWeek(firstOfMonth, firstDayOfWeek)\n\n const weeks: Date[][] = []\n\n while (firstDate <= endDate) {\n const days: Date[] = []\n\n for (let i = 0; i < 7; i += 1) {\n days.push(new Date(firstDate))\n\n firstDate.setDate(firstDate.getDate() + 1)\n }\n\n weeks.push(days)\n }\n\n return weeks\n}\n\nexport const getRangeYears = (year: number): number[] => {\n const rounded = year - 6\n\n let rangeYears: number[] = []\n\n for (let i = 0; i < 12; i += 1) {\n const rangeYear = rounded + i\n\n rangeYears = [...rangeYears, rangeYear]\n }\n\n return rangeYears\n}\n\nexport const getRangeMonths = (locale: string, format: string): string[] => {\n const rounded = new Date(1993, 0, 1)\n\n let rangeMonths: string[] = []\n\n for (let i = 0; i < 12; i += 1) {\n const rangeMonth = dayjs(rounded).locale(locale).format(format)\n\n rangeMonths = [...rangeMonths, rangeMonth]\n\n rounded.setMonth(rounded.getMonth() + 1)\n }\n\n return rangeMonths\n}\n\nexport const getFormattedLabel = (\n dateOrYear: Date | number | undefined,\n locale: string,\n format: string,\n): string => {\n if (dateOrYear == null || dateOrYear === -1) {\n return \"\"\n } else if (dateOrYear instanceof Date) {\n return dayjs(dateOrYear).locale(locale).format(format)\n } else {\n return dayjs(new Date(dateOrYear, 1, 1))\n .locale(locale)\n .format(format)\n }\n}\n\nexport const isSameMonth = (\n date: Date | undefined,\n comparison: Date | undefined,\n): boolean =>\n date?.getFullYear() === comparison?.getFullYear() &&\n date?.getMonth() === comparison?.getMonth()\n\nexport const isSameDate = (\n date: Date | undefined,\n comparison: Date | undefined,\n) => isSameMonth(date, comparison) && date?.getDate() === comparison?.getDate()\n\nexport const getRangeDates = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n) => {\n const dates: Date[] = []\n\n if (!startDate || !endDate) {\n if (startDate) dates.push(startDate)\n if (endDate) dates.push(endDate)\n } else {\n const resolvedStartDate = dayjs(startDate).startOf(\"day\")\n const resolvedEndDate = dayjs(endDate).startOf(\"day\")\n\n const n = Math.abs(resolvedStartDate.diff(resolvedEndDate, \"day\"))\n\n let date = resolvedStartDate\n\n for (let i = 0; i <= n; i++) {\n dates.push(date.add(i, \"day\").toDate())\n }\n }\n\n return dates\n}\n\nexport const isAfterMonth = (value: Date, date: Date | undefined) =>\n date instanceof Date && dayjs(value).startOf(\"month\").isAfter(date)\n\nexport const isBeforeMonth = (value: Date, date: Date | undefined) =>\n date instanceof Date && dayjs(value).startOf(\"month\").isBefore(date)\n\nexport const isInRange = (date: Date, minDate?: Date, maxDate?: Date) => {\n const hasMinDate = minDate instanceof Date\n const hasMaxDate = maxDate instanceof Date\n\n if (!hasMaxDate && !hasMinDate) return true\n\n const minInRange = hasMinDate ? isSomeAfterDate(date, minDate) : true\n const maxInRange = hasMaxDate ? isSomeBeforeDate(date, maxDate) : true\n\n return maxInRange && minInRange\n}\n\nexport const isMonthInRange = ({\n date,\n maxDate,\n minDate,\n}: {\n date: Date\n maxDate?: Date\n minDate?: Date\n}) => {\n const hasMinDate = minDate instanceof Date\n const hasMaxDate = maxDate instanceof Date\n\n if (!hasMaxDate && !hasMinDate) return true\n\n const firstOfMonth = dayjs(date).startOf(\"month\")\n const lastOfMonth = dayjs(date).endOf(\"month\")\n\n const minInRange = hasMinDate ? lastOfMonth.isAfter(minDate) : true\n const maxInRange = hasMaxDate ? firstOfMonth.isBefore(maxDate) : true\n\n return maxInRange && minInRange\n}\n\nexport const isIncludeDates = (date: Date, dates: Date[]) =>\n dates.some((d) => dayjs(d).isSame(date, \"day\"))\n\nexport const sortDates = (dates: Date[], type: \"asc\" | \"desc\" = \"asc\") => {\n if (type === \"asc\") {\n return dates.sort((a, b) => (dayjs(a).isAfter(b, \"day\") ? 1 : -1))\n } else {\n return dates.sort((a, b) => (dayjs(a).isBefore(b, \"day\") ? 1 : -1))\n }\n}\n\nexport const isSomeAfterDate = (\n value: MaybeDate,\n date: MaybeDate | undefined,\n) =>\n (date instanceof Date || date instanceof dayjs) &&\n (dayjs(value).isSame(date) || isAfterDate(value, date))\n\nexport const isSomeBeforeDate = (\n value: MaybeDate,\n date: MaybeDate | undefined,\n) =>\n (date instanceof Date || date instanceof dayjs) &&\n (dayjs(value).isSame(date) || isBeforeDate(value, date))\n\nexport const isAfterDate = (value: MaybeDate, date: MaybeDate | undefined) =>\n (date instanceof Date || date instanceof dayjs) &&\n dayjs(date).isBefore(value, \"day\")\n\nexport const isBeforeDate = (value: MaybeDate, date: MaybeDate | undefined) =>\n (date instanceof Date || date instanceof dayjs) &&\n dayjs(date).isAfter(value, \"day\")\n\nexport const onShouldFocus = <T = any>(\n refs: MutableRefObject<Map<T, RefObject<HTMLButtonElement>>>,\n validateFunc: (value: T) => boolean,\n isFirst = true,\n): void => {\n let targetValue: T | undefined\n let targetEl: HTMLButtonElement | null | undefined\n\n for (const value of refs.current.keys()) {\n const selected = validateFunc(value)\n\n if (selected) targetValue = value\n }\n\n if (typeof targetValue === \"number\") {\n const ref = refs.current.get(targetValue)\n\n targetEl = ref?.current\n } else {\n const values = [...refs.current.values()]\n const firstRef = values[0]\n const lastRef = values[values.length - 1]\n\n targetEl = isFirst ? firstRef?.current : lastRef?.current\n }\n\n if (targetEl) {\n targetEl.focus()\n targetEl.tabIndex = 0\n }\n}\n\nexport const getFocused = <T = any>(\n refs: MutableRefObject<Map<T, RefObject<HTMLButtonElement>>>,\n): T | undefined => {\n for (const [value, ref] of refs.current.entries()) {\n const focused = ref.current ? isActiveElement(ref.current) : false\n\n if (focused) return value\n }\n}\n\nexport const getRangeFirstDay = (\n refs: MutableRefObject<Map<string, RefObject<HTMLButtonElement>>>,\n) => {\n const days = [...refs.current.keys()]\n\n return days[0]\n}\n\nexport const getRangeLastDay = (\n refs: MutableRefObject<Map<string, RefObject<HTMLButtonElement>>>,\n) => {\n const days = [...refs.current.keys()]\n\n return days[days.length - 1]\n}\n\nexport const disableAllTabIndex = <T = any>(\n refs: MutableRefObject<Map<T, RefObject<HTMLButtonElement>>>,\n): void => {\n for (const ref of refs.current.values()) {\n if (ref.current) ref.current.tabIndex = -1\n }\n}\n\nexport const isDisabledDate = ({\n disableOutsideDays,\n endDate,\n excludeDate,\n maxDate,\n maxTrulySelectStartDate,\n maybeEndDate,\n maybeStartDate,\n minDate,\n minTrulySelectStartDate,\n outside,\n startDate,\n value,\n}: {\n disableOutsideDays: boolean\n outside: boolean\n value: Date\n endDate?: Date\n excludeDate?: (date: Date) => boolean\n maxDate?: Date\n maxTrulySelectStartDate?: Date\n maybeEndDate?: Date\n maybeStartDate?: Date\n minDate?: Date\n minTrulySelectStartDate?: Date\n startDate?: Date\n}) =>\n isAfterDate(value, maxDate) ||\n isBeforeDate(value, minDate) ||\n (isAfterDate(value, maybeStartDate) &&\n isBeforeDate(value, maxTrulySelectStartDate) &&\n !endDate) ||\n (isBeforeDate(value, maybeEndDate) &&\n isAfterDate(value, minTrulySelectStartDate) &&\n !startDate) ||\n !!excludeDate?.(value) ||\n (!!disableOutsideDays && !!outside)\n"],"mappings":"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","names":[]}