huqi пре 5 година
родитељ
комит
47d8899d4c

+ 1 - 1
o2web/gulpapps.js

@@ -89,7 +89,7 @@ var apps = [
     { "folder": "x_desktop", "tasks": ["move", "min"] },
     { "folder": "x_desktop", "tasks": ["move", "min"] },
     { "folder": "x_component_IMV2", "tasks": ["move", "min"] },
     { "folder": "x_component_IMV2", "tasks": ["move", "min"] },
     { "folder": "x_component_ConfigDesigner", "tasks": ["move", "min"] },
     { "folder": "x_component_ConfigDesigner", "tasks": ["move", "min"] },
-
+    { "folder": "x_test", "tasks": ["move"] }
 ];
 ];
 
 
 module.exports = apps;
 module.exports = apps;

+ 7 - 3
o2web/gulpfile.js

@@ -324,6 +324,7 @@ function createO2ConcatTask(path, isMin, thisOptions) {
             'source/o2_lib/mootools/plugin/mBox.js',
             'source/o2_lib/mootools/plugin/mBox.js',
             'source/' + path + '/o2.js',
             'source/' + path + '/o2.js',
             'source/x_desktop/js/base.js',
             'source/x_desktop/js/base.js',
+            'source/x_desktop/js/base_loader.js',
             "source/o2_core/o2/framework.js"
             "source/o2_core/o2/framework.js"
         ];
         ];
         var dest = option.dest+'/' + path + '/';
         var dest = option.dest+'/' + path + '/';
@@ -514,7 +515,8 @@ function createBaseWorkConcatBodyTask(path, isMin, thisOptions) {
 
 
             'source/' + path + '/js/base_work_actions_temp.js',
             'source/' + path + '/js/base_work_actions_temp.js',
 
 
-            'source/' + path + '/js/base.js'
+            'source/' + path + '/js/base.js',
+            'source/' + path + '/js/base_loader.js'
         ];
         ];
         var dest = option.dest+'/' + path + '/';
         var dest = option.dest+'/' + path + '/';
         return gulp.src(src)
         return gulp.src(src)
@@ -663,7 +665,8 @@ function createBasePortalConcatBodyTask(path, isMin, thisOptions) {
 
 
             'source/' + path + '/js/base_portal_actions_temp.js',
             'source/' + path + '/js/base_portal_actions_temp.js',
 
 
-            'source/' + path + '/js/base.js'
+            'source/' + path + '/js/base.js',
+            'source/' + path + '/js/base_loader.js'
         ];
         ];
         var dest = option.dest+'/' + path + '/';
         var dest = option.dest+'/' + path + '/';
         return gulp.src(src)
         return gulp.src(src)
@@ -719,7 +722,8 @@ function createBaseConcatTask(path, isMin, thisOptions){
     gulp.task(path+".base", function(){
     gulp.task(path+".base", function(){
         var option = thisOptions || options;
         var option = thisOptions || options;
         var src = [
         var src = [
-            'source/' + path + '/js/base.js'
+            'source/' + path + '/js/base.js',
+            'source/' + path + '/js/base_loader.js'
         ];
         ];
         var dest = option.dest+'/' + path + '/';
         var dest = option.dest+'/' + path + '/';
         return gulp.src(src)
         return gulp.src(src)

+ 4 - 4
o2web/karma.conf.js

@@ -6,8 +6,8 @@ module.exports = function(config) {
         basePath: '',
         basePath: '',
         frameworks: ['jasmine'],
         frameworks: ['jasmine'],
         files: [
         files: [
-            'source/*',
-            'test/**/*.js'
+            //'source/*',
+            '**/test/**/*.spec.js'
         ],
         ],
         exclude: [
         exclude: [
         ],
         ],
@@ -19,8 +19,8 @@ module.exports = function(config) {
         colors: true,
         colors: true,
         logLevel: config.LOG_INFO,
         logLevel: config.LOG_INFO,
         autoWatch: false,
         autoWatch: false,
-        browsers: ['PhantomJS'],
+        browsers: ['Chrome'],
         singleRun: false,
         singleRun: false,
         concurrency: Infinity
         concurrency: Infinity
-    })
+    });
 };
 };

+ 1 - 0
o2web/package.json

@@ -42,6 +42,7 @@
     "jasmine-core": "^3.6.0",
     "jasmine-core": "^3.6.0",
     "karma": "^5.2.3",
     "karma": "^5.2.3",
     "karma-chrome-launcher": "^3.1.0",
     "karma-chrome-launcher": "^3.1.0",
+    "karma-coverage": "^2.0.3",
     "karma-ie-launcher": "^1.0.0",
     "karma-ie-launcher": "^1.0.0",
     "karma-jasmine": "^4.0.1",
     "karma-jasmine": "^4.0.1",
     "merge-stream": "^1.0.1",
     "merge-stream": "^1.0.1",

+ 3 - 399
o2web/source/x_desktop/js/base.js

@@ -74,19 +74,14 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
                 layout.desktop.apps[app.appId] = app;
                 layout.desktop.apps[app.appId] = app;
             }
             }
 
 
-            //if (layout.desktop.appArr){
-                layout.desktop.appArr.push(app);
-                layout.desktop.appCurrentList.push(app);
-                if (!notCurrent) layout.desktop.currentApp = app;
-            //}
-            //app.taskitem = new MWF.xDesktop.Layout.Taskitem(app, this);
+            layout.desktop.appArr.push(app);
+            layout.desktop.appCurrentList.push(app);
+            if (!notCurrent) layout.desktop.currentApp = app;
         } else {
         } else {
             app.load(true);
             app.load(true);
             layout.app = app;
             layout.app = app;
         }
         }
 
 
-
-
         var mask = document.getElementById("appContentMask");
         var mask = document.getElementById("appContentMask");
         if (mask) mask.destroy();
         if (mask) mask.destroy();
     };
     };
@@ -122,18 +117,6 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
         return false;
         return false;
     };
     };
     var _openWorkHTML = function (options) {
     var _openWorkHTML = function (options) {
-        // var uri = new URI(window.location.href);
-        // var redirectlink = uri.getData("redirectlink");
-        // if (!redirectlink) {
-        //     redirectlink = encodeURIComponent(locate.pathname + locate.search);
-        // } else {
-        //     redirectlink = encodeURIComponent(redirectlink);
-        // }
-        // if (options.workId) {
-        //     window.location = o2.filterUrl("../x_desktop/workmobilewithaction.html?workid=" + options.workId + ((layout.debugger) ? "&debugger" : "") + "&redirectlink=" + redirectlink);
-        // } else if (options.workCompletedId) {
-        //     window.location = o2.filterUrl("../x_desktop/workmobilewithaction.html?workcompletedid=" + options.workCompletedId + ((layout.debugger) ? "&debugger" : "") + "&redirectlink=" + redirectlink);
-        // }
         var uri = new URI(window.location.href);
         var uri = new URI(window.location.href);
         var redirectlink = uri.getData("redirectlink");
         var redirectlink = uri.getData("redirectlink");
         if (!redirectlink) {
         if (!redirectlink) {
@@ -255,18 +238,6 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
                 }else{
                 }else{
                     url = url.setData(options).toString();
                     url = url.setData(options).toString();
                 }
                 }
-
-                // if (options.workId) {
-                //     url += "?workid=" + options.workId+"&"+par;
-                //     //window.location = o2.filterUrl("../x_desktop/workmobilewithaction.html?workid=" + options.workId + ((layout.debugger) ? "&debugger" : "") + "&redirectlink=" + redirectlink);
-                // } else if (options.workCompletedId) {
-                //     url += "?workcompletedid=" + options.workCompletedId+"&"+par;;
-                //     //window.location = o2.filterUrl("../x_desktop/workmobilewithaction.html?workcompletedid=" + options.workCompletedId + ((layout.debugger) ? "&debugger" : "") + "&redirectlink=" + redirectlink);
-                // } else if (options.draftId){
-                //     url += "?draftId=" + options.draftId+"&"+par;;
-                // } else if (options.draft) {
-                //     url = "../x_desktop/app.html?" + par;
-                // }
                 var job = (options.jobid || options.jobId || options.job);
                 var job = (options.jobid || options.jobId || options.job);
                 if (job) url += ((url.indexOf("?")!=-1) ? "&" : "?") + "jobid="+job;
                 if (job) url += ((url.indexOf("?")!=-1) ? "&" : "?") + "jobid="+job;
                 url +=((layout.debugger) ? "&debugger" : "");
                 url +=((layout.debugger) ? "&debugger" : "");
@@ -277,23 +248,7 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
                     return window.open(o2.filterUrl(url), par);
                     return window.open(o2.filterUrl(url), par);
                 }
                 }
                 break;
                 break;
-            // case "cms.Document":
-            //     _openDocument(appNames, options, statusObj);
-            //     break;
-            // case "cms.Module":
-            //     _openCms(appNames, options, statusObj);
-            //     break;
-            // case "Meeting":
-            //     _openMeeting(appNames, options, statusObj);
-            //     break;
-            // case "Calendar":
-            //     _openCalendar(appNames, options, statusObj);
-            //     break;
-            // case "process.TaskCenter":
-            //     _openTaskCenter(appNames, options, statusObj);
-            //     break;
             default:
             default:
-                //var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
                 if (layout.app.$openWithSelf) {
                 if (layout.app.$openWithSelf) {
                     return window.location = o2.filterUrl("../x_desktop/app.html?" + par + ((layout.debugger) ? "&debugger" : ""));
                     return window.location = o2.filterUrl("../x_desktop/app.html?" + par + ((layout.debugger) ? "&debugger" : ""));
                 } else {
                 } else {
@@ -317,13 +272,6 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
                 _openApplicationMobile(appNames, options, statusObj);
                 _openApplicationMobile(appNames, options, statusObj);
             } else {
             } else {
                 return _openApplicationPC(appNames, options, statusObj);
                 return _openApplicationPC(appNames, options, statusObj);
-                // var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-                //
-                // if (layout.app.$openWithSelf) {
-                //     return window.location = o2.filterUrl("../x_desktop/app.html?" + par + ((layout.debugger) ? "&debugger" : ""));
-                // } else {
-                //     return window.open(o2.filterUrl("../x_desktop/app.html?" + par + ((layout.debugger) ? "&debugger" : "")), par);
-                // }
             }
             }
         } else {
         } else {
             var appPath = appNames.split(".");
             var appPath = appNames.split(".");
@@ -331,7 +279,6 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
             _requireApp(appNames, function (appNamespace) {
             _requireApp(appNames, function (appNamespace) {
                 var appId = (options && options.appId) ? options.appId : ((appNamespace.options.multitask) ? "" : appName);
                 var appId = (options && options.appId) ? options.appId : ((appNamespace.options.multitask) ? "" : appName);
 
 
-                //if (appId && layout.desktop.apps && layout.desktop.apps[appId] && layout.desktop.apps[appId].window){
                 if (appId && layout.desktop.apps && layout.desktop.apps[appId]) {
                 if (appId && layout.desktop.apps && layout.desktop.apps[appId]) {
                     layout.desktop.apps[appId].setCurrent();
                     layout.desktop.apps[appId].setCurrent();
                 } else {
                 } else {
@@ -356,9 +303,6 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
     };
     };
 
 
     layout.load = function (appNames, options, statusObj) {
     layout.load = function (appNames, options, statusObj) {
-        // layout.message = new o2.xDesktop.MessageMobile();
-        // layout.message.load();
-
         layout.apps = [];
         layout.apps = [];
         layout.node = $("layout");
         layout.node = $("layout");
         var appName = appNames, m_status = statusObj, option = options;
         var appName = appNames, m_status = statusObj, option = options;
@@ -374,345 +318,5 @@ o2.xDesktop.requireApp = function (module, clazz, callback, async) {
         layout.openApplication(null, appName, option || {}, m_status);
         layout.openApplication(null, appName, option || {}, m_status);
     };
     };
 
 
-    // layout.getAppUrlMapping = function(url){
-    //     return this.getUrlMapping(url, "app");
-    // };
-    // layout.getCenterUrlMapping = function(url){
-    //     return this.getUrlMapping(url,"center");
-    // };
-    // layout.getWebUrlMapping = function(url){
-    //     return this.getUrlMapping(url, "web");
-    // };
-    // layout.getUrlMapping = function(url, type){
-    //     var urlContextMapping = layout.config.urlMapping;
-    //     if (urlContextMapping && urlContextMapping.app){
-    //         var href = url || window.location.href.toString();
-    //
-    //         for (var k in urlContextMapping[type]){
-    //             var regex = new RegExp(k);
-    //             if (regex.test(href)){
-    //                 return urlContextMapping[type][k];
-    //             }
-    //         }
-    //     }
-    //     return "";
-    // };
-
 })(layout);
 })(layout);
 
 
-o2.addReady(function () {
-    // layout.desktop = new (new Class({Implements: [Options, Events]}))();
-    // layout.desktop.openApplication = layout.openApplication;
-    // layout.desktop.refreshApp = layout.refreshApp;
-    // layout.desktop.load = layout.load;
-
-    //兼容方法
-    if (window.Element){
-        Element.implement({
-            "makeLnk": function (options) { }
-        });
-    }
-    layout.desktop.addEvent = function (type, e, d) {
-        window.addEvent(type, e, d);
-    };
-    layout.desktop.addEvents = function (e) {
-        window.addEvents(e);
-    };
-
-    var loadingNode = (window.$) ? $("loaddingArea") : null;
-    var loadeds = 0;
-    var loadCount = 4;
-    var size = (window.document && document.body) ? document.body.getSize() : null;
-    var _closeLoadingNode = function () {
-        if (loadingNode) {
-            loadingNode.destroy();
-            loadingNode = null;
-        }
-    };
-    var _loadProgressBar = function (complete) {
-        if (loadingNode) {
-            if (complete) {
-                loadingNode.setStyles({ "width": "" + size.x + "px" });
-                //loadingNode.set('morph', {duration: 100}).morph({"width": ""+size.x+"px"});
-                window.setTimeout(_closeLoadingNode, 500);
-            } else {
-                loadeds++;
-                var p = (loadeds / loadCount) * size.x;
-                loadingNode.setStyles({ "width": "" + p + "px" });
-                //loadingNode.set('morph', {duration: 100}).morph({"width": ""+p+"px"});
-                if (loadeds >= loadCount) window.setTimeout(_closeLoadingNode, 500);
-            }
-        }
-    };
-
-    var _setLayoutService = function(service, center){
-        layout.serviceAddressList = service;
-        layout.centerServer = center;
-        layout.desktop.serviceAddressList = service;
-        layout.desktop.centerServer = center;
-    };
-    var _getDistribute = function (callback) {
-
-        if (layout.config.app_protocol === "auto") {
-            layout.config.app_protocol = window.location.protocol;
-        }
-
-        if (layout.config.configMapping && (layout.config.configMapping[window.location.host] || layout.config.configMapping[window.location.hostname])){
-            var mapping = layout.config.configMapping[window.location.host] || layout.config.configMapping[window.location.hostname];
-            if (mapping.servers){
-                layout.serviceAddressList = mapping.servers;
-                layout.desktop.serviceAddressList = mapping.servers;
-                if (mapping.center) center = (o2.typeOf(mapping.center)==="array") ? mapping.center[0] : mapping.center;
-                layout.centerServer = center;
-                layout.desktop.centerServer = center;
-                if (callback) callback();
-            }else{
-                if (mapping.center) layout.config.center = (o2.typeOf(mapping.center)==="array") ? mapping.center : [mapping.center];
-                o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
-                    _setLayoutService(service, center);
-                    _loadProgressBar();
-                    if (callback) callback();
-                }.bind(this));
-            }
-        }else{
-            o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
-                _setLayoutService(service, center);
-                _loadProgressBar();
-                if (callback) callback();
-            }.bind(this));
-        }
-
-    };
-
-    var _load = function () {
-        var _loadApp = function (json) {
-            //用户已经登录
-            if (json){
-                layout.user = json.data;
-                layout.session = layout.session || {};
-                layout.session.user = json.data;
-                layout.session.token = json.data.token;
-                layout.desktop.session = layout.session;
-            }
-
-            _loadProgressBar(true);
-            while (layout.readys && layout.readys.length) {
-                console.log("load app ...")
-                layout.readys.shift().apply(window);
-            }
-        };
-
-        //修改支持x-token
-        var uri = new URI(window.location.href);
-        var options = uri.get("data");
-        if (options["x-token"]) {
-            Cookie.write("x-token", options["x-token"]);
-        }
-
-        layout.sessionPromise = new Promise(function(resolve, reject){
-            o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) {
-                if (resolve) resolve(json.data);
-            }.bind(this), function (xhr, text, error) {
-                if (reject) reject({"xhr": xhr, "text": text, "error": error});
-            }.bind(this));
-        });
-
-        // layout.sessionPromise = {
-        //     "resolveList": [],
-        //     "rejectList": [],
-        //     "init": function(resolve, reject){
-        //         if (resolve) this.resolveList.push(resolve);
-        //         if (reject) this.rejectList.push(reject);
-        //         this.status = "pending";
-        //         this.resolveReturn = this;
-        //
-        //         //先判断用户是否登录
-        //         console.log("layout.sessionPromise.init")
-        //         o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) {
-        //             this.status = "fulfilled";
-        //             this.resolveReturn = json.data;
-        //             this.runResolve(this.resolveReturn);
-        //         }.bind(this), function (xhr, text, error) {
-        //             this.status = "rejected";
-        //             this.resolveReturn = {"xhr": xhr, "text": text, "error": error};
-        //             this.runReject(this.resolveReturn);
-        //         }.bind(this));
-        //     },
-        //     "runResolve": function(json){
-        //         while (this.resolveList.length){
-        //             var r = this.resolveList.shift()(this.resolveReturn);
-        //             if (r) this.resolveReturn = r;
-        //         }
-        //     },
-        //     "runReject": function(json){
-        //         while (this.rejectList.length){
-        //             var r = this.rejectList.shift()(json);
-        //             if (r) this.resolveReturn = r;
-        //         }
-        //     },
-        //     "then": function(resolve, reject){
-        //         if (resolve) this.resolveList.push(resolve);
-        //         if (reject) this.rejectList.push(reject);
-        //         switch (this.status){
-        //             case "fulfilled":
-        //                 this.runResolve();
-        //                 break;
-        //             case "rejected":
-        //                 this.runReject();
-        //                 break;
-        //             default:
-        //             //nothing
-        //         }
-        //         return this;
-        //     }
-        // }
-
-        layout.sessionPromise.then(function(data){
-            //已经登录
-            layout.user = data;
-            layout.session = layout.session || {};
-            layout.session.user = data;
-            layout.session.token = data.token;
-            layout.desktop.session = layout.session;
-            //_loadApp();
-        }, function(){
-            //允许匿名访问
-            if (layout.anonymous) {
-                var data = { name: "anonymous", roleList: [] };
-                layout.user = data;
-                layout.session = layout.session || {};
-                layout.session.user = data;
-                layout.session.token = data.token;
-                layout.desktop.session = layout.session;
-                //_loadApp();
-            } else {
-                _loadProgressBar(true);
-                if (layout.yqwx) {
-                    layout.openLoginQywx();
-                } else {
-                    layout.openLogin();
-                }
-            }
-        });
-        _loadApp();
-
-        // //先判断用户是否登录
-        // o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) {
-        //     //已经登录
-        //     //_loadProgressBar();
-        //
-        //     layout.user = json.data;
-        //     layout.session = layout.session || {};
-        //     layout.session.user = json.data;
-        //     layout.session.token = json.data.token;
-        //     layout.desktop.session = layout.session;
-        //
-        //     //_loadApp(json);
-        // }.bind(this), function (json) {
-        //     //_loadProgressBar();
-        //     //允许匿名访问
-        //     if (layout.anonymous) {
-        //         //_loadProgressBar(true);
-        //         // _loadApp({
-        //         //     data : {
-        //         //         user: "anonymous",
-        //         //         session: {
-        //         //             user: {
-        //         //                 name: "anonymous",
-        //         //                 roleList: []
-        //         //             }
-        //         //         }
-        //         //     }
-        //         // });
-        //     } else {
-        //         _loadProgressBar(true);
-        //         if (layout.yqwx) {
-        //             layout.openLoginQywx();
-        //         } else {
-        //             layout.openLogin();
-        //         }
-        //     }
-        // });
-
-
-
-        layout.openLogin = function () {
-            layout.desktop.type = "app";
-            layout.app = null;
-            var content = $("appContent") || $("layout");
-            if (content) content.empty();
-            layout.authentication = new o2.xDesktop.Authentication({
-                "style": "flat",
-                "onLogin": _load.bind(layout)
-            });
-            layout.authentication.loadLogin(document.body);
-            var loadingNode = $("browser_loading");
-            if (loadingNode) loadingNode.fade("out");
-        };
-
-        layout.openLoginQywx = function () {
-            console.log("开始login。。。。。。。。。。。。。");
-            var uri = locate.href.toURI();
-
-            console.log("执行单点。。。。。。。。。。");
-            var action = new MWF.xDesktop.Actions.RestActions("", "x_organization_assemble_authentication", "");
-            action.getActions = function (actionCallback) {
-                this.actions = { "sso": { "uri": "/jaxrs/qiyeweixin/code/{code}", "method": "GET" } };
-                if (actionCallback) actionCallback();
-            };
-            action.invoke({
-                "name": "sso", "async": true, "parameter": { "code": uri.getData("code") }, "success": function (json) {
-                    console.log("单点成功。");
-                    console.log(json);
-                    //基础数据。。。。
-                    layout.session.user = json.data;
-                    //
-                    _load();
-
-                }.bind(this), "failure": function (xhr, text, error) {
-                    var n = document.getElementById("loaddingArea");
-                    if (n) { n.destroy(); }
-                    document.id("layout").set("html", "<div>企业微信单点异常!</div>")
-                }.bind(this)
-            });
-        };
-    };
-
-    //异步载入必要模块
-    layout.config = null;
-    var configLoaded = false;
-    var lpLoaded = false;
-    var commonLoaded = false;
-    var lp = o2.session.path + "/lp/" + o2.language + ".js";
-
-    if (o2.session.isDebugger && (o2.session.isMobile || layout.mobile)) o2.load("../o2_lib/eruda/eruda.js");
-    debugger;
-    var loadModuls = function () {
-        _loadProgressBar();
-        lpLoaded = true;
-
-        var modules = ["o2.xDesktop.$all"];
-        o2.require(modules, {
-            "onSuccess": function () {
-                commonLoaded = true;
-                if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
-            },
-            "onEvery": function () {
-                _loadProgressBar();
-            }
-        });
-    }
-
-    if (!o2.LP){
-        o2.load(lp, loadModuls);
-    }else{
-        loadModuls();
-    }
-
-    o2.getJSON("../x_desktop/res/config/config.json", function (config) {
-        _loadProgressBar();
-        layout.config = config;
-        configLoaded = true;
-        if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
-    });
-});

+ 0 - 552
o2web/source/x_desktop/js/base_bak.js

@@ -1,552 +0,0 @@
-layout = window.layout || {};
-layout.desktop = layout;
-layout.desktop.type = "app";
-var locate = window.location;
-layout.protocol = locate.protocol;
-layout.inBrowser = true;
-layout.session = layout.session || {};
-layout.debugger = (locate.href.toString().indexOf("debugger") !== -1);
-layout.anonymous = (locate.href.toString().indexOf("anonymous") !== -1);
-o2.xApplication = o2.xApplication || {};
-
-o2.xDesktop = o2.xDesktop || {};
-o2.xDesktop.requireApp = function (module, clazz, callback, async) {
-    o2.requireApp(module, clazz, callback, async);
-};
-
-(function (layout) {
-    layout.readys = [];
-    layout.addReady = function () {
-        for (var i = 0; i < arguments.length; i++) {
-            if (o2.typeOf(arguments[i]) === "function") layout.readys.push(arguments[i]);
-        }
-    };
-    var _requireApp = function (appNames, callback, clazzName) {
-        var appPath = appNames.split(".");
-        var baseObject = o2.xApplication;
-        appPath.each(function (path, i) {
-            if (i < (appPath.length - 1)) {
-                baseObject[path] = baseObject[path] || {};
-            } else {
-                baseObject[path] = baseObject[path] || { "options": Object.clone(o2.xApplication.Common.options) };
-            }
-            baseObject = baseObject[path];
-        }.bind(this));
-        if (!baseObject.options) baseObject.options = Object.clone(o2.xApplication.Common.options);
-
-        var _lpLoaded = false;
-        o2.xDesktop.requireApp(appNames, "lp." + o2.language, {
-            "failure": function () {
-                o2.xDesktop.requireApp(appNames, "lp.zh-cn", null, false);
-            }.bind(this)
-        }, false);
-
-        o2.xDesktop.requireApp(appNames, clazzName, function () {
-            if (callback) callback(baseObject);
-        });
-    };
-    var _createNewApplication = function (e, appNamespace, appName, options, statusObj, inBrowser, taskitem, notCurrent) {
-        if (options) { options.event = e; } else { options = { "event": e }; }
-        var app = new appNamespace["Main"](layout.desktop, options);
-        app.desktop = layout.desktop;
-        app.status = statusObj;
-        app.inBrowser = !!(inBrowser || layout.inBrowser);
-
-        if (layout.desktop.type === "layout") {
-            app.appId = (options.appId) ? options.appId : ((appNamespace.options.multitask) ? appName + "-" + (new o2.widget.UUID()) : appName);
-            app.options.appId = app.appId;
-
-            if (!taskitem) taskitem = layout.desktop.createTaskItem(app);
-            app.taskitem = taskitem;
-            app.taskitem.app = app;
-
-            app.isLoadApplication = true;
-            app.load(!notCurrent);
-
-            if (!layout.desktop.apps) layout.desktop.apps = {};
-            if (layout.desktop.apps[app.appId]) {
-                var tmpApp = layout.desktop.apps[app.appId];
-
-            } else {
-                layout.desktop.apps[app.appId] = app;
-            }
-
-
-
-            layout.desktop.appArr.push(app);
-            layout.desktop.appCurrentList.push(app);
-            if (!notCurrent) layout.desktop.currentApp = app;
-
-            //app.taskitem = new MWF.xDesktop.Layout.Taskitem(app, this);
-        } else {
-            app.load(true);
-            layout.app = app;
-        }
-
-
-
-        var mask = document.getElementById("appContentMask");
-        if (mask) mask.destroy();
-    };
-
-    var _openWorkAndroid = function (options) {
-        if (window.o2android && window.o2android.openO2Work) {
-            if (options.workId) {
-                window.o2android.openO2Work(options.workId, "", options.title || "");
-            } else if (options.workCompletedId) {
-                window.o2android.openO2Work("", options.workCompletedId, options.title || "");
-            }
-            return true;
-        }
-        return false;
-    };
-    var _openWorkIOS = function (options) {
-        if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.openO2Work) {
-            if (options.workId) {
-                window.webkit.messageHandlers.openO2Work.postMessage({
-                    "work": options.workId,
-                    "workCompleted": "",
-                    "title": options.title || ""
-                });
-            } else if (options.workCompletedId) {
-                window.webkit.messageHandlers.openO2Work.postMessage({
-                    "work": "",
-                    "workCompleted": options.workCompletedId,
-                    "title": options.title || ""
-                });
-            }
-            return true;
-        }
-        return false;
-    };
-    var _openWorkHTML = function (options) {
-        var uri = new URI(window.location.href);
-        var redirectlink = uri.getData("redirectlink");
-        if (!redirectlink) {
-            redirectlink = encodeURIComponent(locate.pathname + locate.search);
-        } else {
-            redirectlink = encodeURIComponent(redirectlink);
-        }
-        if (options.workId) {
-            window.location = "workmobilewithaction.html?workid=" + options.workId + ((layout.debugger) ? "&debugger" : "") + "&redirectlink=" + redirectlink;
-        } else if (options.workCompletedId) {
-            window.location = "workmobilewithaction.html?workcompletedid=" + options.workCompletedId + ((layout.debugger) ? "&debugger" : "") + "&redirectlink=" + redirectlink;
-        }
-    };
-    var _openWork = function (options) {
-        if (!_openWorkAndroid(options)) if (!_openWorkIOS(options)) _openWorkHTML(options);
-    };
-    var _openDocument = function (appNames, options, statusObj) {
-        var title = typeOf(options) === "object" ? (options.docTitle || options.title) : "";
-        title = title || "";
-        var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-        if (window.o2android && window.o2android.openO2CmsDocument) {
-            window.o2android.openO2CmsDocument(options.documentId, title);
-        } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.openO2CmsDocument) {
-            window.webkit.messageHandlers.openO2CmsDocument.postMessage({ "docId": options.documentId, "docTitle": title });
-        } else {
-            window.location = "appMobile.html?" + par + ((layout.debugger) ? "&debugger" : "");
-        }
-    };
-    var _openCms = function (appNames, options, statusObj) {
-        var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-        if (window.o2android && window.o2android.openO2CmsApplication) {
-            window.o2android.openO2CmsApplication(options.columnId, options.title || "");
-        } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.openO2CmsApplication) {
-            window.webkit.messageHandlers.openO2CmsApplication.postMessage(options.columnId);
-        } else {
-            window.location = "appMobile.html?" + par + ((layout.debugger) ? "&debugger" : "");
-        }
-    };
-    var _openMeeting = function (appNames, options, statusObj) {
-        var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-        if (window.o2android && window.o2android.openO2Meeting) {
-            window.o2android.openO2Meeting("");
-        } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.openO2Meeting) {
-            window.webkit.messageHandlers.openO2Meeting.postMessage("");
-        } else {
-            window.location = "appMobile.html?" + par + ((layout.debugger) ? "&debugger" : "");
-        }
-    };
-
-    var _openCalendar = function (appNames, options, statusObj) {
-        var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-        if (window.o2android && window.o2android.openO2Calendar) {
-            window.o2android.openO2Calendar("");
-        } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.openO2Calendar) {
-            window.webkit.messageHandlers.openO2Calendar.postMessage("");
-        } else {
-            window.location = "appMobile.html?" + par + ((layout.debugger) ? "&debugger" : "");
-        }
-    };
-    var _openTaskCenter = function (appNames, options, statusObj) {
-        var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-        var tab = ((options && options.navi) ? options.navi : "task").toLowerCase();
-        if (tab === "done") tab = "taskCompleted";
-        if (tab === "readed") tab = "readCompleted";
-
-        if (window.o2android && window.o2android.openO2WorkSpace) {
-            window.o2android.openO2WorkSpace(tab);
-        } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.openO2WorkSpace) {
-            window.webkit.messageHandlers.openO2WorkSpace.postMessage(tab);
-        } else {
-            window.location = "appMobile.html?" + par + ((layout.debugger) ? "&debugger" : "");
-        }
-    };
-
-    var _openApplicationMobile = function (appNames, options, statusObj) {
-        switch (appNames) {
-            case "process.Work":
-                _openWork(options);
-                break;
-            case "cms.Document":
-                _openDocument(appNames, options, statusObj);
-                break;
-            case "cms.Module":
-                _openCms(appNames, options, statusObj);
-                break;
-            case "Meeting":
-                _openMeeting(appNames, options, statusObj);
-                break;
-            case "Calendar":
-                _openCalendar(appNames, options, statusObj);
-                break;
-            case "process.TaskCenter":
-                _openTaskCenter(appNames, options, statusObj);
-                break;
-            default:
-                var uri = new URI(window.location.href);
-                var optionsStr = uri.getData("option");
-                var statusStr = uri.getData("status");
-                window.location = "appMobile.html?app=" + appNames + "&option=" + (optionsStr || "") + "&status=" + (statusStr || "") + ((layout.debugger) ? "&debugger" : "");
-        }
-    };
-
-    layout.openApplication = function (e, appNames, options, statusObj, inBrowser, taskitem, notCurrent) {
-        if (appNames.substring(0, 4) === "@url") {
-            var url = appNames.replace(/\@url\:/i, "");
-            var a = new Element("a", { "href": url, "target": "_blank" });
-            a.click();
-            a.destroy();
-            a = null;
-            return true;
-        }
-
-        if (layout.app) {
-            if (layout.mobile) {
-                _openApplicationMobile(appNames, options, statusObj);
-            } else {
-                var par = "app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent((statusObj) ? JSON.encode(statusObj) : "") + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "");
-
-                if (layout.app.$openWithSelf) {
-                    return window.location = "app.html?" + par + ((layout.debugger) ? "&debugger" : "");
-                } else {
-                    return window.open("app.html?" + par + ((layout.debugger) ? "&debugger" : ""), par);
-                }
-            }
-        } else {
-            var appPath = appNames.split(".");
-            var appName = appPath[appPath.length - 1];
-            _requireApp(appNames, function (appNamespace) {
-                var appId = (options && options.appId) ? options.appId : ((appNamespace.options.multitask) ? "" : appName);
-
-                //if (appId && layout.desktop.apps && layout.desktop.apps[appId] && layout.desktop.apps[appId].window){
-                if (appId && layout.desktop.apps && layout.desktop.apps[appId]) {
-                    layout.desktop.apps[appId].setCurrent();
-                } else {
-                    if (options) options.appId = appId;
-                    _createNewApplication(e, appNamespace, appName, (options || { "appId": appId }), statusObj, inBrowser, taskitem, notCurrent);
-                }
-            }.bind(this));
-        }
-    };
-
-    layout.refreshApp = function (app) {
-        var status = app.recordStatus();
-
-        var uri = new URI(window.location.href);
-        var appNames = uri.getData("app");
-        var optionsStr = uri.getData("option");
-        var statusStr = uri.getData("status");
-        if (status) statusStr = JSON.encode(status);
-
-        var port = uri.get("port");
-        window.location = uri.get("scheme") + "://" + uri.get("host") + ((port) ? ":" + port + "/" : "") + uri.get("directory ") + "?app=" + encodeURIComponent(appNames) + "&status=" + encodeURIComponent(statusStr) + "&option=" + encodeURIComponent((options) ? JSON.encode(options) : "") + ((layout.debugger) ? "&debugger" : "");
-    };
-
-    layout.load = function (appNames, options, statusObj) {
-        // layout.message = new o2.xDesktop.MessageMobile();
-        // layout.message.load();
-
-        layout.apps = [];
-        layout.node = $("layout");
-        var appName = appNames, m_status = statusObj, option = options;
-
-        var topWindow = window.opener;
-        if (topWindow) {
-            try {
-                if (!appName) appName = topWindow.layout.desktop.openBrowserApp;
-                if (!m_status) m_status = topWindow.layout.desktop.openBrowserStatus;
-                if (!option) option = topWindow.layout.desktop.openBrowserOption;
-            } catch (e) { }
-        }
-        layout.openApplication(null, appName, option || {}, m_status);
-    };
-
-})(layout);
-
-o2.addReady(function () {
-    //兼容方法
-    Element.implement({
-        "makeLnk": function (options) { }
-    });
-    layout.desktop.addEvent = function (type, e, d) {
-        window.addEvent(type, e, d);
-    };
-    layout.desktop.addEvents = function (e) {
-        window.addEvents(e);
-    };
-
-    var loadingNode = $("loaddingArea");
-    var loadeds = 0;
-    var loadCount = 16;
-    var size = document.body.getSize();
-    var _closeLoadingNode = function () {
-        if (loadingNode) {
-            loadingNode.destroy();
-            loadingNode = null;
-        }
-
-    };
-    var _loadProgressBar = function (complete) {
-        if (loadingNode) {
-            if (complete) {
-                loadingNode.setStyles({ "width": "" + size.x + "px" });
-                //loadingNode.set('morph', {duration: 100}).morph({"width": ""+size.x+"px"});
-                window.setTimeout(_closeLoadingNode, 500);
-            } else {
-                loadeds++;
-                var p = (loadeds / loadCount) * size.x;
-                loadingNode.setStyles({ "width": "" + p + "px" });
-                //loadingNode.set('morph', {duration: 100}).morph({"width": ""+p+"px"});
-                if (loadeds >= loadCount) window.setTimeout(_closeLoadingNode, 500);
-            }
-        }
-    };
-
-    //异步载入必要模块
-    layout.config = null;
-    var configLoaded = false;
-    var lpLoaded = false;
-    var commonLoaded = false;
-    var lp = o2.session.path + "/lp/" + o2.language + ".js";
-    o2.load(lp, function () {
-        _loadProgressBar();
-        lpLoaded = true;
-        if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
-    });
-    var modules = ["o2.xDesktop.Common", "o2.xDesktop.Actions.RestActions", "o2.xAction.RestActions"];
-    o2.require(modules, {
-        "onSuccess": function () {
-            commonLoaded = true;
-            if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
-        },
-        "onEvery": function () {
-            _loadProgressBar();
-        }
-    });
-    o2.getJSON("../x_desktop/res/config/config.json", function (config) {
-        _loadProgressBar();
-        layout.config = config;
-        configLoaded = true
-        if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
-    });
-
-    var _getDistribute = function (callback) {
-        if (layout.config.app_protocol === "auto") {
-            layout.config.app_protocol = window.location.protocol;
-        }
-        o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
-            layout.serviceAddressList = service;
-            layout.centerServer = center;
-            layout.desktop.serviceAddressList = service;
-            layout.desktop.centerServer = center;
-            _loadProgressBar();
-            if (callback) callback();
-        }.bind(this));
-    };
-
-    var _load = function () {
-        var _loadApp = function (json) {
-            //用户已经登录
-            layout.user = json.data;
-            //layout.session = {};
-            layout.session.user = json.data;
-            layout.session.token = json.data.token;
-            layout.desktop.session = layout.session;
-            (function (layout) {
-                var _loadResource = function (callback) {
-                    var isLoadedA = false;
-                    var isLoadedB = false;
-                    //var isLoadedC = false;
-
-                    var modules = [
-                        "o2.xDesktop.Dialog",
-                        "o2.xDesktop.UserData",
-                        "o2.xDesktop.Access",
-                        "o2.widget.UUID",
-                        "o2.xDesktop.Menu",
-                        "o2.xDesktop.Authentication",
-                        // "o2.xDesktop.shortcut",
-                        "o2.widget.PinYin",
-                        //"o2.xDesktop.Access"
-                        // "o2.xDesktop.MessageMobile"
-                    ];
-                    //o2.xDesktop.requireApp("Common", "", null, false);
-                    var _check = function () { if (isLoadedA && isLoadedB) if (callback) callback(); };
-
-                    o2.load(["../o2_lib/mootools/plugin/mBox.min.js"], function () { _loadProgressBar(); isLoadedA = true; _check(); });
-                    o2.require("o2.widget.Common", function () {
-                        _loadProgressBar();
-                        o2.require(modules, {
-                            "onSuccess": function () {
-                                o2.requireApp("Common", "", function () { _loadProgressBar(); isLoadedB = true; _check(); })
-                            },
-                            "onEvery": function () {
-                                _loadProgressBar();
-                            }
-                        });
-                    });
-                };
-
-                var _loadContent = function () {
-                    _loadResource(function () {
-                        _loadProgressBar(true);
-                        while (layout.readys && layout.readys.length) {
-                            layout.readys.shift().apply(window);
-                        }
-
-                    });
-                };
-
-                _loadContent();
-            })(layout);
-        };
-
-        //修改支持x-token
-        var uri = new URI(window.location.href);
-        var options = uri.get("data");
-        if (options["x-token"]) {
-            Cookie.write("x-token", options["x-token"]);
-        }
-
-        //先判断用户是否登录
-        o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) {
-            //已经登录
-            _loadProgressBar();
-            _loadApp(json);
-        }.bind(this), function (json) {
-            _loadProgressBar();
-            //允许匿名访问
-            if (layout.anonymous) {
-                _loadProgressBar(true);
-                _loadApp({
-                    user: "anonymous",
-                    session: {
-                        user: {
-                            name: "anonymous",
-                            roleList: []
-                        }
-                    }
-                });
-            } else {
-                //用户未经登录
-                //打开登录页面
-                var _loadResource = function (callback) {
-                    var isLoadedA = false;
-                    var isLoadedB = false;
-                    //var isLoadedC = false;
-
-                    //var lp = o2.session.path+"/lp/"+o2.language+".js";
-                    var modules = [
-                        "o2.xDesktop.Dialog",
-                        "o2.xDesktop.UserData",
-                        "o2.xDesktop.Access",
-                        "o2.widget.UUID",
-                        "o2.xDesktop.Menu",
-                        //"o2.xDesktop.shortcut",
-                        "o2.widget.PinYin",
-                        "o2.xDesktop.Access",
-                        //"o2.xDesktop.MessageMobile"
-                    ];
-                    //o2.xDesktop.requireApp("Common", "", null, false);
-                    var _check = function () { if (isLoadedA && isLoadedB) if (callback) callback(); };
-
-                    o2.load(["../o2_lib/mootools/plugin/mBox.min.js"], function () { _loadProgressBar(); isLoadedA = true; _check(); });
-                    o2.require("o2.widget.Common", function () {
-                        _loadProgressBar();
-                        o2.require(modules, {
-                            "onSuccess": function () {
-                                o2.requireApp("Common", "", function () { isLoadedB = true; _check(); })
-                            },
-                            "onEvery": function () {
-                                _loadProgressBar();
-                            }
-                        });
-                    });
-                };
-                _loadResource(function () {
-                    _loadProgressBar(true);
-                    if (layout.yqwx) {
-                        layout.openLoginQywx();
-                    } else {
-                        layout.openLogin();
-                    }
-                });
-            }
-        });
-
-        layout.openLogin = function () {
-            o2.require("o2.widget.Common", null, false);
-            o2.require("o2.xDesktop.Authentication", function () {
-                layout.authentication = new o2.xDesktop.Authentication({
-                    "style": "flat",
-                    "onLogin": _load.bind(layout)
-                });
-                layout.authentication.loadLogin(document.body);
-                var loadingNode = $("browser_loading");
-                if (loadingNode) loadingNode.fade("out");
-            });
-        };
-
-        layout.openLoginQywx = function () {
-            console.log("开始login。。。。。。。。。。。。。");
-            var uri = locate.href.toURI();
-
-            MWF.require("MWF.xDesktop.Actions.RestActions", function () {
-                console.log("执行单点。。。。。。。。。。");
-                var action = new MWF.xDesktop.Actions.RestActions("", "x_organization_assemble_authentication", "");
-                action.getActions = function (actionCallback) {
-                    this.actions = { "sso": { "uri": "/jaxrs/qiyeweixin/code/{code}", "method": "GET" } };
-                    if (actionCallback) actionCallback();
-                };
-                action.invoke({
-                    "name": "sso", "async": true, "parameter": { "code": uri.getData("code") }, "success": function (json) {
-                        console.log("单点成功。");
-                        console.log(json);
-                        //基础数据。。。。
-                        layout.session.user = json.data;
-                        //
-                        _load();
-
-                    }.bind(this), "failure": function (xhr, text, error) {
-                        var n = document.getElementById("loaddingArea");
-                        if (n) { n.destroy(); }
-                        document.id("layout").set("html", "<div>企业微信单点异常!</div>")
-                    }.bind(this)
-                });
-            });
-        };
-
-    };
-});

+ 219 - 0
o2web/source/x_desktop/js/base_loader.js

@@ -0,0 +1,219 @@
+o2.addReady(function () {
+     //兼容方法
+    if (window.Element){
+        Element.implement({
+            "makeLnk": function (options) { }
+        });
+    }
+    layout.desktop.addEvent = function (type, e, d) {
+        window.addEvent(type, e, d);
+    };
+    layout.desktop.addEvents = function (e) {
+        window.addEvents(e);
+    };
+
+    var loadingNode = (window.$) ? $("loaddingArea") : null;
+    var loadeds = 0;
+    var loadCount = 4;
+    var size = (window.document && document.body) ? document.body.getSize() : null;
+    var _closeLoadingNode = function () {
+        if (loadingNode) {
+            loadingNode.destroy();
+            loadingNode = null;
+        }
+    };
+    var _loadProgressBar = function (complete) {
+        if (loadingNode) {
+            if (complete) {
+                loadingNode.setStyles({ "width": "" + size.x + "px" });
+                //loadingNode.set('morph', {duration: 100}).morph({"width": ""+size.x+"px"});
+                window.setTimeout(_closeLoadingNode, 500);
+            } else {
+                loadeds++;
+                var p = (loadeds / loadCount) * size.x;
+                loadingNode.setStyles({ "width": "" + p + "px" });
+                //loadingNode.set('morph', {duration: 100}).morph({"width": ""+p+"px"});
+                if (loadeds >= loadCount) window.setTimeout(_closeLoadingNode, 500);
+            }
+        }
+    };
+
+    var _setLayoutService = function(service, center){
+        layout.serviceAddressList = service;
+        layout.centerServer = center;
+        layout.desktop.serviceAddressList = service;
+        layout.desktop.centerServer = center;
+    };
+    var _getDistribute = function (callback) {
+
+        if (layout.config.app_protocol === "auto") {
+            layout.config.app_protocol = window.location.protocol;
+        }
+
+        if (layout.config.configMapping && (layout.config.configMapping[window.location.host] || layout.config.configMapping[window.location.hostname])){
+            var mapping = layout.config.configMapping[window.location.host] || layout.config.configMapping[window.location.hostname];
+            if (mapping.servers){
+                layout.serviceAddressList = mapping.servers;
+                layout.desktop.serviceAddressList = mapping.servers;
+                if (mapping.center) center = (o2.typeOf(mapping.center)==="array") ? mapping.center[0] : mapping.center;
+                layout.centerServer = center;
+                layout.desktop.centerServer = center;
+                if (callback) callback();
+            }else{
+                if (mapping.center) layout.config.center = (o2.typeOf(mapping.center)==="array") ? mapping.center : [mapping.center];
+                o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
+                    _setLayoutService(service, center);
+                    _loadProgressBar();
+                    if (callback) callback();
+                }.bind(this));
+            }
+        }else{
+            o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
+                _setLayoutService(service, center);
+                _loadProgressBar();
+                if (callback) callback();
+            }.bind(this));
+        }
+
+    };
+
+    var _load = function () {
+        var _loadApp = function (json) {
+            //用户已经登录
+            if (json){
+                layout.user = json.data;
+                layout.session = layout.session || {};
+                layout.session.user = json.data;
+                layout.session.token = json.data.token;
+                layout.desktop.session = layout.session;
+            }
+
+            _loadProgressBar(true);
+            while (layout.readys && layout.readys.length) {
+                layout.readys.shift().apply(window);
+            }
+        };
+
+        //修改支持x-token
+        var uri = new URI(window.location.href);
+        var options = uri.get("data");
+        if (options["x-token"]) {
+            Cookie.write("x-token", options["x-token"]);
+        }
+
+        layout.sessionPromise = new Promise(function(resolve, reject){
+            o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) {
+                if (resolve) resolve(json.data);
+            }.bind(this), function (xhr, text, error) {
+                if (reject) reject({"xhr": xhr, "text": text, "error": error});
+            }.bind(this));
+        });
+
+        layout.sessionPromise.then(function(data){
+            //已经登录
+            layout.user = data;
+            layout.session = layout.session || {};
+            layout.session.user = data;
+            layout.session.token = data.token;
+            layout.desktop.session = layout.session;
+            //_loadApp();
+        }, function(){
+            //允许匿名访问
+            if (layout.anonymous) {
+                var data = { name: "anonymous", roleList: [] };
+                layout.user = data;
+                layout.session = layout.session || {};
+                layout.session.user = data;
+                layout.session.token = data.token;
+                layout.desktop.session = layout.session;
+                //_loadApp();
+            } else {
+                _loadProgressBar(true);
+                if (layout.yqwx) {
+                    layout.openLoginQywx();
+                } else {
+                    layout.openLogin();
+                }
+            }
+        });
+        _loadApp();
+
+        layout.openLogin = function () {
+            layout.desktop.type = "app";
+            layout.app = null;
+            var content = $("appContent") || $("layout");
+            if (content) content.empty();
+            layout.authentication = new o2.xDesktop.Authentication({
+                "style": "flat",
+                "onLogin": _load.bind(layout)
+            });
+            layout.authentication.loadLogin(document.body);
+            var loadingNode = $("browser_loading");
+            if (loadingNode) loadingNode.fade("out");
+        };
+
+        layout.openLoginQywx = function () {
+            console.log("开始login。。。。。。。。。。。。。");
+            var uri = locate.href.toURI();
+
+            console.log("执行单点。。。。。。。。。。");
+            var action = new MWF.xDesktop.Actions.RestActions("", "x_organization_assemble_authentication", "");
+            action.getActions = function (actionCallback) {
+                this.actions = { "sso": { "uri": "/jaxrs/qiyeweixin/code/{code}", "method": "GET" } };
+                if (actionCallback) actionCallback();
+            };
+            action.invoke({
+                "name": "sso", "async": true, "parameter": { "code": uri.getData("code") }, "success": function (json) {
+                    console.log("单点成功。");
+                    console.log(json);
+                    //基础数据。。。。
+                    layout.session.user = json.data;
+                    //
+                    _load();
+
+                }.bind(this), "failure": function (xhr, text, error) {
+                    var n = document.getElementById("loaddingArea");
+                    if (n) { n.destroy(); }
+                    document.id("layout").set("html", "<div>企业微信单点异常!</div>")
+                }.bind(this)
+            });
+        };
+    };
+
+    //异步载入必要模块
+    layout.config = null;
+    var configLoaded = false;
+    var lpLoaded = false;
+    var commonLoaded = false;
+    var lp = o2.session.path + "/lp/" + o2.language + ".js";
+
+    if (o2.session.isDebugger && (o2.session.isMobile || layout.mobile)) o2.load("../o2_lib/eruda/eruda.js");
+    var loadModuls = function () {
+        _loadProgressBar();
+        lpLoaded = true;
+
+        var modules = ["o2.xDesktop.$all"];
+        o2.require(modules, {
+            "onSuccess": function () {
+                commonLoaded = true;
+                if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
+            },
+            "onEvery": function () {
+                _loadProgressBar();
+            }
+        });
+    };
+
+    if (!o2.LP){
+        o2.load(lp, loadModuls);
+    }else{
+        loadModuls();
+    }
+
+    o2.getJSON("../x_desktop/res/config/config.json", function (config) {
+        _loadProgressBar();
+        layout.config = config;
+        configLoaded = true;
+        if (configLoaded && commonLoaded && lpLoaded) _getDistribute(function () { _load(); });
+    });
+});

+ 74 - 0
o2web/source/x_test/index.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <link rel="stylesheet" type="text/css" href="css/style.css" charset="UTF-8" />
+    <link rel="stylesheet" href="css/mBoxNotice.css" charset="UTF-8" />
+    <link rel="stylesheet" href="css/mBoxTooltip.css" charset="UTF-8" />
+    <title>O2</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
+    <div id="layout_main" style="overflow: hidden; height: 100%; background-position-x: center; background-size: cover;">
+        <div id="layout_top_shim"></div>
+        <div id="layout_top"></div>
+        <div id="layout_desktop">
+            <div id="desktop_content"></div>
+            <div id="desktop_navi"></div>
+        </div>
+    </div>
+
+    <div id="loaddingArea" style="z-index: 200001;overflow: hidden;width:0px; height:2px; background-color:#999999; position: absolute; top: 0;"></div>
+    <div id="browser_loading" style="z-index: 200000;background-image: url(img/loading_home3.gif); background-position: center center; background-repeat: no-repeat; overflow: hidden; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;background-color: #ffffff"></div>
+
+    <div id="appContent" style="overflow: hidden; height: 100%;"></div>
+
+    <div id="browser_error" style="overflow: hidden; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; display: none;background: #f1f1f1">
+        <div style="height:540px; width: 920px; overflow: hidden;  margin: 8% auto;">
+            <div id="browser_error_area" style="height:540px; width: 920px;"></div>
+            <div style="height:540px; width: 920px; position: relative; top: -540px">
+                <div style="background-image: url(img/warn1.png); background-repeat: no-repeat; background-position:center center; width: 90px; height: 80px; float:left; margin-left: 144px; margin-top: 74px"></div>
+                <div style="color: #333333; width: 530px; height: 80px; float:left; margin-left: 30px; margin-top: 74px; font-size: 28px; line-height: 40px;" id="browser_error_area_text">
+                    您的浏览器版本过低啦!~系统已经不支持IE9及以下版本了!
+                </div>
+                <div style="color: #666666; width: 650px; text-align:center; height: 50px; float:left; margin-left: 144px; margin-top: 60px; font-size: 28px; line-height: 40px; border-bottom: 2px solid #999999" id="browser_error_area_up_text">
+                    请升级您的浏览器:
+                </div>
+                <div style="width: 100px; height: 100px; float:left; margin-left: 144px; margin-top: 20px">
+                    <div style="background-position: center; background-repeat: no-repeat; background-image: url(img/logo_edge.png); width: 100px; height: 100px;"></div>
+                    <div style="width: 100px; height: 40px; font-size: 24px; color: #666666; line-height: 40px; text-align: center">Edge</div>
+                </div>
+
+                <div style="width: 100px; height: 100px; float:left; margin-left: 80px; margin-top: 20px">
+                    <div style="background-position: center; background-repeat: no-repeat;background-image: url(img/logo_chrome.png); width: 100px; height: 100px;"></div>
+                    <div style="width: 100px; height: 40px; font-size: 24px; color: #666666; line-height: 40px; text-align: center">Chrome</div>
+                </div>
+
+                <div style="width: 100px; height: 100px; float:left; margin-left: 80px; margin-top: 20px">
+                    <div style="background-position: center; background-repeat: no-repeat;background-image: url(img/logo_firefox.png); width: 100px; height: 100px;"></div>
+                    <div style="width: 100px; height: 40px; font-size: 24px; color: #666666; line-height: 40px; text-align: center">Firefox</div>
+                </div>
+
+                <div style="width: 100px; height: 100px; float:left; margin-left: 80px; margin-top: 20px">
+                    <div style="background-position: center; background-repeat: no-repeat;background-image: url(img/logo_safari.png); width: 100px; height: 100px;"></div>
+                    <div style="width: 100px; height: 40px; font-size: 24px; color: #666666; line-height: 40px; text-align: center">Safari</div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <script type="javascript">
+        if (!window.FormData || !window.WebSocket || !window.JSON){
+            var loadingNode = document.getElementById("browser_loading");
+            var errorNode = document.getElementById("browser_error");
+            if (loadingNode) loadingNode.style.display = "none";
+            if (errorNode) errorNode.style.display = "block";
+        }
+    </script>
+
+    <script src="../o2_core/o2.min.js"></script>
+    <script src="js/base.min.js"></script>
+    <script src="js/x.min.js"></script>
+    <script src="../o2_lib/Decimal.js"></script>
+</body>
+</html>

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

@@ -0,0 +1,44 @@
+// Karma configuration
+// Generated on Thu Dec 20 2018 15:16:19 GMT+0800 (中国标准时间)
+
+module.exports = function(config) {
+    config.set({
+        basePath: '../',
+        frameworks: ['jasmine'],
+        files: [
+            {pattern:'o2_lib/mootools/mootools-1.6.0_all.js', included: true, nocache: true},
+            {pattern:'o2_core/o2.js', included: true, nocache: true},
+            {pattern:'x_desktop/js/base.js', included: true, nocache: true},
+            {pattern:'x_test/o2TestLoader.js', included: true, nocache: true},
+            {pattern:'x_desktop/css/style.css', included: true, nocache: true},
+            {pattern:'x_desktop/css/mBoxNotice.css', included: true, nocache: true},
+            {pattern:'x_desktop/css/mBoxTooltip.css', included: true, nocache: true},
+
+            {pattern:'o2_core/**/*.*', included: false, nocache: true},
+            {pattern:'o2_lib/adapter/adapter.js', included: false, nocache: true},
+            {pattern:'x_desktop/**/*.*', included: false, nocache: true},
+            {pattern:'x_component_Common/**/*.*', included: false, nocache: true},
+            {pattern:'x_component_Template/**/*.*', included: false, nocache: true},
+            {pattern:'x_component_FindDesigner/**/*.!(spec).*', included: false, nocache: true},
+
+            {pattern:'x_component_FindDesigner/test/*.spec.js', included: true, nocache: true}
+
+        ],
+        proxies: {
+            "/": "/base/"
+        },
+        exclude: [
+        ],
+
+        preprocessors: {
+        },
+        reporters: ['progress'],
+        port: 9876,
+        colors: true,
+        logLevel: config.LOG_INFO,
+        autoWatch: false,
+        browsers: ['Chrome'],
+        singleRun: true,
+        concurrency: Infinity
+    });
+};

+ 365 - 0
o2web/source/x_test/o2TestLoader.js

@@ -0,0 +1,365 @@
+o2test = window.o2test || {};
+
+layout.config = {
+    "center": [
+        {
+            "port": "20030",
+            "host": "develop.o2oa.net"
+        }
+    ],
+    "initManagerChanged": true,
+    "initManagerName": "",
+    "initManagerPassword": "",
+    "footer": "开发系统Local",
+    "title": "o2oa开发平台local",
+    "app_protocol": "auto",
+    "loginPage": {
+        "enable": false,
+        "portal": "b82d7669-85d6-4c10-8151-c4d1f18ba6ef",
+        "page": ""
+    },
+    "configMapping": {
+        "localhost": {
+            "center": {
+                "port": "20030",
+                "host": "develop.o2oa.net"
+            },
+            "servers": {
+                "x_portal_assemble_designer": {
+                    "name": "门户设计",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_portal_assemble_designer"
+                },
+                "x_portal_assemble_surface": {
+                    "name": "门户",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_portal_assemble_surface"
+                },
+                "x_query_assemble_surface": {
+                    "name": "数据查询",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_query_assemble_surface"
+                },
+                "x_file_assemble_control": {
+                    "name": "云文件",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_file_assemble_control"
+                },
+                "x_organization_assemble_control": {
+                    "name": "组织管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_control"
+                },
+                "x_cms_assemble_control": {
+                    "name": "内容管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_cms_assemble_control"
+                },
+                "x_mind_assemble_control": {
+                    "name": "脑图",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_mind_assemble_control"
+                },
+                "x_query_assemble_designer": {
+                    "name": "数据查询设计",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_query_assemble_designer"
+                },
+                "x_general_assemble_control": {
+                    "name": "公共模块",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_general_assemble_control"
+                },
+                "x_processplatform_assemble_surface": {
+                    "name": "流程",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_assemble_surface"
+                },
+                "x_processplatform_assemble_designer": {
+                    "name": "流程设计",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_assemble_designer"
+                },
+                "x_meeting_assemble_control": {
+                    "name": "会议管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_meeting_assemble_control"
+                },
+                "x_processplatform_assemble_bam": {
+                    "name": "流程监控",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_assemble_bam"
+                },
+                "x_hotpic_assemble_control": {
+                    "name": "热点图片",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_hotpic_assemble_control"
+                },
+                "x_jpush_assemble_control": {
+                    "name": "极光推送服务模块",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_jpush_assemble_control"
+                },
+                "x_attendance_assemble_control": {
+                    "name": "考勤管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_attendance_assemble_control"
+                },
+                "x_bbs_assemble_control": {
+                    "name": "论坛",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_bbs_assemble_control"
+                },
+                "x_processplatform_service_processing": {
+                    "name": "流程服务",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_processplatform_service_processing"
+                },
+                "x_organization_assemble_express": {
+                    "name": "组织管理接口服务",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_express"
+                },
+                "x_organization_assemble_personal": {
+                    "name": "组织管理个人",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_personal"
+                },
+                "x_component_assemble_control": {
+                    "name": "组件",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_component_assemble_control"
+                },
+                "x_message_assemble_communicate": {
+                    "name": "消息通讯",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_message_assemble_communicate"
+                },
+                "x_query_service_processing": {
+                    "name": "数据查询服务",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_query_service_processing"
+                },
+                "x_organization_assemble_authentication": {
+                    "name": "组织管理认证",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_organization_assemble_authentication"
+                },
+                "x_calendar_assemble_control": {
+                    "name": "日程管理",
+                    "host": "develop.o2oa.net",
+                    "port": 20020,
+                    "context": "/x_calendar_assemble_control"
+                }
+            }
+        }
+
+    }
+};
+
+
+function o2TestLoader() {
+    //o2.base = "base/";
+    layout.debugger = true;
+    o2.session.isDebugger = true;
+    //兼容方法
+    if (window.Element){
+        Element.implement({
+            "makeLnk": function (options) { }
+        });
+    }
+    layout.desktop.addEvent = function (type, e, d) {
+        window.addEvent(type, e, d);
+    };
+    layout.desktop.addEvents = function (e) {
+        window.addEvents(e);
+    };
+
+    // var loadingNode = (window.$) ? $("loaddingArea") : null;
+    var loadeds = 0;
+    var loadCount = 4;
+    var size = (window.document && document.body) ? document.body.getSize() : null;
+
+    var _setLayoutService = function(service, center){
+        layout.serviceAddressList = service;
+        layout.centerServer = center;
+        layout.desktop.serviceAddressList = service;
+        layout.desktop.centerServer = center;
+    };
+    var _getDistribute = function (callback) {
+
+        if (layout.config.app_protocol === "auto") {
+            layout.config.app_protocol = window.location.protocol;
+        }
+
+        if (layout.config.configMapping && (layout.config.configMapping[window.location.host] || layout.config.configMapping[window.location.hostname])){
+            var mapping = layout.config.configMapping[window.location.host] || layout.config.configMapping[window.location.hostname];
+            if (mapping.servers){
+                layout.serviceAddressList = mapping.servers;
+                layout.desktop.serviceAddressList = mapping.servers;
+                if (mapping.center) center = (o2.typeOf(mapping.center)==="array") ? mapping.center[0] : mapping.center;
+                layout.centerServer = center;
+                layout.desktop.centerServer = center;
+                if (callback) callback();
+            }else{
+                if (mapping.center) layout.config.center = (o2.typeOf(mapping.center)==="array") ? mapping.center : [mapping.center];
+                o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
+                    _setLayoutService(service, center);
+                    if (callback) callback();
+                }.bind(this));
+            }
+        }else{
+            o2.xDesktop.getServiceAddress(layout.config, function (service, center) {
+                _setLayoutService(service, center);
+                if (callback) callback();
+            }.bind(this));
+        }
+
+    };
+
+    var _load = function () {
+        var _loadApp = function (json) {
+            //用户已经登录
+            if (json){
+                layout.user = json.data;
+                layout.session = layout.session || {};
+                layout.session.user = json.data;
+                layout.session.token = json.data.token;
+                layout.desktop.session = layout.session;
+            }
+
+            while (layout.readys && layout.readys.length) {
+                layout.readys.shift().apply(window);
+            }
+        };
+
+        layout.sessionPromise = new Promise(function(resolve, reject){
+            o2.Actions.get("x_organization_assemble_authentication").getAuthentication(function (json) {
+                if (resolve) resolve(json.data);
+            }.bind(this), function (xhr, text, error) {
+                if (reject) reject({"xhr": xhr, "text": text, "error": error});
+            }.bind(this));
+        });
+
+        layout.sessionPromise.then(function(data){
+            //已经登录
+            layout.user = data;
+            layout.session = layout.session || {};
+            layout.session.user = data;
+            layout.session.token = data.token;
+            layout.desktop.session = layout.session;
+            _loadApp();
+        }, function(){
+            //允许匿名访问
+            if (layout.anonymous) {
+                var data = { name: "anonymous", roleList: [] };
+                layout.user = data;
+                layout.session = layout.session || {};
+                layout.session.user = data;
+                layout.session.token = data.token;
+                layout.desktop.session = layout.session;
+                _loadApp();
+            } else {
+                o2.Actions.load("x_organization_assemble_authentication").AuthenticationAction.login({"credential":o2test.username,"password":o2test.password}, function (json) {
+                    _loadApp(json);
+                }.bind(this), function (xhr, text, error) {
+                    layout.openLogin();
+                }.bind(this));
+            }
+        });
+        //_loadApp();
+
+        layout.openLogin = function () {
+            layout.desktop.type = "app";
+            layout.app = null;
+            var content = $("appContent") || $("layout");
+            if (content) content.empty();
+            layout.authentication = new o2.xDesktop.Authentication({
+                "style": "flat",
+                "onLogin": _load.bind(layout)
+            });
+            layout.authentication.loadLogin(document.body);
+            var loadingNode = $("browser_loading");
+            if (loadingNode) loadingNode.fade("out");
+        };
+    };
+
+    //异步载入必要模块
+    var configLoaded = false;
+    var lpLoaded = false;
+    var commonLoaded = false;
+    var appLoaded = false;
+    var lp = o2.session.path + "/lp/" + o2.language + ".js";
+
+    if (o2.session.isDebugger && (o2.session.isMobile || layout.mobile)) o2.load("../o2_lib/eruda/eruda.js");
+    debugger;
+    var loadModuls = function () {
+        lpLoaded = true;
+
+        var modules = [
+            'o2.widget.Common',
+            'o2.widget.Dialog',
+            'o2.widget.UUID',
+            'o2.xDesktop.Common',
+            'o2.xDesktop.Actions.RestActions',
+            'o2.xAction.RestActions',
+            'o2.xDesktop.Access',
+            'o2.xDesktop.Dialog',
+            'o2.xDesktop.Menu',
+            'o2.xDesktop.UserData',
+            'o2.xDesktop.Authentication',
+            'o2.xDesktop.Dialog',
+            'o2.xDesktop.Window'
+        ];
+        o2.require(modules, {
+            "onSuccess": function () {
+                commonLoaded = true;
+                if (configLoaded && commonLoaded && lpLoaded && appLoaded) _getDistribute(function () { _load(); });
+            }
+        });
+        var apps = [
+            ["Template", "MPopupForm"],
+            ["Common", ""]
+        ];
+        o2.requireApp(apps, null, function(){
+            appLoaded = true;
+            if (configLoaded && commonLoaded && lpLoaded && appLoaded) _getDistribute(function () { _load(); });
+        });
+    }
+
+    if (!o2.LP){
+        o2.load(lp, loadModuls);
+    }else{
+        loadModuls();
+    }
+
+    //o2.getJSON("../x_desktop/res/config/config.json", function (config) {
+        configLoaded = true;
+        if (configLoaded && commonLoaded && lpLoaded && appLoaded) _getDistribute(function () { _load(); });
+    //});
+};
+