free-jqgrid
Version:
grid as jQuery plugin - fork of jqGrid before licensing change
11 lines • 18 kB
JavaScript
/**
* @license OData plugin for Free-jqGrid
*
* Copyright (c) 2014-2018, Mark Babayev (https://github.com/mirik123) markolog@gmail.com
* License MIT (MIT-LICENSE.txt)
*
* inspired by Richard Bennett gist code: jqGrid.ODataExtensions.js
* https://gist.github.com/dealproc/6678280
*/
!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery","free-jqgrid/grid.base"],a):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e||window)),require("free-jqgrid/grid.base"),a(t),t}:a(jQuery)}(function(b){"use strict";b.jgrid.odataHelper={resolveJsonReferences:function(e,i){var l,d,s={};for(i=i||[],"string"==typeof e&&(e=JSON.parse(e)),e=function e(t,a,r){if("object"!=typeof t||!t)return t;if("[object Array]"===Object.prototype.toString.call(t)){for(l=0;l<t.length;l++){if("object"!=typeof t[l]||!t[l])return t[l];t[l].$ref?t[l]=e(t[l],l,t):t[l]=e(t[l],a,t)}return t}if(t.$ref)return d=t.$ref,s[d]?s[d]:void i.push([r,a,d]);if(t.$id){var n,o=t.$id;if(delete t.$id,t.$values)t=t.$values.map(e);else for(n in t)t.hasOwnProperty(n)&&(t[n]=e(t[n],n,t));s[o]=t}return t}(e),l=0;l<i.length;l++)(d=i[l])[0][d[1]]=s[d[2]];return e},convertXmlToJson:function(e){var t,a,r,n,o,i,l={};if(!e)return null;if(1===e.nodeType){if(0<e.attributes.length)for(l["@attributes"]={},a=0;a<e.attributes.length;a++)r=e.attributes.item(a),l["@attributes"][r.nodeName]=r.nodeValue}else 3===e.nodeType?l=e.nodeValue:e.nodeType||(l=e);if(e.hasChildNodes&&e.hasChildNodes())for(t=0;t<e.childNodes.length;t++){if(3===(n=e.childNodes.item(t)).nodeType)return n.nodeValue;void 0===l[o=n.nodeName]?l[o]=b.jgrid.odataHelper.convertXmlToJson(n):(void 0===l[o].push&&(i=l[o],l[o]=[],l[o].push(i)),l[o].push(b.jgrid.odataHelper.convertXmlToJson(n)))}return b.isEmptyObject(l)?null:l},parseMetadata:function(e,t){var a,s,u,c,p,r;switch(t){case"xml":u={},c=[],p={},r=b("Schema",s=e).attr("Namespace")+".",b("EntityContainer EntitySet",s).each(function(e,t){u[b(t).attr("EntityType").replace(r,"")]=b(t).attr("Name"),c.push(b(t).attr("Name"))}),b("EntityType, ComplexType",s).each(function(){var a,e,t,r,n,o,i,l,d;e=b(this).find("Property,NavigationProperty"),t=b("Key PropertyRef",this),r=t&&0<t.length?t.first().attr("Name"):"",l=b(this).attr("Name"),e&&(a=[],e.each(function(e,t){d={},b.each(t.attributes,function(){d[this.name]=this.value}),n=d.Name===r,i="NavigationProperty"===t.tagName,o="Property"===t.tagName&&0<b('ComplexType[Name="'+d.Name+'"]',s).length,a.push(b.extend({iskey:n,isComplex:o,isNavigation:i,isCollection:0<=b.inArray(d.Name,c)},d))}),u[l]&&(p[u[l]]=a),p[l]=a)}),a=p;break;case"json":a=function(e){var t,a,r,n,o,i,l,d,s,u,c,p,f={},m={},y=[];for(i=0;i<e.EntityContainer.Elements.length;i++)m[e.EntityContainer.Elements[i].Type.ElementType.Definition.Name]=e.EntityContainer.Elements[i].Name,y.push(e.EntityContainer.Elements[i].Name);for(i=0;i<e.SchemaElements.length;i++)if(a=Array.prototype.concat(e.SchemaElements[i].DeclaredProperties,e.SchemaElements[i].NavigationProperties).filter(function(e){return!!e}),n=(r=e.SchemaElements[i].DeclaredKey)&&0<r.length?r[0].Name:"",p=e.SchemaElements[i].Name,a){for(t=[],l=0;l<a.length;l++)o=a[l].Name===n,u=a[l].Type.IsNullable,c=a[l].Type.Definition.Namespace+a[l].Type.Definition.Name,s=!(d=!!a[l].Type.Definition.DeclaredProperties)&&!a[l].Type,t.push({Name:a[l].Name,Type:c,Nullable:u,iskey:o,isComplex:d,isNavigation:s,isCollection:0<=b.inArray(a[l].Name,y)});m[p]&&(f[m[p]]=t),f[p]=t}return f}(e);break;case"datajs":a=function(e){var t,a,r,n,o,i,l,d,s,u,c,p,f,m={},y={},g=[],h=[],v=e.dataServices.schema[0],x=v.namespace+".";for(i=0;i<v.entityContainer[0].entitySet.length;i++)y[v.entityContainer[0].entitySet[i].entityType.replace(x,"")]=v.entityContainer[0].entitySet[i].name,g.push(v.entityContainer[0].entitySet[i].name);for(i=0;i<v.complexType.length;i++)h.push(v.complexType[i].name);for(f=Array.prototype.concat(v.entityType,v.complexType).filter(function(e){return!!e}),i=0;i<f.length;i++)if(a=Array.prototype.concat(f[i].property,f[i].navigationProperty).filter(function(e){return!!e}),n=(r=f[i].key)&&0<r.propertyRef.length?r.propertyRef[0].name:"",p=f[i].name,a){for(t=[],l=0;l<a.length;l++)o=a[l].name===n,u="false"!==a[l].nullable,c=a[l].type,d=!!a[l].type&&0<=b.inArray(a[l].type.replace(x,""),h),s=!a[l].type,t.push({Name:a[l].name,Type:c,Nullable:u,iskey:o,isComplex:d,isNavigation:s,isCollection:0<=b.inArray(a[l].name,g)});y[p]&&(m[y[p]]=t),m[p]=t}return m}(e)}return a},loadError:function(e,t,a){var r=e.status,n=t,o=a;if(!e.responseJSON)if(e.responseXML)e.responseText=e.responseText.replace(/<(\/?)([^:>\s]*:)?([^>]+)>/g,"<$1$3>"),e.responseXML=b.parseXML(e.responseText),e.responseJSON=b.jgrid.odataHelper.convertXmlToJson(e.responseXML);else if(e.responseText)try{e.responseJSON=b.parseJSON(e.responseText)}catch(e){}if(e.responseJSON){var i=e.responseJSON["@odata.error"]||e.responseJSON["odata.error"]||e.responseJSON.error;i&&(i.innererror?i.innererror.internalexception?(n=i.innererror.internalexception.message,o=i.innererror.internalexception.stacktrace||""):(n=i.innererror.message,o=i.innererror.stacktrace||""):(n=i.message.value||i.message,o=i.stacktrace||""))}else a&&b.isPlainObject(a)&&(n=a.message,o=a.stack,r=a.code);return"<div>Status/error code: "+r+"</div><div>Message: "+n+'</div><div style="font-size: 0.8em;">'+o+"</div><br/>"}},b.jgrid.cmTemplate.odataComplexType={editable:!1,formatter:function(e,t,a){return b(this).jqGrid("odataJson",e,t,a)}},b.jgrid.cmTemplate.odataNavigationProperty={editable:!1,formatter:function(e,t,a){return t.colModel.odata.expand&&"link"!==t.colModel.odata.expand?"json"===t.colModel.odata.expand?b(this).jqGrid("odataJson",e,t,a):"subgrid"===t.colModel.odata.expand?b(this).jqGrid("odataSubgrid",e,t,a):void 0:b(this).jqGrid("odataLink",e,t,a)}},b.jgrid.cmTemplate["Edm.GeographyPoint"]={editable:!1,formatter:function(e,t,a){if(!e&&"xml"===this.p.datatype){var r=b(a).filter(function(){return this.localName.toLowerCase()===t.colModel.name.toLowerCase()});e=b.jgrid.odataHelper.convertXmlToJson(r[0])}return e.crs&&e.coordinates?b.jgrid.format("<div>{0}</div><div>[{1},{2}]</div>",e.crs.properties.name,e.coordinates[0],e.coordinates[1]):b.jgrid.format("<div>{0}</div>",e)}},b.jgrid.extend({odataLink:function(e,t,a){var r,n,o=this[0].p;if("xml"!==o.datatype){if(a[t.colModel.name+"@odata.navigationLink"])return r=a[t.colModel.name+"@odata.navigationLink"],b.jgrid.format('<a href="{0}/{1}" target="_self">{2}</a>',o.odata.baseUrl,r,t.colModel.name);r=a[o.jsonReader.id]}else n=o.xmlReader.id.toLowerCase(),r=b(a).filter(function(){return this.localName&&this.localName.toLowerCase()===n}).text();return o.odata.iscollection?b.jgrid.format('<a href="{0}({1})/{2}" target="_self">{2}</a>',o.url,r,t.colModel.name):b.jgrid.format('<a href="{0}/{1}" target="_self">{1}</a>',o.url,t.colModel.name)},odataJson:function(e,t,a){var r,n={};if("xml"===this[0].p.datatype){var o=b(a).filter(function(){return this.localName.toLowerCase()===t.colModel.name.toLowerCase()});e=b.jgrid.odataHelper.convertXmlToJson(o[0])}for(r in e)e.hasOwnProperty(r)&&r&&r.indexOf("@odata.")<0&&r.indexOf("@attributes")<0&&(n[r]=e[r]);return JSON.stringify(n,null,1)},odataSubgrid:function(e,t,a){var r,n,o,i,l=this[0].p;for(r in"xml"!==l.datatype?n=a[l.jsonReader.id]:(i=l.xmlReader.id.toLowerCase(),n=b(a).filter(function(){return this.localName&&this.localName.toLowerCase()===i}).text()),l._index)if(l._index.hasOwnProperty(r)&&r&&n===l._index[r].toString()){n=r;break}return o='<a style="cursor:pointer" data-id="{0}" onclick=\'$("#{2}").jqGrid("setGridParam", { odata: {activeEntitySet: "{1}" } });$("#{2}").jqGrid("expandSubGridRow", "{0}");return false;\'>{1}</a>',o=b.jgrid.format(o,n,t.colModel.name,t.gid)},parseColumns:function(e,t){var a,r,n,o,i,l,d,s,u=0,c=[];for(u=0;u<e.length;u++)a=0<="Edm.Int16,Edm.Int32,Edm.Int64".indexOf(e[u].Type),r=0<="Edm.Decimal,Edm.Double,Edm.Single".indexOf(e[u].Type),o=0<="Edm.Byte,Edm.SByte".indexOf(e[u].Type),n=e[u].Type&&0<=e[u].Type.indexOf("Edm.")&&(0<=e[u].Type.indexOf("Date")||0<=e[u].Type.indexOf("Time")),i=b.jgrid.cmTemplate[e[u].Type]?e[u].Type:e[u].isComplex?"odataComplexType":e[u].isNavigation?"odataNavigationProperty":a?"integerStr":r?"numberStr":o?"booleanCheckbox":"text",l={integer:a,number:r,date:n,required:!e[u].Nullable||"false"===e[u].Nullable},d=a?"integer":r?"number":n?"datetime":o?"checkbox":"text",s=e[u].isNavigation||e[u].isComplex?'<span class="ui-icon ui-icon-arrowreturn-1-s" style="display:inline-block;vertical-align:middle;"></span>'+e[u].Name:e[u].Name,c.push(b.extend({label:s,name:e[u].Name,index:e[u].Name,editable:!e[u].isNavigation&&!e[u].iskey,searchrules:l,editrules:l,searchtype:d,inputtype:d,edittype:d,key:e[u].iskey,odata:{expand:e[u].isNavigation?t:e[u].isComplex?"json":null,isnavigation:e[u].isNavigation,iscomplex:e[u].isComplex,iscollection:e[u].isCollection}},b.jgrid.cmTemplate[i]));return c},odataInit:function(o){function l(e,t,a,r){var n,o;if(t&&(a||"nu"===r||"nn"===r)){if(a)for(n=0;n<e.colModel.length;n++)if((o=e.colModel[n]).name===t){if(o.odata.nosearch)return;if(o.odata.unformat&&!(t=b.isFunction(o.odata.unformat)?o.odata.unformat(t,a,r):o.odata.unformat))return;o.searchrules&&(o.searchrules.integer||o.searchrules.number||o.searchrules.date)?o.searchrules&&o.searchrules.date&&(a=new Date(a).toISOString()):a="'"+a+"'";break}switch(r){case"in":case"cn":return"indexof("+t+",tolower("+a+")) gt -1";case"ni":case"nc":return"indexof("+t+",tolower("+a+")) eq -1";case"bw":return"startswith("+t+","+a+") eq true";case"bn":return"startswith("+t+","+a+") eq false";case"ew":return"endswith("+t+","+a+") eq true";case"en":return"endswith("+t+","+a+") eq false";case"nu":return t+" eq null";case"nn":return t+" ne null";default:return t+" "+r+" "+a}}}function d(e,t,a){var r={};if(!e.odata.iscollection)return!t.version||t.version<4?r.$format="xml"===t.datatype?"atom":"application/json;odata=fullmetadata":r.$format="xml"===t.datatype?"atom":"application/json;odata.metadata=full",r;if(r={$top:a.rows,$skip:(parseInt(a.page,10)-1)*e.rowNum},"jsonp"===t.datatype&&(r.$callback=t.callback),!t.version||t.version<4?(r.$inlinecount="allpages",r.$format="xml"===t.datatype?"atom":"application/json;odata=fullmetadata"):(r.$count=!0,r.$format="xml"===t.datatype?"atom":"application/json;odata.metadata=full"),a.sidx&&(r.$orderby=a.sidx+" "+a.sord),!a._search)return r;if(a.filters){var n=function e(t,a){var r,n,o,i="";if(t.groups&&t.groups.length){for(r=0;r<t.groups.length;r++)i+="("+e(t.groups[r],a)+")",r<t.groups.length-1&&(i+=" "+t.groupOp.toLowerCase()+" ");t.rules&&t.rules.length&&(i+=" "+t.groupOp.toLowerCase()+" ")}if(t.rules.length)for(r=0;r<t.rules.length;r++)(o=l(a,(n=t.rules[r]).field,n.data,n.op))&&(i+=o+" "+t.groupOp.toLowerCase()+" ");return i=i.trim().replace(/\s(and|or)$/,"").trim()}(b.parseJSON(a.filters),e);0<n.length&&(r.$filter=n)}else r.$filter=l(e,a.searchField,a.searchString,a.searchOper);return r}function i(r,n){var e,t={datatype:n.datatype,jsonpCallback:n.callback},a=function(e,t){return function(t,e,a,r){var n,o=t.colModel.filter(function(e){return e.name===t.odata.activeEntitySet})[0];r=t._index[r],n=t.odata.iscollection?b.jgrid.format("{0}({1})/{2}",t.url,r,t.odata.activeEntitySet):b.jgrid.format("{0}/{1}",t.url,t.odata.activeEntitySet);var i={datatype:e.datatype,version:e.version,gencolumns:!1,expandable:e.expandable,odataurl:n,errorfunc:e.errorfunc,annotations:e.annotations,entitySet:t.odata.activeEntitySet};b("#"+a).html('<table id="'+a+'_t" class="scroll"></table>'),b("#"+a+"_t").jqGrid({colModel:t.odata.subgridCols[t.odata.activeEntitySet],odata:b.extend({},t.odata,o.odata),loadonce:!0,beforeInitGrid:function(){b(this).jqGrid("odataInit",i)},loadError:function(e,t,a){var r=b.jgrid.odataHelper.loadError(e,t,a);r=b("#errdialog").html()+r,b("#errdialog").html(r).dialog("open")}})}(r,n,e,t)};if(r.odata||(r.odata={iscollection:!0}),b.extend(r,{serializeGridData:function(e){return e=d(r,n,e),this.p.odata.postData=e},ajaxGridOptions:t,mtype:"GET",url:n.odataurl},t),r.colModel)for(e=0;e<r.colModel.length;e++)if(r.colModel[e].odata&&"subgrid"===r.colModel[e].odata.expand){r.subGrid=!0,r.subGridRowExpanded=a,r.odata.activeEntitySet=r.colModel[e].name,r.loadonce=!0;break}var o={contentType:"application/"+("jsonp"===n.datatype?"json":n.datatype)+";charset=utf-8",datatype:"jsonp"===n.datatype?"json":n.datatype};r.inlineEditing=b.extend(!0,{beforeSaveRow:function(e,t){return"edit"===e.extraparam.oper?(e.url=n.odataurl,e.mtype=n.odataverbs.inlineEditingEdit,e.url+="("+t+")"):(e.url=n.odataurl,e.mtype=n.odataverbs.inlineEditingAdd),!0},serializeSaveData:function(e){return JSON.stringify(e)},ajaxSaveOptions:o},r.inlineEditing||{}),b.extend(r.formEditing,{onclickSubmit:function(e,t,a){return"add"===a?(e.url=n.odataurl,e.mtype=n.odataverbs.formEditingAdd):"edit"===a&&(e.url=n.odataurl+"("+t[r.id+"_id"]+")",e.mtype=n.odataverbs.formEditingEdit),t},ajaxEditOptions:o,serializeEditData:function(e){return JSON.stringify(e)}}),b.extend(r.formDeleting,{url:n.odataurl,mtype:"DELETE",serializeDelData:function(){return""},onclickSubmit:function(e,t){return e.url+="("+t+")",""},ajaxDelOptions:o});var i=r.colModel.filter(function(e){return!!e.key})[0];if(i=i?i.name:r.sortname||"id","xml"===n.datatype){n.annotations&&b.extend(!0,r,{loadBeforeSend:function(e){e.setRequestHeader("Prefer",'odata.include-annotations="*"')}});var l=">entry";b.extend(!0,r,{xmlReader:{root:function(e){(e=e.childNodes[0]).innerHTML=e.innerHTML.replace(/<(\/?)([^:>\s]*:)?([^>]+)>/g,"<$1$3>");var t=b(e).attr("m:context");return t&&(r.odata.baseUrl=t.substring(0,t.indexOf("/$metadata")),r.odata.entityType=t.substring(t.indexOf("#")+1).replace("/$entity","")),(t=b(e).attr("m:type"))&&(r.odata.entityType=t.replace("#","")),e},row:function(e){return e="entry"===e.localName?[e]:b(l,e)},cell:function(e){return b(">content>properties",e).get(0).childNodes},records:function(e){return b(">feed"+l,e).length},page:function(){var e=r.odata.postData.$skip+r.rowNum;return Math.ceil(e/r.rowNum)},total:function(e){var t=b(">feed"+l,e).length,a=r.odata.postData.$skip+r.rowNum;return Math.ceil(a/r.rowNum)+(0<t?1:0)},repeatitems:!0,userdata:"userdata",id:i}})}else b.extend(!0,r,{jsonReader:{root:function(e){var t=e["@odata.context"];return t&&(r.odata.baseUrl=t.substring(0,t.indexOf("/$metadata")),r.odata.entityType=t.substring(t.indexOf("#")+1).replace("/$entity","")),(t=e["@odata.type"])&&(r.odata.entityType=t.replace("#","")),e.value||[e]},repeatitems:!0,id:i}}),n.annotations?b.extend(!0,r,{loadBeforeSend:function(e){e.setRequestHeader("Prefer",'odata.include-annotations="*"')},jsonReader:{records:function(e){return e[n.annotationName].records},page:function(e){return e[n.annotationName].page},total:function(e){return e[n.annotationName].total},userdata:function(e){return e[n.annotationName].userdata}}}):b.extend(!0,r,{jsonReader:{records:function(e){return e["odata.count"]||e["@odata.count"]},page:function(e){var t;if(e["odata.nextLink"])t=parseInt(e["odata.nextLink"].split("skip=")[1],10);else{t=r.odata.postData.$skip+r.rowNum;var a=e["odata.count"]||e["@odata.count"];a<t&&(t=a)}return Math.ceil(t/r.rowNum)},total:function(e){var t=e["odata.count"]||e["@odata.count"];return Math.ceil(t/r.rowNum)},userdata:"userdata"}})}return this.each(function(){var e=this,t=b(this),a=this.p;if(e.grid&&a){var r=b.extend(!0,{gencolumns:!1,odataurl:a.url,datatype:"json",entitySet:null,annotations:!1,annotationName:"@jqgrid.GridModelAnnotate",odataverbs:{inlineEditingAdd:"POST",inlineEditingEdit:"PATCH",formEditingAdd:"POST",formEditingEdit:"PUT"}},o||{});if("jsonp"===r.datatype&&(r.callback="jsonpCallback"),r.entitySet){if(r.gencolumns){var n=b.extend(!0,{parsecolfunc:null,parsemetadatafunc:null,successfunc:null,errorfunc:null,async:!1,entitySet:null,metadatatype:o.datatype||"xml",metadataurl:(o.odataurl||a.url)+"/$metadata"},o||{});n.async&&(n.successfunc=function(){e.grid.hDiv&&(e.grid.hDiv.loading=!1),t.jqGrid("setGridParam",{datatype:r.datatype}).trigger("reloadGrid")},e.grid.hDiv&&(e.grid.hDiv.loading=!0)),t.jqGrid("odataGenColModel",n)}i(a,r)}else b.isFunction(r.errorfunc)&&r.errorfunc({},"entitySet cannot be empty",0)}})},odataGenColModel:function(e){var i,l,t=this[0],d=t.p,s=b(t),u=b.extend(!0,{parsecolfunc:null,parsemetadatafunc:null,successfunc:null,errorfunc:null,entitySet:null,metadataurl:d.url+"/$metadata",metadatatype:"xml",expandable:"link",async:!1},e||{});if("jsonp"===u.metadatatype&&(u.callback="jsonpCallback"),u.entitySet)return b.ajax({url:u.metadataurl,type:"GET",dataType:u.metadatatype,jsonpCallback:u.callback,async:u.async,cache:!1}).done(function(e,t,a){var r=0,n=0,o=0;if("json"!==u.metadatatype&&"jsonp"!==u.metadatatype||(e=b.jgrid.odataHelper.resolveJsonReferences(e)),!(i=s.triggerHandler("jqGridODataParseMetadata",e))&&b.isFunction(u.parsemetadatafunc)&&(i=u.parsemetadatafunc(e,t,a)),i)l=i;else if((i=b.jgrid.odataHelper.parseMetadata(e,u.metadatatype))&&(!(l=s.triggerHandler("jqGridODataParseColumns",[u,i]))&&b.isFunction(u.parsecolfunc)&&(l=u.parsecolfunc(u,i)),!l))for(r in l={},i)i.hasOwnProperty(r)&&r&&(l[r]=s.jqGrid("parseColumns",i[r],u.expandable));if(l){for(o in l)if(l.hasOwnProperty(o)&&o)for(r=0;r<d.colModel.length;r++)for(n=0;n<l[o].length;n++)if(l[o][n].name===d.colModel[r].name){b.extend(!0,l[o][n],d.colModel[r]);break}d.colModel=l[u.entitySet],d.colModel||b.isFunction(u.errorfunc)&&u.errorfunc({data:e,status:t,xhr:a},"EntitySet "+u.entitySet+" is not found"),d.odata||(d.odata={iscollection:!0}),d.odata.subgridCols=l,b.isFunction(u.successfunc)&&u.successfunc()}else b.isFunction(u.errorfunc)&&u.errorfunc({data:e,status:t,xhr:a},"parse $metadata error")}).fail(function(e,t,a){if(b.isFunction(u.errorfunc)){var r=b.jgrid.odataHelper.loadError(e,t,a);u.errorfunc({xhr:e,error:t,code:a},r)}}),l;b.isFunction(u.errorfunc)&&u.errorfunc({},"entitySet cannot be empty",0)}})});
//# sourceMappingURL=grid.odata.js.map