Browse Source

脚本编辑器代码提示功能优化

huqi 5 năm trước cách đây
mục cha
commit
961e5eae34

+ 51 - 1
o2web/gulpfile.js

@@ -715,6 +715,55 @@ function createBasePortalConcatTask(path, isMin, thisOptions){
     createBasePortalConcatDelTempTask(path);
     gulp.task( path+".base_portal", gulp.series(path+".base_portal : action", path+".base_portal : style", path+".base_portal : concat", path+".base_portal : clean"));
 }
+function createBaseConcatTask(path, isMin, thisOptions){
+    gulp.task(path+".base", function(){
+        var option = thisOptions || options;
+        var src = [
+            'source/' + path + '/js/base.js'
+        ];
+        var dest = option.dest+'/' + path + '/';
+        return gulp.src(src)
+            .pipe(sourceMap.init())
+            .pipe(concat('js/base.js'))
+            .pipe(gulpif((option.upload == 'local' && option.location != ''), gulp.dest(option.location + path + '/')))
+            .pipe(gulpif((option.upload == 'ftp' && option.host != ''), ftp({
+                host: option.host,
+                user: option.user || 'anonymous',
+                pass: option.pass || '@anonymous',
+                port: option.port || 21,
+                remotePath: (option.remotePath || '/') + path
+            })))
+            .pipe(gulpif((option.upload == 'sftp' && option.host != ''), sftp({
+                host: option.host,
+                user: option.user || 'anonymous',
+                pass: option.pass || null,
+                port: option.port || 22,
+                remotePath: (option.remotePath || '/') + path
+            })))
+            .pipe(gulp.dest(dest))
+            // .pipe(gulp.src(src))
+            .pipe(concat('js/base.min.js'))
+            .pipe(uglify())
+            .pipe( sourceMap.write("") )
+            // .pipe(rename({ extname: '.min.js' }))
+            .pipe(gulpif((option.upload == 'local' && option.location != ''), gulp.dest(option.location + path + '/')))
+            .pipe(gulpif((option.upload == 'ftp' && option.host != ''), ftp({
+                host: option.host,
+                user: option.user || 'anonymous',
+                pass: option.pass || '@anonymous',
+                port: option.port || 21,
+                remotePath: (option.remotePath || '/') + path
+            })))
+            .pipe(gulpif((option.upload == 'sftp' && option.host != ''), sftp({
+                host: option.host,
+                user: option.user || 'anonymous',
+                pass: option.pass || null,
+                port: option.port || 22,
+                remotePath: (option.remotePath || '/') + path
+            })))
+            .pipe(gulp.dest(dest))
+    });
+}
 
 
 function getAppTask(path, isMin, thisOptions) {
@@ -730,7 +779,8 @@ function getAppTask(path, isMin, thisOptions) {
         createDefaultTask(path, isMin, thisOptions);
         createBaseWorkConcatTask(path, isMin, thisOptions);
         createBasePortalConcatTask(path, isMin, thisOptions);
-        return gulp.series(path, path+".base_work", path+".base_portal");
+        createBaseConcatTask(path, isMin, thisOptions);
+        return gulp.series(path, path+".base_work", path+".base_portal", path+".base");
         //return gulp.series(path, path+".base_work : concat");
     }else{
         createDefaultTask(path, isMin, thisOptions);

+ 183 - 120
o2web/source/o2_core/o2.js

@@ -434,6 +434,7 @@ if (!window.Promise){
         "raphael": ["../o2_lib/raphael/raphael.js"],
         "d3": ["../o2_lib/d3/d3.min.js"],
         "ace": ["../o2_lib/ace/src-min-noconflict/ace.js","../o2_lib/ace/src-min-noconflict/ext-language_tools.js"],
+        //"ace": ["../o2_lib/ace/src-noconflict/ace.js","../o2_lib/ace/src-noconflict/ext-language_tools.js"],
         "monaco": ["../o2_lib/vs/loader.js"],
         "JSBeautifier": ["../o2_lib/JSBeautifier/beautify.js"],
         "JSBeautifier_css": ["../o2_lib/JSBeautifier/beautify-css.js"],
@@ -507,32 +508,44 @@ if (!window.Promise){
     };
 
     var _load = function(urls, options, callback){
-        var ms = (_typeOf(urls)==="array") ? urls : [urls];
-        var op =  (_typeOf(options)==="object") ? _getJsOptions(options) : _getJsOptions(null);
-        var cbk = (_typeOf(options)==="function") ? options : callback;
-
-        var cb = cbk;
-        if (typeof define === 'function' && define.amd){
-            define.amd = false;
-            cb = (cbk) ? function(){define.amd = true; cbk();} : function(){define.amd = true;}
-        }
-
-        var modules = [];
-        for (var i=0; i<ms.length; i++){
-            var url = ms[i];
-            var module = _frameworks[url] || url;
-            if (_typeOf(module)==="array"){
-                modules = modules.concat(module)
+        if (window.document && !window.importScripts){
+            var ms = (_typeOf(urls)==="array") ? urls : [urls];
+            var op =  (_typeOf(options)==="object") ? _getJsOptions(options) : _getJsOptions(null);
+            var cbk = (_typeOf(options)==="function") ? options : callback;
+
+            var cb = cbk;
+            if (typeof define === 'function' && define.amd){
+                define.amd = false;
+                cb = (cbk) ? function(){define.amd = true; cbk();} : function(){define.amd = true;}
+            }
+
+            var modules = [];
+            for (var i=0; i<ms.length; i++){
+                var url = ms[i];
+                var module = _frameworks[url] || url;
+                if (_typeOf(module)==="array"){
+                    modules = modules.concat(module)
+                }else{
+                    modules.push(module)
+                }
+            }
+            var thisLoaded = [];
+            if (op.sequence){
+                _loadSequence(modules, cb, op, 0, thisLoaded, _loadSingle);
             }else{
-                modules.push(module)
+                _loadDisarray(modules, cb, op, thisLoaded, _loadSingle);
             }
-        }
-        var thisLoaded = [];
-        if (op.sequence){
-            _loadSequence(modules, cb, op, 0, thisLoaded, _loadSingle);
         }else{
-            _loadDisarray(modules, cb, op, thisLoaded, _loadSingle);
+            if (window.importScripts){
+                var ms = (_typeOf(urls)==="array") ? urls : [urls];
+                ms.each(function(url){
+                    window.importScripts(o2.filterUrl(url));
+                });
+                var cbk = (_typeOf(options)==="function") ? options : callback;
+                if (cbk) cbk();
+            }
         }
+
     };
     this.o2.load = _load;
 
@@ -1059,31 +1072,36 @@ if (!window.Promise){
         var jsPath = (compression || !this.o2.session.isDebugger) ? url.replace(/\.js/, ".min.js") : url;
         jsPath = (jsPath.indexOf("?")!==-1) ? jsPath+"&v="+this.o2.version.v : jsPath+"?v="+this.o2.version.v;
 
-        var xhr = new Request({
-            url: o2.filterUrl(jsPath), async: async, method: "get",
-            onSuccess: function(){
-                //try{
-                _loaded[key] = true;
-                o2.runCallback(callback, "success", [module]);
-                //}catch (e){
-                //    o2.runCallback(callback, "failure", [e]);
-                //}
-            },
-            onFailure: function(r){
-                var rex = /lp\/.+\.js/;
-                if (rex.test(url)){
-                    var zhcnUrl = url.replace(rex, "lp/zh-cn.js");
-                    if (zhcnUrl!==url){
-                        _requireJs(zhcnUrl, callback, async, compression, module)
+        if (window.importScripts){
+            window.importScripts(o2.filterUrl(jsPath));
+            o2.runCallback(callback, "success", [module]);
+        }else{
+            var xhr = new Request({
+                url: o2.filterUrl(jsPath), async: async, method: "get",
+                onSuccess: function(){
+                    //try{
+                    _loaded[key] = true;
+                    o2.runCallback(callback, "success", [module]);
+                    //}catch (e){
+                    //    o2.runCallback(callback, "failure", [e]);
+                    //}
+                },
+                onFailure: function(r){
+                    var rex = /lp\/.+\.js/;
+                    if (rex.test(url)){
+                        var zhcnUrl = url.replace(rex, "lp/zh-cn.js");
+                        if (zhcnUrl!==url){
+                            _requireJs(zhcnUrl, callback, async, compression, module)
+                        }else{
+                            o2.runCallback(callback, "failure", [r]);
+                        }
                     }else{
                         o2.runCallback(callback, "failure", [r]);
                     }
-                }else{
-                    o2.runCallback(callback, "failure", [r]);
                 }
-            }
-        });
-        xhr.send();
+            });
+            xhr.send();
+        }
     };
     var _requireSingle = function(module, callback, async, compression){
         if (o2.typeOf(module)==="array"){
@@ -2604,97 +2622,142 @@ o2.more = true;
 //o2.addReady
 (function(){
     //dom ready
-    var _dom = {
-        ready: false,
-        loaded: false,
-        checks: [],
-        shouldPoll: false,
-        timer: null,
-        testElement: document.createElement('div'),
-        readys: [],
-
-        domready: function(){
-            clearTimeout(_dom.timer);
-            if (_dom.ready) return;
-            _dom.loaded = _dom.ready = true;
-            o2.removeListener(document, 'DOMContentLoaded', _dom.checkReady);
-            o2.removeListener(document, 'readystatechange', _dom.check);
-            _dom.onReady();
-        },
-        check: function(){
-            for (var i = _dom.checks.length; i--;) if (_dom.checks[i]() && window.MooTools && o2.core && o2.more){
-                _dom.domready();
-                return true;
+    var _dom;
+    if (window.document){
+        _dom = {
+            ready: false,
+            loaded: false,
+            checks: [],
+            shouldPoll: false,
+            timer: null,
+            testElement: document.createElement('div'),
+            readys: [],
+
+            domready: function(){
+                clearTimeout(_dom.timer);
+                if (_dom.ready) return;
+                _dom.loaded = _dom.ready = true;
+                o2.removeListener(document, 'DOMContentLoaded', _dom.checkReady);
+                o2.removeListener(document, 'readystatechange', _dom.check);
+                _dom.onReady();
+            },
+            check: function(){
+                for (var i = _dom.checks.length; i--;) if (_dom.checks[i]() && window.MooTools && o2.core && o2.more){
+                    _dom.domready();
+                    return true;
+                }
+                return false;
+            },
+            poll: function(){
+                clearTimeout(_dom.timer);
+                if (!_dom.check()) _dom.timer = setTimeout(_dom.poll, 10);
+            },
+
+            /*<ltIE8>*/
+            // doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
+            // testElement.doScroll() throws when the DOM is not ready, only in the top window
+            doScrollWorks: function(){
+                try {
+                    _dom.testElement.doScroll();
+                    return true;
+                } catch (e){}
+                return false;
+            },
+            /*</ltIE8>*/
+
+            onReady: function(){
+                for (var i=0; i<_dom.readys.length; i++){
+                    this.readys[i].apply(window);
+                }
+            },
+            addReady: function(fn){
+                if (_dom.loaded){
+                    if (fn) fn.apply(window);
+                }else{
+                    if (fn) _dom.readys.push(fn);
+                }
+                return _dom;
+            },
+            checkReady: function(){
+                _dom.checks.push(function(){return true});
+                _dom.check();
             }
-            return false;
-        },
-        poll: function(){
-            clearTimeout(_dom.timer);
-            if (!_dom.check()) _dom.timer = setTimeout(_dom.poll, 10);
-        },
+        };
+
+
+        o2.addListener(document, 'DOMContentLoaded', _dom.checkReady);
 
         /*<ltIE8>*/
-        // doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
-        // testElement.doScroll() throws when the DOM is not ready, only in the top window
-        doScrollWorks: function(){
-            try {
-                _dom.testElement.doScroll();
-                return true;
-            } catch (e){}
-            return false;
-        },
+        // If doScroll works already, it can't be used to determine domready
+        //   e.g. in an iframe
+        if (_dom.testElement.doScroll && !_dom.doScrollWorks()){
+            _dom.checks.push(_dom.doScrollWorks);
+            _dom.shouldPoll = true;
+        }
         /*</ltIE8>*/
 
-        onReady: function(){
-            for (var i=0; i<_dom.readys.length; i++){
-                this.readys[i].apply(window);
-            }
-        },
-        addReady: function(fn){
-            if (_dom.loaded){
-                if (fn) fn.apply(window);
-            }else{
-                if (fn) _dom.readys.push(fn);
+        if (document.readyState) _dom.checks.push(function(){
+            var state = document.readyState;
+            return (state == 'loaded' || state == 'complete');
+        });
+
+        if ('onreadystatechange' in document) o2.addListener(document, 'readystatechange', _dom.check);
+        else _dom.shouldPoll = true;
+
+        if (_dom.shouldPoll) _dom.poll();
+    }else{
+        _dom = {
+            ready: false,
+            loaded: false,
+            checks: [],
+            shouldPoll: false,
+            timer: null,
+            readys: [],
+
+            domready: function(){
+                clearTimeout(_dom.timer);
+                if (_dom.ready) return;
+                _dom.loaded = _dom.ready = true;
+                _dom.onReady();
+            },
+            check: function(){
+                if (window.MooTools && o2.core && o2.more){
+                    _dom.domready();
+                    return true;
+                }
+                return false;
+            },
+            onReady: function(){
+                for (var i=0; i<_dom.readys.length; i++){
+                    this.readys[i].apply(window);
+                }
+            },
+            addReady: function(fn){
+                if (_dom.loaded){
+                    if (fn) fn.apply(window);
+                }else{
+                    if (fn) _dom.readys.push(fn);
+                }
+                return _dom;
+            },
+            checkReady: function(){
+                _dom.checks.push(function(){return true});
+                _dom.check();
             }
-            return _dom;
-        },
-        checkReady: function(){
-            _dom.checks.push(function(){return true});
-            _dom.check();
-        }
-    };
+        };
+    }
     var _loadO2 = function(){
         (!o2.core) ? this.o2.load("o2.core", _dom.check) : _dom.check();
         (!o2.more) ? this.o2.load("o2.more", _dom.check) : _dom.check();
     };
-
-    o2.addListener(document, 'DOMContentLoaded', _dom.checkReady);
-
-    /*<ltIE8>*/
-    // If doScroll works already, it can't be used to determine domready
-    //   e.g. in an iframe
-    if (_dom.testElement.doScroll && !_dom.doScrollWorks()){
-        _dom.checks.push(_dom.doScrollWorks);
-        _dom.shouldPoll = true;
-    }
-    /*</ltIE8>*/
-
-    if (document.readyState) _dom.checks.push(function(){
-        var state = document.readyState;
-        return (state == 'loaded' || state == 'complete');
-    });
-
-    if ('onreadystatechange' in document) o2.addListener(document, 'readystatechange', _dom.check);
-    else _dom.shouldPoll = true;
-
-    if (_dom.shouldPoll) _dom.poll();
-
     if (!window.MooTools){
         this.o2.load("mootools", function(){ _loadO2(); _dom.check(); });
     }else{
         _loadO2();
     }
     this.o2.addReady = function(fn){ _dom.addReady.call(_dom, fn); };
+
+
 })();
 
 //compatible
@@ -2704,7 +2767,7 @@ COMMON = {
         COMMON.contentPath = path;
     },
     "JSON": o2.JSON,
-    "Browser": Browser,
+    "Browser": window.Browser,
     "Class": o2.Class,
     "XML": o2.xml,
     "AjaxModule": {
@@ -2721,7 +2784,7 @@ COMMON = {
     "Request": Request,
     "typeOf": o2.typeOf
 };
-COMMON.Browser.Platform.isMobile = o2.session.isMobile;
+if (COMMON.Browser) COMMON.Browser.Platform.isMobile = o2.session.isMobile;
 COMMON.DOM.addReady = o2.addReady;
 MWF = o2;
 MWF.getJSON = o2.JSON.get;

+ 308 - 198
o2web/source/o2_core/o2/widget/$JavascriptEditor/environment.json

@@ -4,228 +4,338 @@
   "businessData": {
     "data":{},
     "work": {
-      "id": "854e2c22-718e-48bb-98db-96f4b43e7ee8",
-      "title": "xx7月北京出差报销审批",
-      "startTime": "2018-09-07 14:03:22",
-      "startTimeMonth": "2018-09",
-      "creatorPerson": "xx@huqi@P",
-      "creatorIdentity": "xx@481c9edc-5fb5-41f1-b5c2-6ea609082cdb@I",
-      "creatorUnit": "xx@c448d8bb-98b8-4305-9d3f-12537723cfcc@U",
-      "creatorUnitLevelName": "浙江兰德纵横/开发部",
-      "application": "1dc23336-6be6-402b-bed6-36e707a1dd17",
-      "applicationName": "财务管理",
-      "applicationAlias": "finance",
-      "process": "2207db11-dddf-4ebd-864d-3819f3e173c6",
-      "processName": "报销审批流程",
-      "processAlias": "",
-      "activity": "13d15daf-2ac5-4c1b-a669-1607a0e5ed15",
-      "activityType": "manual",
-      "activityName": "部门领导审核",
-      "activityAlias": "",
-      "activityDescription": "",
-      "activityArrivedTime": "2018-09-27 22:49:21",
-      "serial": "",
-      "workStatus": "processing",
-      "errorRetry": 0,
-      "splitting": false,
-      "form": "db3b2766-93a1-4058-b522-0edb922bd84f"
+      "id": "工作的ID标识",
+      "title": "工作标题",
+      "startTime": "创建时间",
+      "startTimeMonth": "工作创建的月份,如:2020-09",
+      "creatorPerson": "前端脚本中为创建人姓名,如:name;\n服务端脚本中为创建人标识:如:name@unique@P",
+      "creatorPersonDn": "创建人标识:如:name@unique@P\n服务端脚本中不可用",
+      "creatorIdentity": "前端脚本中为创建人身份名称,如:name;\n服务端脚本中为创建人身份标识:如:name@unique@I",
+      "creatorIdentityDn": "创建人身份标识:如:name@unique@I\n服务端脚本中不可用",
+      "creatorUnit": "前端脚本中为创建组织名称,如:name;\n服务端脚本中为创建组织标识:如:name@unique@U",
+      "creatorUnitDn": "创建组织标识:如:name@unique@U\n服务端脚本中不可用U",
+      "creatorUnitLevelName": "创建人组织层次,如:顶层组织/二层组织/三层组织",
+      "application": "应用的ID",
+      "applicationName": "应用的名称",
+      "applicationAlias": "应用的别名",
+      "process": "流程的ID",
+      "processName": "流程的名称",
+      "processAlias": "流程的别名",
+      "activity": "当前所处的活动ID",
+      "activityType": "当前所处的活动类型",
+      "activityName": "当前所处的活动名称",
+      "activityAlias": "当前所处的活动别名",
+      "activityDescription": "当前所处的活动描述",
+      "activityArrivedTime": "流程到达当前活动的时间",
+      "serial": "自动编号的值",
+      "splitValue": "当前工作拆分状态下的拆分值",
+      "splitValueList": "Array:多次拆分状态下,每次拆分值数组",
+      "form": "当前工作展现用的表单ID"
     },
     "workCompleted": {
-      "id": "be0195f1-f2e2-4eac-911c-99897a43ff8f",
-      "title": "xx7月北京出差报销审批",
-      "startTime": "2018-09-19 16:14:16",
-      "startTimeMonth": "2018-09",
-      "completedTime": "2018-09-19 16:15:28",
-      "completedTimeMonth": "2018-09",
-      "creatorPerson": "xx@huqi@P",
-      "creatorIdentity": "xx@481c9edc-5fb5-41f1-b5c2-6ea609082cdb@I",
-      "creatorUnit": "xx@c448d8bb-98b8-4305-9d3f-12537723cfcc@U",
-      "creatorUnitLevelName": "浙江兰德纵横/开发部",
-      "application": "1dc23336-6be6-402b-bed6-36e707a1dd17",
-      "applicationName": "财务管理",
-      "applicationAlias": "finance",
-      "process": "2207db11-dddf-4ebd-864d-3819f3e173c6",
-      "processName": "报销审批流程",
-      "processAlias": "",
-      "serial": "",
-      "form": "320be1ca-ee49-478f-a751-f65ab67cf818"
+      "id": "已完成工作的ID标识",
+      "title": "工作标题",
+      "startTime": "创建时间",
+      "startTimeMonth": "工作创建的月份,如:2020-09",
+      "completedTime": "工作结束时间",
+      "completedTimeMonth": "工作结束的月份,如:2020-09",
+      "creatorPerson": "前端脚本中为创建人姓名,如:name;\n服务端脚本中为创建人标识:如:name@unique@P",
+      "creatorPersonDn": "创建人标识:如:name@unique@P\n服务端脚本中不可用",
+      "creatorIdentity": "前端脚本中为创建人身份名称,如:name;\n服务端脚本中为创建人身份标识:如:name@unique@I",
+      "creatorIdentityDn": "创建人身份标识:如:name@unique@I\n服务端脚本中不可用",
+      "creatorUnit": "前端脚本中为创建组织名称,如:name;\n服务端脚本中为创建组织标识:如:name@unique@U",
+      "creatorUnitDn": "创建组织标识:如:name@unique@U\n服务端脚本中不可用U",
+      "creatorUnitLevelName": "创建人组织层次,如:顶层组织/二层组织/三层组织",
+      "application": "应用的ID",
+      "applicationName": "应用的名称",
+      "applicationAlias": "应用的别名",
+      "process": "流程的ID",
+      "processName": "流程的名称",
+      "processAlias": "流程的别名",
+      "serial": "自动编号的值",
+      "form": "当前工作展现用的表单ID"
     },
     "taskList":[],
     "readList":[],
     "control": {
-      "allowVisit": true,
-      "allowProcessing": true,
-      "allowReadProcessing": false,
-      "allowSave": true,
-      "allowReset": false,
-      "allowRetract": false,
-      "allowReroute": false,
-      "allowDelete": true
+      "allowVisit": "boolean:是否允许访问工作",
+      "allowProcessing": "boolean:是否允许流转",
+      "allowReadProcessing": "boolean:是否允许流转",
+      "allowSave": "boolean:是否允许保存",
+      "allowReset": "boolean:是否允许重置处理人",
+      "allowReroute": "boolean:是否允许调度",
+      "allowDelete": "boolean:是否允许删除工作",
+      "allowAddSplit": "boolean:是否允许添加拆分分支",
+      "allowRetract": "boolean:是否允许撤回",
+      "allowRollback": "boolean:是否允许回溯流程",
+      "allowPress": "boolean:是否允许发送办理提醒"
     },
     "task": {
-      "id": "dd476045-7c79-44f7-9dba-f51d322de40f",
-      "title": "XX7月北京出差报销审批",
-      "startTime": "2018-09-27 22:49:22",
-      "startTimeMonth": "2018-09",
-      "work": "854e2c22-718e-48bb-98db-96f4b43e7ee8",
-      "application": "1dc23336-6be6-402b-bed6-36e707a1dd17",
-      "applicationName": "财务管理",
-      "applicationAlias": "finance",
-      "process": "2207db11-dddf-4ebd-864d-3819f3e173c6",
-      "processName": "报销审批流程",
-      "processAlias": "",
-      "serial": "",
-      "person": "XXX@huqi@P",
-      "identity": "XX@481c9edc-5fb5-41f1-b5c2-6ea609082cdb@I",
-      "unit": "XX@c448d8bb-98b8-4305-9d3f-12537723cfcc@U",
-      "activity": "13d15daf-2ac5-4c1b-a669-1607a0e5ed15",
-      "activityName": "部门领导审核",
-      "activityAlias": "",
-      "activityDescription": "",
-      "activityType": "manual",
-      "creatorPerson": "XX@huqi@P",
-      "creatorIdentity": "XX@481c9edc-5fb5-41f1-b5c2-6ea609082cdb@I",
-      "creatorUnit": "XX@c448d8bb-98b8-4305-9d3f-12537723cfcc@U",
-      "expired": false,
-      "urged": false,
-      "routeList": [
-        "89b58fe0-6dcb-4fe7-8c2e-3f77204df6d4",
-        "f3105b7a-2929-4682-aab8-15fef5ea0f23"
-      ],
-      "routeNameList": [
-        "退回申请人",
-        "送财务部门复审"
-      ],
-      "routeOpinionList": [
-        "",
-        ""
-      ]
+      "id": "待办ID",
+      "title": "工作标题",
+      "startTime": "待办产生时间",
+      "startTimeMonth": "待办产生月份,如:2020-09",
+      "work": "工作ID",
+      "application": "应用ID",
+      "applicationName": "应用名称",
+      "applicationAlias": "应用别名",
+      "process": "流程ID",
+      "processName": "流程名称",
+      "processAlias": "流程别名",
+      "serial": "自动编号的值",
+      "person": "前端脚本中为待办人姓名,如:name;\n服务端脚本中为待办人标识:如:name@unique@P",
+      "personDn": "待办人标识:如:name@unique@P\n服务端脚本中不可用",
+      "identity": "前端脚本中为待办人身份名称,如:name;\n服务端脚本中为待办人身份标识:如:name@unique@I",
+      "identityDn": "待办人身份标识:如:name@unique@I\n服务端脚本中不可用",
+      "unit": "前端脚本中为待办人身份所在组织名称,如:name;\n服务端脚本中为待办人身份所在组织标识:如:name@unique@U",
+      "unitDn": "待办人身份所在组织标识:如:name@unique@U\n服务端脚本中不可用",
+      "activity": "当前所处的活动ID",
+      "activityType": "当前所处的活动类型",
+      "activityName": "当前所处的活动名称",
+      "activityAlias": "当前所处的活动别名",
+      "activityDescription": "当前所处的活动描述",
+      "creatorPerson": "前端脚本中为工作创建人姓名,如:name;\n服务端脚本中为工作创建人标识:如:name@unique@P",
+      "creatorPersonDn": "工作创建人标识:如:name@unique@P\n服务端脚本中不可用",
+      "creatorIdentity": "前端脚本中为工作创建人身份名称,如:name;\n服务端脚本中为工作创建人身份标识:如:name@unique@I",
+      "creatorIdentityDn": "工作创建人身份标识:如:name@unique@I\n服务端脚本中不可用",
+      "creatorUnit": "前端脚本中为工作创建组织名称,如:name;\n服务端脚本中为工作创建组织标识:如:name@unique@U",
+      "creatorUnitDn": "工作创建组织标识:如:name@unique@U\n服务端脚本中不可用U",
+      "expired": "boolean:是否超时",
+      "urged": "boolean:是否发送过提醒",
+      "allowRapid": "boolean:是否允许快速处理",
+      "first": "boolean:是否是第一条待办",
+      "routeList": "array:可选路由ID列表",
+      "routeNameList": "array:可选路由名称列表",
+      "routeOpinionList": "array:可选路由默认意见列表",
+      "properties": {
+        "prevTaskIdentity": "上一处理人身份",
+        "prevTaskIdentityList": "array:上一活动处理人身份列表",
+        "prevTask": {
+          "routeName": "上一处理人所选的路由名称",
+          "unit": "上一处理人所属组织",
+          "identity": "上一处理人身份",
+          "person": "上一处理人名称",
+          "opinion": "上一处理人意见",
+          "startTime": "上一处理人待办收到时间",
+          "completedTime": "上一处理人待办处理时间"
+        }
+      }
     },
     "taskCompletedList": {
-      "id": "2aef274c-ec3b-4cb3-882b-6f6c4a2fb6f6",
-      "title": "xx7月北京出差报销审批",
-      "startTime": "2018-09-27 22:49:22",
-      "startTimeMonth": "2018-09",
-      "completedTime": "2018-10-08 22:04:35",
-      "completedTimeMonth": "2018-10",
-      "work": "854e2c22-718e-48bb-98db-96f4b43e7ee8",
-      "completed": false,
-      "application": "1dc23336-6be6-402b-bed6-36e707a1dd17",
-      "applicationName": "财务管理",
-      "applicationAlias": "finance",
-      "process": "2207db11-dddf-4ebd-864d-3819f3e173c6",
-      "processName": "报销审批流程",
-      "processAlias": "",
-      "serial": "",
-      "person": "xx@huqi@P",
-      "identity": "XX@481c9edc-5fb5-41f1-b5c2-6ea609082cdb@I",
-      "unit": "XX@c448d8bb-98b8-4305-9d3f-12537723cfcc@U",
-      "activity": "13d15daf-2ac5-4c1b-a669-1607a0e5ed15",
-      "activityName": "部门领导审核",
-      "activityAlias": "",
-      "activityDescription": "",
-      "activityType": "manual",
-      "creatorPerson": "XX@huqi@P",
-      "creatorIdentity": "XX@481c9edc-5fb5-41f1-b5c2-6ea609082cdb@I",
-      "creatorUnit": "XX@c448d8bb-98b8-4305-9d3f-12537723cfcc@U",
-      "routeName": "退回申请人",
-      "opinion": "退回申请人"
+      "id": "已办ID",
+      "title": "工作标题",
+      "startTime": "对应待办产生时间",
+      "startTimeMonth": "对应待办产生月份,如:2020-09",
+      "completedTime": "产生已办的时间",
+      "completedTimeMonth": "产生已办月份,如:2020-09",
+      "work": "工作ID",
+      "application": "应用ID",
+      "applicationName": "应用名称",
+      "applicationAlias": "应用别名",
+      "process": "流程ID",
+      "processName": "流程名称",
+      "processAlias": "流程别名",
+      "serial": "自动编号的值",
+      "person": "前端脚本中为已办人姓名,如:name;\n服务端脚本中为已办人标识:如:name@unique@P",
+      "personDn": "已办人标识:如:name@unique@P\n服务端脚本中不可用",
+      "identity": "前端脚本中为已办人身份名称,如:name;\n服务端脚本中为已办人身份标识:如:name@unique@I",
+      "identityDn": "已办人身份标识:如:name@unique@I\n服务端脚本中不可用",
+      "unit": "前端脚本中为已办人身份所在组织名称,如:name;\n服务端脚本中为已办人身份所在组织标识:如:name@unique@U",
+      "unitDn": "已办人身份所在组织标识:如:name@unique@U\n服务端脚本中不可用",
+      "activity": "办理时的活动ID",
+      "activityType": "办理时的活动类型",
+      "activityName": "办理时的活动名称",
+      "activityAlias": "办理时的活动别名",
+      "activityDescription": "办理时的活动描述",
+      "creatorPerson": "前端脚本中为工作创建人姓名,如:name;\n服务端脚本中为工作创建人标识:如:name@unique@P",
+      "creatorPersonDn": "工作创建人标识:如:name@unique@P\n服务端脚本中不可用",
+      "creatorIdentity": "前端脚本中为工作创建人身份名称,如:name;\n服务端脚本中为工作创建人身份标识:如:name@unique@I",
+      "creatorIdentityDn": "工作创建人身份标识:如:name@unique@I\n服务端脚本中不可用",
+      "creatorUnit": "前端脚本中为工作创建组织名称,如:name;\n服务端脚本中为工作创建组织标识:如:name@unique@U",
+      "creatorUnitDn": "工作创建组织标识:如:name@unique@U\n服务端脚本中不可用U",
+      "routeName": "办理时所选的决策",
+      "opinion": "办理时的意见"
     },
     "activity": {
-      "id": "13d15daf-2ac5-4c1b-a669-1607a0e5ed15",
-      "name": "部门领导审核",
-      "description": "",
-      "alias": ""
+      "id": "当前活动ID",
+      "name": "当前活动名称",
+      "description": "当前活动描述",
+      "alias": "当前活动别名",
+      "manualMode": "当前活动处理方式"
     },
+    "recordList": [{
+      "__type__": "object array:流程记录列表",
+
+      "id": "记录ID",
+      "application": "应用ID",
+      "process": "流程ID",
+      "job": "工作JOB ID",
+      "work": "工作ID",
+      "completed": "boolean:工作是否流转完成",
+      "display": "boolean:是否应该显示",
+      "properties": {
+        "nextManualList": [{
+          "__type__": "object array:到达人工活动列表",
+
+          "activity": "到达活动ID",
+          "activityType": "到达活动类型",
+          "activityName": "到达活动名称",
+          "activityAlias": "到达活动别名",
+          "taskIdentityList": "array:到达活动处理人身份全称列表"
+
+        }],
+        "nextManualTaskIdentityList": "array:后续活动的所有处理人身份列表",
+        "routeName": "选择的路由名称",
+        "opinion": "意见",
+        "startTime": "记录的开始时间(待办产生时间)",
+        "elapsed": "number:超时时间",
+        "fromGroup": "上一个活动组"
+      },
+      "fromActivity": "上一个活动ID",
+      "fromActivityType": "上一个活动类型",
+      "fromActivityName": "上一个活动名称",
+      "fromActivityAlias": "上一个活动别名",
+      "recordTime": "记录产生时间",
+      "person": "处理人全称",
+      "identity": "处理人身份全称",
+      "unit": "处理人身份所在组织",
+      "type": "记录类型"
+    }],
     "workLogList": [
       {
-        "taskList": [],
+        "__type__": "object array:工作记录列表",
+        "taskList": [{
+          "__type__": "object array:此条记录的待办列表",
+          "id": "待办ID",
+          "startTime": "待办收到时间",
+          "person": "待办人全称",
+          "identity": "待办身份全称",
+          "unit": "待办身份所在组织全称",
+          "activityName": "活动名称",
+          "activityToken": "活动Token0",
+          "properties": {
+            "prevTaskIdentity": "上一办理人身份",
+            "prevTaskIdentityList": "array:上一活动办理人身份列表",
+            "prevTaskList": [
+              {
+                "__type__": "object array:上一活动的待办信息列表",
+                "routeName": "选择的路由名称",
+                "unit": "处理人身份所在组织全称",
+                "identity": "处理人身份全称",
+                "person": "处理人全称",
+                "opinion": "填写的意见",
+                "startTime": "待办收到时间",
+                "completedTime": "待办处理时间"
+              }
+            ],
+            "prevTask": {
+              "routeName": "选择的路由名称",
+              "unit": "处理人身份所在组织全称",
+              "identity": "处理人身份全称",
+              "person": "处理人全称",
+              "opinion": "填写的意见",
+              "startTime": "待办收到时间",
+              "completedTime": "待办处理时间"
+            }
+          }
+        }],
         "taskCompletedList": [
           {
-            "id": "2616b5cd-c7f3-46d2-b415-7e7770c7a2ca",
-            "job": "a884dd5f-e175-4960-915f-4899743a5d7e",
-            "title": "财务培训会报销",
-            "startTime": "2018-08-30 13:11:04",
-            "startTimeMonth": "2018-08",
-            "completedTime": "2018-10-09 13:22:20",
-            "completedTimeMonth": "2018-10",
-            "work": "be1767d2-69ba-4129-b783-7c4b3831117d",
-            "completed": false,
-            "application": "1dc23336-6be6-402b-bed6-36e707a1dd17",
-            "applicationName": "财务管理",
-            "applicationAlias": "finance",
-            "processName": "报销审批流程",
-            "processAlias": "",
-            "process": "2207db11-dddf-4ebd-864d-3819f3e173c6",
-            "serial": "",
-            "person": "程剑@chengjain@P",
-            "identity": "程剑@57c6536b-9b2c-46bd-9490-9746873e87b5@I",
-            "unit": "神州易桥信息服务股份有限公司财务部@a0e95893-9c9f-48ea-95e4-f998a0326bb4@U",
-            "activity": "e31ad938-c495-45a6-8d77-b8a9b61a165b",
-            "activityName": "申请人",
-            "activityAlias": "",
-            "activityDescription": "",
-            "activityType": "manual",
-            "activityToken": "b74f5a95-ce5f-4057-8337-485d96ce3c2d",
-            "creatorPerson": "胡起@huqi@P",
-            "creatorIdentity": "huqi@dc64183a-647e-489f-a6e4-879d3df958cf@I",
-            "creatorUnit": "开发部@kfb@U",
-            "routeName": "送部门领导审核",
-            "opinion": "送部门领导审核",
-            "task": "46ee2268-4c02-498e-856b-8e65afccca4e",
-            "expired": false,
-            "duration": 11771,
-            "processingType": "processing",
-            "createTime": "2018-10-09 13:22:20",
-            "updateTime": "2018-10-09 13:22:20"
+            "__type__": "object array:此条记录的已办列表",
+            "id": "已办的ID",
+            "startTime": "收到时间",
+            "completedTime": "处理时间",
+            "person": "办理人全称",
+            "identity": "办理人身份全称",
+            "unit": "办理人身份所在组织全称",
+            "activityName": "办理时的活动名称",
+            "activityToken": "办理时的活动ID",
+            "routeName": "办理时所选的路由名称",
+            "opinion": "办理时的填写意见",
+            "processingType": "处理方式",
+            "properties": {
+              "prevTaskIdentityList": "array:此条已办的上一活动办理人身份列表",
+              "nextTaskIdentityList": "array:此条已办的下一活动办理人身份列表",
+              "prevTaskList": [
+                {
+                  "__type__": "object array:此条已办的上一活动的待办信息列表",
+                  "routeName": "选择的路由名称",
+                  "unit": "处理人身份所在组织全称",
+                  "identity": "处理人身份全称",
+                  "person": "处理人全称",
+                  "opinion": "填写的意见",
+                  "startTime": "待办收到时间",
+                  "completedTime": "待办处理时间"
+                }
+              ],
+              "prevTask": {
+                "routeName": "选择的路由名称",
+                "unit": "处理人身份所在组织全称",
+                "identity": "处理人身份全称",
+                "person": "处理人全称",
+                "opinion": "填写的意见",
+                "startTime": "待办收到时间",
+                "completedTime": "待办处理时间"
+              }
+            }
           }
         ],
-        "readList": [],
-        "readCompletedList": [],
-        "id": "c43431d8-f66d-429e-8ecc-32b506a52df0",
-        "job": "a884dd5f-e175-4960-915f-4899743a5d7e",
-        "work": "be1767d2-69ba-4129-b783-7c4b3831117d",
-        "completed": false,
-        "fromActivity": "e31ad938-c495-45a6-8d77-b8a9b61a165b",
-        "fromActivityType": "manual",
-        "fromActivityName": "申请人",
-        "fromActivityAlias": "",
-        "fromActivityToken": "b74f5a95-ce5f-4057-8337-485d96ce3c2d",
-        "fromTime": "2018-08-30 13:11:04",
-        "arrivedActivity": "13d15daf-2ac5-4c1b-a669-1607a0e5ed15",
-        "arrivedActivityType": "manual",
-        "arrivedActivityName": "部门领导审核",
-        "arrivedActivityToken": "60aa8a8e-6fc2-4d76-8b19-ebe7f68d9691",
-        "arrivedTime": "2018-10-09 13:22:20",
-        "application": "1dc23336-6be6-402b-bed6-36e707a1dd17",
-        "applicationName": "财务管理",
-        "process": "2207db11-dddf-4ebd-864d-3819f3e173c6",
-        "processName": "报销审批流程",
-        "route": "85272e6d-4fda-4cba-aa93-84f964138981",
-        "routeName": "送部门领导审核",
-        "connected": true,
-        "duration": 11771,
-        "splitting": false,
-        "createTime": "2018-08-30 13:11:04",
-        "updateTime": "2018-10-09 13:22:20"
+        "readList": "array:待阅列表",
+        "readCompletedList": "array:已阅列表",
+        "nextTaskIdentityList": "array:后续处理人身份列表",
+        "nextTaskCompletedIdentityList": "array:后续已办理完成处理人身份列表",
+        "id": "工作记录ID",
+        "fromActivity": "前置活动ID",
+        "fromActivityType": "前置活动类型",
+        "fromActivityName": "前置活动名称",
+        "fromActivityAlias": "前置活动别名",
+        "fromActivityToken": "前置记录的Token",
+        "fromTime": "到达前置活动的时间",
+        "arrivedActivity": "到达活动ID",
+        "arrivedActivityType": "到达活动类型",
+        "arrivedActivityName": "到达活动名称",
+        "arrivedActivityToken": "到达活动记录Token",
+        "arrivedTime": "到达活动的时间",
+        "route": "所选路由ID",
+        "routeName": "所选路由名称",
+        "connected": "boolean:此条记录是否已经连接(已有前置活动和到达活动的信息)",
+        "splitting": "boolean:此条记录是否在拆分状态"
       }
     ],
 
     "attachmentList": [
       {
-        "id": "56c4e86f-a4c8-4cc2-a150-1a0d2c5febcb",
-        "name": "133203a2-92e6-4653-9954-161b72ddb7f9.png",
-        "extension": "png",
-        "length": 43864,
-        "person": "xx@huqi@P",
-        "lastUpdateTime": "2018-09-27 15:50:34",
-        "lastUpdatePerson": "xx@huqi@P",
-        "activity": "e31ad938-c495-45a6-8d77-b8a9b61a165b",
-        "activityName": "申请人",
-        "activityType": "manual",
-        "site": "$mediaOpinion",
-        "type": "image/png"
+        "__type__": "object array:文档附件列表",
+        "control": {
+          "allowRead": "boolean:附件是否允许查看",
+          "allowEdit": "boolean:附件是否允许编辑",
+          "allowControl": "boolean:附件是否允许管理"
+        },
+        "id": "附件ID",
+        "name": "附件名称",
+        "extension": "附件扩展名",
+        "length": "number:附件大小",
+        "workCreateTime": "工作创建时间",
+        "application": "应用ID",
+        "process": "流程ID",
+        "job": "工作JOB的ID",
+        "person": "附件上传的用户全称",
+        "lastUpdateTime": "附件最后修改时间",
+        "lastUpdatePerson": "附件最后修改人全称",
+        "activity": "上传附件的活动ID",
+        "activityName": "上传附件的活动名称",
+        "activityType": "上传附件的活动类型",
+        "activityToken": "上传附件的活动Token",
+        "site": "附件位置标识",
+        "type": "附件content-type类型",
+        "readIdentityList": "array:允许访问附件的身份列表",
+        "readUnitList": "array:允许访问附件的组织列表",
+        "editIdentityList": "array:允许编辑附件的身份列表",
+        "editUnitList": "array:允许编辑附件的组织列表",
+        "controllerIdentityList": "array:允许管理附件的身份列表",
+        "controllerUnitList": "array:允许管理附件的组织列表",
+        "divisionList": []
       }
     ]
   }
-}
+}

+ 253 - 179
o2web/source/o2_core/o2/widget/JavascriptEditor.js

@@ -19,6 +19,7 @@ o2.widget.JavascriptEditor = new Class({
 		this.setOptions(options);
 		this.unbindEvents = [];
 		this.node = $(node);
+		this.id = o2.uuid();
 	},
     getDefaultEditorData: function(){
 	    switch (this.options.type) {
@@ -147,11 +148,11 @@ o2.widget.JavascriptEditor = new Class({
                 }.bind(this));
 
 
-                o2.widget.JavascriptEditor.getCompletionEnvironment(this.options.runtime, function(){
+                //o2.widget.JavascriptEditor.getCompletionEnvironment(this.options.runtime, function(){
                     this.monacoModel = this.editor.getModel();
                     this.monacoModel.o2Editor = this;
                     this.registerCompletion();
-                }.bind(this));
+                //}.bind(this));
 
                 this.fireEvent("postLoad");
                 if (callback) callback();
@@ -228,9 +229,9 @@ o2.widget.JavascriptEditor = new Class({
                     this.setFontSize( this.fontSize );
                 }
 
-                o2.widget.JavascriptEditor.getCompletionEnvironment(this.options.runtime, function(){
+                //o2.widget.JavascriptEditor.getCompletionEnvironment(this.options.runtime, function(){
                     this.registerCompletion();
-                }.bind(this));
+                //}.bind(this));
 
                 this.fireEvent("postLoad");
                 if (callback) callback();
@@ -238,7 +239,6 @@ o2.widget.JavascriptEditor = new Class({
         }.bind(this));
     },
     registerCompletion: function(){
-
         if (this.editor){
             switch (this.options.type.toLowerCase()) {
                 case "ace": this.registerCompletionAce(); break;
@@ -247,47 +247,86 @@ o2.widget.JavascriptEditor = new Class({
         }
     },
 
-    getCompletionObject: function(textPrefix, runtime){
-        var macro = o2.widget.JavascriptEditor.runtimeEnvironment[runtime];
-        var o = null;
-        if (macro){
-            prefix = ["(", "{", ""];
-            code = "try {return "+textPrefix+";}catch(e){return null;}";
-            o = macro.exec(code);
+    filterRangeScript: function(s, f1, f2){
+        var textScript = "";
+        var n = 0;
+        for (var i=s.length-1; i>=0; i--){
+            var char = s.charAt(i);
+            if (char==f2) n++;
+            if (char==f1){
+                n--;
+                if (n<0) break;
+            }
+            textScript = char+textScript;
         }
-        return o;
+        return textScript;
+    },
+
+    getCompletionObject: function(textPrefix, preCode, range, runtime, callback){
+        textPrefix = this.filterRangeScript(textPrefix, "(", ")");
+        textPrefix = this.filterRangeScript(textPrefix, "{", "}");
+        textPrefix = this.filterRangeScript(textPrefix, "[", "]");
+
+        if (textPrefix.lastIndexOf("=")!=-1) textPrefix = textPrefix.substr(textPrefix.lastIndexOf("=")+1);
+        if (textPrefix.lastIndexOf(" new ")!=-1) textPrefix = textPrefix.substr(textPrefix.lastIndexOf(" new ")+5);
+
+        var codeObj = {
+            "code": textPrefix,
+            "preCode": preCode,
+            "runtime": runtime,
+            "id": this.id,
+            "type": this.options.type,
+            "range": range
+        }
+
+        return o2.JSEditorCWE.exec(codeObj, callback);
     },
     registerCompletionMonaco: function(){
         if (!o2.widget.monaco.registeredCompletion){
             monaco.languages.registerCompletionItemProvider('javascript', {
                 "triggerCharacters": ["."],
                 provideCompletionItems: function (model, position, context, token) {
-                    debugger;
                     var textUntilPosition = model.getValueInRange({ startLineNumber: position.lineNumber, startColumn: 1, endLineNumber: position.lineNumber, endColumn: position.column });
                     var textPrefix = textUntilPosition.substr(0, textUntilPosition.lastIndexOf("."));
 
-
-                    var o = this.getCompletionObject(textPrefix, model.o2Editor.options.runtime);
-
-                    var word = model.getWordUntilPosition(position);
-                    var range = { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, startColumn: word.startColumn, endColumn: word.endColumn };
-
-                    if (o) {
-                        var arr = [];
-                        Object.keys(o).each(function (key) {
-                            var keyType = typeOf(o[key]);
-                            if (keyType === "function") {
-                                var count = o[key].length;
-                                var v = key + "(";
-                                for (var i = 1; i <= count; i++) v += (i == count) ? "par" + i : "par" + i + ", ";
-                                v += ")";
-                                arr.push({ label: key, kind: monaco.languages.CompletionItemKind.Function, insertText: v, range: range, detail: keyType });
-                            } else {
-                                arr.push({ label: key, kind: monaco.languages.CompletionItemKind.Interface, insertText: key, range: range, detail: keyType });
-                            }
-                        });
+                    if (textPrefix){
+                        var preCode = "";
+                        var endLineNumber = (position.lineNumber>1) ? position.lineNumber-1 : 0;
+                        if (endLineNumber>0){
+                            var range = {
+                                endColumn: model.getLineMaxColumn(endLineNumber),
+                                endLineNumber: endLineNumber,
+                                startColumn: 1,
+                                startLineNumber: 1
+                            };
+                            var preCode = model.getValueInRange(range);
+                        }
+
+                        var word = model.getWordUntilPosition(position);
+                        var insertRange = { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, startColumn: word.startColumn, endColumn: word.endColumn };
+
+                        return new Promise(function(s){
+                            this.getCompletionObject(textPrefix, preCode, insertRange, model.o2Editor.options.runtime, function(o){
+
+                                // if (o) {
+                                //     var arr = [];
+                                //     Object.keys(o).each(function (key) {
+                                //         var keyType = typeOf(o[key]);
+                                //         if (keyType === "function") {
+                                //             var count = o[key].length;
+                                //             var v = key + "(";
+                                //             for (var i = 1; i <= count; i++) v += (i == count) ? "par" + i : "par" + i + ", ";
+                                //             v += ")";
+                                //             arr.push({ label: key, kind: monaco.languages.CompletionItemKind.Function, insertText: v, range: range, detail: keyType });
+                                //         } else {
+                                //             arr.push({ label: key, kind: monaco.languages.CompletionItemKind.Interface, insertText: key, range: range, detail: keyType });
+                                //         }
+                                //     });
+                                // }
+                                s({suggestions: o});
+                            }.bind(this));
+                        }.bind(this));
                     }
-                    return {suggestions: arr}
                 }.bind(this)
             });
             o2.widget.monaco.registeredCompletion = true;
@@ -299,27 +338,31 @@ o2.widget.JavascriptEditor = new Class({
             var exports = ace.require("ace/ext/language_tools");
             exports.addCompleter({
                 identifierRegexps: [
-                    /[a-zA-Z_0-9\$\-\u00A2-\uFFFF\.]/
+                    /[a-zA-Z_0-9\$\-\u00A2-\uFFFF]/
                 ],
                 getCompletions: function(editor, session, pos, prefix, callback){
-                    var x = prefix.substr(0, prefix.lastIndexOf("."));
-                    var o = this.getCompletionObject(x, editor.o2Editor.options.runtime);
-
-                    if (o){
-                        var arr = [];
-                        Object.keys(o).each(function(key){
-                            var keyType = typeOf(o[key]);
-                            if (keyType==="function") {
-                                var count = o[key].length;
-                                var v = x+"."+key+"(";
-                                for (var i=1; i<=count; i++) v+= (i==count) ? "par"+i :  "par"+i+", ";
-                                v+=");";
-                                arr.push({ caption: key, value: v, score: 3, meta: keyType });
-                            }else{
-                                arr.push({ caption: key, value: x+"."+key, score: 3, meta: keyType });
-                            }
-                        });
-                        callback(null, arr);
+                    debugger;
+                    var codeRange = session.getWordRange(pos.row, 0);
+                    codeRange.setEnd(pos.row, pos.column);
+                    var x = session.getTextRange(codeRange);
+                    x = x.substr(0, x.lastIndexOf("."));
+
+                    if (x){
+                        var endLineNumber = (pos.row>0) ? pos.row-1 : -1;
+                        var preCode = "";
+
+                        if (endLineNumber>-1){
+                            var range = session.getWordRange(0,0);
+                            range.setEnd(endLineNumber, session.getLine(endLineNumber).length);
+                            preCode = session.getTextRange(range);
+                        }
+
+                        return new Promise(function(s){
+                            this.getCompletionObject(x, preCode, null, editor.o2Editor.options.runtime, function(o){
+                                callback(null, o);
+                                if (s) s(o);
+                            }.bind(this));
+                        }.bind(this));
                     }
                 }.bind(this)
             });
@@ -571,132 +614,163 @@ o2.widget.JavascriptEditor = new Class({
     }
 });
 
-o2.widget.JavascriptEditor.runtimeEnvironment = {};
-o2.widget.JavascriptEditor.getCompletionEnvironment = function(runtime, callback) {
-
-    if (!o2.widget.JavascriptEditor.runtimeEnvironment[runtime]) {
-        o2.require("o2.xScript.Macro", function() {
-            switch (runtime) {
-                case "service":
-                    o2.widget.JavascriptEditor.getServiceCompletionEnvironment(runtime,callback);
-                    break;
-                case "server":
-                    o2.widget.JavascriptEditor.getServerCompletionEnvironment(runtime,callback);
-                    break;
-                case "all":
-                    o2.widget.JavascriptEditor.getAllCompletionEnvironment(runtime,callback);
-                    break;
-                default:
-                    o2.widget.JavascriptEditor.getDefaultCompletionEnvironment(runtime,callback);
-            }
-        });
-    } else {
-        if (callback) callback();
-    }
-};
-
-o2.widget.JavascriptEditor.getServiceCompletionEnvironment = function(runtime, callback) {
-    //var serviceScriptText = null;
-    var serviceScriptSubstitute = null;
-    var check = function () {
-        //if (o2.typeOf(serviceScriptText) !== "null" && o2.typeOf(serviceScriptSubstitute) !== "null") {
-        if (o2.typeOf(serviceScriptSubstitute) !== "null") {
-            //var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serviceScriptSubstitute + "\n" + serviceScriptText + "\nreturn bind;" + "\n};";
-            var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serviceScriptSubstitute + "\nreturn bind;" + "\n};";
-            Browser.exec(code);
-            var ev = o2.Macro.swapSpace.tmpMacroCompletionFunction() ;
-            o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = {
-                "environment": ev,
-                exec: function(code){
-                    return o2.Macro.exec(code, this.environment);
-                }
-            }
-            if (callback) callback();
-        }
-    }
-
-    // o2.xhr_get("../x_desktop/js/initialServiceScriptText.js", function (xhr) {
-    //     serviceScriptText = xhr.responseText;
-    //     check();
-    // }, function () {
-    //     serviceScriptText = "";
-    //     check();
-    // });
-    o2.xhr_get("../x_desktop/js/initalServiceScriptSubstitute.js", function (xhr) {
-        serviceScriptSubstitute = xhr.responseText;
-        check();
-    }, function () {
-        serviceScriptSubstitute = "";
-        check();
-    });
-};
-
-o2.widget.JavascriptEditor.getServerCompletionEnvironment = function(runtime, callback) {
-   //var serverScriptText = null;
-    var serverScriptSubstitute = null;
-    var check = function () {
-        // if (o2.typeOf(serverScriptText) !== "null" && o2.typeOf(serverScriptSubstitute) !== "null") {
-        //     var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serverScriptSubstitute + "\n" + serverScriptText + "\nreturn bind;" + "\n};";
-        if (o2.typeOf(serverScriptSubstitute) !== "null") {
-            var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serverScriptSubstitute + "\nreturn bind;" + "\n};";
-            Browser.exec(code);
-            var ev = o2.Macro.swapSpace.tmpMacroCompletionFunction();
-            o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = {
-                "environment": ev,
-                exec: function(code){
-                    return o2.Macro.exec(code, this.environment);
-                }
+// o2.widget.JavascriptEditor.runtimeEnvironment = {};
+// o2.widget.JavascriptEditor.getCompletionEnvironment = function(runtime, callback) {
+//
+//     if (!o2.widget.JavascriptEditor.runtimeEnvironment[runtime]) {
+//         o2.require("o2.xScript.Macro", function() {
+//             switch (runtime) {
+//                 case "service":
+//                     o2.widget.JavascriptEditor.getServiceCompletionEnvironment(runtime,callback);
+//                     break;
+//                 case "server":
+//                     o2.widget.JavascriptEditor.getServerCompletionEnvironment(runtime,callback);
+//                     break;
+//                 case "all":
+//                     o2.widget.JavascriptEditor.getAllCompletionEnvironment(runtime,callback);
+//                     break;
+//                 default:
+//                     o2.widget.JavascriptEditor.getDefaultCompletionEnvironment(runtime,callback);
+//             }
+//         });
+//     } else {
+//         if (callback) callback();
+//     }
+// };
+//
+// o2.widget.JavascriptEditor.getServiceCompletionEnvironment = function(runtime, callback) {
+//     //var serviceScriptText = null;
+//     var serviceScriptSubstitute = null;
+//     var check = function () {
+//         //if (o2.typeOf(serviceScriptText) !== "null" && o2.typeOf(serviceScriptSubstitute) !== "null") {
+//         if (o2.typeOf(serviceScriptSubstitute) !== "null") {
+//             //var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serviceScriptSubstitute + "\n" + serviceScriptText + "\nreturn bind;" + "\n};";
+//             var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serviceScriptSubstitute + "\nreturn bind;" + "\n};";
+//             Browser.exec(code);
+//             var ev = o2.Macro.swapSpace.tmpMacroCompletionFunction() ;
+//             o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = {
+//                 "environment": ev,
+//                 exec: function(code){
+//                     return o2.Macro.exec(code, this.environment);
+//                 }
+//             }
+//             if (callback) callback();
+//         }
+//     }
+//
+//     // o2.xhr_get("../x_desktop/js/initialServiceScriptText.js", function (xhr) {
+//     //     serviceScriptText = xhr.responseText;
+//     //     check();
+//     // }, function () {
+//     //     serviceScriptText = "";
+//     //     check();
+//     // });
+//     o2.xhr_get("../x_desktop/js/initalServiceScriptSubstitute.js", function (xhr) {
+//         serviceScriptSubstitute = xhr.responseText;
+//         check();
+//     }, function () {
+//         serviceScriptSubstitute = "";
+//         check();
+//     });
+// };
+//
+// o2.widget.JavascriptEditor.getServerCompletionEnvironment = function(runtime, callback) {
+//    //var serverScriptText = null;
+//     var serverScriptSubstitute = null;
+//     var check = function () {
+//         // if (o2.typeOf(serverScriptText) !== "null" && o2.typeOf(serverScriptSubstitute) !== "null") {
+//         //     var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serverScriptSubstitute + "\n" + serverScriptText + "\nreturn bind;" + "\n};";
+//         if (o2.typeOf(serverScriptSubstitute) !== "null") {
+//             var code = "o2.Macro.swapSpace.tmpMacroCompletionFunction = function (){\n" + serverScriptSubstitute + "\nreturn bind;" + "\n};";
+//             Browser.exec(code);
+//             var ev = o2.Macro.swapSpace.tmpMacroCompletionFunction();
+//             o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = {
+//                 "environment": ev,
+//                 exec: function(code){
+//                     return o2.Macro.exec(code, this.environment);
+//                 }
+//             }
+//             if (callback) callback();
+//         }
+//     }
+//
+//     // o2.xhr_get("../x_desktop/js/initialScriptText.js", function (xhr) {
+//     //     serverScriptText = xhr.responseText;
+//     //     check();
+//     // }, function () {
+//     //     serverScriptText = "";
+//     //     check();
+//     // });
+//     o2.xhr_get("../x_desktop/js/initalScriptSubstitute.js", function (xhr) {
+//         serverScriptSubstitute = xhr.responseText;
+//         check();
+//     }, function () {
+//         serverScriptSubstitute = "";
+//         check();
+//     });
+// };
+//
+// o2.widget.JavascriptEditor.getDefaultCompletionEnvironment = function(runtime, callback){
+//     var json = null;
+//     o2.getJSON("../o2_core/o2/widget/$JavascriptEditor/environment.json", function (data) {
+//         json = data;
+//         o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = new o2.Macro.FormContext(json);
+//         if (callback) callback();
+//     });
+// }
+//
+// o2.widget.JavascriptEditor.getAllCompletionEnvironment = function(runtime, callback){
+//     var check = function(){
+//         if (o2.widget.JavascriptEditor.runtimeEnvironment["service"] && o2.widget.JavascriptEditor.runtimeEnvironment["server"] && o2.widget.JavascriptEditor.runtimeEnvironment["web"] ){
+//         //if (o2.widget.JavascriptEditor.runtimeEnvironment["web"] ){
+//             var ev = Object.merge(o2.widget.JavascriptEditor.runtimeEnvironment["service"].environment,
+//                 o2.widget.JavascriptEditor.runtimeEnvironment["server"].environment,
+//                 o2.widget.JavascriptEditor.runtimeEnvironment["web"].environment)
+//
+//             //var ev = o2.widget.JavascriptEditor.runtimeEnvironment["web"].environment;
+//
+//             o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = {
+//                 "environment": ev,
+//                 exec: function(code){
+//                     return o2.Macro.exec(code, this.environment);
+//                 }
+//             }
+//             if (callback) callback();
+//         }
+//     }
+//     o2.widget.JavascriptEditor.getServiceCompletionEnvironment("service", check);
+//     o2.widget.JavascriptEditor.getServerCompletionEnvironment("server", check);
+//     o2.widget.JavascriptEditor.getDefaultCompletionEnvironment("web", check);
+//
+// }
+
+o2.widget.JavascriptEditor.completionWorkerEnvironment = o2.JSEditorCWE = {
+    init: function(){
+        this.callbackPool = {};
+        this.scriptWorker = new Worker("../o2_core/scriptWorker.js");
+        this.scriptWorker.onmessage = function(e) {
+            if (e.data && e.data.type=="ready") this.setOnMessage();
+        }.bind(this);
+        return this;
+    },
+    setOnMessage: function(){
+        this.scriptWorker.onmessage = function(e) {
+            var o = e.data;
+            if (o){
+                var bo = this.callbackPool[o.id];
+                if (bo.uuid==o.uuid) if (bo.callback) bo.callback(o.o);
             }
-            if (callback) callback();
-        }
-    }
-
-    // o2.xhr_get("../x_desktop/js/initialScriptText.js", function (xhr) {
-    //     serverScriptText = xhr.responseText;
-    //     check();
-    // }, function () {
-    //     serverScriptText = "";
-    //     check();
-    // });
-    o2.xhr_get("../x_desktop/js/initalScriptSubstitute.js", function (xhr) {
-        serverScriptSubstitute = xhr.responseText;
-        check();
-    }, function () {
-        serverScriptSubstitute = "";
-        check();
-    });
-};
-
-o2.widget.JavascriptEditor.getDefaultCompletionEnvironment = function(runtime, callback){
-    var json = null;
-    o2.getJSON("../o2_core/o2/widget/$JavascriptEditor/environment.json", function (data) {
-        json = data;
-        o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = new o2.Macro.FormContext(json);
-        if (callback) callback();
-    });
-}
-
-o2.widget.JavascriptEditor.getAllCompletionEnvironment = function(runtime, callback){
-    var check = function(){
-        if (o2.widget.JavascriptEditor.runtimeEnvironment["service"] && o2.widget.JavascriptEditor.runtimeEnvironment["server"] && o2.widget.JavascriptEditor.runtimeEnvironment["web"] ){
-        //if (o2.widget.JavascriptEditor.runtimeEnvironment["web"] ){
-            var ev = Object.merge(o2.widget.JavascriptEditor.runtimeEnvironment["service"].environment,
-                o2.widget.JavascriptEditor.runtimeEnvironment["server"].environment,
-                o2.widget.JavascriptEditor.runtimeEnvironment["web"].environment)
-
-            //var ev = o2.widget.JavascriptEditor.runtimeEnvironment["web"].environment;
-
-            o2.widget.JavascriptEditor.runtimeEnvironment[runtime] = {
-                "environment": ev,
-                exec: function(code){
-                    return o2.Macro.exec(code, this.environment);
-                }
+        }.bind(this);
+    },
+    exec: function(o, callback){
+        if (this.scriptWorker){
+            var uuid = o2.uuid();
+            o.uuid = uuid;
+            this.callbackPool[o.id] = {
+                "callback": callback,
+                "uuid": uuid
             }
-            if (callback) callback();
+            this.scriptWorker.postMessage(o);
         }
     }
-    o2.widget.JavascriptEditor.getServiceCompletionEnvironment("service", check);
-    o2.widget.JavascriptEditor.getServerCompletionEnvironment("server", check);
-    o2.widget.JavascriptEditor.getDefaultCompletionEnvironment("web", check);
-
-}
+}.init();

+ 1 - 0
o2web/source/o2_core/o2/xDesktop/Actions/RestActions.js

@@ -69,6 +69,7 @@ MWF.xDesktop.Actions.RestActions = new Class({
         MWF.restful(method, uri, data, callback, async, credentials);
     },
 	invoke: function(option){
+        if (window.importScripts && window.isCompletionEnvironment) return null;
         if (!this.address) this.getAddress();
         var res = null;
         this.getActions(function(){

+ 2 - 2
o2web/source/o2_core/o2/xScript/Macro.js

@@ -20,11 +20,11 @@ MWF.xScript.Macro = MWF.Macro = {
         if (o2.session.isDebugger){
             var f = "MWF.Macro.scriptSpace[\""+o+"\"] = function(){\n"+code+"\n}";
             Browser.exec(f);
-            returnValue = o2.Macro.scriptSpace[o].apply(bind);
+            returnValue = (o2.Macro.scriptSpace[o]) ? o2.Macro.scriptSpace[o].apply(bind) : null;
         }else{
             var f = "MWF.Macro.scriptSpace[\""+o+"\"] = function(){try{\n"+code+"\n}catch(e){console.error(e)}}";
             Browser.exec(f);
-            returnValue = o2.Macro.scriptSpace[o].apply(bind);
+            returnValue = (o2.Macro.scriptSpace[o]) ? o2.Macro.scriptSpace[o].apply(bind) : null;
         }
         o2.Macro.scriptSpace[o] = null;
 

+ 89 - 23
o2web/source/o2_core/scriptWorker.js

@@ -267,34 +267,98 @@ layout.addReady(function(){
         });
     };
 
-    _worker.getMonacoCompletions = function(o){
+    _worker.getMonacoCompletions = function(o, range, code){
         var arr = [];
+        o = (o2.typeOf(o)=="array") ? o[0] : o;
         Object.keys(o).each(function (key) {
-            var keyType = typeOf(o[key]);
-            if (keyType === "function") {
-                var count = o[key].length;
-                var v = key + "(";
-                for (var i = 1; i <= count; i++) v += (i == count) ? "par" + i : "par" + i + ", ";
-                v += ")";
-                arr.push({ label: key, kind: 1, insertText: v, detail: keyType });
-            } else {
-                arr.push({ label: key, kind: 7, insertText: key, detail: keyType });
+            if (key!="__type__"){
+                var keyType = typeOf(o[key]);
+                var oRange = Object.clone(range);
+                switch (keyType){
+                    case "function":
+                        var count = o[key].length;
+                        var v = key + "(";
+                        for (var i = 1; i <= count; i++) v += (i == count) ? "par" + i : "par" + i + ", ";
+                        v += ")";
+                        key = key+"()";
+                        arr.push({ label: key, kind: 1, insertText: v, detail: keyType, range: oRange });
+                        break;
+                    default:
+                        var insertText = key;
+                        var filterText = key;
+                        var kind = 3;
+                        if (o[key]){
+                            var text = (keyType=="array" &&  o[key][0]["__type__"]) ?  o[key][0]["__type__"] : o[key].toString();
+                            var flagCount = text.indexOf(":");
+                            if (flagCount!=-1){
+                                keyType = text.substr(0,flagCount);
+                                text = text.substr(flagCount+1);
+                            }
+                            var oType = (o["__type__"]) ? o["__type__"].substr(0, o["__type__"].indexOf(":")) : o2.typeOf(o);
+                            if (oType=="object array"){
+                                if (code.substr(-1)!=="]"){
+                                    insertText =  "[0]."+key;
+                                    oRange.startColumn = oRange.startColumn-1;
+                                }
+                                filterText="."+filterText;
+                            }
+                        }
+                        switch (keyType){
+                            case "array":
+                                kind = 15;
+                                key = key+"[]";
+                                break;
+                            case "object array":
+                                kind = 15;
+                                key = key+"[]";
+                                break;
+                        }
+                        arr.push({ label: key, filterText: filterText, key, kind: kind, insertText: insertText, detail: keyType, documentation: text, range: oRange});
+                }
             }
         });
         return arr;
     };
-    _worker.getAceCompletions = function(o){
+    _worker.getAceCompletions = function(o, range, code){
         var arr = [];
+        o = (o2.typeOf(o)=="array") ? o[0] : o;
         Object.keys(o).each(function(key){
-            var keyType = typeOf(o[key]);
-            if (keyType==="function") {
-                var count = o[key].length;
-                var v = x+"."+key+"(";
-                for (var i=1; i<=count; i++) v+= (i==count) ? "par"+i :  "par"+i+", ";
-                v+=")";
-                arr.push({ caption: x+"."+key, value: v, score: 3, meta: keyType, type: keyType, docText: o[key] });
-            }else{
-                arr.push({ caption: x+"."+key, value: x+"."+key, score: 3, meta: keyType, type: keyType, docText: o[key] });
+            if (key!="__type__"){
+                var keyType = typeOf(o[key]);
+                var oRange = (range) ? Object.clone(range): null;
+                var offset = 0;
+                switch (keyType){
+                    case "function":
+                        var count = o[key].length;
+                        var v = key + "(";
+                        for (var i = 1; i <= count; i++) v += (i == count) ? "par" + i : "par" + i + ", ";
+                        v += ")";
+                        key = key+"()";
+                        arr.push({ caption: key, value: v, score: 3, meta: keyType, type: keyType, docText: key });
+                        break;
+                    default:
+                        var insertText = key;
+                        var filterText = key;
+                        var kind = 3;
+                        if (o[key]){
+                            var text = (keyType=="array" &&  o[key][0]["__type__"]) ?  o[key][0]["__type__"] : o[key].toString();
+                            var flagCount = text.indexOf(":");
+                            if (flagCount!=-1){
+                                keyType = text.substr(0,flagCount);
+                                text = text.substr(flagCount+1);
+                            }
+                            var oType = (o["__type__"]) ? o["__type__"].substr(0, o["__type__"].indexOf(":")) : o2.typeOf(o);
+                            if (oType=="object array"){
+                                if (code.substr(-1)!=="]"){
+                                    insertText =  "[0]."+key;
+                                    offset = -1;
+                                }
+                                filterText="."+filterText;
+                            }
+                        }
+                        if (keyType=="array" || keyType=="object array") key = key+"[]";
+                        arr.push({ caption: key, value: insertText, score: 3, meta: keyType, type: keyType, docText: text, offset: offset });
+                }
             }
         });
         return arr;
@@ -348,7 +412,8 @@ layout.addReady(function(){
         }
     };
 
-    _worker.exec = function(id, uuid, code, preCode, runtime, type){
+    _worker.exec = function(id, uuid, code, preCode, range, runtime, type){
+        var codeText = code;
         var promise = _worker.getCompletionEnvironment(runtime);
         promise.then(function(){
             _worker.overwriteRequest();
@@ -361,7 +426,7 @@ layout.addReady(function(){
                 code = "try {\n"+code+"\n}catch(e){return null;}";
                 var o = _worker.runtimeEnvironment[runtime].exec(code);
                 if (o) {
-                    var completions = (type=="ace") ? _worker.getAceCompletions(o) : _worker.getMonacoCompletions(o);
+                    var completions = (type=="ace") ? _worker.getAceCompletions(o, range, codeText) : _worker.getMonacoCompletions(o ,range, codeText);
                     _worker.postMessage({"o": completions, "id": id, "uuid": uuid});
                 }
             }
@@ -377,8 +442,9 @@ onmessage = function(e) {
         var runtime = e.data.runtime;
         var type = e.data.type;
         var preCode = e.data.preCode;
+        var range = e.data.range;
         if (id && code && runtime && uuid && type){
-            _worker.exec(id, uuid, code, preCode, runtime, type)
+            _worker.exec(id, uuid, code, preCode, range, runtime, type)
         }
     }
 }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
o2web/source/o2_lib/ace/src-min-noconflict/ext-language_tools.js


+ 5 - 1
o2web/source/o2_lib/mootools/mootools-1.6.0_all.js

@@ -23,6 +23,10 @@ provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
 
 ...
 */
+
+if (window.Request){
+	window.NativeRequest = window.Request;
+}
 /*! MooTools: the javascript framework. license: MIT-style license. copyright: Copyright (c) 2006-2015 [Valerio Proietti](http://mad4milk.net/).*/
 (function(){
 
@@ -6933,7 +6937,7 @@ Element.Events.load = {
 };
 
 // This is based on the custom load event
-window.addEvent('load', function(){
+if (window) window.addEvent('load', function(){
 	loaded = true;
 });
 

+ 9 - 9
o2web/source/x_component_portal_ScriptDesigner/Main.js

@@ -724,15 +724,15 @@ MWF.xApplication.portal.ScriptDesigner.Main = new Class({
                     }.bind(this));
                 }
             };
-            if (!this.scriptHelpMenu){
-                MWF.require("MWF.widget.ScriptHelp", function(){
-                    this.scriptHelpMenu = new MWF.widget.ScriptHelp($("MWFScriptAutoCode"), this.script.editor);
-                    this.scriptHelpMenu.getEditor = function(){
-                        if (this.scriptTab.showPage) return this.scriptTab.showPage.script.editor.editor;
-                        return null;
-                    }.bind(this)
-                }.bind(this));
-            }
+            // if (!this.scriptHelpMenu){
+            //     MWF.require("MWF.widget.ScriptHelp", function(){
+            //         this.scriptHelpMenu = new MWF.widget.ScriptHelp($("MWFScriptAutoCode"), this.script.editor);
+            //         this.scriptHelpMenu.getEditor = function(){
+            //             if (this.scriptTab.showPage) return this.scriptTab.showPage.script.editor.editor;
+            //             return null;
+            //         }.bind(this)
+            //     }.bind(this));
+            // }
 		}.bind(this));
 	},
 

+ 8 - 6
o2web/source/x_desktop/js/base.js

@@ -406,9 +406,11 @@ o2.addReady(function () {
     // layout.desktop.load = layout.load;
 
     //兼容方法
-    Element.implement({
-        "makeLnk": function (options) { }
-    });
+    if (window.Element){
+        Element.implement({
+            "makeLnk": function (options) { }
+        });
+    }
     layout.desktop.addEvent = function (type, e, d) {
         window.addEvent(type, e, d);
     };
@@ -416,10 +418,10 @@ o2.addReady(function () {
         window.addEvents(e);
     };
 
-    var loadingNode = $("loaddingArea");
+    var loadingNode = (window.$) ? $("loaddingArea") : null;
     var loadeds = 0;
     var loadCount = 4;
-    var size = document.body.getSize();
+    var size = (window.document && document.body) ? document.body.getSize() : null;
     var _closeLoadingNode = function () {
         if (loadingNode) {
             loadingNode.destroy();
@@ -683,7 +685,7 @@ o2.addReady(function () {
     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;

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác