diff --git a/frontend/static/css/fic.css b/frontend/static/css/fic.css index 081f0c84..0c186d5f 100644 --- a/frontend/static/css/fic.css +++ b/frontend/static/css/fic.css @@ -29,9 +29,15 @@ body { .point { text-shadow: 0 0 20px #0055ff; } +.navbar-inverse .point { + text-shadow: 0 0 12px #0055ff; +} .end .point { text-shadow: 0 0 20px #ff5500; } +.navbar-inverse .end .point { + text-shadow: 0 0 12px #ff5500; +} @-webkit-keyframes clockanim { 0% { opacity: 1.0; } 50% { opacity: 0; } @@ -107,3 +113,53 @@ h1 small.authors { transition-delay: 0.7s; transition-duration: 0s; } + +.carousel-indicators { + bottom: -10px; +} +.carousel-caption { + padding: 0; + position: static; +} +.carousel .table { + margin-bottom: 0; +} +.carousel .table-condensed td { + padding: 2px; +} + +.table th.frotated { + border: 0; +} +.table th.rotated { + height: 100px; + width: 40px; + min-width: 40px; + max-width: 40px; + position: relative; + vertical-align: bottom; + padding: 0; + font-size: 12px; + line-height: 0.9; + border: 0; +} + +th.rotated > div { + position: relative; + top: 0px; + left: -50px; + height: 100%; + transform: skew(45deg,0deg); + overflow: hidden; + border: 1px solid #000; +} +th.rotated div span { + transform: skew(-45deg,0deg) rotate(45deg); + position: absolute; + bottom: 40px; + left: -35px; + display: inline-block; + width: 110px; + text-align: left; + text-overflow: ellipsis; +} diff --git a/frontend/static/js/public.js b/frontend/static/js/public.js index 6409e204..d1d7702a 100644 --- a/frontend/static/js/public.js +++ b/frontend/static/js/public.js @@ -60,29 +60,81 @@ angular.module("FICApp") } updTime(); }) - .controller("DataController", function($scope, $http, $rootScope, $timeout) { - $rootScope.refresh = function() { - $timeout.cancel($scope.cbd); - $scope.cbd = $timeout($rootScope.refresh, 4200); - $http.get("/demo.json").success(function(demo) { - $scope.my = demo; - }); - $http.get("/events.json").success(function(evts) { - var events = {}; + .controller("EventsController", function($scope, $http, $interval) { + $scope.events = []; + var refreshEvents = function() { + $http.get("/events.json").then(function(response) { + if ($scope.lasteventsetag != undefined && $scope.lasteventsetag == response.headers().etag) + return; + $scope.lasteventsetag = response.headers().etag; + + var events = response.data; var now = new Date(); - angular.forEach(evts, function(event, key) { - events["e" + event.id] = event; - event.since = now.getTime() - now.getTimezoneOffset() * 60000 - Date.parse(event.time); + var key = 0; + angular.forEach($scope.events, function(event) { + event.keep = 0; + }); + angular.forEach(events, function(event) { + event.time = Date.parse(event.time); + //event.since = now.getTime() - now.getTimezoneOffset() * 60000 - event.time; + event.since = now.getTime() - event.time; + event.keep = 1; + while (key <= $scope.events.length) { + if (key >= $scope.events.length) { + $scope.events.push(event); + break; + } else if (event.id == $scope.events[key].id) { + $scope.events[key].txt = event.txt; + $scope.events[key].time = event.time; + $scope.events[key].kind = event.kind; + $scope.events[key].since = event.since; + $scope.events[key].keep = 1; + break; + } else if (event.time > $scope.events[key].time) { + $scope.events.unshift(event); + break; + } else { + key += 1; + } + } + }); + angular.forEach($scope.events, function(event, i) { + if (event.keep == 0) { + $scope.events.splice(i, 1); + } }); - $scope.events = events; }); - $http.get("/public.json").success(function(scene) { - $scope.scene = scene; + } + refreshEvents() + $interval(refreshEvents, 2100); + }) + .controller("DataController", function($scope, $http, $rootScope, $interval) { + var refreshScene = function() { + $http.get("/public.json").then(function(response) { + if ($scope.lastpublicetag == response.headers().etag) + return; + $scope.lastpublicetag = response.headers().etag; + + $scope.scene = response.data; + }); + } + var refreshData = function() { + $http.get("/my.json").then(function(response) { + if ($scope.lastmyetag == response.headers().etag) + return; + $scope.lastmyetag = response.headers().etag; + + $scope.my = response.data; }); $http.get("/stats.json").success(function(stats) { $scope.stats = stats; }); - $http.get("/themes.json").success(function(themes) { + $http.get("/themes.json").then(function(response) { + if ($scope.lastthemeetag == response.headers().etag) + return; + $scope.lastthemeetag = response.headers().etag; + + var themes = response.data; $scope.themes = themes; $scope.max_gain = 0; angular.forEach(themes, function(theme, key) { @@ -94,7 +146,13 @@ angular.module("FICApp") $scope.max_gain += theme.gain; }, themes); }); - $http.get("/teams.json").success(function(teams) { + $http.get("/teams.json").then(function(response) { + if ($scope.lastteametag == response.headers().etag) + return; + $scope.lastteametag = response.headers().etag; + + var teams = response.data; + $scope.teams_count = Object.keys(teams).length $scope.teams = teams; @@ -106,7 +164,15 @@ angular.module("FICApp") } }, $scope.rank); }); - console.log("refresh!"); } - $rootScope.refresh(); + refreshData(); + refreshScene(); + $interval(refreshData, 4200); + $interval(refreshScene, 900); + }) + .controller("TeamController", function($scope, $http, $interval) { + $scope.mystats = null; + $http.get("/api/teams/" + $scope.team.id + "/stats.json").success(function(mstats) { + $scope.mystats = mstats; + }); }); diff --git a/frontend/static/public.html b/frontend/static/public.html index b805d76c..f9c98501 100644 --- a/frontend/static/public.html +++ b/frontend/static/public.html @@ -20,150 +20,135 @@ - - - - -