PageRenderTime 68ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 1ms

/public/js/dashboard.js

https://gitlab.com/nzqadri/bejeep
JavaScript | 442 lines | 361 code | 64 blank | 17 comment | 64 complexity | 8b545c8b2d3f50da38f26285fc4c273c MD5 | raw file
  1. /***************************************************************
  2. * Functions for making AJAX call
  3. ***************************************************************/
  4. var xhrPool = [];
  5. function ajaxAbortAll() {
  6. for (var i = 0, len = xhrPool.length; i < len; i++) {
  7. if (xhrPool[i]) { // IE Fix
  8. xhrPool[i].abort();
  9. }
  10. }
  11. xhrPool.length = 0;
  12. }
  13. function ajaxExecute(settings) {
  14. if (window.XMLHttpRequest && settings.URL) {
  15. if (!settings.URL || (settings.method !== "GET" && settings.method !== "POST")) {
  16. return;
  17. }
  18. if (settings.abortPending === true) {
  19. ajaxAbortAll();
  20. }
  21. var xhr = new XMLHttpRequest();
  22. var strURL = settings.URL;
  23. var params = settings.reqParams || null;
  24. if (params && settings.method === "GET") {
  25. params = null;
  26. if (typeof settings.reqParams === "object") {
  27. var qs = "";
  28. Object.keys(settings.reqParams).forEach(function (p) {
  29. qs += encodeURIComponent(p) + "=" + encodeURIComponent(settings.reqParams[p]) + "&";
  30. });
  31. if (qs) {
  32. strURL = settings.URL + "?" + qs.slice(0, -1);
  33. }
  34. }
  35. }
  36. xhr.onreadystatechange = function () {
  37. if (xhr.readyState === 1 && settings.addToPool) {
  38. xhrPool.push(xhr);
  39. }
  40. if (xhr.readyState === 4) {
  41. if (settings.addToPool) {
  42. var hxrIndex = xhrPool.indexOf(xhr);
  43. if (hxrIndex > -1) {
  44. xhrPool.splice(hxrIndex, 1);
  45. }
  46. }
  47. if (xhr.status === 200) {
  48. var r,
  49. errM = 'An error occurred';
  50. if (settings.respType === 'json') {
  51. try {
  52. r = xhr.responseType === 'json' ? xhr.response : JSON.parse(xhr.responseText);
  53. if (typeof r !== 'object' || r === null) {
  54. console.log(errM);
  55. return;
  56. }
  57. } catch (err) {
  58. console.log(errM);
  59. return;
  60. }
  61. } else {
  62. r = xhr.responseText;
  63. }
  64. if (settings.respElemId) {
  65. var respElem = document.getElementById(settings.respElemId);
  66. if (respElem) {
  67. respElem.innerHTML = r;
  68. }
  69. }
  70. if (settings.callback) {
  71. var fnp = settings.cbParams || [];
  72. fnp.unshift(r);
  73. settings.callback.apply(this, fnp);
  74. }
  75. }
  76. }
  77. };
  78. xhr.open(settings.method, strURL, true);
  79. if (settings.reqType === 'json') {
  80. xhr.setRequestHeader("Content-Type", "application/json");
  81. if (params) {
  82. params = JSON.stringify(params);
  83. }
  84. }
  85. if (settings.respType) {
  86. xhr.responseType = settings.respType;
  87. }
  88. xhr.send(params);
  89. }
  90. }
  91. /******************* End AJAX functions ********************************/
  92. /************************************************************************
  93. Orders
  94. ************************************************************************/
  95. /*
  96. *
  97. *
  98. */
  99. function ordersList() {
  100. var ajaxSettings = {
  101. URL: "/bejeep/admin/ajax/orders-get.php",
  102. method: "POST",
  103. reqType: "json",
  104. respType: "json",
  105. reqParams: {},
  106. callback: function (ajResp) {
  107. console.log(ajResp)
  108. if (ajResp.err) {
  109. console.log(ajResp.errMsg);
  110. }
  111. ordersListShow(ajResp.orders);
  112. },
  113. addToPool: true,
  114. abortPending: true
  115. };
  116. ajaxExecute(ajaxSettings);
  117. }
  118. function ordersListShow(orders) {
  119. if (!Array.isArray(orders)) {
  120. alert('An error occurred');
  121. return;
  122. }
  123. var doc = document,
  124. ordersList = doc.getElementById('orders-list'),
  125. frag = doc.createDocumentFragment(),
  126. row,
  127. cartIcon,
  128. rowHTML;
  129. for (var i = 0, iLen = orders.length; i < iLen; i++) {
  130. row = doc.createElement('div');
  131. row.id = 'row' + orders[i].orderID;
  132. row.classList.add('list-row');
  133. cartIcon = doc.createElement('i');
  134. cartIcon.id = 'c' + orders[i].orderID;
  135. cartIcon.textContent = 'shopping_cart';
  136. cartIcon.className = 'material-icons cart';
  137. cartIcon.addEventListener('click', function (e) {
  138. cartShow(this.id.slice(1));
  139. }, false);
  140. rowHTML = '<div class="order-id">' + orders[i].orderID + '</div>';
  141. rowHTML += '<i id="c' + orders[i].orderID + '" class="material-icons cart">shopping_cart</i>';
  142. rowHTML += '<div class="total-cost" id="tc' + orders[i].orderID + '">' + orders[i].totalCost + '</div>';
  143. rowHTML += '<div class="status" id="' + orders[i].orderID + '" onclick="statusWin(' + orders[i].orderID + ',' + '\'' + orders[i].status + '\'' + ')">' + orders[i].status + '</div>';
  144. rowHTML += '<div class="contact">' + orders[i].firstName + ' ' + orders[i].lastName + '<br>' + orders[i].email + '<br>' +orders[i].phone + '</div>';
  145. rowHTML += '<div class="address">' + orders[i].city + ', ' + orders[i].country + '</div>';
  146. rowHTML += '<div class="date">' + orders[i].dateCreated + '</div>';
  147. row.insertAdjacentHTML('beforeend', rowHTML);
  148. frag.appendChild(row);
  149. }
  150. ordersList.textContent = '';
  151. ordersList.appendChild(frag);
  152. // View cart event
  153. var carts = ordersList.getElementsByClassName('cart');
  154. for (var i = 0, iLen = carts.length; i < iLen; i++) {
  155. carts[i].addEventListener('click', function (e) {
  156. cartView(this.id.slice(1));
  157. }, false);
  158. }
  159. }
  160. function cartView(orderID) {
  161. var pw = popwinCreate();
  162. var ajaxSettings = {
  163. URL: "/bejeep/admin/ajax/order-get.php",
  164. method: "POST",
  165. reqType: "json",
  166. respType: "json",
  167. reqParams: {'orderID': orderID},
  168. callback: function (ajResp) {
  169. if (ajResp.err !== false) {
  170. console.log(ajResp.errMsg);
  171. }
  172. var order = ajResp.order,
  173. oHTML;
  174. oHTML = '<div class="pw-order" id="o' + order.orderID + '">';
  175. oHTML += '<div id="pw-msg"></div><br>';
  176. oHTML += 'Order ID: ' + order.orderID + '<br>' + order.dateCreated + '<br>' + order.status + '<br><br>';
  177. oHTML += '<div>' + order.firstName + ' ' + order.lastName + '<br>' + order.email + '<br>Phone' + order.phone;
  178. oHTML += '<br>' + order.city + ', ' + order.country + '<br><br><br>';
  179. var prods = order.products,
  180. pHTML = '';
  181. if (Array.isArray(prods)) {
  182. for (var i = 0, iLen = prods.length; i < iLen; i++) {
  183. pHTML += '<li>' + prods[i].url + '<div>' + prods[i].notes + '</div>';
  184. pHTML += '<div>Quantity: ' + prods[i].qty + '<input type="number" step="0.1" id="p' + prods[i].orderProductID + '" value="' +prods[i].price +'"></div></li>';
  185. }
  186. }
  187. oHTML += '<ul id="pw-order-products">' + pHTML + '</ul>';
  188. oHTML += '<div><button type="button" onclick="orderUpdate(' + order.orderID + ')">Update</button></div></div>';
  189. pw.insertAdjacentHTML('beforeend', oHTML);
  190. },
  191. addToPool: true,
  192. abortPending: true
  193. };
  194. ajaxExecute(ajaxSettings);
  195. }
  196. function orderUpdate(orderID) {
  197. var inps = document.getElementById('popwin').getElementsByTagName('input'),
  198. i = inps.length,
  199. opARR = [];
  200. while (i--) {
  201. opARR.push({
  202. 'orderProductID': inps[i].id.slice(1),
  203. 'price': inps[i].value
  204. });
  205. }
  206. var ajaxSettings = {
  207. URL: "/bejeep/admin/ajax/order-update.php",
  208. method: "POST",
  209. reqType: "json",
  210. respType: "json",
  211. reqParams: {
  212. 'orderID': orderID,
  213. 'opARR': opARR
  214. },
  215. callback: function (ajResp) {
  216. var msgElem = document.getElementById('pw-msg'),
  217. totalCostElem = document.getElementById('tc' + orderID);
  218. if (ajResp.err !== false) {
  219. msgElem.textContent = 'An error occured';
  220. msgElem.className = 'msg-warn';
  221. } else {
  222. msgElem.textContent = 'Updated';
  223. msgElem.className = 'msg-inf';
  224. if (totalCostElem && isNumeric(ajResp.totalCost)) {
  225. totalCostElem.innerHTML = ajResp.totalCost;
  226. }
  227. }
  228. },
  229. addToPool: true,
  230. abortPending: true
  231. };
  232. ajaxExecute(ajaxSettings);
  233. }
  234. function statusWin(orderID, currStatus) {
  235. var pw = popwinCreate(),
  236. pwHTML,
  237. statusOpts = ['Reviewing', 'Cancelled', 'Shipped', 'In Customs', 'Out for Delivery', 'Returned', 'Complete'],
  238. ul = '<ul>',
  239. radChecked;
  240. for (var i = 0, iLen = statusOpts.length; i < iLen; i++) {
  241. radChecked = statusOpts[i] === currStatus ? ' checked' : '';
  242. ul += '<li><input name="status" type="radio" value="' + statusOpts[i] + '"' + radChecked +'>&nbsp' + statusOpts[i] + '</li>';
  243. }
  244. ul += '</ul>';
  245. pwHTML = '<form id="pw-status" name="pw-status"><div id="pw-msg"></div>' + ul + '<button type="button" onclick="statusUpdate('+ orderID + ')">Update</button></form>';
  246. pw.insertAdjacentHTML('beforeend', pwHTML);
  247. }
  248. function statusUpdate(orderID) {
  249. var frm = document.forms['pw-status'],
  250. status = frm.status.value;
  251. var ajaxSettings = {
  252. URL: "/bejeep/admin/ajax/order-status-update.php",
  253. method: "POST",
  254. reqType: "json",
  255. respType: "json",
  256. reqParams: {'orderID': orderID, 'status': status},
  257. callback: function (ajResp) {
  258. console.log(ajResp);
  259. var msgElem = document.getElementById('pw-msg');
  260. if (ajResp.err !== false) {
  261. msgElem.textContent = 'An error occured';
  262. msgElem.className = 'msg-warn';
  263. } else {
  264. msgElem.textContent = 'Updated';
  265. msgElem.className = 'msg-inf';
  266. var statusElem = document.getElementById(orderID);
  267. if(statusElem) {
  268. statusElem.innerHTML = status
  269. }
  270. }
  271. },
  272. addToPool: true,
  273. abortPending: true
  274. };
  275. ajaxExecute(ajaxSettings);
  276. }
  277. /************************************************************************
  278. * Utils
  279. ***********************************************************************/
  280. function isEmpty(val) {
  281. if (!val || (typeof val === "string" && val.trim() === "")) {
  282. return true;
  283. }
  284. return false;
  285. }
  286. function isNumeric(val) {
  287. if (typeof val === 'string') {
  288. val = val.replace(/,/g, '.');
  289. }
  290. return !isNaN(parseFloat(val)) && isFinite(val);
  291. }
  292. function fieldWarn(fiieldID) {
  293. var elem = document.getElementById(fiieldID);
  294. if (elem) {
  295. elem.classList.add('field-warn');
  296. }
  297. }
  298. function fieldsWarnClear(frm) {
  299. if (typeof frm !== 'object')
  300. return;
  301. var frmLen = frm.length;
  302. while (frmLen--) {
  303. frm[frmLen].classList.remove('field-warn');
  304. }
  305. }
  306. function windowDimm() {
  307. var a = document.documentElement,
  308. b = document.body,
  309. dm = document.getElementById('dimm'),
  310. dmW, dmH;
  311. if (!dm) {
  312. dm = document.createElement("div");
  313. dm.setAttribute("id", "dimm");
  314. document.body.appendChild(dm);
  315. }
  316. dmW = Math.max(a.clientWidth, a.scrollWidth, b.scrollWidth);
  317. dmH = Math.max(a.clientHeight, a.scrollHeight, b.scrollHeight);
  318. dm.setAttribute("style", "width:" + dmW + "px; height:" + dmH + "px;");
  319. }
  320. function windowDimmRemove() {
  321. var dm = document.getElementById('dimm');
  322. if (dm) {
  323. dm.parentNode.removeChild(dm);
  324. }
  325. }
  326. function popwinCreate(pos) {
  327. var doc = document,
  328. pw = doc.getElementById('popwin');
  329. if (pw) {
  330. pw.parentNode.removeChild(pw);
  331. }
  332. pw = doc.createElement('div');
  333. pw.setAttribute('id', 'popwin');
  334. /****** window position *********/
  335. if (pos === 'middle') {
  336. pw.style.opacity = 0;
  337. pw.style.top = 0;
  338. } else {
  339. pos = isNumeric(pos) ? parseInt(pos) : doc.documentElement.clientHeight * 15 / 100;
  340. pw.style.top = window.pageYOffset + pos + 'px';
  341. }
  342. // Close icon
  343. var iClose = doc.createElement('i');
  344. iClose.setAttribute('id', 'popwin-close');
  345. iClose.textContent = 'highlight_off';
  346. iClose.className = 'material-icons';
  347. iClose.addEventListener('click', popwinRemove, false);
  348. pw.appendChild(iClose);
  349. return doc.body.appendChild(pw);
  350. }
  351. function popwinMiddle() {
  352. var pwin = document.getElementById("popwin");
  353. if (pwin) {
  354. var pwRect = pwin.getBoundingClientRect();
  355. var vpH = document.documentElement.clientHeight;
  356. var pwTop = pwRect.height > vpH ? window.pageYOffset + 100 : (vpH - pwRect.height) / 2 + window.pageYOffset;
  357. pwin.style.top = pwTop + 'px';
  358. pwin.style.opacity = 1;
  359. }
  360. }
  361. function popwinRemove(fade) {
  362. var pwin = document.getElementById('popwin');
  363. if (pwin) {
  364. if (fade === true) {
  365. setTimeout(function () {
  366. Velocity(pwin, {opacity: 0}, {
  367. duration: 1000, complete: function () {
  368. pwin.parentNode.removeChild(pwin);
  369. windowDimmRemove();
  370. }
  371. });
  372. }, 2000);
  373. } else {
  374. pwin.parentNode.removeChild(pwin);
  375. windowDimmRemove();
  376. }
  377. }
  378. }