(function (){ var paths = [ ]; for (var i=0,pi;pi = paths[i++];) { document.write(''); } })(); var baseServices = angular.module( "baseServices", ["authApp",'ComplexService'] ); baseServices.factory("$jsonToFormData",function() { function transformRequest( data, getHeaders ) { var headers = getHeaders(); headers["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8"; return $.param(data); } return( transformRequest ); }) .directive('htCheckbox', function() { return { restrict: 'A', link: function(scope, element, attrs) { var key = attrs["htCheckbox"]; var getValAry = function(){ var val = getValByScope(element,key); if(val){ if(typeof val == "string"){ return {type:"string",data:val.split(",")}; } else{ return {type:"object",data:val}; } } return {type:"string",data:[]}; }; scope.$watch(key,function(newVal,oldVal){ if(!newVal)return; if(newVal!==oldVal || !element.data("notFirstTime")){ element.data("notFirstTime",true); if(typeof newVal == "string"){ if(newVal==element.val()||newVal.split(",").indexOf(element.val())!=-1){ element[0].checked = true; } else{ element[0].checked = false; } } else{ if(newVal.indexOf(element.val())!=-1){ element[0].checked = true; } else{ element[0].checked = false; } } } },false); element.bind('change',function(){ var elementVal = element[0].checked, option = attrs["value"], array = getValAry(); if(elementVal){ if(!isInArray(array.data,option)){ array.data.push(option); } } else{ array.data.remove(option); } if(array.data.length > 1){ array.data.remove(""); } else if(array.data.length == 0){ array.data.push(""); } if(array.type=="string"){ setValToScope(element,array.data.join(','),null,key); } else{ setValToScope(element,array.data,null,key); } }); } }; }) .provider('DemotionPermission',function(){ //是否需要权限降级 var _demotion = false; this.setDemotion = function(t){ _demotion = !!t; } this.$get = function(){ return { demotion : _demotion }; } }) /** * 表单权限控制 */ .directive('htPermission', ['$compile','DemotionPermission',function($compile,DemotionPermission) { return { priority:5, link:function(scope,elm,attrs){ scope.handlerPermission = function(newVal,el,attr){ //需要权限降级时 将必填、编辑 权限降级为只读 if(DemotionPermission.demotion){ if(newVal!="y"||newVal!="r"){ newVal = "r"; } } var ngModel=attr.ngModel,scopeVal = ''; if(el.attr("type") == "subGroupTr"){ scope.subFieldPermission(newVal,el); } else if(el.attr("type") == "subGroup"){ scope.subFieldPermission(newVal,el); }else { scopeVal= getValByScope(el,ngModel,scope) || ''; scope.fieldPermission(newVal,el,scopeVal); } }; scope.$watch(attrs.htPermission,function(newVal,oldVal){ if(!newVal)return; if (newVal !== oldVal || !elm.data("notFirstTime")) { elm.data("notFirstTime", true); if((attrs.htSelectorDef&&parseToJson(attrs.htSelectorDef)['showCurrent'])||(elm.hasClass("selector-home")&&attrs.selectorType)) window.setTimeout(function(){ scope.handlerPermission(newVal,elm,attrs); },100); else scope.handlerPermission(newVal,elm,attrs); } }); /** * 复合字段(子表)权限 */ scope.subFieldPermission = function(val,elm){ switch (val) { case 'b': //必填 var temp = attrs.htPermission.split("."), ngModel = "data."+temp[temp.length-1]; scope.$watch(ngModel.replaceAll("\\$\\$","."),function(n,o){ if(n.length==0){ elm.addClass("field-home"); elm.validMe({text:"",rule:"{'required':true}"}); }else{ elm.qtipSuccess(); } },true); break; case 'r': //只读 var inputList = elm.find("[ht-permission]"); inputList.each(function(){ var scopeVal = getValByScope($(this),"",""); $(this).after(""+scopeVal+""); $(this).remove(); }); elm.children(".group-title").find("a[ng-click]").remove(); elm.children(".owner-div").find("a[ng-click]").remove(); break; case 'y': //隐藏 elm.remove(); break; default://编辑没修改(w) break; } }; /** * 字段权限 */ function setToReadCall(elm,scopeVal){ if(isComplexTag(elm)){ elm.parent().html(""+scopeVal+""); }else if(elm.hasClass("file-div")){ if(scopeVal){ elm.next().remove(); elm.next().remove(); var temp = []; for(var i =0 ;i"+scopeVal[i].fileName+""); } elm.after(""+temp.join(",")+""); }else{ elm.closest(".s-closest").remove(); } }else{ elm.after(""+scopeVal+""); } elm.remove(); } function setToRead(elem,scopeVal){ if(scopeVal){ setToReadCall(elem,scopeVal); return; } var showCuEl = elem.attr("selector-def-div"); if(!showCuEl){ setToReadCall(elem,scopeVal); return; } showCuEl = parseToJson(showCuEl); if(!showCuEl.showCurrent){ setToReadCall(elem,scopeVal); return; } window.setTimeout(function(){ setToRead(elem,getValByScope(elem)); },1000); } scope.fieldPermission = function(val,elm,scopeVal){ var elmParent = elm.parent(); switch (val) { case 'b': //必填 //让字段必填 ht-field-valid="{'required':true}" var tempValid = elm.attr("ht-field-valid"); if(tempValid){ tempValid = parseToJson(tempValid); }else{ tempValid = {}; elm.addClass("field-home"); } tempValid.required=true; var ngModelVal = elm.attr("ng-model"); elm.removeAttr("ng-model"); elm.attr("ht-field-valid",JSON.stringify(tempValid)); $compile(elm)(elm.scope()); ngModelVal&&elm.attr("ng-model",ngModelVal); break; case 'r': //只读 setToRead(elm,scopeVal); break; case 'y': //隐藏 if(isComplexTag(elm)||elm.attr("ht-file")){ elm = elm.closest(".field-home"); elm.prev('th').remove(); }else{ elm.parent().prev('th').remove(); } var closestTR = elm.closest("tr") ; var closestSubGroup = elm.closest("[type='subGroup']") ; var tdths=closestTR.children(); elm.remove(); var isNull = true; tdths.each(function(){ if($(this).html()){ isNull=false; return true; } }); if(isNull) closestTR.remove(); //如果是子表,那么当字表中的tbody为空时 就隐藏 if(closestSubGroup[0]&&!closestSubGroup.find('tbody').html()) closestSubGroup.remove(); break; default://编辑没修改(w) break; } }; //在需要权限降级时,如果没有配置字段权限,默认为只读权限 if(DemotionPermission.demotion){ scope.handlerPermission('r',elm,attrs); } } }; }]) .directive('htDate', function() { return { restrict: 'A', link: function(scope, element, attrs) { var ngModel = attrs.ngModel; switch(attrs.htDate){ case "date": $(element).on("focus",function(){ var me = $(this); WdatePicker({dateFmt:'yyyy-MM-dd',alwaysUseStartDate:true}); me.blur(); scope.$apply(function(){ eval("(scope." + ngModel + "='" + me.val() + "')"); }); }); break; case "datetime": $(element).on("focus",function(){ var me = $(this); WdatePicker({dateFmt:'yyyy-MM-dd',alwaysUseStartDate:true}); me.blur(); scope.$apply(function(){ eval("(scope." + ngModel + "='" + me.val() + "')"); }); }); break; case "wdateTime": $(element).on("focus",function(){ var me = $(this), dateFmt= (me.attr('datefmt')?me.attr('datefmt'):'yyyy-MM-dd'); WdatePicker({dateFmt:dateFmt,alwaysUseStartDate:true}); me.blur(); scope.$apply(function(){ eval("(scope." + ngModel + "='" + me.val() + "')"); }); }); break; } } }; }) /** * 对时间进行格式化处理 控件格式如下 * * currentTime:表示是否显示当前日期 * exp:格式化表达式 */ .directive('htDateFormat', function($injector) { var link = function(scope, element, attrs, $ctrl) { var json = parseToJson(attrs['htDateFormat']); element.addClass("dateformat"); if(json.currentTime){ var now=new Date().Format(json.exp); setValToScope(element,now); } }; return { restrict : 'A', require : "ngModel", compile : function() { return link; } }; }) .directive('htDic', function(){ return { restrict: 'EAC', require : "ngModel", link: function(scope, element, attrs) { if(!attrs.htDic)return; scope.$watch(attrs.ngModel,function(newVal,oldVal){ if (newVal !== oldVal || !element.data('dictionary')) { element.data('dictionary', true); scope.update(newVal); } },false); //ngModel的值变化 与 数据字典的初始化 是两条生命周期线,要进行赋值需要在两者都完成的时候进行 scope.update = function(val){ var dicReady = element.data("dictionaryReady"); if(typeof dicReady=='undefined'){ element.data("dictionaryReady",(typeof val=='undefined')?true:val); } else{ var relVal = (typeof val=='undefined')?dicReady:val; element.combotree("clear"); //选中数据字典中key与ngModel值相同的节点 element.eachComboNode(function(node){ if(node.key&&node.key==relVal){ element.combotree('setValue',node.id); return false; } return true; }); } } var url = __ctx +"/platform/system/dataDict/getByTypeKeyForComBo.ht?typeKey="+attrs.htDic; element.combotree({ url:url, onLoadSuccess:function(node,data){ scope.update(); }, onClick:function(node){ setValToScope(element,node.key); } }); } }; }) .directive('htFileUpload', [function() { return { restrict: 'EAC', scope:{ htFileUpload:'=' }, link: function(scope, element, attrs) { scope.choose = function(){ UploadDialog(scope.setting); } scope.download = function(item){ window.open(__ctx + "/platform/system/file/download.ht?id="+item.id); } //移除某项 scope.remove = function(index){ scope.file.splice(index,1); scope.updateValue(false); } scope.updateValue = function(digest){ var v = scope.file.length==0?"":angular.toJson(scope.file); //更新数据到父作用域 if("ng"==scope.setting.bindType){ var ngModel = attrs['ngModel']; if(!ngModel)return; eval('scope.$parent.' + ngModel + '=' + (v?v:"''")); digest&&scope.$parent.$digest(); } //更新数据到对象元素 else if("jq"==scope.setting.bindType){ if(!scope.bindObj)return; scope.bindObj.val(v); } } var setting = { download:true, //true:允许下载,false:不允许下载 bindType:'ng' //ng:ng-model模式,jq:jquery模式,jq模式下需要配置bind属性 }; if($.extend(true,setting,scope.htFileUpload||{})){ scope.setting = setting; scope.setting.callback = function(data){ !angular.isArray(scope.file)&&(scope.file==[]); scope.file = scope.file.concat(data); scope.updateValue(true); } if("ng"==scope.setting.bindType){ var ngModel = attrs['ngModel']; if(!ngModel)return; scope.$parent.$watch(ngModel,function(newVal,oldVal){ if (newVal !== oldVal || !element.data('file')) { element.data('file', true); scope.file = newVal || []; } },false); } else if("jq"==scope.setting.bindType){ var bindObj = angular.element(scope.setting.bind); if(!bindObj)return; scope.bindObj = bindObj; scope.file = parseToJson(bindObj.val()||''); } } }, template: '
' +'{{item.name}}{{item.name}}' +'' +'
上传
', replace: true }; }]) /** * ht-select-ajax 动态加载select的options数据 * 列如: * 传入参数 * url : 请求地址 * field : formTypeList 对应于 ng-options 中的 formTypeList (两者必须相同) */ .directive('htSelectAjax', function($injector) { return { restrict: 'A', link: function(scope, element, attrs) { var BaseService = $injector.get("BaseService"); var option=attrs["htSelectAjax"]; option=eval("("+option+")"); if(scope.$root.$$childHead[option.field]) return; BaseService.get(option.url,function(data){ if(option.dataRoot){ data = data[option.dataRoot]; } scope[option.field] = data; scope.$root.$$childHead[option.field] = scope[option.field]; }); } }; }) .directive('htTip', function($injector) { return { restrict: 'A', scope:{ htTip:"=" }, link: function(scope, element, attrs) { var defaultSetting = { hide: { event:'mouseleave', leave: false, fixed:true, delay:100 }, style: { classes: 'qtip-default qtip qtip-bootstrap qtip-shadow' } }; var setting = angular.extend(scope.htTip || {},defaultSetting); element.qtip(setting); } }; }) .directive('htZtree', ['BaseService',function(BaseService) { return { restrict: 'A', scope:{ htZtree:"=", htCallback:"=", htDataKey:"=", htCheck:"=" }, link: function(scope, element, attrs) { element.addClass("ztree"); if(!element.prop("id")){ //ztree所在ul标签必须有唯一的id属性,否则当页面有两个ztree时回调函数会出现问题 element.prop("id",BaseService.guid()); } scope.setting = { view:{ dblClickExpand:false }, data:{ key:scope.htDataKey||{} }, check:scope.htCheck||{}, callback: scope.htCallback||{} }; scope.$watch("htZtree",function(newVal,oldVal){ if(newVal!==oldVal){ $.fn.zTree.init($(element),scope.setting, newVal); } },true); } }; }]) .directive('htBindHtml', function($compile) { return { restrict : 'A', link : function(scope, elm, attrs) { scope.unbindWatch = scope.$watch(attrs.htBindHtml, function(newVal, oldVal) { if (newVal !== oldVal) { if(newVal){ elm.data('unbindWatchTag',true); elm.html(newVal); scope.htmlFn&&scope.htmlFn.call(); $compile(elm)(scope); } else{ elm.html(''); //避免重复添加监视 elm.data('unbindWatchTag')&&scope.unbindWatch(); } } }); } }; }) .directive('htInit', function($compile) { return { restrict : 'A', link : function(scope, elm, attrs) { var json = parseToJson(attrs["htInit"]); for(var i in json){ setValToScope(null,json[i],null,i,scope); } } }; }) //显示用户的指令,使用示例: .directive('htUserTag', ["BaseService",function(BaseService) { return { restrict : 'A', scope:{ //userId htUserTag:"=", }, controller: function($scope,$element){ $scope.showDetail = function(userId){ new UserInfoDialog(userId).show(); } }, link : function(scope, elm, attrs) { if(scope.htUserTag){ BaseService.post(__ctx + "/platform/org/user/userInfo.ht",{id:scope.htUserTag},function(data){ scope.user = data; }); } }, template:'{{user.name}}', replace:true }; }]) .directive('onFinishRenderFilters', function ($timeout) { return { restrict: 'A', link: function(scope, element, attr) { if (scope.$last === true) { $timeout(function() { scope.$emit('ngRepeatFinished'); }); } } }; }) .service('BaseService', ['$http','$jsonToFormData', function($http,$jsonToFormData) { var service = { get:function(url,callback){ $http.get(url).success(function(data,status){ if(callback){ callback(data,status); } }) .error(function(data,status){ if(callback){ callback(data,status); } //TODO 根据返回的错误状态(status)显示对应的全局提示 }); }, post:function(url,param,callback){ $http.post(url,param,{transformRequest:$jsonToFormData}) .success(function(data,status){ if(callback){ callback(data,status); } }) .error(function(data,status){ if(callback){ callback(data,status); } //TODO 根据返回的错误状态(status)显示对应的全局提示 }); }, //m内容,b:true->alert输出;false:console show:function(m,b){ if(b==null||b==false){ console.info(m); }else{ alert(m+""); } }, //生成ID guid:function(){ return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); } }; return service; }]) .filter('isEmpty', function () { var bar = ""; return function (obj) { for (bar in obj) { if (obj.hasOwnProperty(bar)) { return false; } } return true; }; }) .filter('htTime', function () { //毫秒转换成 **天**小时**分**秒的格式 return function (input) { var day = (input / 1000 / 60 / 60 / 24) << 0 hour = (input / 1000 / 60 /60) % 24 << 0, min = (input / 1000 / 60) % 60 << 0, sec = Math.round((input / 1000) % 60), result = []; if(day){ result.push(day + '天'); } if(hour){ result.push(hour+'小时'); } if(min){ result.push(min+'分'); } if(!isNaN(sec)&&sec){ result.push(sec+'秒'); } return result.join(''); }; });