Skip to content

Commit 8c33fc1

Browse files
committed
refactor toggleSubmenu into click handler
1 parent 1d4416f commit 8c33fc1

File tree

3 files changed

+35
-41
lines changed

3 files changed

+35
-41
lines changed

client/admin/MenuBar.tsx

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ function ExtraMenu(props) {
6161
currentFolderId,
6262
copyInodes,
6363
clearClipboard,
64+
deselectAll,
6465
} = props;
65-
const extraMenuRef = useRef(null);
6666

6767
async function addFolder() {
6868
const folderName = window.prompt(gettext("Enter folder name"));
@@ -88,23 +88,12 @@ function ExtraMenu(props) {
8888
} else {
8989
console.error(response);
9090
}
91-
extraMenuRef.current.toggleSubmenu(false);
92-
}
93-
94-
function uploadLocalFiles(event) {
95-
openUploader(false);
96-
extraMenuRef.current.toggleSubmenu(false);
97-
}
98-
99-
function uploadLocalFolder(event) {
100-
openUploader(true);
101-
extraMenuRef.current.toggleSubmenu(false);
10291
}
10392

10493
function downloadSelectedFiles() {
10594
const current = columnRefs[currentFolderId].current;
10695
downloadFiles(current.inodes.filter(inode => !inode.is_folder && inode.selected));
107-
current.deselectinodes();
96+
deselectAll();
10897
}
10998

11099
return (
@@ -113,15 +102,14 @@ function ExtraMenu(props) {
113102
className="extra-menu"
114103
icon={<MoreVerticalIcon/>}
115104
tooltip={gettext("Extra options")}
116-
ref={extraMenuRef}
117105
>
118106
<li role="option" onClick={addFolder}>
119107
<AddFolderIcon/><span>{gettext("Add new folder")}</span>
120108
</li>
121-
<li role="option" onClick={uploadLocalFiles}>
109+
<li role="option" onClick={() => openUploader(false)}>
122110
<UploadIcon/><span>{gettext("Upload local files")}</span>
123111
</li>
124-
<li role="option" onClick={uploadLocalFolder}>
112+
<li role="option" onClick={() => openUploader(true)}>
125113
<FolderUploadIcon/><span>{gettext("Upload local folder")}</span>
126114
</li>
127115
<li role="option" aria-disabled={numSelectedFiles === 0} onClick={downloadSelectedFiles}>
@@ -395,6 +383,7 @@ const MenuBar = forwardRef((props: any, forwardedRef) => {
395383
numClippedInodes={clipboard.length}
396384
copyInodes={copyInodes}
397385
clearClipboard={clearClipboard}
386+
deselectAll={deselectAll}
398387
{...props}
399388
/>
400389
</>)}

client/common/DropDownMenu.tsx

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,48 @@
1-
import React, {forwardRef, useEffect, useImperativeHandle, useRef} from 'react';
2-
import {types} from "sass";
3-
import Boolean = types.Boolean;
1+
import React, {useEffect, useRef} from 'react';
42

53

6-
const DropDownMenu = forwardRef((props: any, forwardedRef)=> {
4+
export default function DropDownMenu(props){
75
const ref = useRef(null);
86
const Wrapper = props.wrapperElement ?? 'li';
97

108
useEffect(() => {
11-
const closeSubmenu = (event) => {
12-
if (!ref.current?.parentElement?.contains(event.target)) {
13-
ref.current.setAttribute('aria-expanded', 'false');
9+
const handleClick = (event) => {
10+
const current = ref.current as HTMLElement;
11+
let target = event.target;
12+
if (!current.contains(target)) {
13+
current.setAttribute('aria-expanded', 'false');
14+
return;
15+
}
16+
if (current.ariaExpanded === 'false') {
17+
for (let target = event.target; target; target = target.parentElement) {
18+
if (target.role === 'listbox') {
19+
return;
20+
}
21+
}
22+
current.setAttribute('aria-expanded', 'true');
23+
} else {
24+
for (let target = event.target; target; target = target.parentElement) {
25+
if (target.ariaMultiSelectable) {
26+
return;
27+
}
28+
if (target === current) {
29+
current.setAttribute('aria-expanded', 'false');
30+
break;
31+
}
32+
}
1433
}
1534
};
1635
const rootNode = ref.current.getRootNode();
17-
rootNode.addEventListener('click', closeSubmenu);
18-
return () => rootNode.removeEventListener('click', closeSubmenu);
36+
rootNode.addEventListener('click', handleClick);
37+
return () => rootNode.removeEventListener('click', handleClick);
1938
}, []);
2039

21-
useImperativeHandle(forwardedRef, () => ({toggleSubmenu}));
22-
23-
function toggleSubmenu(force?: boolean) {
24-
if (force === undefined) {
25-
ref.current.setAttribute('aria-expanded', ref.current.ariaExpanded === 'true' ? 'false' : 'true');
26-
} else {
27-
ref.current.setAttribute('aria-expanded', (!force).toString());
28-
}
29-
}
30-
3140
return (
3241
<Wrapper
3342
ref={ref}
3443
role={props.role ? `combobox ${props.role}` : 'combobox'}
3544
aria-haspopup="listbox"
3645
aria-expanded="false"
37-
onClick={() => toggleSubmenu()}
3846
className={props.className}
3947
data-tooltip-id="django-finder-tooltip"
4048
data-tooltip-content={props.tooltip}
@@ -45,7 +53,4 @@ const DropDownMenu = forwardRef((props: any, forwardedRef)=> {
4553
</ul>
4654
</Wrapper>
4755
)
48-
});
49-
50-
51-
export default DropDownMenu;
56+
}

client/common/FilterByLabel.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default function FilterByLabel(props: any) {
3131
>
3232
<li role="option"><span onClick={() => changeFilter(null)}>{gettext("Clear all")}</span></li>
3333
<hr/>{labels.map((label, index) => (
34-
<li key={label.value} role="option">
34+
<li key={label.value} role="option" aria-multiselectable={true}>
3535
<label htmlFor={`filter-${label.value}`}>
3636
<input
3737
type="checkbox"

0 commit comments

Comments
 (0)