@cloudscape-design/components 3.0.882 → 3.0.884
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/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.d.ts.map +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.js +1 -1
- package/app-layout/visual-refresh-toolbar/toolbar/trigger-button/index.js.map +1 -1
- package/breadcrumb-group/item/item.d.ts.map +1 -1
- package/breadcrumb-group/item/item.js +1 -1
- package/breadcrumb-group/item/item.js.map +1 -1
- package/button/internal.d.ts.map +1 -1
- package/button/internal.js +1 -1
- package/button/internal.js.map +1 -1
- package/button-group/file-input-item.d.ts +5 -3
- package/button-group/file-input-item.d.ts.map +1 -1
- package/button-group/file-input-item.js +2 -2
- package/button-group/file-input-item.js.map +1 -1
- package/button-group/icon-button-item.d.ts +5 -3
- package/button-group/icon-button-item.d.ts.map +1 -1
- package/button-group/icon-button-item.js +2 -2
- package/button-group/icon-button-item.js.map +1 -1
- package/button-group/icon-toggle-button-item.d.ts +5 -3
- package/button-group/icon-toggle-button-item.d.ts.map +1 -1
- package/button-group/icon-toggle-button-item.js +2 -2
- package/button-group/icon-toggle-button-item.js.map +1 -1
- package/button-group/item-element.d.ts.map +1 -1
- package/button-group/item-element.js +4 -4
- package/button-group/item-element.js.map +1 -1
- package/button-group/menu-dropdown-item.d.ts +1 -0
- package/button-group/menu-dropdown-item.d.ts.map +1 -1
- package/button-group/menu-dropdown-item.js +2 -2
- package/button-group/menu-dropdown-item.js.map +1 -1
- package/calendar/grid/index.d.ts.map +1 -1
- package/calendar/grid/index.js +1 -1
- package/calendar/grid/index.js.map +1 -1
- package/date-range-picker/calendar/grids/grid-cell.d.ts.map +1 -1
- package/date-range-picker/calendar/grids/grid-cell.js +2 -2
- package/date-range-picker/calendar/grids/grid-cell.js.map +1 -1
- package/date-range-picker/calendar/grids/grid.d.ts +18 -0
- package/date-range-picker/calendar/grids/grid.d.ts.map +1 -0
- package/date-range-picker/calendar/grids/grid.js +174 -0
- package/date-range-picker/calendar/grids/grid.js.map +1 -0
- package/date-range-picker/calendar/grids/index.d.ts +3 -20
- package/date-range-picker/calendar/grids/index.d.ts.map +1 -1
- package/date-range-picker/calendar/grids/index.js +51 -22
- package/date-range-picker/calendar/grids/index.js.map +1 -1
- package/date-range-picker/calendar/grids/interfaces.d.ts +47 -0
- package/date-range-picker/calendar/grids/interfaces.d.ts.map +1 -0
- package/date-range-picker/calendar/grids/interfaces.js +2 -0
- package/date-range-picker/calendar/grids/interfaces.js.map +1 -0
- package/date-range-picker/calendar/grids/intl.d.ts +17 -0
- package/date-range-picker/calendar/grids/intl.d.ts.map +1 -0
- package/date-range-picker/calendar/grids/intl.js +56 -0
- package/date-range-picker/calendar/grids/intl.js.map +1 -0
- package/date-range-picker/calendar/grids/styles.css.js +30 -24
- package/date-range-picker/calendar/grids/styles.scoped.css +62 -46
- package/date-range-picker/calendar/grids/styles.selectors.js +30 -24
- package/date-range-picker/calendar/header/header-button.d.ts +5 -4
- package/date-range-picker/calendar/header/header-button.d.ts.map +1 -1
- package/date-range-picker/calendar/header/header-button.js +6 -6
- package/date-range-picker/calendar/header/header-button.js.map +1 -1
- package/date-range-picker/calendar/header/index.d.ts +6 -4
- package/date-range-picker/calendar/header/index.d.ts.map +1 -1
- package/date-range-picker/calendar/header/index.js +18 -13
- package/date-range-picker/calendar/header/index.js.map +1 -1
- package/date-range-picker/calendar/index.d.ts +2 -1
- package/date-range-picker/calendar/index.d.ts.map +1 -1
- package/date-range-picker/calendar/index.js +49 -41
- package/date-range-picker/calendar/index.js.map +1 -1
- package/date-range-picker/calendar/range-inputs.d.ts +4 -3
- package/date-range-picker/calendar/range-inputs.d.ts.map +1 -1
- package/date-range-picker/calendar/range-inputs.js +23 -10
- package/date-range-picker/calendar/range-inputs.js.map +1 -1
- package/date-range-picker/calendar/utils.d.ts +2 -0
- package/date-range-picker/calendar/utils.d.ts.map +1 -1
- package/date-range-picker/calendar/utils.js +27 -1
- package/date-range-picker/calendar/utils.js.map +1 -1
- package/date-range-picker/dropdown.d.ts +3 -2
- package/date-range-picker/dropdown.d.ts.map +1 -1
- package/date-range-picker/dropdown.js +17 -12
- package/date-range-picker/dropdown.js.map +1 -1
- package/date-range-picker/index.d.ts.map +1 -1
- package/date-range-picker/index.js +17 -8
- package/date-range-picker/index.js.map +1 -1
- package/date-range-picker/interfaces.d.ts +89 -14
- package/date-range-picker/interfaces.d.ts.map +1 -1
- package/date-range-picker/interfaces.js.map +1 -1
- package/date-range-picker/mode-switcher.js +2 -2
- package/date-range-picker/mode-switcher.js.map +1 -1
- package/date-range-picker/relative-range/index.d.ts +2 -1
- package/date-range-picker/relative-range/index.d.ts.map +1 -1
- package/date-range-picker/relative-range/index.js +14 -8
- package/date-range-picker/relative-range/index.js.map +1 -1
- package/date-range-picker/relative-range/styles.css.js +6 -9
- package/date-range-picker/relative-range/styles.scoped.css +10 -19
- package/date-range-picker/relative-range/styles.selectors.js +6 -9
- package/date-range-picker/styles.css.js +23 -38
- package/date-range-picker/styles.scoped.css +32 -78
- package/date-range-picker/styles.selectors.js +23 -38
- package/date-range-picker/test-classes/styles.css.js +36 -2
- package/date-range-picker/test-classes/styles.scoped.css +36 -2
- package/date-range-picker/test-classes/styles.selectors.js +36 -2
- package/date-range-picker/utils.d.ts +9 -11
- package/date-range-picker/utils.d.ts.map +1 -1
- package/date-range-picker/utils.js +43 -32
- package/date-range-picker/utils.js.map +1 -1
- package/file-token-group/file-token.d.ts.map +1 -1
- package/file-token-group/file-token.js +1 -1
- package/file-token-group/file-token.js.map +1 -1
- package/i18n/messages/all.all.js +1 -1
- package/i18n/messages/all.all.json +1 -1
- package/i18n/messages/all.en.js +1 -1
- package/i18n/messages/all.en.json +1 -1
- package/i18n/messages-types.d.ts +9 -0
- package/i18n/messages-types.d.ts.map +1 -1
- package/i18n/messages-types.js.map +1 -1
- package/internal/components/tooltip/index.d.ts +2 -1
- package/internal/components/tooltip/index.d.ts.map +1 -1
- package/internal/components/tooltip/index.js +21 -2
- package/internal/components/tooltip/index.js.map +1 -1
- package/internal/environment.js +1 -1
- package/internal/environment.json +1 -1
- package/internal/manifest.json +1 -1
- package/internal/utils/date-time/calendar.d.ts +22 -6
- package/internal/utils/date-time/calendar.d.ts.map +1 -1
- package/internal/utils/date-time/calendar.js +62 -11
- package/internal/utils/date-time/calendar.js.map +1 -1
- package/multiselect/index.d.ts.map +1 -1
- package/multiselect/index.js +2 -3
- package/multiselect/index.js.map +1 -1
- package/package.json +1 -1
- package/progress-bar/index.d.ts.map +1 -1
- package/progress-bar/index.js +4 -3
- package/progress-bar/index.js.map +1 -1
- package/progress-bar/internal.js +2 -2
- package/progress-bar/internal.js.map +1 -1
- package/segmented-control/segment.d.ts.map +1 -1
- package/segmented-control/segment.js +1 -1
- package/segmented-control/segment.js.map +1 -1
- package/select/parts/item.d.ts.map +1 -1
- package/select/parts/item.js +4 -2
- package/select/parts/item.js.map +1 -1
- package/select/parts/multiselect-item.d.ts.map +1 -1
- package/select/parts/multiselect-item.js +4 -2
- package/select/parts/multiselect-item.js.map +1 -1
- package/slider/internal.d.ts.map +1 -1
- package/slider/internal.js +1 -1
- package/slider/internal.js.map +1 -1
- package/tabs/tab-header-bar.d.ts.map +1 -1
- package/tabs/tab-header-bar.js +1 -1
- package/tabs/tab-header-bar.js.map +1 -1
- package/test-utils/dom/date-range-picker/index.d.ts +26 -0
- package/test-utils/dom/date-range-picker/index.js +58 -24
- package/test-utils/dom/date-range-picker/index.js.map +1 -1
- package/test-utils/selectors/date-range-picker/index.d.ts +26 -0
- package/test-utils/selectors/date-range-picker/index.js +58 -24
- package/test-utils/selectors/date-range-picker/index.js.map +1 -1
- package/test-utils/tsconfig.tsbuildinfo +1 -1
- package/date-range-picker/calendar/grids/monthly-grid.d.ts +0 -39
- package/date-range-picker/calendar/grids/monthly-grid.d.ts.map +0 -1
- package/date-range-picker/calendar/grids/monthly-grid.js +0 -97
- package/date-range-picker/calendar/grids/monthly-grid.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-dropdown-item.d.ts","sourceRoot":"","sources":["../../../src/button-group/menu-dropdown-item.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGpE,OAAO,EAAE,sBAAsB,EAAuB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,QAAA,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"menu-dropdown-item.d.ts","sourceRoot":"","sources":["../../../src/button-group/menu-dropdown-item.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGpE,OAAO,EAAE,sBAAsB,EAAuB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,UAAU,qBAAqB;IAC7B,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,QAAA,MAAM,gBAAgB,uGAkDrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -7,13 +7,13 @@ import ButtonDropdown from '../button-dropdown/internal';
|
|
|
7
7
|
import Tooltip from '../internal/components/tooltip';
|
|
8
8
|
import { fireCancelableEvent } from '../internal/events';
|
|
9
9
|
import testUtilStyles from './test-classes/styles.css.js';
|
|
10
|
-
const MenuDropdownItem = React.forwardRef(({ item, showTooltip, onItemClick, expandToViewport }, ref) => {
|
|
10
|
+
const MenuDropdownItem = React.forwardRef(({ item, showTooltip, onItemClick, onTooltipDismiss, expandToViewport }, ref) => {
|
|
11
11
|
const containerRef = React.useRef(null);
|
|
12
12
|
const onClickHandler = (event) => {
|
|
13
13
|
fireCancelableEvent(onItemClick, { id: event.detail.id, checked: event.detail.checked }, event);
|
|
14
14
|
};
|
|
15
15
|
return (React.createElement(ButtonDropdown, { ref: ref, variant: "icon", items: item.items, onItemClick: onClickHandler, expandToViewport: expandToViewport, ariaLabel: item.text, className: testUtilStyles['button-group-item'], "data-testid": item.id, customTriggerBuilder: ({ onClick, isOpen, triggerRef, ariaLabel, ariaExpanded, testUtilsClass }) => (React.createElement("div", { ref: containerRef },
|
|
16
|
-
!isOpen && showTooltip && !item.disabled && !item.loading && (React.createElement(Tooltip, { trackRef: containerRef, trackKey: item.id, value: item.text, className: clsx(testUtilStyles.tooltip, testUtilStyles['button-group-tooltip']) })),
|
|
16
|
+
!isOpen && showTooltip && !item.disabled && !item.loading && (React.createElement(Tooltip, { trackRef: containerRef, trackKey: item.id, value: item.text, className: clsx(testUtilStyles.tooltip, testUtilStyles['button-group-tooltip']), onDismiss: onTooltipDismiss })),
|
|
17
17
|
React.createElement(InternalButton, { ref: triggerRef, variant: "icon", ariaLabel: ariaLabel, "data-itemid": item.id, ariaExpanded: ariaExpanded, className: clsx(testUtilStyles.item, testUtilsClass), iconName: "ellipsis", loading: item.loading, loadingText: item.loadingText, disabled: item.disabled, onClick: onClick, __title: "" }))) }));
|
|
18
18
|
});
|
|
19
19
|
export default MenuDropdownItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-dropdown-item.js","sourceRoot":"","sources":["../../../src/button-group/menu-dropdown-item.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAEhD,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,OAAO,MAAM,gCAAgC,CAAC;AACrD,OAAO,EAA0B,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGjF,OAAO,cAAc,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"menu-dropdown-item.js","sourceRoot":"","sources":["../../../src/button-group/menu-dropdown-item.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAEhD,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,OAAO,MAAM,gCAAgC,CAAC;AACrD,OAAO,EAA0B,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGjF,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAU1D,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CACvC,CACE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAyB,EAC7F,GAAuC,EACvC,EAAE;IACF,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,CAAC,KAAwD,EAAE,EAAE;QAClF,mBAAmB,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;IAClG,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,cAAc,IACb,GAAG,EAAE,GAAG,EACR,OAAO,EAAC,MAAM,EACd,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,WAAW,EAAE,cAAc,EAC3B,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,IAAI,CAAC,IAAI,EACpB,SAAS,EAAE,cAAc,CAAC,mBAAmB,CAAC,iBACjC,IAAI,CAAC,EAAE,EACpB,oBAAoB,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAClG,6BAAK,GAAG,EAAE,YAAY;YACnB,CAAC,MAAM,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAC5D,oBAAC,OAAO,IACN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,IAAI,CAAC,EAAE,EACjB,KAAK,EAAE,IAAI,CAAC,IAAI,EAChB,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,sBAAsB,CAAC,CAAC,EAC/E,SAAS,EAAE,gBAAgB,GAC3B,CACH;YACD,oBAAC,cAAc,IACb,GAAG,EAAE,UAAU,EACf,OAAO,EAAC,MAAM,EACd,SAAS,EAAE,SAAS,iBACP,IAAI,CAAC,EAAE,EACpB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,EACpD,QAAQ,EAAC,UAAU,EACnB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAC,EAAE,GACV,CACE,CACP,GACD,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React from 'react';\nimport clsx from 'clsx';\n\nimport InternalButton from '../button/internal';\nimport { ButtonDropdownProps } from '../button-dropdown/interfaces';\nimport ButtonDropdown from '../button-dropdown/internal';\nimport Tooltip from '../internal/components/tooltip';\nimport { CancelableEventHandler, fireCancelableEvent } from '../internal/events';\nimport { ButtonGroupProps } from './interfaces';\n\nimport testUtilStyles from './test-classes/styles.css.js';\n\ninterface MenuDropdownItemProps {\n item: ButtonGroupProps.MenuDropdown;\n showTooltip: boolean;\n onTooltipDismiss: () => void;\n onItemClick?: CancelableEventHandler<ButtonGroupProps.ItemClickDetails>;\n expandToViewport?: boolean;\n}\n\nconst MenuDropdownItem = React.forwardRef(\n (\n { item, showTooltip, onItemClick, onTooltipDismiss, expandToViewport }: MenuDropdownItemProps,\n ref: React.Ref<ButtonDropdownProps.Ref>\n ) => {\n const containerRef = React.useRef<HTMLDivElement>(null);\n const onClickHandler = (event: CustomEvent<ButtonDropdownProps.ItemClickDetails>) => {\n fireCancelableEvent(onItemClick, { id: event.detail.id, checked: event.detail.checked }, event);\n };\n\n return (\n <ButtonDropdown\n ref={ref}\n variant=\"icon\"\n items={item.items}\n onItemClick={onClickHandler}\n expandToViewport={expandToViewport}\n ariaLabel={item.text}\n className={testUtilStyles['button-group-item']}\n data-testid={item.id}\n customTriggerBuilder={({ onClick, isOpen, triggerRef, ariaLabel, ariaExpanded, testUtilsClass }) => (\n <div ref={containerRef}>\n {!isOpen && showTooltip && !item.disabled && !item.loading && (\n <Tooltip\n trackRef={containerRef}\n trackKey={item.id}\n value={item.text}\n className={clsx(testUtilStyles.tooltip, testUtilStyles['button-group-tooltip'])}\n onDismiss={onTooltipDismiss}\n />\n )}\n <InternalButton\n ref={triggerRef}\n variant=\"icon\"\n ariaLabel={ariaLabel}\n data-itemid={item.id}\n ariaExpanded={ariaExpanded}\n className={clsx(testUtilStyles.item, testUtilsClass)}\n iconName=\"ellipsis\"\n loading={item.loading}\n loadingText={item.loadingText}\n disabled={item.disabled}\n onClick={onClick}\n __title=\"\"\n />\n </div>\n )}\n />\n );\n }\n);\n\nexport default MenuDropdownItem;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/calendar/grid/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAO/D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,eAAe,CAAC,qBAAqB,CAAC;IACrD,kBAAkB,EAAE,aAAa,CAAC,0BAA0B,CAAC;IAC7D,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACvC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,KAAK,MAAM,CAAC;IACzE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,OAAO,CAAC;IACpD,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CACzE;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/calendar/grid/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAO/D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,eAAe,CAAC,qBAAqB,CAAC;IACrD,kBAAkB,EAAE,aAAa,CAAC,0BAA0B,CAAC;IAC7D,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,EAAE,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACvC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACnC,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,KAAK,MAAM,CAAC;IACzE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,OAAO,CAAC;IACpD,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CACzE;AA2CD,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,EAC3B,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,MAAM,EACN,IAAI,EACJ,aAAa,EACb,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,oBAAoB,GACrB,EAAE,SAAS,eA2EX"}
|
package/calendar/grid/index.js
CHANGED
|
@@ -20,7 +20,7 @@ const GridCell = forwardRef((props, focusedDateRef) => {
|
|
|
20
20
|
props.children,
|
|
21
21
|
isDisabledWithReason && (React.createElement(React.Fragment, null,
|
|
22
22
|
descriptionEl,
|
|
23
|
-
showTooltip && (React.createElement(Tooltip, { className: styles['disabled-reason-tooltip'], trackRef: ref, value: disabledReason }))))));
|
|
23
|
+
showTooltip && (React.createElement(Tooltip, { className: styles['disabled-reason-tooltip'], trackRef: ref, value: disabledReason, onDismiss: () => setShowTooltip(false) }))))));
|
|
24
24
|
});
|
|
25
25
|
applyDisplayName(GridCell, 'GridCell');
|
|
26
26
|
export default function Grid({ isDateEnabled, dateDisabledReason, focusedDate, focusableDate, onSelectDate, selectedDate, ariaLabelledby, header, rows, isCurrentPage, renderDate, renderDateAnnouncement, isSameDate, onGridKeyDownHandler, }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/calendar/grid/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { forwardRef, TdHTMLAttributes, useRef, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { DatePickerProps } from '../../date-picker/interfaces';\nimport ScreenreaderOnly from '../../internal/components/screenreader-only/index.js';\nimport Tooltip from '../../internal/components/tooltip';\nimport { useEffectOnUpdate } from '../../internal/hooks/use-effect-on-update.js';\nimport useHiddenDescription from '../../internal/hooks/use-hidden-description';\nimport { useMergeRefs } from '../../internal/hooks/use-merge-refs';\nimport { applyDisplayName } from '../../internal/utils/apply-display-name';\nimport { CalendarProps } from '../interfaces';\n\nimport styles from '../styles.css.js';\n\n/**\n * Calendar grid supports two mechanisms of keyboard navigation:\n * - Native screen-reader table navigation (semantic table markup);\n * - Keyboard arrow-keys navigation (a custom key-down handler).\n *\n * The implementation largely follows the w3 example (https://www.w3.org/WAI/ARIA/apg/example-index/dialog-modal/datepicker-dialog) and shares the following issues:\n * - (table navigation) Chrome+VO - weekday is announced twice when navigating to the calendar's header;\n * - (table navigation) Safari+VO - \"dimmed\" state is announced twice;\n * - (table navigation) Firefox/Chrome+NVDA - cannot use table navigation if any cell has a focus;\n * - (keyboard navigation) Firefox+NVDA - every date is announced as \"not selected\";\n * - (keyboard navigation) Safari/Chrome+VO - weekdays are not announced;\n * - (keyboard navigation) Safari/Chrome+VO - dates are not announced as interactive (clickable or selectable);\n * - (keyboard navigation) Safari/Chrome+VO - date announcements are not interruptive and can be missed if navigating fast.\n */\n\nexport interface GridProps {\n isDateEnabled: DatePickerProps.IsDateEnabledFunction;\n dateDisabledReason: CalendarProps.DateDisabledReasonFunction;\n focusedDate: Date | null;\n focusableDate: Date | null;\n onSelectDate: (date: Date) => void;\n onFocusDate: (date: null | Date) => void;\n onChangePage: (date: Date) => void;\n selectedDate: Date | null;\n ariaLabelledby: string;\n header?: React.ReactNode;\n rows: ReadonlyArray<ReadonlyArray<Date>>;\n isCurrentPage: (date: Date) => boolean;\n renderDate: (date: Date) => string;\n renderDateAnnouncement: (date: Date, isOnCurrentDate: boolean) => string;\n isSameDate: (date: Date, baseDate: Date) => boolean;\n onGridKeyDownHandler: (event: React.KeyboardEvent<HTMLElement>) => void;\n}\n\ninterface GridCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n disabledReason?: string;\n}\n\nconst GridCell = forwardRef((props: GridCellProps, focusedDateRef: React.Ref<HTMLTableCellElement>) => {\n const { disabledReason, ...rest } = props;\n const isDisabledWithReason = !!disabledReason;\n const { targetProps, descriptionEl } = useHiddenDescription(disabledReason);\n const ref = useRef<HTMLTableCellElement>(null);\n const [showTooltip, setShowTooltip] = useState(false);\n\n return (\n <td\n ref={useMergeRefs(focusedDateRef, ref)}\n {...(isDisabledWithReason ? targetProps : {})}\n {...rest}\n onFocus={() => (isDisabledWithReason ? setShowTooltip(true) : undefined)}\n onBlur={() => (isDisabledWithReason ? setShowTooltip(false) : undefined)}\n onMouseEnter={() => (isDisabledWithReason ? setShowTooltip(true) : undefined)}\n onMouseLeave={() => (isDisabledWithReason ? setShowTooltip(false) : undefined)}\n >\n {props.children}\n {isDisabledWithReason && (\n <>\n {descriptionEl}\n {showTooltip && (\n <Tooltip className={styles['disabled-reason-tooltip']} trackRef={ref} value={disabledReason!} />\n )}\n </>\n )}\n </td>\n );\n});\n\napplyDisplayName(GridCell, 'GridCell');\n\nexport default function Grid({\n isDateEnabled,\n dateDisabledReason,\n focusedDate,\n focusableDate,\n onSelectDate,\n selectedDate,\n ariaLabelledby,\n header,\n rows,\n isCurrentPage,\n renderDate,\n renderDateAnnouncement,\n isSameDate,\n onGridKeyDownHandler,\n}: GridProps) {\n const focusedDateRef = useRef<HTMLTableCellElement>(null);\n\n // The focused date changes as a feedback to keyboard navigation in the grid.\n // Once changed, the corresponding date button needs to receive the actual focus.\n useEffectOnUpdate(() => {\n if (focusedDate && focusedDateRef.current) {\n (focusedDateRef.current as HTMLDivElement).focus();\n }\n }, [focusedDate]);\n\n const rowLength = rows[0].length;\n\n const denseGrid = rowLength > 3;\n\n return (\n <table\n role=\"grid\"\n className={clsx(styles['calendar-grid'], denseGrid && styles['calendar-grid-dense'])}\n aria-labelledby={ariaLabelledby}\n >\n {header}\n <tbody onKeyDown={onGridKeyDownHandler}>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} className={styles['calendar-row']}>\n {row.map((date, dateIndex) => {\n const isFocusable = !!focusableDate && isSameDate(date, focusableDate);\n const isSelected = !!selectedDate && isSameDate(date, selectedDate);\n const isEnabled = !isDateEnabled || isDateEnabled(date);\n const disabledReason = dateDisabledReason(date);\n const isDisabledWithReason = !isEnabled && !!disabledReason;\n const isCurrentDate = isSameDate(date, new Date());\n\n // Can't be focused.\n let tabIndex = undefined;\n if (isFocusable && (isEnabled || isDisabledWithReason)) {\n // Next focus target.\n tabIndex = 0;\n } else if (isEnabled || isDisabledWithReason) {\n // Can be focused programmatically.\n tabIndex = -1;\n }\n\n return (\n <GridCell\n key={`${rowIndex}:${dateIndex}`}\n ref={tabIndex === 0 ? focusedDateRef : undefined}\n tabIndex={tabIndex}\n aria-current={isCurrentDate ? 'date' : undefined}\n aria-selected={isEnabled ? isSelected : undefined}\n aria-disabled={!isEnabled}\n // Do not attach click event when the date is disabled, otherwise VO+safari announces clickable\n onClick={isEnabled ? () => onSelectDate(date) : undefined}\n className={clsx(styles['calendar-grid-cell'], styles['calendar-date'], {\n [styles['calendar-date-current-page']]: isCurrentPage(date),\n [styles['calendar-date-enabled']]: isEnabled,\n [styles['calendar-date-selected']]: isSelected,\n [styles['calendar-date-current']]: isCurrentDate,\n [styles['calendar-date-dense']]: denseGrid,\n })}\n disabledReason={isDisabledWithReason ? disabledReason : undefined}\n >\n <span className={styles['date-inner']} aria-hidden=\"true\">\n {renderDate(date)}\n </span>\n {/* Screen-reader announcement for the focused date. */}\n <ScreenreaderOnly>{renderDateAnnouncement(date, isCurrentDate)}</ScreenreaderOnly>\n </GridCell>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/calendar/grid/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { forwardRef, TdHTMLAttributes, useRef, useState } from 'react';\nimport clsx from 'clsx';\n\nimport { DatePickerProps } from '../../date-picker/interfaces';\nimport ScreenreaderOnly from '../../internal/components/screenreader-only/index.js';\nimport Tooltip from '../../internal/components/tooltip';\nimport { useEffectOnUpdate } from '../../internal/hooks/use-effect-on-update.js';\nimport useHiddenDescription from '../../internal/hooks/use-hidden-description';\nimport { useMergeRefs } from '../../internal/hooks/use-merge-refs';\nimport { applyDisplayName } from '../../internal/utils/apply-display-name';\nimport { CalendarProps } from '../interfaces';\n\nimport styles from '../styles.css.js';\n\n/**\n * Calendar grid supports two mechanisms of keyboard navigation:\n * - Native screen-reader table navigation (semantic table markup);\n * - Keyboard arrow-keys navigation (a custom key-down handler).\n *\n * The implementation largely follows the w3 example (https://www.w3.org/WAI/ARIA/apg/example-index/dialog-modal/datepicker-dialog) and shares the following issues:\n * - (table navigation) Chrome+VO - weekday is announced twice when navigating to the calendar's header;\n * - (table navigation) Safari+VO - \"dimmed\" state is announced twice;\n * - (table navigation) Firefox/Chrome+NVDA - cannot use table navigation if any cell has a focus;\n * - (keyboard navigation) Firefox+NVDA - every date is announced as \"not selected\";\n * - (keyboard navigation) Safari/Chrome+VO - weekdays are not announced;\n * - (keyboard navigation) Safari/Chrome+VO - dates are not announced as interactive (clickable or selectable);\n * - (keyboard navigation) Safari/Chrome+VO - date announcements are not interruptive and can be missed if navigating fast.\n */\n\nexport interface GridProps {\n isDateEnabled: DatePickerProps.IsDateEnabledFunction;\n dateDisabledReason: CalendarProps.DateDisabledReasonFunction;\n focusedDate: Date | null;\n focusableDate: Date | null;\n onSelectDate: (date: Date) => void;\n onFocusDate: (date: null | Date) => void;\n onChangePage: (date: Date) => void;\n selectedDate: Date | null;\n ariaLabelledby: string;\n header?: React.ReactNode;\n rows: ReadonlyArray<ReadonlyArray<Date>>;\n isCurrentPage: (date: Date) => boolean;\n renderDate: (date: Date) => string;\n renderDateAnnouncement: (date: Date, isOnCurrentDate: boolean) => string;\n isSameDate: (date: Date, baseDate: Date) => boolean;\n onGridKeyDownHandler: (event: React.KeyboardEvent<HTMLElement>) => void;\n}\n\ninterface GridCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n disabledReason?: string;\n}\n\nconst GridCell = forwardRef((props: GridCellProps, focusedDateRef: React.Ref<HTMLTableCellElement>) => {\n const { disabledReason, ...rest } = props;\n const isDisabledWithReason = !!disabledReason;\n const { targetProps, descriptionEl } = useHiddenDescription(disabledReason);\n const ref = useRef<HTMLTableCellElement>(null);\n const [showTooltip, setShowTooltip] = useState(false);\n\n return (\n <td\n ref={useMergeRefs(focusedDateRef, ref)}\n {...(isDisabledWithReason ? targetProps : {})}\n {...rest}\n onFocus={() => (isDisabledWithReason ? setShowTooltip(true) : undefined)}\n onBlur={() => (isDisabledWithReason ? setShowTooltip(false) : undefined)}\n onMouseEnter={() => (isDisabledWithReason ? setShowTooltip(true) : undefined)}\n onMouseLeave={() => (isDisabledWithReason ? setShowTooltip(false) : undefined)}\n >\n {props.children}\n {isDisabledWithReason && (\n <>\n {descriptionEl}\n {showTooltip && (\n <Tooltip\n className={styles['disabled-reason-tooltip']}\n trackRef={ref}\n value={disabledReason!}\n onDismiss={() => setShowTooltip(false)}\n />\n )}\n </>\n )}\n </td>\n );\n});\n\napplyDisplayName(GridCell, 'GridCell');\n\nexport default function Grid({\n isDateEnabled,\n dateDisabledReason,\n focusedDate,\n focusableDate,\n onSelectDate,\n selectedDate,\n ariaLabelledby,\n header,\n rows,\n isCurrentPage,\n renderDate,\n renderDateAnnouncement,\n isSameDate,\n onGridKeyDownHandler,\n}: GridProps) {\n const focusedDateRef = useRef<HTMLTableCellElement>(null);\n\n // The focused date changes as a feedback to keyboard navigation in the grid.\n // Once changed, the corresponding date button needs to receive the actual focus.\n useEffectOnUpdate(() => {\n if (focusedDate && focusedDateRef.current) {\n (focusedDateRef.current as HTMLDivElement).focus();\n }\n }, [focusedDate]);\n\n const rowLength = rows[0].length;\n\n const denseGrid = rowLength > 3;\n\n return (\n <table\n role=\"grid\"\n className={clsx(styles['calendar-grid'], denseGrid && styles['calendar-grid-dense'])}\n aria-labelledby={ariaLabelledby}\n >\n {header}\n <tbody onKeyDown={onGridKeyDownHandler}>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex} className={styles['calendar-row']}>\n {row.map((date, dateIndex) => {\n const isFocusable = !!focusableDate && isSameDate(date, focusableDate);\n const isSelected = !!selectedDate && isSameDate(date, selectedDate);\n const isEnabled = !isDateEnabled || isDateEnabled(date);\n const disabledReason = dateDisabledReason(date);\n const isDisabledWithReason = !isEnabled && !!disabledReason;\n const isCurrentDate = isSameDate(date, new Date());\n\n // Can't be focused.\n let tabIndex = undefined;\n if (isFocusable && (isEnabled || isDisabledWithReason)) {\n // Next focus target.\n tabIndex = 0;\n } else if (isEnabled || isDisabledWithReason) {\n // Can be focused programmatically.\n tabIndex = -1;\n }\n\n return (\n <GridCell\n key={`${rowIndex}:${dateIndex}`}\n ref={tabIndex === 0 ? focusedDateRef : undefined}\n tabIndex={tabIndex}\n aria-current={isCurrentDate ? 'date' : undefined}\n aria-selected={isEnabled ? isSelected : undefined}\n aria-disabled={!isEnabled}\n // Do not attach click event when the date is disabled, otherwise VO+safari announces clickable\n onClick={isEnabled ? () => onSelectDate(date) : undefined}\n className={clsx(styles['calendar-grid-cell'], styles['calendar-date'], {\n [styles['calendar-date-current-page']]: isCurrentPage(date),\n [styles['calendar-date-enabled']]: isEnabled,\n [styles['calendar-date-selected']]: isSelected,\n [styles['calendar-date-current']]: isCurrentDate,\n [styles['calendar-date-dense']]: denseGrid,\n })}\n disabledReason={isDisabledWithReason ? disabledReason : undefined}\n >\n <span className={styles['date-inner']} aria-hidden=\"true\">\n {renderDate(date)}\n </span>\n {/* Screen-reader announcement for the focused date. */}\n <ScreenreaderOnly>{renderDateAnnouncement(date, isCurrentDate)}</ScreenreaderOnly>\n </GridCell>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid-cell.d.ts","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/grid-cell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAc,gBAAgB,EAAoB,MAAM,OAAO,CAAC;AAS9E,UAAU,aAAc,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"grid-cell.d.ts","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/grid-cell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAc,gBAAgB,EAAoB,MAAM,OAAO,CAAC;AAS9E,UAAU,aAAc,SAAQ,gBAAgB,CAAC,oBAAoB,CAAC;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,QAAQ,4FAiEnB,CAAC"}
|
|
@@ -6,7 +6,7 @@ import Tooltip from '../../../internal/components/tooltip';
|
|
|
6
6
|
import useHiddenDescription from '../../../internal/hooks/use-hidden-description';
|
|
7
7
|
import { useMergeRefs } from '../../../internal/hooks/use-merge-refs';
|
|
8
8
|
import { applyDisplayName } from '../../../internal/utils/apply-display-name';
|
|
9
|
-
import
|
|
9
|
+
import testutilStyles from '../../test-classes/styles.css.js';
|
|
10
10
|
export const GridCell = forwardRef((props, focusedDateRef) => {
|
|
11
11
|
const { disabledReason } = props, rest = __rest(props, ["disabledReason"]);
|
|
12
12
|
const isDisabledWithReason = !!disabledReason;
|
|
@@ -45,7 +45,7 @@ export const GridCell = forwardRef((props, focusedDateRef) => {
|
|
|
45
45
|
props.children,
|
|
46
46
|
isDisabledWithReason && (React.createElement(React.Fragment, null,
|
|
47
47
|
descriptionEl,
|
|
48
|
-
showTooltip && (React.createElement(Tooltip, { className:
|
|
48
|
+
showTooltip && (React.createElement(Tooltip, { className: testutilStyles['disabled-reason-tooltip'], trackRef: ref, value: disabledReason, onDismiss: () => setShowTooltip(false) }))))));
|
|
49
49
|
});
|
|
50
50
|
applyDisplayName(GridCell, 'GridCell');
|
|
51
51
|
//# sourceMappingURL=grid-cell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid-cell.js","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/grid-cell.tsx"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,EAAE,EAAE,UAAU,EAAoB,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9E,OAAO,OAAO,MAAM,sCAAsC,CAAC;AAC3D,OAAO,oBAAoB,MAAM,gDAAgD,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,OAAO,
|
|
1
|
+
{"version":3,"file":"grid-cell.js","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/grid-cell.tsx"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,EAAE,EAAE,UAAU,EAAoB,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9E,OAAO,OAAO,MAAM,sCAAsC,CAAC;AAC3D,OAAO,oBAAoB,MAAM,gDAAgD,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAE9E,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAM9D,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,KAAoB,EAAE,cAA+C,EAAE,EAAE;IAC3G,MAAM,EAAE,cAAc,KAAc,KAAK,EAAd,IAAI,UAAK,KAAK,EAAnC,kBAA2B,CAAQ,CAAC;IAC1C,MAAM,oBAAoB,GAAG,CAAC,CAAC,cAAc,CAAC;IAC9C,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,OAAO,CACL,0CACE,GAAG,EAAE,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,IAClC,IAAI,EACJ,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAC7C,OAAO,EAAE,KAAK,CAAC,EAAE;YACf,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aACrB;YAED,IAAI,oBAAoB,EAAE;gBACxB,cAAc,CAAC,IAAI,CAAC,CAAC;aACtB;QACH,CAAC,EACD,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACpB;YAED,IAAI,oBAAoB,EAAE;gBACxB,cAAc,CAAC,KAAK,CAAC,CAAC;aACvB;QACH,CAAC,EACD,YAAY,EAAE,KAAK,CAAC,EAAE;YACpB,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;YAED,IAAI,oBAAoB,EAAE;gBACxB,cAAc,CAAC,IAAI,CAAC,CAAC;aACtB;QACH,CAAC,EACD,YAAY,EAAE,KAAK,CAAC,EAAE;YACpB,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;aAC1B;YAED,IAAI,oBAAoB,EAAE;gBACxB,cAAc,CAAC,KAAK,CAAC,CAAC;aACvB;QACH,CAAC;QAEA,KAAK,CAAC,QAAQ;QACd,oBAAoB,IAAI,CACvB;YACG,aAAa;YACb,WAAW,IAAI,CACd,oBAAC,OAAO,IACN,SAAS,EAAE,cAAc,CAAC,yBAAyB,CAAC,EACpD,QAAQ,EAAE,GAAG,EACb,KAAK,EAAE,cAAe,EACtB,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GACtC,CACH,CACA,CACJ,CACE,CACN,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { forwardRef, TdHTMLAttributes, useRef, useState } from 'react';\n\nimport Tooltip from '../../../internal/components/tooltip';\nimport useHiddenDescription from '../../../internal/hooks/use-hidden-description';\nimport { useMergeRefs } from '../../../internal/hooks/use-merge-refs';\nimport { applyDisplayName } from '../../../internal/utils/apply-display-name';\n\nimport testutilStyles from '../../test-classes/styles.css.js';\n\ninterface GridCellProps extends TdHTMLAttributes<HTMLTableCellElement> {\n disabledReason?: string;\n}\n\nexport const GridCell = forwardRef((props: GridCellProps, focusedDateRef: React.Ref<HTMLTableCellElement>) => {\n const { disabledReason, ...rest } = props;\n const isDisabledWithReason = !!disabledReason;\n const { targetProps, descriptionEl } = useHiddenDescription(disabledReason);\n const ref = useRef<HTMLTableCellElement>(null);\n const [showTooltip, setShowTooltip] = useState(false);\n\n return (\n <td\n ref={useMergeRefs(focusedDateRef, ref)}\n {...rest}\n {...(isDisabledWithReason ? targetProps : {})}\n onFocus={event => {\n if (rest.onFocus) {\n rest.onFocus(event);\n }\n\n if (isDisabledWithReason) {\n setShowTooltip(true);\n }\n }}\n onBlur={event => {\n if (rest.onBlur) {\n rest.onBlur(event);\n }\n\n if (isDisabledWithReason) {\n setShowTooltip(false);\n }\n }}\n onMouseEnter={event => {\n if (rest.onMouseEnter) {\n rest.onMouseEnter(event);\n }\n\n if (isDisabledWithReason) {\n setShowTooltip(true);\n }\n }}\n onMouseLeave={event => {\n if (rest.onMouseLeave) {\n rest.onMouseLeave(event);\n }\n\n if (isDisabledWithReason) {\n setShowTooltip(false);\n }\n }}\n >\n {props.children}\n {isDisabledWithReason && (\n <>\n {descriptionEl}\n {showTooltip && (\n <Tooltip\n className={testutilStyles['disabled-reason-tooltip']}\n trackRef={ref}\n value={disabledReason!}\n onDismiss={() => setShowTooltip(false)}\n />\n )}\n </>\n )}\n </td>\n );\n});\n\napplyDisplayName(GridCell, 'GridCell');\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { GridProps } from './interfaces';
|
|
3
|
+
/**
|
|
4
|
+
* Calendar grid supports two mechanisms of keyboard navigation:
|
|
5
|
+
* - Native screen-reader table navigation (semantic table markup);
|
|
6
|
+
* - Keyboard arrow-keys navigation (a custom key-down handler).
|
|
7
|
+
*
|
|
8
|
+
* The implementation largely follows the w3 example (https://www.w3.org/WAI/ARIA/apg/example-index/dialog-modal/datepicker-dialog) and shares the following issues:
|
|
9
|
+
* - (table navigation) Chrome+VO - weekday is announced twice when navigating to the calendar's header;
|
|
10
|
+
* - (table navigation) Safari+VO - "dimmed" state is announced twice;
|
|
11
|
+
* - (table navigation) Firefox/Chrome+NVDA - cannot use table navigation if any cell has a focus;
|
|
12
|
+
* - (keyboard navigation) Firefox+NVDA - every day is announced as "not selected";
|
|
13
|
+
* - (keyboard navigation) Safari/Chrome+VO - weekdays are not announced;
|
|
14
|
+
* - (keyboard navigation) Safari/Chrome+VO - days are not announced as interactive (clickable or selectable);
|
|
15
|
+
* - (keyboard navigation) Safari/Chrome+VO - day announcements are not interruptive and can be missed if navigating fast.
|
|
16
|
+
*/
|
|
17
|
+
export declare function Grid({ padDates, baseDate, selectedStartDate, selectedEndDate, rangeStartDate, rangeEndDate, focusedDate, focusedDateRef, onSelectDate, onGridKeyDownHandler, onFocusedDateChange, isDateEnabled, dateDisabledReason, locale, todayAriaLabel, currentMonthAriaLabel, ariaLabelledby, className, startOfWeek: rawStartOfWeek, granularity, }: GridProps): JSX.Element;
|
|
18
|
+
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/grid.tsx"],"names":[],"mappings":";AAYA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAoCzC;;;;;;;;;;;;;GAaG;AAEH,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EAEX,cAAc,EAEd,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EAEnB,aAAa,EACb,kBAAkB,EAElB,MAAM,EACN,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,SAAS,EACT,WAAW,EAAE,cAAkB,EAC/B,WAAmB,GACpB,EAAE,SAAS,eA6MX"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import { isLastDayOfMonth, isSameDay, isSameMonth, isSameYear, isThisMonth, isToday } from 'date-fns';
|
|
6
|
+
import { useInternalI18n } from '../../../i18n/context';
|
|
7
|
+
import ScreenreaderOnly from '../../../internal/components/screenreader-only';
|
|
8
|
+
import { formatDate } from '../../../internal/utils/date-time';
|
|
9
|
+
import { MonthCalendar, YearCalendar } from '../../../internal/utils/date-time/calendar';
|
|
10
|
+
import { normalizeStartOfWeek } from '../../../internal/utils/locale/index.js';
|
|
11
|
+
import { GridCell } from './grid-cell';
|
|
12
|
+
import { renderDateAnnouncement, renderDayName } from './intl';
|
|
13
|
+
import testutilStyles from '../../test-classes/styles.css.js';
|
|
14
|
+
import styles from './styles.css.js';
|
|
15
|
+
const dayUtils = {
|
|
16
|
+
getItemKey: (rowIndex, rowItemIndex) => `${rowIndex}:${rowItemIndex}`,
|
|
17
|
+
isSameItem: (date1, date2) => isSameDay(date1, date2),
|
|
18
|
+
isSamePage: (date1, date2) => isSameMonth(date1, date2),
|
|
19
|
+
checkIfCurrentDay: date => isToday(date),
|
|
20
|
+
checkIfCurrentMonth: () => false,
|
|
21
|
+
checkIfCurrent: date => isToday(date),
|
|
22
|
+
getPageName: () => 'month',
|
|
23
|
+
};
|
|
24
|
+
const monthUtils = {
|
|
25
|
+
getItemKey: (rowIndex, rowItemIndex) => `Month ${rowIndex * 3 + rowItemIndex + 1}`,
|
|
26
|
+
isSameItem: (date1, date2) => isSameMonth(date1, date2),
|
|
27
|
+
isSamePage: (date1, date2) => isSameYear(date1, date2),
|
|
28
|
+
checkIfCurrentDay: () => false,
|
|
29
|
+
checkIfCurrentMonth: date => isThisMonth(date),
|
|
30
|
+
checkIfCurrent: date => isThisMonth(date),
|
|
31
|
+
getPageName: () => 'year',
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Calendar grid supports two mechanisms of keyboard navigation:
|
|
35
|
+
* - Native screen-reader table navigation (semantic table markup);
|
|
36
|
+
* - Keyboard arrow-keys navigation (a custom key-down handler).
|
|
37
|
+
*
|
|
38
|
+
* The implementation largely follows the w3 example (https://www.w3.org/WAI/ARIA/apg/example-index/dialog-modal/datepicker-dialog) and shares the following issues:
|
|
39
|
+
* - (table navigation) Chrome+VO - weekday is announced twice when navigating to the calendar's header;
|
|
40
|
+
* - (table navigation) Safari+VO - "dimmed" state is announced twice;
|
|
41
|
+
* - (table navigation) Firefox/Chrome+NVDA - cannot use table navigation if any cell has a focus;
|
|
42
|
+
* - (keyboard navigation) Firefox+NVDA - every day is announced as "not selected";
|
|
43
|
+
* - (keyboard navigation) Safari/Chrome+VO - weekdays are not announced;
|
|
44
|
+
* - (keyboard navigation) Safari/Chrome+VO - days are not announced as interactive (clickable or selectable);
|
|
45
|
+
* - (keyboard navigation) Safari/Chrome+VO - day announcements are not interruptive and can be missed if navigating fast.
|
|
46
|
+
*/
|
|
47
|
+
export function Grid({ padDates, baseDate, selectedStartDate, selectedEndDate, rangeStartDate, rangeEndDate, focusedDate, focusedDateRef, onSelectDate, onGridKeyDownHandler, onFocusedDateChange, isDateEnabled, dateDisabledReason, locale, todayAriaLabel, currentMonthAriaLabel, ariaLabelledby, className, startOfWeek: rawStartOfWeek = 0, granularity = 'day', }) {
|
|
48
|
+
const baseDateTime = baseDate === null || baseDate === void 0 ? void 0 : baseDate.getTime();
|
|
49
|
+
const i18n = useInternalI18n('date-range-picker');
|
|
50
|
+
const isMonthPicker = granularity === 'month';
|
|
51
|
+
const startOfWeek = normalizeStartOfWeek(rawStartOfWeek, locale);
|
|
52
|
+
const calendar = useMemo(() => {
|
|
53
|
+
const startDate = rangeStartDate !== null && rangeStartDate !== void 0 ? rangeStartDate : rangeEndDate;
|
|
54
|
+
const endDate = rangeEndDate !== null && rangeEndDate !== void 0 ? rangeEndDate : rangeStartDate;
|
|
55
|
+
const selection = startDate && endDate ? [startDate, endDate] : null;
|
|
56
|
+
if (isMonthPicker) {
|
|
57
|
+
const calendarData = new YearCalendar({ baseDate, selection });
|
|
58
|
+
return {
|
|
59
|
+
header: [],
|
|
60
|
+
rows: calendarData.quarters,
|
|
61
|
+
range: calendarData.range,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const calendarData = new MonthCalendar({ padDates, startOfWeek, baseDate, selection });
|
|
65
|
+
return {
|
|
66
|
+
header: calendarData.weekdays,
|
|
67
|
+
rows: calendarData.weeks,
|
|
68
|
+
range: calendarData.range,
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
|
+
[padDates, startOfWeek, baseDateTime, rangeStartDate, rangeEndDate]);
|
|
73
|
+
const currentAnnouncement = i18n(isMonthPicker ? 'i18nStrings.currentMonthAriaLabel' : 'i18nStrings.todayAriaLabel', isMonthPicker ? currentMonthAriaLabel : todayAriaLabel);
|
|
74
|
+
return (React.createElement("table", { role: "grid", "aria-labelledby": ariaLabelledby, className: clsx(styles.grid, className) },
|
|
75
|
+
!isMonthPicker && (React.createElement("thead", null,
|
|
76
|
+
React.createElement("tr", null, calendar.header.map(dayIndex => (React.createElement("th", { key: dayIndex, scope: "col", className: clsx(styles['grid-cell'], styles['day-header'], testutilStyles['day-header']) },
|
|
77
|
+
React.createElement("span", { "aria-hidden": "true" }, renderDayName(locale, dayIndex, 'short')),
|
|
78
|
+
React.createElement(ScreenreaderOnly, null, renderDayName(locale, dayIndex, 'long')))))))),
|
|
79
|
+
React.createElement("tbody", { onKeyDown: onGridKeyDownHandler }, calendar.rows.map((row, rowIndex) => {
|
|
80
|
+
const rowItems = isMonthPicker ? row.months : row.days;
|
|
81
|
+
const weekTestIndex = !isMonthPicker ? row.testIndex : undefined;
|
|
82
|
+
return (React.createElement("tr", Object.assign({ key: rowIndex, className: clsx({
|
|
83
|
+
[testutilStyles['calendar-quarter']]: isMonthPicker,
|
|
84
|
+
[testutilStyles['calendar-week']]: !isMonthPicker,
|
|
85
|
+
}) }, (!isMonthPicker && weekTestIndex
|
|
86
|
+
? {
|
|
87
|
+
['data-awsui-weekindex']: weekTestIndex,
|
|
88
|
+
}
|
|
89
|
+
: {})), rowItems.map(({ date, isVisible, isInRange, isSelectionTop, isSelectionBottom, isSelectionLeft, isSelectionRight }, rowItemIndex) => {
|
|
90
|
+
const { getItemKey, isSameItem, isSamePage, checkIfCurrent, checkIfCurrentDay, checkIfCurrentMonth, getPageName, } = isMonthPicker ? monthUtils : dayUtils;
|
|
91
|
+
const itemKey = getItemKey(rowIndex, rowItemIndex);
|
|
92
|
+
const pageName = getPageName();
|
|
93
|
+
const isCurrentDay = checkIfCurrentDay(date);
|
|
94
|
+
const isCurrentMonth = checkIfCurrentMonth(date);
|
|
95
|
+
const isCurrent = checkIfCurrent(date);
|
|
96
|
+
const isStartDate = !!selectedStartDate && isSameItem(date, selectedStartDate);
|
|
97
|
+
const isEndDate = !!selectedEndDate && isSameItem(date, selectedEndDate);
|
|
98
|
+
const isSelected = isStartDate || isEndDate;
|
|
99
|
+
const isFocused = !!focusedDate && isSameItem(date, focusedDate) && isSamePage(date, baseDate);
|
|
100
|
+
const onlyOneSelected = !!rangeStartDate && !!rangeEndDate
|
|
101
|
+
? isSameItem(rangeStartDate, rangeEndDate)
|
|
102
|
+
: !selectedStartDate || !selectedEndDate;
|
|
103
|
+
const isEnabled = (!isDateEnabled || isDateEnabled(date)) && isSamePage(date, baseDate);
|
|
104
|
+
const disabledReason = dateDisabledReason(date);
|
|
105
|
+
const isDisabledWithReason = !isEnabled && !!disabledReason;
|
|
106
|
+
const isFocusable = isFocused && (isEnabled || isDisabledWithReason);
|
|
107
|
+
const baseClasses = {
|
|
108
|
+
[testutilStyles['calendar-date']]: !isMonthPicker && isSameMonth(date, baseDate),
|
|
109
|
+
[testutilStyles['calendar-month']]: isMonthPicker && isSameYear(date, baseDate),
|
|
110
|
+
[styles.day]: !isMonthPicker,
|
|
111
|
+
[styles.month]: isMonthPicker,
|
|
112
|
+
[styles['grid-cell']]: true,
|
|
113
|
+
[styles['in-first-row']]: rowIndex === 0,
|
|
114
|
+
[styles['in-first-column']]: rowItemIndex === 0,
|
|
115
|
+
};
|
|
116
|
+
if (!isVisible) {
|
|
117
|
+
return (React.createElement("td", { key: itemKey, ref: isFocused ? focusedDateRef : undefined, className: clsx(baseClasses, {
|
|
118
|
+
[styles[`last-day-of-month`]]: !isMonthPicker && isLastDayOfMonth(date),
|
|
119
|
+
[styles[`last-month-of-year`]]: isMonthPicker && date.getMonth() === 11,
|
|
120
|
+
}) }));
|
|
121
|
+
}
|
|
122
|
+
const handlers = {};
|
|
123
|
+
if (isEnabled) {
|
|
124
|
+
handlers.onClick = () => onSelectDate(date);
|
|
125
|
+
handlers.onFocus = () => onFocusedDateChange(date);
|
|
126
|
+
}
|
|
127
|
+
// Screen-reader announcement for the focused day/month.
|
|
128
|
+
let announcement = renderDateAnnouncement({
|
|
129
|
+
date,
|
|
130
|
+
isCurrent,
|
|
131
|
+
locale,
|
|
132
|
+
granularity,
|
|
133
|
+
});
|
|
134
|
+
if (currentAnnouncement) {
|
|
135
|
+
if (isMonthPicker && isThisMonth(date)) {
|
|
136
|
+
announcement += `. ${currentAnnouncement}`;
|
|
137
|
+
}
|
|
138
|
+
else if (!isMonthPicker && isToday(date)) {
|
|
139
|
+
announcement += `. ${currentAnnouncement}`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Can't be focused.
|
|
143
|
+
let tabIndex = undefined;
|
|
144
|
+
if (isEnabled || isDisabledWithReason) {
|
|
145
|
+
tabIndex = isFocusable
|
|
146
|
+
? 0 // Next focus target.
|
|
147
|
+
: -1; // Can be focused programmatically.
|
|
148
|
+
}
|
|
149
|
+
return (React.createElement(GridCell, Object.assign({ ref: isFocused ? focusedDateRef : undefined, key: itemKey, className: clsx(baseClasses, {
|
|
150
|
+
[styles['in-visible-calendar']]: true,
|
|
151
|
+
[styles[`in-current-${pageName}`]]: isSamePage(date, baseDate),
|
|
152
|
+
[styles.enabled]: isEnabled,
|
|
153
|
+
[styles.selected]: isSelected,
|
|
154
|
+
[styles['start-date']]: isStartDate,
|
|
155
|
+
[styles['end-date']]: isEndDate,
|
|
156
|
+
[testutilStyles['start-date']]: isStartDate,
|
|
157
|
+
[testutilStyles['end-date']]: isEndDate,
|
|
158
|
+
[styles['no-range']]: isSelected && onlyOneSelected,
|
|
159
|
+
[styles['in-range']]: isInRange,
|
|
160
|
+
[styles['in-range-border-block-start']]: isSelectionTop,
|
|
161
|
+
[styles['in-range-border-block-end']]: isSelectionBottom,
|
|
162
|
+
[styles['in-range-border-inline-start']]: isSelectionLeft,
|
|
163
|
+
[styles['in-range-border-inline-end']]: isSelectionRight,
|
|
164
|
+
[styles.today]: isCurrentDay,
|
|
165
|
+
[testutilStyles.today]: isCurrentDay,
|
|
166
|
+
[styles['this-month']]: isCurrentMonth,
|
|
167
|
+
[testutilStyles['this-month']]: isCurrentMonth,
|
|
168
|
+
}), "aria-selected": isEnabled ? isSelected || isInRange : undefined, "aria-current": isCurrent ? 'date' : undefined, "data-date": formatDate(date, granularity), "aria-disabled": !isEnabled, tabIndex: tabIndex, disabledReason: isDisabledWithReason ? disabledReason : undefined }, handlers),
|
|
169
|
+
React.createElement("span", { className: styles[`${granularity}-inner`], "aria-hidden": "true" }, isMonthPicker ? date.toLocaleString(locale, { month: 'short' }) : date.getDate()),
|
|
170
|
+
React.createElement(ScreenreaderOnly, null, announcement)));
|
|
171
|
+
})));
|
|
172
|
+
}))));
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.js","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/grid.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useMemo } from 'react';\nimport clsx from 'clsx';\nimport { isLastDayOfMonth, isSameDay, isSameMonth, isSameYear, isThisMonth, isToday } from 'date-fns';\n\nimport { useInternalI18n } from '../../../i18n/context';\nimport ScreenreaderOnly from '../../../internal/components/screenreader-only';\nimport { formatDate } from '../../../internal/utils/date-time';\nimport { CalendarQuarter, CalendarWeek, MonthCalendar, YearCalendar } from '../../../internal/utils/date-time/calendar';\nimport { normalizeStartOfWeek } from '../../../internal/utils/locale/index.js';\nimport { GridCell } from './grid-cell';\nimport { GridProps } from './interfaces';\nimport { renderDateAnnouncement, renderDayName } from './intl';\n\nimport testutilStyles from '../../test-classes/styles.css.js';\nimport styles from './styles.css.js';\n\ninterface DatePickerUtils {\n getItemKey: (rowIndex: number, rowItemIndex: number) => string;\n isSameItem: (date1: Date, date2: Date) => boolean;\n isSamePage: (date1: Date, date2: Date) => boolean;\n checkIfCurrentDay: (date: Date) => boolean;\n checkIfCurrentMonth: (date: Date) => boolean;\n checkIfCurrent: (date: Date) => boolean;\n getPageName: () => string;\n}\n\nconst dayUtils: DatePickerUtils = {\n getItemKey: (rowIndex, rowItemIndex) => `${rowIndex}:${rowItemIndex}`,\n isSameItem: (date1: Date, date2: Date) => isSameDay(date1, date2),\n isSamePage: (date1: Date, date2: Date) => isSameMonth(date1, date2),\n checkIfCurrentDay: date => isToday(date),\n checkIfCurrentMonth: () => false,\n checkIfCurrent: date => isToday(date),\n getPageName: () => 'month',\n};\n\nconst monthUtils: DatePickerUtils = {\n getItemKey: (rowIndex, rowItemIndex) => `Month ${rowIndex * 3 + rowItemIndex + 1}`,\n isSameItem: (date1: Date, date2: Date) => isSameMonth(date1, date2),\n isSamePage: (date1: Date, date2: Date) => isSameYear(date1, date2),\n checkIfCurrentDay: () => false,\n checkIfCurrentMonth: date => isThisMonth(date),\n checkIfCurrent: date => isThisMonth(date),\n getPageName: () => 'year',\n};\n\n/**\n * Calendar grid supports two mechanisms of keyboard navigation:\n * - Native screen-reader table navigation (semantic table markup);\n * - Keyboard arrow-keys navigation (a custom key-down handler).\n *\n * The implementation largely follows the w3 example (https://www.w3.org/WAI/ARIA/apg/example-index/dialog-modal/datepicker-dialog) and shares the following issues:\n * - (table navigation) Chrome+VO - weekday is announced twice when navigating to the calendar's header;\n * - (table navigation) Safari+VO - \"dimmed\" state is announced twice;\n * - (table navigation) Firefox/Chrome+NVDA - cannot use table navigation if any cell has a focus;\n * - (keyboard navigation) Firefox+NVDA - every day is announced as \"not selected\";\n * - (keyboard navigation) Safari/Chrome+VO - weekdays are not announced;\n * - (keyboard navigation) Safari/Chrome+VO - days are not announced as interactive (clickable or selectable);\n * - (keyboard navigation) Safari/Chrome+VO - day announcements are not interruptive and can be missed if navigating fast.\n */\n\nexport function Grid({\n padDates,\n baseDate,\n selectedStartDate,\n selectedEndDate,\n rangeStartDate,\n rangeEndDate,\n focusedDate,\n\n focusedDateRef,\n\n onSelectDate,\n onGridKeyDownHandler,\n onFocusedDateChange,\n\n isDateEnabled,\n dateDisabledReason,\n\n locale,\n todayAriaLabel,\n currentMonthAriaLabel,\n ariaLabelledby,\n className,\n startOfWeek: rawStartOfWeek = 0,\n granularity = 'day',\n}: GridProps) {\n const baseDateTime = baseDate?.getTime();\n const i18n = useInternalI18n('date-range-picker');\n const isMonthPicker = granularity === 'month';\n const startOfWeek = normalizeStartOfWeek(rawStartOfWeek, locale);\n const calendar = useMemo(\n () => {\n const startDate = rangeStartDate ?? rangeEndDate;\n const endDate = rangeEndDate ?? rangeStartDate;\n const selection = startDate && endDate ? ([startDate, endDate] as [Date, Date]) : null;\n if (isMonthPicker) {\n const calendarData = new YearCalendar({ baseDate, selection });\n return {\n header: [],\n rows: calendarData.quarters,\n range: calendarData.range,\n };\n }\n\n const calendarData = new MonthCalendar({ padDates, startOfWeek, baseDate, selection });\n return {\n header: calendarData.weekdays,\n rows: calendarData.weeks,\n range: calendarData.range,\n };\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [padDates, startOfWeek, baseDateTime, rangeStartDate, rangeEndDate]\n );\n\n const currentAnnouncement = i18n(\n isMonthPicker ? 'i18nStrings.currentMonthAriaLabel' : 'i18nStrings.todayAriaLabel',\n isMonthPicker ? currentMonthAriaLabel : todayAriaLabel\n );\n\n return (\n <table role=\"grid\" aria-labelledby={ariaLabelledby} className={clsx(styles.grid, className)}>\n {!isMonthPicker && (\n <thead>\n <tr>\n {calendar.header.map(dayIndex => (\n <th\n key={dayIndex}\n scope=\"col\"\n className={clsx(styles['grid-cell'], styles['day-header'], testutilStyles['day-header'])}\n >\n <span aria-hidden=\"true\">{renderDayName(locale, dayIndex, 'short')}</span>\n <ScreenreaderOnly>{renderDayName(locale, dayIndex, 'long')}</ScreenreaderOnly>\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody onKeyDown={onGridKeyDownHandler}>\n {calendar.rows.map((row, rowIndex) => {\n const rowItems = isMonthPicker ? (row as CalendarQuarter).months : (row as CalendarWeek).days;\n const weekTestIndex = !isMonthPicker ? (row as CalendarWeek).testIndex : undefined;\n return (\n <tr\n key={rowIndex}\n className={clsx({\n [testutilStyles['calendar-quarter']]: isMonthPicker,\n [testutilStyles['calendar-week']]: !isMonthPicker,\n })}\n {...(!isMonthPicker && weekTestIndex\n ? {\n ['data-awsui-weekindex']: weekTestIndex,\n }\n : {})}\n >\n {rowItems.map(\n (\n { date, isVisible, isInRange, isSelectionTop, isSelectionBottom, isSelectionLeft, isSelectionRight },\n rowItemIndex\n ) => {\n const {\n getItemKey,\n isSameItem,\n isSamePage,\n checkIfCurrent,\n checkIfCurrentDay,\n checkIfCurrentMonth,\n getPageName,\n } = isMonthPicker ? monthUtils : dayUtils;\n const itemKey = getItemKey(rowIndex, rowItemIndex);\n const pageName = getPageName();\n const isCurrentDay = checkIfCurrentDay(date);\n const isCurrentMonth = checkIfCurrentMonth(date);\n const isCurrent = checkIfCurrent(date);\n const isStartDate = !!selectedStartDate && isSameItem(date, selectedStartDate);\n const isEndDate = !!selectedEndDate && isSameItem(date, selectedEndDate);\n const isSelected = isStartDate || isEndDate;\n\n const isFocused = !!focusedDate && isSameItem(date, focusedDate) && isSamePage(date, baseDate);\n\n const onlyOneSelected =\n !!rangeStartDate && !!rangeEndDate\n ? isSameItem(rangeStartDate, rangeEndDate)\n : !selectedStartDate || !selectedEndDate;\n\n const isEnabled = (!isDateEnabled || isDateEnabled(date)) && isSamePage(date, baseDate);\n const disabledReason = dateDisabledReason(date);\n\n const isDisabledWithReason = !isEnabled && !!disabledReason;\n const isFocusable = isFocused && (isEnabled || isDisabledWithReason);\n\n const baseClasses = {\n [testutilStyles['calendar-date']]: !isMonthPicker && isSameMonth(date, baseDate),\n [testutilStyles['calendar-month']]: isMonthPicker && isSameYear(date, baseDate),\n [styles.day]: !isMonthPicker,\n [styles.month]: isMonthPicker,\n [styles['grid-cell']]: true,\n [styles['in-first-row']]: rowIndex === 0,\n [styles['in-first-column']]: rowItemIndex === 0,\n };\n\n if (!isVisible) {\n return (\n <td\n key={itemKey}\n ref={isFocused ? focusedDateRef : undefined}\n className={clsx(baseClasses, {\n [styles[`last-day-of-month`]]: !isMonthPicker && isLastDayOfMonth(date),\n [styles[`last-month-of-year`]]: isMonthPicker && date.getMonth() === 11,\n })}\n />\n );\n }\n\n const handlers: React.HTMLAttributes<HTMLDivElement> = {};\n if (isEnabled) {\n handlers.onClick = () => onSelectDate(date);\n handlers.onFocus = () => onFocusedDateChange(date);\n }\n\n // Screen-reader announcement for the focused day/month.\n let announcement = renderDateAnnouncement({\n date,\n isCurrent,\n locale,\n granularity,\n });\n\n if (currentAnnouncement) {\n if (isMonthPicker && isThisMonth(date)) {\n announcement += `. ${currentAnnouncement}`;\n } else if (!isMonthPicker && isToday(date)) {\n announcement += `. ${currentAnnouncement}`;\n }\n }\n\n // Can't be focused.\n let tabIndex: number | undefined = undefined;\n if (isEnabled || isDisabledWithReason) {\n tabIndex = isFocusable\n ? 0 // Next focus target.\n : -1; // Can be focused programmatically.\n }\n\n return (\n <GridCell\n ref={isFocused ? focusedDateRef : undefined}\n key={itemKey}\n className={clsx(baseClasses, {\n [styles['in-visible-calendar']]: true,\n [styles[`in-current-${pageName}`]]: isSamePage(date, baseDate),\n [styles.enabled]: isEnabled,\n [styles.selected]: isSelected,\n [styles['start-date']]: isStartDate,\n [styles['end-date']]: isEndDate,\n [testutilStyles['start-date']]: isStartDate,\n [testutilStyles['end-date']]: isEndDate,\n [styles['no-range']]: isSelected && onlyOneSelected,\n [styles['in-range']]: isInRange,\n [styles['in-range-border-block-start']]: isSelectionTop,\n [styles['in-range-border-block-end']]: isSelectionBottom,\n [styles['in-range-border-inline-start']]: isSelectionLeft,\n [styles['in-range-border-inline-end']]: isSelectionRight,\n [styles.today]: isCurrentDay,\n [testutilStyles.today]: isCurrentDay,\n [styles['this-month']]: isCurrentMonth,\n [testutilStyles['this-month']]: isCurrentMonth,\n })}\n aria-selected={isEnabled ? isSelected || isInRange : undefined}\n aria-current={isCurrent ? 'date' : undefined}\n data-date={formatDate(date, granularity)}\n aria-disabled={!isEnabled}\n tabIndex={tabIndex}\n disabledReason={isDisabledWithReason ? disabledReason : undefined}\n {...handlers}\n >\n <span className={styles[`${granularity}-inner`]} aria-hidden=\"true\">\n {isMonthPicker ? date.toLocaleString(locale, { month: 'short' }) : date.getDate()}\n </span>\n <ScreenreaderOnly>{announcement}</ScreenreaderOnly>\n </GridCell>\n );\n }\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"]}
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
baseDate: Date;
|
|
5
|
-
selectedStartDate: Date | null;
|
|
6
|
-
selectedEndDate: Date | null;
|
|
7
|
-
focusedDate: Date | null;
|
|
8
|
-
onFocusedDateChange: React.Dispatch<React.SetStateAction<Date | null>>;
|
|
9
|
-
isDateEnabled: DateRangePickerProps.IsDateEnabledFunction;
|
|
10
|
-
dateDisabledReason: DateRangePickerProps.DateDisabledReasonFunction;
|
|
11
|
-
isSingleGrid: boolean;
|
|
12
|
-
onSelectDate: (date: Date) => void;
|
|
13
|
-
onChangeMonth: (date: Date) => void;
|
|
14
|
-
locale: string;
|
|
15
|
-
startOfWeek: DayIndex;
|
|
16
|
-
todayAriaLabel?: string;
|
|
17
|
-
headingIdPrefix: string;
|
|
18
|
-
}
|
|
19
|
-
export declare const Grids: ({ baseDate, selectedStartDate, selectedEndDate, focusedDate, onFocusedDateChange, isDateEnabled, dateDisabledReason, isSingleGrid, onSelectDate, onChangeMonth, locale, startOfWeek, todayAriaLabel, headingIdPrefix, }: GridProps) => JSX.Element;
|
|
20
|
-
export {};
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { SelectGridProps } from './interfaces';
|
|
3
|
+
export declare const Grids: ({ baseDate, selectedStartDate, selectedEndDate, focusedDate, onFocusedDateChange, isDateEnabled, dateDisabledReason, isSingleGrid, onSelectDate, onPageChange, locale, todayAriaLabel, currentMonthAriaLabel, headingIdPrefix, startOfWeek, granularity, }: SelectGridProps) => JSX.Element;
|
|
21
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/date-range-picker/calendar/grids/index.tsx"],"names":[],"mappings":";AA2BA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAgB/C,eAAO,MAAM,KAAK,+PAqBf,eAAe,gBAkJjB,CAAC"}
|
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
-
import { addMonths, isAfter, isBefore, isSameMonth, max, min } from 'date-fns';
|
|
4
|
+
import { addMonths, addYears, isAfter, isBefore, isSameMonth, isSameYear, max, min } from 'date-fns';
|
|
5
5
|
import { getBaseDay, moveNextDay, moveNextWeek, movePrevDay, movePrevWeek, } from '../../../calendar/utils/navigation-day';
|
|
6
|
+
import { getBaseMonth, moveMonthDown, moveMonthUp, moveNextMonth, movePrevMonth, } from '../../../calendar/utils/navigation-month';
|
|
6
7
|
import { useDateCache } from '../../../internal/hooks/use-date-cache';
|
|
7
8
|
import { KeyCode } from '../../../internal/keycode';
|
|
8
9
|
import handleKey from '../../../internal/utils/handle-key';
|
|
9
10
|
import { hasValue } from '../../../internal/utils/has-value';
|
|
10
11
|
import InternalSpaceBetween from '../../../space-between/internal';
|
|
11
12
|
import { findDateToFocus } from '../utils';
|
|
12
|
-
import {
|
|
13
|
-
import
|
|
14
|
-
function isVisible(date, baseDate, isSingleGrid) {
|
|
13
|
+
import { Grid } from './grid';
|
|
14
|
+
import testutilStyles from '../../test-classes/styles.css.js';
|
|
15
|
+
function isVisible(date, baseDate, isSingleGrid, granularity) {
|
|
16
|
+
const isSame = granularity === 'day' ? isSameMonth : isSameYear;
|
|
17
|
+
const add = granularity === 'day' ? addMonths : addYears;
|
|
15
18
|
if (isSingleGrid) {
|
|
16
|
-
return
|
|
19
|
+
return isSame(date, baseDate);
|
|
17
20
|
}
|
|
18
|
-
const
|
|
19
|
-
return
|
|
21
|
+
const previous = add(baseDate, -1);
|
|
22
|
+
return isSame(date, previous) || isSame(date, baseDate);
|
|
20
23
|
}
|
|
21
|
-
export const Grids = ({ baseDate, selectedStartDate, selectedEndDate, focusedDate, onFocusedDateChange, isDateEnabled, dateDisabledReason, isSingleGrid, onSelectDate,
|
|
24
|
+
export const Grids = ({ baseDate, selectedStartDate, selectedEndDate, focusedDate, onFocusedDateChange, isDateEnabled, dateDisabledReason, isSingleGrid, onSelectDate, onPageChange, locale, todayAriaLabel, currentMonthAriaLabel, headingIdPrefix, startOfWeek = 0, granularity = 'day', }) => {
|
|
22
25
|
const containerRef = useRef(null);
|
|
23
26
|
const [gridHasFocus, setGridHasFocus] = useState(false);
|
|
27
|
+
const isMonthPicker = granularity === 'month';
|
|
24
28
|
const focusedDateRef = useRef(null);
|
|
29
|
+
const addPages = !isMonthPicker ? addMonths : addYears;
|
|
30
|
+
const getBase = !isMonthPicker ? getBaseDay : getBaseMonth;
|
|
31
|
+
const moveDown = isMonthPicker ? moveMonthDown : moveNextWeek;
|
|
32
|
+
const moveLeft = isMonthPicker ? movePrevMonth : movePrevDay;
|
|
33
|
+
const moveRight = isMonthPicker ? moveNextMonth : moveNextDay;
|
|
34
|
+
const moveUp = isMonthPicker ? moveMonthUp : movePrevWeek;
|
|
25
35
|
const dateCache = useDateCache();
|
|
26
36
|
baseDate = dateCache(baseDate);
|
|
27
37
|
focusedDate = focusedDate ? dateCache(focusedDate) : null;
|
|
@@ -29,16 +39,16 @@ export const Grids = ({ baseDate, selectedStartDate, selectedEndDate, focusedDat
|
|
|
29
39
|
return isDateEnabled(date) || (!isDateEnabled(date) && !!dateDisabledReason(date));
|
|
30
40
|
}, [isDateEnabled, dateDisabledReason]);
|
|
31
41
|
useEffect(() => {
|
|
32
|
-
if (focusedDate && !isVisible(focusedDate, baseDate, isSingleGrid)) {
|
|
42
|
+
if (focusedDate && !isVisible(focusedDate, baseDate, isSingleGrid, granularity)) {
|
|
33
43
|
const direction = isAfter(focusedDate, baseDate) ? -1 : 1;
|
|
34
|
-
const
|
|
35
|
-
const nearestBaseDate =
|
|
44
|
+
const newPage = !isSingleGrid && direction === -1 ? addPages(baseDate, -1) : baseDate;
|
|
45
|
+
const nearestBaseDate = getBase(newPage, isDateFocusable);
|
|
36
46
|
const newFocusedDate = findDateToFocus(focusedDate, nearestBaseDate, isDateFocusable);
|
|
37
47
|
onFocusedDateChange(newFocusedDate);
|
|
38
48
|
}
|
|
39
|
-
}, [baseDate, focusedDate, isSingleGrid, isDateFocusable, onFocusedDateChange]);
|
|
49
|
+
}, [baseDate, focusedDate, isSingleGrid, granularity, addPages, isDateFocusable, onFocusedDateChange, getBase]);
|
|
40
50
|
const onGridKeyDownHandler = (event) => {
|
|
41
|
-
let updatedFocusDate;
|
|
51
|
+
let updatedFocusDate = null;
|
|
42
52
|
const keys = [KeyCode.up, KeyCode.down, KeyCode.left, KeyCode.right, KeyCode.space, KeyCode.enter];
|
|
43
53
|
if (focusedDate === null || keys.indexOf(event.keyCode) === -1) {
|
|
44
54
|
return;
|
|
@@ -51,18 +61,18 @@ export const Grids = ({ baseDate, selectedStartDate, selectedEndDate, focusedDat
|
|
|
51
61
|
}
|
|
52
62
|
onSelectDate(focusedDate);
|
|
53
63
|
},
|
|
54
|
-
onBlockEnd: () => focusedDate && (updatedFocusDate =
|
|
55
|
-
onBlockStart: () => focusedDate && (updatedFocusDate =
|
|
56
|
-
|
|
57
|
-
|
|
64
|
+
onBlockEnd: () => focusedDate && (updatedFocusDate = moveDown(focusedDate, isDateFocusable)),
|
|
65
|
+
onBlockStart: () => focusedDate && (updatedFocusDate = moveUp(focusedDate, isDateFocusable)),
|
|
66
|
+
onInlineStart: () => focusedDate && (updatedFocusDate = moveLeft(focusedDate, isDateFocusable)),
|
|
67
|
+
onInlineEnd: () => focusedDate && (updatedFocusDate = moveRight(focusedDate, isDateFocusable)),
|
|
58
68
|
});
|
|
59
69
|
if (!updatedFocusDate) {
|
|
60
70
|
return;
|
|
61
71
|
}
|
|
62
|
-
const updatedDateIsVisible = isVisible(updatedFocusDate, baseDate, isSingleGrid);
|
|
72
|
+
const updatedDateIsVisible = isVisible(updatedFocusDate, baseDate, isSingleGrid, granularity);
|
|
63
73
|
if (!updatedDateIsVisible) {
|
|
64
|
-
const
|
|
65
|
-
|
|
74
|
+
const newPageIsOnLeftSide = !isSingleGrid && isBefore(updatedFocusDate, baseDate);
|
|
75
|
+
onPageChange(newPageIsOnLeftSide ? addPages(updatedFocusDate, 1) : updatedFocusDate);
|
|
66
76
|
}
|
|
67
77
|
onFocusedDateChange(updatedFocusDate);
|
|
68
78
|
};
|
|
@@ -91,9 +101,28 @@ export const Grids = ({ baseDate, selectedStartDate, selectedEndDate, focusedDat
|
|
|
91
101
|
const rangeEnds = [selectedStartDate !== null && selectedStartDate !== void 0 ? selectedStartDate : focusedDate, selectedEndDate !== null && selectedEndDate !== void 0 ? selectedEndDate : focusedDate].filter(hasValue);
|
|
92
102
|
const rangeStartDate = min(rangeEnds);
|
|
93
103
|
const rangeEndDate = max(rangeEnds);
|
|
104
|
+
const pageUnit = isMonthPicker ? 'year' : 'month';
|
|
105
|
+
const sharedGridProps = {
|
|
106
|
+
selectedEndDate,
|
|
107
|
+
selectedStartDate,
|
|
108
|
+
focusedDate,
|
|
109
|
+
focusedDateRef,
|
|
110
|
+
rangeStartDate: isRangeVisible ? rangeStartDate : null,
|
|
111
|
+
rangeEndDate: isRangeVisible ? rangeEndDate : null,
|
|
112
|
+
isDateEnabled,
|
|
113
|
+
dateDisabledReason,
|
|
114
|
+
onSelectDate,
|
|
115
|
+
onGridKeyDownHandler,
|
|
116
|
+
onFocusedDateChange,
|
|
117
|
+
locale,
|
|
118
|
+
granularity,
|
|
119
|
+
currentMonthAriaLabel,
|
|
120
|
+
startOfWeek,
|
|
121
|
+
todayAriaLabel,
|
|
122
|
+
};
|
|
94
123
|
return (React.createElement("div", { ref: containerRef, onFocus: onGridFocus, onBlur: onGridBlur },
|
|
95
124
|
React.createElement(InternalSpaceBetween, { size: "xs", direction: "horizontal" },
|
|
96
|
-
!isSingleGrid && (React.createElement(
|
|
97
|
-
React.createElement(
|
|
125
|
+
!isSingleGrid && (React.createElement(Grid, Object.assign({}, sharedGridProps, { padDates: 'before', className: testutilStyles['first-grid'], baseDate: addPages(baseDate, -1), ariaLabelledby: `${headingIdPrefix}-prev${pageUnit}` }))),
|
|
126
|
+
React.createElement(Grid, Object.assign({}, sharedGridProps, { padDates: 'after', className: testutilStyles['second-grid'], baseDate: baseDate, ariaLabelledby: `${headingIdPrefix}-current${pageUnit}` })))));
|
|
98
127
|
};
|
|
99
128
|
//# sourceMappingURL=index.js.map
|