anyproxy/web/build/index.js
2015-08-12 19:26:29 +08:00

273 lines
6.3 KiB
JavaScript

window.$ = window.jQuery = require("../lib/jquery");
var EventManager = require('../lib/event'),
Anyproxy_wsUtil = require("../lib/anyproxy_wsUtil"),
React = require("../lib/react");
var WsIndicator = require("./wsIndicator").init(React),
RecordPanel = require("./recordPanel").init(React),
Popup = require("./popup").init(React);
var PopupContent = {
map : require("./mapPanel").init(React),
detail : require("./detailPanel").init(React),
filter : require("./filter").init(React)
};
var ifPause = false,
recordSet = [];
//Event : wsGetUpdate
//Event : recordSetUpdated
//Event : wsOpen
//Event : wsEnd
var eventCenter = new EventManager();
//merge : right --> left
function util_merge(left,right){
for(var key in right){
left[key] = right[key];
}
return left;
}
//invoke AnyProxy web socket util
(function(){
try{
var ws = window.ws = new Anyproxy_wsUtil({
baseUrl : document.getElementById("baseUrl").value,
port : document.getElementById("socketPort").value,
onOpen : function(){
eventCenter.dispatchEvent("wsOpen");
},
onGetUpdate : function(record){
eventCenter.dispatchEvent("wsGetUpdate",record);
},
onError : function(e){
eventCenter.dispatchEvent("wsEnd");
},
onClose : function(e){
eventCenter.dispatchEvent("wsEnd");
}
});
window.ws = ws;
}catch(e){
alert("failed to invoking web socket on this browser");
}
})();
//websocket status indicator
(function(){
var wsIndicator = React.render(
React.createElement(WsIndicator, null),
document.getElementById("J_indicatorEl")
);
eventCenter.addListener("wsOpen",function(){
wsIndicator.setState({
isValid : true
});
});
eventCenter.addListener("wsEnd",function(){
wsIndicator.setState({
isValid : false
});
});
})();
//init popup
var showPop;
(function(){
$("body").append('<div id="J_popOuter"></div>');
var pop = React.render(
React.createElement(Popup, null),
document.getElementById("J_popOuter")
);
showPop = function(popArg){
var stateArg = util_merge({show : true },popArg);
pop.setState(stateArg);
};
})();
//init record panel
var recorder;
(function(){
function updateRecordSet(newRecord){
if(ifPause) return;
if(newRecord && newRecord.id){
if(!recordSet[newRecord.id]){
recordSet[newRecord.id] = newRecord;
}else{
util_merge(recordSet[newRecord.id],newRecord);
}
recordSet[newRecord.id]._justUpdated = true;
// React.addons.Perf.start();
eventCenter.dispatchEvent("recordSetUpdated");
// React.addons.Perf.stop();
}
}
function initRecordSet(){
$.getJSON("/lastestLog",function(res){
if(typeof res == "object"){
res.map(function(item){
if(item.id){
recordSet[item.id] = item;
}
});
eventCenter.dispatchEvent("recordSetUpdated");
}
});
}
eventCenter.addListener("wsGetUpdate",updateRecordSet);
eventCenter.addListener('recordSetUpdated',function(){
recorder.setState({
list : recordSet
});
});
eventCenter.addListener("filterUpdated",function(newKeyword){
recorder.setState({
filter: newKeyword
});
});
function showDetail(data){
showPop({left:"35%",content:React.createElement(PopupContent["detail"], {data:data})});
}
//init recorder panel
recorder = React.render(
React.createElement(RecordPanel, {onSelect: showDetail}),
document.getElementById("J_content")
);
initRecordSet();
})();
//action bar
(function(){
//clear log
function clearLogs(){
recordSet = [];
eventCenter.dispatchEvent("recordSetUpdated");
}
$(document).on("keyup",function(e){
if(e.keyCode == 88 && e.ctrlKey){ // ctrl + x
clearLogs();
}
});
var clearLogBtn = $(".J_clearBtn");
clearLogBtn.on("click",function(e){
e.stopPropagation();
e.preventDefault();
clearLogs();
});
//start , pause
var statusBtn = $(".J_statusBtn");
statusBtn.on("click",function(e){
e.stopPropagation();
e.preventDefault();
$(".J_statusBtn").removeClass("btn_disable");
$(this).addClass("btn_disable");
if(/stop/i.test($(this).html()) ){
ifPause = true;
}else{
ifPause = false;
}
});
//preset button
(function (){
var TopBtn = React.createClass({displayName: "TopBtn",
getInitialState: function(){
return {
inUse : false
};
},
render: function(){
var self = this,
iconClass = self.state.inUse ? "uk-icon-check" : self.props.icon,
btnClass = self.state.inUse ? "topBtn topBtnInUse" : "topBtn";
return React.createElement("a", {href: "#"}, React.createElement("span", {className: btnClass, onClick: self.props.onClick}, React.createElement("i", {className: iconClass}), self.props.title))
}
});
// filter
var filterBtn,
FilterPanel = PopupContent["filter"],
filterPanelEl;
filterBtn = React.render(React.createElement(TopBtn, {icon: "uk-icon-filter", title: "Filter", onClick: filterBtnClick}), document.getElementById("J_filterBtnContainer"));
filterPanelEl = (React.createElement(FilterPanel, {onChangeKeyword: updateKeyword}) );
function updateKeyword(key){
eventCenter.dispatchEvent("filterUpdated",key);
filterBtn.setState({inUse : !!key});
}
function filterBtnClick(){
showPop({ left:"60%", content:filterPanelEl });
}
// map local
var mapBtn,
mapPanelEl;
function onChangeMapConfig(cfg){
mapBtn.setState({inUse : cfg && cfg.length});
}
function mapBtnClick(){
showPop({left:"60%", content:mapPanelEl });
}
//detect whether to show the map btn
require("./mapPanel").fetchConfig(function(initConfig){
var MapPanel = PopupContent["map"];
mapBtn = React.render(React.createElement(TopBtn, {icon: "uk-icon-shield", title: "Map Local", onClick: mapBtnClick}),document.getElementById("J_filterContainer"));
mapPanelEl = (React.createElement(MapPanel, {onChange: onChangeMapConfig}));
onChangeMapConfig(initConfig);
});
var t = true;
setInterval(function(){
t = !t;
// mapBtn && mapBtn.setState({inUse : t})
},300);
})();
//other button
(function(){
$(".J_customButton").on("click",function(){
var thisEl = $(this),
iframeUrl = thisEl.attr("iframeUrl");
if(!iframeUrl){
throw new Error("cannot find the url assigned for this button");
}
var iframeEl = React.createElement("iframe",{src:iframeUrl,frameBorder:0});
showPop({left:"35%", content: iframeEl });
});
})();
})();