Skip to content

Commit b01b702

Browse files
Mini app/smarter drop down (#35)
1 parent 5006cfb commit b01b702

7 files changed

Lines changed: 62 additions & 69 deletions

File tree

package-lock.json

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
"build/lib"
2323
],
2424
"dependencies": {
25-
"react": "^16.4.0",
26-
"react-dom": "^16.4.0",
25+
"react": "16.8.5",
26+
"react-dom": "16.8.5",
2727
"url-search-params-polyfill": "^5.1.0"
2828
},
2929
"scripts": {
@@ -36,9 +36,9 @@
3636
},
3737
"devDependencies": {
3838
"@types/jest": "^22.1.0",
39-
"@types/node": "^9.4.0",
40-
"@types/react": "^16.0.35",
41-
"@types/react-dom": "^16.0.3",
39+
"@types/node": "^11.13.0",
40+
"@types/react": "^16.8.10",
41+
"@types/react-dom": "^16.8.3",
4242
"cpx": "^1.5.0",
4343
"jest": "^22.4.3",
4444
"jest-cli": "^24.7.1",

src/components/viewer/toolbar/ToolbarDropDown.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,9 @@
4444

4545
.rcv-toolbar-drop-down-selection-item:hover {
4646
background-color: #eee;
47+
}
48+
49+
.rcv-toolbar-drop-down-selection-placement {
50+
position: fixed;
51+
margin-top: 24px;
4752
}

src/components/viewer/toolbar/ToolbarDropDown.tsx

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import * as React from 'react';
22

3-
import { ToolbarDropDownSelectionPlacement } from './ToolbarDropDownSelectionPlacement';
43
import { ToolbarDropDownSelectionItem } from './ToolbarDropDownSelectionItem';
54

65
import { DropDown } from '../dropdown/DropDown';
@@ -24,6 +23,7 @@ export class ToolbarDropDown extends React.Component<Props, State> {
2423
};
2524

2625
private selectedLabelNode: HTMLElement;
26+
private dropDownNode: HTMLElement;
2727

2828
render() {
2929
const {dropDown} = this.props;
@@ -37,6 +37,14 @@ export class ToolbarDropDown extends React.Component<Props, State> {
3737
);
3838
}
3939

40+
componentDidMount() {
41+
document.addEventListener('mousedown', this.onGlobalClick);
42+
}
43+
44+
componentWillUnmount() {
45+
document.addEventListener('mouseup', this.onGlobalClick);
46+
}
47+
4048
private saveSelectedLabelNode = (node: HTMLDivElement) => {
4149
this.selectedLabelNode = node;
4250
}
@@ -52,15 +60,32 @@ export class ToolbarDropDown extends React.Component<Props, State> {
5260
const {dropDown} = this.props;
5361

5462
return (
55-
<ToolbarDropDownSelectionPlacement parent={this.selectedLabelNode}>
63+
<div
64+
className="rcv-toolbar-drop-down-selection-placement"
65+
style={this.dropDownSelectionStyle()}
66+
ref={this.saveDropDownNode}
67+
>
5668
<div className="rcv-toolbar-drop-down-selection">
5769
{dropDown.items.map(item =>
5870
<ToolbarDropDownSelectionItem key={item.label} item={item} onItemSelect={this.onItemSelect}/>)}
5971
</div>
60-
</ToolbarDropDownSelectionPlacement>
72+
</div>
6173
);
6274
}
6375

76+
private saveDropDownNode = (node: HTMLDivElement) => {
77+
this.dropDownNode = node;
78+
}
79+
80+
private dropDownSelectionStyle = () => {
81+
const pos = this.selectedLabelNode.getBoundingClientRect();
82+
83+
return {
84+
left: pos.left,
85+
top: pos.top
86+
};
87+
}
88+
6489
private onItemSelect = (itemLabel: string) => {
6590
const {dropDown, onItemSelect} = this.props;
6691

@@ -100,4 +125,17 @@ export class ToolbarDropDown extends React.Component<Props, State> {
100125
private toggleSelection = () => {
101126
this.setState(prev => ({selectionVisible: !prev.selectionVisible}));
102127
}
128+
129+
private hideSelection = () => {
130+
this.setState({selectionVisible: false});
131+
}
132+
133+
private onGlobalClick = (e: any) => {
134+
if (this.dropDownNode &&
135+
this.selectedLabelNode &&
136+
!this.dropDownNode.contains(e.target) &&
137+
!this.selectedLabelNode.contains(e.target)) {
138+
this.hideSelection();
139+
}
140+
}
103141
}

src/components/viewer/toolbar/ToolbarDropDownSelectionPlacement.css

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/components/viewer/toolbar/ToolbarDropDownSelectionPlacement.tsx

Lines changed: 0 additions & 46 deletions
This file was deleted.

tslint.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
"static-before-instance",
3030
"variables-before-functions"
3131
],
32-
"no-any": true,
3332
"no-arg": true,
3433
"no-bitwise": true,
3534
"no-console": [

0 commit comments

Comments
 (0)