Can ask student browser where they are in the page
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
86cc2cad4a
commit
ff5cefa7ac
29
direct.go
29
direct.go
@ -35,7 +35,7 @@ func declareAPIAdminDirectRoutes(router *gin.RouterGroup) {
|
||||
}
|
||||
|
||||
func WSSurveyStats(sid int64) map[string]interface{} {
|
||||
var users []string
|
||||
var users []map[string]interface{}
|
||||
var nb int
|
||||
|
||||
WSClientsMutex.RLock()
|
||||
@ -43,7 +43,10 @@ func WSSurveyStats(sid int64) map[string]interface{} {
|
||||
if w, ok := WSClients[sid]; ok {
|
||||
nb = len(w)
|
||||
for _, ws := range w {
|
||||
users = append(users, ws.u.Login)
|
||||
users = append(users, map[string]interface{}{
|
||||
"id": ws.u.Id,
|
||||
"login": ws.u.Login,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -139,6 +142,26 @@ func SurveyWS(c *gin.Context) {
|
||||
ch <- msgCurrentState(survey)
|
||||
|
||||
go SurveyWS_run(ws, ch, survey.Id, u)
|
||||
go func(c chan WSMessage, sid int) {
|
||||
var v WSMessage
|
||||
var err error
|
||||
for {
|
||||
err = wsjson.Read(context.Background(), ws, &v)
|
||||
if err != nil {
|
||||
log.Println("Error when receiving message:", err)
|
||||
close(c)
|
||||
break
|
||||
}
|
||||
|
||||
if v.Action == "myscroll" {
|
||||
v.UserId = &u.Id
|
||||
v.SurveyId = &survey.Id
|
||||
WSAdminWriteAll(v)
|
||||
} else {
|
||||
log.Println("Unknown ws response:", v.Action)
|
||||
}
|
||||
}
|
||||
}(ch, int(survey.Id))
|
||||
}
|
||||
|
||||
func WSWriteAll(message WSMessage) {
|
||||
@ -423,6 +446,8 @@ func SurveyWSAdmin(c *gin.Context) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if v.Action == "where_are_you" {
|
||||
survey.WSWriteAll(v)
|
||||
} else {
|
||||
log.Println("Unknown admin action:", v.Action)
|
||||
}
|
||||
|
@ -89,6 +89,16 @@
|
||||
}
|
||||
updateUsers();
|
||||
|
||||
let scroll_states = { };
|
||||
let scroll_mean = 0;
|
||||
$: {
|
||||
let mean = 0;
|
||||
for (const k in scroll_states) {
|
||||
mean += scroll_states[k];
|
||||
}
|
||||
scroll_mean = mean / Object.keys(scroll_states).length;
|
||||
}
|
||||
|
||||
let responsesbyid = { };
|
||||
$: {
|
||||
const tmp = { };
|
||||
@ -200,6 +210,13 @@
|
||||
} else if (data.action && data.action == "new_ask") {
|
||||
asks.push({"id": data.question, "content": data.value, "userid": data.user});
|
||||
asks = asks;
|
||||
} else if (data.action && data.action == "myscroll" && wsstats && wsstats.users) {
|
||||
scroll_states[data.user] = parseFloat(data.value);
|
||||
for (const k in wsstats.users) {
|
||||
if (wsstats.users[k].id == data.user) {
|
||||
wsstats.users[k].myscroll = scroll_states[data.user];
|
||||
}
|
||||
}
|
||||
} else if (data.action && data.action == "end") {
|
||||
ws.close();
|
||||
updateSurvey();
|
||||
@ -646,23 +663,50 @@
|
||||
<i class="bi bi-arrow-clockwise"></i>
|
||||
<i class="bi bi-people"></i>
|
||||
</button>
|
||||
<h3>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-sm btn-warning ms-1 float-end"
|
||||
on:click={() => { scroll_states = {}; ws.send('{"action":"where_are_you"}')} }
|
||||
title="Rapporter l'avancement"
|
||||
>
|
||||
<i class="bi bi-geo-fill"></i>
|
||||
</button>
|
||||
<h3 id="users">
|
||||
Connectés
|
||||
{#if wsstats}
|
||||
<small class="text-muted">{wsstats.nb_clients} utilisateurs</small>
|
||||
{/if}
|
||||
{#if scroll_mean}
|
||||
<small
|
||||
class:text-danger={scroll_mean >= 0 && scroll_mean < 0.2}
|
||||
class:text-warning={scroll_mean >= 0.2 && scroll_mean < 0.6}
|
||||
class:text-info={scroll_mean >= 0.6 && scroll_mean < 0.9}
|
||||
class:text-success={scroll_mean >= 0.9}
|
||||
>Avancement global : {Math.trunc(scroll_mean*10000)/100} %</small>
|
||||
{/if}
|
||||
</h3>
|
||||
{#if wsstats && wsstats.users}
|
||||
<div class="row row-cols-5 py-3">
|
||||
{#each wsstats.users as login, lid (lid)}
|
||||
{#each wsstats.users as user, lid (lid)}
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<img alt="{login}" src="//photos.cri.epita.fr/thumb/{login}" class="card-img-top">
|
||||
<img alt="{user.login}" src="//photos.cri.epita.fr/thumb/{user.login}" class="card-img-top">
|
||||
<div class="card-footer text-center text-truncate p-0">
|
||||
<a href="users/{login}" target="_blank">
|
||||
{login}
|
||||
<a href="users/{user.login}" target="_blank">
|
||||
{user.login}
|
||||
</a>
|
||||
</div>
|
||||
{#if user.myscroll != null}
|
||||
<div
|
||||
class="card-footer py-0 px-1"
|
||||
class:bg-danger={user.myscroll >= 0 && user.myscroll < 0.2}
|
||||
class:bg-warning={user.myscroll >= 0.2 && user.myscroll < 0.6}
|
||||
class:bg-info={user.myscroll >= 0.6 && user.myscroll < 0.9}
|
||||
class:bg-success={user.myscroll >= 0.9}
|
||||
>
|
||||
Avancement : {Math.trunc(user.myscroll*10000)/100} %
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
|
@ -118,6 +118,9 @@
|
||||
} else {
|
||||
timer_init = null;
|
||||
}
|
||||
|
||||
} else if (data.action && data.action == "where_are_you") {
|
||||
ws.send('{"action":"myscroll", "value": "' + (window.scrollY/window.scrollMaxY) +'", "question": '+show_question+', "corrected": '+(survey.corrected==true)+'}')
|
||||
} else {
|
||||
show_question = null;
|
||||
if (timer_cancel) {
|
||||
|
Reference in New Issue
Block a user