UNPKG

nscomponentsreact

Version:

React Wrapper Components for NSComponents

1,150 lines (1,066 loc) 28.7 kB
var nsModuleExport = function(root,name,prototype) { if(typeof exports === 'object' && typeof module === 'object') { module.exports[name] = prototype; } else if (typeof define === "function" && define.amd) { define(name,[], function () {return prototype;}); } else if(typeof exports === 'object') { exports[name] = prototype; } else { root[name] = prototype; } };var nsIsWeb = function(root) { if(typeof exports === 'object' && typeof module === 'object') { return false; } else if (typeof define === "function" && define.amd) { return false; } else if(typeof exports === 'object') { return false; } else { return true; } };if(!nsIsWeb()) { var nsutilRef = require('./nsUtil.min.js'); var NSUtil = nsutilRef.NSUtil; } "use strict"; var NSAjax = (function() { function NSAjax(defaultSetting) { var self = this; self.__defaultSetting = defaultSetting || {}; var activeReq = 0; self.__eligibleMethods = ["POST","GET","DELETE","HEAD","OPTIONS","PUT"]; /*var post = function(url,data,setting) { return processRequest(getSetting("POST",url,data,setting)); }; var get = function(url,data,setting) { return processRequest(getSetting("GET",url,data,setting)); };*/ var jsonp = function(url,data,setting) { setting = setting ? setting : {}; setting.dataType = "JSONP"; setting.url = url; setting.param = data; return processRequest(setting); }; var getSetting = function(method,url,data,setting) { setting = setting ? setting : {}; setting.method = method || self.__defaultSetting.method; setting.url = url || self.__defaultSetting.url; setting.param = data || self.__defaultSetting.param; setting.dataType = setting.dataType || self.__defaultSetting.dataType; return setting; }; var processRequest = function(setting) { var config = null; var onInit = function() { if(!setting) { return; } self.util = new NSUtil(); self.ajaxUtil = new AjaxUtil(self); self.dom = self.util.getDomVariables(); config = { method: setting["method"] || "POST", url: setting["url"] || "", param: setting["param"] || {}, dataType: setting["dataType"] || "", completeHandler: setting["completeHandler"], timeOutHandler: setting["timeOutHandler"], //if browser supports W3C Events then the below function will fire loadStartHandler: setting["loadStartHandler"], progressHandler: setting["progressHandler"], abortHandler: setting["abortHandler"], //end of browser supports W3C Events then the below function will fire timeout: setting.timeout || -1, header: setting["header"], encodeParam: (typeof setting["encodeParam"] == "undefined") ? false : setting["encodeParam"], processData: (typeof setting["processData"] == "undefined") ? true : setting["processData"], mimeType: setting["mimeType"], //should be set to false if param or data sent with get or post is of type FormData setDefaultHeaders: (typeof setting["setDefaultHeaders"] == "undefined") ? true : setting["setDefaultHeaders"], //enhanced inline with fetch mode: setting["mode"] || "cors", // no-cors, *cors, same-origin cache: setting["cache"] || "default", // *default, no-cache, reload, force-cache, only-if-cached credentials: setting["credentials"] || "same-origin", // include, *same-origin, omit jsonpCallback: setting["callback"], jsonpType: setting["type"], jsonpCharset: setting["charset"], }; }; var getPromise = function() { if(config) { handleActiveReq(true); var objPromise = (config.dataType.toUpperCase() === "JSONP") ? new AjaxJSONP(self,config,handleActiveReq) : AjaxNormal(self,config,handleActiveReq); return objPromise; } return null; }; onInit(); return getPromise(); }; var handleActiveReq = function(add) { if(add) { activeReq++; if(activeReq == 1) { self.util.dispatchEvent(self.dom.win,NSAjax.REQUEST_STARTED); } } else { activeReq--; if(activeReq == 0) { self.util.dispatchEvent(self.dom.win,NSAjax.ALL_REQUEST_COMPLETED); } } }; var addMethods = function() { for(var count = 0;count < self.__eligibleMethods.length;count++) { addMethod(self.__eligibleMethods[count]); } }; var addMethod = function(method) { if(!self[method.toLowerCase()]) { self[method.toLowerCase()] = function(url,data,setting) { return processRequest(getSetting(method,url,data,setting)); }; } }; addMethods(); /*self.post = post; self.get = get;*/ self.jsonp = jsonp; self.processRequest = processRequest; }; var AjaxNormal = function(ajax,config,handleActiveReq) { var xhr = null; var request = null; var response = null; var requestDone = false; var resolve = null; var reject = null; var init = function() { var objPromise = new Promise(function(paramResolve,paramReject) { resolve = paramResolve; reject = paramReject; request = new AjaxRequest(ajax,config); if(config.timeout > 0) { ajax.dom.win.setTimeout(function() { requestDone = true; }, config.timeout); } xhr = getRequest(); xhr.open(request.method,request.url,true); if("onloadstart" in xhr) { xhr.onloadstart = loadStartHandler; xhr.onprogress = progressHandler; xhr.onabort = abortHandler; xhr.onerror = errorHandler; xhr.onload = loadHandler; xhr.ontimeout = timeOutHandler; xhr.onloadend = loadEndHandler; } else { xhr.onreadystatechange = stateChange; } if (config.credentials == "include") { xhr.withCredentials = true; } else if (config.credentials == "omit") { xhr.withCredentials = false; } if ("responseType" in xhr) { if(ajax.ajaxUtil.browserSupprots.blob) { xhr.responseType = "blob"; } else if(ajax.ajaxUtil.browserSupprots.arrayBuffer && request.headers["Content-Type"] && request.headers["Content-Type"].indexOf('application/octet-stream') != -1) { xhr.responseType = "arraybuffer"; } } for(var key in request.headers) { xhr.setRequestHeader(key,request.headers[key]); } xhr.send(request.params); }); return objPromise; }; var getRequest = function() { if (ajax.dom.win.XMLHttpRequest) { return new XMLHttpRequest(); } else { var versions = ["Microsoft", "msxm3", "msxml2", "msxml1"]; for (var count = 0;count < versions.length; count++) { try { var version = versions[count] + ".XMLHTTP"; return new ActiveXObject(version); } catch (error) { } } } return null; }; var stateChange = function(object) { if(xhr.readyState == 4 && !requestDone) { var callback = function(value) { if(isRequestSuccess()) { defaultSuccessHandler(value,response); } else { defaultErrorHandler(value,response); } defaultCompleteHandler(); xhr = null; }; var data = getResponseData(); if(ajax.ajaxUtil.isPromise(data)) { data.then(function(value) { callback(value); }); } else { callback(data); defaultCompleteHandler(); xhr = null; } } else if(xhr.readyState != 4 && requestDone) { if(config["timeOutHandler"]) { config["timeOutHandler"](); } xhr.onreadystatechange = null; } }; var isRequestSuccess = function() { var retValue = false; //if requesting a local resource if(!xhr.status && location.protocol == "file:") { retValue = true; } // Any status in the 200 range is good else if (xhr.status >= 200 && xhr.status < 300) { retValue = true; } //Successful if the document has not been modified and Safari returns an empty status if the file has not been modified else if(xhr.status == 304 || (navigator.userAgent.indexOf("Safari") >= 0 && typeof xhr.status == "undefined")) { retValue = true; } return retValue; }; var getResponseData = function() { response = new AjaxResponse(ajax,config,xhr); var value = response.getValue(); return value; }; var loadStartHandler = function(event) { if(config["loadStartHandler"]) { config["loadStartHandler"](); } }; var progressHandler = function(event) { if(config["progressHandler"]) { if (event.lengthComputable) { config["progressHandler"](event.loaded,event.total); } else { config["progressHandler"](event.loaded,-1); } } }; var abortHandler = function(event) { if(config["abortHandler"]) { config["abortHandler"](event); } defaultErrorHandler(event); }; var errorHandler = function(event) { var data = getResponseData(event); if(ajax.ajaxUtil.isPromise(data)) { data.then(function(value) { defaultErrorHandler(event,value,response); }); } else { defaultErrorHandler(event,data,response); } }; var loadHandler = function(event) { var callback = function(value) { if(isRequestSuccess()) { defaultSuccessHandler(value,response); } else { defaultErrorHandler(value,response); } }; var data = getResponseData(); if(ajax.ajaxUtil.isPromise(data)) { data.then(function(value) { callback(value); }); } else { callback(data); } }; var timeOutHandler = function(event) { if(config["timeOutHandler"]) { config["timeOutHandler"](event); } defaultErrorHandler(event); }; var loadEndHandler = function(event) { defaultCompleteHandler(); }; var defaultSuccessHandler = function(value,response) { if(resolve) { resolve(value); resolve = null; handleActiveReq(false); } }; var defaultErrorHandler = function(value,response) { if(reject) { reject(value); reject = null; handleActiveReq(false); } }; var defaultCompleteHandler = function() { if(config.completeHandler) { config.completeHandler(); } }; return init(); }; var AjaxJSONP = function(ajax,config,handleActiveReq) { var functionNameInitials = "nsjsonp"; var instanceNameInitials = "nsjsonpIns"; var random = -1; var resolve = null; var reject = null; var origCallback = null; var callback = null; var objPromise = new Promise(function(parResolve,parReject) { var util = new NSUtil(); var getParam = function() { if(config.processData) { var strParam = ""; var param = config.param; if(util.isString(param)) { return param; } for(var paramKey in param) { if(param[paramKey]) { if(config.encodeParam) { strParam += "&" + encodeURIComponent(paramKey) + "=" + encodeURIComponent(param[paramKey]); } else { strParam += "&" + paramKey + "=" + param[paramKey]; } } } if(strParam && strParam.length > 1) { strParam = strParam.substring(1); } return strParam; } return config.param; }; var createScript = function(url) { var domPosition = ajax.dom.doc.body; var script = ajax.dom.doc.createElement("script"); script.async = true; script.setAttribute("id", url); if(config.jsonpType) { script.setAttribute("type",config.jsonpType); } if (config.jsonpCharset) { script.setAttribute("charset",config.jsonpCharset); } script.setAttribute("src",url); script.onload = script.onreadystatechange = function() { if (!script.readyState || /loaded|complete/.test(script.readyState)) { script.onload = script.onreadystatechange = null; if (script.parentNode) { script.parentNode.removeChild(script); } script = null; } }; domPosition.appendChild(script); }; var defaultSuccessHandler = function(response) { var win = ajax.dom.win; var instanceName = instanceNameInitials + random; if(win[instanceName]) { win[instanceName] = null; } if(win[callback]) { win[callback] = origCallback; } if(origCallback) { origCallback(response); } origCallback = null; if(resolve) { resolve(response); resolve = null; handleActiveReq(false); } }; resolve = parResolve; reject = parReject; if(random == -1) { random = ajax.util.getUniqueId(); } callback = config.jsonpCallback; if(callback) { origCallback = util.getFunction(callback); if(origCallback && util.isString(origCallback)) { origCallback = null; } } else { callback = functionNameInitials + random; } var instanceName = instanceNameInitials + random; //ajax.dom.win[instanceName] = this; ajax.dom.win[callback] = function(json){ defaultSuccessHandler(json); }; var url = config.url + "?callback=" + callback; var strParam = getParam(); if(strParam && strParam != "") { url += "&" + strParam; } createScript(url); }); return objPromise; }; var AjaxRequest = function(ajax,config) { var self = this; var dom = null; var init = function() { dom = ajax.dom; self.method = getMethodName(config.method); self.params = getParams(); self.headers = getHeader(); self.url = getUrl(); }; var getParams = function() { var param = config.param; if(config.processData && param && !ajax.ajaxUtil.isTypeFormData(param)) { if (self.method != "GET" && self.method != "HEAD" && config.dataType != null && config.dataType.toUpperCase() == "JSON" && !config.encodeParam && !ajax.util.isString(param)) { return JSON.stringify(param); } if(ajax.util.isString(param)) { return param; } if (self.method == "GET" || self.method == "HEAD") { var strParam = ""; for(var paramKey in param) { if(param[paramKey]) { if(config.encodeParam) { strParam += "&" + encodeURIComponent(paramKey) + "=" + encodeURIComponent(param[paramKey]); } else { strParam += "&" + paramKey + "=" + param[paramKey]; } } } if(strParam && strParam.length > 1) { strParam = strParam.substring(1); } return strParam; } } return param; }; var getHeader = function() { var header = config.header || {}; var dataType = config.dataType ? config.dataType : null; var contentType = header["content-type"]; var param = config.param; if(!contentType && !ajax.ajaxUtil.isTypeFormData(param)) { if(dataType == "JSON") { contentType = "application/json"; } else if(typeof param === "string") { contentType = "text/plain;charset=UTF-8"; } else if(ajax.ajaxUtil.browserSupprots.blob && Blob.prototype.isPrototypeOf(param) && param.type) { contentType = param.type; } else if(ajax.ajaxUtil.browserSupprots.urlSearchParams && URLSearchParams.prototype.isPrototypeOf(param)) { contentType = "application/x-www-form-urlencoded;charset=UTF-8"; } } if(contentType) { header["content-type"] = contentType; } return header; }; var getUrl = function() { var url = config.url; if(self.method == "GET" || self.method == "HEAD") { if(self.params && self.params != "") { url += "?" + self.params; //so that send method sends as null for GET self.params = null; } if(config.cache == "no-store" || config.cache == "no-cache") { // handling underscore parameter in the query string var underscoreSearch = /([?&])_=[^&]*/; if (underscoreSearch.test(url)) { // If it already exists then set the value with the current time url = url.replace(underscoreSearch, '$1_=' + new Date().getTime()) } else { // Otherwise add a new '_' parameter to the end with the current time var reQueryString = /\?/; url += (reQueryString.test(url) ? '&' : '?') + '_=' + new Date().getTime(); } } } try { url = (url == "" && dom.win.location.href) ? dom.win.location.href : url } catch (e) { } return url; }; var getMethodName = function(name) { var methodName = name.toUpperCase(); if(ajax.__eligibleMethods.indexOf(methodName) == -1) { ajax.util.throwNSError("NSAjax","Method is not valid"); } return methodName; }; init(); }; var AjaxResponse = function(ajax,config,xhr) { var self = this; var init = function() { self.headers = getHeader(); self.status = (xhr.status == null) ? 200 : xhr.status; self.statusText = (xhr.statusText == null) ? "" : ("" + xhr.statusText); self.url = "responseURL" in xhr ? xhr.responseURL : self.headers["X-Request-URL"]; self.params = "response" in xhr ? xhr.response : xhr.responseText; populateBodyParams(self.params); }; var populateBodyParams = function(params) { self.__paramInit = params; if(!params) { self.__paramText = ""; } else if(typeof params == "string") { self.__paramText = params; } else if (ajax.ajaxUtil.browserSupprots.blob && Blob.prototype.isPrototypeOf(params)) { self.__paramBlob = params; } else if (ajax.ajaxUtil.browserSupprots.formData && FormData.prototype.isPrototypeOf(params)) { self.__paramFormData = params; } else if (ajax.ajaxUtil.browserSupprots.urlSearchParams && URLSearchParams.prototype.isPrototypeOf(params)) { self.__paramText = params.toString(); } else if (ajax.ajaxUtil.browserSupprots.arrayBuffer && ajax.ajaxUtil.browserSupprots.blob && ajax.ajaxUtil.isTypeDataView(params)) { self.__paramArrayBuffer = ajax.ajaxUtil.bufferClone(params.buffer); // IE 10-11 can't handle a DataView params. self.__paramInit = new Blob([self.__paramArrayBuffer]) } else if (ajax.ajaxUtil.browserSupprots.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(params) || ajax.ajaxUtil.isArrayBufferView(params))) { self.__paramArrayBuffer = ajax.ajaxUtil.bufferClone(params); } else { self.__paramText = params = Object.prototype.toString.call(params); } }; self.getValue = function() { var retValue = null; //for some reason IE is taking Content-Type var contentType = self.headers["content-type"] || self.headers["Content-Type"]; var dataType = xhr.dataType; var isXMLData = false; if(!dataType && contentType && contentType.indexOf("xml") > -1) { isXMLData = true; } if(contentType && contentType.indexOf("json") > -1) { retValue = self.getJson(); } else if(isXMLData || (dataType && dataType.indexOf("xml") > -1)) { retValue = xhr.responseXML; } else { retValue = self.getText(); } // If the specified type is "script", execute the returned text response as if it was JavaScript if (dataType == "script") { if(ajax.ajaxUtil.isPromise(retValue)) { data.then(function(value) { eval.call(ajax.dom.win,value); }); } else { eval.call(ajax.dom.win,value); } } return retValue; }; self.getBlob = function() { if(ajax.ajaxUtil.browserSupprots.blob) { if(self.__paramBlob) { return Promise.resolve(self.__paramBlob); } else if (self.__paramArrayBuffer) { return Promise.resolve(new Blob([self.__paramArrayBuffer])); } else if (self.__paramFormData) { throw ajax.util.throwNSError("NSAjax","FormData body could not be read as blob"); } else { return Promise.resolve(new Blob([self.__paramText])); } } else { throw ajax.util.throwNSError("NSAjax","Blob is not supported"); } }; self.getArrayBuffer = function() { if(ajax.ajaxUtil.browserSupprots.blob) { if (self.__paramArrayBuffer) { if(ArrayBuffer.isView(self.__paramArrayBuffer)) { return Promise.resolve( self.__paramArrayBuffer.buffer.slice(self.__paramArrayBuffer.byteOffset,(self.__paramArrayBuffer.byteOffset + self.__paramArrayBuffer.byteLength)) ); } else { return Promise.resolve(self.__paramArrayBuffer); } } else { return self.blob().then(ajax.ajaxUtil.readBlobAsArrayBuffer); } } else { throw ajax.util.throwNSError("NSAjax","Blob is not supported"); } }; self.getFormData = function() { if(ajax.ajaxUtil.browserSupprots.formData) { self.getText().then(decodeFormData); } else { throw ajax.util.throwNSError("NSAjax","FormData is not supported"); } }; self.getText = function() { if (self.__paramBlob) { return ajax.ajaxUtil.readBlobAsText(self.__paramBlob); } else if (self.__paramArrayBuffer) { return Promise.resolve(ajax.ajaxUtil.readArrayBufferAsText(self.__paramArrayBuffer)); } else if (self.__paramFormData) { throw ajax.util.throwNSError("NSAjax","FormData body could not be read as blob"); } else { return Promise.resolve(self.__paramText); } }; self.getJson = function() { return self.getText().then(JSON.parse); }; var decodeFormData = function(param) { param = param || ""; var objRet = new FormData(); var arrParam = param.trim().split("&"); for(var count = 0;count < arrParam.length;count++) { var bytes = arrParam[count]; var split = bytes.split("="); var key = split.shift().replace(/\+/g, " "); var value = split.join('=').replace(/\+/g," "); objRet.append(decodeURIComponent(key), decodeURIComponent(value)) } return objRet; }; var getHeader = function() { var objHeader = {}; var strHeader = xhr.getAllResponseHeaders() || ""; //replace \r\n and \n with space strHeader = strHeader.replace(/\r?\n[\t ]+/g," "); var arrHeader = strHeader.split("\r"); for(var count = 0;count < arrHeader.length;count++) { var header = arrHeader[count]; header = (header.indexOf("\n") == 0) ? header.substr(1,header.length) : header; var arrParts = header.split(':'); var key = arrParts.shift().trim(); if(key) { var value = arrParts.join(':').trim(); objHeader[key] = value; } } return objHeader; }; init(); }; var AjaxUtil = function(ajax) { var self = this; var dom = null; self.browserSupprots = null; var init = function() { dom = ajax.util.getDomVariables(); self.browserSupprots = {blob: self.isBlobSupproted(),formData: self.isFormDataSupproted(),arrayBuffer: self.isArrayBufferSupproted(), urlSearchParams: self.isURLSearchParamsSupproted(),iterator: self.isIterartorSupproted()}; }; self.isBlobSupproted = function() { if("FileReader" in dom.win && "FileReader" in dom.win) { try { new Blob(); return true; } catch (e) { } } return false; }; self.isURLSearchParamsSupproted = function() { return "URLSearchParams" in dom.win; }; self.isIterartorSupproted = function() { return "Symbol" in dom.win && "iterator" in Symbol; }; self.isFormDataSupproted = function() { return "FormData" in dom.win; }; self.isArrayBufferSupproted = function() { return "ArrayBuffer" in dom.win; }; self.isTypeDataView = function(type) { return type && DataView.prototype.isPrototypeOf(type); }; self.isTypeArrayBuffer = function(type) { if(ArrayBuffer.isView && type) { var arrayBufferClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ]; return arrayBufferClasses.indexOf(Object.prototype.toString.call(type)) > -1; } return false; }; self.isTypeFormData = function(type) { return self.browserSupprots.formData && type && (Object.prototype.toString.call(type) == "[object FormData]"); }; self.isPromise = function(type) { return self.browserSupprots.formData && type && (Object.prototype.toString.call(type) == "[object Promise]"); }; self.normalize = function(value) { if (typeof value !== 'string') { value = String(value) } return value; }; self.iteratorFor = function(items) { var iterator = {next: function() { var value = items.shift(); return {done: value === undefined, value: value}; }}; if (support.iterator) { iterator[Symbol.iterator] = function() { return iterator } } return iterator; }; self.fileReaderReady = function(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result) }; reader.onerror = function() { reject(reader.error) }; }); }; self.readBlobAsArrayBuffer = function(blob) { var reader = new FileReader(); var promise = self.fileReaderReady(reader); reader.readAsArrayBuffer(blob); return promise; }; self.readBlobAsText = function(blob) { var reader = new FileReader(); var promise = self.fileReaderReady(reader); reader.readAsText(blob); return promise; }; self.readArrayBufferAsText = function(buf) { var view = new Uint8Array(buf); var chars = new Array(view.length); for (var count = 0; count < view.length; count++) { chars[i] = String.fromCharCode(view[count]); } return chars.join(''); }; self.bufferClone = function(buf) { if (buf.slice) { return buf.slice(0); } else { var view = new Uint8Array(buf.byteLength); view.set(new Uint8Array(buf)); return view.buffer; } }; init(); }; NSAjax.REQUEST_STARTED = "requestStarted"; NSAjax.ALL_REQUEST_COMPLETED = "allRequestCompleted"; return NSAjax; })(); nsModuleExport(this,"NSAjax",NSAjax);