@fluentui-react-native/menu 0.14.3 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +16 -1
- package/CHANGELOG.md +10 -2
- package/SPEC.md +5 -6
- package/lib/Menu/useMenu.d.ts.map +1 -1
- package/lib/Menu/useMenu.js +18 -3
- package/lib/Menu/useMenu.js.map +1 -1
- package/lib/MenuItemRadio/useMenuItemRadio.d.ts.map +1 -1
- package/lib/MenuItemRadio/useMenuItemRadio.js +9 -4
- package/lib/MenuItemRadio/useMenuItemRadio.js.map +1 -1
- package/lib/MenuList/MenuList.js +1 -1
- package/lib/MenuList/MenuList.js.map +1 -1
- package/lib/MenuList/MenuList.types.d.ts +10 -5
- package/lib/MenuList/MenuList.types.d.ts.map +1 -1
- package/lib/MenuList/useMenuList.d.ts.map +1 -1
- package/lib/MenuList/useMenuList.js +73 -26
- package/lib/MenuList/useMenuList.js.map +1 -1
- package/lib/MenuList/useMenuListContextValue.js +1 -1
- package/lib/MenuList/useMenuListContextValue.js.map +1 -1
- package/lib/__tests__/Menu.test.js +2 -2
- package/lib/__tests__/Menu.test.js.map +1 -1
- package/lib/context/menuContext.js +2 -2
- package/lib/context/menuListContext.d.ts +6 -4
- package/lib/context/menuListContext.d.ts.map +1 -1
- package/lib/context/menuListContext.js +2 -1
- package/lib/context/menuListContext.js.map +1 -1
- package/lib-commonjs/Menu/useMenu.d.ts.map +1 -1
- package/lib-commonjs/Menu/useMenu.js +18 -3
- package/lib-commonjs/Menu/useMenu.js.map +1 -1
- package/lib-commonjs/MenuItemRadio/useMenuItemRadio.d.ts.map +1 -1
- package/lib-commonjs/MenuItemRadio/useMenuItemRadio.js +9 -4
- package/lib-commonjs/MenuItemRadio/useMenuItemRadio.js.map +1 -1
- package/lib-commonjs/MenuList/MenuList.js +1 -1
- package/lib-commonjs/MenuList/MenuList.js.map +1 -1
- package/lib-commonjs/MenuList/MenuList.types.d.ts +10 -5
- package/lib-commonjs/MenuList/MenuList.types.d.ts.map +1 -1
- package/lib-commonjs/MenuList/useMenuList.d.ts.map +1 -1
- package/lib-commonjs/MenuList/useMenuList.js +74 -27
- package/lib-commonjs/MenuList/useMenuList.js.map +1 -1
- package/lib-commonjs/MenuList/useMenuListContextValue.js +1 -1
- package/lib-commonjs/MenuList/useMenuListContextValue.js.map +1 -1
- package/lib-commonjs/__tests__/Menu.test.js +2 -2
- package/lib-commonjs/__tests__/Menu.test.js.map +1 -1
- package/lib-commonjs/context/menuContext.js +2 -2
- package/lib-commonjs/context/menuListContext.d.ts +6 -4
- package/lib-commonjs/context/menuListContext.d.ts.map +1 -1
- package/lib-commonjs/context/menuListContext.js +2 -1
- package/lib-commonjs/context/menuListContext.js.map +1 -1
- package/package.json +1 -1
- package/src/Menu/useMenu.ts +28 -3
- package/src/MenuItemRadio/useMenuItemRadio.ts +11 -3
- package/src/MenuList/MenuList.tsx +1 -1
- package/src/MenuList/MenuList.types.ts +10 -5
- package/src/MenuList/useMenuList.ts +76 -37
- package/src/MenuList/useMenuListContextValue.ts +1 -1
- package/src/__tests__/Menu.test.tsx +2 -2
- package/src/context/menuContext.ts +2 -2
- package/src/context/menuListContext.ts +5 -2
|
@@ -7,14 +7,19 @@ export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {
|
|
|
7
7
|
gap?: number;
|
|
8
8
|
}
|
|
9
9
|
export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
|
|
10
|
-
checked?:
|
|
11
|
-
defaultChecked?:
|
|
10
|
+
checked?: string[];
|
|
11
|
+
defaultChecked?: string[];
|
|
12
12
|
hasCheckmarks?: boolean;
|
|
13
|
-
onCheckedChange?: (e: InteractionEvent,
|
|
13
|
+
onCheckedChange?: (e: InteractionEvent, checked: string[]) => void;
|
|
14
14
|
}
|
|
15
|
-
export interface MenuListState extends MenuListProps {
|
|
15
|
+
export interface MenuListState extends Omit<MenuListProps, 'checked' | 'onCheckedChange'> {
|
|
16
|
+
props: MenuListProps;
|
|
17
|
+
checked?: Record<string, boolean>;
|
|
16
18
|
isCheckedControlled: boolean;
|
|
17
|
-
|
|
19
|
+
onCheckedChange?: (e: InteractionEvent, name: string, isChecked: boolean) => void;
|
|
20
|
+
selectRadio?: (e: InteractionEvent, name: string) => void;
|
|
21
|
+
addRadioItem: (name: string) => void;
|
|
22
|
+
removeRadioItem: (name: string) => void;
|
|
18
23
|
}
|
|
19
24
|
export interface MenuListSlotProps {
|
|
20
25
|
root: React.PropsWithRef<IViewProps> & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuList.types.d.ts","sourceRoot":"","sources":["../../src/MenuList/MenuList.types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAErF,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,sBAAsB;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IAChE,OAAO,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"MenuList.types.d.ts","sourceRoot":"","sources":["../../src/MenuList/MenuList.types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAErF,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,MAAM,WAAW,cAAe,SAAQ,YAAY,EAAE,sBAAsB;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,iBAAiB,CAAC;IACvF,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAClF,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,iBAAiB,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenuList.d.ts","sourceRoot":"","sources":["../../src/MenuList/useMenuList.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"useMenuList.d.ts","sourceRoot":"","sources":["../../src/MenuList/useMenuList.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAchE,eAAO,MAAM,WAAW,WAAY,aAAa,KAAG,aAyFnD,CAAC"}
|
|
@@ -4,42 +4,89 @@ exports.useMenuList = void 0;
|
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var react_1 = (0, tslib_1.__importDefault)(require("react"));
|
|
6
6
|
var menuContext_1 = require("../context/menuContext");
|
|
7
|
+
// Track the radio items so we know what to clear selection from when selectRadio is called
|
|
8
|
+
// Purposefully left out of the hook because
|
|
9
|
+
// 1. RadioItems just keeps track of information - changing this array doesn't need to force rerender
|
|
10
|
+
// 2. Keeping them here means these consts are not recreated on every render, which would force rerendering of all children
|
|
11
|
+
var radioItems = [];
|
|
12
|
+
var addRadioItem = function (name) {
|
|
13
|
+
radioItems.push(name);
|
|
14
|
+
};
|
|
15
|
+
var removeRadioItem = function (name) {
|
|
16
|
+
radioItems.filter(function (item) { return item !== name; });
|
|
17
|
+
};
|
|
7
18
|
var useMenuList = function (_props) {
|
|
8
19
|
var context = (0, menuContext_1.useMenuContext)();
|
|
9
20
|
// MenuList v2 needs to be able to be standalone, but this is not in scope for v1
|
|
10
21
|
// Assuming that checked information will come from parent Menu
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
var defaultChecked = context.defaultChecked, onCheckedChangeOriginal = context.onCheckedChange, checkedOriginal = context.checked;
|
|
23
|
+
// Convert passed in array to map so that i's easier to look up checked state
|
|
24
|
+
var checkedMap = react_1.default.useMemo(function () {
|
|
25
|
+
var state = {};
|
|
26
|
+
if (!checkedOriginal) {
|
|
27
|
+
return state;
|
|
28
|
+
}
|
|
29
|
+
for (var _i = 0, checkedOriginal_1 = checkedOriginal; _i < checkedOriginal_1.length; _i++) {
|
|
30
|
+
var key = checkedOriginal_1[_i];
|
|
31
|
+
state[key] = true;
|
|
32
|
+
}
|
|
33
|
+
return state;
|
|
34
|
+
}, [checkedOriginal]);
|
|
35
|
+
var _a = react_1.default.useState(function () {
|
|
36
|
+
if (checkedMap) {
|
|
37
|
+
return checkedMap;
|
|
38
|
+
}
|
|
39
|
+
var initialChecked = defaultChecked !== null && defaultChecked !== void 0 ? defaultChecked : [];
|
|
40
|
+
var state = {};
|
|
41
|
+
for (var _i = 0, initialChecked_1 = initialChecked; _i < initialChecked_1.length; _i++) {
|
|
42
|
+
var key = initialChecked_1[_i];
|
|
43
|
+
state[key] = true;
|
|
44
|
+
}
|
|
45
|
+
return state;
|
|
46
|
+
}), checkedInternal = _a[0], setCheckedInternal = _a[1];
|
|
47
|
+
var isCheckedControlled = typeof checkedOriginal !== 'undefined';
|
|
48
|
+
var checked = isCheckedControlled ? checkedMap : checkedInternal;
|
|
49
|
+
var onCheckedChange = react_1.default.useCallback(function (e, name, isChecked) {
|
|
50
|
+
var updatedChecked = (0, tslib_1.__assign)({}, checked);
|
|
51
|
+
if (isChecked) {
|
|
52
|
+
updatedChecked[name] = true;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
delete updatedChecked[name];
|
|
56
|
+
}
|
|
57
|
+
if (!isCheckedControlled) {
|
|
27
58
|
setCheckedInternal(updatedChecked);
|
|
28
59
|
}
|
|
29
|
-
if (
|
|
30
|
-
|
|
60
|
+
if (onCheckedChangeOriginal) {
|
|
61
|
+
onCheckedChangeOriginal(e, Object.keys(updatedChecked));
|
|
62
|
+
}
|
|
63
|
+
}, [isCheckedControlled, checked, onCheckedChangeOriginal, setCheckedInternal]);
|
|
64
|
+
var selectRadio = react_1.default.useCallback(function (e, name) {
|
|
65
|
+
var updatedChecked = {};
|
|
66
|
+
for (var _i = 0, _a = Object.keys(checked); _i < _a.length; _i++) {
|
|
67
|
+
var checkedName = _a[_i];
|
|
68
|
+
if (!radioItems.includes(checkedName)) {
|
|
69
|
+
// Preserve checked state if non-radio items
|
|
70
|
+
updatedChecked[checkedName] = checked[checkedName];
|
|
71
|
+
}
|
|
31
72
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
var _a;
|
|
35
|
-
if (!isControlled) {
|
|
36
|
-
var updatedChecked = (_a = {}, _a[name] = true, _a);
|
|
73
|
+
updatedChecked[name] = true;
|
|
74
|
+
if (!isCheckedControlled) {
|
|
37
75
|
setCheckedInternal(updatedChecked);
|
|
38
76
|
}
|
|
39
|
-
if (
|
|
40
|
-
|
|
77
|
+
if (onCheckedChangeOriginal) {
|
|
78
|
+
onCheckedChangeOriginal(e, Object.keys(updatedChecked));
|
|
41
79
|
}
|
|
42
|
-
}, [
|
|
43
|
-
return
|
|
80
|
+
}, [isCheckedControlled, onCheckedChangeOriginal, setCheckedInternal, checked]);
|
|
81
|
+
return {
|
|
82
|
+
props: (0, tslib_1.__assign)({}, context),
|
|
83
|
+
isCheckedControlled: isCheckedControlled,
|
|
84
|
+
checked: checked,
|
|
85
|
+
onCheckedChange: onCheckedChange,
|
|
86
|
+
selectRadio: selectRadio,
|
|
87
|
+
addRadioItem: addRadioItem,
|
|
88
|
+
removeRadioItem: removeRadioItem,
|
|
89
|
+
};
|
|
44
90
|
};
|
|
91
|
+
exports.useMenuList = useMenuList;
|
|
45
92
|
//# sourceMappingURL=useMenuList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenuList.js","sourceRoot":"","sources":["../../src/MenuList/useMenuList.ts"],"names":[],"mappings":";;;;AACA,6DAA0B;AAC1B,sDAAwD;
|
|
1
|
+
{"version":3,"file":"useMenuList.js","sourceRoot":"","sources":["../../src/MenuList/useMenuList.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useMenuListContextValue = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var useMenuListContextValue = function (state) {
|
|
6
|
-
return (0, tslib_1.__assign)({}, state);
|
|
6
|
+
return (0, tslib_1.__assign)({ hasCheckmarks: state.props.hasCheckmarks }, state);
|
|
7
7
|
};
|
|
8
8
|
exports.useMenuListContextValue = useMenuListContextValue;
|
|
9
9
|
//# sourceMappingURL=useMenuListContextValue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenuListContextValue.js","sourceRoot":"","sources":["../../src/MenuList/useMenuListContextValue.ts"],"names":[],"mappings":";;;;AAGO,IAAM,uBAAuB,GAAG,UAAC,KAAoB;IAC1D,
|
|
1
|
+
{"version":3,"file":"useMenuListContextValue.js","sourceRoot":"","sources":["../../src/MenuList/useMenuListContextValue.ts"],"names":[],"mappings":";;;;AAGO,IAAM,uBAAuB,GAAG,UAAC,KAAoB;IAC1D,+BAAS,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa,IAAK,KAAK,EAAG;AAChE,CAAC,CAAC;AAFW,QAAA,uBAAuB,2BAElC"}
|
|
@@ -75,7 +75,7 @@ describe('Checkbox component tests', function () {
|
|
|
75
75
|
});
|
|
76
76
|
it('Menu open checkbox defaultChecked', function () {
|
|
77
77
|
var tree = renderer
|
|
78
|
-
.create(React.createElement(Menu_1.Menu, { open: true, defaultChecked:
|
|
78
|
+
.create(React.createElement(Menu_1.Menu, { open: true, defaultChecked: ['Option 1'] },
|
|
79
79
|
React.createElement(MenuTrigger_1.default, null,
|
|
80
80
|
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
81
81
|
React.createElement(MenuPopover_1.default, null,
|
|
@@ -88,7 +88,7 @@ describe('Checkbox component tests', function () {
|
|
|
88
88
|
});
|
|
89
89
|
it('Menu open checkbox checked', function () {
|
|
90
90
|
var tree = renderer
|
|
91
|
-
.create(React.createElement(Menu_1.Menu, { open: true, checked:
|
|
91
|
+
.create(React.createElement(Menu_1.Menu, { open: true, checked: ['Option 1'] },
|
|
92
92
|
React.createElement(MenuTrigger_1.default, null,
|
|
93
93
|
React.createElement(button_1.ButtonV1, null, "Open")),
|
|
94
94
|
React.createElement(MenuPopover_1.default, null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.test.js","sourceRoot":"","sources":["../../src/__tests__/Menu.test.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Menu.test.js","sourceRoot":"","sources":["../../src/__tests__/Menu.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ var tslib_1 = require("tslib");
|
|
|
5
5
|
var React = (0, tslib_1.__importStar)(require("react"));
|
|
6
6
|
exports.MenuContext = React.createContext({
|
|
7
7
|
isControlled: false,
|
|
8
|
-
checked:
|
|
9
|
-
defaultChecked:
|
|
8
|
+
checked: [],
|
|
9
|
+
defaultChecked: [],
|
|
10
10
|
hasCheckmarks: false,
|
|
11
11
|
isSubmenu: false,
|
|
12
12
|
open: false,
|
|
@@ -3,8 +3,10 @@ import type { MenuListState } from '../MenuList/MenuList.types';
|
|
|
3
3
|
/**
|
|
4
4
|
* Context shared between Menu and its child components
|
|
5
5
|
*/
|
|
6
|
-
export declare type MenuListContextValue = MenuListState
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export declare const
|
|
6
|
+
export declare type MenuListContextValue = Omit<MenuListState, 'props'> & {
|
|
7
|
+
hasCheckmarks: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare const MenuListContext: React.Context<MenuListContextValue>;
|
|
10
|
+
export declare const MenuListProvider: React.Provider<MenuListContextValue>;
|
|
11
|
+
export declare const useMenuListContext: () => MenuListContextValue;
|
|
10
12
|
//# sourceMappingURL=menuListContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menuListContext.d.ts","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;GAEG;AACH,oBAAY,oBAAoB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"menuListContext.d.ts","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;GAEG;AACH,oBAAY,oBAAoB,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG;IAChE,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,eAAe,qCAO1B,CAAC;AAEH,eAAO,MAAM,gBAAgB,sCAA2B,CAAC;AACzD,eAAO,MAAM,kBAAkB,4BAA0C,CAAC"}
|
|
@@ -6,9 +6,10 @@ var React = (0, tslib_1.__importStar)(require("react"));
|
|
|
6
6
|
exports.MenuListContext = React.createContext({
|
|
7
7
|
isCheckedControlled: false,
|
|
8
8
|
checked: {},
|
|
9
|
-
defaultChecked: {},
|
|
10
9
|
hasCheckmarks: false,
|
|
11
10
|
onCheckedChange: function () { return false; },
|
|
11
|
+
addRadioItem: function () { return false; },
|
|
12
|
+
removeRadioItem: function () { return false; },
|
|
12
13
|
});
|
|
13
14
|
exports.MenuListProvider = exports.MenuListContext.Provider;
|
|
14
15
|
var useMenuListContext = function () { return React.useContext(exports.MenuListContext); };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menuListContext.js","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;
|
|
1
|
+
{"version":3,"file":"menuListContext.js","sourceRoot":"","sources":["../../src/context/menuListContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAUlB,QAAA,eAAe,GAAG,KAAK,CAAC,aAAa,CAAuB;IACvE,mBAAmB,EAAE,KAAK;IAC1B,OAAO,EAAE,EAAE;IACX,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IAC5B,YAAY,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IACzB,eAAe,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;CAC7B,CAAC,CAAC;AAEU,QAAA,gBAAgB,GAAG,uBAAe,CAAC,QAAQ,CAAC;AAClD,IAAM,kBAAkB,GAAG,cAAM,OAAA,KAAK,CAAC,UAAU,CAAC,uBAAe,CAAC,EAAjC,CAAiC,CAAC;AAA7D,QAAA,kBAAkB,sBAA2C"}
|
package/package.json
CHANGED
package/src/Menu/useMenu.ts
CHANGED
|
@@ -14,8 +14,10 @@ export const useMenu = (props: MenuProps): MenuState => {
|
|
|
14
14
|
const triggerRef = React.useRef();
|
|
15
15
|
const context = useMenuContext();
|
|
16
16
|
const isSubmenu = context.triggerRef !== null;
|
|
17
|
-
const
|
|
18
|
-
const [open, setOpen] = useMenuOpenState(
|
|
17
|
+
const isOpenControlled = typeof props.open !== 'undefined';
|
|
18
|
+
const [open, setOpen] = useMenuOpenState(isOpenControlled, props, context.setOpen);
|
|
19
|
+
|
|
20
|
+
const [checked, onCheckedChange] = useMenuCheckedState(props);
|
|
19
21
|
|
|
20
22
|
// Default behavior for submenu is to open on hover
|
|
21
23
|
// the ...props line below will override this behavior for a submenu
|
|
@@ -33,9 +35,11 @@ export const useMenu = (props: MenuProps): MenuState => {
|
|
|
33
35
|
...props,
|
|
34
36
|
open,
|
|
35
37
|
setOpen,
|
|
38
|
+
checked,
|
|
39
|
+
onCheckedChange,
|
|
36
40
|
triggerRef,
|
|
37
41
|
isSubmenu,
|
|
38
|
-
isControlled,
|
|
42
|
+
isControlled: isOpenControlled,
|
|
39
43
|
parentPopoverHoverOutTimer,
|
|
40
44
|
};
|
|
41
45
|
};
|
|
@@ -76,3 +80,24 @@ const useMenuOpenState = (
|
|
|
76
80
|
|
|
77
81
|
return [state, setOpen];
|
|
78
82
|
};
|
|
83
|
+
|
|
84
|
+
const useMenuCheckedState = (props: MenuProps): [string[], (e: InteractionEvent, checked: string[]) => void] => {
|
|
85
|
+
const { checked, defaultChecked, onCheckedChange: onCheckedChangeOriginal } = props;
|
|
86
|
+
const [checkedInternal, setCheckedInternal] = React.useState(defaultChecked ?? checked ?? []);
|
|
87
|
+
|
|
88
|
+
const isControlled = typeof checked !== 'undefined';
|
|
89
|
+
const state = isControlled ? checked : checkedInternal;
|
|
90
|
+
|
|
91
|
+
const onCheckedChange = React.useCallback(
|
|
92
|
+
(e: InteractionEvent, checked: string[]) => {
|
|
93
|
+
if (!isControlled) {
|
|
94
|
+
setCheckedInternal(checked);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
onCheckedChangeOriginal?.(e, checked);
|
|
98
|
+
},
|
|
99
|
+
[isControlled, setCheckedInternal, onCheckedChangeOriginal],
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
return [state, onCheckedChange];
|
|
103
|
+
};
|
|
@@ -7,17 +7,25 @@ import { useMenuCheckboxInteraction } from '../MenuItemCheckbox/useMenuItemCheck
|
|
|
7
7
|
export const useMenuItemRadio = (props: MenuItemCheckboxProps): MenuItemCheckboxState => {
|
|
8
8
|
const { disabled, name } = props;
|
|
9
9
|
const context = useMenuListContext();
|
|
10
|
-
const checked = context.checked?.[name];
|
|
11
10
|
const selectRadio = context.selectRadio;
|
|
12
11
|
|
|
13
12
|
const toggleChecked = React.useCallback(
|
|
14
13
|
(e: InteractionEvent) => {
|
|
15
14
|
if (!disabled) {
|
|
16
|
-
selectRadio(e, name
|
|
15
|
+
selectRadio(e, name);
|
|
17
16
|
}
|
|
18
17
|
},
|
|
19
|
-
[
|
|
18
|
+
[disabled, name, selectRadio],
|
|
20
19
|
);
|
|
21
20
|
|
|
21
|
+
// Explicitly only run on mount and unmount
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
context.addRadioItem(name);
|
|
24
|
+
|
|
25
|
+
return () => {
|
|
26
|
+
context.removeRadioItem(name);
|
|
27
|
+
};
|
|
28
|
+
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
29
|
+
|
|
22
30
|
return useMenuCheckboxInteraction(props, toggleChecked);
|
|
23
31
|
};
|
|
@@ -37,7 +37,7 @@ export const MenuList = compose<MenuListType>({
|
|
|
37
37
|
useRender: (userProps: MenuListProps, useSlots: UseSlots<MenuListType>) => {
|
|
38
38
|
const menuList = useMenuList(userProps);
|
|
39
39
|
const contextValue = useMenuListContextValue(menuList);
|
|
40
|
-
const Slots = useSlots(menuList);
|
|
40
|
+
const Slots = useSlots(menuList.props);
|
|
41
41
|
|
|
42
42
|
return (_final: MenuListProps, children: React.ReactNode) => {
|
|
43
43
|
return (
|
|
@@ -9,15 +9,20 @@ export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
|
|
12
|
-
checked?:
|
|
13
|
-
defaultChecked?:
|
|
12
|
+
checked?: string[];
|
|
13
|
+
defaultChecked?: string[];
|
|
14
14
|
hasCheckmarks?: boolean;
|
|
15
|
-
onCheckedChange?: (e: InteractionEvent,
|
|
15
|
+
onCheckedChange?: (e: InteractionEvent, checked: string[]) => void;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export interface MenuListState extends MenuListProps {
|
|
18
|
+
export interface MenuListState extends Omit<MenuListProps, 'checked' | 'onCheckedChange'> {
|
|
19
|
+
props: MenuListProps;
|
|
20
|
+
checked?: Record<string, boolean>;
|
|
19
21
|
isCheckedControlled: boolean;
|
|
20
|
-
|
|
22
|
+
onCheckedChange?: (e: InteractionEvent, name: string, isChecked: boolean) => void;
|
|
23
|
+
selectRadio?: (e: InteractionEvent, name: string) => void;
|
|
24
|
+
addRadioItem: (name: string) => void;
|
|
25
|
+
removeRadioItem: (name: string) => void;
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
export interface MenuListSlotProps {
|
|
@@ -3,66 +3,105 @@ import React from 'react';
|
|
|
3
3
|
import { useMenuContext } from '../context/menuContext';
|
|
4
4
|
import { MenuListProps, MenuListState } from './MenuList.types';
|
|
5
5
|
|
|
6
|
+
// Track the radio items so we know what to clear selection from when selectRadio is called
|
|
7
|
+
// Purposefully left out of the hook because
|
|
8
|
+
// 1. RadioItems just keeps track of information - changing this array doesn't need to force rerender
|
|
9
|
+
// 2. Keeping them here means these consts are not recreated on every render, which would force rerendering of all children
|
|
10
|
+
const radioItems = [];
|
|
11
|
+
const addRadioItem = (name: string) => {
|
|
12
|
+
radioItems.push(name);
|
|
13
|
+
};
|
|
14
|
+
const removeRadioItem = (name: string) => {
|
|
15
|
+
radioItems.filter((item) => item !== name);
|
|
16
|
+
};
|
|
17
|
+
|
|
6
18
|
export const useMenuList = (_props: MenuListProps): MenuListState => {
|
|
7
19
|
const context = useMenuContext();
|
|
8
20
|
|
|
9
21
|
// MenuList v2 needs to be able to be standalone, but this is not in scope for v1
|
|
10
22
|
// Assuming that checked information will come from parent Menu
|
|
11
|
-
const
|
|
12
|
-
const [checked, onCheckedChange, selectRadio] = useMenuCheckedState(isCheckedControlled, context);
|
|
23
|
+
const { defaultChecked, onCheckedChange: onCheckedChangeOriginal, checked: checkedOriginal } = context;
|
|
13
24
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
// Convert passed in array to map so that i's easier to look up checked state
|
|
26
|
+
const checkedMap = React.useMemo(() => {
|
|
27
|
+
const state = {};
|
|
28
|
+
if (!checkedOriginal) {
|
|
29
|
+
return state;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
for (const key of checkedOriginal) {
|
|
33
|
+
state[key] = true;
|
|
34
|
+
}
|
|
35
|
+
return state;
|
|
36
|
+
}, [checkedOriginal]);
|
|
37
|
+
|
|
38
|
+
const [checkedInternal, setCheckedInternal] = React.useState<Record<string, boolean>>(() => {
|
|
39
|
+
if (checkedMap) {
|
|
40
|
+
return checkedMap;
|
|
41
|
+
}
|
|
22
42
|
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
] => {
|
|
31
|
-
const { defaultChecked, onCheckedChange, checked } = props;
|
|
32
|
-
const initialState = defaultChecked ?? checked ?? {};
|
|
33
|
-
const [checkedInternal, setCheckedInternal] = React.useState<Record<string, boolean>>(initialState);
|
|
43
|
+
const initialChecked = defaultChecked ?? [];
|
|
44
|
+
const state = {};
|
|
45
|
+
for (const key of initialChecked) {
|
|
46
|
+
state[key] = true;
|
|
47
|
+
}
|
|
48
|
+
return state;
|
|
49
|
+
});
|
|
34
50
|
|
|
35
|
-
const
|
|
51
|
+
const isCheckedControlled = typeof checkedOriginal !== 'undefined';
|
|
52
|
+
const checked = isCheckedControlled ? checkedMap : checkedInternal;
|
|
36
53
|
|
|
37
|
-
const
|
|
54
|
+
const onCheckedChange = React.useCallback(
|
|
38
55
|
(e: InteractionEvent, name: string, isChecked: boolean) => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
const updatedChecked = { ...checked };
|
|
57
|
+
if (isChecked) {
|
|
58
|
+
updatedChecked[name] = true;
|
|
59
|
+
} else {
|
|
60
|
+
delete updatedChecked[name];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!isCheckedControlled) {
|
|
43
64
|
setCheckedInternal(updatedChecked);
|
|
44
65
|
}
|
|
45
66
|
|
|
46
|
-
if (
|
|
47
|
-
|
|
67
|
+
if (onCheckedChangeOriginal) {
|
|
68
|
+
onCheckedChangeOriginal(e, Object.keys(updatedChecked));
|
|
48
69
|
}
|
|
49
70
|
},
|
|
50
|
-
[
|
|
71
|
+
[isCheckedControlled, checked, onCheckedChangeOriginal, setCheckedInternal],
|
|
51
72
|
);
|
|
52
73
|
|
|
53
74
|
const selectRadio = React.useCallback(
|
|
54
|
-
(e: InteractionEvent, name: string
|
|
55
|
-
|
|
56
|
-
|
|
75
|
+
(e: InteractionEvent, name: string) => {
|
|
76
|
+
const updatedChecked = {};
|
|
77
|
+
for (const checkedName of Object.keys(checked)) {
|
|
78
|
+
if (!radioItems.includes(checkedName)) {
|
|
79
|
+
// Preserve checked state if non-radio items
|
|
80
|
+
updatedChecked[checkedName] = checked[checkedName];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
updatedChecked[name] = true;
|
|
84
|
+
|
|
85
|
+
if (!isCheckedControlled) {
|
|
57
86
|
setCheckedInternal(updatedChecked);
|
|
58
87
|
}
|
|
59
88
|
|
|
60
|
-
if (
|
|
61
|
-
|
|
89
|
+
if (onCheckedChangeOriginal) {
|
|
90
|
+
onCheckedChangeOriginal(e, Object.keys(updatedChecked));
|
|
62
91
|
}
|
|
63
92
|
},
|
|
64
|
-
[
|
|
93
|
+
[isCheckedControlled, onCheckedChangeOriginal, setCheckedInternal, checked],
|
|
65
94
|
);
|
|
66
95
|
|
|
67
|
-
return
|
|
96
|
+
return {
|
|
97
|
+
props: {
|
|
98
|
+
...context,
|
|
99
|
+
},
|
|
100
|
+
isCheckedControlled,
|
|
101
|
+
checked,
|
|
102
|
+
onCheckedChange,
|
|
103
|
+
selectRadio,
|
|
104
|
+
addRadioItem,
|
|
105
|
+
removeRadioItem,
|
|
106
|
+
};
|
|
68
107
|
};
|
|
@@ -2,5 +2,5 @@ import { MenuListContextValue } from '../context/menuListContext';
|
|
|
2
2
|
import { MenuListState } from './MenuList.types';
|
|
3
3
|
|
|
4
4
|
export const useMenuListContextValue = (state: MenuListState): MenuListContextValue => {
|
|
5
|
-
return { ...state };
|
|
5
|
+
return { hasCheckmarks: state.props.hasCheckmarks, ...state };
|
|
6
6
|
};
|
|
@@ -110,7 +110,7 @@ describe('Checkbox component tests', () => {
|
|
|
110
110
|
it('Menu open checkbox defaultChecked', () => {
|
|
111
111
|
const tree = renderer
|
|
112
112
|
.create(
|
|
113
|
-
<Menu open defaultChecked={
|
|
113
|
+
<Menu open defaultChecked={['Option 1']}>
|
|
114
114
|
<MenuTrigger>
|
|
115
115
|
<Button>Open</Button>
|
|
116
116
|
</MenuTrigger>
|
|
@@ -130,7 +130,7 @@ describe('Checkbox component tests', () => {
|
|
|
130
130
|
it('Menu open checkbox checked', () => {
|
|
131
131
|
const tree = renderer
|
|
132
132
|
.create(
|
|
133
|
-
<Menu open checked={
|
|
133
|
+
<Menu open checked={['Option 1']}>
|
|
134
134
|
<MenuTrigger>
|
|
135
135
|
<Button>Open</Button>
|
|
136
136
|
</MenuTrigger>
|
|
@@ -13,8 +13,8 @@ export interface MenuContextValue extends MenuState {
|
|
|
13
13
|
|
|
14
14
|
export const MenuContext = React.createContext<MenuContextValue>({
|
|
15
15
|
isControlled: false,
|
|
16
|
-
checked:
|
|
17
|
-
defaultChecked:
|
|
16
|
+
checked: [],
|
|
17
|
+
defaultChecked: [],
|
|
18
18
|
hasCheckmarks: false,
|
|
19
19
|
isSubmenu: false,
|
|
20
20
|
open: false,
|
|
@@ -4,14 +4,17 @@ import type { MenuListState } from '../MenuList/MenuList.types';
|
|
|
4
4
|
/**
|
|
5
5
|
* Context shared between Menu and its child components
|
|
6
6
|
*/
|
|
7
|
-
export type MenuListContextValue = MenuListState
|
|
7
|
+
export type MenuListContextValue = Omit<MenuListState, 'props'> & {
|
|
8
|
+
hasCheckmarks: boolean;
|
|
9
|
+
};
|
|
8
10
|
|
|
9
11
|
export const MenuListContext = React.createContext<MenuListContextValue>({
|
|
10
12
|
isCheckedControlled: false,
|
|
11
13
|
checked: {},
|
|
12
|
-
defaultChecked: {},
|
|
13
14
|
hasCheckmarks: false,
|
|
14
15
|
onCheckedChange: () => false,
|
|
16
|
+
addRadioItem: () => false,
|
|
17
|
+
removeRadioItem: () => false,
|
|
15
18
|
});
|
|
16
19
|
|
|
17
20
|
export const MenuListProvider = MenuListContext.Provider;
|