@fluentui/react-datepicker-compat 0.3.13 → 0.3.15
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/CHANGELOG.json +169 -1
- package/CHANGELOG.md +43 -2
- package/lib/components/Calendar/Calendar.js +2 -4
- package/lib/components/Calendar/Calendar.js.map +1 -1
- package/lib/components/CalendarDay/CalendarDay.js +1 -2
- package/lib/components/CalendarDay/CalendarDay.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarDayGrid.js +3 -3
- package/lib/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
- package/lib/components/CalendarDayGrid/CalendarGridDayCell.js +3 -6
- package/lib/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
- package/lib/components/CalendarDayGrid/useWeeks.js +3 -4
- package/lib/components/CalendarDayGrid/useWeeks.js.map +1 -1
- package/lib/components/CalendarMonth/CalendarMonth.js +3 -5
- package/lib/components/CalendarMonth/CalendarMonth.js.map +1 -1
- package/lib/components/CalendarYear/CalendarYear.js +13 -18
- package/lib/components/CalendarYear/CalendarYear.js.map +1 -1
- package/lib/components/DatePicker/useDatePicker.js +7 -12
- package/lib/components/DatePicker/useDatePicker.js.map +1 -1
- package/lib/utils/dateGrid/getDayGrid.js +1 -2
- package/lib/utils/dateGrid/getDayGrid.js.map +1 -1
- package/lib-commonjs/components/Calendar/Calendar.js +2 -4
- package/lib-commonjs/components/Calendar/Calendar.js.map +1 -1
- package/lib-commonjs/components/CalendarDay/CalendarDay.js +1 -2
- package/lib-commonjs/components/CalendarDay/CalendarDay.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js +3 -3
- package/lib-commonjs/components/CalendarDayGrid/CalendarDayGrid.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js +3 -6
- package/lib-commonjs/components/CalendarDayGrid/CalendarGridDayCell.js.map +1 -1
- package/lib-commonjs/components/CalendarDayGrid/useWeeks.js +3 -4
- package/lib-commonjs/components/CalendarDayGrid/useWeeks.js.map +1 -1
- package/lib-commonjs/components/CalendarMonth/CalendarMonth.js +3 -4
- package/lib-commonjs/components/CalendarMonth/CalendarMonth.js.map +1 -1
- package/lib-commonjs/components/CalendarYear/CalendarYear.js +13 -18
- package/lib-commonjs/components/CalendarYear/CalendarYear.js.map +1 -1
- package/lib-commonjs/components/DatePicker/useDatePicker.js +7 -12
- package/lib-commonjs/components/DatePicker/useDatePicker.js.map +1 -1
- package/lib-commonjs/utils/dateGrid/getDayGrid.js +1 -2
- package/lib-commonjs/utils/dateGrid/getDayGrid.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["CalendarGridDayCell.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Enter } from '@fluentui/keyboard-keys';\nimport { getRTLSafeKey } from '@fluentui/react-utilities';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { mergeClasses } from '@griffel/react';\nimport { addDays, addWeeks, compareDates, findAvailableDate, DateRangeType } from '../../utils';\nimport { weekCornersClassNames } from './useWeekCornerStyles.styles';\nimport { extraCalendarDayGridClassNames } from './useCalendarDayGridStyles.styles';\nimport type { AvailableDateOptions } from '../../utils';\nimport type { DayInfo } from './CalendarDayGrid';\nimport type { CalendarGridRowProps } from './CalendarGridRow';\n\n/**\n * @internal\n */\nexport interface CalendarGridDayCellProps extends CalendarGridRowProps {\n day: DayInfo;\n dayIndex: number;\n}\n\n/**\n * @internal\n */\nexport const CalendarGridDayCell: React.FunctionComponent<CalendarGridDayCellProps> = props => {\n const {\n navigatedDate,\n dateTimeFormatter,\n allFocusable,\n strings,\n activeDescendantId,\n navigatedDayRef,\n calculateRoundedStyles,\n weeks,\n classNames,\n day,\n dayIndex,\n weekIndex,\n weekCorners,\n ariaHidden,\n customDayCellRef,\n dateRangeType,\n daysToSelectInDayView,\n onSelectDate,\n restrictedDates,\n minDate,\n maxDate,\n onNavigateDate,\n getDayInfosInRangeOfDay,\n getRefsFromDayInfos,\n } = props;\n const cornerStyle = weekCorners?.[weekIndex + '_' + dayIndex] ?? '';\n const isNavigatedDate = compareDates(navigatedDate, day.originalDate);\n\n const { dir } = useFluent_unstable();\n\n const navigateMonthEdge = (ev: React.KeyboardEvent<HTMLElement>, date: Date): void => {\n let targetDate: Date | undefined = undefined;\n let direction = 1; // by default search forward\n\n if (ev.key === ArrowUp) {\n targetDate = addWeeks(date, -1);\n direction = -1;\n } else if (ev.key === ArrowDown) {\n targetDate = addWeeks(date, 1);\n } else if (ev.key === getRTLSafeKey(ArrowLeft, dir)) {\n targetDate = addDays(date, -1);\n direction = -1;\n } else if (ev.key === getRTLSafeKey(ArrowRight, dir)) {\n targetDate = addDays(date, 1);\n }\n\n if (!targetDate) {\n // if we couldn't find a target date at all, do nothing\n return;\n }\n\n const findAvailableDateOptions: AvailableDateOptions = {\n initialDate: date,\n targetDate,\n direction,\n restrictedDates,\n minDate,\n maxDate,\n };\n\n // target date is restricted, search in whatever direction until finding the next possible date,\n // stopping at boundaries\n let nextDate = findAvailableDate(findAvailableDateOptions);\n\n if (!nextDate) {\n // if no dates available in initial direction, try going backwards\n findAvailableDateOptions.direction = -direction;\n nextDate = findAvailableDate(findAvailableDateOptions);\n }\n\n // if the nextDate is still inside the same focusZone area, let the focusZone handle setting the focus so we\n // don't jump the view unnecessarily\n const isInCurrentView =\n weeks &&\n nextDate &&\n weeks.slice(1, weeks.length - 1).some((week: DayInfo[]) => {\n return week.some((dayToCompare: DayInfo) => {\n return compareDates(dayToCompare.originalDate, nextDate!);\n });\n });\n if (isInCurrentView) {\n return;\n }\n\n // else, fire navigation on the date to change the view to show it\n if (nextDate) {\n onNavigateDate(nextDate, true);\n ev.preventDefault();\n }\n };\n\n const onMouseOverDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null, index: number) => {\n if (dayRef) {\n dayRef.classList.add(extraCalendarDayGridClassNames.hoverStyle);\n if (\n !dayInfos[index].isSelected &&\n dateRangeType === DateRangeType.Day &&\n daysToSelectInDayView &&\n daysToSelectInDayView > 1\n ) {\n // remove the static classes first to overwrite them\n dayRef.classList.remove(\n weekCornersClassNames.bottomLeftCornerDate!,\n weekCornersClassNames.bottomRightCornerDate!,\n weekCornersClassNames.topLeftCornerDate!,\n weekCornersClassNames.topRightCornerDate!,\n );\n\n const classNamesToAdd = calculateRoundedStyles(false, false, index > 0, index < dayRefs.length - 1).trim();\n if (classNamesToAdd) {\n dayRef.classList.add(...classNamesToAdd);\n }\n }\n }\n });\n };\n\n const onMouseDownDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null) => {\n if (dayRef) {\n dayRef.classList.add(extraCalendarDayGridClassNames.pressedStyle);\n }\n });\n };\n\n const onMouseUpDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null) => {\n if (dayRef) {\n dayRef.classList.remove(extraCalendarDayGridClassNames.pressedStyle);\n }\n });\n };\n\n const onMouseOutDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null, index: number) => {\n if (dayRef) {\n dayRef.classList.remove(extraCalendarDayGridClassNames.hoverStyle);\n dayRef.classList.remove(extraCalendarDayGridClassNames.pressedStyle);\n if (\n !dayInfos[index].isSelected &&\n dateRangeType === DateRangeType.Day &&\n daysToSelectInDayView &&\n daysToSelectInDayView > 1\n ) {\n const classNamesToAdd = calculateRoundedStyles(false, false, index > 0, index < dayRefs.length - 1).trim();\n if (classNamesToAdd) {\n dayRef.classList.remove(...classNamesToAdd);\n }\n }\n }\n });\n };\n\n const onDayKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => {\n if (ev.key === Enter) {\n onSelectDate?.(day.originalDate);\n } else {\n navigateMonthEdge(ev, day.originalDate);\n }\n };\n\n let ariaLabel =\n day.originalDate.getDate() +\n ', ' +\n strings.months[day.originalDate.getMonth()] +\n ', ' +\n day.originalDate.getFullYear();\n\n if (day.isMarked) {\n ariaLabel = ariaLabel + ', ' + strings.dayMarkedAriaLabel;\n }\n\n const isFocusable = !ariaHidden && (allFocusable || (day.isInBounds ? true : undefined));\n\n return (\n <td\n className={mergeClasses(\n classNames.dayCell,\n weekCorners && cornerStyle,\n day.isSelected && classNames.daySelected,\n !day.isInBounds && classNames.dayOutsideBounds,\n !day.isInMonth && classNames.dayOutsideNavigatedMonth,\n )}\n ref={(element: HTMLTableCellElement) => {\n customDayCellRef?.(element, day.originalDate, classNames);\n day.setRef(element);\n isNavigatedDate && (navigatedDayRef.current = element);\n }}\n aria-hidden={ariaHidden}\n aria-disabled={!ariaHidden && !day.isInBounds}\n onClick={day.isInBounds && !ariaHidden ? day.onSelected : undefined}\n onMouseOver={!ariaHidden ? onMouseOverDay : undefined}\n onMouseDown={!ariaHidden ? onMouseDownDay : undefined}\n onMouseUp={!ariaHidden ? onMouseUpDay : undefined}\n onMouseOut={!ariaHidden ? onMouseOutDay : undefined}\n onKeyDown={!ariaHidden ? onDayKeyDown : undefined}\n role=\"gridcell\"\n tabIndex={isNavigatedDate || isFocusable ? 0 : undefined}\n aria-current={day.isToday ? 'date' : undefined}\n aria-selected={day.isInBounds ? day.isSelected : undefined}\n >\n <button\n key={day.key + 'button'}\n aria-hidden={ariaHidden}\n className={mergeClasses(classNames.dayButton, day.isToday && classNames.dayIsToday)}\n aria-label={ariaLabel}\n id={isNavigatedDate ? activeDescendantId : undefined}\n disabled={!ariaHidden && !day.isInBounds}\n type=\"button\"\n tabIndex={-1}\n >\n <span aria-hidden=\"true\">{dateTimeFormatter.formatDay(day.originalDate)}</span>\n {day.isMarked && <div aria-hidden=\"true\" className={classNames.dayMarker} />}\n </button>\n </td>\n );\n};\n"],"names":["React","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Enter","getRTLSafeKey","useFluent_unstable","mergeClasses","addDays","addWeeks","compareDates","findAvailableDate","DateRangeType","weekCornersClassNames","extraCalendarDayGridClassNames","CalendarGridDayCell","props","weekCorners","navigatedDate","dateTimeFormatter","allFocusable","strings","activeDescendantId","navigatedDayRef","calculateRoundedStyles","weeks","classNames","day","dayIndex","weekIndex","ariaHidden","customDayCellRef","dateRangeType","daysToSelectInDayView","onSelectDate","restrictedDates","minDate","maxDate","onNavigateDate","getDayInfosInRangeOfDay","getRefsFromDayInfos","cornerStyle","isNavigatedDate","originalDate","dir","navigateMonthEdge","ev","date","targetDate","undefined","direction","key","findAvailableDateOptions","initialDate","nextDate","isInCurrentView","slice","length","some","week","dayToCompare","preventDefault","onMouseOverDay","dayInfos","dayRefs","forEach","dayRef","index","classList","add","hoverStyle","isSelected","Day","remove","bottomLeftCornerDate","bottomRightCornerDate","topLeftCornerDate","topRightCornerDate","classNamesToAdd","trim","onMouseDownDay","pressedStyle","onMouseUpDay","onMouseOutDay","onDayKeyDown","ariaLabel","getDate","months","getMonth","getFullYear","isMarked","dayMarkedAriaLabel","isFocusable","isInBounds","td","className","dayCell","daySelected","dayOutsideBounds","isInMonth","dayOutsideNavigatedMonth","ref","element","setRef","current","aria-hidden","aria-disabled","onClick","onSelected","onMouseOver","onMouseDown","onMouseUp","onMouseOut","onKeyDown","role","tabIndex","aria-current","isToday","aria-selected","button","dayButton","dayIsToday","aria-label","id","disabled","type","span","formatDay","div","dayMarker"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,SAAS,EAAEC,SAAS,EAAEC,UAAU,EAAEC,OAAO,EAAEC,KAAK,QAAQ,0BAA0B;AAC3F,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,kBAAkB,QAAQ,kCAAkC;AACrE,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,OAAO,EAAEC,QAAQ,EAAEC,YAAY,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,cAAc;AAChG,SAASC,qBAAqB,QAAQ,+BAA+B;AACrE,SAASC,8BAA8B,QAAQ,oCAAoC;AAanF;;CAEC,GACD,OAAO,MAAMC,sBAAyEC,CAAAA;QA2BhEC;IA1BpB,MAAM,EACJC,aAAa,EACbC,iBAAiB,EACjBC,YAAY,EACZC,OAAO,EACPC,kBAAkB,EAClBC,eAAe,EACfC,sBAAsB,EACtBC,KAAK,EACLC,UAAU,EACVC,GAAG,EACHC,QAAQ,EACRC,SAAS,EACTZ,WAAW,EACXa,UAAU,EACVC,gBAAgB,EAChBC,aAAa,EACbC,qBAAqB,EACrBC,YAAY,EACZC,eAAe,EACfC,OAAO,EACPC,OAAO,EACPC,cAAc,EACdC,uBAAuB,EACvBC,mBAAmB,EACpB,GAAGxB;QACgBC;IAApB,MAAMwB,cAAcxB,CAAAA,iBAAAA,eAAAA,yBAAAA,mCAAAA,YAAa,CAACY,YAAY,MAAMD,SAAS,cAAzCX,2BAAAA,gBAA6C;IACjE,MAAMyB,kBAAkBhC,aAAaQ,eAAeS,IAAIgB,YAAY;IAEpE,MAAM,EAAEC,GAAG,EAAE,GAAGtC;IAEhB,MAAMuC,oBAAoB,CAACC,IAAsCC;QAC/D,IAAIC,aAA+BC;QACnC,IAAIC,YAAY,GAAG,4BAA4B;QAE/C,IAAIJ,GAAGK,GAAG,KAAKhD,SAAS;YACtB6C,aAAavC,SAASsC,MAAM,CAAC;YAC7BG,YAAY,CAAC;QACf,OAAO,IAAIJ,GAAGK,GAAG,KAAKnD,WAAW;YAC/BgD,aAAavC,SAASsC,MAAM;QAC9B,OAAO,IAAID,GAAGK,GAAG,KAAK9C,cAAcJ,WAAW2C,MAAM;YACnDI,aAAaxC,QAAQuC,MAAM,CAAC;YAC5BG,YAAY,CAAC;QACf,OAAO,IAAIJ,GAAGK,GAAG,KAAK9C,cAAcH,YAAY0C,MAAM;YACpDI,aAAaxC,QAAQuC,MAAM;QAC7B;QAEA,IAAI,CAACC,YAAY;YACf,uDAAuD;YACvD;QACF;QAEA,MAAMI,2BAAiD;YACrDC,aAAaN;YACbC;YACAE;YACAf;YACAC;YACAC;QACF;QAEA,gGAAgG;QAChG,yBAAyB;QACzB,IAAIiB,WAAW3C,kBAAkByC;QAEjC,IAAI,CAACE,UAAU;YACb,kEAAkE;YAClEF,yBAAyBF,SAAS,GAAG,CAACA;YACtCI,WAAW3C,kBAAkByC;QAC/B;QAEA,4GAA4G;QAC5G,oCAAoC;QACpC,MAAMG,kBACJ9B,SACA6B,YACA7B,MAAM+B,KAAK,CAAC,GAAG/B,MAAMgC,MAAM,GAAG,GAAGC,IAAI,CAAC,CAACC;YACrC,OAAOA,KAAKD,IAAI,CAAC,CAACE;gBAChB,OAAOlD,aAAakD,aAAajB,YAAY,EAAEW;YACjD;QACF;QACF,IAAIC,iBAAiB;YACnB;QACF;QAEA,kEAAkE;QAClE,IAAID,UAAU;YACZhB,eAAegB,UAAU;YACzBR,GAAGe,cAAc;QACnB;IACF;IAEA,MAAMC,iBAAiB,CAAChB;QACtB,MAAMiB,WAAWxB,wBAAwBZ;QACzC,MAAMqC,UAAUxB,oBAAoBuB;QAEpCC,QAAQC,OAAO,CAAC,CAACC,QAA4BC;YAC3C,IAAID,QAAQ;gBACVA,OAAOE,SAAS,CAACC,GAAG,CAACvD,+BAA+BwD,UAAU;gBAC9D,IACE,CAACP,QAAQ,CAACI,MAAM,CAACI,UAAU,IAC3BvC,kBAAkBpB,cAAc4D,GAAG,IACnCvC,yBACAA,wBAAwB,GACxB;oBACA,oDAAoD;oBACpDiC,OAAOE,SAAS,CAACK,MAAM,CACrB5D,sBAAsB6D,oBAAoB,EAC1C7D,sBAAsB8D,qBAAqB,EAC3C9D,sBAAsB+D,iBAAiB,EACvC/D,sBAAsBgE,kBAAkB;oBAG1C,MAAMC,kBAAkBtD,uBAAuB,OAAO,OAAO2C,QAAQ,GAAGA,QAAQH,QAAQP,MAAM,GAAG,GAAGsB,IAAI;oBACxG,IAAID,iBAAiB;wBACnBZ,OAAOE,SAAS,CAACC,GAAG,IAAIS;oBAC1B;gBACF;YACF;QACF;IACF;IAEA,MAAME,iBAAiB,CAAClC;QACtB,MAAMiB,WAAWxB,wBAAwBZ;QACzC,MAAMqC,UAAUxB,oBAAoBuB;QAEpCC,QAAQC,OAAO,CAAC,CAACC;YACf,IAAIA,QAAQ;gBACVA,OAAOE,SAAS,CAACC,GAAG,CAACvD,+BAA+BmE,YAAY;YAClE;QACF;IACF;IAEA,MAAMC,eAAe,CAACpC;QACpB,MAAMiB,WAAWxB,wBAAwBZ;QACzC,MAAMqC,UAAUxB,oBAAoBuB;QAEpCC,QAAQC,OAAO,CAAC,CAACC;YACf,IAAIA,QAAQ;gBACVA,OAAOE,SAAS,CAACK,MAAM,CAAC3D,+BAA+BmE,YAAY;YACrE;QACF;IACF;IAEA,MAAME,gBAAgB,CAACrC;QACrB,MAAMiB,WAAWxB,wBAAwBZ;QACzC,MAAMqC,UAAUxB,oBAAoBuB;QAEpCC,QAAQC,OAAO,CAAC,CAACC,QAA4BC;YAC3C,IAAID,QAAQ;gBACVA,OAAOE,SAAS,CAACK,MAAM,CAAC3D,+BAA+BwD,UAAU;gBACjEJ,OAAOE,SAAS,CAACK,MAAM,CAAC3D,+BAA+BmE,YAAY;gBACnE,IACE,CAAClB,QAAQ,CAACI,MAAM,CAACI,UAAU,IAC3BvC,kBAAkBpB,cAAc4D,GAAG,IACnCvC,yBACAA,wBAAwB,GACxB;oBACA,MAAM6C,kBAAkBtD,uBAAuB,OAAO,OAAO2C,QAAQ,GAAGA,QAAQH,QAAQP,MAAM,GAAG,GAAGsB,IAAI;oBACxG,IAAID,iBAAiB;wBACnBZ,OAAOE,SAAS,CAACK,MAAM,IAAIK;oBAC7B;gBACF;YACF;QACF;IACF;IAEA,MAAMM,eAAe,CAACtC;QACpB,IAAIA,GAAGK,GAAG,KAAK/C,OAAO;gBACpB8B;aAAAA,gBAAAA,0BAAAA,oCAAAA,cAAeP,IAAIgB,YAAY;QACjC,OAAO;YACLE,kBAAkBC,IAAInB,IAAIgB,YAAY;QACxC;IACF;IAEA,IAAI0C,YACF1D,IAAIgB,YAAY,CAAC2C,OAAO,KACxB,OACAjE,QAAQkE,MAAM,CAAC5D,IAAIgB,YAAY,CAAC6C,QAAQ,GAAG,GAC3C,OACA7D,IAAIgB,YAAY,CAAC8C,WAAW;IAE9B,IAAI9D,IAAI+D,QAAQ,EAAE;QAChBL,YAAYA,YAAY,OAAOhE,QAAQsE,kBAAkB;IAC3D;IAEA,MAAMC,cAAc,CAAC9D,cAAeV,CAAAA,gBAAiBO,CAAAA,IAAIkE,UAAU,GAAG,OAAO5C,SAAQ,CAAC;IAEtF,qBACE,oBAAC6C;QACCC,WAAWxF,aACTmB,WAAWsE,OAAO,EAClB/E,eAAewB,aACfd,IAAI4C,UAAU,IAAI7C,WAAWuE,WAAW,EACxC,CAACtE,IAAIkE,UAAU,IAAInE,WAAWwE,gBAAgB,EAC9C,CAACvE,IAAIwE,SAAS,IAAIzE,WAAW0E,wBAAwB;QAEvDC,KAAK,CAACC;gBACJvE;aAAAA,oBAAAA,8BAAAA,wCAAAA,kBAAmBuE,SAAS3E,IAAIgB,YAAY,EAAEjB;YAC9CC,IAAI4E,MAAM,CAACD;YACX5D,mBAAoBnB,CAAAA,gBAAgBiF,OAAO,GAAGF,OAAM;QACtD;QACAG,eAAa3E;QACb4E,iBAAe,CAAC5E,cAAc,CAACH,IAAIkE,UAAU;QAC7Cc,SAAShF,IAAIkE,UAAU,IAAI,CAAC/D,aAAaH,IAAIiF,UAAU,GAAG3D;QAC1D4D,aAAa,CAAC/E,aAAagC,iBAAiBb;QAC5C6D,aAAa,CAAChF,aAAakD,iBAAiB/B;QAC5C8D,WAAW,CAACjF,aAAaoD,eAAejC;QACxC+D,YAAY,CAAClF,aAAaqD,gBAAgBlC;QAC1CgE,WAAW,CAACnF,aAAasD,eAAenC;QACxCiE,MAAK;QACLC,UAAUzE,mBAAmBkD,cAAc,IAAI3C;QAC/CmE,gBAAczF,IAAI0F,OAAO,GAAG,SAASpE;QACrCqE,iBAAe3F,IAAIkE,UAAU,GAAGlE,IAAI4C,UAAU,GAAGtB;qBAEjD,oBAACsE;QACCpE,KAAKxB,IAAIwB,GAAG,GAAG;QACfsD,eAAa3E;QACbiE,WAAWxF,aAAamB,WAAW8F,SAAS,EAAE7F,IAAI0F,OAAO,IAAI3F,WAAW+F,UAAU;QAClFC,cAAYrC;QACZsC,IAAIjF,kBAAkBpB,qBAAqB2B;QAC3C2E,UAAU,CAAC9F,cAAc,CAACH,IAAIkE,UAAU;QACxCgC,MAAK;QACLV,UAAU,CAAC;qBAEX,oBAACW;QAAKrB,eAAY;OAAQtF,kBAAkB4G,SAAS,CAACpG,IAAIgB,YAAY,IACrEhB,IAAI+D,QAAQ,kBAAI,oBAACsC;QAAIvB,eAAY;QAAOV,WAAWrE,WAAWuG,SAAS;;AAIhF,EAAE"}
|
|
1
|
+
{"version":3,"sources":["CalendarGridDayCell.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Enter } from '@fluentui/keyboard-keys';\nimport { getRTLSafeKey } from '@fluentui/react-utilities';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { mergeClasses } from '@griffel/react';\nimport { addDays, addWeeks, compareDates, findAvailableDate, DateRangeType } from '../../utils';\nimport { weekCornersClassNames } from './useWeekCornerStyles.styles';\nimport { extraCalendarDayGridClassNames } from './useCalendarDayGridStyles.styles';\nimport type { AvailableDateOptions } from '../../utils';\nimport type { DayInfo } from './CalendarDayGrid';\nimport type { CalendarGridRowProps } from './CalendarGridRow';\n\n/**\n * @internal\n */\nexport interface CalendarGridDayCellProps extends CalendarGridRowProps {\n day: DayInfo;\n dayIndex: number;\n}\n\n/**\n * @internal\n */\nexport const CalendarGridDayCell: React.FunctionComponent<CalendarGridDayCellProps> = props => {\n const {\n navigatedDate,\n dateTimeFormatter,\n allFocusable,\n strings,\n activeDescendantId,\n navigatedDayRef,\n calculateRoundedStyles,\n weeks,\n classNames,\n day,\n dayIndex,\n weekIndex,\n weekCorners,\n ariaHidden,\n customDayCellRef,\n dateRangeType,\n daysToSelectInDayView,\n onSelectDate,\n restrictedDates,\n minDate,\n maxDate,\n onNavigateDate,\n getDayInfosInRangeOfDay,\n getRefsFromDayInfos,\n } = props;\n const cornerStyle = weekCorners?.[weekIndex + '_' + dayIndex] ?? '';\n const isNavigatedDate = compareDates(navigatedDate, day.originalDate);\n\n const { dir } = useFluent_unstable();\n\n const navigateMonthEdge = (ev: React.KeyboardEvent<HTMLElement>, date: Date): void => {\n let targetDate: Date | undefined = undefined;\n let direction = 1; // by default search forward\n\n if (ev.key === ArrowUp) {\n targetDate = addWeeks(date, -1);\n direction = -1;\n } else if (ev.key === ArrowDown) {\n targetDate = addWeeks(date, 1);\n } else if (ev.key === getRTLSafeKey(ArrowLeft, dir)) {\n targetDate = addDays(date, -1);\n direction = -1;\n } else if (ev.key === getRTLSafeKey(ArrowRight, dir)) {\n targetDate = addDays(date, 1);\n }\n\n if (!targetDate) {\n // if we couldn't find a target date at all, do nothing\n return;\n }\n\n const findAvailableDateOptions: AvailableDateOptions = {\n initialDate: date,\n targetDate,\n direction,\n restrictedDates,\n minDate,\n maxDate,\n };\n\n // target date is restricted, search in whatever direction until finding the next possible date,\n // stopping at boundaries\n let nextDate = findAvailableDate(findAvailableDateOptions);\n\n if (!nextDate) {\n // if no dates available in initial direction, try going backwards\n findAvailableDateOptions.direction = -direction;\n nextDate = findAvailableDate(findAvailableDateOptions);\n }\n\n // if the nextDate is still inside the same focusZone area, let the focusZone handle setting the focus so we\n // don't jump the view unnecessarily\n const isInCurrentView =\n weeks &&\n nextDate &&\n weeks.slice(1, weeks.length - 1).some((week: DayInfo[]) => {\n return week.some((dayToCompare: DayInfo) => {\n return compareDates(dayToCompare.originalDate, nextDate!);\n });\n });\n if (isInCurrentView) {\n return;\n }\n\n // else, fire navigation on the date to change the view to show it\n if (nextDate) {\n onNavigateDate(nextDate, true);\n ev.preventDefault();\n }\n };\n\n const onMouseOverDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null, index: number) => {\n if (dayRef) {\n dayRef.classList.add(extraCalendarDayGridClassNames.hoverStyle);\n if (\n !dayInfos[index].isSelected &&\n dateRangeType === DateRangeType.Day &&\n daysToSelectInDayView &&\n daysToSelectInDayView > 1\n ) {\n // remove the static classes first to overwrite them\n dayRef.classList.remove(\n weekCornersClassNames.bottomLeftCornerDate!,\n weekCornersClassNames.bottomRightCornerDate!,\n weekCornersClassNames.topLeftCornerDate!,\n weekCornersClassNames.topRightCornerDate!,\n );\n\n const classNamesToAdd = calculateRoundedStyles(false, false, index > 0, index < dayRefs.length - 1).trim();\n if (classNamesToAdd) {\n dayRef.classList.add(...classNamesToAdd);\n }\n }\n }\n });\n };\n\n const onMouseDownDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null) => {\n if (dayRef) {\n dayRef.classList.add(extraCalendarDayGridClassNames.pressedStyle);\n }\n });\n };\n\n const onMouseUpDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null) => {\n if (dayRef) {\n dayRef.classList.remove(extraCalendarDayGridClassNames.pressedStyle);\n }\n });\n };\n\n const onMouseOutDay = (ev: React.MouseEvent<HTMLElement>) => {\n const dayInfos = getDayInfosInRangeOfDay(day);\n const dayRefs = getRefsFromDayInfos(dayInfos);\n\n dayRefs.forEach((dayRef: HTMLElement | null, index: number) => {\n if (dayRef) {\n dayRef.classList.remove(extraCalendarDayGridClassNames.hoverStyle);\n dayRef.classList.remove(extraCalendarDayGridClassNames.pressedStyle);\n if (\n !dayInfos[index].isSelected &&\n dateRangeType === DateRangeType.Day &&\n daysToSelectInDayView &&\n daysToSelectInDayView > 1\n ) {\n const classNamesToAdd = calculateRoundedStyles(false, false, index > 0, index < dayRefs.length - 1).trim();\n if (classNamesToAdd) {\n dayRef.classList.remove(...classNamesToAdd);\n }\n }\n }\n });\n };\n\n const onDayKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => {\n if (ev.key === Enter) {\n onSelectDate?.(day.originalDate);\n } else {\n navigateMonthEdge(ev, day.originalDate);\n }\n };\n\n let ariaLabel =\n day.originalDate.getDate() +\n ', ' +\n strings.months[day.originalDate.getMonth()] +\n ', ' +\n day.originalDate.getFullYear();\n\n if (day.isMarked) {\n ariaLabel = ariaLabel + ', ' + strings.dayMarkedAriaLabel;\n }\n\n const isFocusable = !ariaHidden && (allFocusable || (day.isInBounds ? true : undefined));\n\n return (\n <td\n className={mergeClasses(\n classNames.dayCell,\n weekCorners && cornerStyle,\n day.isSelected && classNames.daySelected,\n !day.isInBounds && classNames.dayOutsideBounds,\n !day.isInMonth && classNames.dayOutsideNavigatedMonth,\n )}\n ref={(element: HTMLTableCellElement) => {\n customDayCellRef?.(element, day.originalDate, classNames);\n day.setRef(element);\n isNavigatedDate && (navigatedDayRef.current = element);\n }}\n aria-hidden={ariaHidden}\n aria-disabled={!ariaHidden && !day.isInBounds}\n onClick={day.isInBounds && !ariaHidden ? day.onSelected : undefined}\n onMouseOver={!ariaHidden ? onMouseOverDay : undefined}\n onMouseDown={!ariaHidden ? onMouseDownDay : undefined}\n onMouseUp={!ariaHidden ? onMouseUpDay : undefined}\n onMouseOut={!ariaHidden ? onMouseOutDay : undefined}\n onKeyDown={!ariaHidden ? onDayKeyDown : undefined}\n role=\"gridcell\"\n tabIndex={isNavigatedDate || isFocusable ? 0 : undefined}\n aria-current={day.isToday ? 'date' : undefined}\n aria-selected={day.isInBounds ? day.isSelected : undefined}\n >\n <button\n key={day.key + 'button'}\n aria-hidden={ariaHidden}\n className={mergeClasses(classNames.dayButton, day.isToday && classNames.dayIsToday)}\n aria-label={ariaLabel}\n id={isNavigatedDate ? activeDescendantId : undefined}\n disabled={!ariaHidden && !day.isInBounds}\n type=\"button\"\n tabIndex={-1}\n >\n <span aria-hidden=\"true\">{dateTimeFormatter.formatDay(day.originalDate)}</span>\n {day.isMarked && <div aria-hidden=\"true\" className={classNames.dayMarker} />}\n </button>\n </td>\n );\n};\n"],"names":["React","ArrowDown","ArrowLeft","ArrowRight","ArrowUp","Enter","getRTLSafeKey","useFluent_unstable","mergeClasses","addDays","addWeeks","compareDates","findAvailableDate","DateRangeType","weekCornersClassNames","extraCalendarDayGridClassNames","CalendarGridDayCell","props","navigatedDate","dateTimeFormatter","allFocusable","strings","activeDescendantId","navigatedDayRef","calculateRoundedStyles","weeks","classNames","day","dayIndex","weekIndex","weekCorners","ariaHidden","customDayCellRef","dateRangeType","daysToSelectInDayView","onSelectDate","restrictedDates","minDate","maxDate","onNavigateDate","getDayInfosInRangeOfDay","getRefsFromDayInfos","cornerStyle","isNavigatedDate","originalDate","dir","navigateMonthEdge","ev","date","targetDate","undefined","direction","key","findAvailableDateOptions","initialDate","nextDate","isInCurrentView","slice","length","some","week","dayToCompare","preventDefault","onMouseOverDay","dayInfos","dayRefs","forEach","dayRef","index","classList","add","hoverStyle","isSelected","Day","remove","bottomLeftCornerDate","bottomRightCornerDate","topLeftCornerDate","topRightCornerDate","classNamesToAdd","trim","onMouseDownDay","pressedStyle","onMouseUpDay","onMouseOutDay","onDayKeyDown","ariaLabel","getDate","months","getMonth","getFullYear","isMarked","dayMarkedAriaLabel","isFocusable","isInBounds","td","className","dayCell","daySelected","dayOutsideBounds","isInMonth","dayOutsideNavigatedMonth","ref","element","setRef","current","aria-hidden","aria-disabled","onClick","onSelected","onMouseOver","onMouseDown","onMouseUp","onMouseOut","onKeyDown","role","tabIndex","aria-current","isToday","aria-selected","button","dayButton","dayIsToday","aria-label","id","disabled","type","span","formatDay","div","dayMarker"],"mappings":"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"}
|
|
@@ -7,11 +7,11 @@ import { compareDates, DAYS_IN_WEEK, getDayGrid } from '../../utils/index';
|
|
|
7
7
|
* Initial parsing of the given props to generate IDayInfo two dimensional array, which contains a representation
|
|
8
8
|
* of every day in the grid. Convenient for helping with conversions between day refs and Date objects in callbacks.
|
|
9
9
|
*/ const weeks = React.useMemo(()=>{
|
|
10
|
-
var _props_getMarkedDays
|
|
10
|
+
var _props_getMarkedDays;
|
|
11
11
|
const weeksGrid = getDayGrid(props);
|
|
12
12
|
const firstVisibleDay = weeksGrid[1][0].originalDate;
|
|
13
13
|
const lastVisibleDay = weeksGrid[weeksGrid.length - 1][6].originalDate;
|
|
14
|
-
const markedDays = ((_props_getMarkedDays =
|
|
14
|
+
const markedDays = ((_props_getMarkedDays = props.getMarkedDays) === null || _props_getMarkedDays === void 0 ? void 0 : _props_getMarkedDays.call(props, firstVisibleDay, lastVisibleDay)) || [];
|
|
15
15
|
/**
|
|
16
16
|
* Weeks is a 2D array. Weeks[0] contains the last week of the prior range,
|
|
17
17
|
* Weeks[weeks.length - 1] contains first week of next range. These are for transition states.
|
|
@@ -21,13 +21,12 @@ import { compareDates, DAYS_IN_WEEK, getDayGrid } from '../../utils/index';
|
|
|
21
21
|
for(let weekIndex = 0; weekIndex < weeksGrid.length; weekIndex++){
|
|
22
22
|
const week = [];
|
|
23
23
|
for(let dayIndex = 0; dayIndex < DAYS_IN_WEEK; dayIndex++){
|
|
24
|
-
var _markedDays;
|
|
25
24
|
const day = weeksGrid[weekIndex][dayIndex];
|
|
26
25
|
const dayInfo = {
|
|
27
26
|
onSelected: ()=>onSelectDate(day.originalDate),
|
|
28
27
|
setRef: getSetRefCallback(day.key),
|
|
29
28
|
...day,
|
|
30
|
-
isMarked: day.isMarked || (
|
|
29
|
+
isMarked: day.isMarked || (markedDays === null || markedDays === void 0 ? void 0 : markedDays.some((markedDay)=>compareDates(day.originalDate, markedDay)))
|
|
31
30
|
};
|
|
32
31
|
week.push(dayInfo);
|
|
33
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useWeeks.ts"],"sourcesContent":["import * as React from 'react';\nimport { compareDates, DAYS_IN_WEEK, getDayGrid } from '../../utils/index';\nimport { DayInfo } from './CalendarDayGrid';\nimport { CalendarDayGridProps } from './CalendarDayGrid.types';\n\n/**\n * @internal\n */\nexport function useWeeks(\n props: CalendarDayGridProps,\n onSelectDate: (date: Date) => void,\n getSetRefCallback: (dayKey: string) => (element: HTMLElement | null) => void,\n): DayInfo[][] {\n /**\n * Initial parsing of the given props to generate IDayInfo two dimensional array, which contains a representation\n * of every day in the grid. Convenient for helping with conversions between day refs and Date objects in callbacks.\n */\n const weeks = React.useMemo((): DayInfo[][] => {\n const weeksGrid = getDayGrid(props);\n\n const firstVisibleDay = weeksGrid[1][0].originalDate;\n const lastVisibleDay = weeksGrid[weeksGrid.length - 1][6].originalDate;\n const markedDays = props.getMarkedDays?.(firstVisibleDay, lastVisibleDay) || [];\n\n /**\n * Weeks is a 2D array. Weeks[0] contains the last week of the prior range,\n * Weeks[weeks.length - 1] contains first week of next range. These are for transition states.\n *\n * Weeks[1... weeks.length - 2] contains the actual visible data\n */\n const returnValue: DayInfo[][] = [];\n\n for (let weekIndex = 0; weekIndex < weeksGrid.length; weekIndex++) {\n const week: DayInfo[] = [];\n for (let dayIndex = 0; dayIndex < DAYS_IN_WEEK; dayIndex++) {\n const day = weeksGrid[weekIndex][dayIndex];\n const dayInfo: DayInfo = {\n onSelected: () => onSelectDate(day.originalDate),\n setRef: getSetRefCallback(day.key),\n ...day,\n isMarked: day.isMarked || markedDays?.some(markedDay => compareDates(day.originalDate, markedDay)),\n };\n\n week.push(dayInfo);\n }\n returnValue.push(week);\n }\n\n return returnValue;\n // TODO: this is missing deps on getSetRefCallback and onSelectDate (and depending on the entire\n // props object may not be a good idea due to likely frequent mutation). It would be easy to\n // fix getSetRefCallback to not mutate every render, but onSelectDate is passed down from\n // Calendar and trying to fix it requires a huge cascade of changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props]);\n\n return weeks;\n}\n"],"names":["React","compareDates","DAYS_IN_WEEK","getDayGrid","useWeeks","props","onSelectDate","getSetRefCallback","weeks","useMemo","weeksGrid","firstVisibleDay","originalDate","lastVisibleDay","length","markedDays","getMarkedDays","returnValue","weekIndex","week","dayIndex","day","dayInfo","onSelected","setRef","key","isMarked","some","markedDay","push"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAY,EAAEC,YAAY,EAAEC,UAAU,QAAQ,oBAAoB;AAI3E;;CAEC,GACD,OAAO,SAASC,SACdC,KAA2B,EAC3BC,YAAkC,EAClCC,iBAA4E;IAE5E;;;GAGC,GACD,MAAMC,QAAQR,MAAMS,OAAO,CAAC;YAKPJ
|
|
1
|
+
{"version":3,"sources":["useWeeks.ts"],"sourcesContent":["import * as React from 'react';\nimport { compareDates, DAYS_IN_WEEK, getDayGrid } from '../../utils/index';\nimport { DayInfo } from './CalendarDayGrid';\nimport { CalendarDayGridProps } from './CalendarDayGrid.types';\n\n/**\n * @internal\n */\nexport function useWeeks(\n props: CalendarDayGridProps,\n onSelectDate: (date: Date) => void,\n getSetRefCallback: (dayKey: string) => (element: HTMLElement | null) => void,\n): DayInfo[][] {\n /**\n * Initial parsing of the given props to generate IDayInfo two dimensional array, which contains a representation\n * of every day in the grid. Convenient for helping with conversions between day refs and Date objects in callbacks.\n */\n const weeks = React.useMemo((): DayInfo[][] => {\n const weeksGrid = getDayGrid(props);\n\n const firstVisibleDay = weeksGrid[1][0].originalDate;\n const lastVisibleDay = weeksGrid[weeksGrid.length - 1][6].originalDate;\n const markedDays = props.getMarkedDays?.(firstVisibleDay, lastVisibleDay) || [];\n\n /**\n * Weeks is a 2D array. Weeks[0] contains the last week of the prior range,\n * Weeks[weeks.length - 1] contains first week of next range. These are for transition states.\n *\n * Weeks[1... weeks.length - 2] contains the actual visible data\n */\n const returnValue: DayInfo[][] = [];\n\n for (let weekIndex = 0; weekIndex < weeksGrid.length; weekIndex++) {\n const week: DayInfo[] = [];\n for (let dayIndex = 0; dayIndex < DAYS_IN_WEEK; dayIndex++) {\n const day = weeksGrid[weekIndex][dayIndex];\n const dayInfo: DayInfo = {\n onSelected: () => onSelectDate(day.originalDate),\n setRef: getSetRefCallback(day.key),\n ...day,\n isMarked: day.isMarked || markedDays?.some(markedDay => compareDates(day.originalDate, markedDay)),\n };\n\n week.push(dayInfo);\n }\n returnValue.push(week);\n }\n\n return returnValue;\n // TODO: this is missing deps on getSetRefCallback and onSelectDate (and depending on the entire\n // props object may not be a good idea due to likely frequent mutation). It would be easy to\n // fix getSetRefCallback to not mutate every render, but onSelectDate is passed down from\n // Calendar and trying to fix it requires a huge cascade of changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props]);\n\n return weeks;\n}\n"],"names":["React","compareDates","DAYS_IN_WEEK","getDayGrid","useWeeks","props","onSelectDate","getSetRefCallback","weeks","useMemo","weeksGrid","firstVisibleDay","originalDate","lastVisibleDay","length","markedDays","getMarkedDays","returnValue","weekIndex","week","dayIndex","day","dayInfo","onSelected","setRef","key","isMarked","some","markedDay","push"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,YAAY,EAAEC,YAAY,EAAEC,UAAU,QAAQ,oBAAoB;AAI3E;;CAEC,GACD,OAAO,SAASC,SACdC,KAA2B,EAC3BC,YAAkC,EAClCC,iBAA4E;IAE5E;;;GAGC,GACD,MAAMC,QAAQR,MAAMS,OAAO,CAAC;YAKPJ;QAJnB,MAAMK,YAAYP,WAAWE;QAE7B,MAAMM,kBAAkBD,SAAS,CAAC,EAAE,CAAC,EAAE,CAACE,YAAY;QACpD,MAAMC,iBAAiBH,SAAS,CAACA,UAAUI,MAAM,GAAG,EAAE,CAAC,EAAE,CAACF,YAAY;QACtE,MAAMG,aAAaV,EAAAA,uBAAAA,MAAMW,aAAa,cAAnBX,2CAAAA,0BAAAA,OAAsBM,iBAAiBE,oBAAmB,EAAE;QAE/E;;;;;KAKC,GACD,MAAMI,cAA2B,EAAE;QAEnC,IAAK,IAAIC,YAAY,GAAGA,YAAYR,UAAUI,MAAM,EAAEI,YAAa;YACjE,MAAMC,OAAkB,EAAE;YAC1B,IAAK,IAAIC,WAAW,GAAGA,WAAWlB,cAAckB,WAAY;gBAC1D,MAAMC,MAAMX,SAAS,CAACQ,UAAU,CAACE,SAAS;gBAC1C,MAAME,UAAmB;oBACvBC,YAAY,IAAMjB,aAAae,IAAIT,YAAY;oBAC/CY,QAAQjB,kBAAkBc,IAAII,GAAG;oBACjC,GAAGJ,GAAG;oBACNK,UAAUL,IAAIK,QAAQ,KAAIX,uBAAAA,iCAAAA,WAAYY,IAAI,CAACC,CAAAA,YAAa3B,aAAaoB,IAAIT,YAAY,EAAEgB;gBACzF;gBAEAT,KAAKU,IAAI,CAACP;YACZ;YACAL,YAAYY,IAAI,CAACV;QACnB;QAEA,OAAOF;IACP,gGAAgG;IAChG,4FAA4F;IAC5F,yFAAyF;IACzF,oEAAoE;IACpE,uDAAuD;IACzD,GAAG;QAACZ;KAAM;IAEV,OAAOG;AACT"}
|
|
@@ -73,9 +73,8 @@ function useFocusLogic({ componentRef }) {
|
|
|
73
73
|
onNavigateDate(addYears(navigatedDate, -1), false);
|
|
74
74
|
};
|
|
75
75
|
const onSelectMonth = (newMonth)=>{
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
(_onUserHeaderSelect = onUserHeaderSelect) === null || _onUserHeaderSelect === void 0 ? void 0 : _onUserHeaderSelect();
|
|
76
|
+
// If header is clickable the calendars are overlayed, switch back to day picker when month is clicked
|
|
77
|
+
onUserHeaderSelect === null || onUserHeaderSelect === void 0 ? void 0 : onUserHeaderSelect();
|
|
79
78
|
onNavigateDate(setMonth(navigatedDate, newMonth), true);
|
|
80
79
|
};
|
|
81
80
|
const onHeaderSelect = ()=>{
|
|
@@ -83,8 +82,7 @@ function useFocusLogic({ componentRef }) {
|
|
|
83
82
|
focusOnNextUpdate();
|
|
84
83
|
setIsYearPickerVisible(true);
|
|
85
84
|
} else {
|
|
86
|
-
|
|
87
|
-
(_onUserHeaderSelect = onUserHeaderSelect) === null || _onUserHeaderSelect === void 0 ? void 0 : _onUserHeaderSelect();
|
|
85
|
+
onUserHeaderSelect === null || onUserHeaderSelect === void 0 ? void 0 : onUserHeaderSelect();
|
|
88
86
|
}
|
|
89
87
|
};
|
|
90
88
|
const onSelectYear = (selectedYear)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["CalendarMonth.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport { ArrowDownRegular, ArrowUpRegular } from '@fluentui/react-icons';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { mergeClasses } from '@griffel/react';\nimport {\n addYears,\n compareDatePart,\n getMonthEnd,\n getMonthStart,\n getYearEnd,\n getYearStart,\n setMonth,\n DEFAULT_DATE_FORMATTING,\n} from '../../utils';\nimport { CalendarYear } from '../CalendarYear/CalendarYear';\nimport { useCalendarMonthStyles_unstable } from './useCalendarMonthStyles';\nimport type { CalendarMonthProps } from './CalendarMonth.types';\nimport type { CalendarYearRange, ICalendarYear } from '../CalendarYear/CalendarYear.types';\n\nconst MONTHS_PER_ROW = 4;\n\nfunction useAnimateBackwards({ navigatedDate }: { navigatedDate: CalendarMonthProps['navigatedDate'] }) {\n const currentYear = navigatedDate.getFullYear();\n\n const previousYearRef = React.useRef<number | undefined>();\n React.useEffect(() => {\n previousYearRef.current = currentYear;\n });\n const previousYear = previousYearRef.current;\n\n if (previousYear === undefined || previousYear === currentYear) {\n return undefined;\n } else {\n return previousYear > currentYear;\n }\n}\n\nfunction useFocusLogic({ componentRef }: { componentRef: CalendarMonthProps['componentRef'] }) {\n const navigatedMonthRef = React.useRef<HTMLButtonElement>(null);\n const calendarYearRef = React.useRef<ICalendarYear>(null);\n const focusOnUpdate = React.useRef(false);\n\n const focus = React.useCallback(() => {\n if (calendarYearRef.current) {\n calendarYearRef.current.focus();\n } else if (navigatedMonthRef.current) {\n navigatedMonthRef.current.focus();\n }\n }, []);\n\n React.useImperativeHandle(componentRef, () => ({ focus }), [focus]);\n\n React.useEffect(() => {\n if (focusOnUpdate.current) {\n focus();\n focusOnUpdate.current = false;\n }\n });\n\n const focusOnNextUpdate = () => {\n focusOnUpdate.current = true;\n };\n\n return [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] as const;\n}\n\n/**\n * @internal\n */\nexport const CalendarMonth: React.FunctionComponent<CalendarMonthProps> = props => {\n const {\n allFocusable,\n animationDirection,\n className,\n componentRef,\n dateTimeFormatter = DEFAULT_DATE_FORMATTING,\n highlightCurrentMonth,\n highlightSelectedMonth,\n maxDate,\n minDate,\n navigatedDate,\n onHeaderSelect: onUserHeaderSelect,\n onNavigateDate,\n selectedDate,\n strings,\n today = new Date(),\n yearPickerHidden = false,\n } = props;\n\n const [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] = useFocusLogic({ componentRef });\n const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);\n\n const animateBackwards = useAnimateBackwards({ navigatedDate });\n\n const selectMonthCallback = (newMonth: number): (() => void) => {\n return () => onSelectMonth(newMonth);\n };\n\n const onSelectNextYear = (): void => {\n onNavigateDate(addYears(navigatedDate, 1), false);\n };\n\n const onSelectPrevYear = (): void => {\n onNavigateDate(addYears(navigatedDate, -1), false);\n };\n\n const onSelectMonth = (newMonth: number): void => {\n // If header is clickable the calendars are overlayed, switch back to day picker when month is clicked\n onUserHeaderSelect?.();\n onNavigateDate(setMonth(navigatedDate, newMonth), true);\n };\n\n const onHeaderSelect = (): void => {\n if (!yearPickerHidden) {\n focusOnNextUpdate();\n setIsYearPickerVisible(true);\n } else {\n onUserHeaderSelect?.();\n }\n };\n\n const onSelectYear = (selectedYear: number) => {\n focusOnNextUpdate();\n const navYear = navigatedDate.getFullYear();\n if (navYear !== selectedYear) {\n let newNavigationDate = new Date(navigatedDate.getTime());\n newNavigationDate.setFullYear(selectedYear);\n // for min and max dates, adjust the new navigation date - perhaps this should be\n // checked on the master navigation date handler (i.e. in Calendar)\n if (maxDate && newNavigationDate > maxDate) {\n newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());\n } else if (minDate && newNavigationDate < minDate) {\n newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());\n }\n onNavigateDate(newNavigationDate, true);\n }\n setIsYearPickerVisible(false);\n };\n\n const onYearPickerHeaderSelect = (focus: boolean): void => {\n focusOnNextUpdate();\n setIsYearPickerVisible(false);\n };\n\n const dateFormatter = dateTimeFormatter!;\n\n // determine if previous/next years are in bounds\n const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;\n const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;\n\n const classNames = useCalendarMonthStyles_unstable({\n className,\n hasHeaderClickCallback: !!onUserHeaderSelect || !yearPickerHidden,\n highlightCurrent: highlightCurrentMonth,\n highlightSelected: highlightSelectedMonth,\n animateBackwards,\n animationDirection,\n });\n\n const { dir } = useFluent_unstable();\n const arrowNavigationAttributes = useArrowNavigationGroup({ axis: 'both' });\n\n if (isYearPickerVisible) {\n const [onRenderYear, yearStrings] = getYearStrings({ dateTimeFormatter, navigatedDate, strings });\n // use navigated date for the year picker\n return (\n <CalendarYear\n key={'calendarYear'}\n minYear={minDate ? minDate.getFullYear() : undefined}\n maxYear={maxDate ? maxDate.getFullYear() : undefined}\n // eslint-disable-next-line react/jsx-no-bind\n onSelectYear={onSelectYear}\n // eslint-disable-next-line react/jsx-no-bind\n onHeaderSelect={onYearPickerHeaderSelect}\n selectedYear={\n selectedDate ? selectedDate.getFullYear() : navigatedDate ? navigatedDate.getFullYear() : undefined\n }\n navigatedYear={navigatedDate.getFullYear()}\n onRenderYear={onRenderYear}\n strings={yearStrings}\n componentRef={calendarYearRef}\n highlightCurrentYear={highlightCurrentMonth}\n highlightSelectedYear={highlightSelectedMonth}\n animationDirection={animationDirection}\n />\n );\n }\n\n const rowIndexes = [];\n for (let i = 0; i < strings.shortMonths.length / MONTHS_PER_ROW; i++) {\n rowIndexes.push(i);\n }\n\n const yearString = dateFormatter.formatYear(navigatedDate);\n const headerAriaLabel = strings.monthPickerHeaderAriaLabel\n ? strings.monthPickerHeaderAriaLabel.replace('{0}', yearString)\n : yearString;\n\n return (\n <div className={classNames.root}>\n <div className={classNames.headerContainer}>\n <button\n className={classNames.currentItemButton}\n onClick={onHeaderSelect}\n onKeyDown={onButtonKeyDown(onHeaderSelect)}\n aria-label={headerAriaLabel}\n tabIndex={!!onUserHeaderSelect || !yearPickerHidden ? 0 : -1}\n type=\"button\"\n >\n <span aria-live=\"polite\" aria-atomic=\"true\">\n {yearString}\n </span>\n </button>\n <div className={classNames.navigationButtonsContainer}>\n <button\n className={mergeClasses(classNames.navigationButton, !isPrevYearInBounds && classNames.disabled)}\n aria-disabled={!isPrevYearInBounds}\n tabIndex={isPrevYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isPrevYearInBounds ? onSelectPrevYear : undefined}\n onKeyDown={isPrevYearInBounds ? onButtonKeyDown(onSelectPrevYear) : undefined}\n title={\n strings.prevYearAriaLabel\n ? strings.prevYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, -1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowUpRegular /> : <ArrowDownRegular />}\n </button>\n <button\n className={mergeClasses(classNames.navigationButton, !isNextYearInBounds && classNames.disabled)}\n aria-disabled={!isNextYearInBounds}\n tabIndex={isNextYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isNextYearInBounds ? onSelectNextYear : undefined}\n onKeyDown={isNextYearInBounds ? onButtonKeyDown(onSelectNextYear) : undefined}\n title={\n strings.nextYearAriaLabel\n ? strings.nextYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, 1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowDownRegular /> : <ArrowUpRegular />}\n </button>\n </div>\n </div>\n <div {...arrowNavigationAttributes} className={classNames.gridContainer} role=\"grid\" aria-label={yearString}>\n {rowIndexes.map((rowNum: number) => {\n const monthsForRow = strings!.shortMonths.slice(rowNum * MONTHS_PER_ROW, (rowNum + 1) * MONTHS_PER_ROW);\n return (\n <div key={'monthRow_' + rowNum + navigatedDate.getFullYear()} role=\"row\" className={classNames.buttonRow}>\n {monthsForRow.map((month: string, index: number) => {\n const monthIndex = rowNum * MONTHS_PER_ROW + index;\n const indexedMonth = setMonth(navigatedDate, monthIndex);\n const isNavigatedMonth = navigatedDate.getMonth() === monthIndex;\n const isSelectedMonth = selectedDate.getMonth() === monthIndex;\n const isSelectedYear = selectedDate.getFullYear() === navigatedDate.getFullYear();\n const isInBounds =\n (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) &&\n (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true);\n\n return (\n <button\n ref={isNavigatedMonth ? navigatedMonthRef : undefined}\n role={'gridcell'}\n className={mergeClasses(\n classNames.itemButton,\n highlightCurrentMonth &&\n isCurrentMonth(monthIndex, navigatedDate.getFullYear(), today) &&\n classNames.current,\n highlightSelectedMonth && isSelectedMonth && isSelectedYear && classNames.selected,\n !isInBounds && classNames.disabled,\n )}\n disabled={!allFocusable && !isInBounds}\n key={monthIndex}\n onClick={isInBounds ? selectMonthCallback(monthIndex) : undefined}\n onKeyDown={isInBounds ? onButtonKeyDown(selectMonthCallback(monthIndex)) : undefined}\n aria-label={dateFormatter.formatMonth(indexedMonth, strings!)}\n aria-selected={isNavigatedMonth}\n tabIndex={isInBounds ? 0 : -1}\n type=\"button\"\n >\n {month}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nCalendarMonth.displayName = 'CalendarMonth';\n\nfunction getYearStrings({\n dateTimeFormatter,\n navigatedDate,\n strings,\n}: Pick<CalendarMonthProps, 'dateTimeFormatter' | 'navigatedDate' | 'strings'>) {\n const yearToString = (year: number) => {\n if (dateTimeFormatter) {\n // create a date based on the current nav date\n const yearFormattingDate = new Date(navigatedDate.getTime());\n yearFormattingDate.setFullYear(year);\n return dateTimeFormatter.formatYear(yearFormattingDate);\n }\n return String(year);\n };\n\n const yearRangeToString = (yearRange: CalendarYearRange) => {\n return `${yearToString(yearRange.fromYear)} - ${yearToString(yearRange.toYear)}`;\n };\n\n const yearRangeToNextDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.nextYearRangeAriaLabel ? `${strings.nextYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n const yearRangeToPrevDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.prevYearRangeAriaLabel ? `${strings.prevYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n return [\n yearToString,\n {\n rangeAriaLabel: yearRangeToString,\n prevRangeAriaLabel: yearRangeToPrevDecadeLabel,\n nextRangeAriaLabel: yearRangeToNextDecadeLabel,\n headerAriaLabelFormatString: strings.yearPickerHeaderAriaLabel,\n } as const,\n ] as const;\n}\n\nfunction isCurrentMonth(month: number, year: number, today: Date): boolean {\n return today.getFullYear() === year && today.getMonth() === month;\n}\n\nfunction onButtonKeyDown(callback: () => void): (ev: React.KeyboardEvent<HTMLButtonElement>) => void {\n return (ev: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (ev.key) {\n case Enter:\n callback();\n break;\n }\n };\n}\n"],"names":["React","Enter","ArrowDownRegular","ArrowUpRegular","useFluent_unstable","useArrowNavigationGroup","mergeClasses","addYears","compareDatePart","getMonthEnd","getMonthStart","getYearEnd","getYearStart","setMonth","DEFAULT_DATE_FORMATTING","CalendarYear","useCalendarMonthStyles_unstable","MONTHS_PER_ROW","useAnimateBackwards","navigatedDate","currentYear","getFullYear","previousYearRef","useRef","useEffect","current","previousYear","undefined","useFocusLogic","componentRef","navigatedMonthRef","calendarYearRef","focusOnUpdate","focus","useCallback","useImperativeHandle","focusOnNextUpdate","CalendarMonth","props","allFocusable","animationDirection","className","dateTimeFormatter","highlightCurrentMonth","highlightSelectedMonth","maxDate","minDate","onHeaderSelect","onUserHeaderSelect","onNavigateDate","selectedDate","strings","today","Date","yearPickerHidden","isYearPickerVisible","setIsYearPickerVisible","useState","animateBackwards","selectMonthCallback","newMonth","onSelectMonth","onSelectNextYear","onSelectPrevYear","onSelectYear","selectedYear","navYear","newNavigationDate","getTime","setFullYear","getMonth","onYearPickerHeaderSelect","dateFormatter","isPrevYearInBounds","isNextYearInBounds","classNames","hasHeaderClickCallback","highlightCurrent","highlightSelected","dir","arrowNavigationAttributes","axis","onRenderYear","yearStrings","getYearStrings","key","minYear","maxYear","navigatedYear","highlightCurrentYear","highlightSelectedYear","rowIndexes","i","shortMonths","length","push","yearString","formatYear","headerAriaLabel","monthPickerHeaderAriaLabel","replace","div","root","headerContainer","button","currentItemButton","onClick","onKeyDown","onButtonKeyDown","aria-label","tabIndex","type","span","aria-live","aria-atomic","navigationButtonsContainer","navigationButton","disabled","aria-disabled","title","prevYearAriaLabel","nextYearAriaLabel","gridContainer","role","map","rowNum","monthsForRow","slice","buttonRow","month","index","monthIndex","indexedMonth","isNavigatedMonth","isSelectedMonth","isSelectedYear","isInBounds","ref","itemButton","isCurrentMonth","selected","formatMonth","aria-selected","displayName","yearToString","year","yearFormattingDate","String","yearRangeToString","yearRange","fromYear","toYear","yearRangeToNextDecadeLabel","nextYearRangeAriaLabel","yearRangeToPrevDecadeLabel","prevYearRangeAriaLabel","rangeAriaLabel","prevRangeAriaLabel","nextRangeAriaLabel","headerAriaLabelFormatString","yearPickerHeaderAriaLabel","callback","ev"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["CalendarMonth.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Enter } from '@fluentui/keyboard-keys';\nimport { ArrowDownRegular, ArrowUpRegular } from '@fluentui/react-icons';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { mergeClasses } from '@griffel/react';\nimport {\n addYears,\n compareDatePart,\n getMonthEnd,\n getMonthStart,\n getYearEnd,\n getYearStart,\n setMonth,\n DEFAULT_DATE_FORMATTING,\n} from '../../utils';\nimport { CalendarYear } from '../CalendarYear/CalendarYear';\nimport { useCalendarMonthStyles_unstable } from './useCalendarMonthStyles';\nimport type { CalendarMonthProps } from './CalendarMonth.types';\nimport type { CalendarYearRange, ICalendarYear } from '../CalendarYear/CalendarYear.types';\n\nconst MONTHS_PER_ROW = 4;\n\nfunction useAnimateBackwards({ navigatedDate }: { navigatedDate: CalendarMonthProps['navigatedDate'] }) {\n const currentYear = navigatedDate.getFullYear();\n\n const previousYearRef = React.useRef<number | undefined>();\n React.useEffect(() => {\n previousYearRef.current = currentYear;\n });\n const previousYear = previousYearRef.current;\n\n if (previousYear === undefined || previousYear === currentYear) {\n return undefined;\n } else {\n return previousYear > currentYear;\n }\n}\n\nfunction useFocusLogic({ componentRef }: { componentRef: CalendarMonthProps['componentRef'] }) {\n const navigatedMonthRef = React.useRef<HTMLButtonElement>(null);\n const calendarYearRef = React.useRef<ICalendarYear>(null);\n const focusOnUpdate = React.useRef(false);\n\n const focus = React.useCallback(() => {\n if (calendarYearRef.current) {\n calendarYearRef.current.focus();\n } else if (navigatedMonthRef.current) {\n navigatedMonthRef.current.focus();\n }\n }, []);\n\n React.useImperativeHandle(componentRef, () => ({ focus }), [focus]);\n\n React.useEffect(() => {\n if (focusOnUpdate.current) {\n focus();\n focusOnUpdate.current = false;\n }\n });\n\n const focusOnNextUpdate = () => {\n focusOnUpdate.current = true;\n };\n\n return [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] as const;\n}\n\n/**\n * @internal\n */\nexport const CalendarMonth: React.FunctionComponent<CalendarMonthProps> = props => {\n const {\n allFocusable,\n animationDirection,\n className,\n componentRef,\n dateTimeFormatter = DEFAULT_DATE_FORMATTING,\n highlightCurrentMonth,\n highlightSelectedMonth,\n maxDate,\n minDate,\n navigatedDate,\n onHeaderSelect: onUserHeaderSelect,\n onNavigateDate,\n selectedDate,\n strings,\n today = new Date(),\n yearPickerHidden = false,\n } = props;\n\n const [navigatedMonthRef, calendarYearRef, focusOnNextUpdate] = useFocusLogic({ componentRef });\n const [isYearPickerVisible, setIsYearPickerVisible] = React.useState(false);\n\n const animateBackwards = useAnimateBackwards({ navigatedDate });\n\n const selectMonthCallback = (newMonth: number): (() => void) => {\n return () => onSelectMonth(newMonth);\n };\n\n const onSelectNextYear = (): void => {\n onNavigateDate(addYears(navigatedDate, 1), false);\n };\n\n const onSelectPrevYear = (): void => {\n onNavigateDate(addYears(navigatedDate, -1), false);\n };\n\n const onSelectMonth = (newMonth: number): void => {\n // If header is clickable the calendars are overlayed, switch back to day picker when month is clicked\n onUserHeaderSelect?.();\n onNavigateDate(setMonth(navigatedDate, newMonth), true);\n };\n\n const onHeaderSelect = (): void => {\n if (!yearPickerHidden) {\n focusOnNextUpdate();\n setIsYearPickerVisible(true);\n } else {\n onUserHeaderSelect?.();\n }\n };\n\n const onSelectYear = (selectedYear: number) => {\n focusOnNextUpdate();\n const navYear = navigatedDate.getFullYear();\n if (navYear !== selectedYear) {\n let newNavigationDate = new Date(navigatedDate.getTime());\n newNavigationDate.setFullYear(selectedYear);\n // for min and max dates, adjust the new navigation date - perhaps this should be\n // checked on the master navigation date handler (i.e. in Calendar)\n if (maxDate && newNavigationDate > maxDate) {\n newNavigationDate = setMonth(newNavigationDate, maxDate.getMonth());\n } else if (minDate && newNavigationDate < minDate) {\n newNavigationDate = setMonth(newNavigationDate, minDate.getMonth());\n }\n onNavigateDate(newNavigationDate, true);\n }\n setIsYearPickerVisible(false);\n };\n\n const onYearPickerHeaderSelect = (focus: boolean): void => {\n focusOnNextUpdate();\n setIsYearPickerVisible(false);\n };\n\n const dateFormatter = dateTimeFormatter!;\n\n // determine if previous/next years are in bounds\n const isPrevYearInBounds = minDate ? compareDatePart(minDate, getYearStart(navigatedDate)) < 0 : true;\n const isNextYearInBounds = maxDate ? compareDatePart(getYearEnd(navigatedDate), maxDate) < 0 : true;\n\n const classNames = useCalendarMonthStyles_unstable({\n className,\n hasHeaderClickCallback: !!onUserHeaderSelect || !yearPickerHidden,\n highlightCurrent: highlightCurrentMonth,\n highlightSelected: highlightSelectedMonth,\n animateBackwards,\n animationDirection,\n });\n\n const { dir } = useFluent_unstable();\n const arrowNavigationAttributes = useArrowNavigationGroup({ axis: 'both' });\n\n if (isYearPickerVisible) {\n const [onRenderYear, yearStrings] = getYearStrings({ dateTimeFormatter, navigatedDate, strings });\n // use navigated date for the year picker\n return (\n <CalendarYear\n key={'calendarYear'}\n minYear={minDate ? minDate.getFullYear() : undefined}\n maxYear={maxDate ? maxDate.getFullYear() : undefined}\n // eslint-disable-next-line react/jsx-no-bind\n onSelectYear={onSelectYear}\n // eslint-disable-next-line react/jsx-no-bind\n onHeaderSelect={onYearPickerHeaderSelect}\n selectedYear={\n selectedDate ? selectedDate.getFullYear() : navigatedDate ? navigatedDate.getFullYear() : undefined\n }\n navigatedYear={navigatedDate.getFullYear()}\n onRenderYear={onRenderYear}\n strings={yearStrings}\n componentRef={calendarYearRef}\n highlightCurrentYear={highlightCurrentMonth}\n highlightSelectedYear={highlightSelectedMonth}\n animationDirection={animationDirection}\n />\n );\n }\n\n const rowIndexes = [];\n for (let i = 0; i < strings.shortMonths.length / MONTHS_PER_ROW; i++) {\n rowIndexes.push(i);\n }\n\n const yearString = dateFormatter.formatYear(navigatedDate);\n const headerAriaLabel = strings.monthPickerHeaderAriaLabel\n ? strings.monthPickerHeaderAriaLabel.replace('{0}', yearString)\n : yearString;\n\n return (\n <div className={classNames.root}>\n <div className={classNames.headerContainer}>\n <button\n className={classNames.currentItemButton}\n onClick={onHeaderSelect}\n onKeyDown={onButtonKeyDown(onHeaderSelect)}\n aria-label={headerAriaLabel}\n tabIndex={!!onUserHeaderSelect || !yearPickerHidden ? 0 : -1}\n type=\"button\"\n >\n <span aria-live=\"polite\" aria-atomic=\"true\">\n {yearString}\n </span>\n </button>\n <div className={classNames.navigationButtonsContainer}>\n <button\n className={mergeClasses(classNames.navigationButton, !isPrevYearInBounds && classNames.disabled)}\n aria-disabled={!isPrevYearInBounds}\n tabIndex={isPrevYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isPrevYearInBounds ? onSelectPrevYear : undefined}\n onKeyDown={isPrevYearInBounds ? onButtonKeyDown(onSelectPrevYear) : undefined}\n title={\n strings.prevYearAriaLabel\n ? strings.prevYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, -1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowUpRegular /> : <ArrowDownRegular />}\n </button>\n <button\n className={mergeClasses(classNames.navigationButton, !isNextYearInBounds && classNames.disabled)}\n aria-disabled={!isNextYearInBounds}\n tabIndex={isNextYearInBounds ? undefined : allFocusable ? 0 : -1}\n onClick={isNextYearInBounds ? onSelectNextYear : undefined}\n onKeyDown={isNextYearInBounds ? onButtonKeyDown(onSelectNextYear) : undefined}\n title={\n strings.nextYearAriaLabel\n ? strings.nextYearAriaLabel + ' ' + dateFormatter.formatYear(addYears(navigatedDate, 1))\n : undefined\n }\n type=\"button\"\n >\n {dir === 'ltr' ? <ArrowDownRegular /> : <ArrowUpRegular />}\n </button>\n </div>\n </div>\n <div {...arrowNavigationAttributes} className={classNames.gridContainer} role=\"grid\" aria-label={yearString}>\n {rowIndexes.map((rowNum: number) => {\n const monthsForRow = strings!.shortMonths.slice(rowNum * MONTHS_PER_ROW, (rowNum + 1) * MONTHS_PER_ROW);\n return (\n <div key={'monthRow_' + rowNum + navigatedDate.getFullYear()} role=\"row\" className={classNames.buttonRow}>\n {monthsForRow.map((month: string, index: number) => {\n const monthIndex = rowNum * MONTHS_PER_ROW + index;\n const indexedMonth = setMonth(navigatedDate, monthIndex);\n const isNavigatedMonth = navigatedDate.getMonth() === monthIndex;\n const isSelectedMonth = selectedDate.getMonth() === monthIndex;\n const isSelectedYear = selectedDate.getFullYear() === navigatedDate.getFullYear();\n const isInBounds =\n (minDate ? compareDatePart(minDate, getMonthEnd(indexedMonth)) < 1 : true) &&\n (maxDate ? compareDatePart(getMonthStart(indexedMonth), maxDate) < 1 : true);\n\n return (\n <button\n ref={isNavigatedMonth ? navigatedMonthRef : undefined}\n role={'gridcell'}\n className={mergeClasses(\n classNames.itemButton,\n highlightCurrentMonth &&\n isCurrentMonth(monthIndex, navigatedDate.getFullYear(), today) &&\n classNames.current,\n highlightSelectedMonth && isSelectedMonth && isSelectedYear && classNames.selected,\n !isInBounds && classNames.disabled,\n )}\n disabled={!allFocusable && !isInBounds}\n key={monthIndex}\n onClick={isInBounds ? selectMonthCallback(monthIndex) : undefined}\n onKeyDown={isInBounds ? onButtonKeyDown(selectMonthCallback(monthIndex)) : undefined}\n aria-label={dateFormatter.formatMonth(indexedMonth, strings!)}\n aria-selected={isNavigatedMonth}\n tabIndex={isInBounds ? 0 : -1}\n type=\"button\"\n >\n {month}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nCalendarMonth.displayName = 'CalendarMonth';\n\nfunction getYearStrings({\n dateTimeFormatter,\n navigatedDate,\n strings,\n}: Pick<CalendarMonthProps, 'dateTimeFormatter' | 'navigatedDate' | 'strings'>) {\n const yearToString = (year: number) => {\n if (dateTimeFormatter) {\n // create a date based on the current nav date\n const yearFormattingDate = new Date(navigatedDate.getTime());\n yearFormattingDate.setFullYear(year);\n return dateTimeFormatter.formatYear(yearFormattingDate);\n }\n return String(year);\n };\n\n const yearRangeToString = (yearRange: CalendarYearRange) => {\n return `${yearToString(yearRange.fromYear)} - ${yearToString(yearRange.toYear)}`;\n };\n\n const yearRangeToNextDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.nextYearRangeAriaLabel ? `${strings.nextYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n const yearRangeToPrevDecadeLabel = (yearRange: CalendarYearRange) => {\n return strings.prevYearRangeAriaLabel ? `${strings.prevYearRangeAriaLabel} ${yearRangeToString(yearRange)}` : '';\n };\n\n return [\n yearToString,\n {\n rangeAriaLabel: yearRangeToString,\n prevRangeAriaLabel: yearRangeToPrevDecadeLabel,\n nextRangeAriaLabel: yearRangeToNextDecadeLabel,\n headerAriaLabelFormatString: strings.yearPickerHeaderAriaLabel,\n } as const,\n ] as const;\n}\n\nfunction isCurrentMonth(month: number, year: number, today: Date): boolean {\n return today.getFullYear() === year && today.getMonth() === month;\n}\n\nfunction onButtonKeyDown(callback: () => void): (ev: React.KeyboardEvent<HTMLButtonElement>) => void {\n return (ev: React.KeyboardEvent<HTMLButtonElement>) => {\n switch (ev.key) {\n case Enter:\n callback();\n break;\n }\n };\n}\n"],"names":["React","Enter","ArrowDownRegular","ArrowUpRegular","useFluent_unstable","useArrowNavigationGroup","mergeClasses","addYears","compareDatePart","getMonthEnd","getMonthStart","getYearEnd","getYearStart","setMonth","DEFAULT_DATE_FORMATTING","CalendarYear","useCalendarMonthStyles_unstable","MONTHS_PER_ROW","useAnimateBackwards","navigatedDate","currentYear","getFullYear","previousYearRef","useRef","useEffect","current","previousYear","undefined","useFocusLogic","componentRef","navigatedMonthRef","calendarYearRef","focusOnUpdate","focus","useCallback","useImperativeHandle","focusOnNextUpdate","CalendarMonth","props","allFocusable","animationDirection","className","dateTimeFormatter","highlightCurrentMonth","highlightSelectedMonth","maxDate","minDate","onHeaderSelect","onUserHeaderSelect","onNavigateDate","selectedDate","strings","today","Date","yearPickerHidden","isYearPickerVisible","setIsYearPickerVisible","useState","animateBackwards","selectMonthCallback","newMonth","onSelectMonth","onSelectNextYear","onSelectPrevYear","onSelectYear","selectedYear","navYear","newNavigationDate","getTime","setFullYear","getMonth","onYearPickerHeaderSelect","dateFormatter","isPrevYearInBounds","isNextYearInBounds","classNames","hasHeaderClickCallback","highlightCurrent","highlightSelected","dir","arrowNavigationAttributes","axis","onRenderYear","yearStrings","getYearStrings","key","minYear","maxYear","navigatedYear","highlightCurrentYear","highlightSelectedYear","rowIndexes","i","shortMonths","length","push","yearString","formatYear","headerAriaLabel","monthPickerHeaderAriaLabel","replace","div","root","headerContainer","button","currentItemButton","onClick","onKeyDown","onButtonKeyDown","aria-label","tabIndex","type","span","aria-live","aria-atomic","navigationButtonsContainer","navigationButton","disabled","aria-disabled","title","prevYearAriaLabel","nextYearAriaLabel","gridContainer","role","map","rowNum","monthsForRow","slice","buttonRow","month","index","monthIndex","indexedMonth","isNavigatedMonth","isSelectedMonth","isSelectedYear","isInBounds","ref","itemButton","isCurrentMonth","selected","formatMonth","aria-selected","displayName","yearToString","year","yearFormattingDate","String","yearRangeToString","yearRange","fromYear","toYear","yearRangeToNextDecadeLabel","nextYearRangeAriaLabel","yearRangeToPrevDecadeLabel","prevYearRangeAriaLabel","rangeAriaLabel","prevRangeAriaLabel","nextRangeAriaLabel","headerAriaLabelFormatString","yearPickerHeaderAriaLabel","callback","ev"],"mappings":"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"}
|
|
@@ -12,7 +12,6 @@ const DefaultCalendarYearStrings = {
|
|
|
12
12
|
nextRangeAriaLabel: undefined
|
|
13
13
|
};
|
|
14
14
|
const CalendarYearGridCell = (props)=>{
|
|
15
|
-
var _onRenderYear;
|
|
16
15
|
const { className, highlightCurrentYear, highlightSelectedYear, year, selected, disabled, componentRef, onSelectYear, onRenderYear } = props;
|
|
17
16
|
const buttonRef = React.useRef(null);
|
|
18
17
|
React.useImperativeHandle(componentRef, ()=>({
|
|
@@ -22,13 +21,11 @@ const CalendarYearGridCell = (props)=>{
|
|
|
22
21
|
}
|
|
23
22
|
}), []);
|
|
24
23
|
const onClick = ()=>{
|
|
25
|
-
|
|
26
|
-
(_onSelectYear = onSelectYear) === null || _onSelectYear === void 0 ? void 0 : _onSelectYear(year);
|
|
24
|
+
onSelectYear === null || onSelectYear === void 0 ? void 0 : onSelectYear(year);
|
|
27
25
|
};
|
|
28
26
|
const onKeyDown = (ev)=>{
|
|
29
27
|
if (ev.key === Enter) {
|
|
30
|
-
|
|
31
|
-
(_onSelectYear = onSelectYear) === null || _onSelectYear === void 0 ? void 0 : _onSelectYear(year);
|
|
28
|
+
onSelectYear === null || onSelectYear === void 0 ? void 0 : onSelectYear(year);
|
|
32
29
|
}
|
|
33
30
|
};
|
|
34
31
|
const classNames = useCalendarYearStyles_unstable({
|
|
@@ -36,7 +33,7 @@ const CalendarYearGridCell = (props)=>{
|
|
|
36
33
|
highlightCurrent: highlightCurrentYear,
|
|
37
34
|
highlightSelected: highlightSelectedYear
|
|
38
35
|
});
|
|
39
|
-
var
|
|
36
|
+
var _onRenderYear;
|
|
40
37
|
return /*#__PURE__*/ React.createElement("button", {
|
|
41
38
|
className: mergeClasses(classNames.itemButton, selected && classNames.selected, disabled && classNames.disabled),
|
|
42
39
|
type: "button",
|
|
@@ -46,7 +43,7 @@ const CalendarYearGridCell = (props)=>{
|
|
|
46
43
|
disabled: disabled,
|
|
47
44
|
"aria-selected": selected,
|
|
48
45
|
ref: buttonRef
|
|
49
|
-
}, (
|
|
46
|
+
}, (_onRenderYear = onRenderYear === null || onRenderYear === void 0 ? void 0 : onRenderYear(year)) !== null && _onRenderYear !== void 0 ? _onRenderYear : year);
|
|
50
47
|
};
|
|
51
48
|
CalendarYearGridCell.displayName = 'CalendarYearGridCell';
|
|
52
49
|
const CalendarYearGrid = (props)=>{
|
|
@@ -80,9 +77,9 @@ const CalendarYearGrid = (props)=>{
|
|
|
80
77
|
animationDirection
|
|
81
78
|
});
|
|
82
79
|
const onRenderYear = (value)=>{
|
|
83
|
-
var _props_onRenderYear
|
|
80
|
+
var _props_onRenderYear;
|
|
84
81
|
var _props_onRenderYear1;
|
|
85
|
-
return (_props_onRenderYear1 = (_props_onRenderYear =
|
|
82
|
+
return (_props_onRenderYear1 = (_props_onRenderYear = props.onRenderYear) === null || _props_onRenderYear === void 0 ? void 0 : _props_onRenderYear.call(props, value)) !== null && _props_onRenderYear1 !== void 0 ? _props_onRenderYear1 : value;
|
|
86
83
|
};
|
|
87
84
|
const gridAriaLabel = `${onRenderYear(fromYear)} - ${onRenderYear(toYear)}`;
|
|
88
85
|
let year = fromYear;
|
|
@@ -128,8 +125,7 @@ const CalendarYearNavArrow = (props)=>{
|
|
|
128
125
|
const ariaLabelString = ariaLabel ? typeof ariaLabel === 'string' ? ariaLabel : ariaLabel(newRange) : undefined;
|
|
129
126
|
const disabled = direction === CalendarYearNavDirection.Previous ? minYear !== undefined && fromYear < minYear : maxYear !== undefined && props.fromYear + CELL_COUNT > maxYear;
|
|
130
127
|
const onNavigate = ()=>{
|
|
131
|
-
|
|
132
|
-
direction === CalendarYearNavDirection.Previous ? (_onSelectPrev = onSelectPrev) === null || _onSelectPrev === void 0 ? void 0 : _onSelectPrev() : (_onSelectNext = onSelectNext) === null || _onSelectNext === void 0 ? void 0 : _onSelectNext();
|
|
128
|
+
direction === CalendarYearNavDirection.Previous ? onSelectPrev === null || onSelectPrev === void 0 ? void 0 : onSelectPrev() : onSelectNext === null || onSelectNext === void 0 ? void 0 : onSelectNext();
|
|
133
129
|
};
|
|
134
130
|
const onKeyDown = (ev)=>{
|
|
135
131
|
if (ev.key === Enter) {
|
|
@@ -168,8 +164,8 @@ CalendarYearNav.displayName = 'CalendarYearNav';
|
|
|
168
164
|
const CalendarYearTitle = (props)=>{
|
|
169
165
|
const { className, fromYear, toYear, strings = DefaultCalendarYearStrings, animateBackwards, animationDirection } = props;
|
|
170
166
|
const onHeaderSelect = ()=>{
|
|
171
|
-
var _props_onHeaderSelect
|
|
172
|
-
(_props_onHeaderSelect =
|
|
167
|
+
var _props_onHeaderSelect;
|
|
168
|
+
(_props_onHeaderSelect = props.onHeaderSelect) === null || _props_onHeaderSelect === void 0 ? void 0 : _props_onHeaderSelect.call(props, true);
|
|
173
169
|
};
|
|
174
170
|
const onHeaderKeyDown = (ev)=>{
|
|
175
171
|
if (ev.key === Enter || ev.key === Space) {
|
|
@@ -177,9 +173,9 @@ const CalendarYearTitle = (props)=>{
|
|
|
177
173
|
}
|
|
178
174
|
};
|
|
179
175
|
const onRenderYear = (year)=>{
|
|
180
|
-
var _props_onRenderYear
|
|
176
|
+
var _props_onRenderYear;
|
|
181
177
|
var _props_onRenderYear1;
|
|
182
|
-
return (_props_onRenderYear1 = (_props_onRenderYear =
|
|
178
|
+
return (_props_onRenderYear1 = (_props_onRenderYear = props.onRenderYear) === null || _props_onRenderYear === void 0 ? void 0 : _props_onRenderYear.call(props, year)) !== null && _props_onRenderYear1 !== void 0 ? _props_onRenderYear1 : year;
|
|
183
179
|
};
|
|
184
180
|
const classNames = useCalendarYearStyles_unstable({
|
|
185
181
|
className,
|
|
@@ -210,7 +206,6 @@ const CalendarYearTitle = (props)=>{
|
|
|
210
206
|
};
|
|
211
207
|
CalendarYearTitle.displayName = 'CalendarYearTitle';
|
|
212
208
|
const CalendarYearHeader = (props)=>{
|
|
213
|
-
var _onRenderTitle;
|
|
214
209
|
const { className, animateBackwards, animationDirection, onRenderTitle } = props;
|
|
215
210
|
const classNames = useCalendarYearStyles_unstable({
|
|
216
211
|
className,
|
|
@@ -218,10 +213,10 @@ const CalendarYearHeader = (props)=>{
|
|
|
218
213
|
animateBackwards,
|
|
219
214
|
animationDirection
|
|
220
215
|
});
|
|
221
|
-
var
|
|
216
|
+
var _onRenderTitle;
|
|
222
217
|
return /*#__PURE__*/ React.createElement("div", {
|
|
223
218
|
className: classNames.headerContainer
|
|
224
|
-
}, (
|
|
219
|
+
}, (_onRenderTitle = onRenderTitle === null || onRenderTitle === void 0 ? void 0 : onRenderTitle(props)) !== null && _onRenderTitle !== void 0 ? _onRenderTitle : /*#__PURE__*/ React.createElement(CalendarYearTitle, props), /*#__PURE__*/ React.createElement(CalendarYearNav, props));
|
|
225
220
|
};
|
|
226
221
|
CalendarYearHeader.displayName = 'CalendarYearHeader';
|
|
227
222
|
function useAnimateBackwards({ selectedYear, navigatedYear }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["CalendarYear.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Enter, Space } from '@fluentui/keyboard-keys';\nimport { ArrowDownRegular, ArrowUpRegular } from '@fluentui/react-icons';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { mergeClasses } from '@griffel/react';\nimport { useCalendarYearStyles_unstable } from './useCalendarYearStyles.styles';\nimport type {\n CalendarYearStrings,\n CalendarYearProps,\n CalendarYearRange,\n CalendarYearHeaderProps,\n} from './CalendarYear.types';\n\nconst CELL_COUNT = 12;\nconst CELLS_PER_ROW = 4;\n\nconst DefaultCalendarYearStrings: CalendarYearStrings = {\n prevRangeAriaLabel: undefined,\n nextRangeAriaLabel: undefined,\n};\ninterface CalendarYearGrid {\n focus(): void;\n}\n\ninterface CalendarYearGridCellProps extends CalendarYearProps {\n year: number;\n current?: boolean;\n selected?: boolean;\n disabled?: boolean;\n onSelectYear?: (year: number) => void;\n onRenderYear?: (year: number) => React.ReactNode;\n}\n\ninterface CalendarYearGridProps extends CalendarYearProps, CalendarYearRange {\n selectedYear?: number;\n animateBackwards?: boolean;\n componentRef?: React.RefObject<CalendarYearGridCell>;\n}\n\ninterface CalendarYearGridCell {\n focus(): void;\n}\n\nconst CalendarYearGridCell: React.FunctionComponent<CalendarYearGridCellProps> = props => {\n const {\n className,\n highlightCurrentYear,\n highlightSelectedYear,\n year,\n selected,\n disabled,\n componentRef,\n onSelectYear,\n onRenderYear,\n } = props;\n\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n\n React.useImperativeHandle(\n componentRef,\n () => ({\n focus() {\n buttonRef.current?.focus?.();\n },\n }),\n [],\n );\n\n const onClick = () => {\n onSelectYear?.(year);\n };\n\n const onKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => {\n if (ev.key === Enter) {\n onSelectYear?.(year);\n }\n };\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n highlightCurrent: highlightCurrentYear,\n highlightSelected: highlightSelectedYear,\n });\n\n return (\n <button\n className={mergeClasses(classNames.itemButton, selected && classNames.selected, disabled && classNames.disabled)}\n type=\"button\"\n role=\"gridcell\"\n onClick={!disabled ? onClick : undefined}\n onKeyDown={!disabled ? onKeyDown : undefined}\n disabled={disabled}\n aria-selected={selected}\n ref={buttonRef}\n >\n {onRenderYear?.(year) ?? year}\n </button>\n );\n};\nCalendarYearGridCell.displayName = 'CalendarYearGridCell';\n\nconst CalendarYearGrid: React.FunctionComponent<CalendarYearGridProps> = props => {\n const {\n className,\n fromYear,\n toYear,\n animationDirection,\n animateBackwards,\n minYear,\n maxYear,\n onSelectYear,\n selectedYear,\n componentRef,\n } = props;\n\n const selectedCellRef = React.useRef<CalendarYearGridCell>(null);\n const currentCellRef = React.useRef<CalendarYearGridCell>(null);\n\n React.useImperativeHandle(\n componentRef,\n () => ({\n focus() {\n (selectedCellRef.current || currentCellRef.current)?.focus?.();\n },\n }),\n [],\n );\n\n const renderCell = (yearToRender: number): React.ReactNode => {\n const selected = yearToRender === selectedYear;\n const disabled =\n (minYear !== undefined && yearToRender < minYear) || (maxYear !== undefined && yearToRender > maxYear);\n const current = yearToRender === new Date().getFullYear();\n\n return (\n <CalendarYearGridCell\n {...props}\n key={yearToRender}\n year={yearToRender}\n selected={selected}\n current={current}\n disabled={disabled}\n onSelectYear={onSelectYear}\n componentRef={selected ? selectedCellRef : current ? currentCellRef : undefined}\n />\n );\n };\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n animateBackwards,\n animationDirection,\n });\n\n const onRenderYear = (value: number) => {\n return props.onRenderYear?.(value) ?? value;\n };\n\n const gridAriaLabel = `${onRenderYear(fromYear)} - ${onRenderYear(toYear)}`;\n\n let year = fromYear;\n const cells: React.ReactNode[][] = [];\n\n for (let i = 0; i < (toYear - fromYear + 1) / CELLS_PER_ROW; i++) {\n cells.push([]);\n for (let j = 0; j < CELLS_PER_ROW; j++) {\n cells[i].push(renderCell(year));\n year++;\n }\n }\n\n const arrowNavigationAttributes = useArrowNavigationGroup({ axis: 'both' });\n\n return (\n <div {...arrowNavigationAttributes}>\n <div className={classNames.gridContainer} role=\"grid\" aria-label={gridAriaLabel}>\n {cells.map((cellRow: React.ReactNode[], index: number) => {\n return (\n <div key={'yearPickerRow_' + index + '_' + fromYear} role=\"row\" className={classNames.buttonRow}>\n {cellRow}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nCalendarYearGrid.displayName = 'CalendarYearGrid';\n\nconst CalendarYearNavDirection = {\n Previous: 0 as const,\n Next: 1 as const,\n};\n\ninterface CalendarYearNavArrowProps extends CalendarYearHeaderProps {\n direction: (typeof CalendarYearNavDirection)[keyof typeof CalendarYearNavDirection];\n}\n\nconst CalendarYearNavArrow: React.FunctionComponent<CalendarYearNavArrowProps> = props => {\n const {\n className,\n strings = DefaultCalendarYearStrings,\n direction,\n onSelectPrev,\n onSelectNext,\n fromYear,\n toYear,\n maxYear,\n minYear,\n } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n });\n\n const ariaLabel =\n direction === CalendarYearNavDirection.Previous ? strings.prevRangeAriaLabel : strings.nextRangeAriaLabel;\n const newRangeOffset = direction === CalendarYearNavDirection.Previous ? -CELL_COUNT : CELL_COUNT;\n const newRange = { fromYear: fromYear + newRangeOffset, toYear: toYear + newRangeOffset };\n const ariaLabelString = ariaLabel ? (typeof ariaLabel === 'string' ? ariaLabel : ariaLabel(newRange)) : undefined;\n const disabled =\n direction === CalendarYearNavDirection.Previous\n ? minYear !== undefined && fromYear < minYear\n : maxYear !== undefined && props.fromYear + CELL_COUNT > maxYear;\n\n const onNavigate = () => {\n direction === CalendarYearNavDirection.Previous ? onSelectPrev?.() : onSelectNext?.();\n };\n\n const onKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => {\n if (ev.key === Enter) {\n onNavigate();\n }\n };\n\n const { dir } = useFluent_unstable();\n\n // can be condensed, but leaving verbose for clarity due to regressions\n const isLeftNavigation =\n dir === 'rtl' ? direction === CalendarYearNavDirection.Next : direction === CalendarYearNavDirection.Previous;\n\n return (\n <button\n className={mergeClasses(classNames.navigationButton, disabled && classNames.disabled)}\n onClick={!disabled ? onNavigate : undefined}\n onKeyDown={!disabled ? onKeyDown : undefined}\n type=\"button\"\n title={ariaLabelString}\n disabled={disabled}\n >\n {isLeftNavigation ? <ArrowUpRegular /> : <ArrowDownRegular />}\n </button>\n );\n};\nCalendarYearNavArrow.displayName = 'CalendarYearNavArrow';\n\nconst CalendarYearNav: React.FunctionComponent<CalendarYearHeaderProps> = props => {\n const { className } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n });\n\n return (\n <div className={classNames.navigationButtonsContainer}>\n <CalendarYearNavArrow {...props} direction={CalendarYearNavDirection.Previous} />\n <CalendarYearNavArrow {...props} direction={CalendarYearNavDirection.Next} />\n </div>\n );\n};\nCalendarYearNav.displayName = 'CalendarYearNav';\n\nconst CalendarYearTitle: React.FunctionComponent<CalendarYearHeaderProps> = props => {\n const {\n className,\n fromYear,\n toYear,\n strings = DefaultCalendarYearStrings,\n animateBackwards,\n animationDirection,\n } = props;\n\n const onHeaderSelect = () => {\n props.onHeaderSelect?.(true);\n };\n\n const onHeaderKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => {\n if (ev.key === Enter || ev.key === Space) {\n onHeaderSelect();\n }\n };\n\n const onRenderYear = (year: number) => {\n return props.onRenderYear?.(year) ?? year;\n };\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n hasHeaderClickCallback: !!props.onHeaderSelect,\n animateBackwards,\n animationDirection,\n });\n\n if (props.onHeaderSelect) {\n const rangeAriaLabel = strings.rangeAriaLabel;\n const headerAriaLabelFormatString = strings.headerAriaLabelFormatString;\n const currentDateRange = rangeAriaLabel\n ? typeof rangeAriaLabel === 'string'\n ? rangeAriaLabel\n : rangeAriaLabel(props)\n : undefined;\n\n const ariaLabel = headerAriaLabelFormatString\n ? headerAriaLabelFormatString.replace('{0}', currentDateRange ?? '')\n : currentDateRange;\n\n return (\n <button\n className={classNames.currentItemButton}\n onClick={onHeaderSelect}\n onKeyDown={onHeaderKeyDown}\n aria-label={ariaLabel}\n role=\"button\"\n type=\"button\"\n >\n <span aria-live=\"assertive\" aria-atomic=\"true\">\n {onRenderYear(fromYear)} - {onRenderYear(toYear)}\n </span>\n </button>\n );\n }\n\n return (\n <div className={classNames.current}>\n {onRenderYear(fromYear)} - {onRenderYear(toYear)}\n </div>\n );\n};\nCalendarYearTitle.displayName = 'CalendarYearTitle';\n\nconst CalendarYearHeader: React.FunctionComponent<CalendarYearHeaderProps> = props => {\n const { className, animateBackwards, animationDirection, onRenderTitle } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n hasHeaderClickCallback: !!props.onHeaderSelect,\n animateBackwards,\n animationDirection,\n });\n\n return (\n <div className={classNames.headerContainer}>\n {onRenderTitle?.(props) ?? <CalendarYearTitle {...props} />}\n <CalendarYearNav {...props} />\n </div>\n );\n};\nCalendarYearHeader.displayName = 'CalendarYearHeader';\n\nfunction useAnimateBackwards({ selectedYear, navigatedYear }: CalendarYearProps) {\n const rangeYear = selectedYear || navigatedYear || new Date().getFullYear();\n const fromYear = Math.floor(rangeYear / 10) * 10;\n\n const previousFromYearRef = React.useRef<number | undefined>(fromYear);\n React.useRef(() => {\n previousFromYearRef.current = fromYear;\n });\n const previousFromYear = previousFromYearRef.current;\n\n if (!previousFromYear || previousFromYear === fromYear) {\n return undefined;\n } else if (previousFromYear > fromYear) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction useYearRangeState({ selectedYear, navigatedYear }: CalendarYearProps) {\n const rangeYear = React.useMemo(() => {\n return selectedYear || navigatedYear || Math.floor(new Date().getFullYear() / 10) * 10;\n }, [navigatedYear, selectedYear]);\n\n const [fromYear, setFromYear] = React.useState<number>(rangeYear);\n\n const onNavNext = () => {\n setFromYear(year => year + CELL_COUNT);\n };\n\n const onNavPrevious = () => {\n setFromYear(year => year - CELL_COUNT);\n };\n\n React.useEffect(() => {\n setFromYear(rangeYear);\n }, [rangeYear]);\n\n const toYear = fromYear + CELL_COUNT - 1;\n\n return [fromYear, toYear, onNavNext, onNavPrevious] as const;\n}\n\n/**\n * @internal\n */\nexport const CalendarYear: React.FunctionComponent<CalendarYearProps> = props => {\n const animateBackwards = useAnimateBackwards(props);\n const [fromYear, toYear, onNavNext, onNavPrevious] = useYearRangeState(props);\n\n const gridRef = React.useRef<CalendarYearGrid>(null);\n\n React.useImperativeHandle(props.componentRef, () => ({\n focus() {\n gridRef.current?.focus?.();\n },\n }));\n\n const { className } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n });\n\n return (\n <div className={classNames.root}>\n <CalendarYearHeader\n {...props}\n fromYear={fromYear}\n toYear={toYear}\n onSelectPrev={onNavPrevious}\n onSelectNext={onNavNext}\n animateBackwards={animateBackwards}\n />\n <CalendarYearGrid\n {...props}\n fromYear={fromYear}\n toYear={toYear}\n animateBackwards={animateBackwards}\n componentRef={gridRef}\n />\n </div>\n );\n};\nCalendarYear.displayName = 'CalendarYear';\n"],"names":["React","Enter","Space","ArrowDownRegular","ArrowUpRegular","useFluent_unstable","useArrowNavigationGroup","mergeClasses","useCalendarYearStyles_unstable","CELL_COUNT","CELLS_PER_ROW","DefaultCalendarYearStrings","prevRangeAriaLabel","undefined","nextRangeAriaLabel","CalendarYearGridCell","props","onRenderYear","className","highlightCurrentYear","highlightSelectedYear","year","selected","disabled","componentRef","onSelectYear","buttonRef","useRef","useImperativeHandle","focus","current","onClick","onKeyDown","ev","key","classNames","highlightCurrent","highlightSelected","button","itemButton","type","role","aria-selected","ref","displayName","CalendarYearGrid","fromYear","toYear","animationDirection","animateBackwards","minYear","maxYear","selectedYear","selectedCellRef","currentCellRef","renderCell","yearToRender","Date","getFullYear","value","gridAriaLabel","cells","i","push","j","arrowNavigationAttributes","axis","div","gridContainer","aria-label","map","cellRow","index","buttonRow","CalendarYearNavDirection","Previous","Next","CalendarYearNavArrow","strings","direction","onSelectPrev","onSelectNext","ariaLabel","newRangeOffset","newRange","ariaLabelString","onNavigate","dir","isLeftNavigation","navigationButton","title","CalendarYearNav","navigationButtonsContainer","CalendarYearTitle","onHeaderSelect","onHeaderKeyDown","hasHeaderClickCallback","rangeAriaLabel","headerAriaLabelFormatString","currentDateRange","replace","currentItemButton","span","aria-live","aria-atomic","CalendarYearHeader","onRenderTitle","headerContainer","useAnimateBackwards","navigatedYear","rangeYear","Math","floor","previousFromYearRef","previousFromYear","useYearRangeState","useMemo","setFromYear","useState","onNavNext","onNavPrevious","useEffect","CalendarYear","gridRef","root"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["CalendarYear.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Enter, Space } from '@fluentui/keyboard-keys';\nimport { ArrowDownRegular, ArrowUpRegular } from '@fluentui/react-icons';\nimport { useFluent_unstable } from '@fluentui/react-shared-contexts';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { mergeClasses } from '@griffel/react';\nimport { useCalendarYearStyles_unstable } from './useCalendarYearStyles.styles';\nimport type {\n CalendarYearStrings,\n CalendarYearProps,\n CalendarYearRange,\n CalendarYearHeaderProps,\n} from './CalendarYear.types';\n\nconst CELL_COUNT = 12;\nconst CELLS_PER_ROW = 4;\n\nconst DefaultCalendarYearStrings: CalendarYearStrings = {\n prevRangeAriaLabel: undefined,\n nextRangeAriaLabel: undefined,\n};\ninterface CalendarYearGrid {\n focus(): void;\n}\n\ninterface CalendarYearGridCellProps extends CalendarYearProps {\n year: number;\n current?: boolean;\n selected?: boolean;\n disabled?: boolean;\n onSelectYear?: (year: number) => void;\n onRenderYear?: (year: number) => React.ReactNode;\n}\n\ninterface CalendarYearGridProps extends CalendarYearProps, CalendarYearRange {\n selectedYear?: number;\n animateBackwards?: boolean;\n componentRef?: React.RefObject<CalendarYearGridCell>;\n}\n\ninterface CalendarYearGridCell {\n focus(): void;\n}\n\nconst CalendarYearGridCell: React.FunctionComponent<CalendarYearGridCellProps> = props => {\n const {\n className,\n highlightCurrentYear,\n highlightSelectedYear,\n year,\n selected,\n disabled,\n componentRef,\n onSelectYear,\n onRenderYear,\n } = props;\n\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n\n React.useImperativeHandle(\n componentRef,\n () => ({\n focus() {\n buttonRef.current?.focus?.();\n },\n }),\n [],\n );\n\n const onClick = () => {\n onSelectYear?.(year);\n };\n\n const onKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => {\n if (ev.key === Enter) {\n onSelectYear?.(year);\n }\n };\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n highlightCurrent: highlightCurrentYear,\n highlightSelected: highlightSelectedYear,\n });\n\n return (\n <button\n className={mergeClasses(classNames.itemButton, selected && classNames.selected, disabled && classNames.disabled)}\n type=\"button\"\n role=\"gridcell\"\n onClick={!disabled ? onClick : undefined}\n onKeyDown={!disabled ? onKeyDown : undefined}\n disabled={disabled}\n aria-selected={selected}\n ref={buttonRef}\n >\n {onRenderYear?.(year) ?? year}\n </button>\n );\n};\nCalendarYearGridCell.displayName = 'CalendarYearGridCell';\n\nconst CalendarYearGrid: React.FunctionComponent<CalendarYearGridProps> = props => {\n const {\n className,\n fromYear,\n toYear,\n animationDirection,\n animateBackwards,\n minYear,\n maxYear,\n onSelectYear,\n selectedYear,\n componentRef,\n } = props;\n\n const selectedCellRef = React.useRef<CalendarYearGridCell>(null);\n const currentCellRef = React.useRef<CalendarYearGridCell>(null);\n\n React.useImperativeHandle(\n componentRef,\n () => ({\n focus() {\n (selectedCellRef.current || currentCellRef.current)?.focus?.();\n },\n }),\n [],\n );\n\n const renderCell = (yearToRender: number): React.ReactNode => {\n const selected = yearToRender === selectedYear;\n const disabled =\n (minYear !== undefined && yearToRender < minYear) || (maxYear !== undefined && yearToRender > maxYear);\n const current = yearToRender === new Date().getFullYear();\n\n return (\n <CalendarYearGridCell\n {...props}\n key={yearToRender}\n year={yearToRender}\n selected={selected}\n current={current}\n disabled={disabled}\n onSelectYear={onSelectYear}\n componentRef={selected ? selectedCellRef : current ? currentCellRef : undefined}\n />\n );\n };\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n animateBackwards,\n animationDirection,\n });\n\n const onRenderYear = (value: number) => {\n return props.onRenderYear?.(value) ?? value;\n };\n\n const gridAriaLabel = `${onRenderYear(fromYear)} - ${onRenderYear(toYear)}`;\n\n let year = fromYear;\n const cells: React.ReactNode[][] = [];\n\n for (let i = 0; i < (toYear - fromYear + 1) / CELLS_PER_ROW; i++) {\n cells.push([]);\n for (let j = 0; j < CELLS_PER_ROW; j++) {\n cells[i].push(renderCell(year));\n year++;\n }\n }\n\n const arrowNavigationAttributes = useArrowNavigationGroup({ axis: 'both' });\n\n return (\n <div {...arrowNavigationAttributes}>\n <div className={classNames.gridContainer} role=\"grid\" aria-label={gridAriaLabel}>\n {cells.map((cellRow: React.ReactNode[], index: number) => {\n return (\n <div key={'yearPickerRow_' + index + '_' + fromYear} role=\"row\" className={classNames.buttonRow}>\n {cellRow}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nCalendarYearGrid.displayName = 'CalendarYearGrid';\n\nconst CalendarYearNavDirection = {\n Previous: 0 as const,\n Next: 1 as const,\n};\n\ninterface CalendarYearNavArrowProps extends CalendarYearHeaderProps {\n direction: (typeof CalendarYearNavDirection)[keyof typeof CalendarYearNavDirection];\n}\n\nconst CalendarYearNavArrow: React.FunctionComponent<CalendarYearNavArrowProps> = props => {\n const {\n className,\n strings = DefaultCalendarYearStrings,\n direction,\n onSelectPrev,\n onSelectNext,\n fromYear,\n toYear,\n maxYear,\n minYear,\n } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n });\n\n const ariaLabel =\n direction === CalendarYearNavDirection.Previous ? strings.prevRangeAriaLabel : strings.nextRangeAriaLabel;\n const newRangeOffset = direction === CalendarYearNavDirection.Previous ? -CELL_COUNT : CELL_COUNT;\n const newRange = { fromYear: fromYear + newRangeOffset, toYear: toYear + newRangeOffset };\n const ariaLabelString = ariaLabel ? (typeof ariaLabel === 'string' ? ariaLabel : ariaLabel(newRange)) : undefined;\n const disabled =\n direction === CalendarYearNavDirection.Previous\n ? minYear !== undefined && fromYear < minYear\n : maxYear !== undefined && props.fromYear + CELL_COUNT > maxYear;\n\n const onNavigate = () => {\n direction === CalendarYearNavDirection.Previous ? onSelectPrev?.() : onSelectNext?.();\n };\n\n const onKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => {\n if (ev.key === Enter) {\n onNavigate();\n }\n };\n\n const { dir } = useFluent_unstable();\n\n // can be condensed, but leaving verbose for clarity due to regressions\n const isLeftNavigation =\n dir === 'rtl' ? direction === CalendarYearNavDirection.Next : direction === CalendarYearNavDirection.Previous;\n\n return (\n <button\n className={mergeClasses(classNames.navigationButton, disabled && classNames.disabled)}\n onClick={!disabled ? onNavigate : undefined}\n onKeyDown={!disabled ? onKeyDown : undefined}\n type=\"button\"\n title={ariaLabelString}\n disabled={disabled}\n >\n {isLeftNavigation ? <ArrowUpRegular /> : <ArrowDownRegular />}\n </button>\n );\n};\nCalendarYearNavArrow.displayName = 'CalendarYearNavArrow';\n\nconst CalendarYearNav: React.FunctionComponent<CalendarYearHeaderProps> = props => {\n const { className } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n });\n\n return (\n <div className={classNames.navigationButtonsContainer}>\n <CalendarYearNavArrow {...props} direction={CalendarYearNavDirection.Previous} />\n <CalendarYearNavArrow {...props} direction={CalendarYearNavDirection.Next} />\n </div>\n );\n};\nCalendarYearNav.displayName = 'CalendarYearNav';\n\nconst CalendarYearTitle: React.FunctionComponent<CalendarYearHeaderProps> = props => {\n const {\n className,\n fromYear,\n toYear,\n strings = DefaultCalendarYearStrings,\n animateBackwards,\n animationDirection,\n } = props;\n\n const onHeaderSelect = () => {\n props.onHeaderSelect?.(true);\n };\n\n const onHeaderKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => {\n if (ev.key === Enter || ev.key === Space) {\n onHeaderSelect();\n }\n };\n\n const onRenderYear = (year: number) => {\n return props.onRenderYear?.(year) ?? year;\n };\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n hasHeaderClickCallback: !!props.onHeaderSelect,\n animateBackwards,\n animationDirection,\n });\n\n if (props.onHeaderSelect) {\n const rangeAriaLabel = strings.rangeAriaLabel;\n const headerAriaLabelFormatString = strings.headerAriaLabelFormatString;\n const currentDateRange = rangeAriaLabel\n ? typeof rangeAriaLabel === 'string'\n ? rangeAriaLabel\n : rangeAriaLabel(props)\n : undefined;\n\n const ariaLabel = headerAriaLabelFormatString\n ? headerAriaLabelFormatString.replace('{0}', currentDateRange ?? '')\n : currentDateRange;\n\n return (\n <button\n className={classNames.currentItemButton}\n onClick={onHeaderSelect}\n onKeyDown={onHeaderKeyDown}\n aria-label={ariaLabel}\n role=\"button\"\n type=\"button\"\n >\n <span aria-live=\"assertive\" aria-atomic=\"true\">\n {onRenderYear(fromYear)} - {onRenderYear(toYear)}\n </span>\n </button>\n );\n }\n\n return (\n <div className={classNames.current}>\n {onRenderYear(fromYear)} - {onRenderYear(toYear)}\n </div>\n );\n};\nCalendarYearTitle.displayName = 'CalendarYearTitle';\n\nconst CalendarYearHeader: React.FunctionComponent<CalendarYearHeaderProps> = props => {\n const { className, animateBackwards, animationDirection, onRenderTitle } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n hasHeaderClickCallback: !!props.onHeaderSelect,\n animateBackwards,\n animationDirection,\n });\n\n return (\n <div className={classNames.headerContainer}>\n {onRenderTitle?.(props) ?? <CalendarYearTitle {...props} />}\n <CalendarYearNav {...props} />\n </div>\n );\n};\nCalendarYearHeader.displayName = 'CalendarYearHeader';\n\nfunction useAnimateBackwards({ selectedYear, navigatedYear }: CalendarYearProps) {\n const rangeYear = selectedYear || navigatedYear || new Date().getFullYear();\n const fromYear = Math.floor(rangeYear / 10) * 10;\n\n const previousFromYearRef = React.useRef<number | undefined>(fromYear);\n React.useRef(() => {\n previousFromYearRef.current = fromYear;\n });\n const previousFromYear = previousFromYearRef.current;\n\n if (!previousFromYear || previousFromYear === fromYear) {\n return undefined;\n } else if (previousFromYear > fromYear) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction useYearRangeState({ selectedYear, navigatedYear }: CalendarYearProps) {\n const rangeYear = React.useMemo(() => {\n return selectedYear || navigatedYear || Math.floor(new Date().getFullYear() / 10) * 10;\n }, [navigatedYear, selectedYear]);\n\n const [fromYear, setFromYear] = React.useState<number>(rangeYear);\n\n const onNavNext = () => {\n setFromYear(year => year + CELL_COUNT);\n };\n\n const onNavPrevious = () => {\n setFromYear(year => year - CELL_COUNT);\n };\n\n React.useEffect(() => {\n setFromYear(rangeYear);\n }, [rangeYear]);\n\n const toYear = fromYear + CELL_COUNT - 1;\n\n return [fromYear, toYear, onNavNext, onNavPrevious] as const;\n}\n\n/**\n * @internal\n */\nexport const CalendarYear: React.FunctionComponent<CalendarYearProps> = props => {\n const animateBackwards = useAnimateBackwards(props);\n const [fromYear, toYear, onNavNext, onNavPrevious] = useYearRangeState(props);\n\n const gridRef = React.useRef<CalendarYearGrid>(null);\n\n React.useImperativeHandle(props.componentRef, () => ({\n focus() {\n gridRef.current?.focus?.();\n },\n }));\n\n const { className } = props;\n\n const classNames = useCalendarYearStyles_unstable({\n className,\n });\n\n return (\n <div className={classNames.root}>\n <CalendarYearHeader\n {...props}\n fromYear={fromYear}\n toYear={toYear}\n onSelectPrev={onNavPrevious}\n onSelectNext={onNavNext}\n animateBackwards={animateBackwards}\n />\n <CalendarYearGrid\n {...props}\n fromYear={fromYear}\n toYear={toYear}\n animateBackwards={animateBackwards}\n componentRef={gridRef}\n />\n </div>\n );\n};\nCalendarYear.displayName = 'CalendarYear';\n"],"names":["React","Enter","Space","ArrowDownRegular","ArrowUpRegular","useFluent_unstable","useArrowNavigationGroup","mergeClasses","useCalendarYearStyles_unstable","CELL_COUNT","CELLS_PER_ROW","DefaultCalendarYearStrings","prevRangeAriaLabel","undefined","nextRangeAriaLabel","CalendarYearGridCell","props","className","highlightCurrentYear","highlightSelectedYear","year","selected","disabled","componentRef","onSelectYear","onRenderYear","buttonRef","useRef","useImperativeHandle","focus","current","onClick","onKeyDown","ev","key","classNames","highlightCurrent","highlightSelected","button","itemButton","type","role","aria-selected","ref","displayName","CalendarYearGrid","fromYear","toYear","animationDirection","animateBackwards","minYear","maxYear","selectedYear","selectedCellRef","currentCellRef","renderCell","yearToRender","Date","getFullYear","value","gridAriaLabel","cells","i","push","j","arrowNavigationAttributes","axis","div","gridContainer","aria-label","map","cellRow","index","buttonRow","CalendarYearNavDirection","Previous","Next","CalendarYearNavArrow","strings","direction","onSelectPrev","onSelectNext","ariaLabel","newRangeOffset","newRange","ariaLabelString","onNavigate","dir","isLeftNavigation","navigationButton","title","CalendarYearNav","navigationButtonsContainer","CalendarYearTitle","onHeaderSelect","onHeaderKeyDown","hasHeaderClickCallback","rangeAriaLabel","headerAriaLabelFormatString","currentDateRange","replace","currentItemButton","span","aria-live","aria-atomic","CalendarYearHeader","onRenderTitle","headerContainer","useAnimateBackwards","navigatedYear","rangeYear","Math","floor","previousFromYearRef","previousFromYear","useYearRangeState","useMemo","setFromYear","useState","onNavNext","onNavPrevious","useEffect","CalendarYear","gridRef","root"],"mappings":"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"}
|
|
@@ -40,8 +40,8 @@ function usePopupVisibility(props) {
|
|
|
40
40
|
React.useEffect(()=>{
|
|
41
41
|
if (isMounted.current && !open) {
|
|
42
42
|
var // If DatePicker's menu (Calendar) is closed, run onAfterMenuDismiss
|
|
43
|
-
_props_onOpenChange
|
|
44
|
-
(_props_onOpenChange =
|
|
43
|
+
_props_onOpenChange;
|
|
44
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, false);
|
|
45
45
|
}
|
|
46
46
|
isMounted.current = true;
|
|
47
47
|
}, // Should only run on allowTextInput or open change
|
|
@@ -62,8 +62,7 @@ function useSelectedDate({ formatDate, onSelectDate, value }) {
|
|
|
62
62
|
});
|
|
63
63
|
const [formattedDate, setFormattedDate] = React.useState(()=>value && formatDate ? formatDate(value) : '');
|
|
64
64
|
const setSelectedDate = (newDate)=>{
|
|
65
|
-
|
|
66
|
-
(_onSelectDate = onSelectDate) === null || _onSelectDate === void 0 ? void 0 : _onSelectDate(newDate);
|
|
65
|
+
onSelectDate === null || onSelectDate === void 0 ? void 0 : onSelectDate(newDate);
|
|
67
66
|
setSelectedDateState(newDate);
|
|
68
67
|
setFormattedDate(newDate && formatDate ? formatDate(newDate) : '');
|
|
69
68
|
};
|
|
@@ -94,7 +93,6 @@ const defaultParseDateFromString = (dateStr)=>{
|
|
|
94
93
|
* @param props - props from this instance of DatePicker
|
|
95
94
|
* @param ref - reference to root Input slot
|
|
96
95
|
*/ export const useDatePicker_unstable = (props, ref)=>{
|
|
97
|
-
var _fieldContext;
|
|
98
96
|
const { allowTextInput = false, allFocusable = false, borderless = false, dateTimeFormatter, defaultOpen = false, disableAutoFocus = true, firstDayOfWeek = DayOfWeek.Sunday, firstWeekOfYear = FirstWeekOfYear.FirstDay, formatDate = defaultFormatDate, highlightCurrentMonth = false, highlightSelectedMonth = false, initialPickerDate = new Date(), inlinePopup = false, isMonthPickerVisible = true, maxDate, minDate, mountNode, onOpenChange, onSelectDate: onUserSelectDate, openOnClick = true, onValidationResult, parseDateFromString = defaultParseDateFromString, showCloseButton = false, showGoToToday = true, showMonthPickerAsOverlay = false, showWeekNumbers = false, strings = defaultDatePickerStrings, today, underlined = false, value, ...restOfProps } = props;
|
|
99
97
|
const calendar = React.useRef(null);
|
|
100
98
|
const [focus, rootRef, preventFocusOpeningPicker, preventNextFocusOpeningPicker] = useFocusLogic();
|
|
@@ -106,10 +104,9 @@ const defaultParseDateFromString = (dateStr)=>{
|
|
|
106
104
|
const [open, setOpenState] = usePopupVisibility(props);
|
|
107
105
|
const fieldContext = useFieldContext();
|
|
108
106
|
var _fieldContext_required;
|
|
109
|
-
const required = (_fieldContext_required =
|
|
107
|
+
const required = (_fieldContext_required = fieldContext === null || fieldContext === void 0 ? void 0 : fieldContext.required) !== null && _fieldContext_required !== void 0 ? _fieldContext_required : props.required;
|
|
110
108
|
const popupSurfaceId = useId('datePicker-popupSurface');
|
|
111
109
|
const validateTextInput = React.useCallback((date = null)=>{
|
|
112
|
-
var _onValidationResult;
|
|
113
110
|
let error;
|
|
114
111
|
if (allowTextInput) {
|
|
115
112
|
if (formattedDate || date) {
|
|
@@ -133,16 +130,15 @@ const defaultParseDateFromString = (dateStr)=>{
|
|
|
133
130
|
}
|
|
134
131
|
}
|
|
135
132
|
} else {
|
|
136
|
-
var _onUserSelectDate;
|
|
137
133
|
if (required) {
|
|
138
134
|
error = 'required-input';
|
|
139
135
|
}
|
|
140
|
-
|
|
136
|
+
onUserSelectDate === null || onUserSelectDate === void 0 ? void 0 : onUserSelectDate(date);
|
|
141
137
|
}
|
|
142
138
|
} else if (required && !formattedDate) {
|
|
143
139
|
error = 'required-input';
|
|
144
140
|
}
|
|
145
|
-
|
|
141
|
+
onValidationResult === null || onValidationResult === void 0 ? void 0 : onValidationResult({
|
|
146
142
|
error
|
|
147
143
|
});
|
|
148
144
|
}, [
|
|
@@ -159,8 +155,7 @@ const defaultParseDateFromString = (dateStr)=>{
|
|
|
159
155
|
setSelectedDate
|
|
160
156
|
]);
|
|
161
157
|
const setOpen = React.useCallback((newState)=>{
|
|
162
|
-
|
|
163
|
-
(_onOpenChange = onOpenChange) === null || _onOpenChange === void 0 ? void 0 : _onOpenChange(newState);
|
|
158
|
+
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(newState);
|
|
164
159
|
setOpenState(newState);
|
|
165
160
|
if (!open && !props.disabled) {
|
|
166
161
|
focus();
|