Can ask student browser where they are in the page
continuous-integration/drone/push Build is passing Details

This commit is contained in:
nemunaire 2022-09-06 19:26:05 +02:00
parent 86cc2cad4a
commit ff5cefa7ac
3 changed files with 79 additions and 7 deletions

View File

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

View File

@ -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&nbsp;: {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&nbsp;: {Math.trunc(user.myscroll*10000)/100}&nbsp;%
</div>
{/if}
</div>
</div>
{/each}

View File

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