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 @@