Advertisement
Guest User

Untitled

a guest
May 25th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.29 KB | None | 0 0
  1. ;(function () {
  2. 'use strict';
  3.  
  4. angular
  5. .module('service.moodService', [])
  6. .service('moodService', moodService);
  7.  
  8. moodService.$inject = ['http', 'url', '$window', 'dateFactory', 'calendarSvc'];
  9.  
  10. function moodService(http, url, $window, dateFactory, calendarSvc) {
  11. var model = {};
  12. model.getMyMoodByDate = getMyMoodByDate;
  13. model.getMyMoodByYear = getMyMoodByYear;
  14. model.separateMoodPerMonth = separateMoodPerMonth;
  15. model.getCurrentMonth = getCurrentMonth;
  16. model.getCurrentYear = getCurrentYear;
  17. model.configureChart = configureChart;
  18. model.generateYearsArr = generateYearsArr;
  19. model.currentWeek = currentWeek;
  20. model.arrWeekMonth = arrWeekMonth;
  21.  
  22. var EMPTY_VALUE = 1;
  23. var MEDIUM_VALUE = 25;
  24. var MIN_TWO_VALUE = 20;
  25. var MAX_TWO_VALUE = 30;
  26. var UPPER_TWO_SMILE = 4;
  27. var BOTTOM_TWO_SMILE = 3;
  28. var empty = true;
  29.  
  30.  
  31. model.weekList = [
  32. {
  33. label: 'Week 1', number: 1
  34. },
  35. {
  36. label: 'Week 2', number: 2
  37. },
  38. {
  39. label: 'Week 3', number: 3
  40. },
  41. {
  42. label: 'Week 4', number: 4
  43. },
  44. {
  45. label: 'Week 5', number: 5
  46. },
  47. {
  48. label: 'Week 6', number: 6
  49. }
  50. ];
  51.  
  52. model.monthLabels = calendarSvc.getMonths();
  53.  
  54. model.dayLabels = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
  55.  
  56. model.smileLabels = [
  57. '&nbsp',
  58. '&nbsp',
  59. '<img src="content/images/moods-new/01_bad.svg" style="left:0"/>',
  60. '<img src="content/images/moods-new/02_somewhat_bad.svg" style="left:0"/>',
  61. '<img src="content/images/moods-new/03_ok.svg" style="left:0"/>',
  62. '<img src="content/images/moods-new/04_good.svg" style="left:0"/>',
  63. '<img src="content/images/moods-new/05_great.svg" style="left:0"/>'
  64. ];
  65. model.smileLabels2 = [
  66. '',
  67. '',
  68. '<img src="content/images/moods-new/01_bad.svg" style="left:0"/>',
  69. '',
  70. '<img src="content/images/moods-new/05_great.svg" style="left:0"/>'
  71. ];
  72.  
  73. return model;
  74.  
  75. function getDayNameWithNum(dayNum,dateObj) {
  76. var date = dateObj || (new Date());
  77. date.setDate(dayNum);
  78. var dayOfWeek = date.getDay() - 1;
  79. if (dayOfWeek === -1) {
  80. dayOfWeek = 6;
  81. }
  82. return {
  83. dayName: model.dayLabels[dayOfWeek],
  84. dayNum: dayNum,
  85. dayInWeek: date.getDay()
  86. }
  87. }
  88.  
  89. function arrWeekMonth(month) {
  90. var result = [];
  91. var tempStrArr = [];
  92. var date = new Date();
  93. if (month){
  94. date.setMonth(month);
  95. }
  96. var currentMonth = date.getMonth();
  97. var numberOfWeek = 1;
  98. date.setDate(0);
  99. if (getDayNameWithNum(1).dayInWeek !== 1){
  100. var day = null;
  101. while(true){
  102. day = date.getDate();
  103. if (getDayNameWithNum(day, date).dayInWeek === 1){
  104. break;
  105. }
  106. date.setDate(date.getDate()-1);
  107. }
  108. }
  109. do {
  110. tempStrArr = date.toString().split(" ");
  111. result.push({
  112. label: tempStrArr[1]+" "+tempStrArr[2]+'th',
  113. number: numberOfWeek++
  114. });
  115. date.setDate(date.getDate()+7);
  116. } while(date.getMonth() !== currentMonth+1);
  117. return result;
  118. }
  119.  
  120. /**
  121. * Get moods array and transform for our format
  122. * @param credentials
  123. * @returns {Promise.<TResult>|*}
  124. */
  125. function getMyMoodByDate(credentials) {
  126. return http.get(url.mood.getMyMoodByDate, credentials)
  127. .then(function (res) {
  128. if (res.moods !== undefined) {
  129. res.moods.forEach(function (el) {
  130. var tmpDate = dateFactory.created_date(el.created_at * 1000);
  131. el.created_time_row = tmpDate.moodTime;
  132. el.created_month_row = tmpDate.moodMonth;
  133. el.created_week_row = tmpDate.weekDay;
  134. el.created_year_row = tmpDate.moodYear;
  135. });
  136. }
  137. return res;
  138. });
  139. }
  140.  
  141. function getMyMoodByYear(credentials) {
  142. return http.get(url.mood.getMyMoodByYear, credentials);
  143. }
  144.  
  145. /**
  146. * separate moods array per month for chart.
  147. * @param arr
  148. * @returns {Array}
  149. */
  150. function separateMoodPerMonth(arr) {
  151. var result = [];
  152. var arrayMood = arr || [];
  153. arrayMood.forEach(function (el) {
  154. var date = new Date(el.created_at * 1000);
  155. var month = date.getMonth() + 1;
  156. var existMonthIndex = _getIndexByMonth(result, month);
  157. if (typeof existMonthIndex !== 'undefined') {
  158. result[existMonthIndex].values.push(el.level);
  159. } else {
  160. var tmpObj = {
  161. month: month,
  162. values: [el.level],
  163. };
  164. result.push(tmpObj);
  165. }
  166. });
  167. return _getAverage(result);
  168. }
  169.  
  170. function _getIndexByMonth(arr, month) {
  171. var indexRes = undefined;
  172. arr.forEach(function (el, index) {
  173. if (el.month === month) {
  174. indexRes = index;
  175. }
  176. });
  177. return indexRes;
  178. }
  179.  
  180. /**
  181. * get average value from arr
  182. * @param arr
  183. * @returns {Array}
  184. * @private
  185. */
  186. function _getAverage(arr) {
  187. var result = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
  188. arr.forEach(function (element) {
  189. var tmpArr = [];
  190. element.values.forEach(function (el) {
  191. if (el === MIN_TWO_VALUE) {
  192. el = 2;
  193. tmpArr.push(el);
  194. }
  195. if (el === MAX_TWO_VALUE) {
  196. el = 6;
  197. tmpArr.push(el);
  198. } else {
  199. tmpArr.push(el);
  200. }
  201. });
  202. element.average = tmpArr.sum() / tmpArr.length;
  203. element.month--;
  204. result[element.month] = element.average;
  205. });
  206. return result;
  207. }
  208.  
  209. function currentWeek() {
  210. var currentDate = new Date();
  211. var first = (currentDate.getDate() - currentDate.getDay()) / 7;
  212. return Math.ceil(first);
  213. }
  214.  
  215. /**
  216. *
  217. * @returns {number}
  218. */
  219. function getCurrentMonth() {
  220. var date = new Date();
  221. return date.getMonth();
  222. }
  223.  
  224. /**
  225. *
  226. * @returns {number}
  227. */
  228. function getCurrentYear() {
  229. var date = new Date();
  230. return date.getFullYear();
  231. }
  232.  
  233.  
  234. function configureChart(week, moods, type, twoSmiles, data) {
  235. var chartData = [];
  236. var labels = [];
  237. if (typeof moods.group_by_week === 'undefined') {
  238. moods.group_by_week = [];
  239. if (moods.group_by_week === false) {
  240. empty = true;
  241. } else {
  242. empty = false;
  243. }
  244. }
  245. if (type === 'weekly') {
  246. var weekData = typeof moods.group_by_week[week] !== 'undefined' ? moods.group_by_week[week] : [];
  247. chartData = _transformMoodsPerWeek(weekData, twoSmiles);
  248. labels = model.dayLabels;
  249. } else {
  250. var arrData = _prepareMoodData(data, twoSmiles);
  251. chartData = arrData;
  252. labels = model.monthLabels;
  253. }
  254. // var width = $window.innerWidth * 0.7;
  255. var height = $window.innerHeight * 0.5;
  256. var chartObj = {
  257. credits: false,
  258. exporting: {
  259. enabled: false
  260. },
  261. chart: {
  262. type: 'line',
  263. height: height
  264. },
  265. plotOptions: {
  266. series: {
  267. color: '#26BB9C'
  268. }
  269. },
  270. title: {
  271. text: ''
  272. },
  273. series: [{
  274. data: chartData,
  275. id: 'series1'
  276. }],
  277. xAxis: {
  278. categories: labels
  279. },
  280. yAxis: {
  281. min: EMPTY_VALUE,
  282. tickInterval: 1,
  283. title: {
  284. text: ''
  285. },
  286. max: twoSmiles ? 5 : 6,
  287. labels: {
  288. style: {
  289. padding: '0 5px 5px 0',
  290. position: 'absolute',
  291. left: '10px',
  292. top: '-24px',
  293. },
  294. step: 1,
  295. useHTML: true,
  296. formatter: function () {
  297. if (twoSmiles) {
  298. return model.smileLabels2[this.value];
  299. } else {
  300. return model.smileLabels[this.value];
  301. }
  302.  
  303. }
  304. }
  305. },
  306. legend: {
  307. enabled: false
  308. },
  309. /* tooltip:{
  310. formatter: function() {
  311. // fixme if 6 smiles = true
  312. if (twoSmiles) {
  313. if (this.y > 3) {
  314. return "Yes";
  315. } else {
  316. return "No";
  317. }
  318.  
  319. }else{
  320. return this;
  321. }
  322. }
  323. },*/
  324. navigation: {
  325. buttonOptions: {
  326. enabled: false
  327. }
  328. }
  329. };
  330. if (twoSmiles) {
  331. chartObj.tooltip = {
  332. formatter: function () {
  333. if (this.y > BOTTOM_TWO_SMILE) {
  334. return "Yes";
  335. } else if (this.y < BOTTOM_TWO_SMILE + 1 && this.y > EMPTY_VALUE) {
  336. return "No";
  337. } else {
  338. return 'unanswered';
  339. }
  340. }
  341. };
  342. }
  343. return chartObj;
  344. }
  345.  
  346. function _prepareMoodData(data, twoSmiles) {
  347. if (data && data.length) {
  348. var arr = data.map(function (val) {
  349. var temp = +val;
  350. if (twoSmiles) {
  351. if (temp >= MEDIUM_VALUE) {
  352. return UPPER_TWO_SMILE;
  353. } else if (temp < MEDIUM_VALUE && temp > EMPTY_VALUE) {
  354. return BOTTOM_TWO_SMILE;
  355. } else {
  356. return EMPTY_VALUE;
  357. }
  358. } else if (temp === 0) {
  359. return EMPTY_VALUE;
  360. }
  361. return temp;
  362. });
  363. return arr;
  364. }
  365. }
  366.  
  367. /**
  368. * dynamically generate year list
  369. * @returns {Array}
  370. */
  371. function generateYearsArr() {
  372. var result = [];
  373. var currentYear = getCurrentYear();
  374. for (var i = currentYear; i > currentYear - 2; i--) {
  375. result.push(i);
  376. }
  377. return result;
  378. }
  379.  
  380. /**
  381. * Sort moods arr per day
  382. * @param moodsArr
  383. * @returns {[number,number,number,number,number,number,number]}
  384. * @private
  385. */
  386. function _transformMoodsPerWeek(moodsArr, twoSmiles) {
  387. // var result = [0, 0, 0, 0, 0, 0, 0];
  388. var result = [1, 1, 1, 1, 1, 1, 1];
  389. if (twoSmiles) {
  390. moodsArr.forEach(function (el) {
  391. var date = new Date(el.created_at * 1000);
  392. var dayOfWeek = date.getDay();
  393. if (dayOfWeek === 0) {
  394. dayOfWeek = 7; //Sunday is 0;
  395. }
  396. if (el.level > 10) {
  397. if (el.level === MAX_TWO_VALUE) {
  398. result[dayOfWeek - 1] = UPPER_TWO_SMILE;
  399. } else {
  400. result[dayOfWeek - 1] = BOTTOM_TWO_SMILE;
  401. }
  402. } else {
  403. result[dayOfWeek - 1] = EMPTY_VALUE;
  404. }
  405.  
  406. });
  407. return result;
  408. } else {
  409. moodsArr.forEach(function (el) {
  410. var date = new Date(el.created_at * 1000);
  411. var dayOfWeek = date.getDay();
  412. if (dayOfWeek === 0) {
  413. dayOfWeek = 7; //Sunday is 0;
  414. }
  415. if (el.level < 10 && el.level > EMPTY_VALUE) {
  416. result[dayOfWeek - 1] = el.level;
  417. } else {
  418. result[dayOfWeek - 1] = EMPTY_VALUE;
  419. }
  420. });
  421. return result;
  422. }
  423. }
  424. }
  425. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement