Advertisement
Guest User

Untitled

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