UNPKG

@blueprintjs/datetime

Version:

Components for interacting with dates and times

75 lines 4.32 kB
/* * Copyright 2025 Palantir Technologies, Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import * as React from "react"; import { Menu, MenuItem } from "@blueprintjs/core"; import { Classes } from "../../common"; import { clone, isDayRangeInRange } from "../../common/dateUtils"; /** * Menu of {@link DateRangeShortcut} items, typically displayed in the UI to the left of a day picker calendar. * * This component may be used for single date pickers as well as range pickers by toggling the * `useSingleDateShortcuts` option. */ export const DatePickerShortcutMenu = props => { const { allowSingleDayRange = false, maxDate, minDate, onShortcutClick, selectedShortcutIndex = -1, timePrecision, useSingleDateShortcuts = false, } = props; const shortcuts = props.shortcuts === true ? createDefaultShortcuts(allowSingleDayRange, timePrecision != null, useSingleDateShortcuts) : props.shortcuts; return (React.createElement(Menu, { "aria-label": "Date picker shortcuts", className: Classes.DATERANGEPICKER_SHORTCUTS, tabIndex: 0 }, shortcuts.map((shortcut, index) => (React.createElement(ShortcutMenuItem, { key: index, active: selectedShortcutIndex === index, index: index, maxDate: maxDate, minDate: minDate, onShortcutClick: onShortcutClick, shortcut: shortcut }))))); }; const ShortcutMenuItem = props => { const { active, index, maxDate, minDate, onShortcutClick, shortcut } = props; const isShortcutInRange = isDayRangeInRange(shortcut.dateRange, [minDate, maxDate]); const handleClick = React.useCallback(() => onShortcutClick(shortcut, index), [index, onShortcutClick, shortcut]); return (React.createElement(MenuItem, { active: active, disabled: !isShortcutInRange, onClick: handleClick, shouldDismissPopover: false, text: shortcut.label })); }; function createShortcut(label, dateRange) { return { dateRange, label }; } function createDefaultShortcuts(allowSingleDayRange, hasTimePrecision, useSingleDateShortcuts) { const today = new Date(); const makeDate = (action) => { const returnVal = clone(today); action(returnVal); returnVal.setDate(returnVal.getDate() + 1); return returnVal; }; const tomorrow = makeDate(() => null); const yesterday = makeDate(d => d.setDate(d.getDate() - 2)); const oneWeekAgo = makeDate(d => d.setDate(d.getDate() - 7)); const oneMonthAgo = makeDate(d => d.setMonth(d.getMonth() - 1)); const threeMonthsAgo = makeDate(d => d.setMonth(d.getMonth() - 3)); const sixMonthsAgo = makeDate(d => d.setMonth(d.getMonth() - 6)); const oneYearAgo = makeDate(d => d.setFullYear(d.getFullYear() - 1)); const twoYearsAgo = makeDate(d => d.setFullYear(d.getFullYear() - 2)); const singleDayShortcuts = allowSingleDayRange || useSingleDateShortcuts ? [ createShortcut("Today", [today, hasTimePrecision ? tomorrow : today]), createShortcut("Yesterday", [yesterday, hasTimePrecision ? today : yesterday]), ] : []; return [ ...singleDayShortcuts, createShortcut(useSingleDateShortcuts ? "1 week ago" : "Past week", [oneWeekAgo, today]), createShortcut(useSingleDateShortcuts ? "1 month ago" : "Past month", [oneMonthAgo, today]), createShortcut(useSingleDateShortcuts ? "3 months ago" : "Past 3 months", [threeMonthsAgo, today]), // Don't include a couple of these for the single date shortcut ...(useSingleDateShortcuts ? [] : [createShortcut("Past 6 months", [sixMonthsAgo, today])]), createShortcut(useSingleDateShortcuts ? "1 year ago" : "Past year", [oneYearAgo, today]), ...(useSingleDateShortcuts ? [] : [createShortcut("Past 2 years", [twoYearsAgo, today])]), ]; } //# sourceMappingURL=shortcuts.js.map