@deque/cauldron-react 7.1.0-canary.d4fda8b7 → 7.1.0-canary.d6d44789
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/lib/add-user.js +1 -1
- package/lib/arrow-circle.js +1 -1
- package/lib/arrow.js +1 -1
- package/lib/arrows-alt.js +1 -1
- package/lib/bolt.js +1 -1
- package/lib/broken-image.js +1 -1
- package/lib/caution.js +1 -1
- package/lib/check-circle.js +1 -1
- package/lib/check-shield.js +1 -1
- package/lib/check-solid.js +1 -1
- package/lib/check.js +1 -1
- package/lib/checkbox-checked.js +1 -1
- package/lib/checkbox-unchecked.js +1 -1
- package/lib/chevron-double.js +1 -1
- package/lib/chevron.js +1 -1
- package/lib/clipboard.js +1 -1
- package/lib/clock.js +1 -1
- package/lib/close.js +1 -1
- package/lib/code.js +1 -1
- package/lib/components/Accordion/Accordion.d.ts +1 -1
- package/lib/components/ActionList/ActionList.d.ts +1 -1
- package/lib/components/ActionMenu/ActionMenu.d.ts +14 -8
- package/lib/components/AnchoredOverlay/index.d.ts +2 -2
- package/lib/components/ClickOutsideListener/index.d.ts +1 -1
- package/lib/components/Combobox/Combobox.d.ts +1 -1
- package/lib/components/Dialog/DialogContext.d.ts +1 -1
- package/lib/components/Dialog/index.d.ts +1 -1
- package/lib/components/Drawer/index.d.ts +1 -1
- package/lib/components/ExpandCollapsePanel/ExpandCollapsePanel.d.ts +1 -1
- package/lib/components/Listbox/Listbox.d.ts +7 -2
- package/lib/components/Popover/index.d.ts +2 -2
- package/lib/components/Table/TableContext.d.ts +1 -1
- package/lib/components/Tabs/Tab.d.ts +1 -1
- package/lib/components/Tooltip/index.d.ts +2 -2
- package/lib/components/TreeView/helpers.d.ts +33 -0
- package/lib/components/TreeView/index.d.ts +6 -0
- package/lib/components/TreeView/types.d.ts +3 -0
- package/lib/copy.js +1 -1
- package/lib/download.js +1 -1
- package/lib/dropper.js +1 -1
- package/lib/exchange.js +1 -1
- package/lib/export-solid.js +1 -1
- package/lib/external-link.js +1 -1
- package/lib/eye.js +1 -1
- package/lib/filter.js +1 -1
- package/lib/flag.js +1 -1
- package/lib/gears.js +1 -1
- package/lib/github.js +1 -1
- package/lib/grid.js +1 -1
- package/lib/hamburger-menu.js +1 -1
- package/lib/hashtag.js +1 -1
- package/lib/highlight.js +1 -1
- package/lib/images.js +1 -1
- package/lib/index.js +252 -97
- package/lib/info-circle-alt.js +1 -1
- package/lib/info-circle.js +1 -1
- package/lib/info-square.js +1 -1
- package/lib/kabob.js +1 -1
- package/lib/link.js +1 -1
- package/lib/linkedin.js +1 -1
- package/lib/list.js +1 -1
- package/lib/lock.js +1 -1
- package/lib/magnifying-glass.js +1 -1
- package/lib/menu.js +1 -1
- package/lib/minus.js +1 -1
- package/lib/new-releases.js +1 -1
- package/lib/new.js +1 -1
- package/lib/no.js +1 -1
- package/lib/pause.js +1 -1
- package/lib/pencil.js +1 -1
- package/lib/person-running.js +1 -1
- package/lib/play.js +1 -1
- package/lib/plus.js +1 -1
- package/lib/question-circle-alt.js +1 -1
- package/lib/question-circle.js +1 -1
- package/lib/radio-checked.js +1 -1
- package/lib/radio-unchecked.js +1 -1
- package/lib/recycle-square.js +1 -1
- package/lib/recycle.js +1 -1
- package/lib/resend.js +1 -1
- package/lib/robot.js +1 -1
- package/lib/run-again.js +1 -1
- package/lib/save.js +1 -1
- package/lib/share-nodes.js +1 -1
- package/lib/share.js +1 -1
- package/lib/sort-triangle.js +1 -1
- package/lib/sort.js +1 -1
- package/lib/star.js +1 -1
- package/lib/step-back.js +1 -1
- package/lib/step-forward.js +1 -1
- package/lib/sun.js +1 -1
- package/lib/table-sort-ascending.js +1 -1
- package/lib/table-sort-descending.js +1 -1
- package/lib/tag.js +1 -1
- package/lib/target.js +1 -1
- package/lib/trash.js +1 -1
- package/lib/triangle.js +1 -1
- package/lib/twitter.js +1 -1
- package/lib/types.d.ts +1 -1
- package/lib/upload.js +1 -1
- package/lib/utils/getChildRef.d.ts +2 -0
- package/lib/utils/polymorphicComponent.d.ts +1 -1
- package/lib/utils/useFocusTrap.d.ts +1 -1
- package/lib/utils/useMnemonics.d.ts +2 -2
- package/lib/utils/useSharedRef.d.ts +3 -3
- package/package.json +28 -27
package/lib/index.js
CHANGED
|
@@ -495,24 +495,25 @@ var Accordion = function (_a) {
|
|
|
495
495
|
var childrenArray = React__default["default"].Children.toArray(children);
|
|
496
496
|
var trigger = childrenArray.find(function (child) {
|
|
497
497
|
return typeof child === 'string' ||
|
|
498
|
-
child.type === AccordionTrigger;
|
|
498
|
+
(React__default["default"].isValidElement(child) && child.type === AccordionTrigger);
|
|
499
499
|
});
|
|
500
500
|
var panelElement = childrenArray.find(function (child) {
|
|
501
501
|
return typeof child === 'string' ||
|
|
502
|
-
child.type === AccordionContent;
|
|
502
|
+
(React__default["default"].isValidElement(child) && child.type === AccordionContent);
|
|
503
503
|
});
|
|
504
|
-
|
|
505
|
-
|
|
504
|
+
if (!React__default["default"].isValidElement(trigger) ||
|
|
505
|
+
!React__default["default"].isValidElement(panelElement)) {
|
|
506
506
|
console.warn('Must provide <AccordionTrigger /> and <AccordionContent /> element(s). You provided:', {
|
|
507
507
|
trigger: trigger,
|
|
508
508
|
panelElement: panelElement,
|
|
509
|
-
isValid:
|
|
509
|
+
isValid: false
|
|
510
510
|
});
|
|
511
511
|
return null;
|
|
512
512
|
}
|
|
513
|
+
var panelProps = panelElement.props;
|
|
513
514
|
return (React__default["default"].createElement("div", tslib.__assign({ className: "Accordion" }, props),
|
|
514
|
-
React__default["default"].createElement(ExpandCollapsePanel, tslib.__assign({ id:
|
|
515
|
-
React__default["default"].createElement(PanelTrigger$1, tslib.__assign({ iconCollapsed: "triangle-right", iconExpanded: "triangle-down", className: classNames__default["default"]('Accordion__trigger', trigger.props.className), "aria-controls":
|
|
515
|
+
React__default["default"].createElement(ExpandCollapsePanel, tslib.__assign({ id: panelProps.id || "".concat(elementId, "-panel"), open: open, onToggle: onToggle, animationTiming: animationTiming }, panelProps),
|
|
516
|
+
React__default["default"].createElement(PanelTrigger$1, tslib.__assign({ iconCollapsed: "triangle-right", iconExpanded: "triangle-down", className: classNames__default["default"]('Accordion__trigger', trigger.props.className), "aria-controls": panelProps.id || "".concat(elementId, "-panel"), heading: trigger.props.heading }, trigger.props), trigger),
|
|
516
517
|
panelElement)));
|
|
517
518
|
};
|
|
518
519
|
Accordion.displayName = 'Accordion';
|
|
@@ -578,7 +579,9 @@ var Scrim = /** @class */ (function (_super) {
|
|
|
578
579
|
if (destroy) {
|
|
579
580
|
return null;
|
|
580
581
|
}
|
|
581
|
-
return (React__default["default"].createElement("div", { ref: function (el) {
|
|
582
|
+
return (React__default["default"].createElement("div", { ref: function (el) {
|
|
583
|
+
_this.el = el;
|
|
584
|
+
}, className: "Scrim ".concat(animationClass) }));
|
|
582
585
|
};
|
|
583
586
|
return Scrim;
|
|
584
587
|
}(React__default["default"].Component));
|
|
@@ -807,9 +810,16 @@ function resolveElement(elementOrRef) {
|
|
|
807
810
|
return null;
|
|
808
811
|
}
|
|
809
812
|
|
|
813
|
+
function getChildRef(child, version) {
|
|
814
|
+
if (version === void 0) { version = React__default["default"].version; }
|
|
815
|
+
return parseInt(version, 10) >= 19
|
|
816
|
+
? child.props.ref
|
|
817
|
+
: child.ref;
|
|
818
|
+
}
|
|
819
|
+
|
|
810
820
|
function ClickOutsideListener(_a, ref) {
|
|
811
821
|
var children = _a.children, _b = _a.mouseEvent, mouseEvent = _b === void 0 ? 'click' : _b, _c = _a.touchEvent, touchEvent = _c === void 0 ? 'touchend' : _c, target = _a.target, _d = _a.onClickOutside, onClickOutside = _d === void 0 ? function () { return null; } : _d;
|
|
812
|
-
var childElementRef = React.useRef();
|
|
822
|
+
var childElementRef = React.useRef(null);
|
|
813
823
|
var handleEvent = function (event) {
|
|
814
824
|
if (event.defaultPrevented) {
|
|
815
825
|
return;
|
|
@@ -832,9 +842,8 @@ function ClickOutsideListener(_a, ref) {
|
|
|
832
842
|
childElementRef.current = node;
|
|
833
843
|
// Ref for this component should pass-through to the child node
|
|
834
844
|
setRef(ref, node);
|
|
835
|
-
//
|
|
836
|
-
|
|
837
|
-
var childRef = children.ref;
|
|
845
|
+
// Forward the child's own ref. In React 19 ref lives in props; in 16–18 it's element.ref.
|
|
846
|
+
var childRef = getChildRef(children);
|
|
838
847
|
setRef(childRef, node);
|
|
839
848
|
};
|
|
840
849
|
React.useEffect(function () {
|
|
@@ -1343,7 +1352,7 @@ var AriaIsolate = /** @class */ (function () {
|
|
|
1343
1352
|
|
|
1344
1353
|
/**
|
|
1345
1354
|
* When a component needs to track an internal ref on a component that has a
|
|
1346
|
-
* forwarded ref, useSharedRef will return a
|
|
1355
|
+
* forwarded ref, useSharedRef will return a RefObject<T | null> that will
|
|
1347
1356
|
* correctly invoke the parent ref as well providing an internal ref.
|
|
1348
1357
|
*
|
|
1349
1358
|
* @example
|
|
@@ -1356,7 +1365,7 @@ var AriaIsolate = /** @class */ (function () {
|
|
|
1356
1365
|
* })
|
|
1357
1366
|
*/
|
|
1358
1367
|
function useSharedRef(ref) {
|
|
1359
|
-
var internalRef = React.useRef();
|
|
1368
|
+
var internalRef = React.useRef(null);
|
|
1360
1369
|
React.useEffect(function () {
|
|
1361
1370
|
setRef(ref, internalRef.current);
|
|
1362
1371
|
return function () { return setRef(ref, null); };
|
|
@@ -1489,7 +1498,7 @@ function useFocusTrap(target, options) {
|
|
|
1489
1498
|
if (options === void 0) { options = {}; }
|
|
1490
1499
|
var _a = options.disabled, disabled = _a === void 0 ? false : _a, _b = options.returnFocus, returnFocus = _b === void 0 ? true : _b, initialFocusElementOrRef = options.initialFocusElement, returnFocusElement = options.returnFocusElement;
|
|
1491
1500
|
var focusTrap = React.useRef(null);
|
|
1492
|
-
var returnFocusElementRef = React.useRef();
|
|
1501
|
+
var returnFocusElementRef = React.useRef(null);
|
|
1493
1502
|
function restoreFocusToReturnFocusElement() {
|
|
1494
1503
|
var _a;
|
|
1495
1504
|
var resolvedReturnFocusElement = resolveElement(returnFocusElement);
|
|
@@ -1539,7 +1548,7 @@ var Dialog = React.forwardRef(function (_a, ref) {
|
|
|
1539
1548
|
var dialogRef = useSharedRef(dialogRefProp || ref);
|
|
1540
1549
|
var _g = tslib.__read(nextId.useId(1, 'dialog-title-'), 1), headingId = _g[0];
|
|
1541
1550
|
var headingRef = React.useRef(null);
|
|
1542
|
-
var isolatorRef = React.useRef();
|
|
1551
|
+
var isolatorRef = React.useRef(null);
|
|
1543
1552
|
var headingLevel = typeof heading === 'object' && 'level' in heading && heading.level
|
|
1544
1553
|
? heading.level
|
|
1545
1554
|
: 2;
|
|
@@ -2134,7 +2143,7 @@ var looksLikeLink = function (props) {
|
|
|
2134
2143
|
};
|
|
2135
2144
|
var IconButton = React.forwardRef(function (_a, ref) {
|
|
2136
2145
|
var _b = _a.as, Component = _b === void 0 ? 'button' : _b, icon = _a.icon, label = _a.label, _c = _a.tooltipProps, tooltipPropsProp = _c === void 0 ? {} : _c, className = _a.className, _d = _a.variant, variant = _d === void 0 ? 'secondary' : _d, disabled = _a.disabled, _e = _a.tabIndex, tabIndex = _e === void 0 ? 0 : _e, large = _a.large, other = tslib.__rest(_a, ["as", "icon", "label", "tooltipProps", "className", "variant", "disabled", "tabIndex", "large"]);
|
|
2137
|
-
var internalRef = React.useRef();
|
|
2146
|
+
var internalRef = React.useRef(null);
|
|
2138
2147
|
React.useImperativeHandle(ref, function () { return internalRef.current; });
|
|
2139
2148
|
// Configure additional properties based on the type of the Component
|
|
2140
2149
|
// for accessibility
|
|
@@ -2696,7 +2705,7 @@ Checkbox.displayName = 'Checkbox';
|
|
|
2696
2705
|
*/
|
|
2697
2706
|
function TooltipTabstop(_a) {
|
|
2698
2707
|
var children = _a.children, className = _a.className, tooltip = _a.tooltip, variant = _a.variant, association = _a.association, show = _a.show, placement = _a.placement, portal = _a.portal, hideElementOnHidden = _a.hideElementOnHidden, buttonProps = tslib.__rest(_a, ["children", "className", "tooltip", "variant", "association", "show", "placement", "portal", "hideElementOnHidden"]);
|
|
2699
|
-
var buttonRef = React.useRef();
|
|
2708
|
+
var buttonRef = React.useRef(null);
|
|
2700
2709
|
return (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
2701
2710
|
React__default["default"].createElement("button", tslib.__assign({ type: "button", ref: buttonRef, "aria-disabled": "true", className: classNames__default["default"]('TooltipTabstop', className) }, buttonProps), children),
|
|
2702
2711
|
React__default["default"].createElement(Tooltip, { target: buttonRef, variant: variant, association: association, show: show, placement: placement, portal: portal, hideElementOnHidden: hideElementOnHidden }, tooltip)));
|
|
@@ -3540,7 +3549,7 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
|
|
|
3540
3549
|
var closeButtonRef = React.useRef(null);
|
|
3541
3550
|
var columnLeftRef = React.useRef(null);
|
|
3542
3551
|
var columnRightRef = React.useRef(null);
|
|
3543
|
-
var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnLeft; });
|
|
3552
|
+
var columnLeft = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnLeft; });
|
|
3544
3553
|
var togglePanel = function () {
|
|
3545
3554
|
var prefersReducedMotion = 'matchMedia' in window &&
|
|
3546
3555
|
typeof matchMedia === 'function' &&
|
|
@@ -3573,16 +3582,17 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
|
|
|
3573
3582
|
var ColumnLeftComponent;
|
|
3574
3583
|
var columnLeftId;
|
|
3575
3584
|
if (React.isValidElement(columnLeft)) {
|
|
3576
|
-
var
|
|
3585
|
+
var columnLeftProps = columnLeft.props;
|
|
3586
|
+
var ref_1 = columnLeftProps.ref || columnLeftRef;
|
|
3577
3587
|
var id = (columnLeftId =
|
|
3578
|
-
|
|
3588
|
+
columnLeftProps.id || nextId.useId(undefined, 'sidebar-')[0]);
|
|
3579
3589
|
var CloseButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__Close" },
|
|
3580
3590
|
React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: closeButtonRef, "aria-label": hideCollapsedPanelLabel },
|
|
3581
3591
|
React__default["default"].createElement(Icon, { type: "close" })),
|
|
3582
3592
|
React__default["default"].createElement(Tooltip, { target: closeButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, hideCollapsedPanelLabel)));
|
|
3583
3593
|
var children_1 = tslib.__spreadArray([
|
|
3584
3594
|
CloseButton
|
|
3585
|
-
], tslib.__read(React__default["default"].Children.toArray(
|
|
3595
|
+
], tslib.__read(React__default["default"].Children.toArray(columnLeftProps.children)), false);
|
|
3586
3596
|
ColumnLeftComponent = React.cloneElement(columnLeft, { id: id, ref: ref_1, tabIndex: -1 }, children_1.map(function (child, index) {
|
|
3587
3597
|
return React.cloneElement(child, {
|
|
3588
3598
|
key: child.key
|
|
@@ -3591,17 +3601,18 @@ var TwoColumnPanel = React.forwardRef(function (_a, ref) {
|
|
|
3591
3601
|
});
|
|
3592
3602
|
}));
|
|
3593
3603
|
}
|
|
3594
|
-
var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return child.type === ColumnRight; });
|
|
3604
|
+
var columnRight = React__default["default"].Children.toArray(children).find(function (child) { return React__default["default"].isValidElement(child) && child.type === ColumnRight; });
|
|
3595
3605
|
var ColumnRightComponent;
|
|
3596
3606
|
if (React.isValidElement(columnRight)) {
|
|
3597
|
-
var
|
|
3607
|
+
var columnRightProps = columnRight.props;
|
|
3608
|
+
var ref_2 = columnRightProps.ref || columnRightRef;
|
|
3598
3609
|
var ToggleButton = (React__default["default"].createElement("div", { className: "TwoColumnPanel__ButtonToggle" },
|
|
3599
3610
|
React__default["default"].createElement("button", { type: "button", onClick: togglePanel, ref: toggleButtonRef, "aria-label": !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel, "aria-expanded": !isCollapsed, "aria-controls": columnLeftId },
|
|
3600
3611
|
React__default["default"].createElement(Icon, { type: !isCollapsed ? 'chevron-double-left' : 'chevron-double-right' })),
|
|
3601
3612
|
React__default["default"].createElement(Tooltip, { target: toggleButtonRef, association: "aria-labelledby", hideElementOnHidden: true }, !isCollapsed ? hideCollapsedPanelLabel : showCollapsedPanelLabel)));
|
|
3602
3613
|
var children_2 = tslib.__spreadArray([
|
|
3603
3614
|
ToggleButton
|
|
3604
|
-
], tslib.__read(React__default["default"].Children.toArray(
|
|
3615
|
+
], tslib.__read(React__default["default"].Children.toArray(columnRightProps.children)), false);
|
|
3605
3616
|
ColumnRightComponent = React.cloneElement(columnRight, { ref: ref_2, tabIndex: -1 }, children_2.map(function (child, index) {
|
|
3606
3617
|
return React.cloneElement(child, {
|
|
3607
3618
|
key: child.key
|
|
@@ -3787,7 +3798,8 @@ var Listbox = React.forwardRef(function (_a, ref) {
|
|
|
3787
3798
|
}
|
|
3788
3799
|
}, [activeOption]);
|
|
3789
3800
|
React.useEffect(function () {
|
|
3790
|
-
if (isActiveControlled &&
|
|
3801
|
+
if (isActiveControlled &&
|
|
3802
|
+
(controlledActiveOption === null || controlledActiveOption === void 0 ? void 0 : controlledActiveOption.element) !== (activeOption === null || activeOption === void 0 ? void 0 : activeOption.element)) {
|
|
3791
3803
|
setActiveOption(controlledActiveOption || null);
|
|
3792
3804
|
}
|
|
3793
3805
|
}, [isActiveControlled, controlledActiveOption]);
|
|
@@ -3933,11 +3945,11 @@ function isElementPreceding(a, b) {
|
|
|
3933
3945
|
}
|
|
3934
3946
|
var ListboxOption = React.forwardRef(function (_a, ref) {
|
|
3935
3947
|
var _b;
|
|
3936
|
-
var _c;
|
|
3937
|
-
var propId = _a.id, className = _a.className,
|
|
3938
|
-
var
|
|
3948
|
+
var _c, _d;
|
|
3949
|
+
var propId = _a.id, className = _a.className, _e = _a.as, Component = _e === void 0 ? 'li' : _e, children = _a.children, value = _a.value, disabled = _a.disabled, selectedProp = _a.selected, _f = _a.activeClass, activeClass = _f === void 0 ? 'ListboxOption--active' : _f, onClick = _a.onClick, props = tslib.__rest(_a, ["id", "className", "as", "children", "value", "disabled", "selected", "activeClass", "onClick"]);
|
|
3950
|
+
var _g = useListboxContext(), active = _g.active, selected = _g.selected, setOptions = _g.setOptions, onSelect = _g.onSelect;
|
|
3939
3951
|
var listboxOptionRef = useSharedRef(ref);
|
|
3940
|
-
var
|
|
3952
|
+
var _h = tslib.__read(propId ? [propId] : nextId.useId(1, 'listbox-option'), 1), id = _h[0];
|
|
3941
3953
|
var isActive = (active === null || active === void 0 ? void 0 : active.element) === listboxOptionRef.current;
|
|
3942
3954
|
var isSelected = typeof selectedProp === 'boolean'
|
|
3943
3955
|
? selectedProp
|
|
@@ -3945,15 +3957,15 @@ var ListboxOption = React.forwardRef(function (_a, ref) {
|
|
|
3945
3957
|
!!selected.find(function (option) { return option.element === listboxOptionRef.current; });
|
|
3946
3958
|
var optionValue = typeof value !== 'undefined'
|
|
3947
3959
|
? value
|
|
3948
|
-
: (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.
|
|
3960
|
+
: ((_d = (_c = listboxOptionRef.current) === null || _c === void 0 ? void 0 : _c.textContent) !== null && _d !== void 0 ? _d : undefined);
|
|
3949
3961
|
React.useEffect(function () {
|
|
3950
3962
|
var element = listboxOptionRef.current;
|
|
3951
3963
|
setOptions(function (options) {
|
|
3952
3964
|
var e_1, _a;
|
|
3953
|
-
var option = { element: element, value: optionValue };
|
|
3954
3965
|
// istanbul ignore next
|
|
3955
3966
|
if (!element)
|
|
3956
3967
|
return options;
|
|
3968
|
+
var option = { element: element, value: optionValue };
|
|
3957
3969
|
// Elements are frequently appended, so check to see if the newly rendered
|
|
3958
3970
|
// element follows the last element first before any other checks
|
|
3959
3971
|
if (!options.length ||
|
|
@@ -4140,7 +4152,7 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
|
|
|
4140
4152
|
// istanbul ignore next
|
|
4141
4153
|
React.useLayoutEffect(function () {
|
|
4142
4154
|
var intersectionEntry = intersectionRef.current;
|
|
4143
|
-
if (!intersectionEntry || !isActive) {
|
|
4155
|
+
if (!intersectionEntry || !isActive || !comboboxOptionRef.current) {
|
|
4144
4156
|
return;
|
|
4145
4157
|
}
|
|
4146
4158
|
var rect = comboboxOptionRef.current.getBoundingClientRect();
|
|
@@ -4156,10 +4168,10 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
|
|
|
4156
4168
|
}
|
|
4157
4169
|
}, [isActive]);
|
|
4158
4170
|
React.useEffect(function () {
|
|
4159
|
-
var _a;
|
|
4171
|
+
var _a, _b;
|
|
4160
4172
|
var comboboxValue = typeof propValue !== 'undefined'
|
|
4161
4173
|
? propValue
|
|
4162
|
-
: (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.
|
|
4174
|
+
: ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
|
|
4163
4175
|
var value = typeof formValue === 'undefined' ? comboboxValue : formValue;
|
|
4164
4176
|
setFormValues(function (prev) {
|
|
4165
4177
|
var formValues = prev.filter(function (fv) { return fv !== value; });
|
|
@@ -4178,12 +4190,14 @@ var ComboboxOption = React.forwardRef(function (_a, ref) {
|
|
|
4178
4190
|
});
|
|
4179
4191
|
}, [selectedValues, formValue]);
|
|
4180
4192
|
React.useEffect(function () {
|
|
4181
|
-
var _a;
|
|
4193
|
+
var _a, _b;
|
|
4182
4194
|
if (isMatching) {
|
|
4183
4195
|
var comboboxValue_1 = typeof propValue !== 'undefined'
|
|
4184
4196
|
? propValue
|
|
4185
|
-
: (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.
|
|
4197
|
+
: ((_b = (_a = comboboxOptionRef.current) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : undefined);
|
|
4186
4198
|
setMatchingOptions(function (options) {
|
|
4199
|
+
if (!comboboxOptionRef.current)
|
|
4200
|
+
return options;
|
|
4187
4201
|
return new Map(options.set(comboboxOptionRef.current, {
|
|
4188
4202
|
value: comboboxValue_1,
|
|
4189
4203
|
displayValue: children,
|
|
@@ -4323,6 +4337,17 @@ var Combobox = React.forwardRef(function (_a, ref) {
|
|
|
4323
4337
|
return value === lastSelectedValue;
|
|
4324
4338
|
}) || [], 2), element = _a[0], option = _a[1];
|
|
4325
4339
|
if (autocomplete === 'manual') {
|
|
4340
|
+
// In multiselect, the listbox manages its own active option via
|
|
4341
|
+
// keyboard navigation. When the last-selected value no longer
|
|
4342
|
+
// matches any option (e.g. after deselecting the only selected
|
|
4343
|
+
// option), preserve the existing active descendant so the next
|
|
4344
|
+
// Enter keypress can re-toggle the highlighted option.
|
|
4345
|
+
if (multiselect &&
|
|
4346
|
+
!element &&
|
|
4347
|
+
activeDescendant &&
|
|
4348
|
+
matchingOptions.has(activeDescendant.element)) {
|
|
4349
|
+
return;
|
|
4350
|
+
}
|
|
4326
4351
|
setActiveDescendant(!element ? null : tslib.__assign({ element: element }, option));
|
|
4327
4352
|
}
|
|
4328
4353
|
else if (autocomplete === 'automatic' &&
|
|
@@ -4502,6 +4527,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
|
|
|
4502
4527
|
});
|
|
4503
4528
|
}, [disabled, selectedValues, onSelectionChange]);
|
|
4504
4529
|
var handlePillKeyDown = React.useCallback(function (event) {
|
|
4530
|
+
var _a, _b;
|
|
4505
4531
|
if (!PillKeys.includes(event.key)) {
|
|
4506
4532
|
return;
|
|
4507
4533
|
}
|
|
@@ -4519,7 +4545,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
|
|
|
4519
4545
|
handleRemovePill(pillsRef.current[focusedIndex], selectedValues[focusedIndex]);
|
|
4520
4546
|
var nextIndex = focusedIndex + 1;
|
|
4521
4547
|
if (nextIndex == pillsLength) {
|
|
4522
|
-
inputRef.current.focus();
|
|
4548
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
4523
4549
|
}
|
|
4524
4550
|
else {
|
|
4525
4551
|
pillsRef.current[nextIndex].focus();
|
|
@@ -4528,7 +4554,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
|
|
|
4528
4554
|
else if (isArrowLeft || isArrowRight) {
|
|
4529
4555
|
var nextIndex = Math.max(focusedIndex + (isArrowLeft ? -1 : 1), 0);
|
|
4530
4556
|
if (isArrowRight && nextIndex === pillsLength) {
|
|
4531
|
-
inputRef.current.focus();
|
|
4557
|
+
(_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
4532
4558
|
}
|
|
4533
4559
|
else {
|
|
4534
4560
|
pillsRef.current[nextIndex].focus();
|
|
@@ -4816,10 +4842,12 @@ var TextEllipsis = React__default["default"].forwardRef(function (_a, ref) {
|
|
|
4816
4842
|
: overflowElement.clientWidth < overflowElement.scrollWidth);
|
|
4817
4843
|
});
|
|
4818
4844
|
};
|
|
4845
|
+
if (!sharedRef.current)
|
|
4846
|
+
return;
|
|
4819
4847
|
var observer = new ResizeObserver(listener);
|
|
4820
4848
|
observer.observe(sharedRef.current);
|
|
4821
4849
|
return function () {
|
|
4822
|
-
observer
|
|
4850
|
+
observer.disconnect();
|
|
4823
4851
|
};
|
|
4824
4852
|
}, []);
|
|
4825
4853
|
React.useEffect(function () {
|
|
@@ -4864,7 +4892,7 @@ var Drawer = React.forwardRef(function (_a, ref) {
|
|
|
4864
4892
|
openRef.current = open;
|
|
4865
4893
|
}, [open, setIsTransitioning]);
|
|
4866
4894
|
React.useEffect(function () {
|
|
4867
|
-
if (!isModal) {
|
|
4895
|
+
if (!isModal || !drawerRef.current) {
|
|
4868
4896
|
return;
|
|
4869
4897
|
}
|
|
4870
4898
|
var isolator = new AriaIsolate(drawerRef.current);
|
|
@@ -5045,7 +5073,7 @@ function getActiveElement(root) {
|
|
|
5045
5073
|
*/
|
|
5046
5074
|
function useMnemonics(_a) {
|
|
5047
5075
|
var elementOrRef = _a.elementOrRef, matchingElementsSelector = _a.matchingElementsSelector, onMatch = _a.onMatch, _b = _a.enabled, enabled = _b === void 0 ? true : _b;
|
|
5048
|
-
var containerRef = React.useRef();
|
|
5076
|
+
var containerRef = React.useRef(null);
|
|
5049
5077
|
React.useEffect(function () {
|
|
5050
5078
|
if (elementOrRef instanceof HTMLElement) {
|
|
5051
5079
|
containerRef.current = elementOrRef;
|
|
@@ -5055,7 +5083,8 @@ function useMnemonics(_a) {
|
|
|
5055
5083
|
}
|
|
5056
5084
|
}, [elementOrRef]);
|
|
5057
5085
|
React.useEffect(function () {
|
|
5058
|
-
|
|
5086
|
+
var listenerTarget = containerRef.current;
|
|
5087
|
+
if (!enabled || !listenerTarget) {
|
|
5059
5088
|
return;
|
|
5060
5089
|
}
|
|
5061
5090
|
var keyboardHandler = function (event) {
|
|
@@ -5068,14 +5097,14 @@ function useMnemonics(_a) {
|
|
|
5068
5097
|
if (event.key.length !== 1 || !/[a-z\d]/i.test(event.key)) {
|
|
5069
5098
|
return;
|
|
5070
5099
|
}
|
|
5071
|
-
var
|
|
5072
|
-
if (!
|
|
5100
|
+
var currentContainer = containerRef.current;
|
|
5101
|
+
if (!currentContainer) {
|
|
5073
5102
|
return;
|
|
5074
5103
|
}
|
|
5075
5104
|
// Prevent default behavior and stop propagation for mnemonic keys
|
|
5076
5105
|
event.preventDefault();
|
|
5077
5106
|
event.stopPropagation();
|
|
5078
|
-
var elements = Array.from(
|
|
5107
|
+
var elements = Array.from(currentContainer.querySelectorAll(matchingElementsSelector !== null && matchingElementsSelector !== void 0 ? matchingElementsSelector : focusable__default["default"]));
|
|
5079
5108
|
var matchingElements = elements.filter(function (element) {
|
|
5080
5109
|
return getAccessibleLabel(element).toLowerCase()[0] ===
|
|
5081
5110
|
event.key.toLowerCase();
|
|
@@ -5083,7 +5112,7 @@ function useMnemonics(_a) {
|
|
|
5083
5112
|
if (!matchingElements.length) {
|
|
5084
5113
|
return;
|
|
5085
5114
|
}
|
|
5086
|
-
var currentActiveElement = getActiveElement(
|
|
5115
|
+
var currentActiveElement = getActiveElement(currentContainer);
|
|
5087
5116
|
var nextActiveElement = null;
|
|
5088
5117
|
if (currentActiveElement) {
|
|
5089
5118
|
nextActiveElement = matchingElements.find(function (element) {
|
|
@@ -5097,17 +5126,15 @@ function useMnemonics(_a) {
|
|
|
5097
5126
|
onMatch(nextActiveElement !== null && nextActiveElement !== void 0 ? nextActiveElement : matchingElements[0]);
|
|
5098
5127
|
}
|
|
5099
5128
|
};
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
return function () { return container.removeEventListener('keydown', keyboardHandler); };
|
|
5129
|
+
listenerTarget.addEventListener('keydown', keyboardHandler);
|
|
5130
|
+
return function () { return listenerTarget.removeEventListener('keydown', keyboardHandler); };
|
|
5103
5131
|
}, [enabled, containerRef, matchingElementsSelector, onMatch]);
|
|
5104
5132
|
return containerRef;
|
|
5105
5133
|
}
|
|
5106
5134
|
|
|
5107
5135
|
var ActionList = React.forwardRef(function (_a, ref) {
|
|
5108
5136
|
var _b = _a.selectionType, selectionType = _b === void 0 ? null : _b, onAction = _a.onAction, className = _a.className, children = _a.children, props = tslib.__rest(_a, ["selectionType", "onAction", "className", "children"]);
|
|
5109
|
-
var
|
|
5110
|
-
var activeElement = React.useRef();
|
|
5137
|
+
var activeElement = React.useRef(null);
|
|
5111
5138
|
var _c = tslib.__read(React.useState(), 2), activeOption = _c[0], setActiveOption = _c[1];
|
|
5112
5139
|
var handleActiveChange = React.useCallback(function (value) {
|
|
5113
5140
|
activeElement.current = value === null || value === void 0 ? void 0 : value.element;
|
|
@@ -5118,22 +5145,18 @@ var ActionList = React.forwardRef(function (_a, ref) {
|
|
|
5118
5145
|
onAction(key, event);
|
|
5119
5146
|
}
|
|
5120
5147
|
}, [onAction]);
|
|
5148
|
+
var handleMnemonicMatch = React.useCallback(function (element) {
|
|
5149
|
+
setActiveOption(function (prev) {
|
|
5150
|
+
return (prev === null || prev === void 0 ? void 0 : prev.element) === element ? prev : { element: element };
|
|
5151
|
+
});
|
|
5152
|
+
}, []);
|
|
5121
5153
|
var containerRef = useMnemonics({
|
|
5122
|
-
onMatch:
|
|
5123
|
-
setActiveOption({
|
|
5124
|
-
element: element
|
|
5125
|
-
});
|
|
5126
|
-
},
|
|
5154
|
+
onMatch: handleMnemonicMatch,
|
|
5127
5155
|
matchingElementsSelector: props.role === 'menu'
|
|
5128
5156
|
? '[role=menuitem],[role=menuitemcheckbox],[role=menuitemradio]'
|
|
5129
5157
|
: '[role=option]'
|
|
5130
5158
|
});
|
|
5131
|
-
return (
|
|
5132
|
-
// Note: we should be able to use listbox without passing a prop
|
|
5133
|
-
// value for "multiselect"
|
|
5134
|
-
// see: https://github.com/dequelabs/cauldron/issues/1890
|
|
5135
|
-
// @ts-expect-error this should be allowed
|
|
5136
|
-
React__default["default"].createElement(Listbox, tslib.__assign({ ref: function (element) {
|
|
5159
|
+
return (React__default["default"].createElement(Listbox, tslib.__assign({ ref: function (element) {
|
|
5137
5160
|
if (ref) {
|
|
5138
5161
|
setRef(ref, element);
|
|
5139
5162
|
}
|
|
@@ -5142,7 +5165,7 @@ var ActionList = React.forwardRef(function (_a, ref) {
|
|
|
5142
5165
|
/* Listbox comes with an explicit role of "listbox", but we want to either
|
|
5143
5166
|
* use the role from props, or default to the intrinsic role */
|
|
5144
5167
|
// eslint-disable-next-line jsx-a11y/aria-role
|
|
5145
|
-
role: undefined, "aria-multiselectable":
|
|
5168
|
+
role: undefined, "aria-multiselectable": undefined, className: classNames__default["default"]('ActionList', className), activeOption: activeOption }, props, { onActiveChange: handleActiveChange, navigation: "bound" }),
|
|
5146
5169
|
React__default["default"].createElement(ActionListProvider, { role: props.role || 'list', onAction: handleAction, selectionType: selectionType }, children)));
|
|
5147
5170
|
});
|
|
5148
5171
|
ActionList.displayName = 'ActionList';
|
|
@@ -5160,7 +5183,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
|
|
|
5160
5183
|
});
|
|
5161
5184
|
var isActive = !!(active === null || active === void 0 ? void 0 : active.element) && active.element === actionListItemRef.current;
|
|
5162
5185
|
var handleAction = React.useCallback(function (event) {
|
|
5163
|
-
var _a;
|
|
5186
|
+
var _a, _b;
|
|
5164
5187
|
if (event.defaultPrevented) {
|
|
5165
5188
|
return;
|
|
5166
5189
|
}
|
|
@@ -5173,7 +5196,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
|
|
|
5173
5196
|
}
|
|
5174
5197
|
// istanbul ignore else
|
|
5175
5198
|
if (typeof onActionListAction === 'function') {
|
|
5176
|
-
onActionListAction(actionKey || ((_a = labelRef === null ||
|
|
5199
|
+
onActionListAction(actionKey || ((_b = (_a = labelRef.current) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '', event);
|
|
5177
5200
|
}
|
|
5178
5201
|
}, [onAction, onActionListAction, selectionType, actionKey]);
|
|
5179
5202
|
var listItemRole = undefined;
|
|
@@ -5197,7 +5220,7 @@ var ActionListItem = React.forwardRef(function (_a, ref) {
|
|
|
5197
5220
|
// istanbul ignore next
|
|
5198
5221
|
React.useLayoutEffect(function () {
|
|
5199
5222
|
var intersectionEntry = intersectionRef.current;
|
|
5200
|
-
if (!intersectionEntry || !isActive) {
|
|
5223
|
+
if (!intersectionEntry || !isActive || !actionListItemRef.current) {
|
|
5201
5224
|
return;
|
|
5202
5225
|
}
|
|
5203
5226
|
var rect = actionListItemRef.current.getBoundingClientRect();
|
|
@@ -5296,9 +5319,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
|
|
|
5296
5319
|
var _e = tslib.__read(React.useState('first'), 2), focusStrategy = _e[0], setFocusStrategy = _e[1];
|
|
5297
5320
|
var triggerRef = React.useRef(null);
|
|
5298
5321
|
var actionMenuRef = useSharedRef(ref);
|
|
5299
|
-
var
|
|
5300
|
-
var
|
|
5301
|
-
var _g = tslib.__read(nextId.useId(1, 'menu'), 1),
|
|
5322
|
+
var _f = actionMenuList.props, actionListRef = _f.ref, actionListOnAction = _f.onAction;
|
|
5323
|
+
var actionMenuListRef = useSharedRef(actionListRef !== null && actionListRef !== void 0 ? actionListRef : null);
|
|
5324
|
+
var _g = tslib.__read(nextId.useId(1, 'menu-trigger'), 1), triggerId = _g[0];
|
|
5325
|
+
var _h = tslib.__read(nextId.useId(1, 'menu'), 1), menuId = _h[0];
|
|
5302
5326
|
var handleTriggerClick = React.useCallback(function (event) {
|
|
5303
5327
|
// istanbul ignore else
|
|
5304
5328
|
if (!event.defaultPrevented) {
|
|
@@ -5345,11 +5369,10 @@ var ActionMenu = React.forwardRef(function (_a, ref) {
|
|
|
5345
5369
|
if (!event.defaultPrevented) {
|
|
5346
5370
|
setOpen(false);
|
|
5347
5371
|
}
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
onAction(key, event);
|
|
5372
|
+
if (typeof actionListOnAction === 'function') {
|
|
5373
|
+
actionListOnAction(key, event);
|
|
5351
5374
|
}
|
|
5352
|
-
}, [
|
|
5375
|
+
}, [actionListOnAction]);
|
|
5353
5376
|
React.useEffect(function () {
|
|
5354
5377
|
var _a, _b;
|
|
5355
5378
|
if (open) {
|
|
@@ -5415,49 +5438,181 @@ var TreeViewItem = function (_a) {
|
|
|
5415
5438
|
var checkboxId = React.useMemo(function () { return nextId__default["default"]('tree-view-item-'); }, []);
|
|
5416
5439
|
return (React__default["default"].createElement(reactAriaComponents.TreeItem, { id: id, textValue: textValue, className: "TreeView__item" },
|
|
5417
5440
|
React__default["default"].createElement(reactAriaComponents.TreeItemContent, null, function (_a) {
|
|
5418
|
-
var selectionMode = _a.selectionMode, isSelected = _a.isSelected;
|
|
5441
|
+
var selectionMode = _a.selectionMode, isSelected = _a.isSelected, isDisabled = _a.isDisabled;
|
|
5419
5442
|
return (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
5420
5443
|
React__default["default"].createElement(reactAriaComponents.Button, { slot: "chevron", className: "TreeView__chevron" },
|
|
5421
5444
|
React__default["default"].createElement(Icon, { type: "chevron-right" })),
|
|
5422
|
-
selectionMode !== 'none' ? (React__default["default"].createElement(Checkbox, { id: checkboxId, label: textValue, checked: isSelected, controlled: true, tabIndex: -1 })) : (React__default["default"].createElement(React__default["default"].Fragment, null, textValue))));
|
|
5445
|
+
selectionMode !== 'none' ? (React__default["default"].createElement(Checkbox, { id: checkboxId, label: textValue, checked: isSelected, disabled: isDisabled, controlled: true, tabIndex: -1 })) : (React__default["default"].createElement(React__default["default"].Fragment, null, textValue))));
|
|
5423
5446
|
}),
|
|
5424
5447
|
children && children.length > 0 && (React__default["default"].createElement(reactAriaComponents.Collection, null, children.map(function (child) { return (React__default["default"].createElement(TreeViewItem, tslib.__assign({ key: child.id }, child))); })))));
|
|
5425
5448
|
};
|
|
5426
5449
|
TreeViewItem.displayName = 'TreeViewItem';
|
|
5427
5450
|
|
|
5451
|
+
/** Every node id in the tree, flattened depth-first. */
|
|
5428
5452
|
function collectAllKeys(nodes) {
|
|
5429
5453
|
return nodes.flatMap(function (node) { return tslib.__spreadArray([
|
|
5430
5454
|
node.id
|
|
5431
5455
|
], tslib.__read((node.children ? collectAllKeys(node.children) : [])), false); });
|
|
5432
5456
|
}
|
|
5433
|
-
|
|
5434
|
-
|
|
5435
|
-
|
|
5436
|
-
|
|
5437
|
-
|
|
5438
|
-
|
|
5439
|
-
|
|
5440
|
-
|
|
5441
|
-
|
|
5457
|
+
/** Normalize react-aria's `Selection` ("all" | Set) into a concrete Set of keys. */
|
|
5458
|
+
function toKeySet(selection, nodes) {
|
|
5459
|
+
if (selection !== 'all') {
|
|
5460
|
+
return new Set(selection);
|
|
5461
|
+
}
|
|
5462
|
+
// "Select all" only includes selectable (non-disabled) nodes.
|
|
5463
|
+
var disabled = new Set(collectDisabledKeys(nodes));
|
|
5464
|
+
return new Set(collectAllKeys(nodes).filter(function (key) { return !disabled.has(key); }));
|
|
5465
|
+
}
|
|
5466
|
+
/** Locate a node anywhere in the tree by its id. */
|
|
5467
|
+
function findNode(nodes, key) {
|
|
5468
|
+
var e_1, _a;
|
|
5469
|
+
try {
|
|
5470
|
+
for (var nodes_1 = tslib.__values(nodes), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
|
|
5471
|
+
var node = nodes_1_1.value;
|
|
5472
|
+
if (node.id === key) {
|
|
5473
|
+
return node;
|
|
5442
5474
|
}
|
|
5443
|
-
|
|
5444
|
-
|
|
5445
|
-
|
|
5475
|
+
if (node.children) {
|
|
5476
|
+
var found = findNode(node.children, key);
|
|
5477
|
+
if (found) {
|
|
5478
|
+
return found;
|
|
5446
5479
|
}
|
|
5447
|
-
next.add(key);
|
|
5448
5480
|
}
|
|
5449
|
-
|
|
5481
|
+
}
|
|
5482
|
+
}
|
|
5483
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
5484
|
+
finally {
|
|
5485
|
+
try {
|
|
5486
|
+
if (nodes_1_1 && !nodes_1_1.done && (_a = nodes_1.return)) _a.call(nodes_1);
|
|
5487
|
+
}
|
|
5488
|
+
finally { if (e_1) throw e_1.error; }
|
|
5489
|
+
}
|
|
5490
|
+
return undefined;
|
|
5491
|
+
}
|
|
5492
|
+
/** All descendant ids of a node (not including the node itself). */
|
|
5493
|
+
function collectDescendantKeys(node) {
|
|
5494
|
+
if (!node.children) {
|
|
5495
|
+
return [];
|
|
5496
|
+
}
|
|
5497
|
+
return node.children.flatMap(function (child) { return tslib.__spreadArray([
|
|
5498
|
+
child.id
|
|
5499
|
+
], tslib.__read(collectDescendantKeys(child)), false); });
|
|
5500
|
+
}
|
|
5501
|
+
/** Ids of all disabled nodes (rendered disabled / non-selectable). */
|
|
5502
|
+
function collectDisabledKeys(nodes) {
|
|
5503
|
+
return nodes.flatMap(function (node) { return tslib.__spreadArray(tslib.__spreadArray([], tslib.__read((node.disabled ? [node.id] : [])), false), tslib.__read((node.children ? collectDisabledKeys(node.children) : [])), false); });
|
|
5504
|
+
}
|
|
5505
|
+
/**
|
|
5506
|
+
* Toggle a single node, applying cascade per the options (multiple mode only):
|
|
5507
|
+
* - selecting + `cascadeSelect`: also selects all (non-disabled) descendants.
|
|
5508
|
+
* - deselecting + `cascadeDeselect`: also deselects all descendants.
|
|
5509
|
+
*
|
|
5510
|
+
* In `single` mode only the clicked node is selected (clicking it again clears
|
|
5511
|
+
* it); cascade does not apply.
|
|
5512
|
+
*/
|
|
5513
|
+
function toggleSelection(nodes, previous, key, selectionMode, _a) {
|
|
5514
|
+
var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
|
|
5515
|
+
if (selectionMode === 'single') {
|
|
5516
|
+
var result_1 = new Set();
|
|
5517
|
+
if (!previous.has(key)) {
|
|
5518
|
+
result_1.add(key);
|
|
5519
|
+
}
|
|
5520
|
+
return result_1;
|
|
5521
|
+
}
|
|
5522
|
+
var result = new Set(previous);
|
|
5523
|
+
var node = findNode(nodes, key);
|
|
5524
|
+
var descendants = node ? collectDescendantKeys(node) : [];
|
|
5525
|
+
var disabled = new Set(collectDisabledKeys(nodes));
|
|
5526
|
+
if (!previous.has(key)) {
|
|
5527
|
+
result.add(key);
|
|
5528
|
+
if (cascadeSelect) {
|
|
5529
|
+
descendants.forEach(function (k) {
|
|
5530
|
+
if (!disabled.has(k)) {
|
|
5531
|
+
result.add(k);
|
|
5532
|
+
}
|
|
5533
|
+
});
|
|
5534
|
+
}
|
|
5535
|
+
}
|
|
5536
|
+
else {
|
|
5537
|
+
result.delete(key);
|
|
5538
|
+
if (cascadeDeselect) {
|
|
5539
|
+
descendants.forEach(function (k) { return result.delete(k); });
|
|
5540
|
+
}
|
|
5541
|
+
}
|
|
5542
|
+
return result;
|
|
5543
|
+
}
|
|
5544
|
+
/**
|
|
5545
|
+
* Apply react-aria's proposed selection while enforcing cascade. Each key
|
|
5546
|
+
* react-aria added cascades to its descendants when `cascadeSelect` is set; each
|
|
5547
|
+
* key it removed cascades when `cascadeDeselect` is set. In non-multiple modes
|
|
5548
|
+
* (or with both toggles off) the proposed selection is used as-is.
|
|
5549
|
+
*/
|
|
5550
|
+
function applyCascade(nodes, previous, next, selectionMode, _a) {
|
|
5551
|
+
var cascadeSelect = _a.cascadeSelect, cascadeDeselect = _a.cascadeDeselect;
|
|
5552
|
+
if (selectionMode !== 'multiple' || (!cascadeSelect && !cascadeDeselect)) {
|
|
5553
|
+
return next;
|
|
5554
|
+
}
|
|
5555
|
+
var result = new Set(previous);
|
|
5556
|
+
var added = tslib.__spreadArray([], tslib.__read(next), false).filter(function (key) { return !previous.has(key); });
|
|
5557
|
+
var removed = tslib.__spreadArray([], tslib.__read(previous), false).filter(function (key) { return !next.has(key); });
|
|
5558
|
+
var disabled = new Set(collectDisabledKeys(nodes));
|
|
5559
|
+
added.forEach(function (key) {
|
|
5560
|
+
result.add(key);
|
|
5561
|
+
if (cascadeSelect) {
|
|
5562
|
+
var node = findNode(nodes, key);
|
|
5563
|
+
(node ? collectDescendantKeys(node) : []).forEach(function (k) {
|
|
5564
|
+
if (!disabled.has(k)) {
|
|
5565
|
+
result.add(k);
|
|
5566
|
+
}
|
|
5567
|
+
});
|
|
5568
|
+
}
|
|
5569
|
+
});
|
|
5570
|
+
removed.forEach(function (key) {
|
|
5571
|
+
result.delete(key);
|
|
5572
|
+
if (cascadeDeselect) {
|
|
5573
|
+
var node = findNode(nodes, key);
|
|
5574
|
+
(node ? collectDescendantKeys(node) : []).forEach(function (k) {
|
|
5575
|
+
return result.delete(k);
|
|
5576
|
+
});
|
|
5577
|
+
}
|
|
5578
|
+
});
|
|
5579
|
+
return result;
|
|
5580
|
+
}
|
|
5581
|
+
|
|
5582
|
+
var TreeView = React.forwardRef(function (_a, ref) {
|
|
5583
|
+
var items = _a.items, onAction = _a.onAction, _b = _a.selectionMode, selectionMode = _b === void 0 ? 'none' : _b, _c = _a.cascadeSelect, cascadeSelect = _c === void 0 ? false : _c, _d = _a.cascadeDeselect, cascadeDeselect = _d === void 0 ? false : _d, defaultExpandedKeys = _a.defaultExpandedKeys, className = _a.className, other = tslib.__rest(_a, ["items", "onAction", "selectionMode", "cascadeSelect", "cascadeDeselect", "defaultExpandedKeys", "className"]);
|
|
5584
|
+
var _e = tslib.__read(React.useState(new Set()), 2), selectedKeys = _e[0], setSelectedKeys = _e[1];
|
|
5585
|
+
var cascade = { cascadeSelect: cascadeSelect, cascadeDeselect: cascadeDeselect };
|
|
5586
|
+
// Cascade only applies to multiple selection.
|
|
5587
|
+
var isCascade = selectionMode === 'multiple' && (cascadeSelect || cascadeDeselect);
|
|
5588
|
+
// Selection driven by react-aria (row/checkbox press, keyboard). When
|
|
5589
|
+
// cascading, reconcile the proposed change; otherwise store react-aria's
|
|
5590
|
+
// selection as-is so the `'all'` sentinel (Ctrl+A) is preserved.
|
|
5591
|
+
var handleSelectionChange = function (selection) {
|
|
5592
|
+
setSelectedKeys(function (prev) {
|
|
5593
|
+
return isCascade
|
|
5594
|
+
? applyCascade(items, toKeySet(prev, items), toKeySet(selection, items), selectionMode, cascade)
|
|
5595
|
+
: selection;
|
|
5450
5596
|
});
|
|
5451
|
-
onAction === null || onAction === void 0 ? void 0 : onAction(key);
|
|
5452
5597
|
};
|
|
5453
|
-
|
|
5454
|
-
|
|
5455
|
-
|
|
5456
|
-
|
|
5457
|
-
|
|
5598
|
+
// When `onAction` is set, react-aria treats a row press as an action rather
|
|
5599
|
+
// than a selection, so we toggle selection here ourselves.
|
|
5600
|
+
var handleAction = function (key) {
|
|
5601
|
+
if (selectionMode !== 'none') {
|
|
5602
|
+
setSelectedKeys(function (prev) {
|
|
5603
|
+
return toggleSelection(items, toKeySet(prev, items), key, selectionMode, cascade);
|
|
5604
|
+
});
|
|
5458
5605
|
}
|
|
5606
|
+
onAction === null || onAction === void 0 ? void 0 : onAction(key);
|
|
5607
|
+
};
|
|
5608
|
+
// Disabled nodes are non-selectable; react-aria disables them via disabledKeys.
|
|
5609
|
+
var disabledKeys = React.useMemo(function () { return collectDisabledKeys(items); }, [items]);
|
|
5610
|
+
// Cascade requires controlling selection. Without it, preserve the original
|
|
5611
|
+
// behavior: selection is only controlled when an `onAction` handler is set.
|
|
5612
|
+
var selectionProps = selectionMode !== 'none' && (isCascade || onAction)
|
|
5613
|
+
? { selectedKeys: selectedKeys, onSelectionChange: handleSelectionChange }
|
|
5459
5614
|
: {};
|
|
5460
|
-
return (React__default["default"].createElement(reactAriaComponents.Tree, tslib.__assign({ ref: ref, className: classNames__default["default"]('TreeView', className), selectionMode: selectionMode, defaultExpandedKeys: defaultExpandedKeys },
|
|
5615
|
+
return (React__default["default"].createElement(reactAriaComponents.Tree, tslib.__assign({ ref: ref, className: classNames__default["default"]('TreeView', className), selectionMode: selectionMode, defaultExpandedKeys: defaultExpandedKeys }, (disabledKeys.length > 0 ? { disabledKeys: disabledKeys } : {}), (onAction ? { onAction: handleAction } : {}), selectionProps, other), items.map(function (item) { return (React__default["default"].createElement(TreeViewItem, tslib.__assign({ key: item.id }, item))); })));
|
|
5461
5616
|
});
|
|
5462
5617
|
TreeView.displayName = 'TreeView';
|
|
5463
5618
|
|