UNPKG

nooljs

Version:

Full stack JavaScript framework created top of Nodejs, express, and Socket-io, and Angularjs

54 lines 16.5 kB
// nooljsclient.js 0.1.0 // Copyright (c) 2016 Chandru(Puva) Krishnar <chandru0507@gmail.com> // MIT var nooljs=angular.module('nooljs',[]);nooljs.factory('nlSocket',function($rootScope){var socket=io.connect(location.origin);return{on:function(event,callback){socket.on(event,function(){var args=arguments;$rootScope.$apply(function(){callback.apply(socket,args)})})},emit:function(event,data,callback){socket.emit(event,data,function(){var args=arguments;$rootScope.$apply(function(){callback.apply(socket,args)})})}}});nooljs.factory('nlStorage',function(){return{set:function(type,name,value){var storage={};if(type=="localStorage"&&localStorage) storage=localStorage;else if(type=="sessionStorage"&&sessionStorage) storage=sessionStorage;else return;storage.setItem(name,JSON.stringify(value))},get:function(name){var value=sessionStorage.getItem(name);if(!value){value=localStorage.getItem(name)} return value&&JSON.parse(value)},remove:function(name){sessionStorage.removeItem(name);localStorage.removeItem(name)},clear:function(type){var storage={};if(type=="localStorage"&&localStorage) storage=localStorage;else if(type=="sessionStorage"&&sessionStorage) storage=sessionStorage;else return;storage.clear()}}});nooljs.factory('nlServerMethods',['httpService','nlUtil',function(httpService,nlUtil){return{exec:function() {var callback=undefined;var methodName=undefined;var args=[];for(var i=0;i<arguments.length;i++){args.push(arguments[i])} methodName=args.shift();if(arguments.length>0){if(typeof(arguments[arguments.length-1])=="function") {callback=args.pop()}} if(getWebsocketUsedfromAttrs()){nlSocket.emit("nlServerMethod",JSON.stringify(args),function(data){postProcessCallback(attrs,dbAttr,elemType,JSON.parse(data))})} else{return httpService.execServerMethod(methodName,JSON.stringify(args))}}}}]);nooljs.factory('nlUtil',function($http,nlStorage){var _useWebsocket=!1;var getWebsocketUsedfromAttrs=function(attrs){if(attrs&&attrs.nlWebsocket){if(attrs.nlWebsocket=="true") return!0;return!1} return _useWebsocket} return{getWebsocketUsedfromAttrs:getWebsocketUsedfromAttrs,isWebsocket:function(){return _useWebsocket},useWebsocket:function(useWebsocketFlag){_useWebsocket=useWebsocketFlag},getValue:function($scope,varName,checkParent=!0,checkChildren=!1,scopeIds){if(!scopeIds){scopeIds=[]} if(scopeIds.includes($scope.$id)) return null;scopeIds.push($scope.$id);var vars=varName.split(".");var value=null;for(var i=0;i<vars.length;i++){if(i==0){var temp=$scope;value=temp[vars[i]];if((value==undefined||value==null)&&$scope._childrenScope){for(let ii=0;ii<$scope._childrenScope.length&&(value==undefined||value==null);ii++){value=this.getValue($scope._childrenScope[ii],varName,!1,!1,scopeIds)}} while((value==undefined||value==null)&&temp.$parent&&checkParent==!0){temp=temp.$parent;value=this.getValue(temp,varName,!1,!1,scopeIds)}}else{if(value) value=value[vars[i]]}} if(value==undefined) value=null;return value},serverProcess:function($scope,elem,attrs,httpService,nlStorage,$compile,elemType,preClickType,postClientType,nlSocket){let dbAttr=JSON.parse(attrs[elemType]);let nlDbModel=(attrs.nlDbModel)?attrs.nlDbModel:dbAttr.md;return this.serverCoreProcess($scope,elem,attrs,httpService,nlStorage,$compile,elemType,attrs[preClickType],attrs[postClientType],dbAttr,nlDbModel,nlSocket)},serverCoreProcess:function($scope,elem,attrs,httpService,nlStorage,$compile,elemType,preClientFun,postClientFun,dbAttr,nlDbModel,nlSocket){that=this;if(preClientFun){var script=preClientFun+"($scope)";var result=$scope.$nlScriptObj[preClientFun]($scope);if(result==!1) return} var data=[];for(var i=0;(dbAttr.p&&i<dbAttr.p.length);i++){var scopeName=dbAttr.p[i];if(scopeName!="_error"){value={name:scopeName,value:this.getValue($scope,scopeName)};data.push(value)}};elemType=(elemType=='nlDynDbData')?'nlDbData':elemType;var postProcessCallback=function(attrs,dbAttr,elemType,data,nlSocket){var error=data.error;if(error){$scope.$root._error=error;return} else{$scope.$root._error={}} data=data.data;if(nlDbModel){if(nlDbModel.indexOf("[")>0){let indexStr=nlDbModel.substring(nlDbModel.indexOf("[")+1,nlDbModel.indexOf("]"));let mainModel=nlDbModel.substring(0,nlDbModel.indexOf("["));if(!$scope[mainModel]) $scope[mainModel]={};$scope[mainModel][indexStr]=(dbAttr.md)?data[dbAttr.md]:data} else{$scope[nlDbModel]=(dbAttr.md)?data[dbAttr.md]:data}} if(elemType=="nlDbLogin"||elemType=="nlServerLogin"){if(data._userKey_&&data.user){nlStorage.set("sessionStorage","_userKey_",data._userKey_);$scope.$root.user=data.user}} if(elemType=="nlServerLogout"){nlStorage.remove("_userKey_");nlStorage.clear("sessionStorage");var targetId=(attrs)?attrs.targetId:null;that.getLayOut($scope,elem,attrs,httpService,$compile,data.url,"",nlSocket,targetId);return} if(postClientFun){var script=postClientFun+"($scope)";$scope.$nlScriptObj[postClientFun]($scope)} if(attrs.nlRedirect){var redirect=JSON.parse(attrs.nlRedirect.replace(/'/g,"\""));if(((elemType=="nlDbLogin"&&data._userKey_)||elemType!="nlDbLogin")&&((!redirect.cond)||$scope.$eval(redirect.cond))){$(".modal").modal('hide');var targetId=(attrs)?attrs.targetId:null;that.getLayOut($scope,elem,attrs,httpService,$compile,redirect.url,redirect.params,nlSocket,targetId)}}} if(data&&data._error) data._error=undefined;var useWebSocket=getWebsocketUsedfromAttrs(attrs);if(useWebSocket){var cacheName="data_"+dbAttr.t+"_"+elemType+"_"+dbAttr.m;var result=nlStorage.get(cacheName);if(result) return result;var _userKey_=nlStorage.get("_userKey_");var reqData={"type":elemType,"method":dbAttr.m,"data":data,"_userKey_":_userKey_,"template":dbAttr.t};nlSocket.emit("nlServerData",reqData,function(data){postProcessCallback(attrs,dbAttr,elemType,JSON.parse(data),nlSocket)})}else{httpService.postData(dbAttr.t,elemType,dbAttr.m,data).then(function(data){postProcessCallback(attrs,dbAttr,elemType,data,nlSocket)})}},getLayOut:function($scope,elem,attrs,httpService,$compile,layoutName,params,nlSocket,targetId){that=this;var layoutCallback=function($scope,elem,attrs,$compile,layoutName,params,data){var error=data.error;if(error){$scope.$root._error=error;console.log(" %s layout load errror %s %s",layoutName,error.code,error.message);return}else{$scope.$root._error={}} data=data.layout;var spos=data.indexOf("<nl-client-script");var epos=data.indexOf("</nl-client-script");var newScope=$scope;if(spos>=0&&epos>0){var sspos=data.indexOf(">",spos);var scriptdata=data.substring(sspos+1,epos);if(newScope.scriptData) newScope.$nlScriptData+=' '+scriptdata;else newScope.$nlScriptData=scriptdata;newScope.$nlScriptObj=eval(("x="+scriptdata));data=data.substring(0,spos)} var spos=data.indexOf("<nl-template");var epos=data.indexOf(">",spos);var nlTemplateAttrs=data.substring(spos+"<nl-template".length,epos);var parentElemName=targetId;if(!targetId){var spos=nlTemplateAttrs.indexOf("nl-parent=");spos=nlTemplateAttrs.indexOf("\"",spos);epos=nlTemplateAttrs.indexOf("\"",spos+1);parentElemName=nlTemplateAttrs.substring(spos+1,epos)} nlStorage.set("sessionStorage","layout_"+parentElemName.trim(),layoutName);var spos=0;spos=data.indexOf('ng-model="{{',spos);while(spos>0){var endpos=data.indexOf('}}',spos);var dyModel=data.substring(spos+12,endpos);var realModel=that.getValue($scope,dyModel);data=data.substring(0,spos+10)+realModel+data.substring(endpos+2);spos=data.indexOf('ng-model="{{',spos)} var pelem=angular.element(document.getElementById(parentElemName));pelem.html(data).show();if(params){for(var name in params){let value=that.getValue($scope,name);newScope[name]=(value==null&&value==undefined)?params[name]:value}} spos=nlTemplateAttrs.indexOf("nl-load=");if(spos>0){spos=nlTemplateAttrs.indexOf("\"",spos);epos=nlTemplateAttrs.indexOf("\"",spos+1);var loadFunction=nlTemplateAttrs.substring(spos+1,epos);if(newScope.$nlScriptObj[loadFunction]){newScope.$nlScriptObj[loadFunction](newScope)} else{console.log("Error : function "+loadFunction+" for the template "+layoutName+" not available.")}} $compile(pelem.contents())(newScope)} var useWebSocket=getWebsocketUsedfromAttrs(attrs);if(useWebSocket) {var _userKey_=nlStorage.get("_userKey_");var reqData={"name":layoutName,"_userKey_":_userKey_};nlSocket.emit("nlLayout",reqData,function(data){layoutCallback($scope,elem,attrs,$compile,layoutName,params,JSON.parse(data))})} else{httpService.getLayout(layoutName).then(function(data){layoutCallback($scope,elem,attrs,$compile,layoutName,params,data)})}}}});nooljs.factory('httpService',function($http,nlStorage){return{getLayout:function(layoutName){var result=nlStorage.get(layoutName);if(result) return result;var _userKey_=nlStorage.get("_userKey_");return $http({url:'/getLayout',method:"POST",data:$.param({"name":layoutName,"_userKey_":_userKey_}),headers:{'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}}).then(function(result){return result.data})},execServerMethod:function(methodName,args){var _userKey_=nlStorage.get("_userKey_");return $http({url:'/execServerMethod',method:"POST",data:$.param({"method":methodName,"args":args,"_userKey_":_userKey_}),headers:{'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}}).then(function(result){return result.data})},postData:function(template,type,serverMethod,data,nlCache){var cacheName="data_"+template+"_"+type+"_"+serverMethod;var result=nlStorage.get(cacheName);if(result) return result;var _userKey_=nlStorage.get("_userKey_");return $http({url:'/serverFunctions',method:"POST",data:$.param({"type":type,"method":serverMethod,"data":data,"_userKey_":_userKey_,"template":template}),headers:{'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}}).then(function(result){if(result.data&&result.data.data&&nlCache) nlStorage.set(nlCache,cacheName,result.data.data);return result.data})},getData:function(type,serverMethod,data,nlCache){var cacheName="data_"+template+"_"+type+"_"+serverMethod;var result=nlStorage.get(cacheName);return $http({url:'/Serverfunctions',method:"GET",data:$.param({"type":type,"method":serverMethod,"data":data}),headers:{'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}}).then(function(result){if(result.data&&result.data&&nlCache) nlStorage.set(nlCache,cacheName,result.data.data);return result.data})}}});nooljs.directive('nlDefaultTemplate',['httpService','nlUtil','$compile','nlSocket','nlStorage',function(httpService,nlUtil,$compile,nlSocket,nlStorage){console.log("nlDefaultTemplate Directive was run");return{restrict:'A',link:function($scope,elem,attrs){function init(){var layout=nlStorage.get('layout_'+attrs.id);if((!layout)||layout.length==0) layout=attrs.nlDefaultTemplate;nlUtil.getLayOut($scope,elem,attrs,httpService,$compile,layout,null,nlSocket,attrs.id)};init()}}}]);nooljs.directive('nlTemplate',['$compile','nlSocket',function($compile,nlSocket){return{restrict:'E',scope:!0,require:['^?nlDbLogin','nlTemplate'],controller:function($scope){console.log("nlTemplate controller was called");nlSocket.on('alert',function(data){console.log("alert from server ..."+data)})},link:function($scope,elem,attrs,ctrl){}}}]);nooljs.directive('nlDialog',['$compile',function($compile){console.log("nlDialog Directive was run");return{restrict:'A',scope:!0,controller:function($scope){},link:function($scope,elem,attrs,ctrl){$("body").append(elem)}}}]);nooljs.directive('nlDbData',['httpService','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlUtil,nlStorage,$compile,nlSocket){console.log("nlDbData Directive was run");return{restrict:'A',link:function($scope,elem,attrs){function int(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlDbData','nlClientPreData','nlClientPostData',nlSocket)};int()}}}]);nooljs.directive('nlDynDbData',['httpService','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlUtil,nlStorage,$compile,nlSocket){console.log("nlDynDbData Directive was run");return{restrict:'A',link:function($scope,elem,attrs){function int(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlDynDbData','nlClientPreData','nlClientPostData',nlSocket)};int()}}}]);nooljs.directive('nlServerData',['httpService','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlUtil,nlStorage,$compile,nlSocket){return{restrict:'A',link:function($scope,elem,attrs){function int(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlServerData','nlClientPreData','nlClientPostData',nlSocket)};int()}}}]);nooljs.directive('nlServerClick',['httpService','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlUtil,nlStorage,$compile,nlSocket){console.log("nlServerClick Directive was run");return{restrict:'A',link:function($scope,elem,attrs){function int(){$scope.clickingCallback=function(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlServerClick','nlClientPreClick','nlClientPostClick',nlSocket)};elem.bind('click',$scope.clickingCallback)};int()}}}]);nooljs.directive('nlReportServerChange',['httpService','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlUtil,nlStorage,$compile,nlSocket){console.log("nlServerClick Directive was run");return{restrict:'A',controller:function($scope,$element){$scope.changeEvent=function(){$scope.changeCallback()}},link:function($scope,elem,attrs){function int(){$scope.changeCallback=function(){let model=attrs.nlModel?attrs.nlModel:attrs.ngModel;let queries=$scope._filters[model];let preClientFun=attrs.nlReportServerChange;if(preClientFun){var result=$scope.$nlScriptObj[preClientFun]($scope);if(result==!1) return} for(let i=0;i<queries.length;i++){let postClientFun=queries[i].postClientFun;let elmType=queries[i].attrName;let dbAttr=queries[i].obj;let nlDbModel=queries[i].model?queries[i].model:dbAttr.md;let elScope=queries[i].elScope?queries[i].elScope:$scope;nlUtil.serverCoreProcess(elScope,elem,attrs,httpService,nlStorage,$compile,elmType,null,postClientFun,dbAttr,nlDbModel,nlSocket)}};elem.bind('change',$scope.changeCallback)};int()}}}]);nooljs.directive('nlDbClick',['httpService','nlStorage','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlStorage,nlUtil,$compile,nlSocket){return{restrict:'A',require:"^nlTemplate",link:function($scope,elem,attrs,nlTemplateCtrl){function int(){$scope.clickingCallback=function(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlDbClick','nlDbClientPreClick','nlClientPostClick',nlSocket)};elem.bind('click',$scope.clickingCallback)};int()}}}]);nooljs.directive('nlClickRedirect',['httpService','nlUtil','nlStorage','$compile','nlSocket',function(httpService,nlUtil,nlStorage,$compile,nlSocket){return{restrict:'A',require:"^nlTemplate",link:function($scope,elem,attrs,nlTemplateCtrl){function int(){$scope.clickingCallback=function(){var url=JSON.parse(attrs.nlClickRedirect.replace(/'/g,"\""));nlUtil.getLayOut($scope,elem,attrs,httpService,$compile,url.url,url.params,nlSocket,url.targetId)};elem.bind('click',$scope.clickingCallback)};int()}}}]);nooljs.directive('nlDbLogin',['httpService','nlStorage','nlUtil','$compile','nlSocket',function(httpService,nlStorage,nlUtil,$compile,nlSocket){return{restrict:'A',require:"^nlTemplate",link:function($scope,elem,attrs,nlTemplateCtrl){{function int(){$scope.clickingCallback=function(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlDbLogin','nlClientPreLogin','nlClientPostLogin',nlSocket)};elem.bind('click',$scope.clickingCallback)};int()}}}}]);nooljs.directive('nlServerLogin',['httpService','nlStorage','nlUtil','$compile','nlSocket',function(httpService,nlStorage,nlUtil,$compile,nlSocket){return{restrict:'A',require:"^nlTemplate",link:function($scope,elem,attrs,nlTemplateCtrl){{function int(){$scope.clickingCallback=function(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlServerLogin','nlClientPreLogin','nlClientPostLogin',nlSocket)};elem.bind('click',$scope.clickingCallback)};int()}}}}]);nooljs.directive('nlServerLogout',['httpService','nlStorage','nlUtil','$compile','nlSocket',function(httpService,nlStorage,nlUtil,$compile,nlSocket){return{restrict:'A',require:"^nlTemplate",link:function($scope,elem,attrs,nlTemplateCtrl){{function int(){$scope.clickingCallback=function(){nlUtil.serverProcess($scope,elem,attrs,httpService,nlStorage,$compile,'nlServerLogout','nlClientPreLogout','nlClientPostLogout',nlSocket)};elem.bind('click',$scope.clickingCallback)};int()}}}}])