aboutsummaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorClemens <cle1000.cb@gmail.com>2016-08-18 16:44:49 +0200
committerClemens <cle1000.cb@gmail.com>2016-08-18 16:44:49 +0200
commita416732665aa7a0fb56e20f9888fd9488750a4df (patch)
tree0e1a3f85022569900ff5a71dead73359a857d34a /web
parent0f4eb24a8dbe552d1b3b61481fea37c52c27da9f (diff)
downloadmitmproxy-a416732665aa7a0fb56e20f9888fd9488750a4df.tar.gz
mitmproxy-a416732665aa7a0fb56e20f9888fd9488750a4df.tar.bz2
mitmproxy-a416732665aa7a0fb56e20f9888fd9488750a4df.zip
refactor dropdown menu, view selector
Diffstat (limited to 'web')
-rw-r--r--web/src/js/components/ContentView/ViewSelector.jsx80
-rw-r--r--web/src/js/components/Header/FileMenu.jsx80
-rw-r--r--web/src/js/components/common/Dropdown.jsx56
-rw-r--r--web/src/js/components/common/FileChooser.jsx2
4 files changed, 103 insertions, 115 deletions
diff --git a/web/src/js/components/ContentView/ViewSelector.jsx b/web/src/js/components/ContentView/ViewSelector.jsx
index f879dbc5..ab433ea3 100644
--- a/web/src/js/components/ContentView/ViewSelector.jsx
+++ b/web/src/js/components/ContentView/ViewSelector.jsx
@@ -1,72 +1,36 @@
import React, { PropTypes, Component } from 'react'
-import classnames from 'classnames'
import { connect } from 'react-redux'
import * as ContentViews from './ContentViews'
-import { setContentView } from "../../ducks/ui/flow";
-
-function ViewItem({ name, setContentView, children }) {
- return (
- <li>
- <a href="#" onClick={e => {e.preventDefault(); setContentView(name)}}>
- {children}
- </a>
- </li>
- )
-}
+import { setContentView } from '../../ducks/ui/flow';
+import Dropdown from '../common/Dropdown'
-/*ViewSelector.propTypes = {
+ViewSelector.propTypes = {
contentViews: PropTypes.array.isRequired,
activeView: PropTypes.string.isRequired,
isEdit: PropTypes.bool.isRequired,
- isContentViewSelectorOpen: PropTypes.bool.isRequired,
- setContentViewSelectorOpen: PropTypes.func.isRequired
-}*/
-
-
-class ViewSelector extends Component {
- constructor(props, context) {
- super(props, context)
- this.close = this.close.bind(this)
- this.state = {open: false}
- }
- close() {
- this.setState({open: false})
- document.removeEventListener('click', this.close)
- }
-
- onDropdown(e){
- e.preventDefault()
- this.setState({open: !this.state.open})
- document.addEventListener('click', this.close)
- }
+ setContentView: PropTypes.func.isRequired
+}
- render() {
- const {contentViews, activeView, isEdit, setContentView} = this.props
- let edit = ContentViews.Edit.displayName
+function ViewSelector ({contentViews, activeView, isEdit, setContentView}){
+ let edit = ContentViews.Edit.displayName
+ let inner = <span> <b>View:</b> {activeView}<span className="caret"></span> </span>
- return (
- <div className={classnames('dropup pull-left', { open: this.state.open })}>
- <a className="btn btn-default btn-xs"
- onClick={ e => this.onDropdown(e) }
- href="#">
- <b>View:</b> {activeView}<span className="caret"></span>
+ return (
+ <Dropdown dropup className="pull-left" btnClass="btn btn-default btn-xs" text={inner}>
+ {contentViews.map(name =>
+ <a href="#" key={name} onClick={e => {e.preventDefault(); setContentView(name)}}>
+ {name.toLowerCase().replace('_', ' ')}
</a>
- <ul className="dropdown-menu" role="menu">
- {contentViews.map(name =>
- <ViewItem key={name} setContentView={setContentView} name={name}>
- {name.toLowerCase().replace('_', ' ')}
- </ViewItem>
- )}
- {isEdit &&
- <ViewItem key={edit} setContentView={setContentView} name={edit}>
- {edit.toLowerCase()}
- </ViewItem>
- }
- </ul>
- </div>
- )
- }
+ )
+ }
+ {isEdit &&
+ <a href="#" onClick={e => {e.preventDefault(); setContentView(edit)}}>
+ {edit.toLowerCase()}
+ </a>
+ }
+ </Dropdown>
+ )
}
export default connect (
diff --git a/web/src/js/components/Header/FileMenu.jsx b/web/src/js/components/Header/FileMenu.jsx
index 392cc163..6053b2d3 100644
--- a/web/src/js/components/Header/FileMenu.jsx
+++ b/web/src/js/components/Header/FileMenu.jsx
@@ -2,6 +2,7 @@ import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import classnames from 'classnames'
import FileChooser from '../common/FileChooser'
+import Dropdown from '../common/Dropdown'
import * as flowsActions from '../../ducks/flows'
@@ -16,44 +17,20 @@ class FileMenu extends Component {
constructor(props, context) {
super(props, context)
- this.state = { show: false }
- this.close = this.close.bind(this)
- this.onFileClick = this.onFileClick.bind(this)
this.onNewClick = this.onNewClick.bind(this)
this.onOpenClick = this.onOpenClick.bind(this)
this.onOpenFile = this.onOpenFile.bind(this)
this.onSaveClick = this.onSaveClick.bind(this)
}
- close() {
- this.setState({ show: false })
- document.removeEventListener('click', this.close)
- }
-
- onFileClick(e) {
- e.preventDefault()
-
- if (this.state.show) {
- return
- }
-
- document.addEventListener('click', this.close)
- this.setState({ show: true })
- }
-
onNewClick(e) {
e.preventDefault()
if (confirm('Delete all flows?')) {
this.props.clearFlows()
}
}
-
- onOpenClick(e) {
- e.preventDefault()
- this.fileInput.click()
- }
-
+
onOpenFile(file) {
this.props.loadFlows(file)
}
@@ -65,37 +42,28 @@ class FileMenu extends Component {
render() {
return (
- <div className={classnames('dropdown pull-left', { open: this.state.show })}>
- <a href="#" className="special" onClick={this.onFileClick}>mitmproxy</a>
- <ul className="dropdown-menu" role="menu">
- <li>
- <a href="#" onClick={this.onNewClick}>
- <i className="fa fa-fw fa-file"></i>
- New
- </a>
- </li>
- <li>
- <FileChooser
- icon="fa-folder-open"
- text="Open..."
- onOpenFile={this.onOpenFile}
- />
- </li>
- <li>
- <a href="#" onClick={this.onSaveClick}>
- <i className="fa fa-fw fa-floppy-o"></i>
- Save...
- </a>
- </li>
- <li role="presentation" className="divider"></li>
- <li>
- <a href="http://mitm.it/" target="_blank">
- <i className="fa fa-fw fa-external-link"></i>
- Install Certificates...
- </a>
- </li>
- </ul>
- </div>
+ <Dropdown className="pull-left" btnClass="special" text="mitmproxy">
+ <a href="#" onClick={this.onNewClick}>
+ <i className="fa fa-fw fa-file"></i>
+ New
+ </a>
+ <FileChooser
+ icon="fa-folder-open"
+ text="Open..."
+ onOpenFile={this.onOpenFile}
+ />
+ <a href="#" onClick={this.onSaveClick}>
+ <i className="fa fa-fw fa-floppy-o"></i>
+ Save...
+ </a>
+
+ <span name="divider"/>
+
+ <a href="http://mitm.it/" target="_blank">
+ <i className="fa fa-fw fa-external-link"></i>
+ Install Certificates...
+ </a>
+ </Dropdown>
)
}
}
diff --git a/web/src/js/components/common/Dropdown.jsx b/web/src/js/components/common/Dropdown.jsx
new file mode 100644
index 00000000..9180767f
--- /dev/null
+++ b/web/src/js/components/common/Dropdown.jsx
@@ -0,0 +1,56 @@
+import React, { Component, PropTypes } from 'react'
+import classnames from 'classnames'
+
+export default class Dropdown extends Component {
+
+ static propTypes = {
+ dropup: PropTypes.bool,
+ className: PropTypes.string,
+ btnClass: PropTypes.string.isRequired
+ }
+
+ static defaultProps = {
+ dropup: false
+ }
+
+ constructor(props, context) {
+ super(props, context)
+ this.state = { open: false }
+ this.close = this.close.bind(this)
+ this.open = this.open.bind(this)
+ }
+
+ close() {
+ this.setState({ open: false })
+ document.removeEventListener('click', this.close)
+ }
+
+ open(e){
+ e.preventDefault()
+ if (this.state.open) {
+ return
+ }
+ this.setState({open: !this.state.open})
+ document.addEventListener('click', this.close)
+ }
+
+ render() {
+ const {dropup, className, btnClass, text, children} = this.props
+ return (
+ <div className={classnames( (dropup ? 'dropup' : 'dropdown'), className, { open: this.state.open })}>
+ <a href='#' className={btnClass}
+ onClick={this.open}>
+ {text}
+ </a>
+ <ul className="dropdown-menu" role="menu">
+ {children.map(item =>
+ item.name == "divider" ?
+ <li role="presentation" className="divider"/>
+ :
+ <li> {item} </li>
+ )}
+ </ul>
+ </div>
+ )
+ }
+}
diff --git a/web/src/js/components/common/FileChooser.jsx b/web/src/js/components/common/FileChooser.jsx
index d8a80ad7..d59d2d6d 100644
--- a/web/src/js/components/common/FileChooser.jsx
+++ b/web/src/js/components/common/FileChooser.jsx
@@ -11,7 +11,7 @@ FileChooser.propTypes = {
export default function FileChooser({ icon, text, className, title, onOpenFile }) {
let fileInput;
return (
- <a onClick={() => fileInput.click()}
+ <a href='#' onClick={() => fileInput.click()}
className={className}
title={title}>
<i className={'fa fa-fw ' + icon}></i>