2022-05-01 10:59:53 +00:00
|
|
|
<script lang="ts">
|
|
|
|
import Chart from 'svelte-frappe-charts';
|
|
|
|
|
|
|
|
let className = '';
|
|
|
|
export { className as class };
|
|
|
|
|
|
|
|
export let question = null;
|
|
|
|
|
|
|
|
function refreshProposals() {
|
|
|
|
let req = question.getProposals();
|
|
|
|
|
|
|
|
req.then((proposals) => {
|
|
|
|
const proposal_idx = { };
|
|
|
|
for (const proposal of proposals) {
|
|
|
|
data.labels.push(proposal.label);
|
|
|
|
data.datasets[0].values.push(0);
|
|
|
|
proposal_idx[proposal.id] = new String(data.labels.length - 1);
|
|
|
|
}
|
|
|
|
|
2022-05-01 11:06:58 +00:00
|
|
|
req_responses = question.getResponses();
|
2022-05-01 10:59:53 +00:00
|
|
|
req_responses.then((responses) => {
|
|
|
|
for (const res of responses) {
|
2022-05-01 12:14:57 +00:00
|
|
|
const rsplt = res.value.split(',');
|
|
|
|
for (const r of rsplt) {
|
|
|
|
data.datasets[0].values[proposal_idx[r]] += 1;
|
|
|
|
}
|
2022-05-01 10:59:53 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
return req;
|
|
|
|
}
|
2022-05-01 11:06:58 +00:00
|
|
|
let req_proposals = null;
|
2022-09-01 18:53:15 +00:00
|
|
|
export let proposals = null;
|
2022-05-01 10:59:53 +00:00
|
|
|
let req_responses = null;
|
2022-09-01 17:11:26 +00:00
|
|
|
let mean = null;
|
2022-05-01 10:59:53 +00:00
|
|
|
|
2022-09-01 18:53:15 +00:00
|
|
|
export let data = {
|
2022-05-01 10:59:53 +00:00
|
|
|
labels: [],
|
|
|
|
datasets: [
|
|
|
|
{
|
|
|
|
values: []
|
|
|
|
}
|
|
|
|
]
|
2022-09-01 18:53:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
if (!proposals) {
|
2022-09-02 14:24:00 +00:00
|
|
|
if (question.kind && (question.kind == "int" || question.kind.startsWith("list"))) {
|
2022-09-01 18:53:15 +00:00
|
|
|
req_responses = question.getResponses();
|
|
|
|
req_responses.then((responses) => {
|
|
|
|
const values = [];
|
|
|
|
const proposal_idx = { };
|
2022-09-02 14:24:00 +00:00
|
|
|
for (const response of responses) {
|
|
|
|
let ress = [];
|
|
|
|
if (question.kind.startsWith("list")) {
|
|
|
|
ress = response.value.split('\n');
|
2022-09-01 18:53:15 +00:00
|
|
|
} else {
|
2022-09-02 14:24:00 +00:00
|
|
|
ress.push(response.value);
|
|
|
|
}
|
|
|
|
for (const res of ress) {
|
|
|
|
if (res == "") continue;
|
|
|
|
if (proposal_idx[res]) {
|
|
|
|
data.datasets[0].values[proposal_idx[res]] += 1;
|
|
|
|
values.push(Number(res));
|
|
|
|
} else {
|
|
|
|
data.labels.push(res);
|
|
|
|
data.datasets[0].values.push(1);
|
|
|
|
proposal_idx[res] = new String(data.labels.length - 1);
|
|
|
|
}
|
2022-09-01 18:53:15 +00:00
|
|
|
}
|
|
|
|
}
|
2022-09-02 14:24:00 +00:00
|
|
|
if (question.kind == "int") {
|
|
|
|
mean = Math.trunc(values.reduce((p, e) => p + e) / values.length*10)/10;
|
|
|
|
}
|
2022-09-01 18:53:15 +00:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
req_proposals = refreshProposals();
|
|
|
|
}
|
|
|
|
}
|
2022-05-01 10:59:53 +00:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<div class="{className}">
|
|
|
|
{#await req_proposals}
|
|
|
|
<div class="text-center mt-4">
|
|
|
|
<div class="spinner-border text-primary mx-3" role="status"></div>
|
|
|
|
<span>Récupération des propositions…</span>
|
|
|
|
</div>
|
|
|
|
{:then}
|
|
|
|
{#await req_responses}
|
|
|
|
<div class="text-center mt-4">
|
|
|
|
<div class="spinner-border text-primary mx-3" role="status"></div>
|
|
|
|
<span>Récupération des réponses…</span>
|
|
|
|
</div>
|
|
|
|
{:then}
|
2022-09-01 17:11:26 +00:00
|
|
|
{#if mean !== null}
|
|
|
|
<div class="text-center">
|
|
|
|
Moyenne représentative : <strong>{mean}</strong>
|
|
|
|
</div>
|
|
|
|
{/if}
|
|
|
|
{#if question.kind === "mcq"}
|
|
|
|
<Chart data={data} type="bar" />
|
2022-09-02 14:24:00 +00:00
|
|
|
{:else if question.kind === "list"}
|
|
|
|
<Chart data={data} type="pie" />
|
2022-09-01 17:11:26 +00:00
|
|
|
{:else}
|
|
|
|
<Chart data={data} type="pie" maxSlices="9" />
|
|
|
|
{/if}
|
2022-05-01 10:59:53 +00:00
|
|
|
{/await}
|
|
|
|
{/await}
|
|
|
|
</div>
|