public: can control up to 9 separate displays

This commit is contained in:
nemunaire 2017-12-18 00:30:23 +01:00
parent eb858ba90a
commit c574b85fd5
7 changed files with 31 additions and 19 deletions

View File

@ -2,6 +2,7 @@ package api
import (
"encoding/json"
"fmt"
"os"
"path"
@ -11,9 +12,9 @@ import (
var TeamsDir string
func init() {
router.GET("/api/public.json", apiHandler(getPublic))
router.DELETE("/api/public.json", apiHandler(deletePublic))
router.PUT("/api/public.json", apiHandler(savePublic))
router.GET("/api/public/:sid", apiHandler(getPublic))
router.DELETE("/api/public/:sid", apiHandler(deletePublic))
router.PUT("/api/public/:sid", apiHandler(savePublic))
}
type FICPublicScene struct {
@ -52,23 +53,23 @@ func savePublicTo(path string, s []FICPublicScene) error {
}
}
func getPublic(_ httprouter.Params, body []byte) (interface{}, error) {
if _, err := os.Stat(path.Join(TeamsDir, "_public", "public.json")); !os.IsNotExist(err) {
return readPublic(path.Join(TeamsDir, "_public", "public.json"))
func getPublic(ps httprouter.Params, body []byte) (interface{}, error) {
if _, err := os.Stat(path.Join(TeamsDir, "_public", fmt.Sprintf("public%s.json", ps.ByName("sid")))); !os.IsNotExist(err) {
return readPublic(path.Join(TeamsDir, "_public", fmt.Sprintf("public%s.json", ps.ByName("sid"))))
} else {
return []FICPublicScene{}, nil
}
}
func deletePublic(_ httprouter.Params, body []byte) (interface{}, error) {
if err := savePublicTo(path.Join(TeamsDir, "_public", "public.json"), []FICPublicScene{}); err != nil {
func deletePublic(ps httprouter.Params, body []byte) (interface{}, error) {
if err := savePublicTo(path.Join(TeamsDir, "_public", fmt.Sprintf("public%s.json", ps.ByName("sid"))), []FICPublicScene{}); err != nil {
return nil, err
} else {
return []FICPublicScene{}, err
}
}
func savePublic(_ httprouter.Params, body []byte) (interface{}, error) {
func savePublic(ps httprouter.Params, body []byte) (interface{}, error) {
var scenes []FICPublicScene
if err := json.Unmarshal(body, &scenes); err != nil {
return nil, err
@ -80,7 +81,7 @@ func savePublic(_ httprouter.Params, body []byte) (interface{}, error) {
}
}
if err := savePublicTo(path.Join(TeamsDir, "_public", "public.json"), scenes); err != nil {
if err := savePublicTo(path.Join(TeamsDir, "_public", fmt.Sprintf("public%s.json", ps.ByName("sid"))), scenes); err != nil {
return nil, err
} else {
return scenes, err

View File

@ -33,7 +33,7 @@ const indextpl = `<!DOCTYPE html>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}teams">&Eacute;quipes</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}themes">Thèmes</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}exercices">Exercices</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}public">Public</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}public/0">Public</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}events">&Eacute;vénements</a></li>
<li class="nav-item"><a class="nav-link" href="{{.urlbase}}settings">Paramètres</a></li>
</ul>

View File

@ -19,7 +19,7 @@ func init() {
api.Router().GET("/events/*_", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
http.ServeFile(w, r, path.Join(StaticDir, "index.html"))
})
api.Router().GET("/public", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
api.Router().GET("/public/*_", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
http.ServeFile(w, r, path.Join(StaticDir, "index.html"))
})
api.Router().GET("/settings/*_", func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {

View File

@ -31,7 +31,7 @@
<li class="nav-item"><a class="nav-link" href="/teams">&Eacute;quipes</a></li>
<li class="nav-item"><a class="nav-link" href="/themes">Thèmes</a></li>
<li class="nav-item"><a class="nav-link" href="/exercices">Exercices</a></li>
<li class="nav-item"><a class="nav-link" href="/public">Public</a></li>
<li class="nav-item"><a class="nav-link" href="/public/0">Public</a></li>
<li class="nav-item"><a class="nav-link" href="/events">&Eacute;vénements</a></li>
<li class="nav-item"><a class="nav-link" href="/settings">Paramètres</a></li>
</ul>

View File

@ -41,7 +41,7 @@ angular.module("FICApp", ["ngRoute", "ngResource", "ngSanitize"])
controller: "TeamController",
templateUrl: "views/team-stats.html"
})
.when("/public", {
.when("/public/:screenId", {
controller: "PublicController",
templateUrl: "views/public.html"
})
@ -77,7 +77,7 @@ angular.module("FICApp")
})
})
.factory("Scene", function($resource) {
return $resource("/api/public.json", null, {
return $resource("/api/public/:screenId", { screenId: '@id' }, {
'update': {method: 'PUT', isArray: true},
})
})
@ -377,11 +377,20 @@ angular.module("FICApp")
};
})
.controller("PublicController", function($scope, $rootScope, Scene, Theme, Teams, Exercice) {
$scope.scenes = Scene.query();
.controller("PublicController", function($scope, $rootScope, $routeParams, $location, Scene, Theme, Teams, Exercice) {
$scope.screens = [0,1,2,3,4,5,6,7,8,9];
$scope.screenid = $routeParams.screenId;
$scope.scenes = Scene.query({ screenId: $routeParams.screenId });
$scope.themes = Theme.query();
$scope.teams = Teams.get();
$scope.chScreen = function(sid) {
if ($scope.screenid)
$location.url("/public/" + $scope.screenid);
else
$location.url("/public/");
}
$scope.types = {
"welcome": "Messages de bienvenue",
"countdown": "Compte à rebours",
@ -462,9 +471,10 @@ angular.module("FICApp")
];
}
};
$scope.saveScenes = function() {
$scope.someUpdt = false;
var prms = Scene.update($scope.scenes);
var prms = Scene.update({ screenId: $scope.screenid }, $scope.scenes);
prms.$promise.then(function() {
$rootScope.newBox('success', 'Scene successfully published!');
}, function(response) {

View File

@ -1,6 +1,7 @@
<form ng-submit="saveScenes()" class="form-horizontal">
<h2>
Interface publique
<select class="custom-select" id="screenid" ng-model="screenid" ng-options="k as 'Écran ' + v for (k, v) in screens" ng-change="chScreen()"></select>
<div class="float-right dropdown">
<button class="btn btn-secondary dropdown-toggle mr-sm-2" type="button" data-toggle="dropdown">
Charger scène

View File

@ -131,7 +131,7 @@ angular.module("FICApp")
})
.controller("DataController", function($scope, $http, $rootScope, $interval) {
var refreshScene = function() {
$http.get("/public.json").then(function(response) {
$http.get(window.location.pathname.replace(".html", ".json")).then(function(response) {
if ($scope.lastpublicetag == response.headers().etag)
return;
$scope.lastpublicetag = response.headers().etag;