Browse Source

设计搜索功能

huqi 5 years ago
parent
commit
4f3a5aefb9

BIN
o2web/source/x_component_FindDesigner/$Main/default/icons/loading.gif


BIN
o2web/source/x_component_FindDesigner/$Main/default/icons/stop.png


BIN
o2web/source/x_component_FindDesigner/$Main/default/icons/stop_gray.png


+ 54 - 2
o2web/source/x_component_FindDesigner/$Main/default/style.css

@@ -13,12 +13,12 @@
     line-height: 30px;
     padding: 2px 0;
     background-color: #ffffff;
+    border-bottom: 1px solid #cccccc;
 }
 .rangeNode {
     height: 40px;
     padding: 0;
     line-height: 20px;
-    border-top: 1px solid #cccccc;
     border-bottom: 1px solid #cccccc;
     background-color: #f0f0f0;
 }
@@ -27,7 +27,6 @@
 }
 .listNode {
     background-color: #ffffff;
-    overflow: auto;
 }
 .previewNode {
     background-color: #f0f0f0;
@@ -230,6 +229,22 @@
     background-color: #f0f0f0;
     border-bottom: 1px solid #cccccc;
 }
+.listNode_title {
+    height: 27px;
+    padding-top: 3px;
+    background-color: #f0f0f0;
+    border-bottom: 1px solid #cccccc;
+}
+.listNode_title_lr {
+    height: 27px;
+    padding-top: 3px;
+    background-color: #f0f0f0;
+    border-bottom: 1px solid #cccccc;
+}
+.listNode_area {
+    overflow: auto;
+}
+
 
 .previewNode_content {
     background-color: #ffffff;
@@ -281,3 +296,40 @@
     color: #bbbbbb;
     text-align: center;
 }
+.listContentNode {
+    overflow: hidden;
+}
+.loadding {
+    background-repeat: no-repeat;
+    background-position: center;
+    background-image: url("../x_component_FindDesigner/$Main/default/icons/loading.gif");
+}
+
+.listNode_title_info {
+    margin-left: 10px;
+    margin-right: 40px;
+    font-size: 12px;
+    color: #888888;
+    height: 24px;
+    line-height: 24px;
+}
+.listNode_title_progress {
+    height: 3px;
+}
+.listNode_title_progress_node {
+    height: 3px;
+    background-color: #0b58a2;
+    width: 0%;
+}
+.listNode_title_action {
+    float: right;
+    height: 24px;
+    width: 40px;
+    background-position: center;
+    background-repeat: no-repeat;
+    background-image: url("../x_component_FindDesigner/$Main/default/icons/stop_gray.png");
+    cursor: pointer;
+}
+.listNode_title_action_enabled {
+    background-image: url("../x_component_FindDesigner/$Main/default/icons/stop.png");
+}

+ 19 - 3
o2web/source/x_component_FindDesigner/$Main/default/view.html

@@ -12,6 +12,7 @@
             <div class="filterNode_item"><input checked type="checkbox" value="stat" />{{$.lp.stat}}(stat)</div>
         </div>
     </div>
+
     <div class="keywordNode" data-o2-element="keywordNode">
         <div class="keywordNode_optionArea" data-o2-events="mouseover:overKeywordOption;mouseout:outKeywordOption">
             <div class="keywordNode_optionItem caseSensitiveNode_false" data-o2-element="caseSensitiveNode" data-o2-events="click:setCaseSensitive" title="区分大小写"></div>
@@ -22,11 +23,12 @@
             <div class="keywordNode_icon"></div>
             <div class="keywordNode_action"></div>
             <div class="keywordNode_area">
-                <input class="keywordNode_input" data-o2-element="keywordInputNode" type="text" placeholder="{{$.lp.search_placeholder}}"/>
+                <input class="keywordNode_input" data-o2-element="keywordInputNode" data-o2-events="keydown:checkFindDesigner" type="text" placeholder="{{$.lp.search_placeholder}}"/>
             </div>
 
         </div>
     </div>
+
     <div class="rangeNode" data-o2-element="rangeNode">
         <div class="rangeNode_title">{{$.lp.range}}</div>
         <div class="rangeNode_content" data-o2-element="rangeContentNode">
@@ -42,15 +44,29 @@
         <div class="rangeNode_select">
             <div class="rangeNode_select_area">
                 <div class="rangeNode_select_action_area">
-                    <div class="rangeNode_select_action" data-o2-events="click:selectFindRange">{{$.lp.selectRange}}</div>
+                    <div class="rangeNode_select_action" data-o2-element="rangeSelectedActionNode" data-o2-events="click:selectFindRange">{{$.lp.selectRange}}</div>
                 </div>
                 <div class="rangeNode_select_content" data-o2-element="rangeSelectedContentNode"></div>
             </div>
         </div>
     </div>
+
     <div class="resultNode" data-o2-element="resultNode">
         <div class="listNode_lr" data-o2-element="listNode">
-            <div class="inforNode"><div>{{$.lp.nothingFind}}</div></div>
+            <div class="listNode_title_lr" data-o2-element="listTitleNode">
+                <div class="listNode_title_action"></div>
+                <div class="listNode_title_info" data-o2-element="listTitleInfoNode"></div>
+                <div class="listNode_title_progress">
+                    <div class="listNode_title_progress_node" data-o2-element="listTitleProgressNode"></div>
+                </div>
+            </div>
+
+            <div class="listNode_area" data-o2-element="listAreaNode">
+                <div class="inforNode" data-o2-element="listInfoNode"><div>{{$.lp.nothingFind_keyword}}</div></div>
+                <div class="listContentNode" data-o2-element="listContentNode"></div>
+            </div>
+
+
         </div>
         <div class="previewNode_lr" data-o2-element="previewNode">
             <div class="previewNode_separator_lr" data-o2-element="previewSeparatorNode"></div>

+ 347 - 0
o2web/source/x_component_FindDesigner/FindWorker.js

@@ -0,0 +1,347 @@
+var _worker = self;
+var _action = {
+    _checkRequest: function(s,f){
+        if (this.request.readyState === XMLHttpRequest.DONE) {
+            if (this.request.status === 200) {
+                this._doneRequest(s);
+            } else {
+                this._errorRequest(f);
+            }
+        }
+    },
+    _createRequest: function(s, f){
+        var request = new XMLHttpRequest();
+        request.addEventListener("readystatechange",function(){
+            if (this.readyState === XMLHttpRequest.DONE) {
+                if (this.status === 200) {
+                    var json = JSON.parse(this.responseText);
+                    var xToken = this.getResponseHeader("x-token");
+                    if (xToken){
+                        json.xToken = xToken;
+                    }
+                    if (s) s(json);
+                } else {
+                    if (f) f(this, this.responseText);
+                }
+            }
+        });
+        return request
+    },
+    sendRequest: function(data){
+        return new Promise(function(s, f){
+            var request = this._createRequest(s, f);
+            var method = data.method;
+            var noCache = !!data.noCache;
+            var async = !!data.loadAsync;
+            var withCredentials = !!data.credentials;
+            var url = data.address;
+            var body = data.body;
+            var debug = data.debug;
+            var token = data.token;
+
+            if (noCache) url = url+(((url.indexOf("?")!==-1) ? "&" : "?")+(new Date()).getTime());
+
+            request.open(method, url, async);
+
+            request.withCredentials = withCredentials;
+            request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
+            request.setRequestHeader("Accept", "text/html,application/json,*/*");
+            if (debug) request.setRequestHeader("x-debugger", "true");
+            if (token){
+                request.setRequestHeader("x-token", token);
+                request.setRequestHeader("authorization", token);
+            }
+
+            request.send(body);
+        }.bind(this));
+    },
+
+    _doneRequest: function(s){
+        var json = JSON.parse(this.request.responseText);
+        var xToken = this.request.getResponseHeader("x-token");
+        if (xToken){
+            json.xToken = xToken;
+        }
+        if (s) s(json);
+        // _worker.postMessage({"type": "done", "data": json});
+        // _worker.close();
+    },
+    _errorRequest: function(f){
+        if (s) s(this.request, this.request.responseText);
+        // _worker.postMessage({"type":"error", "data": {"status":  this.request.status, "statusText":  this.request.statusText, "responseText":this.request.responseText}});
+        // _worker.close();
+    }
+};
+
+_worker.action = _action;
+
+_worker._receiveMessageReply = function(){
+    _worker.postMessage({
+        "type": "receive",
+    });
+};
+_worker._readyMessageReply = function(){
+    _worker.postMessage({
+        "type": "ready",
+        "count": this.filterOptionList.length
+    });
+};
+
+_worker._getRequestOption = function(data, par){
+    if (par){
+        Object.keys(par).forEach(function(k){
+            data.url = data.url.replace("{"+k+"}", par[k]);
+        });
+    }
+    return {
+        "method": data.method||"get",
+        "noCache": false,
+        "loadAsync": true,
+        "credentials": true,
+        "address": data.url,
+        "body": data.body || "",
+        "debug": data.debug,
+        "token": data.token
+    };
+};
+
+_worker._createFilterOption = function(moduleType, appId, desingerType, desingerId){
+    var filterOption = JSON.parse(_worker.filterOptionTemplete);
+    filterOption.moduleList.push({
+        "moduleType": moduleType,
+        "flagList": [{"id": appId, "designerList": [{"desingerType": desingerType, "id": desingerId}]}]
+    });
+    this.filterOptionList.push(filterOption);
+    return filterOption;
+};
+_worker._getDesingerModule = function(id, restful, par, moduleType, desingerType){
+    var p = _worker.action.sendRequest(_worker._getRequestOption({"url": restful, "debug": _worker.findData.debug, "token": _worker.findData.token }, par));
+    return p.then(function(json){
+        list = json.data;
+        list.forEach(function(designer){
+            _worker._createFilterOption(moduleType, id, desingerType, designer.id)
+        });
+    }, function(){});
+};
+
+_worker._getDesinger_processPlatform = function(id){
+    var promiseArr = [];
+    if (_worker.findData.filterOption.designerTypes.indexOf("script")!=-1){    //所有脚本
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listProcessScript, {"applicationId": id}, "processPlatform", "script"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("form")!=-1){      //所有表单
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listProcessForm, {"applicationId": id}, "processPlatform", "form"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("process")!=-1){   //所有流程
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listProcessProcess, {"applicationId": id}, "processPlatform", "process"));
+    }
+    return promiseArr;
+};
+
+_worker._getDesinger_cms = function(id){
+    var promiseArr = [];
+    if (_worker.findData.filterOption.designerTypes.indexOf("script")!=-1){    //所有脚本
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listCmsScript, {"flag": id}, "cms", "script"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("form")!=-1){      //所有表单
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listCmsForm, {"appId": id}, "cms", "form"));
+    }
+    return promiseArr;
+};
+
+_worker._getDesinger_portal = function(id){
+    var promiseArr = [];
+    if (_worker.findData.filterOption.designerTypes.indexOf("script")!=-1){    //所有脚本
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listPortalScript, {"portalId": id}, "portal", "script"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("page")!=-1){      //所有表单
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listPortalPage, {"portalId": id}, "portal", "page"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("widget")!=-1){   //所有流程
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listPortalWidget, {"portalId": id}, "portal", "widget"));
+    }
+    return promiseArr;
+};
+
+_worker._getDesinger_query = function(id){
+    var promiseArr = [];
+    if (_worker.findData.filterOption.designerTypes.indexOf("view")!=-1){    //所有脚本
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listQueryView, {"flag": id}, "query", "view"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("stat")!=-1){      //所有表单
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listQueryStat, {"flag": id}, "query", "stat"));
+    }
+    if (_worker.findData.filterOption.designerTypes.indexOf("statement")!=-1){   //所有流程
+        promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listQueryStatement, {"flag": id}, "query", "statement"));
+    }
+    return promiseArr;
+};
+
+_worker._getDesinger_service = function(id){
+    var promiseArr = [];
+    if (_worker.findData.filterOption.designerTypes.indexOf("script")!=-1){    //所有脚本
+        if (id=="invoke"){
+            promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listInvoke, null, "service", "script"));
+        }else{
+            promiseArr.push(_worker._getDesingerModule(id, _worker.findData.actions.listAgent, null, "service", "script"));
+        }
+    }
+    return promiseArr;
+};
+
+
+_worker._listApplication = function(type){
+    switch (type){
+        case "processPlatform":
+            return this.action.sendRequest(_worker._getRequestOption({"url": this.findData.actions.listProcess, "debug": this.findData.debug, "token": this.findData.token }));
+        case "cms":
+            return this.action.sendRequest(_worker._getRequestOption({"url": this.findData.actions.listCms, "debug": this.findData.debug, "token": this.findData.token }));
+        case "portal":
+            return this.action.sendRequest(_worker._getRequestOption({"url": this.findData.actions.listPortal, "debug": this.findData.debug, "token": this.findData.token }));
+        case "query":
+            return this.action.sendRequest(_worker._getRequestOption({"url": this.findData.actions.listQuery, "debug": this.findData.debug, "token": this.findData.token }));
+    }
+
+};
+_worker._parseFindModule = function(moduleList){
+    var promiseArr = [];
+    moduleList.forEach(function(module){
+        if (module.moduleType==="service"){
+            if (!module.flagList || !module.flagList.length){
+
+                var filterOption = JSON.parse(_worker.filterOptionTemplete);
+                filterOption.moduleList.push({
+                    "moduleType": module.moduleType,
+                    "flagList": ["invoke"]
+                });
+                this.filterOptionList.push(filterOption);
+
+                var filterOption = JSON.parse(_worker.filterOptionTemplete);
+                filterOption.moduleList.push({
+                    "moduleType": module.moduleType,
+                    "flagList": ["agent"]
+                });
+                this.filterOptionList.push(filterOption);
+
+                promiseArr.push(Promise.resolve(""));
+                // promiseArr = promiseArr.concat(_worker["_getDesinger_"+module.moduleType]("invoke"));
+                // promiseArr = promiseArr.concat(_worker["_getDesinger_"+module.moduleType]("agent"));
+            }else{
+                module.flagList.forEach(function(flag){
+                    if (!flag.designerList || !flag.designerList.length){
+                        promiseArr = promiseArr.concat(_worker["_getDesinger_"+module.moduleType](flag.id));
+                    }else{
+                        flag.designerList.forEach(function(designer){
+                            var filterOption = _worker._createFilterOption(module.moduleType, flag.id, designer.desingerType, designer.id)
+                            promiseArr = promiseArr.concat(Promise.resolve(filterOption));
+                        });
+                    }
+                });
+            }
+        }else{
+            if (!module.flagList || !module.flagList.length){
+                var p = _worker._listApplication(module.moduleType);
+                promiseArr.push(p.then(function(json){
+
+                    json.data.forEach(function(app){
+                        var filterOption = JSON.parse(_worker.filterOptionTemplete);
+                        filterOption.moduleList.push({
+                            "moduleType": module.moduleType,
+                            "flagList": [app.id]
+                        });
+                        this.filterOptionList.push(filterOption);
+                    });
+                    return Promise.resolve("");
+                    //临时处理
+
+
+                    // var pArr = [];
+                    // json.data.forEach(function(app){
+                    //     pArr = pArr.concat(_worker["_getDesinger_"+module.moduleType](app.id));
+                    // });
+                    // return Promise.all(pArr);
+                }, function(){}));
+
+            }else{
+                module.flagList.forEach(function(flag){
+                    if (!flag.designerList || !flag.designerList.length){
+                        promiseArr = promiseArr.concat(_worker["_getDesinger_"+module.moduleType](flag.id));
+                    }else{
+                        flag.designerList.forEach(function(designer){
+                            var filterOption = _worker._createFilterOption(module.moduleType, flag.id, designer.desingerType, designer.id)
+                            promiseArr = promiseArr.concat(Promise.resolve(filterOption));
+                        });
+                    }
+                });
+            }
+        }
+    }.bind(this));
+    return promiseArr;
+}
+
+_worker._findMessageReply = function(data){
+    _worker.postMessage({
+        "type": "find",
+        "data": data
+    });
+};
+_worker._doFindDesigner = function(option){
+    var res = _worker._getRequestOption({
+        "method": "post",
+        "url": this.findData.actions.findAction,
+        "body": JSON.stringify(option),
+        "debug": this.findData.debug,
+        "token": this.findData.token
+    });
+    this.action.sendRequest(res).then(function(json){
+        json.data.processPlatformList
+
+        _worker._findMessageReply({"option": option, "data": json.data});
+    }, function(xhr){
+        _worker._findMessageReply({"option": option, "data": null});
+    });
+},
+
+_worker._doFindDesignerFromFilterOption = function(){
+    this.filterOptionList.forEach(function(option){
+        _worker._doFindDesigner(option);
+    });
+},
+onmessage = function(e) {
+    this.findData = e.data;
+    var moduleList = this.findData.filterOption.moduleList;
+    this.findData.filterOption.moduleList = [];
+
+    this.filterOptionTemplete = JSON.stringify(this.findData.filterOption);
+    this.filterOptionList = [];
+
+    Promise.all(_worker._parseFindModule(moduleList)).then(function(){
+        _worker._readyMessageReply();
+        _worker._doFindDesignerFromFilterOption();
+    });
+
+    //"moduleType": "cms", "flagList": [];
+    // designerTypes
+    // flagList = [{
+    //     "id": "dddd",
+    //     "desingerList": [
+    //         {
+    //             "desingerType": "脚本(script)表单(form)流程(process)页面(page)部件(widget)视图(view)脚本(statement)统计(stat",
+    //             "id": ""
+    //         },
+    //         {
+    //             "desingerType": "脚本(script)表单(form)流程(process)页面(page)部件(widget)视图(view)脚本(statement)统计(stat",
+    //             "id": ""
+    //         }
+    //     ]
+    // }]
+
+
+
+
+    _worker._receiveMessageReply();
+
+
+
+    //_worker.action.sendRequest(e.data);
+}

+ 361 - 3
o2web/source/x_component_FindDesigner/Main.js

@@ -80,6 +80,10 @@ MWF.xApplication.FindDesigner.Main = new Class({
 		var previewHeight = h*(1-this.options.layout.percent);
 		this.previewNode.setStyle("height", ""+previewHeight+"px");
 
+		var listTitleSize = this.listTitleNode.getSize();
+		var listContentHeight = listHeight - listTitleSize.y;
+		this.listAreaNode.setStyle("height", ""+listContentHeight+"px");
+
 		var previewSeparatorSize = this.previewSeparatorNode.getSize();
 		var previewTitleSize = this.previewTitleNode.getSize();
 		var previewContentHeight = previewHeight - previewSeparatorSize.y - previewTitleSize.y;
@@ -93,7 +97,10 @@ MWF.xApplication.FindDesigner.Main = new Class({
 		this.listNode.setStyle("width", ""+listWidth+"px");
 		this.previewNode.setStyle("margin-left", ""+listWidth+"px");
 
-		//var previewSeparatorSize = this.previewSeparatorNode.getSize();
+		var listTitleSize = this.listTitleNode.getSize();
+		var listContentHeight = h - listTitleSize.y;
+		this.listAreaNode.setStyle("height", ""+listContentHeight+"px");
+
 		var previewTitleSize = this.previewTitleNode.getSize();
 		var previewContentHeight = h - previewTitleSize.y;
 		this.previewContentNode.setStyle("height", ""+previewContentHeight+"px");
@@ -246,12 +253,15 @@ MWF.xApplication.FindDesigner.Main = new Class({
 		var itemNodes = this.rangeSelectedContentNode.getChildren();
 		if (!itemNodes.length) this.setSelectedRange();
 	},
-	selectFindRange: function(){
+	selectFindRange: function(loadFun){
 		o2.requireApp("Selector", "package", function(){
 			new o2.O2Selector(this.content, {
 				"values": this.selectedModules,
 				"type": "PlatApp",
 				"selectAllEnable": true,
+				"onLoad": function(){
+					if (loadFun && o2.typeOf(loadFun)=="function") loadFun();
+				},
 				"onComplete": function(list){
 					this.rangeSelectedContentNode.empty();
 					//this.selectedModules = [];
@@ -297,7 +307,7 @@ MWF.xApplication.FindDesigner.Main = new Class({
 			itemNodes.each(function(node){
 				var data = node.retrieve("data");
 				if (!rangeApp[data.moduleType]) rangeApp[data.moduleType] = [];
-				rangeApp[data.moduleType].push(data.id);
+				rangeApp[data.moduleType].push({"id": data.id});
 			}.bind(this));
 
 			Object.keys(rangeApp).each(function(k){
@@ -310,5 +320,353 @@ MWF.xApplication.FindDesigner.Main = new Class({
 		this.filterOption.moduleList = moduleList;
 
 		return this.filterOption;
+	},
+
+	checkFindDesigner: function(e){
+		if (e.keyCode===13){
+			this.getFindOption();
+
+			if (!this.filterOption.keyword){
+				this.listInfoNode.show().removeClass("loadding").getFirst().set("text", this.lp.nothingFind_keyword);
+				return false;
+			}
+			if (!this.filterOption.designerTypes.length){
+				this.listInfoNode.show().removeClass("loadding").getFirst().set("text", this.lp.nothingFind_noFilter);
+				return false;
+			}
+			if (!this.filterOption.moduleList.length){
+				this.listInfoNode.show().removeClass("loadding").getFirst().set("text", this.lp.nothingFind_noRange);
+				return false;
+			}
+
+			this.findDesigner();
+		}
+	},
+
+	getFindWorker: function(){
+		if (!this.findWorker) this.findWorker = new Worker("../x_component_FindDesigner/FindWorker.js");
+		this.findWorker.onmessage = function(e) {
+			if (e.data && e.data.type=="receive") this.setReceiveMessage();
+			if (e.data && e.data.type=="ready") this.setReadyMessage(e.data);
+			if (e.data && e.data.type=="find") this.doFindResult(e.data);
+		}.bind(this);
+	},
+	doFindResult: function(){
+		this.findOptionModuleProcessed++;
+		this.updateFindProgress();
+	},
+	setReceiveMessage: function(){
+		this.listTitleInfoNode.set("text", this.lp.receiveToFind);
+	},
+	setReadyMessage: function(data){
+		this.findOptionModuleCount = data.count;
+		this.findOptionModuleProcessed = 0;
+		this.updateFindProgress();
+		this.listTitleInfoNode.set("text", this.lp.readyToFind.replace("{n}", data.count));
+	},
+	updateFindProgress: function(){
+		var percent = (this.findOptionModuleProcessed/this.findOptionModuleCount)*100;
+		this.listTitleProgressNode.setStyle("width", ""+percent+"%");
+	},
+
+	getActionsUrl:function(){
+		var processHost = o2.Actions.getHost("x_processplatform_assemble_designer");
+		var cmsHost = o2.Actions.getHost("x_cms_assemble_control");
+		var portalHost = o2.Actions.getHost("x_portal_assemble_designer");
+		var queryHost = o2.Actions.getHost("x_query_assemble_designer");
+		var serviceHost = o2.Actions.getHost("x_program_center");
+		var findHost = o2.Actions.getHost("x_query_service_processing");
+
+		var actions = {
+			"listProcess": o2.filterUrl(processHost+"/x_processplatform_assemble_designer/jaxrs/application/list"),
+			"listProcessProcess": o2.filterUrl(processHost+"/x_processplatform_assemble_designer/jaxrs/process/application/{applicationId}"),
+			"listProcessForm": o2.filterUrl(processHost+"/x_processplatform_assemble_designer/jaxrs/form/list/application/{applicationId}"),
+			"listProcessScript": o2.filterUrl(processHost+"/x_processplatform_assemble_designer/jaxrs/script/application/{applicationId}"),
+
+			"listCms": o2.filterUrl(cmsHost+"/x_cms_assemble_control/jaxrs/appinfo/list/manage"),
+			"listCmsForm": o2.filterUrl(cmsHost+"/x_cms_assemble_control/jaxrs/form/list/app/{appId}"),
+			"listCmsScript": o2.filterUrl(cmsHost+"/x_cms_assemble_control/jaxrs/script/list/app/{flag}"),
+
+			"listPortal": o2.filterUrl(portalHost+"/x_portal_assemble_designer/jaxrs/portal/list"),
+			"listPortalPage": o2.filterUrl(portalHost+"/x_portal_assemble_designer/jaxrs/page/list/portal/{portalId}"),
+			"listPortalScript": o2.filterUrl(portalHost+"/x_portal_assemble_designer/jaxrs/script/list/portal/{portalId}"),
+			"listPortalWidget": o2.filterUrl(portalHost+"/x_portal_assemble_designer/jaxrs/widget/list/portal/{portalId}"),
+
+			"listQuery": o2.filterUrl(queryHost+"/x_query_assemble_designer/jaxrs/query/list/summary"),
+			"listQueryView": o2.filterUrl(portalHost+"/x_query_assemble_designer/jaxrs/view/list/query/{flag}"),
+			"listQueryStat": o2.filterUrl(portalHost+"/x_query_assemble_designer/jaxrs/stat/list/query/{flag}"),
+			"listQueryStatement": o2.filterUrl(portalHost+"/x_query_assemble_designer/jaxrs/statement/list/query/{flag}"),
+
+			"listInvoke": o2.filterUrl(serviceHost+"/x_program_center/jaxrs/invoke"),
+			"listAgent": o2.filterUrl(serviceHost+"/x_program_center/jaxrs/agent"),
+
+			"findAction": o2.filterUrl(findHost+"/x_query_service_processing/jaxrs/design/search")
+		}
+		return actions;
+	},
+
+	findDesigner: function(){
+		this.getFindWorker();
+		var actions = this.getActionsUrl();
+
+		var workerMessage = {
+			actions:actions,
+			filterOption: this.filterOption,
+			debug: (window.layout && layout["debugger"]),
+			token: (window.layout && layout.session && layout.session.user) ? layout.session.user.token : ""
+		}
+		this.findWorker.postMessage(workerMessage);
+	},
+
+	//------------------------------------------------------------
+
+	findDesigner_bak: function(){
+		this.listContentNode.hide();
+		this.listInfoNode.show().getFirst().set("text", "");
+		this.listInfoNode.addClass("loadding")
+		o2.Actions.load("x_query_service_processing").DesignAction.search(this.filterOption, function(json){
+			if ((json.data.processPlatformList && json.data.processPlatformList.length) ||
+				(json.data.cmsList && json.data.cmsList.length) ||
+				(json.data.portalList && json.data.portalList.length) ||
+				(json.data.queryList && json.data.queryList.length) ||
+				(json.data.serviceList && json.data.serviceList.length)){
+
+				this.listInfoNode.hide();
+				this.listFindResult(json.data);
+
+			}else{
+				this.listInfoNode.show().removeClass("loadding").getFirst().set("text", this.lp.nothingFind);
+			}
+		}.bind(this));
+	},
+
+	createResultCategroyItem: function(text, title, tree){
+		var obj = {
+			"title": title,
+			"text": "<span style='font-weight: bold'>"+text+"</span>",
+			"icon": ""
+		}
+		return tree.appendChild(obj);
+	},
+	createResultAppItem: function(text, title, tree){
+		var obj = {
+			"title": title,
+			"text": "<span style='font-weight: bold; color: #4A90E2'>"+text+"</span>",
+			"icon": ""
+		}
+		return tree.appendChild(obj);
+	},
+	createResultDesignerItem: function(designer, tree){
+		var title = this.lp[designer.designerType]+ ": "+ designer.designerName + " ("+designer.designerId+")";
+		var text = this.lp[designer.designerType]+ ": <b>"+ designer.designerName+"</b>";
+		var obj = {
+			"expand": false,
+			"title": title,
+			"text": text,
+			"icon": ""
+		}
+		var item = tree.appendChild(obj);
+		item.designer = designer;
+		item.appendChild({ "expand": false, "text": "loading...", "icon": "" });
+		return item;
+	},
+	listFindResult: function(data){
+		this.listContentNode.empty();
+		this.listContentNode.show();
+		o2.require("o2.widget.Tree", function(){
+			var tree = new o2.widget.Tree(this.listContentNode, {
+				"onQueryExpand": function(item){
+					if (item.designer) this.loadDesignerPattern(item);
+				}.bind(this)
+			});
+			tree.load();
+			if (data.processPlatformList && data.processPlatformList.length){
+				var platformItem = this.createResultCategroyItem(this.lp.processPlatform, this.lp.processPlatform, tree);
+				this.listProcessResult(platformItem, data.processPlatformList, "processPlatform");
+			}
+			if (data.cmsList && data.cmsList.length){
+				var platformItem = this.createResultCategroyItem(this.lp.cms, this.lp.cms, tree);
+				//this.listProcessResult(categroyItem, data.cmsList);
+			}
+			if (data.portalList && data.portalList.length){
+				var platformItem = this.createResultCategroyItem(this.lp.portal, this.lp.portal, tree);
+
+			}
+			if (data.queryList && data.queryList.length){
+				var platformItem = this.createResultCategroyItem(this.lp.query, this.lp.query, tree);
+			}
+			if (data.serviceList && data.serviceList.length){
+				var platformItem = this.createResultCategroyItem(this.lp.service, this.lp.service, tree);
+			}
+
+
+		}.bind(this));
+	},
+	addPatternCount: function(item, count){
+		if (!item.count) item.count = 0;
+		item.count += count;
+		var t = this.lp.patternCount.replace("{n}", item.count);
+		var textDivNode = item.textNode.getElement("div");
+		if (textDivNode){
+			var html = item.options.text;
+			textDivNode.set("html", html+" <span style=''>( "+t+" )</span>");
+		}
+	},
+	listProcessResult: function(platformItem, list, platform){
+		var applicationItems = {};
+		list.each(function(designer){
+			if (designer.patternList && designer.patternList.length){
+				var appItem = applicationItems[designer.appId];
+				if (!appItem){
+					applicationItems[designer.appId] = appItem = this.createResultAppItem(designer.appName, designer.appName+" ("+designer.appId+")", platformItem);
+				}
+				designer.platform = platform;
+				var designerItem = this.createResultDesignerItem(designer, appItem);
+				var count=0;
+				designer.patternList.each(function(p){
+					if (p.lines && p.lines.length){
+						count += p.lines.length;
+					}else{
+						count++;
+					}
+				});
+				// var count = designer.patternList.length;
+
+				this.addPatternCount(designerItem, count);
+				this.addPatternCount(appItem, count);
+				this.addPatternCount(platformItem, count);
+			}
+		}.bind(this));
+	},
+
+	getDesignerObject: function(designer){
+		switch (designer.platform){
+			case "processPlatform":
+				var action = this.Actions.load("x_processplatform_assemble_designer");
+				switch (designer.designerType){
+					case "script":
+						return action.ScriptAction.get(designer.designerId, function(json){return json.data;});
+					case "form":
+						return action.FomrAction.get(designer.designerId, function(json){return json.data;});
+					case "process":
+						return action.ProcessAction.get(designer.designerId, function(json){return json.data;});
+				}
+			case "cms":
+				var action = this.Actions.load("x_cms_assemble_control");
+				switch (designer.designerType){
+					case "script":
+						return action.ScriptAction.get(designer.designerId, function(json){return json.data;});
+					case "form":
+						return action.FormAction.get(designer.designerId, function(json){return json.data;});
+				}
+
+			case "portal":
+				var action = this.Actions.load("x_portal_assemble_designer");
+				switch (designer.designerType){
+					case "script":
+						return action.ScriptAction.get(designer.designerId, function(json){return json.data;});
+					case "page":
+						return action.PageAction.get(designer.designerId, function(json){return json.data;});
+					case "widget":
+						return action.WidgetAction.get(designer.designerId, function(json){return json.data;});
+				}
+			case "query":
+				var action = this.Actions.load("x_query_assemble_designer");
+				switch (designer.designerType){
+					case "view":
+						return action.ViewAction.get(designer.designerId, function(json){return json.data;});
+					case "statement":
+						return action.StatementAction.get(designer.designerId, function(json){return json.data;});
+					case "stat":
+						return action.StatAction.get(designer.designerId, function(json){return json.data;});
+				}
+			case "service":
+				var action = this.Actions.load("x_program_center");
+				switch (designer.appId){
+					case "invoke":
+						return action.InvokeAction.get(designer.designerId, function(json){return json.data;});
+					case "agent":
+						return action.AgentAction.get(designer.designerId, function(json){return json.data;});
+				}
+		}
+	},
+	loadDesignerPattern: function(item){
+		if (item.firstChild && item.firstChild.options.text==="loading..."){
+			item.firstChild.destroy();
+
+			var root, actionName, fun;
+			switch (designer.platform) {
+				case "processPlatform":
+					root = "x_processplatform_assemble_designer";
+					switch (designer.designerType) {
+						case "script": actionName = "ScriptAction"; fun = "listProcessScriptPattern";
+						case "form": actionName = "FomrAction"; fun = "listProcessFormPattern";
+						case "process": actionName = "ProcessAction"; fun = "listProcessProcessPattern";
+					}
+				case "cms":
+					root = "x_cms_assemble_control";
+					switch (designer.designerType) {
+						case "script": actionName = "ScriptAction"; fun = "listCmsScriptPattern";
+						case "form": actionName = "FormAction"; fun = "listCmsFormPattern";
+					}
+
+				case "portal":
+					root = "x_portal_assemble_designer";
+					switch (designer.designerType) {
+						case "script": actionName = "ScriptAction"; fun = "listPortalScriptPattern";
+						case "page": actionName = "PageAction"; fun = "listPortalPagePattern";
+						case "widget": actionName = "WidgetAction"; fun = "listPortalWidgetPattern";
+					}
+				case "query":
+					root = "x_query_assemble_designer";
+					switch (designer.designerType) {
+						case "view": actionName = "ViewAction"; fun = "listQueryViewPattern";
+						case "statement": actionName = "StatementAction"; fun = "listQueryStatementPattern";
+						case "stat": actionName = "StatAction"; fun = "listQueryStatPattern";
+					}
+				case "service":
+					root = "x_program_center";
+					switch (designer.appId) {
+						case "invoke": actionName = "InvokeAction"; fun = "listServiceInvokePattern";
+						case "agent": actionName = "AgentAction"; fun = "listServiceAgentPattern";
+					}
+			}
+			this.Actions.load(root)[actionName].get(designer.designerId, function(json){
+				this[fun](json.data, designer.patternList, item);
+			}.bind(this))
+		}
+	},
+
+	getFindRegExp: function(){
+		var flag = "gm";
+		var keyword = this.filterOption.keyword;
+		if (!this.filterOption.caseSensitive) flag+="i";
+		if (this.filterOption.matchRegExp){
+			return new RegExp(keyword, flag)
+		}else{
+			if (this.filterOption.matchWholeWord) keyword = "\\b"+keyword+"\\b";
+			return new RegExp(keyword, flag)
+		}
+	},
+
+
+	//启动一个webworker处理
+	listProcessScriptPattern: function (data, patternList, item){
+		patternList.each(function(pattern){
+			if (pattern.property == "text"){
+				var textArr = data.split("\n");
+				var regex = this.getFindRegExp();
+				pattern.lines.each(function(line){
+					var text = textArr[line];
+
+
+
+				}.bind(this));
+			}else{
+
+			}
+		}.bind(this));
 	}
+
+
 });

+ 10 - 3
o2web/source/x_component_FindDesigner/lp/zh-cn.js

@@ -19,11 +19,18 @@ MWF.xApplication.FindDesigner.LP = {
 	"query": "数据中心",
 	"service": "服务管理",
 
-	"search_placeholder": "请输入搜索内容",
+	"search_placeholder": "请输入查询内容",
 	"dockToBottom": "固定到下方",
 	"dockToRight": "固定到右侧",
-	"nothingFind": "未找到任何结果\n请输入搜索关键字",
+	"nothingFind": "未找到任何结果",
+	"nothingFind_keyword": "未找到任何结果\n请输入查询关键字",
+	"nothingFind_noFilter": "未找到任何结果\n请输选择查询类型",
+	"nothingFind_noRange": "未找到任何结果\n请确定查询范围",
 	"nothingPreview": "选择查找结果列表,可在此处预览",
 
-	"selectRange": "选择查找范围"
+	"selectRange": "选择查找范围",
+	"patternCount": "{n} 项匹配",
+
+	"receiveToFind": "正在准备查询数据 ...",
+	"readyToFind": "设计元素准备完毕(共{n}个) ..."
 };

+ 1 - 0
o2web/source/x_test/karma.FindDesigner.js

@@ -21,6 +21,7 @@ module.exports = function(config) {
             {pattern:'x_component_Common/**/*.*', included: false, nocache: true, watched: true},
             {pattern:'x_component_Template/**/*.*', included: false, nocache: true, watched: true},
             {pattern:'x_component_Homepage/**/*.*', included: false, nocache: true, watched: true},
+            {pattern:'x_component_Selector/**/*.*', included: false, nocache: true, watched: true},
 
             {pattern:'x_component_FindDesigner/test/*.spec.js', included: true, nocache: true, watched: true},