PageRenderTime 39ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/Gradebook/Scripts/app/class.result.list.js

https://bitbucket.org/academium/gradebook
JavaScript | 203 lines | 163 code | 24 blank | 16 comment | 39 complexity | cc668fcdfe6c740bf74c126a55606e7b MD5 | raw file
  1. /// <reference path="../zepto.min.js" />
  2. /// <reference path="../knockout-2.2.1.debug.js" />
  3. /// <reference path="../underscore-ko-1.2.2.js" />
  4. /// <reference path="../underscore.js" />
  5. /// <reference path="class.result.js" />
  6. /// <reference path="class.subject.js" />
  7. /// <reference path="task.js" />
  8. /// <reference path="task.result.js" />
  9. /// <reference path="task.type.js" />
  10. function ClassResultList() {
  11. var self = this;
  12. // Data
  13. self.tasks = ko.observableArray();
  14. self.items = ko.observableArray();
  15. self.term = ko.observable({ id: 0, name: "Overall" });
  16. self.taskTypes = ko.observableArray();
  17. self.type = ko.observable({ id: 0, name: "All" });
  18. self.classes = ko.observableArray();
  19. self.class = ko.observable();
  20. self.classIndex = function () {
  21. return self.classes.indexOf(self.class);
  22. };
  23. // Computed data
  24. self.averageRate = ko.computed(function () {
  25. var items = self.items();
  26. if (_.isNull(items) || _.isEmpty(items)) return 0;
  27. var sum = _.reduce(items, function (memo, item) {
  28. return memo + item.rate();
  29. }, 0);
  30. return Math.round(sum * 100 / items.length) / 100;
  31. });
  32. // Properties
  33. self.isEmpty = ko.computed(function () {
  34. var items = self.items();
  35. return _.isNull(items) || _.isEmpty(items);
  36. });
  37. self.hasNext = ko.computed(function () {
  38. return self.classIndex() + 1 < self.classes().length;
  39. });
  40. self.hasPrev = ko.computed(function () {
  41. return self.classIndex() - 1 > 0;
  42. });
  43. self.hasFitLength = function () {
  44. var items = self.items();
  45. var tasks = self.tasks();
  46. if (!_.isNull(items) && !_.isEmpty(items) && !_.isNull(tasks) && !_.isEmpty(tasks)) {
  47. return items[0].results().length == tasks.length;
  48. }
  49. return false;
  50. };
  51. // Load/save data
  52. self.load = function () {
  53. var classSubject = self.class();
  54. var term = self.term();
  55. var type = self.type();
  56. if (classSubject == null || term == null || type == null) return;
  57. var params = $.param({
  58. code: classSubject.id,
  59. term: term.id,
  60. type: type.id
  61. });
  62. $.getJSON("api/tasks?" + params, function (data) {
  63. var mappedData = $.map(data, function (item) {
  64. return new Task(item);
  65. });
  66. self.tasks(mappedData);
  67. });
  68. $.getJSON("api/grades/class?" + params, function (data) {
  69. var mappedData = $.map(data, function (item) {
  70. return new ClassResult(item);
  71. });
  72. self.items(mappedData);
  73. });
  74. };
  75. self.save = function () {
  76. $.ajax({
  77. type: 'POST',
  78. url: 'api/grades/list',
  79. contentType: 'application/json',
  80. data: JSON.stringify(self.getGrades())
  81. });
  82. };
  83. self.preload = function () {
  84. var classSubject = self.class();
  85. if (classSubject == null) return;
  86. var params = $.param({
  87. code: classSubject.id
  88. });
  89. $.getJSON("api/tasktypes?" + params, function (data) {
  90. var mappedData = $.map(data, function (item) {
  91. return new TaskType(item);
  92. });
  93. self.taskTypes(mappedData);
  94. self.taskTypes.unshift(new TaskType({ Id: 0, Name: "All" }));
  95. });
  96. $.getJSON("/api/subjects/classes/", function (data) {
  97. var mappedData = $.map(data, function (item) {
  98. return new ClassSubject(item);
  99. });
  100. self.classes(mappedData);
  101. });
  102. };
  103. // Behaviours
  104. self.next = function () {
  105. if (!hasNext) return;
  106. var index = self.classIndex() + 1;
  107. self.goToClass(index);
  108. };
  109. self.prev = function () {
  110. if (!hasPrev) return;
  111. var index = self.classIndex() - 1;
  112. self.goToClass(index);
  113. };
  114. self.goToClass = function (index) {
  115. var item = self.classes()[index];
  116. self.class(item);
  117. };
  118. // Subscriptions
  119. self.class.subscribe(function () {
  120. self.preload();
  121. self.load();
  122. });
  123. self.term.subscribe(function () {
  124. self.load();
  125. });
  126. self.type.subscribe(function () {
  127. self.load();
  128. });
  129. // Functions
  130. self.getRank = function (classResult) {
  131. var items = self.items();
  132. if (_.isNull(items) || _.isEmpty(items) || classResult == undefined) return 0;
  133. var studentRate = classResult.rate();
  134. if (!studentRate) return 0;
  135. var rates = _.map(items, function (item) {
  136. return item.rate();
  137. });
  138. rates = _.sortBy(rates, function (a, b) { return b - a; });
  139. return _.indexOf(rates, studentRate) + 1;
  140. };
  141. self.getAverage = function (task) {
  142. var items = self.items();
  143. if (_.isNull(items)
  144. || _.isEmpty(items)
  145. || task == undefined
  146. || !self.hasFitLength())
  147. return 0;
  148. var sum = _.reduce(items, function (memo, item) {
  149. var taskResult = _.find(item.results(), function (r) {
  150. return r.taskId == task.id;
  151. });
  152. if (taskResult != null) {
  153. var result = parseInt(taskResult.result());
  154. if (result) return memo + result;
  155. }
  156. return memo;
  157. }, 0);
  158. return Math.round(sum * 100 / items.length) / 100;
  159. };
  160. self.allDone = function (task) {
  161. var items = self.items();
  162. if (_.isNull(items) || _.isEmpty(items) || !self.hasFitLength()) return false;
  163. return _.all(items, function (item) {
  164. var taskResult = _.find(item.results(), function (r) {
  165. return r.taskId == task.id;
  166. });
  167. if (taskResult != null) {
  168. return taskResult.result() > 0;
  169. }
  170. return false;
  171. });
  172. };
  173. self.getGrades = function () {
  174. if (self.isEmpty()) return null;
  175. return _.reduce(self.items(), function (memo, item) {
  176. return _.union(memo, item.getGrades());
  177. }, []);
  178. };
  179. }