@vkontakte/vkui 7.2.0 → 7.2.1
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/components/Calendar/Calendar.d.ts +2 -2
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +1 -1
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/CalendarDays/CalendarDays.d.ts +1 -1
- package/dist/components/CalendarDays/CalendarDays.d.ts.map +1 -1
- package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
- package/dist/components/CalendarRange/CalendarRange.d.ts +2 -2
- package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
- package/dist/components/CalendarRange/CalendarRange.js +4 -1
- package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
- package/dist/components/CalendarTime/CalendarTime.d.ts.map +1 -1
- package/dist/components/CalendarTime/CalendarTime.js +16 -13
- package/dist/components/CalendarTime/CalendarTime.js.map +1 -1
- package/dist/components/ChipsInputBase/ChipsInputBase.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/ChipsInputBase.js +1 -0
- package/dist/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
- package/dist/components/ChipsInputBase/helpers.d.ts +1 -1
- package/dist/components/ChipsInputBase/helpers.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/helpers.js +4 -0
- package/dist/components/ChipsInputBase/helpers.js.map +1 -1
- package/dist/components/ChipsInputBase/types.d.ts +1 -1
- package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/types.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.d.ts.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +6 -1
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +3 -2
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/components/DateInput/DateInput.d.ts +9 -1
- package/dist/components/DateInput/DateInput.d.ts.map +1 -1
- package/dist/components/DateInput/DateInput.js +14 -4
- package/dist/components/DateInput/DateInput.js.map +1 -1
- package/dist/components/DateInput/hooks.d.ts +7 -6
- package/dist/components/DateInput/hooks.d.ts.map +1 -1
- package/dist/components/DateInput/hooks.js +14 -7
- package/dist/components/DateInput/hooks.js.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.d.ts +9 -1
- package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.js +13 -3
- package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/components/ModalCard/ModalCard.d.ts.map +1 -1
- package/dist/components/ModalCard/ModalCard.js +4 -12
- package/dist/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
- package/dist/components/ModalPage/ModalPage.js +5 -12
- package/dist/components/ModalPage/ModalPage.js.map +1 -1
- package/dist/components/ModalRoot/types.d.ts +1 -0
- package/dist/components/ModalRoot/types.d.ts.map +1 -1
- package/dist/components/ModalRoot/types.js.map +1 -1
- package/dist/components/ModalRoot/useModalManager.d.ts +4 -2
- package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
- package/dist/components/ModalRoot/useModalManager.js +12 -3
- package/dist/components/ModalRoot/useModalManager.js.map +1 -1
- package/dist/components/ModalRoot/useModalRootContext.js +1 -0
- package/dist/components/ModalRoot/useModalRootContext.js.map +1 -1
- package/dist/components/Touch/Touch.d.ts.map +1 -1
- package/dist/components/Touch/Touch.js +2 -2
- package/dist/components/Touch/Touch.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/Calendar/Calendar.js +1 -1
- package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
- package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
- package/dist/cssm/components/CalendarRange/CalendarRange.js +4 -1
- package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
- package/dist/cssm/components/CalendarTime/CalendarTime.js +16 -13
- package/dist/cssm/components/CalendarTime/CalendarTime.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js +1 -0
- package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/helpers.js +4 -0
- package/dist/cssm/components/ChipsInputBase/helpers.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +6 -1
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +3 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/cssm/components/DateInput/DateInput.js +12 -4
- package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
- package/dist/cssm/components/DateInput/hooks.js +14 -7
- package/dist/cssm/components/DateInput/hooks.js.map +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js +11 -3
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/cssm/components/FormItem/FormItem.module.css +1 -0
- package/dist/cssm/components/ModalCard/ModalCard.js +2 -11
- package/dist/cssm/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/cssm/components/ModalPage/ModalPage.js +3 -11
- package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
- package/dist/cssm/components/ModalRoot/types.js.map +1 -1
- package/dist/cssm/components/ModalRoot/useModalManager.js +12 -3
- package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
- package/dist/cssm/components/ModalRoot/useModalRootContext.js +1 -0
- package/dist/cssm/components/ModalRoot/useModalRootContext.js.map +1 -1
- package/dist/cssm/components/Tappable/Tappable.module.css +1 -1
- package/dist/cssm/components/Touch/Touch.js +2 -2
- package/dist/cssm/components/Touch/Touch.js.map +1 -1
- package/dist/cssm/hooks/useCalendar.js.map +1 -1
- package/dist/cssm/hooks/useDateInput.js +3 -3
- package/dist/cssm/hooks/useDateInput.js.map +1 -1
- package/dist/cssm/lib/date.js +6 -0
- package/dist/cssm/lib/date.js.map +1 -1
- package/dist/cssm/lib/dom.js +6 -0
- package/dist/cssm/lib/dom.js.map +1 -1
- package/dist/cssm/styles/constants.css +2 -2
- package/dist/hooks/useCalendar.d.ts +1 -1
- package/dist/hooks/useCalendar.d.ts.map +1 -1
- package/dist/hooks/useCalendar.js.map +1 -1
- package/dist/hooks/useDateInput.d.ts +4 -4
- package/dist/hooks/useDateInput.d.ts.map +1 -1
- package/dist/hooks/useDateInput.js +3 -3
- package/dist/hooks/useDateInput.js.map +1 -1
- package/dist/lib/date.d.ts.map +1 -1
- package/dist/lib/date.js +6 -0
- package/dist/lib/date.js.map +1 -1
- package/dist/lib/dom.d.ts +1 -0
- package/dist/lib/dom.d.ts.map +1 -1
- package/dist/lib/dom.js +6 -0
- package/dist/lib/dom.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +1 -1
- package/src/components/Calendar/Calendar.tsx +7 -7
- package/src/components/CalendarDays/CalendarDays.tsx +1 -1
- package/src/components/CalendarRange/CalendarRange.tsx +11 -6
- package/src/components/CalendarTime/CalendarTime.tsx +17 -9
- package/src/components/ChipsInputBase/ChipsInputBase.tsx +1 -0
- package/src/components/ChipsInputBase/helpers.ts +5 -1
- package/src/components/ChipsInputBase/types.ts +1 -1
- package/src/components/ChipsSelect/ChipsSelect.tsx +6 -1
- package/src/components/CustomSelect/CustomSelect.tsx +2 -0
- package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +1 -0
- package/src/components/DateInput/DateInput.tsx +37 -10
- package/src/components/DateInput/hooks.ts +32 -23
- package/src/components/DateRangeInput/DateRangeInput.tsx +26 -5
- package/src/components/FormItem/FormItem.module.css +1 -0
- package/src/components/ModalCard/ModalCard.tsx +2 -9
- package/src/components/ModalPage/ModalPage.tsx +3 -10
- package/src/components/ModalRoot/types.ts +1 -0
- package/src/components/ModalRoot/useModalManager.tsx +12 -5
- package/src/components/ModalRoot/useModalRootContext.ts +1 -1
- package/src/components/Tappable/Tappable.module.css +1 -1
- package/src/components/Touch/Touch.tsx +35 -3
- package/src/hooks/useCalendar.ts +1 -1
- package/src/hooks/useDateInput.ts +6 -6
- package/src/lib/date.ts +6 -0
- package/src/lib/dom.tsx +8 -0
- package/src/styles/constants.css +2 -2
|
@@ -5,8 +5,8 @@ import { type CalendarHeaderProps, type CalendarHeaderTestsProps } from '../Cale
|
|
|
5
5
|
import { type CalendarDoneButtonProps, type CalendarTimeProps, type CalendarTimeTestsProps } from '../CalendarTime/CalendarTime';
|
|
6
6
|
export type CalendarTestsProps = CalendarDaysTestsProps & CalendarHeaderTestsProps & CalendarTimeTestsProps;
|
|
7
7
|
export interface CalendarProps extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>, Pick<CalendarTimeProps, 'changeHoursLabel' | 'changeMinutesLabel'>, Pick<CalendarHeaderProps, 'prevMonthLabel' | 'nextMonthLabel' | 'changeMonthLabel' | 'changeYearLabel' | 'onNextMonth' | 'onPrevMonth' | 'prevMonthIcon' | 'nextMonthIcon' | 'prevMonthProps' | 'nextMonthProps'>, Pick<CalendarDaysProps, 'dayProps' | 'listenDayChangesForUpdate' | 'renderDayContent'>, CalendarDoneButtonProps, CalendarTestsProps {
|
|
8
|
-
value?: Date;
|
|
9
|
-
defaultValue?: Date;
|
|
8
|
+
value?: Date | null;
|
|
9
|
+
defaultValue?: Date | null;
|
|
10
10
|
/**
|
|
11
11
|
* Запрещает выбор даты в прошлом.
|
|
12
12
|
* Применяется, если не заданы `shouldDisableDate` и `disableFuture`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,uBAAuB,EAE5B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AAItC,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GACrD,wBAAwB,GACxB,sBAAsB,CAAC;AAEzB,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,EAClF,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,oBAAoB,CAAC,EAClE,IAAI,CACF,mBAAmB,EACjB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,aAAa,GACb,aAAa,GACb,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,gBAAgB,CACnB,EACD,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,2BAA2B,GAAG,kBAAkB,CAAC,EACtF,uBAAuB,EACvB,kBAAkB;IACpB,KAAK,CAAC,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Calendar.d.ts","sourceRoot":"","sources":["../../../src/components/Calendar/Calendar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,uBAAuB,EAE5B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AAItC,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GACrD,wBAAwB,GACxB,sBAAsB,CAAC;AAEzB,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,EAClF,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,GAAG,oBAAoB,CAAC,EAClE,IAAI,CACF,mBAAmB,EACjB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,aAAa,GACb,aAAa,GACb,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,gBAAgB,CACnB,EACD,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,2BAA2B,GAAG,kBAAkB,CAAC,EACtF,uBAAuB,EACvB,kBAAkB;IACpB,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,ovBAgDtB,aAAa,KAAG,KAAK,CAAC,SA+JxB,CAAC"}
|
|
@@ -79,7 +79,7 @@ const warn = warnOnce('Calendar');
|
|
|
79
79
|
defaultValue,
|
|
80
80
|
onChange: _onChange
|
|
81
81
|
});
|
|
82
|
-
const timeZonedValue = React.useMemo(()=>convertDateToTimeZone(value, timezone)
|
|
82
|
+
const timeZonedValue = React.useMemo(()=>convertDateToTimeZone(value, timezone), [
|
|
83
83
|
timezone,
|
|
84
84
|
value
|
|
85
85
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isSameDay, isSameMonth } from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { clamp, isFirstDay, isLastDay, navigateDate, setTimeEqual } from '../../lib/calendar';\nimport { convertDateFromTimeZone, convertDateToTimeZone } from '../../lib/date';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport {\n type CalendarDoneButtonProps,\n CalendarTime,\n type CalendarTimeProps,\n type CalendarTimeTestsProps,\n} from '../CalendarTime/CalendarTime';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Calendar.module.css';\n\nexport type CalendarTestsProps = CalendarDaysTestsProps &\n CalendarHeaderTestsProps &\n CalendarTimeTestsProps;\n\nexport interface CalendarProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<CalendarTimeProps, 'changeHoursLabel' | 'changeMinutesLabel'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'prevMonthProps'\n | 'nextMonthProps'\n >,\n Pick<CalendarDaysProps, 'dayProps' | 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarDoneButtonProps,\n CalendarTestsProps {\n value?: Date;\n defaultValue?: Date;\n /**\n * Запрещает выбор даты в прошлом.\n * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.\n */\n disablePast?: boolean;\n /**\n * Запрещает выбор даты в будущем.\n * Применяется, если не задано `shouldDisableDate`.\n */\n disableFuture?: boolean;\n enableTime?: boolean;\n disablePickers?: boolean;\n changeDayLabel?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n showNeighboringMonth?: boolean;\n size?: 's' | 'm';\n onChange?: (value?: Date) => void;\n /**\n * Позволяет запретить выбор даты.\n */\n shouldDisableDate?: (value: Date) => boolean;\n /**\n * Дата отображаемого месяца.\n * При использовании обновление даты должно происходить вне компонента.\n */\n viewDate?: Date;\n /**\n * Изменение даты в шапке календаря.\n */\n onHeaderChange?: (value: Date) => void;\n /**\n * Минимальные дата и время, которые можно выбрать\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n minDateTime?: Date;\n /**\n * Максимальные дата и время, которые можно выбрать.\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n maxDateTime?: Date;\n /**\n * Свойство для отображения времени в нужной таймзоне\n */\n timezone?: string;\n}\n\nconst warn = warnOnce('Calendar');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Calendar\n */\nexport const Calendar = ({\n getRootRef,\n value: valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onDoneButtonClick,\n enableTime = false,\n doneButtonText,\n doneButtonDisabled,\n doneButtonShow,\n DoneButton,\n weekStartsOn = 1,\n disablePickers,\n changeHoursLabel = 'Изменить час',\n changeMinutesLabel = 'Изменить минуту',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n showNeighboringMonth,\n changeDayLabel = 'Изменить день',\n size = 'm',\n viewDate: externalViewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n prevMonthProps,\n nextMonthProps,\n dayProps,\n listenDayChangesForUpdate,\n renderDayContent,\n minDateTime,\n maxDateTime,\n timezone,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n prevMonthButtonTestId,\n nextMonthButtonTestId,\n monthDropdownTestId,\n yearDropdownTestId,\n dayTestId,\n ...props\n}: CalendarProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (date: Date | undefined) => {\n onChange?.(convertDateFromTimeZone(date, timezone) || undefined);\n },\n [onChange, timezone],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<Date | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const timeZonedValue: Date | undefined = React.useMemo(\n () => convertDateToTimeZone(value, timezone) || undefined,\n [timezone, value],\n );\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n resetSelectedDay,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({\n value: timeZonedValue,\n disableFuture,\n disablePast,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n });\n\n useIsomorphicLayoutEffect(() => {\n if (timeZonedValue) {\n setViewDate(timeZonedValue);\n }\n }, [timeZonedValue]);\n\n if (process.env.NODE_ENV === 'development' && !disablePickers && size === 's') {\n warn(\"Нельзя включить селекты выбора месяца/года, если размер календаря 's'\", 'error');\n }\n\n if (process.env.NODE_ENV === 'development' && enableTime && size === 's') {\n warn(\"Нельзя включить выбор времени, если размер календаря 's'\", 'error');\n }\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n event.preventDefault();\n }\n\n const newFocusedDay = navigateDate(focusedDay ?? timeZonedValue, event.key);\n\n if (newFocusedDay && !isSameMonth(newFocusedDay, viewDate)) {\n setViewDate(newFocusedDay);\n }\n setFocusedDay(newFocusedDay);\n },\n [focusedDay, setFocusedDay, setViewDate, timeZonedValue, viewDate],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n let actualDate = setTimeEqual(date, timeZonedValue);\n if (minDateTime || maxDateTime) {\n actualDate = clamp(actualDate, { min: minDateTime, max: maxDateTime });\n }\n updateValue(actualDate);\n },\n [timeZonedValue, updateValue, maxDateTime, minDateTime],\n );\n\n const isDayActive = React.useCallback(\n (day: Date) => Boolean(timeZonedValue && isSameDay(day, timeZonedValue)),\n [timeZonedValue],\n );\n\n return (\n <RootComponent\n {...props}\n baseClassName={classNames(styles.host, size === 's' && styles.sizeS)}\n getRootRef={getRootRef}\n >\n <CalendarHeader\n viewDate={externalViewDate || viewDate}\n onChange={setViewDate}\n onNextMonth={setNextMonth}\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers || size === 's'}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n prevMonthProps={prevMonthProps}\n nextMonthProps={nextMonthProps}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n nextMonthButtonTestId={nextMonthButtonTestId}\n prevMonthButtonTestId={prevMonthButtonTestId}\n monthDropdownTestId={monthDropdownTestId}\n yearDropdownTestId={yearDropdownTestId}\n />\n <CalendarDays\n viewDate={externalViewDate || viewDate}\n value={timeZonedValue}\n weekStartsOn={weekStartsOn}\n isDayFocused={isDayFocused}\n tabIndex={0}\n aria-label={changeDayLabel}\n onKeyDown={handleKeyDown}\n onDayChange={onDayChange}\n isDayActive={isDayActive}\n isDaySelectionStart={isFirstDay}\n isDaySelectionEnd={isLastDay}\n isDayDisabled={isDayDisabled}\n onBlur={resetSelectedDay}\n showNeighboringMonth={showNeighboringMonth}\n size={size}\n dayProps={dayProps}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n {enableTime && timeZonedValue && size !== 's' && (\n <div className={styles.time}>\n <CalendarTime\n value={timeZonedValue}\n onChange={updateValue}\n onDoneButtonClick={onDoneButtonClick}\n doneButtonText={doneButtonText}\n doneButtonDisabled={doneButtonDisabled}\n doneButtonShow={doneButtonShow}\n DoneButton={DoneButton}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n isDayDisabled={minDateTime || maxDateTime ? isDayDisabled : undefined}\n minutesTestId={minutesTestId}\n hoursTestId={hoursTestId}\n doneButtonTestId={doneButtonTestId}\n />\n </div>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","isSameDay","isSameMonth","useCalendar","useCustomEnsuredControl","clamp","isFirstDay","isLastDay","navigateDate","setTimeEqual","convertDateFromTimeZone","convertDateToTimeZone","useIsomorphicLayoutEffect","warnOnce","CalendarDays","CalendarHeader","CalendarTime","RootComponent","warn","Calendar","getRootRef","value","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","onDoneButtonClick","enableTime","doneButtonText","doneButtonDisabled","doneButtonShow","DoneButton","weekStartsOn","disablePickers","changeHoursLabel","changeMinutesLabel","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","showNeighboringMonth","changeDayLabel","size","viewDate","externalViewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","prevMonthProps","nextMonthProps","dayProps","listenDayChangesForUpdate","renderDayContent","minDateTime","maxDateTime","timezone","minutesTestId","hoursTestId","doneButtonTestId","prevMonthButtonTestId","nextMonthButtonTestId","monthDropdownTestId","yearDropdownTestId","dayTestId","props","_onChange","useCallback","date","undefined","updateValue","timeZonedValue","useMemo","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","resetSelectedDay","isMonthDisabled","isYearDisabled","process","env","NODE_ENV","handleKeyDown","event","includes","key","preventDefault","newFocusedDay","onDayChange","actualDate","min","max","isDayActive","day","Boolean","baseClassName","className","tabIndex","aria-label","onKeyDown","isDaySelectionStart","isDaySelectionEnd","onBlur","div"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isSameDay, isSameMonth } from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { clamp, isFirstDay, isLastDay, navigateDate, setTimeEqual } from '../../lib/calendar';\nimport { convertDateFromTimeZone, convertDateToTimeZone } from '../../lib/date';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport {\n type CalendarDoneButtonProps,\n CalendarTime,\n type CalendarTimeProps,\n type CalendarTimeTestsProps,\n} from '../CalendarTime/CalendarTime';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Calendar.module.css';\n\nexport type CalendarTestsProps = CalendarDaysTestsProps &\n CalendarHeaderTestsProps &\n CalendarTimeTestsProps;\n\nexport interface CalendarProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<CalendarTimeProps, 'changeHoursLabel' | 'changeMinutesLabel'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'prevMonthProps'\n | 'nextMonthProps'\n >,\n Pick<CalendarDaysProps, 'dayProps' | 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarDoneButtonProps,\n CalendarTestsProps {\n value?: Date | null;\n defaultValue?: Date | null;\n /**\n * Запрещает выбор даты в прошлом.\n * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.\n */\n disablePast?: boolean;\n /**\n * Запрещает выбор даты в будущем.\n * Применяется, если не задано `shouldDisableDate`.\n */\n disableFuture?: boolean;\n enableTime?: boolean;\n disablePickers?: boolean;\n changeDayLabel?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n showNeighboringMonth?: boolean;\n size?: 's' | 'm';\n onChange?: (value?: Date) => void; // TODO [>=8]: поменять тип на `(value?: Date | null) => void`\n /**\n * Позволяет запретить выбор даты.\n */\n shouldDisableDate?: (value: Date) => boolean;\n /**\n * Дата отображаемого месяца.\n * При использовании обновление даты должно происходить вне компонента.\n */\n viewDate?: Date;\n /**\n * Изменение даты в шапке календаря.\n */\n onHeaderChange?: (value: Date) => void;\n /**\n * Минимальные дата и время, которые можно выбрать\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n minDateTime?: Date;\n /**\n * Максимальные дата и время, которые можно выбрать.\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n maxDateTime?: Date;\n /**\n * Свойство для отображения времени в нужной таймзоне\n */\n timezone?: string;\n}\n\nconst warn = warnOnce('Calendar');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Calendar\n */\nexport const Calendar = ({\n getRootRef,\n value: valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onDoneButtonClick,\n enableTime = false,\n doneButtonText,\n doneButtonDisabled,\n doneButtonShow,\n DoneButton,\n weekStartsOn = 1,\n disablePickers,\n changeHoursLabel = 'Изменить час',\n changeMinutesLabel = 'Изменить минуту',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n showNeighboringMonth,\n changeDayLabel = 'Изменить день',\n size = 'm',\n viewDate: externalViewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n prevMonthProps,\n nextMonthProps,\n dayProps,\n listenDayChangesForUpdate,\n renderDayContent,\n minDateTime,\n maxDateTime,\n timezone,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n prevMonthButtonTestId,\n nextMonthButtonTestId,\n monthDropdownTestId,\n yearDropdownTestId,\n dayTestId,\n ...props\n}: CalendarProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (date: Date | null | undefined) => {\n onChange?.(convertDateFromTimeZone(date, timezone) || undefined);\n },\n [onChange, timezone],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<Date | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const timeZonedValue: Date | null | undefined = React.useMemo(\n () => convertDateToTimeZone(value, timezone),\n [timezone, value],\n );\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n resetSelectedDay,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({\n value: timeZonedValue,\n disableFuture,\n disablePast,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n });\n\n useIsomorphicLayoutEffect(() => {\n if (timeZonedValue) {\n setViewDate(timeZonedValue);\n }\n }, [timeZonedValue]);\n\n if (process.env.NODE_ENV === 'development' && !disablePickers && size === 's') {\n warn(\"Нельзя включить селекты выбора месяца/года, если размер календаря 's'\", 'error');\n }\n\n if (process.env.NODE_ENV === 'development' && enableTime && size === 's') {\n warn(\"Нельзя включить выбор времени, если размер календаря 's'\", 'error');\n }\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n event.preventDefault();\n }\n\n const newFocusedDay = navigateDate(focusedDay ?? timeZonedValue, event.key);\n\n if (newFocusedDay && !isSameMonth(newFocusedDay, viewDate)) {\n setViewDate(newFocusedDay);\n }\n setFocusedDay(newFocusedDay);\n },\n [focusedDay, setFocusedDay, setViewDate, timeZonedValue, viewDate],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n let actualDate = setTimeEqual(date, timeZonedValue);\n if (minDateTime || maxDateTime) {\n actualDate = clamp(actualDate, { min: minDateTime, max: maxDateTime });\n }\n updateValue(actualDate);\n },\n [timeZonedValue, updateValue, maxDateTime, minDateTime],\n );\n\n const isDayActive = React.useCallback(\n (day: Date) => Boolean(timeZonedValue && isSameDay(day, timeZonedValue)),\n [timeZonedValue],\n );\n\n return (\n <RootComponent\n {...props}\n baseClassName={classNames(styles.host, size === 's' && styles.sizeS)}\n getRootRef={getRootRef}\n >\n <CalendarHeader\n viewDate={externalViewDate || viewDate}\n onChange={setViewDate}\n onNextMonth={setNextMonth}\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers || size === 's'}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n prevMonthProps={prevMonthProps}\n nextMonthProps={nextMonthProps}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n nextMonthButtonTestId={nextMonthButtonTestId}\n prevMonthButtonTestId={prevMonthButtonTestId}\n monthDropdownTestId={monthDropdownTestId}\n yearDropdownTestId={yearDropdownTestId}\n />\n <CalendarDays\n viewDate={externalViewDate || viewDate}\n value={timeZonedValue}\n weekStartsOn={weekStartsOn}\n isDayFocused={isDayFocused}\n tabIndex={0}\n aria-label={changeDayLabel}\n onKeyDown={handleKeyDown}\n onDayChange={onDayChange}\n isDayActive={isDayActive}\n isDaySelectionStart={isFirstDay}\n isDaySelectionEnd={isLastDay}\n isDayDisabled={isDayDisabled}\n onBlur={resetSelectedDay}\n showNeighboringMonth={showNeighboringMonth}\n size={size}\n dayProps={dayProps}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n {enableTime && timeZonedValue && size !== 's' && (\n <div className={styles.time}>\n <CalendarTime\n value={timeZonedValue}\n onChange={updateValue}\n onDoneButtonClick={onDoneButtonClick}\n doneButtonText={doneButtonText}\n doneButtonDisabled={doneButtonDisabled}\n doneButtonShow={doneButtonShow}\n DoneButton={DoneButton}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n isDayDisabled={minDateTime || maxDateTime ? isDayDisabled : undefined}\n minutesTestId={minutesTestId}\n hoursTestId={hoursTestId}\n doneButtonTestId={doneButtonTestId}\n />\n </div>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","isSameDay","isSameMonth","useCalendar","useCustomEnsuredControl","clamp","isFirstDay","isLastDay","navigateDate","setTimeEqual","convertDateFromTimeZone","convertDateToTimeZone","useIsomorphicLayoutEffect","warnOnce","CalendarDays","CalendarHeader","CalendarTime","RootComponent","warn","Calendar","getRootRef","value","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","onDoneButtonClick","enableTime","doneButtonText","doneButtonDisabled","doneButtonShow","DoneButton","weekStartsOn","disablePickers","changeHoursLabel","changeMinutesLabel","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","showNeighboringMonth","changeDayLabel","size","viewDate","externalViewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","prevMonthProps","nextMonthProps","dayProps","listenDayChangesForUpdate","renderDayContent","minDateTime","maxDateTime","timezone","minutesTestId","hoursTestId","doneButtonTestId","prevMonthButtonTestId","nextMonthButtonTestId","monthDropdownTestId","yearDropdownTestId","dayTestId","props","_onChange","useCallback","date","undefined","updateValue","timeZonedValue","useMemo","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","resetSelectedDay","isMonthDisabled","isYearDisabled","process","env","NODE_ENV","handleKeyDown","event","includes","key","preventDefault","newFocusedDay","onDayChange","actualDate","min","max","isDayActive","day","Boolean","baseClassName","className","tabIndex","aria-label","onKeyDown","isDaySelectionStart","isDaySelectionEnd","onBlur","div"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export type CalendarDaysTestsProps = {
|
|
|
8
8
|
dayTestId?: CalendarDayTestsProps['testId'];
|
|
9
9
|
};
|
|
10
10
|
export interface CalendarDaysProps extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>, Pick<CalendarDayProps, 'renderDayContent'>, CalendarDaysTestsProps {
|
|
11
|
-
value?: Date | Array<Date | null
|
|
11
|
+
value?: Date | Array<Date | null> | null;
|
|
12
12
|
viewDate: Date;
|
|
13
13
|
weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
14
14
|
showNeighboringMonth?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarDays.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarDays/CalendarDays.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAMpC,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EACjE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAC1C,sBAAsB;IACxB,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"CalendarDays.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarDays/CalendarDays.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,4BAA4B,CAAC;AAMpC,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,WAAW,iBACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,EACjE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAC1C,sBAAsB;IACxB,KAAK,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,IAAI,CAAC;IACf,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACjB,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IACxC,mBAAmB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACjE,iBAAiB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/D,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACxE,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACtE,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IACzC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;CACpC;AAED,eAAO,MAAM,YAAY,GAAI,8VAwB1B,iBAAiB,KAAG,KAAK,CAAC,SAkE5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/CalendarDays/CalendarDays.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isSameDay, isSameMonth } from 'date-fns';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useTodayDate } from '../../hooks/useTodayDate';\nimport { getDaysNames, getWeeks } from '../../lib/calendar';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDay,\n type CalendarDayElementProps,\n type CalendarDayProps,\n type CalendarDayTestsProps,\n} from '../CalendarDay/CalendarDay';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './CalendarDays.module.css';\n\nexport type CalendarDaysTestsProps = {\n /**\n * Передает атрибут `data-testid` для дня в календаре\n */\n dayTestId?: CalendarDayTestsProps['testId'];\n};\n\nexport interface CalendarDaysProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>,\n Pick<CalendarDayProps, 'renderDayContent'>,\n CalendarDaysTestsProps {\n value?: Date | Array<Date | null
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CalendarDays/CalendarDays.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isSameDay, isSameMonth } from 'date-fns';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useTodayDate } from '../../hooks/useTodayDate';\nimport { getDaysNames, getWeeks } from '../../lib/calendar';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDay,\n type CalendarDayElementProps,\n type CalendarDayProps,\n type CalendarDayTestsProps,\n} from '../CalendarDay/CalendarDay';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './CalendarDays.module.css';\n\nexport type CalendarDaysTestsProps = {\n /**\n * Передает атрибут `data-testid` для дня в календаре\n */\n dayTestId?: CalendarDayTestsProps['testId'];\n};\n\nexport interface CalendarDaysProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>,\n Pick<CalendarDayProps, 'renderDayContent'>,\n CalendarDaysTestsProps {\n value?: Date | Array<Date | null> | null;\n viewDate: Date;\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n showNeighboringMonth?: boolean;\n size?: 's' | 'm';\n dayProps?: CalendarDayElementProps;\n listenDayChangesForUpdate?: boolean;\n onDayChange: (value: Date) => void;\n isDayDisabled: (value: Date) => boolean;\n isDaySelectionStart: (value: Date, dayOfWeek: number) => boolean;\n isDaySelectionEnd: (value: Date, dayOfWeek: number) => boolean;\n isHintedDaySelectionStart?: (value: Date, dayOfWeek: number) => boolean;\n isHintedDaySelectionEnd?: (value: Date, dayOfWeek: number) => boolean;\n isDayActive: (value: Date) => boolean;\n isDayHinted?: (value: Date) => boolean;\n isDaySelected?: (value: Date) => boolean;\n isDayFocused: (value: Date) => boolean;\n onDayEnter?: (value: Date) => void;\n onDayLeave?: (value: Date) => void;\n}\n\nexport const CalendarDays = ({\n viewDate,\n value,\n weekStartsOn,\n onDayChange,\n isDaySelected,\n isDayActive,\n isDaySelectionEnd,\n isDaySelectionStart,\n onDayEnter,\n onDayLeave,\n isDayHinted,\n isHintedDaySelectionStart,\n isHintedDaySelectionEnd,\n isDayFocused,\n isDayDisabled,\n size,\n showNeighboringMonth = false,\n dayProps,\n listenDayChangesForUpdate = false,\n getRootRef,\n renderDayContent,\n dayTestId,\n ...props\n}: CalendarDaysProps): React.ReactNode => {\n const { locale } = useConfigProvider();\n const ref = useExternRef(getRootRef);\n const now = useTodayDate(listenDayChangesForUpdate);\n\n const weeks = React.useMemo(() => getWeeks(viewDate, weekStartsOn), [weekStartsOn, viewDate]);\n\n const daysNames = React.useMemo(\n () => getDaysNames(now, weekStartsOn, locale),\n [locale, now, weekStartsOn],\n );\n\n const handleDayChange = React.useCallback(\n (date: Date) => {\n onDayChange(date);\n\n ref.current?.focus();\n },\n [onDayChange, ref],\n );\n\n return (\n <RootComponent {...props} baseClassName={styles.host} getRootRef={ref}>\n <div className={classNames(styles.row, size === 's' && styles.rowSizeS)}>\n {daysNames.map((dayName) => (\n <Footnote key={dayName} className={styles.weekday}>\n {dayName}\n </Footnote>\n ))}\n </div>\n\n {weeks.map((week, i) => (\n <div className={classNames(styles.row, size === 's' && styles.rowSizeS)} key={i}>\n {week.map((day, i) => {\n const sameMonth = isSameMonth(day, viewDate);\n return (\n <CalendarDay\n key={day.toISOString()}\n day={day}\n today={isSameDay(day, now)}\n active={isDayActive(day)}\n onChange={handleDayChange}\n hidden={!showNeighboringMonth && !sameMonth}\n disabled={isDayDisabled(day)}\n selectionStart={isDaySelectionStart(day, i)}\n selectionEnd={isDaySelectionEnd(day, i)}\n hintedSelectionStart={isHintedDaySelectionStart?.(day, i)}\n hintedSelectionEnd={isHintedDaySelectionEnd?.(day, i)}\n selected={isDaySelected?.(day)}\n focused={isDayFocused(day)}\n onEnter={onDayEnter}\n onLeave={onDayLeave}\n hinted={isDayHinted?.(day)}\n sameMonth={sameMonth}\n size={size}\n renderDayContent={renderDayContent}\n testId={dayTestId}\n {...dayProps}\n className={classNames(dayProps?.className, styles.rowDay)}\n />\n );\n })}\n </div>\n ))}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","isSameDay","isSameMonth","useExternRef","useTodayDate","getDaysNames","getWeeks","CalendarDay","useConfigProvider","RootComponent","Footnote","CalendarDays","viewDate","value","weekStartsOn","onDayChange","isDaySelected","isDayActive","isDaySelectionEnd","isDaySelectionStart","onDayEnter","onDayLeave","isDayHinted","isHintedDaySelectionStart","isHintedDaySelectionEnd","isDayFocused","isDayDisabled","size","showNeighboringMonth","dayProps","listenDayChangesForUpdate","getRootRef","renderDayContent","dayTestId","props","locale","ref","now","weeks","useMemo","daysNames","handleDayChange","useCallback","date","current","focus","baseClassName","div","className","map","dayName","week","i","day","sameMonth","today","active","onChange","hidden","disabled","selectionStart","selectionEnd","hintedSelectionStart","hintedSelectionEnd","selected","focused","onEnter","onLeave","hinted","testId","toISOString"],"mappings":"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"}
|
|
@@ -14,8 +14,8 @@ export type CalendarRangeTestsProps = CalendarDaysTestsProps & {
|
|
|
14
14
|
rightPartHeaderTestsData?: CalendarHeaderTestsProps;
|
|
15
15
|
};
|
|
16
16
|
export interface CalendarRangeProps extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>, Pick<CalendarHeaderProps, 'prevMonthLabel' | 'nextMonthLabel' | 'changeMonthLabel' | 'changeYearLabel' | 'prevMonthIcon' | 'nextMonthIcon'>, Pick<CalendarDaysProps, 'listenDayChangesForUpdate' | 'renderDayContent'>, CalendarRangeTestsProps {
|
|
17
|
-
value?: DateRangeType;
|
|
18
|
-
defaultValue?: DateRangeType;
|
|
17
|
+
value?: DateRangeType | null;
|
|
18
|
+
defaultValue?: DateRangeType | null;
|
|
19
19
|
disablePast?: boolean;
|
|
20
20
|
disableFuture?: boolean;
|
|
21
21
|
disablePickers?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarRange.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarRange/CalendarRange.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,kCAAkC,CAAC;AAI1C,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D;;OAEG;IACH,uBAAuB,CAAC,EAAE,wBAAwB,CAAC;IACnD;;OAEG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;CACrD,CAAC;AAEF,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,EAClF,IAAI,CACF,mBAAmB,EACjB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,eAAe,CAClB,EACD,IAAI,CAAC,iBAAiB,EAAE,2BAA2B,GAAG,kBAAkB,CAAC,EACzE,uBAAuB;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"CalendarRange.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarRange/CalendarRange.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAe/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,kCAAkC,CAAC;AAI1C,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;AAEvD,MAAM,MAAM,uBAAuB,GAAG,sBAAsB,GAAG;IAC7D;;OAEG;IACH,uBAAuB,CAAC,EAAE,wBAAwB,CAAC;IACnD;;OAEG;IACH,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;CACrD,CAAC;AAEF,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,EAClF,IAAI,CACF,mBAAmB,EACjB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,eAAe,GACf,eAAe,CAClB,EACD,IAAI,CAAC,iBAAiB,EAAE,2BAA2B,GAAG,kBAAkB,CAAC,EACzE,uBAAuB;IACzB,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,KAAK,IAAI,CAAC;IACtD,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAUD;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,sXAwB3B,kBAAkB,KAAG,KAAK,CAAC,SAqN7B,CAAC"}
|
|
@@ -47,10 +47,13 @@ const getIsDaySelected = (day, value)=>{
|
|
|
47
47
|
"rightPartHeaderTestsData",
|
|
48
48
|
"getRootRef"
|
|
49
49
|
]);
|
|
50
|
+
const _onChange = React.useCallback((newValue)=>onChange === null || onChange === void 0 ? void 0 : onChange(newValue || undefined), [
|
|
51
|
+
onChange
|
|
52
|
+
]);
|
|
50
53
|
const [value, updateValue] = useCustomEnsuredControl({
|
|
51
54
|
value: valueProp,
|
|
52
55
|
defaultValue,
|
|
53
|
-
onChange
|
|
56
|
+
onChange: _onChange
|
|
54
57
|
});
|
|
55
58
|
const { viewDate, setViewDate, setPrevMonth, setNextMonth, focusedDay, setFocusedDay, isDayFocused, isDayDisabled, resetSelectedDay, isMonthDisabled, isYearDisabled } = useCalendar({
|
|
56
59
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/CalendarRange/CalendarRange.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n addMonths,\n endOfDay,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n isWithinInterval,\n startOfDay,\n subMonths,\n} from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { isFirstDay, isLastDay, navigateDate } from '../../lib/calendar';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './CalendarRange.module.css';\n\nexport type DateRangeType = [Date | null, Date | null];\n\nexport type CalendarRangeTestsProps = CalendarDaysTestsProps & {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в левой части\n */\n leftPartHeaderTestsData?: CalendarHeaderTestsProps;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в правой части\n */\n rightPartHeaderTestsData?: CalendarHeaderTestsProps;\n};\n\nexport interface CalendarRangeProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n >,\n Pick<CalendarDaysProps, 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarRangeTestsProps {\n value?: DateRangeType;\n defaultValue?: DateRangeType;\n disablePast?: boolean;\n disableFuture?: boolean;\n disablePickers?: boolean;\n changeDayLabel?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n onChange?: (value: DateRangeType | undefined) => void;\n shouldDisableDate?: (value: Date) => boolean;\n onClose?: () => void;\n}\n\nconst getIsDaySelected = (day: Date, value?: DateRangeType) => {\n if (!value?.[0] || !value[1]) {\n return false;\n }\n\n return isWithinInterval(day, { start: startOfDay(value[0]), end: endOfDay(value[1]) });\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CalendarRange\n */\nexport const CalendarRange = ({\n value: valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onClose,\n weekStartsOn = 1,\n disablePickers,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n changeDayLabel = 'Изменить день',\n prevMonthIcon,\n nextMonthIcon,\n listenDayChangesForUpdate,\n renderDayContent,\n dayTestId,\n leftPartHeaderTestsData,\n rightPartHeaderTestsData,\n getRootRef,\n ...props\n}: CalendarRangeProps): React.ReactNode => {\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | undefined>({\n value: valueProp,\n defaultValue,\n onChange,\n });\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n resetSelectedDay,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({ value, disableFuture, disablePast, shouldDisableDate });\n\n const [hintedDate, setHintedDate] = React.useState<DateRangeType>();\n const secondViewDate = addMonths(viewDate, 1);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n event.preventDefault();\n }\n\n const newFocusedDay = navigateDate(focusedDay ?? value?.[1], event.key);\n\n if (\n newFocusedDay &&\n !isSameMonth(newFocusedDay, viewDate) &&\n !isSameMonth(newFocusedDay, addMonths(viewDate, 1))\n ) {\n setViewDate(newFocusedDay);\n }\n setFocusedDay(newFocusedDay);\n },\n [focusedDay, setFocusedDay, setViewDate, value, viewDate],\n );\n\n const getNewValue = React.useCallback(\n (date: Date): DateRangeType => {\n const isValueEmpty = !value || (value[0] === null && value[1] === null);\n const isRangeSelected = value && !!value[0] && !!value[1];\n if (isValueEmpty || isRangeSelected) {\n return [date, null];\n }\n\n const [start] = value;\n if (start && isSameDay(date, start)) {\n return [startOfDay(start), endOfDay(start)];\n } else if (start && isBefore(date, start)) {\n return [startOfDay(date), endOfDay(start)];\n } else if (start && isAfter(date, start)) {\n return [start, endOfDay(date)];\n }\n return value;\n },\n [value],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n updateValue(getNewValue(date));\n setHintedDate(undefined);\n },\n [updateValue, getNewValue],\n );\n\n const isDaySelected = React.useCallback((day: Date) => getIsDaySelected(day, value), [value]);\n\n const isDayActive = React.useCallback(\n (day: Date) =>\n Boolean((value?.[0] && isSameDay(day, value[0])) || (value?.[1] && isSameDay(day, value[1]))),\n [value],\n );\n\n const isDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (value?.[1] && isSameDay(day, value[1]))),\n [value],\n );\n\n const isHintedDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (hintedDate?.[1] && isSameDay(day, hintedDate[1]))),\n [hintedDate],\n );\n\n const isDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (value?.[0] && isSameDay(day, value[0]))),\n [value],\n );\n\n const isHintedDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (hintedDate?.[0] && isSameDay(day, hintedDate[0]))),\n [hintedDate],\n );\n\n const onDayEnter = React.useCallback(\n (date: Date) => setHintedDate(getNewValue(date)),\n [setHintedDate, getNewValue],\n );\n\n const onDayLeave = React.useCallback(() => setHintedDate(undefined), [setHintedDate]);\n\n const isDayHinted = React.useCallback(\n (day: Date) => getIsDaySelected(day, hintedDate),\n [hintedDate],\n );\n\n const onRightPartViewDateChange = React.useCallback(\n (newDate: Date) => setViewDate(subMonths(newDate, 1)),\n [setViewDate],\n );\n\n return (\n <RootComponent {...props} baseClassName={styles.host} getRootRef={getRootRef}>\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={viewDate}\n onChange={setViewDate}\n nextMonthHidden\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...leftPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={viewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleKeyDown}\n isDayFocused={isDayFocused}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n aria-label={changeDayLabel}\n dayTestId={dayTestId}\n />\n </div>\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={secondViewDate}\n onChange={onRightPartViewDateChange}\n prevMonthHidden\n onNextMonth={setNextMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n nextMonthIcon={nextMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...rightPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={secondViewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n aria-label={changeDayLabel}\n onKeyDown={handleKeyDown}\n isDayFocused={isDayFocused}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n tabIndex={0}\n onBlur={resetSelectedDay}\n dayTestId={dayTestId}\n />\n </div>\n </RootComponent>\n );\n};\n"],"names":["React","addMonths","endOfDay","isAfter","isBefore","isSameDay","isSameMonth","isWithinInterval","startOfDay","subMonths","useCalendar","useCustomEnsuredControl","isFirstDay","isLastDay","navigateDate","CalendarDays","CalendarHeader","RootComponent","getIsDaySelected","day","value","start","end","CalendarRange","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","onClose","weekStartsOn","disablePickers","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","changeDayLabel","prevMonthIcon","nextMonthIcon","listenDayChangesForUpdate","renderDayContent","dayTestId","leftPartHeaderTestsData","rightPartHeaderTestsData","getRootRef","props","updateValue","viewDate","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","resetSelectedDay","isMonthDisabled","isYearDisabled","hintedDate","setHintedDate","useState","secondViewDate","handleKeyDown","useCallback","event","includes","key","preventDefault","newFocusedDay","getNewValue","date","isValueEmpty","isRangeSelected","onDayChange","undefined","isDaySelected","isDayActive","Boolean","isDaySelectionEnd","dayOfWeek","isHintedDaySelectionEnd","isDaySelectionStart","isHintedDaySelectionStart","onDayEnter","onDayLeave","isDayHinted","onRightPartViewDateChange","newDate","baseClassName","div","className","nextMonthHidden","onPrevMonth","onKeyDown","aria-label","prevMonthHidden","onNextMonth","tabIndex","onBlur"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CalendarRange/CalendarRange.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n addMonths,\n endOfDay,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n isWithinInterval,\n startOfDay,\n subMonths,\n} from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { isFirstDay, isLastDay, navigateDate } from '../../lib/calendar';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './CalendarRange.module.css';\n\nexport type DateRangeType = [Date | null, Date | null];\n\nexport type CalendarRangeTestsProps = CalendarDaysTestsProps & {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в левой части\n */\n leftPartHeaderTestsData?: CalendarHeaderTestsProps;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в правой части\n */\n rightPartHeaderTestsData?: CalendarHeaderTestsProps;\n};\n\nexport interface CalendarRangeProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n >,\n Pick<CalendarDaysProps, 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarRangeTestsProps {\n value?: DateRangeType | null;\n defaultValue?: DateRangeType | null;\n disablePast?: boolean;\n disableFuture?: boolean;\n disablePickers?: boolean;\n changeDayLabel?: string;\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n onChange?: (value: DateRangeType | undefined) => void; // TODO [>=8]: поменять тип на `(value?: DateRangeType | null) => void`\n shouldDisableDate?: (value: Date) => boolean;\n onClose?: () => void;\n}\n\nconst getIsDaySelected = (day: Date, value?: DateRangeType | null) => {\n if (!value?.[0] || !value[1]) {\n return false;\n }\n\n return isWithinInterval(day, { start: startOfDay(value[0]), end: endOfDay(value[1]) });\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CalendarRange\n */\nexport const CalendarRange = ({\n value: valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onClose,\n weekStartsOn = 1,\n disablePickers,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n changeDayLabel = 'Изменить день',\n prevMonthIcon,\n nextMonthIcon,\n listenDayChangesForUpdate,\n renderDayContent,\n dayTestId,\n leftPartHeaderTestsData,\n rightPartHeaderTestsData,\n getRootRef,\n ...props\n}: CalendarRangeProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (newValue: DateRangeType | null | undefined) => onChange?.(newValue || undefined),\n [onChange],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n resetSelectedDay,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({ value, disableFuture, disablePast, shouldDisableDate });\n\n const [hintedDate, setHintedDate] = React.useState<DateRangeType>();\n const secondViewDate = addMonths(viewDate, 1);\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n event.preventDefault();\n }\n\n const newFocusedDay = navigateDate(focusedDay ?? value?.[1], event.key);\n\n if (\n newFocusedDay &&\n !isSameMonth(newFocusedDay, viewDate) &&\n !isSameMonth(newFocusedDay, addMonths(viewDate, 1))\n ) {\n setViewDate(newFocusedDay);\n }\n setFocusedDay(newFocusedDay);\n },\n [focusedDay, setFocusedDay, setViewDate, value, viewDate],\n );\n\n const getNewValue = React.useCallback(\n (date: Date): DateRangeType => {\n const isValueEmpty = !value || (value[0] === null && value[1] === null);\n const isRangeSelected = value && !!value[0] && !!value[1];\n if (isValueEmpty || isRangeSelected) {\n return [date, null];\n }\n\n const [start] = value;\n if (start && isSameDay(date, start)) {\n return [startOfDay(start), endOfDay(start)];\n } else if (start && isBefore(date, start)) {\n return [startOfDay(date), endOfDay(start)];\n } else if (start && isAfter(date, start)) {\n return [start, endOfDay(date)];\n }\n return value;\n },\n [value],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n updateValue(getNewValue(date));\n setHintedDate(undefined);\n },\n [updateValue, getNewValue],\n );\n\n const isDaySelected = React.useCallback((day: Date) => getIsDaySelected(day, value), [value]);\n\n const isDayActive = React.useCallback(\n (day: Date) =>\n Boolean((value?.[0] && isSameDay(day, value[0])) || (value?.[1] && isSameDay(day, value[1]))),\n [value],\n );\n\n const isDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (value?.[1] && isSameDay(day, value[1]))),\n [value],\n );\n\n const isHintedDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (hintedDate?.[1] && isSameDay(day, hintedDate[1]))),\n [hintedDate],\n );\n\n const isDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (value?.[0] && isSameDay(day, value[0]))),\n [value],\n );\n\n const isHintedDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (hintedDate?.[0] && isSameDay(day, hintedDate[0]))),\n [hintedDate],\n );\n\n const onDayEnter = React.useCallback(\n (date: Date) => setHintedDate(getNewValue(date)),\n [setHintedDate, getNewValue],\n );\n\n const onDayLeave = React.useCallback(() => setHintedDate(undefined), [setHintedDate]);\n\n const isDayHinted = React.useCallback(\n (day: Date) => getIsDaySelected(day, hintedDate),\n [hintedDate],\n );\n\n const onRightPartViewDateChange = React.useCallback(\n (newDate: Date) => setViewDate(subMonths(newDate, 1)),\n [setViewDate],\n );\n\n return (\n <RootComponent {...props} baseClassName={styles.host} getRootRef={getRootRef}>\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={viewDate}\n onChange={setViewDate}\n nextMonthHidden\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...leftPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={viewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleKeyDown}\n isDayFocused={isDayFocused}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n aria-label={changeDayLabel}\n dayTestId={dayTestId}\n />\n </div>\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={secondViewDate}\n onChange={onRightPartViewDateChange}\n prevMonthHidden\n onNextMonth={setNextMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n nextMonthIcon={nextMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...rightPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={secondViewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n aria-label={changeDayLabel}\n onKeyDown={handleKeyDown}\n isDayFocused={isDayFocused}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n tabIndex={0}\n onBlur={resetSelectedDay}\n dayTestId={dayTestId}\n />\n </div>\n </RootComponent>\n );\n};\n"],"names":["React","addMonths","endOfDay","isAfter","isBefore","isSameDay","isSameMonth","isWithinInterval","startOfDay","subMonths","useCalendar","useCustomEnsuredControl","isFirstDay","isLastDay","navigateDate","CalendarDays","CalendarHeader","RootComponent","getIsDaySelected","day","value","start","end","CalendarRange","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","onClose","weekStartsOn","disablePickers","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","changeDayLabel","prevMonthIcon","nextMonthIcon","listenDayChangesForUpdate","renderDayContent","dayTestId","leftPartHeaderTestsData","rightPartHeaderTestsData","getRootRef","props","_onChange","useCallback","newValue","undefined","updateValue","viewDate","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","resetSelectedDay","isMonthDisabled","isYearDisabled","hintedDate","setHintedDate","useState","secondViewDate","handleKeyDown","event","includes","key","preventDefault","newFocusedDay","getNewValue","date","isValueEmpty","isRangeSelected","onDayChange","isDaySelected","isDayActive","Boolean","isDaySelectionEnd","dayOfWeek","isHintedDaySelectionEnd","isDaySelectionStart","isHintedDaySelectionStart","onDayEnter","onDayLeave","isDayHinted","onRightPartViewDateChange","newDate","baseClassName","div","className","nextMonthHidden","onPrevMonth","onKeyDown","aria-label","prevMonthHidden","onNextMonth","tabIndex","onBlur"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarTime.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarTime/CalendarTime.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM5D,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB,EAAE,uBAAuB;IACxF,KAAK,EAAE,IAAI,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;CAC5D;AA6BD,eAAO,MAAM,YAAY,GAAI,4MAc1B,iBAAiB,KAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"CalendarTime.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarTime/CalendarTime.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAM5D,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB,EAAE,uBAAuB;IACxF,KAAK,EAAE,IAAI,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;CAC5D;AA6BD,eAAO,MAAM,YAAY,GAAI,4MAc1B,iBAAiB,KAAG,KAAK,CAAC,SAqI5B,CAAC"}
|
|
@@ -66,21 +66,24 @@ export const CalendarTime = ({ value, onChange, onDoneButtonClick, changeHoursLa
|
|
|
66
66
|
]);
|
|
67
67
|
const onPickerKeyDown = (e)=>{
|
|
68
68
|
const key = pressedKey(e);
|
|
69
|
-
|
|
69
|
+
/* Мы хотим иметь возможность быстро, по Enter перемещаться между
|
|
70
|
+
* селектами с часами и минутами, также как мы это делаем по нажатию на Tab */ if (key !== Keys.ENTER) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const steps = [
|
|
74
|
+
hoursInputRef,
|
|
75
|
+
minutesInputRef,
|
|
76
|
+
doneButtonRef
|
|
77
|
+
].filter((ref)=>Boolean(ref.current));
|
|
78
|
+
const currentStepIndex = steps.findIndex((step)=>step.current === e.target);
|
|
79
|
+
const nextStepIndex = currentStepIndex + 1;
|
|
80
|
+
if (nextStepIndex >= steps.length) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const nextStep = steps[nextStepIndex];
|
|
84
|
+
if (nextStep.current) {
|
|
70
85
|
var _nextStep_current;
|
|
71
|
-
const steps = [
|
|
72
|
-
hoursInputRef,
|
|
73
|
-
minutesInputRef,
|
|
74
|
-
doneButtonRef
|
|
75
|
-
];
|
|
76
|
-
const currentStepIndex = steps.findIndex((step)=>step.current === e.target);
|
|
77
|
-
const diff = e.key === 'Tab' && e.shiftKey ? -1 : 1;
|
|
78
|
-
const nextStepIndex = currentStepIndex + diff;
|
|
79
|
-
if (nextStepIndex < 0 || nextStepIndex >= steps.length) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
86
|
e.preventDefault();
|
|
83
|
-
const nextStep = steps[nextStepIndex];
|
|
84
87
|
(_nextStep_current = nextStep.current) === null || _nextStep_current === void 0 ? void 0 : _nextStep_current.focus();
|
|
85
88
|
}
|
|
86
89
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/CalendarTime/CalendarTime.tsx"],"sourcesContent":["'use client';\n\nimport { type ChangeEvent, useRef } from 'react';\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { setHours, setMinutes } from 'date-fns';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { Button, type ButtonProps } from '../Button/Button';\nimport { CustomSelect, type SelectProps } from '../CustomSelect/CustomSelect';\nimport styles from './CalendarTime.module.css';\n\nconst selectFilterFn = () => true;\n\nexport type CalendarTimeTestsProps = {\n /**\n * Передает атрибут `data-testid` для дропдауна выбора часа в календаре\n */\n hoursTestId?: string;\n /**\n * Передает атрибут `data-testid` для дропдауна выбора минут в календаре\n */\n minutesTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки \"Готово\" в календаре\n */\n doneButtonTestId?: string;\n};\n\nexport type CalendarDoneButtonProps = {\n /**\n * Кастомное отображение кнопки Done.\n */\n DoneButton?: React.ComponentType<ButtonProps>;\n doneButtonText?: string;\n doneButtonShow?: boolean;\n doneButtonDisabled?: boolean;\n onDoneButtonClick?: () => void;\n};\n\nexport interface CalendarTimeProps extends CalendarTimeTestsProps, CalendarDoneButtonProps {\n value: Date;\n changeHoursLabel?: string;\n changeMinutesLabel?: string;\n onChange?: (value: Date) => void;\n isDayDisabled?: (day: Date, withTime?: boolean) => boolean;\n}\n\nconst hours: Array<{\n value: number;\n label: string;\n}> = [];\nfor (let i = 0; i < 24; i += 1) {\n hours.push({ value: i, label: String(i).padStart(2, '0') });\n}\n\nconst minutes: Array<{\n value: number;\n label: string;\n}> = [];\nfor (let i = 0; i < 60; i += 1) {\n minutes.push({ value: i, label: String(i).padStart(2, '0') });\n}\n\nconst validateValue = (\n value: string,\n validValues: Array<{\n value: number;\n label: string;\n }>,\n): boolean => {\n const numValue = Number(value);\n return !isNaN(numValue) && validValues.some((v) => v.value === numValue);\n};\n\nexport const CalendarTime = ({\n value,\n onChange,\n onDoneButtonClick,\n changeHoursLabel,\n changeMinutesLabel,\n isDayDisabled,\n doneButtonText = 'Готово',\n doneButtonDisabled = false,\n doneButtonShow = true,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n DoneButton,\n}: CalendarTimeProps): React.ReactNode => {\n const hoursInputRef = useRef<HTMLInputElement | null>(null);\n const minutesInputRef = useRef<HTMLInputElement | null>(null);\n const doneButtonRef = useRef<HTMLButtonElement | null>(null);\n\n const localHours = isDayDisabled\n ? hours.map((hour) => {\n return { ...hour, disabled: isDayDisabled(setHours(value, hour.value), true) };\n })\n : hours;\n\n const localMinutes = isDayDisabled\n ? minutes.map((minute) => {\n return { ...minute, disabled: isDayDisabled(setMinutes(value, minute.value), true) };\n })\n : minutes;\n\n const onPickerValueChange = (\n e: ChangeEvent<HTMLInputElement>,\n validate: (numericValue: string) => boolean,\n setter: (value: Date, numericValue: number) => Date,\n ) => {\n const numericValue = e.target.value.replace(/\\D/g, '');\n e.target.value = numericValue;\n if (validate(numericValue)) {\n onChange?.(setter(value, Number(numericValue)));\n }\n };\n\n const onHoursInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n onPickerValueChange(e, (numValue) => validateValue(numValue, localHours), setHours);\n };\n\n const onMinutesInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n onPickerValueChange(e, (numValue) => validateValue(numValue, localMinutes), setMinutes);\n };\n\n const onHoursChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange?.(setHours(value, Number(newValue))),\n [onChange, value],\n );\n const onMinutesChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange?.(setMinutes(value, Number(newValue))),\n [onChange, value],\n );\n\n const onPickerKeyDown = (e: React.KeyboardEvent) => {\n const key = pressedKey(e);\n if (key === Keys.ENTER || key === Keys.TAB) {\n const steps = [hoursInputRef, minutesInputRef, doneButtonRef];\n const currentStepIndex = steps.findIndex((step) => step.current === e.target);\n const diff = e.key === 'Tab' && e.shiftKey ? -1 : 1;\n const nextStepIndex = currentStepIndex + diff;\n if (nextStepIndex < 0 || nextStepIndex >= steps.length) {\n return;\n }\n e.preventDefault();\n const nextStep = steps[nextStepIndex];\n nextStep.current?.focus();\n }\n };\n\n const renderDoneButton = () => {\n const ButtonComponent = DoneButton ?? Button;\n return (\n <ButtonComponent\n mode=\"secondary\"\n onClick={onDoneButtonClick}\n size=\"l\"\n getRootRef={doneButtonRef}\n onKeyDown={onPickerKeyDown}\n disabled={doneButtonDisabled}\n data-testid={doneButtonTestId}\n >\n {doneButtonText}\n </ButtonComponent>\n );\n };\n\n return (\n <div className={classNames(styles.host, !doneButtonShow && styles.host__withoutDone)}>\n <div className={styles.picker}>\n <AdaptivityProvider sizeY=\"compact\">\n <CustomSelect\n value={value.getHours()}\n options={localHours}\n onChange={onHoursChange}\n forceDropdownPortal={false}\n searchable\n filterFn={selectFilterFn}\n onInputChange={onHoursInputChange}\n onInputKeyDown={onPickerKeyDown}\n getSelectInputRef={hoursInputRef}\n aria-label={changeHoursLabel}\n data-testid={hoursTestId}\n />\n </AdaptivityProvider>\n </div>\n <div className={styles.divider}>:</div>\n <div className={styles.picker}>\n <AdaptivityProvider sizeY=\"compact\">\n <CustomSelect\n value={value.getMinutes()}\n options={localMinutes}\n onChange={onMinutesChange}\n forceDropdownPortal={false}\n searchable\n filterFn={selectFilterFn}\n onInputChange={onMinutesInputChange}\n getSelectInputRef={minutesInputRef}\n onInputKeyDown={onPickerKeyDown}\n aria-label={changeMinutesLabel}\n data-testid={minutesTestId}\n />\n </AdaptivityProvider>\n </div>\n {doneButtonShow && (\n <div className={styles.button}>\n <AdaptivityProvider sizeY=\"compact\">{renderDoneButton()}</AdaptivityProvider>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useRef","React","classNames","setHours","setMinutes","Keys","pressedKey","AdaptivityProvider","Button","CustomSelect","selectFilterFn","hours","i","push","value","label","String","padStart","minutes","validateValue","validValues","numValue","Number","isNaN","some","v","CalendarTime","onChange","onDoneButtonClick","changeHoursLabel","changeMinutesLabel","isDayDisabled","doneButtonText","doneButtonDisabled","doneButtonShow","minutesTestId","hoursTestId","doneButtonTestId","DoneButton","hoursInputRef","minutesInputRef","doneButtonRef","localHours","map","hour","disabled","localMinutes","minute","onPickerValueChange","e","validate","setter","numericValue","target","replace","onHoursInputChange","onMinutesInputChange","onHoursChange","useCallback","_","newValue","onMinutesChange","onPickerKeyDown","key","ENTER","TAB","nextStep","steps","currentStepIndex","findIndex","step","current","diff","shiftKey","nextStepIndex","length","preventDefault","focus","renderDoneButton","ButtonComponent","mode","onClick","size","getRootRef","onKeyDown","data-testid","div","className","sizeY","getHours","options","forceDropdownPortal","searchable","filterFn","onInputChange","onInputKeyDown","getSelectInputRef","aria-label","getMinutes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CalendarTime/CalendarTime.tsx"],"sourcesContent":["'use client';\n\nimport { type ChangeEvent, useRef } from 'react';\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { setHours, setMinutes } from 'date-fns';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { Button, type ButtonProps } from '../Button/Button';\nimport { CustomSelect, type SelectProps } from '../CustomSelect/CustomSelect';\nimport styles from './CalendarTime.module.css';\n\nconst selectFilterFn = () => true;\n\nexport type CalendarTimeTestsProps = {\n /**\n * Передает атрибут `data-testid` для дропдауна выбора часа в календаре\n */\n hoursTestId?: string;\n /**\n * Передает атрибут `data-testid` для дропдауна выбора минут в календаре\n */\n minutesTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки \"Готово\" в календаре\n */\n doneButtonTestId?: string;\n};\n\nexport type CalendarDoneButtonProps = {\n /**\n * Кастомное отображение кнопки Done.\n */\n DoneButton?: React.ComponentType<ButtonProps>;\n doneButtonText?: string;\n doneButtonShow?: boolean;\n doneButtonDisabled?: boolean;\n onDoneButtonClick?: () => void;\n};\n\nexport interface CalendarTimeProps extends CalendarTimeTestsProps, CalendarDoneButtonProps {\n value: Date;\n changeHoursLabel?: string;\n changeMinutesLabel?: string;\n onChange?: (value: Date) => void;\n isDayDisabled?: (day: Date, withTime?: boolean) => boolean;\n}\n\nconst hours: Array<{\n value: number;\n label: string;\n}> = [];\nfor (let i = 0; i < 24; i += 1) {\n hours.push({ value: i, label: String(i).padStart(2, '0') });\n}\n\nconst minutes: Array<{\n value: number;\n label: string;\n}> = [];\nfor (let i = 0; i < 60; i += 1) {\n minutes.push({ value: i, label: String(i).padStart(2, '0') });\n}\n\nconst validateValue = (\n value: string,\n validValues: Array<{\n value: number;\n label: string;\n }>,\n): boolean => {\n const numValue = Number(value);\n return !isNaN(numValue) && validValues.some((v) => v.value === numValue);\n};\n\nexport const CalendarTime = ({\n value,\n onChange,\n onDoneButtonClick,\n changeHoursLabel,\n changeMinutesLabel,\n isDayDisabled,\n doneButtonText = 'Готово',\n doneButtonDisabled = false,\n doneButtonShow = true,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n DoneButton,\n}: CalendarTimeProps): React.ReactNode => {\n const hoursInputRef = useRef<HTMLInputElement | null>(null);\n const minutesInputRef = useRef<HTMLInputElement | null>(null);\n const doneButtonRef = useRef<HTMLButtonElement | null>(null);\n\n const localHours = isDayDisabled\n ? hours.map((hour) => {\n return { ...hour, disabled: isDayDisabled(setHours(value, hour.value), true) };\n })\n : hours;\n\n const localMinutes = isDayDisabled\n ? minutes.map((minute) => {\n return { ...minute, disabled: isDayDisabled(setMinutes(value, minute.value), true) };\n })\n : minutes;\n\n const onPickerValueChange = (\n e: ChangeEvent<HTMLInputElement>,\n validate: (numericValue: string) => boolean,\n setter: (value: Date, numericValue: number) => Date,\n ) => {\n const numericValue = e.target.value.replace(/\\D/g, '');\n e.target.value = numericValue;\n if (validate(numericValue)) {\n onChange?.(setter(value, Number(numericValue)));\n }\n };\n\n const onHoursInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n onPickerValueChange(e, (numValue) => validateValue(numValue, localHours), setHours);\n };\n\n const onMinutesInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n onPickerValueChange(e, (numValue) => validateValue(numValue, localMinutes), setMinutes);\n };\n\n const onHoursChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange?.(setHours(value, Number(newValue))),\n [onChange, value],\n );\n const onMinutesChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange?.(setMinutes(value, Number(newValue))),\n [onChange, value],\n );\n\n const onPickerKeyDown = (e: React.KeyboardEvent) => {\n const key = pressedKey(e);\n /* Мы хотим иметь возможность быстро, по Enter перемещаться между\n * селектами с часами и минутами, также как мы это делаем по нажатию на Tab */\n if (key !== Keys.ENTER) {\n return;\n }\n\n const steps = [hoursInputRef, minutesInputRef, doneButtonRef].filter((ref) =>\n Boolean(ref.current),\n );\n const currentStepIndex = steps.findIndex((step) => step.current === e.target);\n const nextStepIndex = currentStepIndex + 1;\n if (nextStepIndex >= steps.length) {\n return;\n }\n const nextStep = steps[nextStepIndex];\n\n if (nextStep.current) {\n e.preventDefault();\n nextStep.current?.focus();\n }\n };\n\n const renderDoneButton = () => {\n const ButtonComponent = DoneButton ?? Button;\n return (\n <ButtonComponent\n mode=\"secondary\"\n onClick={onDoneButtonClick}\n size=\"l\"\n getRootRef={doneButtonRef}\n onKeyDown={onPickerKeyDown}\n disabled={doneButtonDisabled}\n data-testid={doneButtonTestId}\n >\n {doneButtonText}\n </ButtonComponent>\n );\n };\n\n return (\n <div className={classNames(styles.host, !doneButtonShow && styles.host__withoutDone)}>\n <div className={styles.picker}>\n <AdaptivityProvider sizeY=\"compact\">\n <CustomSelect\n value={value.getHours()}\n options={localHours}\n onChange={onHoursChange}\n forceDropdownPortal={false}\n searchable\n filterFn={selectFilterFn}\n onInputChange={onHoursInputChange}\n onInputKeyDown={onPickerKeyDown}\n getSelectInputRef={hoursInputRef}\n aria-label={changeHoursLabel}\n data-testid={hoursTestId}\n />\n </AdaptivityProvider>\n </div>\n <div className={styles.divider}>:</div>\n <div className={styles.picker}>\n <AdaptivityProvider sizeY=\"compact\">\n <CustomSelect\n value={value.getMinutes()}\n options={localMinutes}\n onChange={onMinutesChange}\n forceDropdownPortal={false}\n searchable\n filterFn={selectFilterFn}\n onInputChange={onMinutesInputChange}\n getSelectInputRef={minutesInputRef}\n onInputKeyDown={onPickerKeyDown}\n aria-label={changeMinutesLabel}\n data-testid={minutesTestId}\n />\n </AdaptivityProvider>\n </div>\n {doneButtonShow && (\n <div className={styles.button}>\n <AdaptivityProvider sizeY=\"compact\">{renderDoneButton()}</AdaptivityProvider>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useRef","React","classNames","setHours","setMinutes","Keys","pressedKey","AdaptivityProvider","Button","CustomSelect","selectFilterFn","hours","i","push","value","label","String","padStart","minutes","validateValue","validValues","numValue","Number","isNaN","some","v","CalendarTime","onChange","onDoneButtonClick","changeHoursLabel","changeMinutesLabel","isDayDisabled","doneButtonText","doneButtonDisabled","doneButtonShow","minutesTestId","hoursTestId","doneButtonTestId","DoneButton","hoursInputRef","minutesInputRef","doneButtonRef","localHours","map","hour","disabled","localMinutes","minute","onPickerValueChange","e","validate","setter","numericValue","target","replace","onHoursInputChange","onMinutesInputChange","onHoursChange","useCallback","_","newValue","onMinutesChange","onPickerKeyDown","key","ENTER","steps","filter","ref","Boolean","current","currentStepIndex","findIndex","step","nextStepIndex","length","nextStep","preventDefault","focus","renderDoneButton","ButtonComponent","mode","onClick","size","getRootRef","onKeyDown","data-testid","div","className","sizeY","getHours","options","forceDropdownPortal","searchable","filterFn","onInputChange","onInputKeyDown","getSelectInputRef","aria-label","getMinutes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChipsInputBase.d.ts","sourceRoot":"","sources":["../../../src/components/ChipsInputBase/ChipsInputBase.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,OAAO,KAAK,EAAE,UAAU,EAAmB,0BAA0B,EAAc,MAAM,SAAS,CAAC;AAQnG,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,UAAU,EAAE,sUAkClD,0BAA0B,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"ChipsInputBase.d.ts","sourceRoot":"","sources":["../../../src/components/ChipsInputBase/ChipsInputBase.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,OAAO,KAAK,EAAE,UAAU,EAAmB,0BAA0B,EAAc,MAAM,SAAS,CAAC;AAQnG,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,UAAU,EAAE,sUAkClD,0BAA0B,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,SAqOxC,CAAC"}
|
|
@@ -212,6 +212,7 @@ export const ChipsInputBase = (_param)=>{
|
|
|
212
212
|
// чтобы можно было легче найти этот чип в DOM
|
|
213
213
|
'data-index': index,
|
|
214
214
|
'data-value': option.value,
|
|
215
|
+
'data-value-type': typeof option.value,
|
|
215
216
|
// для a11y
|
|
216
217
|
'tabIndex': lastFocusedChipOptionIndex === index ? 0 : -1,
|
|
217
218
|
'role': 'option',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ChipsInputBase/ChipsInputBase.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { getHorizontalFocusGoTo, Keys } from '../../lib/accessibility';\nimport {\n contains as checkTargetIsInputEl,\n contains,\n getActiveElementByAnotherElement,\n} from '../../lib/dom';\nimport { FormField } from '../FormField/FormField';\nimport { FormFieldClearButton } from '../FormFieldClearButton/FormFieldClearButton';\nimport { Text } from '../Typography/Text/Text';\nimport { DEFAULT_INPUT_VALUE, DEFAULT_VALUE, renderChipDefault } from './constants';\nimport {\n getChipOptionIndexByHTMLElement,\n getChipOptionIndexByValueProp,\n getChipOptionValueByHTMLElement,\n getNextChipOptionIndexByNavigateToProp,\n isInputValueEmpty,\n} from './helpers';\nimport type { ChipOption, ChipOptionValue, ChipsInputBasePrivateProps, NavigateTo } from './types';\nimport styles from './ChipsInputBase.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n} as const;\n\nexport const ChipsInputBase = <O extends ChipOption>({\n // FormFieldProps\n getRootRef,\n style,\n className,\n before,\n after,\n status,\n mode,\n maxHeight,\n\n // option\n value = DEFAULT_VALUE,\n onAddChipOption,\n onRemoveChipOption: onRemoveChipOptionProp,\n renderChip = renderChipDefault,\n\n // input\n getRef,\n id: idProp,\n inputValue = DEFAULT_INPUT_VALUE,\n placeholder,\n disabled,\n readOnly,\n addOnBlur,\n onBlur,\n onInputChange,\n\n // clear\n ClearButton = FormFieldClearButton,\n clearButtonShown,\n clearButtonTestId,\n onClear,\n ...restProps\n}: ChipsInputBasePrivateProps<O>): React.ReactNode => {\n const { sizeY = 'none' } = useAdaptivity();\n const idGenerated = React.useId();\n const inputRef = useExternRef(getRef);\n const listboxRef = React.useRef<HTMLDivElement>(null);\n\n const valueLength = value.length;\n const withPlaceholder = valueLength === 0;\n const [lastFocusedChipOptionIndex, setLastFocusedChipOptionIndex] = React.useState(0);\n\n const resetChipOptionFocusToInputEl = (inputEl: HTMLInputElement) => {\n setLastFocusedChipOptionIndex(0);\n inputEl.focus();\n };\n\n const moveFocusToChipOption = (\n currentIndex: number,\n navigateTo: NavigateTo,\n listboxEl: HTMLElement,\n ) => {\n const index = getNextChipOptionIndexByNavigateToProp(currentIndex, navigateTo, valueLength);\n // eslint-disable-next-line no-restricted-properties\n const foundEl = listboxEl.querySelector<HTMLElement>(`[data-index=\"${index}\"]`);\n\n if (foundEl) {\n setLastFocusedChipOptionIndex(index);\n foundEl.focus();\n }\n };\n\n const removeChipOption = (o: O | ChipOptionValue, index: number) => {\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!inputRef.current || !listboxRef.current) {\n return;\n }\n\n if (valueLength > 1) {\n if (index === valueLength - 1) {\n moveFocusToChipOption(index, 'prev', listboxRef.current);\n } else {\n moveFocusToChipOption(index, 'next', listboxRef.current);\n }\n } else {\n resetChipOptionFocusToInputEl(inputRef.current);\n }\n\n onRemoveChipOptionProp(o);\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const targetEl = event.target;\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (event.defaultPrevented || !listboxRef.current || !isHTMLElement(targetEl)) {\n return;\n }\n\n switch (event.key) {\n case Keys.ENTER: {\n if (\n !readOnly &&\n checkTargetIsInputEl(targetEl, inputRef.current) &&\n inputRef.current &&\n !isInputValueEmpty(inputRef.current)\n ) {\n event.preventDefault();\n onAddChipOption(inputRef.current.value);\n }\n break;\n }\n case Keys.DELETE:\n case Keys.BACKSPACE: {\n if (!readOnly && valueLength > 0) {\n if (!checkTargetIsInputEl(targetEl, inputRef.current)) {\n event.preventDefault();\n removeChipOption(\n getChipOptionValueByHTMLElement(targetEl),\n getChipOptionIndexByHTMLElement(targetEl),\n );\n } else if (event.key === Keys.BACKSPACE && isInputValueEmpty(inputRef.current)) {\n event.preventDefault();\n moveFocusToChipOption(\n getChipOptionIndexByHTMLElement(targetEl),\n 'last',\n listboxRef.current,\n );\n }\n }\n break;\n }\n case Keys.ARROW_UP:\n case Keys.ARROW_LEFT:\n case Keys.ARROW_DOWN:\n case Keys.ARROW_RIGHT: {\n if (valueLength !== 0 && !checkTargetIsInputEl(targetEl, inputRef.current)) {\n event.preventDefault();\n moveFocusToChipOption(\n getChipOptionIndexByHTMLElement(targetEl),\n getHorizontalFocusGoTo(event.key),\n listboxRef.current,\n );\n }\n break;\n }\n }\n };\n\n const handleInputBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(event);\n }\n\n if (addOnBlur && !event.defaultPrevented && inputRef.current) {\n onAddChipOption(inputRef.current.value);\n }\n };\n\n const handleChipRemove = (event: React.MouseEvent, v: ChipOptionValue) => {\n event.preventDefault();\n event.stopPropagation();\n removeChipOption(v, getChipOptionIndexByValueProp(v, value));\n };\n\n const handleRootClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (\n event.defaultPrevented ||\n contains(event.currentTarget, getActiveElementByAnotherElement(event.currentTarget))\n ) {\n return;\n }\n\n if (inputRef.current) {\n inputRef.current.focus();\n }\n };\n\n const clearButton = React.useMemo(() => {\n if (clearButtonShown) {\n return <ClearButton onClick={onClear} disabled={disabled} data-testid={clearButtonTestId} />;\n }\n return undefined;\n }, [ClearButton, clearButtonShown, clearButtonTestId, disabled, onClear]);\n\n const afterItems = React.useMemo(() => {\n if (clearButton || after) {\n return (\n <>\n {clearButton}\n {after}\n </>\n );\n }\n return undefined;\n }, [after, clearButton]);\n\n return (\n <FormField\n Component=\"div\"\n getRootRef={getRootRef}\n style={style}\n disabled={disabled}\n before={before}\n after={afterItems}\n status={status}\n mode={mode}\n className={className}\n maxHeight={maxHeight}\n onClick={disabled ? undefined : handleRootClick}\n >\n <div\n className={classNames(\n styles.host,\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n withPlaceholder && styles.hasPlaceholder,\n )}\n // для a11y\n ref={listboxRef}\n role=\"listbox\"\n aria-orientation=\"horizontal\"\n aria-disabled={disabled}\n aria-readonly={readOnly}\n onKeyDown={disabled ? undefined : handleListboxKeyDown}\n >\n {value.map((option, index) => (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderChip(\n {\n 'Component': 'div',\n 'value': option.value,\n 'label': option.label,\n 'disabled': option.disabled || disabled,\n 'readOnly': option.readOnly || readOnly,\n 'className': styles.chip,\n 'onRemove': handleChipRemove,\n // чтобы можно было легче найти этот чип в DOM\n 'data-index': index,\n 'data-value': option.value,\n // для a11y\n 'tabIndex': lastFocusedChipOptionIndex === index ? 0 : -1,\n 'role': 'option',\n 'aria-selected': true,\n 'aria-posinset': index + 1,\n 'aria-setsize': valueLength,\n },\n option,\n )}\n </React.Fragment>\n ))}\n <Text\n autoCapitalize=\"none\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n {...restProps}\n Component=\"input\"\n type=\"text\"\n id={idProp || `chips-input-base-generated-id-${idGenerated}`}\n getRootRef={inputRef}\n className={styles.el}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={withPlaceholder ? placeholder : undefined}\n value={inputValue}\n onChange={onInputChange}\n onBlur={handleInputBlur}\n />\n </div>\n </FormField>\n );\n};\n"],"names":["React","classNames","isHTMLElement","useAdaptivity","useExternRef","getHorizontalFocusGoTo","Keys","contains","checkTargetIsInputEl","getActiveElementByAnotherElement","FormField","FormFieldClearButton","Text","DEFAULT_INPUT_VALUE","DEFAULT_VALUE","renderChipDefault","getChipOptionIndexByHTMLElement","getChipOptionIndexByValueProp","getChipOptionValueByHTMLElement","getNextChipOptionIndexByNavigateToProp","isInputValueEmpty","sizeYClassNames","none","compact","ChipsInputBase","getRootRef","style","className","before","after","status","mode","maxHeight","value","onAddChipOption","onRemoveChipOption","onRemoveChipOptionProp","renderChip","getRef","id","idProp","inputValue","placeholder","disabled","readOnly","addOnBlur","onBlur","onInputChange","ClearButton","clearButtonShown","clearButtonTestId","onClear","restProps","sizeY","idGenerated","useId","inputRef","listboxRef","useRef","valueLength","length","withPlaceholder","lastFocusedChipOptionIndex","setLastFocusedChipOptionIndex","useState","resetChipOptionFocusToInputEl","inputEl","focus","moveFocusToChipOption","currentIndex","navigateTo","listboxEl","index","foundEl","querySelector","removeChipOption","o","current","handleListboxKeyDown","event","targetEl","target","defaultPrevented","key","ENTER","preventDefault","DELETE","BACKSPACE","ARROW_UP","ARROW_LEFT","ARROW_DOWN","ARROW_RIGHT","handleInputBlur","handleChipRemove","v","stopPropagation","handleRootClick","currentTarget","clearButton","useMemo","onClick","data-testid","undefined","afterItems","Component","div","ref","role","aria-orientation","aria-disabled","aria-readonly","onKeyDown","map","option","Fragment","label","autoCapitalize","autoComplete","autoCorrect","spellCheck","type","onChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ChipsInputBase/ChipsInputBase.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { getHorizontalFocusGoTo, Keys } from '../../lib/accessibility';\nimport {\n contains as checkTargetIsInputEl,\n contains,\n getActiveElementByAnotherElement,\n} from '../../lib/dom';\nimport { FormField } from '../FormField/FormField';\nimport { FormFieldClearButton } from '../FormFieldClearButton/FormFieldClearButton';\nimport { Text } from '../Typography/Text/Text';\nimport { DEFAULT_INPUT_VALUE, DEFAULT_VALUE, renderChipDefault } from './constants';\nimport {\n getChipOptionIndexByHTMLElement,\n getChipOptionIndexByValueProp,\n getChipOptionValueByHTMLElement,\n getNextChipOptionIndexByNavigateToProp,\n isInputValueEmpty,\n} from './helpers';\nimport type { ChipOption, ChipOptionValue, ChipsInputBasePrivateProps, NavigateTo } from './types';\nimport styles from './ChipsInputBase.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n} as const;\n\nexport const ChipsInputBase = <O extends ChipOption>({\n // FormFieldProps\n getRootRef,\n style,\n className,\n before,\n after,\n status,\n mode,\n maxHeight,\n\n // option\n value = DEFAULT_VALUE,\n onAddChipOption,\n onRemoveChipOption: onRemoveChipOptionProp,\n renderChip = renderChipDefault,\n\n // input\n getRef,\n id: idProp,\n inputValue = DEFAULT_INPUT_VALUE,\n placeholder,\n disabled,\n readOnly,\n addOnBlur,\n onBlur,\n onInputChange,\n\n // clear\n ClearButton = FormFieldClearButton,\n clearButtonShown,\n clearButtonTestId,\n onClear,\n ...restProps\n}: ChipsInputBasePrivateProps<O>): React.ReactNode => {\n const { sizeY = 'none' } = useAdaptivity();\n const idGenerated = React.useId();\n const inputRef = useExternRef(getRef);\n const listboxRef = React.useRef<HTMLDivElement>(null);\n\n const valueLength = value.length;\n const withPlaceholder = valueLength === 0;\n const [lastFocusedChipOptionIndex, setLastFocusedChipOptionIndex] = React.useState(0);\n\n const resetChipOptionFocusToInputEl = (inputEl: HTMLInputElement) => {\n setLastFocusedChipOptionIndex(0);\n inputEl.focus();\n };\n\n const moveFocusToChipOption = (\n currentIndex: number,\n navigateTo: NavigateTo,\n listboxEl: HTMLElement,\n ) => {\n const index = getNextChipOptionIndexByNavigateToProp(currentIndex, navigateTo, valueLength);\n // eslint-disable-next-line no-restricted-properties\n const foundEl = listboxEl.querySelector<HTMLElement>(`[data-index=\"${index}\"]`);\n\n if (foundEl) {\n setLastFocusedChipOptionIndex(index);\n foundEl.focus();\n }\n };\n\n const removeChipOption = (o: O | ChipOptionValue, index: number) => {\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!inputRef.current || !listboxRef.current) {\n return;\n }\n\n if (valueLength > 1) {\n if (index === valueLength - 1) {\n moveFocusToChipOption(index, 'prev', listboxRef.current);\n } else {\n moveFocusToChipOption(index, 'next', listboxRef.current);\n }\n } else {\n resetChipOptionFocusToInputEl(inputRef.current);\n }\n\n onRemoveChipOptionProp(o);\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const targetEl = event.target;\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (event.defaultPrevented || !listboxRef.current || !isHTMLElement(targetEl)) {\n return;\n }\n\n switch (event.key) {\n case Keys.ENTER: {\n if (\n !readOnly &&\n checkTargetIsInputEl(targetEl, inputRef.current) &&\n inputRef.current &&\n !isInputValueEmpty(inputRef.current)\n ) {\n event.preventDefault();\n onAddChipOption(inputRef.current.value);\n }\n break;\n }\n case Keys.DELETE:\n case Keys.BACKSPACE: {\n if (!readOnly && valueLength > 0) {\n if (!checkTargetIsInputEl(targetEl, inputRef.current)) {\n event.preventDefault();\n removeChipOption(\n getChipOptionValueByHTMLElement(targetEl),\n getChipOptionIndexByHTMLElement(targetEl),\n );\n } else if (event.key === Keys.BACKSPACE && isInputValueEmpty(inputRef.current)) {\n event.preventDefault();\n moveFocusToChipOption(\n getChipOptionIndexByHTMLElement(targetEl),\n 'last',\n listboxRef.current,\n );\n }\n }\n break;\n }\n case Keys.ARROW_UP:\n case Keys.ARROW_LEFT:\n case Keys.ARROW_DOWN:\n case Keys.ARROW_RIGHT: {\n if (valueLength !== 0 && !checkTargetIsInputEl(targetEl, inputRef.current)) {\n event.preventDefault();\n moveFocusToChipOption(\n getChipOptionIndexByHTMLElement(targetEl),\n getHorizontalFocusGoTo(event.key),\n listboxRef.current,\n );\n }\n break;\n }\n }\n };\n\n const handleInputBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onBlur) {\n onBlur(event);\n }\n\n if (addOnBlur && !event.defaultPrevented && inputRef.current) {\n onAddChipOption(inputRef.current.value);\n }\n };\n\n const handleChipRemove = (event: React.MouseEvent, v: ChipOptionValue) => {\n event.preventDefault();\n event.stopPropagation();\n removeChipOption(v, getChipOptionIndexByValueProp(v, value));\n };\n\n const handleRootClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (\n event.defaultPrevented ||\n contains(event.currentTarget, getActiveElementByAnotherElement(event.currentTarget))\n ) {\n return;\n }\n\n if (inputRef.current) {\n inputRef.current.focus();\n }\n };\n\n const clearButton = React.useMemo(() => {\n if (clearButtonShown) {\n return <ClearButton onClick={onClear} disabled={disabled} data-testid={clearButtonTestId} />;\n }\n return undefined;\n }, [ClearButton, clearButtonShown, clearButtonTestId, disabled, onClear]);\n\n const afterItems = React.useMemo(() => {\n if (clearButton || after) {\n return (\n <>\n {clearButton}\n {after}\n </>\n );\n }\n return undefined;\n }, [after, clearButton]);\n\n return (\n <FormField\n Component=\"div\"\n getRootRef={getRootRef}\n style={style}\n disabled={disabled}\n before={before}\n after={afterItems}\n status={status}\n mode={mode}\n className={className}\n maxHeight={maxHeight}\n onClick={disabled ? undefined : handleRootClick}\n >\n <div\n className={classNames(\n styles.host,\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n withPlaceholder && styles.hasPlaceholder,\n )}\n // для a11y\n ref={listboxRef}\n role=\"listbox\"\n aria-orientation=\"horizontal\"\n aria-disabled={disabled}\n aria-readonly={readOnly}\n onKeyDown={disabled ? undefined : handleListboxKeyDown}\n >\n {value.map((option, index) => (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderChip(\n {\n 'Component': 'div',\n 'value': option.value,\n 'label': option.label,\n 'disabled': option.disabled || disabled,\n 'readOnly': option.readOnly || readOnly,\n 'className': styles.chip,\n 'onRemove': handleChipRemove,\n // чтобы можно было легче найти этот чип в DOM\n 'data-index': index,\n 'data-value': option.value,\n 'data-value-type': typeof option.value,\n // для a11y\n 'tabIndex': lastFocusedChipOptionIndex === index ? 0 : -1,\n 'role': 'option',\n 'aria-selected': true,\n 'aria-posinset': index + 1,\n 'aria-setsize': valueLength,\n },\n option,\n )}\n </React.Fragment>\n ))}\n <Text\n autoCapitalize=\"none\"\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n {...restProps}\n Component=\"input\"\n type=\"text\"\n id={idProp || `chips-input-base-generated-id-${idGenerated}`}\n getRootRef={inputRef}\n className={styles.el}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={withPlaceholder ? placeholder : undefined}\n value={inputValue}\n onChange={onInputChange}\n onBlur={handleInputBlur}\n />\n </div>\n </FormField>\n );\n};\n"],"names":["React","classNames","isHTMLElement","useAdaptivity","useExternRef","getHorizontalFocusGoTo","Keys","contains","checkTargetIsInputEl","getActiveElementByAnotherElement","FormField","FormFieldClearButton","Text","DEFAULT_INPUT_VALUE","DEFAULT_VALUE","renderChipDefault","getChipOptionIndexByHTMLElement","getChipOptionIndexByValueProp","getChipOptionValueByHTMLElement","getNextChipOptionIndexByNavigateToProp","isInputValueEmpty","sizeYClassNames","none","compact","ChipsInputBase","getRootRef","style","className","before","after","status","mode","maxHeight","value","onAddChipOption","onRemoveChipOption","onRemoveChipOptionProp","renderChip","getRef","id","idProp","inputValue","placeholder","disabled","readOnly","addOnBlur","onBlur","onInputChange","ClearButton","clearButtonShown","clearButtonTestId","onClear","restProps","sizeY","idGenerated","useId","inputRef","listboxRef","useRef","valueLength","length","withPlaceholder","lastFocusedChipOptionIndex","setLastFocusedChipOptionIndex","useState","resetChipOptionFocusToInputEl","inputEl","focus","moveFocusToChipOption","currentIndex","navigateTo","listboxEl","index","foundEl","querySelector","removeChipOption","o","current","handleListboxKeyDown","event","targetEl","target","defaultPrevented","key","ENTER","preventDefault","DELETE","BACKSPACE","ARROW_UP","ARROW_LEFT","ARROW_DOWN","ARROW_RIGHT","handleInputBlur","handleChipRemove","v","stopPropagation","handleRootClick","currentTarget","clearButton","useMemo","onClick","data-testid","undefined","afterItems","Component","div","ref","role","aria-orientation","aria-disabled","aria-readonly","onKeyDown","map","option","Fragment","label","autoCapitalize","autoComplete","autoCorrect","spellCheck","type","onChange"],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export declare const getChipOptionIndexByHTMLElement: (el: HTMLElement | null) =
|
|
|
18
18
|
/**
|
|
19
19
|
* @private
|
|
20
20
|
*/
|
|
21
|
-
export declare const getChipOptionValueByHTMLElement: (el: HTMLElement | null) =>
|
|
21
|
+
export declare const getChipOptionValueByHTMLElement: (el: HTMLElement | null) => ChipOptionValue | -1;
|
|
22
22
|
/**
|
|
23
23
|
* @private
|
|
24
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/ChipsInputBase/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,UAAU,EAAE,GAAG,CAAC,GAAG,eAAe,KAAG,CAAC,IAAI,CACzD,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,gBAAgB,GAAG,IAAI,KAAG,OACf,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,UAAU,EAChE,YAAY,CAAC,GAAG,eAAe,EAC/B,WAAW,CAAC,EAAE,KACb,MAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,IAAI,WAAW,GAAG,IAAI,KAAG,MAGxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,IAAI,WAAW,GAAG,IAAI,KAAG,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/components/ChipsInputBase/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,CAAC,SAAS,UAAU,EAAE,GAAG,CAAC,GAAG,eAAe,KAAG,CAAC,IAAI,CACzD,CAAC;AAExC;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,gBAAgB,GAAG,IAAI,KAAG,OACf,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,6BAA6B,GAAI,CAAC,SAAS,UAAU,EAChE,YAAY,CAAC,GAAG,eAAe,EAC/B,WAAW,CAAC,EAAE,KACb,MAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,IAAI,WAAW,GAAG,IAAI,KAAG,MAGxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,IAAI,WAAW,GAAG,IAAI,KAAG,eAAe,GAAG,CAAC,CAO3F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sCAAsC,GACjD,cAAc,MAAM,EACpB,YAAY,UAAU,EACtB,QAAQ,MAAM,KACb,MAeF,CAAC"}
|
|
@@ -21,6 +21,10 @@ import { DEFAULT_INPUT_VALUE } from "./constants.js";
|
|
|
21
21
|
* @private
|
|
22
22
|
*/ export const getChipOptionValueByHTMLElement = (el)=>{
|
|
23
23
|
const value = el && el.dataset.value;
|
|
24
|
+
const valueType = el && el.dataset.valueType;
|
|
25
|
+
if (valueType === 'number') {
|
|
26
|
+
return Number(value);
|
|
27
|
+
}
|
|
24
28
|
return typeof value === 'string' ? value : -1;
|
|
25
29
|
};
|
|
26
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ChipsInputBase/helpers.ts"],"sourcesContent":["import { DEFAULT_INPUT_VALUE } from './constants';\nimport type { ChipOption, ChipOptionValue, NavigateTo } from './types';\n\n/**\n * @private\n */\nexport const isValueLikeChipOptionObject = <O extends ChipOption>(v: O | ChipOptionValue): v is O =>\n typeof v === 'object' && 'value' in v;\n\n/**\n * @private\n */\nexport const isInputValueEmpty = (input: HTMLInputElement | null): boolean =>\n input ? input.value === DEFAULT_INPUT_VALUE : true;\n\n/**\n * @private\n */\nexport const getChipOptionIndexByValueProp = <O extends ChipOption>(\n optionProp: O | ChipOptionValue,\n valueProp: O[],\n): number => {\n const value = isValueLikeChipOptionObject(optionProp) ? optionProp.value : optionProp;\n return valueProp.findIndex((option) => option.value === value);\n};\n\n/**\n * @private\n */\nexport const getChipOptionIndexByHTMLElement = (el: HTMLElement | null): number => {\n const value = el && el.dataset.index;\n return typeof value === 'string' ? Number(value) : -1;\n};\n\n/**\n * @private\n */\nexport const getChipOptionValueByHTMLElement = (el: HTMLElement | null):
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ChipsInputBase/helpers.ts"],"sourcesContent":["import { DEFAULT_INPUT_VALUE } from './constants';\nimport type { ChipOption, ChipOptionValue, NavigateTo } from './types';\n\n/**\n * @private\n */\nexport const isValueLikeChipOptionObject = <O extends ChipOption>(v: O | ChipOptionValue): v is O =>\n typeof v === 'object' && 'value' in v;\n\n/**\n * @private\n */\nexport const isInputValueEmpty = (input: HTMLInputElement | null): boolean =>\n input ? input.value === DEFAULT_INPUT_VALUE : true;\n\n/**\n * @private\n */\nexport const getChipOptionIndexByValueProp = <O extends ChipOption>(\n optionProp: O | ChipOptionValue,\n valueProp: O[],\n): number => {\n const value = isValueLikeChipOptionObject(optionProp) ? optionProp.value : optionProp;\n return valueProp.findIndex((option) => option.value === value);\n};\n\n/**\n * @private\n */\nexport const getChipOptionIndexByHTMLElement = (el: HTMLElement | null): number => {\n const value = el && el.dataset.index;\n return typeof value === 'string' ? Number(value) : -1;\n};\n\n/**\n * @private\n */\nexport const getChipOptionValueByHTMLElement = (el: HTMLElement | null): ChipOptionValue | -1 => {\n const value = el && el.dataset.value;\n const valueType = el && el.dataset.valueType;\n if (valueType === 'number') {\n return Number(value);\n }\n return typeof value === 'string' ? value : -1;\n};\n\n/**\n * @private\n */\nexport const getNextChipOptionIndexByNavigateToProp = (\n currentIndex: number,\n navigateTo: NavigateTo,\n length: number,\n): number => {\n const LAST_INDEX = length - 1;\n switch (navigateTo) {\n case 'prev':\n const prevIndex = currentIndex - 1;\n return prevIndex < 0 ? LAST_INDEX : prevIndex;\n case 'next':\n const nextIndex = currentIndex + 1;\n return nextIndex > LAST_INDEX ? 0 : nextIndex;\n case 'last':\n return LAST_INDEX;\n default:\n /* istanbul ignore next */\n return -1;\n }\n};\n"],"names":["DEFAULT_INPUT_VALUE","isValueLikeChipOptionObject","v","isInputValueEmpty","input","value","getChipOptionIndexByValueProp","optionProp","valueProp","findIndex","option","getChipOptionIndexByHTMLElement","el","dataset","index","Number","getChipOptionValueByHTMLElement","valueType","getNextChipOptionIndexByNavigateToProp","currentIndex","navigateTo","length","LAST_INDEX","prevIndex","nextIndex"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,iBAAc;AAGlD;;CAEC,GACD,OAAO,MAAMC,8BAA8B,CAAuBC,IAChE,OAAOA,MAAM,YAAY,WAAWA,EAAE;AAExC;;CAEC,GACD,OAAO,MAAMC,oBAAoB,CAACC,QAChCA,QAAQA,MAAMC,KAAK,KAAKL,sBAAsB,KAAK;AAErD;;CAEC,GACD,OAAO,MAAMM,gCAAgC,CAC3CC,YACAC;IAEA,MAAMH,QAAQJ,4BAA4BM,cAAcA,WAAWF,KAAK,GAAGE;IAC3E,OAAOC,UAAUC,SAAS,CAAC,CAACC,SAAWA,OAAOL,KAAK,KAAKA;AAC1D,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMM,kCAAkC,CAACC;IAC9C,MAAMP,QAAQO,MAAMA,GAAGC,OAAO,CAACC,KAAK;IACpC,OAAO,OAAOT,UAAU,WAAWU,OAAOV,SAAS,CAAC;AACtD,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMW,kCAAkC,CAACJ;IAC9C,MAAMP,QAAQO,MAAMA,GAAGC,OAAO,CAACR,KAAK;IACpC,MAAMY,YAAYL,MAAMA,GAAGC,OAAO,CAACI,SAAS;IAC5C,IAAIA,cAAc,UAAU;QAC1B,OAAOF,OAAOV;IAChB;IACA,OAAO,OAAOA,UAAU,WAAWA,QAAQ,CAAC;AAC9C,EAAE;AAEF;;CAEC,GACD,OAAO,MAAMa,yCAAyC,CACpDC,cACAC,YACAC;IAEA,MAAMC,aAAaD,SAAS;IAC5B,OAAQD;QACN,KAAK;YACH,MAAMG,YAAYJ,eAAe;YACjC,OAAOI,YAAY,IAAID,aAAaC;QACtC,KAAK;YACH,MAAMC,YAAYL,eAAe;YACjC,OAAOK,YAAYF,aAAa,IAAIE;QACtC,KAAK;YACH,OAAOF;QACT;YACE,wBAAwB,GACxB,OAAO,CAAC;IACZ;AACF,EAAE"}
|