/Gradebook/Scripts/app/class.result.list.js
JavaScript | 203 lines | 163 code | 24 blank | 16 comment | 39 complexity | cc668fcdfe6c740bf74c126a55606e7b MD5 | raw file
- /// <reference path="../zepto.min.js" />
- /// <reference path="../knockout-2.2.1.debug.js" />
- /// <reference path="../underscore-ko-1.2.2.js" />
- /// <reference path="../underscore.js" />
- /// <reference path="class.result.js" />
- /// <reference path="class.subject.js" />
- /// <reference path="task.js" />
- /// <reference path="task.result.js" />
- /// <reference path="task.type.js" />
-
- function ClassResultList() {
- var self = this;
-
- // Data
- self.tasks = ko.observableArray();
- self.items = ko.observableArray();
- self.term = ko.observable({ id: 0, name: "Overall" });
- self.taskTypes = ko.observableArray();
- self.type = ko.observable({ id: 0, name: "All" });
- self.classes = ko.observableArray();
- self.class = ko.observable();
- self.classIndex = function () {
- return self.classes.indexOf(self.class);
- };
-
- // Computed data
- self.averageRate = ko.computed(function () {
- var items = self.items();
- if (_.isNull(items) || _.isEmpty(items)) return 0;
-
- var sum = _.reduce(items, function (memo, item) {
- return memo + item.rate();
- }, 0);
-
- return Math.round(sum * 100 / items.length) / 100;
- });
-
- // Properties
- self.isEmpty = ko.computed(function () {
- var items = self.items();
- return _.isNull(items) || _.isEmpty(items);
- });
- self.hasNext = ko.computed(function () {
- return self.classIndex() + 1 < self.classes().length;
- });
- self.hasPrev = ko.computed(function () {
- return self.classIndex() - 1 > 0;
- });
- self.hasFitLength = function () {
- var items = self.items();
- var tasks = self.tasks();
- if (!_.isNull(items) && !_.isEmpty(items) && !_.isNull(tasks) && !_.isEmpty(tasks)) {
- return items[0].results().length == tasks.length;
- }
- return false;
- };
-
- // Load/save data
- self.load = function () {
- var classSubject = self.class();
- var term = self.term();
- var type = self.type();
-
- if (classSubject == null || term == null || type == null) return;
-
- var params = $.param({
- code: classSubject.id,
- term: term.id,
- type: type.id
- });
-
- $.getJSON("api/tasks?" + params, function (data) {
- var mappedData = $.map(data, function (item) {
- return new Task(item);
- });
- self.tasks(mappedData);
- });
-
- $.getJSON("api/grades/class?" + params, function (data) {
- var mappedData = $.map(data, function (item) {
- return new ClassResult(item);
- });
- self.items(mappedData);
- });
- };
- self.save = function () {
- $.ajax({
- type: 'POST',
- url: 'api/grades/list',
- contentType: 'application/json',
- data: JSON.stringify(self.getGrades())
- });
- };
- self.preload = function () {
- var classSubject = self.class();
- if (classSubject == null) return;
-
- var params = $.param({
- code: classSubject.id
- });
- $.getJSON("api/tasktypes?" + params, function (data) {
- var mappedData = $.map(data, function (item) {
- return new TaskType(item);
- });
- self.taskTypes(mappedData);
- self.taskTypes.unshift(new TaskType({ Id: 0, Name: "All" }));
- });
-
- $.getJSON("/api/subjects/classes/", function (data) {
- var mappedData = $.map(data, function (item) {
- return new ClassSubject(item);
- });
- self.classes(mappedData);
- });
- };
-
- // Behaviours
- self.next = function () {
- if (!hasNext) return;
- var index = self.classIndex() + 1;
- self.goToClass(index);
- };
- self.prev = function () {
- if (!hasPrev) return;
- var index = self.classIndex() - 1;
- self.goToClass(index);
- };
- self.goToClass = function (index) {
- var item = self.classes()[index];
- self.class(item);
- };
-
- // Subscriptions
- self.class.subscribe(function () {
- self.preload();
- self.load();
- });
- self.term.subscribe(function () {
- self.load();
- });
- self.type.subscribe(function () {
- self.load();
- });
-
- // Functions
- self.getRank = function (classResult) {
- var items = self.items();
- if (_.isNull(items) || _.isEmpty(items) || classResult == undefined) return 0;
-
- var studentRate = classResult.rate();
- if (!studentRate) return 0;
-
- var rates = _.map(items, function (item) {
- return item.rate();
- });
-
- rates = _.sortBy(rates, function (a, b) { return b - a; });
-
- return _.indexOf(rates, studentRate) + 1;
- };
- self.getAverage = function (task) {
- var items = self.items();
- if (_.isNull(items)
- || _.isEmpty(items)
- || task == undefined
- || !self.hasFitLength())
- return 0;
-
- var sum = _.reduce(items, function (memo, item) {
- var taskResult = _.find(item.results(), function (r) {
- return r.taskId == task.id;
- });
- if (taskResult != null) {
- var result = parseInt(taskResult.result());
- if (result) return memo + result;
- }
- return memo;
- }, 0);
-
- return Math.round(sum * 100 / items.length) / 100;
- };
- self.allDone = function (task) {
- var items = self.items();
- if (_.isNull(items) || _.isEmpty(items) || !self.hasFitLength()) return false;
-
- return _.all(items, function (item) {
- var taskResult = _.find(item.results(), function (r) {
- return r.taskId == task.id;
- });
- if (taskResult != null) {
- return taskResult.result() > 0;
- }
- return false;
- });
- };
- self.getGrades = function () {
- if (self.isEmpty()) return null;
-
- return _.reduce(self.items(), function (memo, item) {
- return _.union(memo, item.getGrades());
- }, []);
- };
- }