aboutsummaryrefslogtreecommitdiffstats
path: root/packages/website/ts/components/ui/drop_down.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/website/ts/components/ui/drop_down.tsx')
-rw-r--r--packages/website/ts/components/ui/drop_down.tsx139
1 files changed, 0 insertions, 139 deletions
diff --git a/packages/website/ts/components/ui/drop_down.tsx b/packages/website/ts/components/ui/drop_down.tsx
deleted file mode 100644
index 4138b3fe5..000000000
--- a/packages/website/ts/components/ui/drop_down.tsx
+++ /dev/null
@@ -1,139 +0,0 @@
-import * as _ from 'lodash';
-import Popover from 'material-ui/Popover';
-import * as React from 'react';
-import { MaterialUIPosition } from 'ts/types';
-
-const CHECK_CLOSE_POPOVER_INTERVAL_MS = 300;
-const DEFAULT_STYLE = {
- fontSize: 14,
-};
-
-export enum DropdownMouseEvent {
- Hover = 'hover',
- Click = 'click',
-}
-
-export interface DropDownProps {
- activeNode: React.ReactNode;
- popoverContent: React.ReactNode;
- anchorOrigin: MaterialUIPosition;
- targetOrigin: MaterialUIPosition;
- style?: React.CSSProperties;
- zDepth?: number;
- activateEvent?: DropdownMouseEvent;
- closeEvent?: DropdownMouseEvent;
- popoverStyle?: React.CSSProperties;
-}
-
-interface DropDownState {
- isDropDownOpen: boolean;
- anchorEl?: HTMLInputElement;
-}
-
-export class DropDown extends React.Component<DropDownProps, DropDownState> {
- public static defaultProps: Partial<DropDownProps> = {
- style: DEFAULT_STYLE,
- zDepth: 1,
- activateEvent: DropdownMouseEvent.Hover,
- closeEvent: DropdownMouseEvent.Hover,
- popoverStyle: {},
- };
- private _isHovering: boolean;
- private _popoverCloseCheckIntervalId: number;
- constructor(props: DropDownProps) {
- super(props);
- this.state = {
- isDropDownOpen: false,
- };
- }
- public componentDidMount(): void {
- this._popoverCloseCheckIntervalId = window.setInterval(() => {
- this._checkIfShouldClosePopover();
- }, CHECK_CLOSE_POPOVER_INTERVAL_MS);
- }
- public componentWillUnmount(): void {
- window.clearInterval(this._popoverCloseCheckIntervalId);
- }
- public componentWillReceiveProps(_nextProps: DropDownProps): void {
- // HACK: If the popoverContent is updated to a different dimension and the users
- // mouse is no longer above it, the dropdown can enter an inconsistent state where
- // it believes the user is still hovering over it. In order to remedy this, we
- // call hoverOff whenever the dropdown receives updated props. This is a hack
- // because it will effectively close the dropdown on any prop update, barring
- // dropdowns from having dynamic content.
- this._onHoverOff();
- }
- public render(): React.ReactNode {
- return (
- <div
- style={{ ...this.props.style, width: 'fit-content', height: '100%' }}
- onMouseEnter={this._onHover.bind(this)}
- onMouseLeave={this._onHoverOff.bind(this)}
- >
- <div onClick={this._onActiveNodeClick.bind(this)}>{this.props.activeNode}</div>
- <Popover
- open={this.state.isDropDownOpen}
- anchorEl={this.state.anchorEl}
- anchorOrigin={this.props.anchorOrigin}
- targetOrigin={this.props.targetOrigin}
- onRequestClose={
- this.props.closeEvent === DropdownMouseEvent.Click
- ? this._closePopover.bind(this)
- : _.noop.bind(_)
- }
- useLayerForClickAway={this.props.closeEvent === DropdownMouseEvent.Click}
- animated={false}
- zDepth={this.props.zDepth}
- style={this.props.popoverStyle}
- >
- <div
- onMouseEnter={this._onHover.bind(this)}
- onMouseLeave={this._onHoverOff.bind(this)}
- onClick={this._closePopover.bind(this)}
- >
- {this.props.popoverContent}
- </div>
- </Popover>
- </div>
- );
- }
- private _onActiveNodeClick(event: React.FormEvent<HTMLInputElement>): void {
- if (this.props.activateEvent === DropdownMouseEvent.Click) {
- this.setState({
- isDropDownOpen: !this.state.isDropDownOpen,
- anchorEl: event.currentTarget,
- });
- }
- }
- private _onHover(event: React.FormEvent<HTMLInputElement>): void {
- this._isHovering = true;
- if (this.props.activateEvent === DropdownMouseEvent.Hover) {
- this._checkIfShouldOpenPopover(event);
- }
- }
- private _onHoverOff(): void {
- this._isHovering = false;
- }
- private _checkIfShouldOpenPopover(event: React.FormEvent<HTMLInputElement>): void {
- if (this.state.isDropDownOpen) {
- return; // noop
- }
- this.setState({
- isDropDownOpen: true,
- anchorEl: event.currentTarget,
- });
- }
- private _checkIfShouldClosePopover(): void {
- if (!this.state.isDropDownOpen) {
- return; // noop
- }
- if (this.props.closeEvent === DropdownMouseEvent.Hover && !this._isHovering) {
- this._closePopover();
- }
- }
- private _closePopover(): void {
- this.setState({
- isDropDownOpen: false,
- });
- }
-}