e-ucm/rage-analytics-frontend

View on GitHub
app/public/js/controllers/activity-list.js

Summary

Maintainability
C
1 day
Test Coverage
/*
 * Copyright 2016 e-UCM (http://www.e-ucm.es/)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * This project has received funding from the European Union’s Horizon
 * 2020 research and innovation programme under grant agreement No 644187.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0 (link is external)
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

'use strict';

angular.module('activitiesApp', ['ngStorage', 'services'])
    .controller('ActivityListCtrl', ['$rootScope', '$scope', '$attrs', '$interpolate', '$http', 'Activities',
        'Games', 'Versions', 'Classes', 'blockUI', 'CONSTANTS',
        function ($rootScope, $scope, $attrs, $interpolate, $http, Activities, Games, Versions, Classes,
                  blockUI, CONSTANTS) {

            $scope.activityOpenedError = '';
            $scope.activityCreatedError = '';
            $scope.activity = {};

            var loadByClass = function (classId) {
                $scope.classId = classId;
                $scope.games = Games.public();
                $scope.activities = Activities.forClass({classId: $scope.classId});
            };

            var loadByGameAndVersion = function (gameId, versionId) {
                $scope.gameId = gameId;
                $scope.versionId = versionId;
                $scope.classes = Classes.my();
                $scope.activities = Activities.forGame({gameId: $scope.gameId, versionId: $scope.versionId});
            };

            var loadAll = function () {
                $scope.activities = Activities.my();
                $scope.classes = Classes.my();
                $scope.games = Games.public();
            };

            if (!$attrs.classid && !$attrs.gameid && !$attrs.versionid) {
                loadAll();
            }

            $attrs.$observe('classid', function () {
                if ($attrs.classid) {
                    loadByClass($attrs.classid);
                }
            });

            $attrs.$observe('gameid', function () {
                if ($attrs.gameid && $attrs.versionid) {
                    loadByGameAndVersion($attrs.gameid, $attrs.versionid);
                }
            });

            $attrs.$observe('versionid', function () {
                if ($attrs.gameid && $attrs.versionid) {
                    loadByGameAndVersion($attrs.gameid, $attrs.versionid);
                }
            });

            $scope.$on('refreshClasses', function () {
                Classes.my().$promise
                    .then(function (classes) {
                        $scope.classes = classes;
                    })
                    .then(function () {
                        Activities.my().$promise.then(function (activities) {
                            $scope.activities = activities;
                        });
                    });
            });

            $scope.$on('refreshGames', function () {
                Games.public().$promise.then(function (games) {
                    $scope.games = games;
                });
                Activities.my().$promise.then(function (activities) {
                    $scope.activities = activities;
                });
            });

            $scope.$on('refreshActivities', function () {
                Activities.my().$promise.then(function (activities) {
                    $scope.activities = activities;
                });
            });


            $scope.createActivity = function () {
                var activityName = $scope.activity.name ? $scope.activity.name : 'New activity';
                var classId = $scope.classId ? $scope.classId : $scope.activity.classId;
                var gameId = $scope.gameId ? $scope.gameId : $scope.activity.gameId;
                var versionId = $scope.versionId;

                $scope.activityCreatedError = '';
                if (!gameId) {
                    // It's necessary to pick a game
                    $scope.activityCreatedError = 'Please, select a game.';
                    return;
                }

                if (!classId) {
                    // It's necessary to pick a class
                    $scope.activityCreatedError = 'Please, select a class.';
                    return;
                }

                if (!versionId) {
                    Versions.forGame({gameId: gameId}).$promise.then(function (versions) {
                        if (versions && versions.length > 0 && versions[0]._id) {
                            doCreateActivity(activityName, gameId, versions[0]._id, classId);
                        } else {
                            console.log('No version for the selected gameId');
                        }
                    });
                } else {
                    doCreateActivity(activityName, gameId, versionId, classId);
                }

            };

            $scope.type = {
                offline: false
            };
            var doCreateActivity = function (activityName, gameId, versionId, classId) {
                var activity = new Activities();
                activity.name = activityName;
                activity.gameId = gameId;
                activity.versionId = versionId;
                activity.classId = classId;

                if ($scope.type.offline) {
                    activity.offline = true;
                    activity.allowAnonymous = true;
                } else {
                    activity.offline = false;
                    activity.allowAnonymous = false;
                }
                blockUI.start();
                activity.$save().then(function () {
                    $scope.goToActivity(activity);
                    $rootScope.$broadcast('refreshActivities');
                    blockUI.stop();
                });
            };

            $scope.deleteActivity = function (activityObj) {
                if (activityObj) {
                    activityObj.$remove().then(function () {
                        $rootScope.$broadcast('refreshActivities');
                    });
                }
            };

            $scope.getClassById = function (_id) {
                var r = null;
                if ($scope.classes) {
                    $scope.classes.forEach(function (c) {
                        if (c._id === _id) {
                            r = c;
                        }
                    });
                }
                return r;
            };

            $scope.getGameById = function (_id) {
                var r = null;
                if ($scope.games) {
                    $scope.games.forEach(function (g) {
                        if (g._id === _id) {
                            r = g;
                        }
                    });
                }
                return r;
            };
        }
    ]);