diff options
author | Jason <jason.daurus@gmail.com> | 2016-06-17 21:58:24 +0800 |
---|---|---|
committer | Jason <jason.daurus@gmail.com> | 2016-06-17 21:58:24 +0800 |
commit | c82d27b2a215c075dba71254cafdc86e98e0f2d9 (patch) | |
tree | 84324135951cf67617e4887923bee0627c1d1085 /web/src/js/components/Prompt.jsx | |
parent | 6ad2f13341208b8460eae0dd0105c3109e773bae (diff) | |
parent | 9c6199db9be34fad18eaedb86463333671ae190a (diff) | |
download | mitmproxy-c82d27b2a215c075dba71254cafdc86e98e0f2d9.tar.gz mitmproxy-c82d27b2a215c075dba71254cafdc86e98e0f2d9.tar.bz2 mitmproxy-c82d27b2a215c075dba71254cafdc86e98e0f2d9.zip |
Merge branch 'master' into settings
Conflicts:
mitmproxy/web/static/app.css
mitmproxy/web/static/app.js
web/src/js/components/ProxyApp.jsx
Diffstat (limited to 'web/src/js/components/Prompt.jsx')
-rwxr-xr-x | web/src/js/components/Prompt.jsx | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/web/src/js/components/Prompt.jsx b/web/src/js/components/Prompt.jsx new file mode 100755 index 00000000..6b19b3b3 --- /dev/null +++ b/web/src/js/components/Prompt.jsx @@ -0,0 +1,71 @@ +import React, { PropTypes } from 'react' +import ReactDOM from 'react-dom' +import _ from 'lodash' + +import {Key} from '../utils.js' + +Prompt.contextTypes = { + returnFocus: PropTypes.func +} + +Prompt.propTypes = { + options: PropTypes.array.isRequired, + done: PropTypes.func.isRequired, + prompt: PropTypes.string, +} + +export default function Prompt({ prompt, done, options }, context) { + const opts = [] + + function keyTaken(k) { + return _.map(opts, 'key').includes(k) + } + + for (let i = 0; i < options.length; i++) { + let opt = options[i] + if (_.isString(opt)) { + let str = opt + while (str.length > 0 && keyTaken(str[0])) { + str = str.substr(1) + } + opt = { text: opt, key: str[0] } + } + if (!opt.text || !opt.key || keyTaken(opt.key)) { + throw 'invalid options' + } + opts.push(opt) + } + + return ( + <div tabIndex="0" onKeyDown={onKeyDown} onClick={onClick} className="prompt-dialog"> + <div className="prompt-content"> + {prompt || <strong>Select: </strong> } + {opts.map(opt => { + const idx = opt.text.indexOf(opt.key) + function onClick(event) { + done(opt.key) + event.stopPropagation() + } + return ( + <span key={opt.key} className="option" onClick={onClick}> + {idx !== -1 ? opt.text.substring(0, idx) : opt.text + '('} + {prefix}<strong className="text-primary">{opt.key}</strong> + {idx !== -1 ? opt.text.substring(idx + 1) : ')'} + </span> + ) + })} + </div> + </div> + ) + + function onKeyDown(event) { + event.stopPropagation() + event.preventDefault() + const key = opts.find(opt => Key[opt.key.toUpperCase()] === event.keyCode) + if (!key && event.keyCode !== Key.ESC && event.keyCode !== Key.ENTER) { + return + } + done(k || false) + context.returnFocus() + } +} |