@grafana/ui
Version:
Grafana Components Library
1 lines • 6.01 kB
Source Map (JSON)
{"version":3,"file":"DatePickerWithInput.mjs","sources":["../../../../../src/components/DateTimePickers/DatePickerWithInput/DatePickerWithInput.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { autoUpdate, flip, shift, useClick, useDismiss, useFloating, useInteractions } from '@floating-ui/react';\nimport { ChangeEvent, useState } from 'react';\n\nimport { GrafanaTheme2, dateTime } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\nimport { Props as InputProps, Input } from '../../Input/Input';\nimport { DatePicker } from '../DatePicker/DatePicker';\n\nexport const formatDate = (date: Date | string) => dateTime(date).format('L');\n\n/** @public */\nexport interface DatePickerWithInputProps extends Omit<InputProps, 'ref' | 'value' | 'onChange'> {\n /** Value selected by the DatePicker */\n value?: Date | string;\n /** The minimum date the value can be set to */\n minDate?: Date;\n /** The maximum date the value can be set to */\n maxDate?: Date;\n /** Handles changes when a new date is selected */\n onChange: (value: Date | string) => void;\n /** Hide the calendar when date is selected */\n closeOnSelect?: boolean;\n /** Text that appears when the input has no text */\n placeholder?: string;\n}\n\n/** @public */\nexport const DatePickerWithInput = ({\n value,\n minDate,\n maxDate,\n onChange,\n closeOnSelect,\n placeholder = 'Date',\n ...rest\n}: DatePickerWithInputProps) => {\n const [open, setOpen] = useState(false);\n const styles = useStyles2(getStyles);\n\n // the order of middleware is important!\n // see https://floating-ui.com/docs/arrow#order\n const middleware = [\n flip({\n // see https://floating-ui.com/docs/flip#combining-with-shift\n crossAxis: false,\n boundary: document.body,\n }),\n shift(),\n ];\n\n const { context, refs, floatingStyles } = useFloating({\n open,\n placement: 'bottom-start',\n onOpenChange: setOpen,\n middleware,\n whileElementsMounted: autoUpdate,\n strategy: 'fixed',\n });\n\n const click = useClick(context);\n const dismiss = useDismiss(context);\n const { getReferenceProps, getFloatingProps } = useInteractions([dismiss, click]);\n\n return (\n <div className={styles.container}>\n <Input\n ref={refs.setReference}\n type=\"text\"\n autoComplete={'off'}\n placeholder={placeholder}\n value={value ? formatDate(value) : value}\n onChange={(ev: ChangeEvent<HTMLInputElement>) => {\n // Allow resetting the date\n if (ev.target.value === '') {\n onChange('');\n }\n }}\n className={styles.input}\n {...rest}\n {...getReferenceProps()}\n />\n <div className={styles.popover} ref={refs.setFloating} style={floatingStyles} {...getFloatingProps()}>\n <DatePicker\n isOpen={open}\n value={value && typeof value !== 'string' ? value : dateTime().toDate()}\n minDate={minDate}\n maxDate={maxDate}\n onChange={(ev) => {\n onChange(ev);\n if (closeOnSelect) {\n setOpen(false);\n }\n }}\n onClose={() => setOpen(false)}\n />\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n position: 'relative',\n }),\n input: css({\n /* hides the native Calendar picker icon given when using type=date */\n \"input[type='date']::-webkit-inner-spin-button, input[type='date']::-webkit-calendar-picker-indicator\": {\n display: 'none',\n WebkitAppearance: 'none',\n },\n }),\n popover: css({\n zIndex: theme.zIndex.tooltip,\n }),\n };\n};\n"],"names":[],"mappings":"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"}