@plexui/vue 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/components/DateRangePicker/Calendar.js +19 -18
- package/dist/es/components/DateRangePicker/Calendar.js.map +1 -1
- package/dist/es/components/DateRangePicker/DateRangePicker.js +5 -0
- package/dist/es/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/es/components/DateRangePicker/context.js.map +1 -1
- package/dist/es/components/DateRangePicker/index.js.map +1 -1
- package/dist/es/components/DateRangePicker/types.js.map +1 -1
- package/dist/es/components/Dialog/Dialog.js +46 -11
- package/dist/es/components/Dialog/Dialog.js.map +1 -1
- package/dist/es/components/Field/Field.js +6 -3
- package/dist/es/components/Field/Field.js.map +1 -1
- package/dist/es/components/InputGroup/InputGroup.js +0 -1
- package/dist/es/components/InputGroup/InputGroup.js.map +1 -1
- package/dist/es/components/Menu/Menu.js +27 -5
- package/dist/es/components/Menu/Menu.js.map +1 -1
- package/dist/es/components/Popover/Popover.js +24 -9
- package/dist/es/components/Popover/Popover.js.map +1 -1
- package/dist/es/components/Select/Select.js +33 -15
- package/dist/es/components/Select/Select.js.map +1 -1
- package/dist/es/components/SelectControl/SelectControl.js +7 -4
- package/dist/es/components/SelectControl/SelectControl.js.map +1 -1
- package/dist/es/components/Transition/TransitionGroup.js +12 -1
- package/dist/es/components/Transition/TransitionGroup.js.map +1 -1
- package/dist/es/components/Transition/shared.js +30 -1
- package/dist/es/components/Transition/shared.js.map +1 -1
- package/dist/es/components/Transition/useTransitionChild.js +2 -2
- package/dist/es/components/Transition/useTransitionChild.js.map +1 -1
- package/dist/es/lib/dateUtils.js +5 -0
- package/dist/es/lib/dateUtils.js.map +1 -1
- package/dist/es/lib/helpers.js +30 -0
- package/dist/es/lib/helpers.js.map +1 -1
- package/dist/types/components/DateRangePicker/DateRangePicker.d.ts +23 -1
- package/dist/types/components/DateRangePicker/context.d.ts +2 -1
- package/dist/types/components/DateRangePicker/index.d.ts +1 -1
- package/dist/types/components/DateRangePicker/types.d.ts +2 -0
- package/dist/types/components/Field/Field.d.ts +2 -2
- package/dist/types/components/Select/Select.d.ts +11 -0
- package/dist/types/components/SelectControl/SelectControl.d.ts +11 -0
- package/dist/types/components/Transition/TransitionGroup.d.ts +11 -0
- package/dist/types/components/Transition/shared.d.ts +23 -0
- package/dist/types/components/Transition/useTransitionChild.d.ts +1 -0
- package/dist/types/lib/dateUtils.d.ts +5 -0
- package/dist/types/lib/helpers.d.ts +13 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DateTime, Interval } from "luxon";
|
|
2
2
|
import { computed, createCommentVNode, defineComponent, h, onMounted, ref, shallowRef, watch } from "vue";
|
|
3
3
|
import { useBreakpoint } from "../../composables/useBreakpoints.js";
|
|
4
|
-
import { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday } from "../../lib/dateUtils.js";
|
|
4
|
+
import { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday, weekPosition } from "../../lib/dateUtils.js";
|
|
5
5
|
import { waitForAnimationFrame } from "../../lib/helpers.js";
|
|
6
6
|
import { Button } from "../Button/index.js";
|
|
7
7
|
import { Check, ChevronLeft, ChevronRight } from "../Icon/index.js";
|
|
@@ -20,12 +20,9 @@ import {} from "./types.js";
|
|
|
20
20
|
// `{isSmallUp && ...}`: TransitionGroup still renders its (empty) wrapper
|
|
21
21
|
// when animations are off.
|
|
22
22
|
// - React quirk kept: the day buttons have no `type`.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
// The day a grid key moves to: a day, a week, the Sunday or Saturday of the
|
|
27
|
-
// week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)
|
|
28
|
-
const getKeyTarget = (key, day) => {
|
|
23
|
+
// The day a grid key moves to: a day, a week, the first or last day of the
|
|
24
|
+
// week row, or a month (Luxon clamps Jan 31 to Feb 28/29)
|
|
25
|
+
const getKeyTarget = (key, day, weekStartsOn) => {
|
|
29
26
|
switch (key) {
|
|
30
27
|
case "ArrowLeft":
|
|
31
28
|
return day.minus({ days: 1 });
|
|
@@ -36,9 +33,9 @@ const getKeyTarget = (key, day) => {
|
|
|
36
33
|
case "ArrowDown":
|
|
37
34
|
return day.plus({ days: 7 });
|
|
38
35
|
case "Home":
|
|
39
|
-
return day.minus({ days: day
|
|
36
|
+
return day.minus({ days: weekPosition(day, weekStartsOn) });
|
|
40
37
|
case "End":
|
|
41
|
-
return day.plus({ days: 6 - (day
|
|
38
|
+
return day.plus({ days: 6 - weekPosition(day, weekStartsOn) });
|
|
42
39
|
case "PageUp":
|
|
43
40
|
return day.minus({ months: 1 });
|
|
44
41
|
case "PageDown":
|
|
@@ -129,7 +126,7 @@ export const DateRangeCalendar = defineComponent({
|
|
|
129
126
|
}
|
|
130
127
|
// While a move waits for its month to render, the next key starts from
|
|
131
128
|
// the day it is moving to (key repeat), not the day that still has focus
|
|
132
|
-
const target = getKeyTarget(event.key, pendingFocus ?? day);
|
|
129
|
+
const target = getKeyTarget(event.key, pendingFocus ?? day, context.weekStartsOn);
|
|
133
130
|
if (!target) {
|
|
134
131
|
return;
|
|
135
132
|
}
|
|
@@ -283,7 +280,7 @@ export const DateRangeCalendar = defineComponent({
|
|
|
283
280
|
]),
|
|
284
281
|
h("div", {
|
|
285
282
|
class: s.CalendarRange,
|
|
286
|
-
style: { transform: `translate(${calendarSteps.value * -1 *
|
|
283
|
+
style: { transform: `translate(calc(${calendarSteps.value * -1} * var(--calendar-step)), 0)` },
|
|
287
284
|
}, [
|
|
288
285
|
h(TransitionGroup, { enterDuration: 400, exitDuration: 400 }, {
|
|
289
286
|
default: () => [
|
|
@@ -327,13 +324,15 @@ const CalendarView = defineComponent({
|
|
|
327
324
|
stepPosition: { type: Number, required: true },
|
|
328
325
|
},
|
|
329
326
|
setup(props) {
|
|
327
|
+
const context = useDateRangeContext();
|
|
330
328
|
// Lock position on mount and don't respond to changes
|
|
331
329
|
const position = props.stepPosition;
|
|
332
330
|
const view = computed(() => {
|
|
333
331
|
const { date, min, max } = props;
|
|
332
|
+
const { weekStartsOn } = context;
|
|
334
333
|
const monthStart = date.startOf("month");
|
|
335
334
|
const endOfMonth = date.endOf("month");
|
|
336
|
-
const daysBeforeMonthStart = monthStart
|
|
335
|
+
const daysBeforeMonthStart = weekPosition(monthStart, weekStartsOn);
|
|
337
336
|
const blankDays = new Array(daysBeforeMonthStart).fill(null);
|
|
338
337
|
const daysInMonth = getDaysOfMonth(monthStart);
|
|
339
338
|
const calendarCells = [...blankDays, ...daysInMonth];
|
|
@@ -359,9 +358,11 @@ const CalendarView = defineComponent({
|
|
|
359
358
|
const { selectionStart, maxRangeDays, isSelecting } = props;
|
|
360
359
|
const [selectedStart, selectedEnd] = props.selectedDates || [];
|
|
361
360
|
const rangeEndLimit = selectionStart && maxRangeDays != null ? selectionStart.plus({ days: maxRangeDays - 1 }) : undefined;
|
|
362
|
-
|
|
361
|
+
const { weekStartsOn } = context;
|
|
362
|
+
const dayLabels = [...daysOfTheWeekLabels.slice(weekStartsOn), ...daysOfTheWeekLabels.slice(0, weekStartsOn)];
|
|
363
|
+
return h("div", { "class": s.Calendar, "style": { left: `calc(${position} * var(--calendar-step))` }, "data-calendar": true }, [
|
|
363
364
|
h("p", { class: s.MonthLabel }, [startOfMonth.monthLong, " ", String(startOfMonth.year)]),
|
|
364
|
-
h("div", { class: s.Week },
|
|
365
|
+
h("div", { class: s.Week }, dayLabels.map((day) => h("div", { key: day, class: s.DayLabel }, day))),
|
|
365
366
|
...weeks.map((week, weekIndex) => h("div", { class: s.Week, key: weekIndex }, week.map((d, dayIndex) => {
|
|
366
367
|
if (!d) {
|
|
367
368
|
return h("div", { class: s.Day, key: `${weekIndex}-${dayIndex}` });
|
|
@@ -374,13 +375,13 @@ const CalendarView = defineComponent({
|
|
|
374
375
|
const isInRange = hasRange && selectedInterval.value?.contains(d);
|
|
375
376
|
const dayIsToday = isToday(d);
|
|
376
377
|
const isFirstRangeTrail = d.day === 1 &&
|
|
377
|
-
// Trail doesn't make sense to display at the start of the week
|
|
378
|
-
d
|
|
378
|
+
// Trail doesn't make sense to display at the start of the week
|
|
379
|
+
weekPosition(d, weekStartsOn) !== 0 &&
|
|
379
380
|
isInRange &&
|
|
380
381
|
!isStart;
|
|
381
382
|
const isLastRangeTrail = d.day === d.daysInMonth &&
|
|
382
|
-
// Trail doesn't make sense to display at the end of the week
|
|
383
|
-
d
|
|
383
|
+
// Trail doesn't make sense to display at the end of the week
|
|
384
|
+
weekPosition(d, weekStartsOn) !== 6 &&
|
|
384
385
|
isInRange &&
|
|
385
386
|
!isEnd;
|
|
386
387
|
return h("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/Calendar.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime, Interval } from \"luxon\"\nimport { computed, createCommentVNode, defineComponent, h, onMounted, ref, shallowRef, watch, type PropType } from \"vue\"\nimport { useBreakpoint } from \"../../composables/useBreakpoints.js\"\nimport { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday } from \"../../lib/dateUtils.js\"\nimport { waitForAnimationFrame } from \"../../lib/helpers.js\"\nimport { Button } from \"../Button/index.js\"\nimport { Check, ChevronLeft, ChevronRight } from \"../Icon/index.js\"\nimport { TransitionGroup } from \"../Transition/index.js\"\nimport s from \"@plexui/styles/components/DateRangePicker/Calendar.module.css\"\nimport { useDateRangeContext } from \"./context.js\"\nimport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/Calendar.tsx.\n// - React's `[value]` effect is a watcher on the context value; the height\n// effect runs on mount and when the left month changes, after render.\n// - The `stable-view-N` key on the wrapper remounts the calendar view, as in\n// React, when the value jumps out of view.\n// - React's pending-focus effect is a post watcher on the left month; its\n// cleanup cancels the frame, as the effect's does.\n// - Below the `sm` breakpoint the right calendar is a placeholder, as React's\n// `{isSmallUp && ...}`: TransitionGroup still renders its (empty) wrapper\n// when animations are off.\n// - React quirk kept: the day buttons have no `type`.\n\nconst CALENDAR_WIDTH_PX = 210\nconst CALENDAR_GAP_PX = 32\nconst STEP_DISTANCE_PX = CALENDAR_WIDTH_PX + CALENDAR_GAP_PX\n\n// The day a grid key moves to: a day, a week, the Sunday or Saturday of the\n// week (rows start on Sunday), or a month (Luxon clamps Jan 31 to Feb 28/29)\nconst getKeyTarget = (key: string, day: DateTime): DateTime | null => {\n switch (key) {\n case \"ArrowLeft\":\n return day.minus({ days: 1 })\n case \"ArrowRight\":\n return day.plus({ days: 1 })\n case \"ArrowUp\":\n return day.minus({ days: 7 })\n case \"ArrowDown\":\n return day.plus({ days: 7 })\n case \"Home\":\n return day.minus({ days: day.weekday % 7 })\n case \"End\":\n return day.plus({ days: 6 - (day.weekday % 7) })\n case \"PageUp\":\n return day.minus({ months: 1 })\n case \"PageDown\":\n return day.plus({ months: 1 })\n default:\n return null\n }\n}\n\nconst monthIndex = (date: DateTime) => date.year * 12 + date.month\n\nexport const DateRangeCalendar = defineComponent({\n name: \"DateRangeCalendar\",\n setup() {\n const context = useDateRangeContext()\n const isSmallUp = useBreakpoint(\"sm\")\n const calendarContainerRef = shallowRef<HTMLDivElement | null>(null)\n // The day to focus once a key has moved the view to its month\n let pendingFocus: DateTime | null = null\n const selectionRange = shallowRef<DateRange | null>(null)\n const calendarSteps = ref(0)\n const forceRenderIncrement = ref(0)\n const leftCalendarDate = shallowRef<DateTime>(\n isSmallUp.value\n ? getLeftCalendarDate(context.value?.[0] ?? DateTime.now(), context.max)\n : (context.value?.[0] ?? DateTime.now()),\n )\n\n const rightCalendarDate = computed(() =>\n isSmallUp.value\n ? leftCalendarDate.value.plus({ months: 1 }).startOf(\"month\")\n : leftCalendarDate.value.startOf(\"month\"),\n )\n\n const canGoBack = () => !context.min || isBefore(context.min, leftCalendarDate.value.startOf(\"month\"))\n const canGoForward = () => !context.max || isBefore(rightCalendarDate.value.endOf(\"month\"), context.max)\n\n const handleNext = () => {\n calendarSteps.value += 1\n leftCalendarDate.value = leftCalendarDate.value.plus({ months: 1 })\n }\n\n const handlePrevious = () => {\n calendarSteps.value -= 1\n leftCalendarDate.value = leftCalendarDate.value.minus({ months: 1 })\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (!selectionRange.value) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n const [currentSelectionStartDate] = selectionRange.value\n\n // Selecting a date before the current selected start date moves the start date\n // but does not resolve the selection\n if (isBefore(selectedDate, currentSelectionStartDate)) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n // Resolve the selection by emitting the value and clearing selection\n context.onChange([currentSelectionStartDate, selectedDate])\n selectionRange.value = null\n }\n\n const handleDateMouseEnter = (hoveredDate: DateTime) => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n const [currentStartDate] = currentSelectionRange\n\n // When hovering a date before the current date, don't change the selection range\n if (isBefore(hoveredDate, currentStartDate)) {\n selectionRange.value = [currentStartDate, currentStartDate]\n return\n }\n\n selectionRange.value = [currentStartDate, hoveredDate]\n }\n\n const handleCalendarMouseLeave = () => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n // Reset the end selection\n const [currentStartDate] = currentSelectionRange\n selectionRange.value = [currentStartDate, currentStartDate]\n }\n\n // Days are named by their full date; skip calendars that are leaving\n const focusDay = (day: DateTime) => {\n const label = day.toLocaleString(DateTime.DATE_HUGE)\n const buttons = calendarContainerRef.value?.querySelectorAll<HTMLButtonElement>(`button[aria-label=\"${label}\"]`)\n Array.from(buttons ?? [])\n .find((button) => !button.closest(\"[data-exiting]\"))\n ?.focus()\n }\n\n const handleDayKeyDown = (event: KeyboardEvent, day: DateTime) => {\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n\n // While a move waits for its month to render, the next key starts from\n // the day it is moving to (key repeat), not the day that still has focus\n const target = getKeyTarget(event.key, pendingFocus ?? day)\n if (!target) {\n return\n }\n\n event.preventDefault()\n\n // A disabled day (outside min/max, or past maxRangeDays while selecting)\n // keeps focus where it is\n const { min, max, maxRangeDays } = context\n const selection = selectionRange.value\n const rangeEndLimit =\n selection && maxRangeDays != null ? selection[0].plus({ days: maxRangeDays - 1 }) : undefined\n if (\n (min && isBefore(target, min.startOf(\"day\"))) ||\n (max && isAfter(target, max.endOf(\"day\"))) ||\n (rangeEndLimit && isAfter(target, rangeEndLimit))\n ) {\n return\n }\n\n const monthsBefore = monthIndex(leftCalendarDate.value) - monthIndex(target)\n const monthsAfter = monthIndex(target) - monthIndex(rightCalendarDate.value)\n if (monthsBefore <= 0 && monthsAfter <= 0) {\n pendingFocus = null\n focusDay(target)\n return\n }\n\n // Step the view like the month buttons; a day within min/max keeps every step in bounds\n if (monthsAfter > 0 ? !canGoForward() : !canGoBack()) {\n return\n }\n\n pendingFocus = target\n for (let step = 0; step < Math.max(monthsBefore, monthsAfter); step++) {\n if (monthsAfter > 0) {\n handleNext()\n } else {\n handlePrevious()\n }\n }\n }\n\n // Force re-renders when `value` changes out of brand from direct user-selection\n watch(\n () => context.value,\n (value) => {\n // When a new value is received, it could be out of band from the control of this calendar.\n // For example, a shortcut could be selected, or clear could be pressed. In either case, selection\n // should be reset so that the new `value` can be displayed fully.\n selectionRange.value = null\n\n // Nothing else to do when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n leftCalendarDate.value.startOf(\"month\"),\n rightCalendarDate.value.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value[0]) || viewInterval.contains(value[1])\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n selectionRange.value = null\n calendarSteps.value = 0\n leftCalendarDate.value = isSmallUp.value ? getLeftCalendarDate(value[0], context.max) : value[0]\n forceRenderIncrement.value += 1\n }\n },\n )\n\n // Detect height changes when new calendars are rendered\n const measureHeight = () => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.value\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll<HTMLElement>(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting]\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }\n onMounted(measureHeight)\n watch(leftCalendarDate, measureHeight, { flush: \"post\" })\n\n // Focus a pending day once its month has rendered. TransitionGroup marks\n // the leaving calendar after this render, so wait a frame like the height does\n watch(\n leftCalendarDate,\n (_date, _previous, onCleanup) => {\n if (!pendingFocus) {\n return\n }\n\n onCleanup(\n waitForAnimationFrame(() => {\n const target = pendingFocus\n pendingFocus = null\n if (target) {\n focusDay(target)\n }\n }),\n )\n },\n { flush: \"post\" },\n )\n\n const setContainer = (el: unknown) => {\n calendarContainerRef.value = (el as HTMLDivElement | null) ?? null\n }\n\n return () => {\n const { value, min, max, maxRangeDays } = context\n const left = leftCalendarDate.value\n const right = rightCalendarDate.value\n const selection = selectionRange.value\n const selectedDisplayValue = selection || value\n const viewProps = {\n selectedDates: selectedDisplayValue,\n min,\n max,\n selectionStart: selection?.[0],\n maxRangeDays,\n isSelecting: !!selection,\n onDateSelect: handleDateSelect,\n onDateMouseEnter: handleDateMouseEnter,\n onDayKeyDown: handleDayKeyDown,\n }\n\n return h(\"div\", { key: `stable-view-${forceRenderIncrement.value}`, class: s.CalendarWrapper }, [\n h(\"div\", { ref: setContainer, class: s.CalendarContainer, onMouseleave: handleCalendarMouseLeave }, [\n h(\"div\", { class: s.Previous }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handlePrevious,\n \"disabled\": !canGoBack(),\n \"aria-label\": \"Previous month\",\n },\n { default: () => [h(ChevronLeft)] },\n ),\n ]),\n h(\"div\", { class: s.Next }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handleNext,\n \"disabled\": !canGoForward(),\n \"aria-label\": \"Next month\",\n },\n { default: () => [h(ChevronRight)] },\n ),\n ]),\n h(\n \"div\",\n {\n class: s.CalendarRange,\n style: { transform: `translate(${calendarSteps.value * -1 * STEP_DISTANCE_PX}px, 0)` },\n },\n [\n h(\n TransitionGroup,\n { enterDuration: 400, exitDuration: 400 },\n {\n default: () => [\n h(CalendarView, {\n key: left.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value,\n date: left,\n ...viewProps,\n }),\n isSmallUp.value\n ? h(CalendarView, {\n key: right.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value + 1,\n date: right,\n ...viewProps,\n })\n : createCommentVNode(),\n ],\n },\n ),\n ],\n ),\n ]),\n ])\n }\n },\n})\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = defineComponent({\n name: \"DateRangeCalendarView\",\n props: {\n // Can be any day within the given month that the calendar should render for\n date: { type: Object as PropType<DateTime>, required: true },\n selectedDates: { type: Array as unknown as PropType<DateRange | null>, default: undefined },\n onDateSelect: Function as PropType<(dt: DateTime) => void>,\n onDateMouseEnter: Function as PropType<(dt: DateTime) => void>,\n onDayKeyDown: Function as PropType<(event: KeyboardEvent, dt: DateTime) => void>,\n min: Object as PropType<DateTime>,\n max: Object as PropType<DateTime>,\n selectionStart: { type: Object as PropType<DateTime | null>, default: undefined },\n maxRangeDays: Number,\n isSelecting: Boolean,\n stepPosition: { type: Number, required: true },\n },\n setup(props) {\n // Lock position on mount and don't respond to changes\n const position = props.stepPosition\n const view = computed(() => {\n const { date, min, max } = props\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = monthStart.weekday % 7\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n // Cells are start-of-day values and Interval excludes its end, so widen the\n // bounds to whole days: min/max days themselves stay selectable.\n const enabledDateInterval = Interval.fromDateTimes(\n (min || monthStart).startOf(\"day\"),\n (max || endOfMonth).endOf(\"day\"),\n )\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7) as Array<Array<DateTime | null>>,\n enabledInterval: enabledDateInterval,\n }\n })\n\n const selectedInterval = computed<Interval | null>(() => {\n const [selectedStart, selectedEnd] = props.selectedDates || []\n if (!selectedStart || !selectedEnd) {\n return null\n }\n\n return Interval.fromDateTimes(selectedStart.startOf(\"day\"), selectedEnd.endOf(\"day\"))\n })\n\n return () => {\n const { startOfMonth, weeks, enabledInterval } = view.value\n const { selectionStart, maxRangeDays, isSelecting } = props\n const [selectedStart, selectedEnd] = props.selectedDates || []\n const rangeEndLimit =\n selectionStart && maxRangeDays != null ? selectionStart.plus({ days: maxRangeDays - 1 }) : undefined\n\n return h(\"div\", { \"class\": s.Calendar, \"style\": { left: `${position * STEP_DISTANCE_PX}px` }, \"data-calendar\": true }, [\n h(\"p\", { class: s.MonthLabel }, [startOfMonth.monthLong, \" \", String(startOfMonth.year)]),\n h(\n \"div\",\n { class: s.Week },\n daysOfTheWeekLabels.map((day) => h(\"div\", { key: day, class: s.DayLabel }, day)),\n ),\n ...weeks.map((week, weekIndex) =>\n h(\n \"div\",\n { class: s.Week, key: weekIndex },\n week.map((d, dayIndex) => {\n if (!d) {\n return h(\"div\", { class: s.Day, key: `${weekIndex}-${dayIndex}` })\n }\n\n // Check if 'day' is within selected range\n const enabled = enabledInterval.contains(d) && !(isSelecting && rangeEndLimit && isAfter(d, rangeEndLimit))\n const isStart = enabled && selectedStart && isSameDay(d, selectedStart)\n const isEnd = enabled && selectedEnd && isSameDay(d, selectedEnd)\n const hasRange = selectedStart && selectedEnd && !isSameDay(selectedStart, selectedEnd)\n const isInRange = hasRange && selectedInterval.value?.contains(d)\n const dayIsToday = isToday(d)\n const isFirstRangeTrail =\n d.day === 1 &&\n // Trail doesn't make sense to display at the start of the week (Monday)\n d.weekday !== 7 &&\n isInRange &&\n !isStart\n const isLastRangeTrail =\n d.day === d.daysInMonth &&\n // Trail doesn't make sense to display at the end of the week (Saturday)\n d.weekday !== 6 &&\n isInRange &&\n !isEnd\n\n return h(\n \"div\",\n {\n \"class\": s.Day,\n \"key\": dayIndex,\n \"data-is-start\": isStart ? \"\" : undefined,\n \"data-is-end\": isEnd ? \"\" : undefined,\n \"data-is-in-range\": isInRange ? \"\" : undefined,\n \"data-is-first-range-trail\": isFirstRangeTrail ? \"\" : undefined,\n \"data-is-last-range-trail\": isLastRangeTrail ? \"\" : undefined,\n },\n [\n // The full date names the day, which \"15\" alone does not across months\n h(\n \"button\",\n {\n \"class\": s.InteractiveDay,\n \"disabled\": !enabled,\n \"aria-label\": d.toLocaleString(DateTime.DATE_HUGE),\n \"aria-pressed\": isStart || isEnd || isInRange ? \"true\" : \"false\",\n \"aria-current\": dayIsToday ? \"date\" : undefined,\n \"onClick\": () => d && props.onDateSelect?.(d),\n \"onMouseenter\": () => d && props.onDateMouseEnter?.(d),\n \"onKeydown\": (event: KeyboardEvent) => d && props.onDayKeyDown?.(event, d),\n },\n [String(d.day), dayIsToday ? h(\"span\", { class: s.TodayDot }) : null],\n ),\n ],\n )\n }),\n ),\n ),\n ])\n }\n },\n})\n\nexport const DateRangeShortcuts = defineComponent({\n name: \"DateRangeShortcuts\",\n props: {\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n },\n setup(props) {\n const isMediumUp = useBreakpoint(\"md\")\n const context = useDateRangeContext()\n\n return () => {\n const { shortcuts } = props\n if (!isMediumUp.value || !shortcuts?.length) {\n return null\n }\n\n const { value, min, max, maxRangeDays, onChange } = context\n\n return h(\n \"div\",\n { class: s.Shortcuts },\n shortcuts.map((shortcut) => {\n const { label, getDateRange } = shortcut\n const range = getDateRange()\n const [start, end] = range\n const isActive = !!value && isSameDay(value[0], start) && isSameDay(value[1], end)\n\n return h(\n Button,\n {\n key: label,\n class: \"mb-1\",\n variant: \"ghost\",\n color: \"primary\",\n pill: false,\n size: \"md\",\n iconSize: \"sm\",\n block: true,\n selected: isActive,\n disabled: !isRangeWithinLimits(range, min, max, maxRangeDays),\n onClick: () => onChange(range, shortcut),\n },\n { default: () => [h(\"span\", { class: s.ButtonText }, label), isActive ? h(Check) : null] },\n )\n }),\n )\n }\n },\n})\n\n// A shortcut follows the calendar's limits: whole days from min to max, and\n// no more than maxRangeDays days\nconst isRangeWithinLimits = ([start, end]: DateRange, min?: DateTime, max?: DateTime, maxRangeDays?: number) =>\n !(min && isBefore(start, min.startOf(\"day\"))) &&\n !(max && isAfter(end, max.endOf(\"day\"))) &&\n !(maxRangeDays != null && isAfter(end.startOf(\"day\"), start.startOf(\"day\").plus({ days: maxRangeDays - 1 })))\n\nconst getLeftCalendarDate = (targetDate: DateTime, maxDate?: DateTime) => {\n if (!maxDate) {\n return targetDate\n }\n\n return isBefore(targetDate.endOf(\"month\"), maxDate) ? targetDate : targetDate.minus({ months: 1 })\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Calendar.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/Calendar.ts"],"names":[],"mappings":"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","sourcesContent":["import { DateTime, Interval } from \"luxon\"\nimport { computed, createCommentVNode, defineComponent, h, onMounted, ref, shallowRef, watch, type PropType } from \"vue\"\nimport { useBreakpoint } from \"../../composables/useBreakpoints.js\"\nimport { chunkIntoWeeks, getDaysOfMonth, isAfter, isBefore, isSameDay, isToday, weekPosition } from \"../../lib/dateUtils.js\"\nimport { waitForAnimationFrame } from \"../../lib/helpers.js\"\nimport { Button } from \"../Button/index.js\"\nimport { Check, ChevronLeft, ChevronRight } from \"../Icon/index.js\"\nimport { TransitionGroup } from \"../Transition/index.js\"\nimport s from \"@plexui/styles/components/DateRangePicker/Calendar.module.css\"\nimport { useDateRangeContext } from \"./context.js\"\nimport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/Calendar.tsx.\n// - React's `[value]` effect is a watcher on the context value; the height\n// effect runs on mount and when the left month changes, after render.\n// - The `stable-view-N` key on the wrapper remounts the calendar view, as in\n// React, when the value jumps out of view.\n// - React's pending-focus effect is a post watcher on the left month; its\n// cleanup cancels the frame, as the effect's does.\n// - Below the `sm` breakpoint the right calendar is a placeholder, as React's\n// `{isSmallUp && ...}`: TransitionGroup still renders its (empty) wrapper\n// when animations are off.\n// - React quirk kept: the day buttons have no `type`.\n\n// The day a grid key moves to: a day, a week, the first or last day of the\n// week row, or a month (Luxon clamps Jan 31 to Feb 28/29)\nconst getKeyTarget = (key: string, day: DateTime, weekStartsOn: number): DateTime | null => {\n switch (key) {\n case \"ArrowLeft\":\n return day.minus({ days: 1 })\n case \"ArrowRight\":\n return day.plus({ days: 1 })\n case \"ArrowUp\":\n return day.minus({ days: 7 })\n case \"ArrowDown\":\n return day.plus({ days: 7 })\n case \"Home\":\n return day.minus({ days: weekPosition(day, weekStartsOn) })\n case \"End\":\n return day.plus({ days: 6 - weekPosition(day, weekStartsOn) })\n case \"PageUp\":\n return day.minus({ months: 1 })\n case \"PageDown\":\n return day.plus({ months: 1 })\n default:\n return null\n }\n}\n\nconst monthIndex = (date: DateTime) => date.year * 12 + date.month\n\nexport const DateRangeCalendar = defineComponent({\n name: \"DateRangeCalendar\",\n setup() {\n const context = useDateRangeContext()\n const isSmallUp = useBreakpoint(\"sm\")\n const calendarContainerRef = shallowRef<HTMLDivElement | null>(null)\n // The day to focus once a key has moved the view to its month\n let pendingFocus: DateTime | null = null\n const selectionRange = shallowRef<DateRange | null>(null)\n const calendarSteps = ref(0)\n const forceRenderIncrement = ref(0)\n const leftCalendarDate = shallowRef<DateTime>(\n isSmallUp.value\n ? getLeftCalendarDate(context.value?.[0] ?? DateTime.now(), context.max)\n : (context.value?.[0] ?? DateTime.now()),\n )\n\n const rightCalendarDate = computed(() =>\n isSmallUp.value\n ? leftCalendarDate.value.plus({ months: 1 }).startOf(\"month\")\n : leftCalendarDate.value.startOf(\"month\"),\n )\n\n const canGoBack = () => !context.min || isBefore(context.min, leftCalendarDate.value.startOf(\"month\"))\n const canGoForward = () => !context.max || isBefore(rightCalendarDate.value.endOf(\"month\"), context.max)\n\n const handleNext = () => {\n calendarSteps.value += 1\n leftCalendarDate.value = leftCalendarDate.value.plus({ months: 1 })\n }\n\n const handlePrevious = () => {\n calendarSteps.value -= 1\n leftCalendarDate.value = leftCalendarDate.value.minus({ months: 1 })\n }\n\n const handleDateSelect = (selectedDate: DateTime) => {\n if (!selectionRange.value) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n const [currentSelectionStartDate] = selectionRange.value\n\n // Selecting a date before the current selected start date moves the start date\n // but does not resolve the selection\n if (isBefore(selectedDate, currentSelectionStartDate)) {\n selectionRange.value = [selectedDate, selectedDate]\n return\n }\n\n // Resolve the selection by emitting the value and clearing selection\n context.onChange([currentSelectionStartDate, selectedDate])\n selectionRange.value = null\n }\n\n const handleDateMouseEnter = (hoveredDate: DateTime) => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n const [currentStartDate] = currentSelectionRange\n\n // When hovering a date before the current date, don't change the selection range\n if (isBefore(hoveredDate, currentStartDate)) {\n selectionRange.value = [currentStartDate, currentStartDate]\n return\n }\n\n selectionRange.value = [currentStartDate, hoveredDate]\n }\n\n const handleCalendarMouseLeave = () => {\n // If we're not actively selecting, no-op\n const currentSelectionRange = selectionRange.value\n if (!currentSelectionRange) {\n return\n }\n\n // Reset the end selection\n const [currentStartDate] = currentSelectionRange\n selectionRange.value = [currentStartDate, currentStartDate]\n }\n\n // Days are named by their full date; skip calendars that are leaving\n const focusDay = (day: DateTime) => {\n const label = day.toLocaleString(DateTime.DATE_HUGE)\n const buttons = calendarContainerRef.value?.querySelectorAll<HTMLButtonElement>(`button[aria-label=\"${label}\"]`)\n Array.from(buttons ?? [])\n .find((button) => !button.closest(\"[data-exiting]\"))\n ?.focus()\n }\n\n const handleDayKeyDown = (event: KeyboardEvent, day: DateTime) => {\n if (event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n\n // While a move waits for its month to render, the next key starts from\n // the day it is moving to (key repeat), not the day that still has focus\n const target = getKeyTarget(event.key, pendingFocus ?? day, context.weekStartsOn)\n if (!target) {\n return\n }\n\n event.preventDefault()\n\n // A disabled day (outside min/max, or past maxRangeDays while selecting)\n // keeps focus where it is\n const { min, max, maxRangeDays } = context\n const selection = selectionRange.value\n const rangeEndLimit =\n selection && maxRangeDays != null ? selection[0].plus({ days: maxRangeDays - 1 }) : undefined\n if (\n (min && isBefore(target, min.startOf(\"day\"))) ||\n (max && isAfter(target, max.endOf(\"day\"))) ||\n (rangeEndLimit && isAfter(target, rangeEndLimit))\n ) {\n return\n }\n\n const monthsBefore = monthIndex(leftCalendarDate.value) - monthIndex(target)\n const monthsAfter = monthIndex(target) - monthIndex(rightCalendarDate.value)\n if (monthsBefore <= 0 && monthsAfter <= 0) {\n pendingFocus = null\n focusDay(target)\n return\n }\n\n // Step the view like the month buttons; a day within min/max keeps every step in bounds\n if (monthsAfter > 0 ? !canGoForward() : !canGoBack()) {\n return\n }\n\n pendingFocus = target\n for (let step = 0; step < Math.max(monthsBefore, monthsAfter); step++) {\n if (monthsAfter > 0) {\n handleNext()\n } else {\n handlePrevious()\n }\n }\n }\n\n // Force re-renders when `value` changes out of brand from direct user-selection\n watch(\n () => context.value,\n (value) => {\n // When a new value is received, it could be out of band from the control of this calendar.\n // For example, a shortcut could be selected, or clear could be pressed. In either case, selection\n // should be reset so that the new `value` can be displayed fully.\n selectionRange.value = null\n\n // Nothing else to do when value is empty\n if (!value) {\n return\n }\n\n // Check if `value` is still within view of our calendar\n const viewInterval = Interval.fromDateTimes(\n leftCalendarDate.value.startOf(\"month\"),\n rightCalendarDate.value.endOf(\"month\"),\n )\n const isValueInRangeOfCalendar = viewInterval.contains(value[0]) || viewInterval.contains(value[1])\n if (!isValueInRangeOfCalendar) {\n // Reset state the calendar view entirely\n selectionRange.value = null\n calendarSteps.value = 0\n leftCalendarDate.value = isSmallUp.value ? getLeftCalendarDate(value[0], context.max) : value[0]\n forceRenderIncrement.value += 1\n }\n },\n )\n\n // Detect height changes when new calendars are rendered\n const measureHeight = () => {\n waitForAnimationFrame(() => {\n const container = calendarContainerRef.value\n\n if (!container) {\n return\n }\n\n let maxHeight = -Infinity\n\n // Find the tallest calendar\n container.querySelectorAll<HTMLElement>(\"[data-calendar]\")?.forEach((element) => {\n // NOTE: clientHeight does not respect the scale() that popover uses to animate in, which is what we want\n // We want to know the full height of the element, without any transform applied.\n const height = element.clientHeight\n\n // Ignore calendars that are exiting\n if (element.closest(\"[data-exiting]\")) {\n return\n }\n\n if (height > maxHeight) {\n maxHeight = height\n }\n })\n\n container.style.height = `${maxHeight}px`\n\n // Don't animate the initial height.\n // This is relevant when the calendar opens to a larger size than the default.\n if (!container.style.transition) {\n waitForAnimationFrame(() => {\n container.style.transition = `height 0.25s var(--cubic-move)`\n })\n }\n })\n }\n onMounted(measureHeight)\n watch(leftCalendarDate, measureHeight, { flush: \"post\" })\n\n // Focus a pending day once its month has rendered. TransitionGroup marks\n // the leaving calendar after this render, so wait a frame like the height does\n watch(\n leftCalendarDate,\n (_date, _previous, onCleanup) => {\n if (!pendingFocus) {\n return\n }\n\n onCleanup(\n waitForAnimationFrame(() => {\n const target = pendingFocus\n pendingFocus = null\n if (target) {\n focusDay(target)\n }\n }),\n )\n },\n { flush: \"post\" },\n )\n\n const setContainer = (el: unknown) => {\n calendarContainerRef.value = (el as HTMLDivElement | null) ?? null\n }\n\n return () => {\n const { value, min, max, maxRangeDays } = context\n const left = leftCalendarDate.value\n const right = rightCalendarDate.value\n const selection = selectionRange.value\n const selectedDisplayValue = selection || value\n const viewProps = {\n selectedDates: selectedDisplayValue,\n min,\n max,\n selectionStart: selection?.[0],\n maxRangeDays,\n isSelecting: !!selection,\n onDateSelect: handleDateSelect,\n onDateMouseEnter: handleDateMouseEnter,\n onDayKeyDown: handleDayKeyDown,\n }\n\n return h(\"div\", { key: `stable-view-${forceRenderIncrement.value}`, class: s.CalendarWrapper }, [\n h(\"div\", { ref: setContainer, class: s.CalendarContainer, onMouseleave: handleCalendarMouseLeave }, [\n h(\"div\", { class: s.Previous }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handlePrevious,\n \"disabled\": !canGoBack(),\n \"aria-label\": \"Previous month\",\n },\n { default: () => [h(ChevronLeft)] },\n ),\n ]),\n h(\"div\", { class: s.Next }, [\n h(\n Button,\n {\n \"variant\": \"ghost\",\n \"color\": \"secondary\",\n \"size\": \"sm\",\n \"pill\": false,\n \"gutterSize\": \"2xs\",\n \"iconSize\": \"sm\",\n \"onClick\": handleNext,\n \"disabled\": !canGoForward(),\n \"aria-label\": \"Next month\",\n },\n { default: () => [h(ChevronRight)] },\n ),\n ]),\n h(\n \"div\",\n {\n class: s.CalendarRange,\n style: { transform: `translate(calc(${calendarSteps.value * -1} * var(--calendar-step)), 0)` },\n },\n [\n h(\n TransitionGroup,\n { enterDuration: 400, exitDuration: 400 },\n {\n default: () => [\n h(CalendarView, {\n key: left.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value,\n date: left,\n ...viewProps,\n }),\n isSmallUp.value\n ? h(CalendarView, {\n key: right.toLocaleString({ month: \"long\", year: \"numeric\" }),\n stepPosition: calendarSteps.value + 1,\n date: right,\n ...viewProps,\n })\n : createCommentVNode(),\n ],\n },\n ),\n ],\n ),\n ]),\n ])\n }\n },\n})\n\nconst daysOfTheWeekLabels = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"]\n\nconst CalendarView = defineComponent({\n name: \"DateRangeCalendarView\",\n props: {\n // Can be any day within the given month that the calendar should render for\n date: { type: Object as PropType<DateTime>, required: true },\n selectedDates: { type: Array as unknown as PropType<DateRange | null>, default: undefined },\n onDateSelect: Function as PropType<(dt: DateTime) => void>,\n onDateMouseEnter: Function as PropType<(dt: DateTime) => void>,\n onDayKeyDown: Function as PropType<(event: KeyboardEvent, dt: DateTime) => void>,\n min: Object as PropType<DateTime>,\n max: Object as PropType<DateTime>,\n selectionStart: { type: Object as PropType<DateTime | null>, default: undefined },\n maxRangeDays: Number,\n isSelecting: Boolean,\n stepPosition: { type: Number, required: true },\n },\n setup(props) {\n const context = useDateRangeContext()\n // Lock position on mount and don't respond to changes\n const position = props.stepPosition\n const view = computed(() => {\n const { date, min, max } = props\n const { weekStartsOn } = context\n const monthStart = date.startOf(\"month\")\n const endOfMonth = date.endOf(\"month\")\n\n const daysBeforeMonthStart = weekPosition(monthStart, weekStartsOn)\n const blankDays = new Array(daysBeforeMonthStart).fill(null)\n const daysInMonth = getDaysOfMonth(monthStart)\n const calendarCells = [...blankDays, ...daysInMonth]\n\n // Cells are start-of-day values and Interval excludes its end, so widen the\n // bounds to whole days: min/max days themselves stay selectable.\n const enabledDateInterval = Interval.fromDateTimes(\n (min || monthStart).startOf(\"day\"),\n (max || endOfMonth).endOf(\"day\"),\n )\n\n return {\n startOfMonth: monthStart,\n endOfMonth,\n weeks: chunkIntoWeeks(calendarCells, 7) as Array<Array<DateTime | null>>,\n enabledInterval: enabledDateInterval,\n }\n })\n\n const selectedInterval = computed<Interval | null>(() => {\n const [selectedStart, selectedEnd] = props.selectedDates || []\n if (!selectedStart || !selectedEnd) {\n return null\n }\n\n return Interval.fromDateTimes(selectedStart.startOf(\"day\"), selectedEnd.endOf(\"day\"))\n })\n\n return () => {\n const { startOfMonth, weeks, enabledInterval } = view.value\n const { selectionStart, maxRangeDays, isSelecting } = props\n const [selectedStart, selectedEnd] = props.selectedDates || []\n const rangeEndLimit =\n selectionStart && maxRangeDays != null ? selectionStart.plus({ days: maxRangeDays - 1 }) : undefined\n\n const { weekStartsOn } = context\n const dayLabels = [...daysOfTheWeekLabels.slice(weekStartsOn), ...daysOfTheWeekLabels.slice(0, weekStartsOn)]\n return h(\"div\", { \"class\": s.Calendar, \"style\": { left: `calc(${position} * var(--calendar-step))` }, \"data-calendar\": true }, [\n h(\"p\", { class: s.MonthLabel }, [startOfMonth.monthLong, \" \", String(startOfMonth.year)]),\n h(\n \"div\",\n { class: s.Week },\n dayLabels.map((day) => h(\"div\", { key: day, class: s.DayLabel }, day)),\n ),\n ...weeks.map((week, weekIndex) =>\n h(\n \"div\",\n { class: s.Week, key: weekIndex },\n week.map((d, dayIndex) => {\n if (!d) {\n return h(\"div\", { class: s.Day, key: `${weekIndex}-${dayIndex}` })\n }\n\n // Check if 'day' is within selected range\n const enabled = enabledInterval.contains(d) && !(isSelecting && rangeEndLimit && isAfter(d, rangeEndLimit))\n const isStart = enabled && selectedStart && isSameDay(d, selectedStart)\n const isEnd = enabled && selectedEnd && isSameDay(d, selectedEnd)\n const hasRange = selectedStart && selectedEnd && !isSameDay(selectedStart, selectedEnd)\n const isInRange = hasRange && selectedInterval.value?.contains(d)\n const dayIsToday = isToday(d)\n const isFirstRangeTrail =\n d.day === 1 &&\n // Trail doesn't make sense to display at the start of the week\n weekPosition(d, weekStartsOn) !== 0 &&\n isInRange &&\n !isStart\n const isLastRangeTrail =\n d.day === d.daysInMonth &&\n // Trail doesn't make sense to display at the end of the week\n weekPosition(d, weekStartsOn) !== 6 &&\n isInRange &&\n !isEnd\n\n return h(\n \"div\",\n {\n \"class\": s.Day,\n \"key\": dayIndex,\n \"data-is-start\": isStart ? \"\" : undefined,\n \"data-is-end\": isEnd ? \"\" : undefined,\n \"data-is-in-range\": isInRange ? \"\" : undefined,\n \"data-is-first-range-trail\": isFirstRangeTrail ? \"\" : undefined,\n \"data-is-last-range-trail\": isLastRangeTrail ? \"\" : undefined,\n },\n [\n // The full date names the day, which \"15\" alone does not across months\n h(\n \"button\",\n {\n \"class\": s.InteractiveDay,\n \"disabled\": !enabled,\n \"aria-label\": d.toLocaleString(DateTime.DATE_HUGE),\n \"aria-pressed\": isStart || isEnd || isInRange ? \"true\" : \"false\",\n \"aria-current\": dayIsToday ? \"date\" : undefined,\n \"onClick\": () => d && props.onDateSelect?.(d),\n \"onMouseenter\": () => d && props.onDateMouseEnter?.(d),\n \"onKeydown\": (event: KeyboardEvent) => d && props.onDayKeyDown?.(event, d),\n },\n [String(d.day), dayIsToday ? h(\"span\", { class: s.TodayDot }) : null],\n ),\n ],\n )\n }),\n ),\n ),\n ])\n }\n },\n})\n\nexport const DateRangeShortcuts = defineComponent({\n name: \"DateRangeShortcuts\",\n props: {\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n },\n setup(props) {\n const isMediumUp = useBreakpoint(\"md\")\n const context = useDateRangeContext()\n\n return () => {\n const { shortcuts } = props\n if (!isMediumUp.value || !shortcuts?.length) {\n return null\n }\n\n const { value, min, max, maxRangeDays, onChange } = context\n\n return h(\n \"div\",\n { class: s.Shortcuts },\n shortcuts.map((shortcut) => {\n const { label, getDateRange } = shortcut\n const range = getDateRange()\n const [start, end] = range\n const isActive = !!value && isSameDay(value[0], start) && isSameDay(value[1], end)\n\n return h(\n Button,\n {\n key: label,\n class: \"mb-1\",\n variant: \"ghost\",\n color: \"primary\",\n pill: false,\n size: \"md\",\n iconSize: \"sm\",\n block: true,\n selected: isActive,\n disabled: !isRangeWithinLimits(range, min, max, maxRangeDays),\n onClick: () => onChange(range, shortcut),\n },\n { default: () => [h(\"span\", { class: s.ButtonText }, label), isActive ? h(Check) : null] },\n )\n }),\n )\n }\n },\n})\n\n// A shortcut follows the calendar's limits: whole days from min to max, and\n// no more than maxRangeDays days\nconst isRangeWithinLimits = ([start, end]: DateRange, min?: DateTime, max?: DateTime, maxRangeDays?: number) =>\n !(min && isBefore(start, min.startOf(\"day\"))) &&\n !(max && isAfter(end, max.endOf(\"day\"))) &&\n !(maxRangeDays != null && isAfter(end.startOf(\"day\"), start.startOf(\"day\").plus({ days: maxRangeDays - 1 })))\n\nconst getLeftCalendarDate = (targetDate: DateTime, maxDate?: DateTime) => {\n if (!maxDate) {\n return targetDate\n }\n\n return isBefore(targetDate.endOf(\"month\"), maxDate) ? targetDate : targetDate.minus({ months: 1 })\n}\n"]}
|
|
@@ -24,6 +24,8 @@ const DateRangePickerComponent = defineComponent({
|
|
|
24
24
|
max: Object,
|
|
25
25
|
/** Maximum length of the selectable range in days (inclusive). */
|
|
26
26
|
maxRangeDays: Number,
|
|
27
|
+
/** The day each week starts on, from 0 (Sunday) to 6 (Saturday). @default 0 */
|
|
28
|
+
weekStartsOn: { type: Number, default: 0 },
|
|
27
29
|
/** Date range shortcuts for quick selection, shown to the left of the calendar. */
|
|
28
30
|
shortcuts: Array,
|
|
29
31
|
/** The preferred side of the trigger to render against when open. @default "bottom" */
|
|
@@ -87,6 +89,9 @@ const DateRangePickerComponent = defineComponent({
|
|
|
87
89
|
get maxRangeDays() {
|
|
88
90
|
return props.maxRangeDays;
|
|
89
91
|
},
|
|
92
|
+
get weekStartsOn() {
|
|
93
|
+
return props.weekStartsOn;
|
|
94
|
+
},
|
|
90
95
|
get triggerStepperUnit() {
|
|
91
96
|
return props.triggerStepperUnit;
|
|
92
97
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateRangePicker.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/DateRangePicker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { computed, defineComponent, h, provide, toRaw, type PropType } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport { isAfter } from \"../../lib/dateUtils.js\"\nimport { Popover, PopoverContent, PopoverTrigger, type PopoverAlign, type PopoverSide } from \"../Popover/index.js\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport { DateRangeCalendar, DateRangeShortcuts } from \"./Calendar.js\"\nimport { DateRangeContextKey, type DateRangeContextValue } from \"./context.js\"\nimport { DateRangeTrigger } from \"./Trigger.js\"\nimport { type DateRange, type DateRangeShortcut } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/DateRangePicker.tsx.\n// - `value` + `update:value` (`v-model:value`), plus `change`, which also\n// carries the selected shortcut like React's `onChange(range, shortcut)`.\n// Like React the picker is controlled: a parent that does not update\n// `value` keeps the shown range.\n// - DateTime values are read unwrapped (`toRaw`), so a `ref()` holding a\n// range (a deep reactive proxy) works like a plain value.\n\nconst DateRangePickerComponent = defineComponent({\n name: \"DateRangePicker\",\n inheritAttrs: false,\n props: {\n /** The selected date range value (`v-model:value`). */\n value: { type: Array as unknown as PropType<DateRange | null>, default: null },\n /** Defines the earliest selectable date (inclusive). */\n min: Object as PropType<DateTime>,\n /** Defines the latest selectable date (inclusive). */\n max: Object as PropType<DateTime>,\n /** Maximum length of the selectable range in days (inclusive). */\n maxRangeDays: Number,\n /** Date range shortcuts for quick selection, shown to the left of the calendar. */\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n /** The preferred side of the trigger to render against when open. @default \"bottom\" */\n side: { type: String as PropType<PopoverSide>, default: \"bottom\" },\n /** The distance in pixels from the trigger. @default 8 */\n sideOffset: { type: Number, default: 8 },\n /** The preferred alignment against the trigger. @default \"center\" */\n align: { type: String as PropType<PopoverAlign>, default: \"center\" },\n /** An offset in pixels from the \"start\" or \"end\" alignment options. @default 0 */\n alignOffset: Number,\n /** Disables the select visually and from interactions. @default false */\n disabled: { type: Boolean, default: false },\n /** Placeholder text for the select. @default \"Select date range...\" */\n placeholder: { type: String, default: \"Select date range...\" },\n /** Style variant for the select trigger. @default \"outline\" */\n variant: { type: String as PropType<\"soft\" | \"outline\" | \"ghost\">, default: \"outline\" },\n /** Determines if the select trigger should be a fully rounded pill shape. @default true */\n pill: { type: Boolean, default: true },\n /** Size of the control: `3xs` 22px up to `3xl` 48px. @default \"md\" */\n size: { type: String as PropType<ControlSize>, default: \"md\" },\n /** Icon displayed in the far right of the select trigger. @default \"dropdown\" */\n dropdownIconType: String as PropType<DropdownIconType>,\n /** Custom class applied to the select trigger */\n triggerClassName: String,\n /** Display calendar icon at the start of the trigger. @default true */\n triggerShowIcon: { type: Boolean, default: true },\n /** Shows a stepper in the trigger when the selected range matches the unit ('month'). */\n triggerStepperUnit: String as PropType<\"month\">,\n /** Format of dates displayed in the trigger. @default \"MM/dd/yy\" */\n triggerDateFormat: { type: String, default: \"MM/dd/yy\" },\n /** Display a clear action that allows the select to be unset. @default false */\n clearable: { type: Boolean, default: false },\n /** Extends select to 100% of available width. @default false */\n block: { type: Boolean, default: false },\n },\n emits: {\n \"update:value\": (_nextValue: DateRange | null) => true,\n \"change\": (_nextValue: DateRange | null, _shortcut?: DateRangeShortcut) => true,\n },\n setup(props, { emit }) {\n const unwrap = <T>(value: T): T => (value ? toRaw(value) : value)\n\n // A new range only when `value` or one of its endpoints changes, as the\n // identity React's effects see. The endpoints are read through the array\n // so that `range.value[0] = date` on a `ref()` range is tracked.\n const value = computed<DateRange | null>(() => {\n const range = props.value\n if (!range) return null\n return [toRaw(range[0]), toRaw(range[1])]\n })\n\n const store: DateRangeContextValue = {\n get value() {\n return value.value\n },\n get min() {\n return unwrap(props.min)\n },\n get max() {\n return unwrap(props.max)\n },\n get maxRangeDays() {\n return props.maxRangeDays\n },\n get triggerStepperUnit() {\n return props.triggerStepperUnit\n },\n get triggerClassName() {\n return props.triggerClassName\n },\n get triggerShowIcon() {\n return props.triggerShowIcon\n },\n get triggerDateFormat() {\n return props.triggerDateFormat\n },\n get disabled() {\n return props.disabled\n },\n get variant() {\n return props.variant\n },\n get pill() {\n return props.pill\n },\n get block() {\n return props.block\n },\n get size() {\n return props.size\n },\n get dropdownIconType() {\n return props.dropdownIconType\n },\n get clearable() {\n return props.clearable\n },\n get placeholder() {\n return props.placeholder\n },\n get shortcuts() {\n return props.shortcuts\n },\n onChange: (nextValue, shortcut) => {\n emit(\"update:value\", nextValue)\n emit(\"change\", nextValue, shortcut)\n },\n }\n provide(DateRangeContextKey, store)\n\n return () => {\n const { min, max } = store\n const { align } = props\n\n // min and max are inclusive, so equal bounds allow one date\n if (min && max && isAfter(min, max)) {\n throw new Error(\"DateRangePicker error: `min` date must not be after the `max` date\")\n }\n\n return h(Popover, null, {\n default: () => [\n h(PopoverTrigger, null, { default: () => [h(DateRangeTrigger)] }),\n h(\n PopoverContent,\n {\n minWidth: 230,\n side: props.side,\n sideOffset: props.sideOffset,\n align,\n alignOffset: props.alignOffset ?? (align === \"center\" ? 0 : -5),\n },\n {\n default: () => [\n h(\"div\", { class: \"flex\" }, [h(DateRangeShortcuts, { shortcuts: props.shortcuts }), h(DateRangeCalendar)]),\n ],\n },\n ),\n ],\n })\n }\n },\n})\n\nexport type DateRangePickerProps = InstanceType<typeof DateRangePickerComponent>[\"$props\"]\n\n/**\n * A date range picker: a SelectControl trigger (or a month stepper) opening\n * two calendars and optional shortcuts in a popover. Bind the range\n * (`[start, end]` luxon `DateTime`s) with `v-model:value`.\n */\nexport const DateRangePicker = DateRangePickerComponent\n"]}
|
|
1
|
+
{"version":3,"file":"DateRangePicker.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/DateRangePicker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { computed, defineComponent, h, provide, toRaw, type PropType } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport { isAfter } from \"../../lib/dateUtils.js\"\nimport { Popover, PopoverContent, PopoverTrigger, type PopoverAlign, type PopoverSide } from \"../Popover/index.js\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport { DateRangeCalendar, DateRangeShortcuts } from \"./Calendar.js\"\nimport { DateRangeContextKey, type DateRangeContextValue } from \"./context.js\"\nimport { DateRangeTrigger } from \"./Trigger.js\"\nimport { type DateRange, type DateRangeShortcut, type WeekStart } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/DateRangePicker.tsx.\n// - `value` + `update:value` (`v-model:value`), plus `change`, which also\n// carries the selected shortcut like React's `onChange(range, shortcut)`.\n// Like React the picker is controlled: a parent that does not update\n// `value` keeps the shown range.\n// - DateTime values are read unwrapped (`toRaw`), so a `ref()` holding a\n// range (a deep reactive proxy) works like a plain value.\n\nconst DateRangePickerComponent = defineComponent({\n name: \"DateRangePicker\",\n inheritAttrs: false,\n props: {\n /** The selected date range value (`v-model:value`). */\n value: { type: Array as unknown as PropType<DateRange | null>, default: null },\n /** Defines the earliest selectable date (inclusive). */\n min: Object as PropType<DateTime>,\n /** Defines the latest selectable date (inclusive). */\n max: Object as PropType<DateTime>,\n /** Maximum length of the selectable range in days (inclusive). */\n maxRangeDays: Number,\n /** The day each week starts on, from 0 (Sunday) to 6 (Saturday). @default 0 */\n weekStartsOn: { type: Number as PropType<WeekStart>, default: 0 },\n /** Date range shortcuts for quick selection, shown to the left of the calendar. */\n shortcuts: Array as PropType<DateRangeShortcut[]>,\n /** The preferred side of the trigger to render against when open. @default \"bottom\" */\n side: { type: String as PropType<PopoverSide>, default: \"bottom\" },\n /** The distance in pixels from the trigger. @default 8 */\n sideOffset: { type: Number, default: 8 },\n /** The preferred alignment against the trigger. @default \"center\" */\n align: { type: String as PropType<PopoverAlign>, default: \"center\" },\n /** An offset in pixels from the \"start\" or \"end\" alignment options. @default 0 */\n alignOffset: Number,\n /** Disables the select visually and from interactions. @default false */\n disabled: { type: Boolean, default: false },\n /** Placeholder text for the select. @default \"Select date range...\" */\n placeholder: { type: String, default: \"Select date range...\" },\n /** Style variant for the select trigger. @default \"outline\" */\n variant: { type: String as PropType<\"soft\" | \"outline\" | \"ghost\">, default: \"outline\" },\n /** Determines if the select trigger should be a fully rounded pill shape. @default true */\n pill: { type: Boolean, default: true },\n /** Size of the control: `3xs` 22px up to `3xl` 48px. @default \"md\" */\n size: { type: String as PropType<ControlSize>, default: \"md\" },\n /** Icon displayed in the far right of the select trigger. @default \"dropdown\" */\n dropdownIconType: String as PropType<DropdownIconType>,\n /** Custom class applied to the select trigger */\n triggerClassName: String,\n /** Display calendar icon at the start of the trigger. @default true */\n triggerShowIcon: { type: Boolean, default: true },\n /** Shows a stepper in the trigger when the selected range matches the unit ('month'). */\n triggerStepperUnit: String as PropType<\"month\">,\n /** Format of dates displayed in the trigger. @default \"MM/dd/yy\" */\n triggerDateFormat: { type: String, default: \"MM/dd/yy\" },\n /** Display a clear action that allows the select to be unset. @default false */\n clearable: { type: Boolean, default: false },\n /** Extends select to 100% of available width. @default false */\n block: { type: Boolean, default: false },\n },\n emits: {\n \"update:value\": (_nextValue: DateRange | null) => true,\n \"change\": (_nextValue: DateRange | null, _shortcut?: DateRangeShortcut) => true,\n },\n setup(props, { emit }) {\n const unwrap = <T>(value: T): T => (value ? toRaw(value) : value)\n\n // A new range only when `value` or one of its endpoints changes, as the\n // identity React's effects see. The endpoints are read through the array\n // so that `range.value[0] = date` on a `ref()` range is tracked.\n const value = computed<DateRange | null>(() => {\n const range = props.value\n if (!range) return null\n return [toRaw(range[0]), toRaw(range[1])]\n })\n\n const store: DateRangeContextValue = {\n get value() {\n return value.value\n },\n get min() {\n return unwrap(props.min)\n },\n get max() {\n return unwrap(props.max)\n },\n get maxRangeDays() {\n return props.maxRangeDays\n },\n get weekStartsOn() {\n return props.weekStartsOn\n },\n get triggerStepperUnit() {\n return props.triggerStepperUnit\n },\n get triggerClassName() {\n return props.triggerClassName\n },\n get triggerShowIcon() {\n return props.triggerShowIcon\n },\n get triggerDateFormat() {\n return props.triggerDateFormat\n },\n get disabled() {\n return props.disabled\n },\n get variant() {\n return props.variant\n },\n get pill() {\n return props.pill\n },\n get block() {\n return props.block\n },\n get size() {\n return props.size\n },\n get dropdownIconType() {\n return props.dropdownIconType\n },\n get clearable() {\n return props.clearable\n },\n get placeholder() {\n return props.placeholder\n },\n get shortcuts() {\n return props.shortcuts\n },\n onChange: (nextValue, shortcut) => {\n emit(\"update:value\", nextValue)\n emit(\"change\", nextValue, shortcut)\n },\n }\n provide(DateRangeContextKey, store)\n\n return () => {\n const { min, max } = store\n const { align } = props\n\n // min and max are inclusive, so equal bounds allow one date\n if (min && max && isAfter(min, max)) {\n throw new Error(\"DateRangePicker error: `min` date must not be after the `max` date\")\n }\n\n return h(Popover, null, {\n default: () => [\n h(PopoverTrigger, null, { default: () => [h(DateRangeTrigger)] }),\n h(\n PopoverContent,\n {\n minWidth: 230,\n side: props.side,\n sideOffset: props.sideOffset,\n align,\n alignOffset: props.alignOffset ?? (align === \"center\" ? 0 : -5),\n },\n {\n default: () => [\n h(\"div\", { class: \"flex\" }, [h(DateRangeShortcuts, { shortcuts: props.shortcuts }), h(DateRangeCalendar)]),\n ],\n },\n ),\n ],\n })\n }\n },\n})\n\nexport type DateRangePickerProps = InstanceType<typeof DateRangePickerComponent>[\"$props\"]\n\n/**\n * A date range picker: a SelectControl trigger (or a month stepper) opening\n * two calendars and optional shortcuts in a popover. Bind the range\n * (`[start, end]` luxon `DateTime`s) with `v-model:value`.\n */\nexport const DateRangePicker = DateRangePickerComponent\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,KAAK,CAAA;AAgC/C,MAAM,CAAC,MAAM,mBAAmB,GAAwC,MAAM,CAAC,uBAAuB,CAAC,CAAA;AAEvG,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import type { DateTime } from \"luxon\"\nimport { inject, type InjectionKey } from \"vue\"\nimport type { ControlSize } from \"@plexui/styles/types\"\nimport type { DropdownIconType } from \"../SelectControl/index.js\"\nimport type { DateRange, DateRangeShortcut, WeekStart } from \"./types.js\"\n\n// Vue port of packages/ui/src/components/DateRangePicker/context.tsx. The\n// values are getters over DateRangePicker's props (read them in render,\n// computed or watch to track them); React's `onChangeRef` is a plain\n// function here, as Vue props and emits are always current.\n\nexport type DateRangeContextValue = {\n readonly value: DateRange | null\n readonly min?: DateTime\n readonly max?: DateTime\n readonly maxRangeDays?: number\n readonly weekStartsOn: WeekStart\n readonly triggerStepperUnit?: \"month\"\n readonly triggerClassName?: string\n readonly triggerShowIcon?: boolean\n readonly triggerDateFormat: string\n readonly disabled: boolean\n readonly variant?: \"soft\" | \"outline\" | \"ghost\"\n readonly pill: boolean\n readonly block: boolean\n readonly size?: ControlSize\n readonly dropdownIconType?: DropdownIconType\n readonly clearable: boolean\n readonly placeholder: string\n readonly shortcuts?: DateRangeShortcut[]\n onChange: (nextValue: DateRange | null, shortcut?: DateRangeShortcut) => void\n}\n\nexport const DateRangeContextKey: InjectionKey<DateRangeContextValue> = Symbol(\"PlexUIDateRangePicker\")\n\nexport const useDateRangeContext = () => {\n const context = inject(DateRangeContextKey, null)\n\n if (!context) {\n throw new Error(\"DateRange components must be wrapped in <DateRangePicker />\")\n }\n\n return context\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAA;AAEjF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAA;AAEjF,OAAO,EAA0D,MAAM,YAAY,CAAA","sourcesContent":["export { DateRangePicker, type DateRangePickerProps } from \"./DateRangePicker.js\"\n\nexport { type DateRange, type DateRangeShortcut, type WeekStart } from \"./types.js\"\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,OAAO,CAAA","sourcesContent":["import { type DateTime } from \"luxon\"\n\nexport type DateRange = [DateTime, DateTime]\nexport type DateRangeShortcut = {\n label: string\n getDateRange: () => DateRange\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/components/DateRangePicker/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,OAAO,CAAA","sourcesContent":["import { type DateTime } from \"luxon\"\n\nexport type DateRange = [DateTime, DateTime]\n/** The day a week starts on: 0 is Sunday, 6 is Saturday. */\nexport type WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6\nexport type DateRangeShortcut = {\n label: string\n getDateRange: () => DateRange\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { cloneVNode, computed, createCommentVNode, defineComponent, h, inject, onBeforeUnmount, onMounted, provide, ref, watch, } from "vue";
|
|
2
2
|
import { DialogContent as RekaDialogContent, DialogDescription as RekaDialogDescription, DialogOverlay as RekaDialogOverlay, DialogPortal as RekaDialogPortal, DialogRoot as RekaDialogRoot, DialogTitle as RekaDialogTitle, injectDialogRootContext, useForwardExpose, useId, } from "reka-ui";
|
|
3
3
|
import { useEscCloseStack } from "../../composables/useEscCloseStack.js";
|
|
4
|
-
import { preventDefaultHandler, toCssVariables } from "../../lib/helpers.js";
|
|
4
|
+
import { keepMovedFocus, preventDefaultHandler, toCssVariables } from "../../lib/helpers.js";
|
|
5
5
|
import { dismissableSurfaces, useDeferredPointerDownOutside } from "../Popover/deferredPointerDownOutside.js";
|
|
6
6
|
import { firstElementChild } from "../Tooltip/slot.js";
|
|
7
7
|
import { TransitionGroup } from "../Transition/index.js";
|
|
8
|
+
import { overlayTiming, overlayTimingLarge } from "../Transition/shared.js";
|
|
8
9
|
import s from "@plexui/styles/components/Dialog/Dialog.module.css";
|
|
9
10
|
const DialogContextKey = Symbol("PlexUIDialog");
|
|
10
11
|
const useDialogContext = () => {
|
|
@@ -108,9 +109,32 @@ export const DialogContent = defineComponent({
|
|
|
108
109
|
},
|
|
109
110
|
setup(props, { slots, attrs }) {
|
|
110
111
|
const { open, setOpen, titleCount, descriptionCount } = useDialogContext();
|
|
112
|
+
const rootContext = injectDialogRootContext();
|
|
111
113
|
// Radix's root makes the content id; Reka's trigger does, so a dialog
|
|
112
114
|
// without one would render `id=""`
|
|
113
|
-
|
|
115
|
+
rootContext.contentId ||= useId(undefined, "reka-dialog-content");
|
|
116
|
+
// Force-mounted content refocuses Reka's trigger the moment it closes.
|
|
117
|
+
// Focus waits for the exit, as in Radix: the trigger is held back until
|
|
118
|
+
// the content unmounts, where Reka's own close auto focus uses it.
|
|
119
|
+
let closingTrigger;
|
|
120
|
+
watch(open, (isOpen) => {
|
|
121
|
+
if (isOpen) {
|
|
122
|
+
if (closingTrigger)
|
|
123
|
+
rootContext.triggerElement.value = closingTrigger;
|
|
124
|
+
closingTrigger = undefined;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
closingTrigger = rootContext.triggerElement.value;
|
|
128
|
+
rootContext.triggerElement.value = undefined;
|
|
129
|
+
}
|
|
130
|
+
}, { flush: "sync" });
|
|
131
|
+
const handleCloseAutoFocus = (event) => {
|
|
132
|
+
props.onCloseAutoFocus?.(event);
|
|
133
|
+
keepMovedFocus(event);
|
|
134
|
+
if (closingTrigger)
|
|
135
|
+
rootContext.triggerElement.value = closingTrigger;
|
|
136
|
+
closingTrigger = undefined;
|
|
137
|
+
};
|
|
114
138
|
// Escape goes through the shared stack, as in React, so the dialog
|
|
115
139
|
// closes before overlays opened earlier (a forced-open Tooltip)
|
|
116
140
|
useEscCloseStack(open, () => {
|
|
@@ -138,7 +162,7 @@ export const DialogContent = defineComponent({
|
|
|
138
162
|
dismissableSurfaces.add(element);
|
|
139
163
|
};
|
|
140
164
|
const renderDialog = () => h("div", { key: "dialog" }, [
|
|
141
|
-
h(RekaDialogOverlay, { class: s.Overlay, ref: setOverlayRef }),
|
|
165
|
+
h(RekaDialogOverlay, { class: s.Overlay, forceMount: true, ref: setOverlayRef }),
|
|
142
166
|
h(RekaDialogContent, {
|
|
143
167
|
"forceMount": true,
|
|
144
168
|
"class": s.Content,
|
|
@@ -147,7 +171,7 @@ export const DialogContent = defineComponent({
|
|
|
147
171
|
"data-mobile-placement": props.mobilePlacement,
|
|
148
172
|
"data-pill": props.pill ? "" : undefined,
|
|
149
173
|
"onOpenAutoFocus": props.onOpenAutoFocus,
|
|
150
|
-
"onCloseAutoFocus":
|
|
174
|
+
"onCloseAutoFocus": handleCloseAutoFocus,
|
|
151
175
|
// Radix labels and describes the content only by mounted parts
|
|
152
176
|
...(titleCount.value > 0 ? {} : { "aria-labelledby": undefined }),
|
|
153
177
|
...(descriptionCount.value > 0 ? {} : { "aria-describedby": undefined }),
|
|
@@ -171,13 +195,24 @@ export const DialogContent = defineComponent({
|
|
|
171
195
|
],
|
|
172
196
|
}),
|
|
173
197
|
]);
|
|
174
|
-
return () =>
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
198
|
+
return () => {
|
|
199
|
+
const { placement, mobilePlacement } = props;
|
|
200
|
+
const crossesScreen = placement === "bottom" || placement === "start" || placement === "end" || mobilePlacement === "bottom";
|
|
201
|
+
return h(RekaDialogPortal, null, {
|
|
202
|
+
default: () => [
|
|
203
|
+
h(TransitionGroup,
|
|
204
|
+
// A dialog mounted open enters too, as `v-if` and `open` together do
|
|
205
|
+
{
|
|
206
|
+
class: s.Transition,
|
|
207
|
+
...(crossesScreen ? overlayTimingLarge : overlayTiming),
|
|
208
|
+
overlay: true,
|
|
209
|
+
preventInitialTransition: false,
|
|
210
|
+
},
|
|
211
|
+
// `open && <div>` in React: closed still renders the empty wrapper
|
|
212
|
+
{ default: () => [open.value ? renderDialog() : createCommentVNode()] }),
|
|
213
|
+
],
|
|
214
|
+
});
|
|
215
|
+
};
|
|
181
216
|
},
|
|
182
217
|
});
|
|
183
218
|
export const DialogHeader = defineComponent({
|