Add open feedback component, update vertical bar chart
This commit is contained in:
parent
956970ce5f
commit
b7038c1a9c
|
|
@ -0,0 +1,22 @@
|
||||||
|
<template>
|
||||||
|
<QuestionSummary :title="props.title" :text="props.text">
|
||||||
|
<h5 class="mb-8 text-base">{{ answers.length }} {{ $t("feedback.answers") }}</h5>
|
||||||
|
<ol>
|
||||||
|
<li v-for="answer of props.answers" :key="answer" class="mb-2 last:mb-0">
|
||||||
|
<p>{{ answer }}</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</QuestionSummary>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import QuestionSummary from "@/components/ui/QuestionSummary.vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
answers: string[];
|
||||||
|
title: string;
|
||||||
|
text: string;
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="postcss" scoped></style>
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<QuestionSummary :title="props.title" :text="props.text">
|
<QuestionSummary :title="props.title" :text="props.text">
|
||||||
<h5 class="text-base mb-6">{{ answers }} {{ $t("feedback.answers") }}</h5>
|
<h5 class="mb-6 text-base">{{ answers }} {{ $t("feedback.answers") }}</h5>
|
||||||
<div
|
<div
|
||||||
class="grid grid-cols-horizontal-bar-chart-slim grid-rows-horizontal-bar-chart overflow-hidden pt-[10px] grid-areas-horizontal-bar-chart md:grid-cols-horizontal-bar-chart"
|
class="grid grid-cols-horizontal-bar-chart-slim grid-rows-horizontal-bar-chart overflow-hidden pt-[10px] grid-areas-horizontal-bar-chart md:grid-cols-horizontal-bar-chart"
|
||||||
>
|
>
|
||||||
|
|
@ -33,10 +33,14 @@
|
||||||
{{ $t("general.no") }}
|
{{ $t("general.no") }}
|
||||||
</PopoverButton>
|
</PopoverButton>
|
||||||
<PopoverPanel
|
<PopoverPanel
|
||||||
class="absolute top-[-200%] font-normal z-10 w-[120px] border border-gray-500 bg-white p-1 text-left text-sm"
|
class="absolute top-[-200%] z-10 w-[120px] border border-gray-500 bg-white p-1 text-left text-sm font-normal"
|
||||||
>
|
>
|
||||||
<p>
|
<p>
|
||||||
{{ `"${$t('general.no')}" ${numberOfRatings["no"]} ${$t("feedback.answers")}` }}
|
{{
|
||||||
|
`"${$t("general.no")}" ${numberOfRatings["no"]} ${$t(
|
||||||
|
"feedback.answers"
|
||||||
|
)}`
|
||||||
|
}}
|
||||||
</p>
|
</p>
|
||||||
</PopoverPanel>
|
</PopoverPanel>
|
||||||
</Popover>
|
</Popover>
|
||||||
|
|
@ -47,10 +51,14 @@
|
||||||
{{ $t("general.yes") }}
|
{{ $t("general.yes") }}
|
||||||
</PopoverButton>
|
</PopoverButton>
|
||||||
<PopoverPanel
|
<PopoverPanel
|
||||||
class="absolute top-[-200%] font-normal z-10 w-[120px] border border-gray-500 bg-white p-1 text-left text-sm"
|
class="absolute top-[-200%] z-10 w-[120px] border border-gray-500 bg-white p-1 text-left text-sm font-normal"
|
||||||
>
|
>
|
||||||
<p>
|
<p>
|
||||||
{{ `"${$t('general.yes')}" ${numberOfRatings["yes"]} ${$t("feedback.answers")}` }}
|
{{
|
||||||
|
`"${$t("general.yes")}" ${numberOfRatings["yes"]} ${$t(
|
||||||
|
"feedback.answers"
|
||||||
|
)}`
|
||||||
|
}}
|
||||||
</p>
|
</p>
|
||||||
</PopoverPanel>
|
</PopoverPanel>
|
||||||
</Popover>
|
</Popover>
|
||||||
|
|
@ -60,18 +68,23 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/vue";
|
|
||||||
import QuestionSummary from "@/components/ui/QuestionSummary.vue";
|
import QuestionSummary from "@/components/ui/QuestionSummary.vue";
|
||||||
|
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/vue";
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
ratio: number;
|
|
||||||
ratings: boolean[];
|
ratings: boolean[];
|
||||||
title: string;
|
title: string;
|
||||||
text: string;
|
text: string;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
|
const positiveAnswers = computed(() => props.ratings.filter((rating) => rating));
|
||||||
|
const negtiveAnswers = computed(() => props.ratings.filter((rating) => !rating));
|
||||||
|
|
||||||
const ratio = computed(() => {
|
const ratio = computed(() => {
|
||||||
return Math.min(props.ratio, 1);
|
const ratio =
|
||||||
|
positiveAnswers.value.length /
|
||||||
|
(positiveAnswers.value.length + negtiveAnswers.value.length);
|
||||||
|
return Math.min(ratio, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
const redHeight = computed(() => {
|
const redHeight = computed(() => {
|
||||||
|
|
@ -84,8 +97,8 @@ const answers = computed(() => {
|
||||||
|
|
||||||
const numberOfRatings = computed(() => {
|
const numberOfRatings = computed(() => {
|
||||||
return {
|
return {
|
||||||
yes: props.ratings.filter((rating) => rating).length,
|
yes: positiveAnswers.value.length,
|
||||||
no: props.ratings.filter((rating) => !rating).length,
|
no: negtiveAnswers.value.length,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,19 +20,26 @@
|
||||||
<li v-for="(question, i) in orderedQuestions">
|
<li v-for="(question, i) in orderedQuestions">
|
||||||
<RatingScale
|
<RatingScale
|
||||||
v-if="ratingKeys.includes(question.key)"
|
v-if="ratingKeys.includes(question.key)"
|
||||||
class="bg-white mb-8"
|
class="mb-8 bg-white"
|
||||||
:ratings="feedbackData.questions[question.key]"
|
:ratings="feedbackData.questions[question.key]"
|
||||||
:title="`${$t('feedback.questionTitle')} ${i}`"
|
:title="`${$t('feedback.questionTitle')} ${i + 1}`"
|
||||||
:text="question.question"
|
:text="question.question"
|
||||||
/>
|
/>
|
||||||
<VerticalBarChart
|
<VerticalBarChart
|
||||||
class="bg-white mb-8"
|
class="mb-8 bg-white"
|
||||||
v-else-if="verticalChartKyes.includes(question.key)"
|
v-else-if="verticalChartKyes.includes(question.key)"
|
||||||
:title="`${$t('feedback.questionTitle')} ${i}`"
|
:title="`${$t('feedback.questionTitle')} ${i + 1}`"
|
||||||
:ratings="feedbackData.questions[question.key]"
|
:ratings="feedbackData.questions[question.key]"
|
||||||
:text="question.question"
|
:text="question.question"
|
||||||
:ratio="0.2"
|
:ratio="0.2"
|
||||||
/>
|
/>
|
||||||
|
<OpenFeedback
|
||||||
|
class="mb-8 bg-white"
|
||||||
|
v-if="openKeys.includes(question.key)"
|
||||||
|
:title="`${$t('feedback.questionTitle')} ${i + 1}`"
|
||||||
|
:text="question.question"
|
||||||
|
:answers="feedbackData.questions[question.key].filter((a) => a !== '')"
|
||||||
|
></OpenFeedback>
|
||||||
<!-- HorizontalBarChart
|
<!-- HorizontalBarChart
|
||||||
v-else
|
v-else
|
||||||
:title="`${$t('feedback.questionTitle')} ${i}`"
|
:title="`${$t('feedback.questionTitle')} ${i}`"
|
||||||
|
|
@ -47,6 +54,7 @@
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import HorizontalBarChart from "@/components/ui/HorizontalBarChart.vue";
|
import HorizontalBarChart from "@/components/ui/HorizontalBarChart.vue";
|
||||||
|
import OpenFeedback from "@/components/ui/OpenFeedback.vue";
|
||||||
import RatingScale from "@/components/ui/RatingScale.vue";
|
import RatingScale from "@/components/ui/RatingScale.vue";
|
||||||
import VerticalBarChart from "@/components/ui/VerticalBarChart.vue";
|
import VerticalBarChart from "@/components/ui/VerticalBarChart.vue";
|
||||||
import { itGet } from "@/fetchHelpers";
|
import { itGet } from "@/fetchHelpers";
|
||||||
|
|
@ -120,6 +128,11 @@ const ratingKeys = [
|
||||||
"instructor_respect",
|
"instructor_respect",
|
||||||
];
|
];
|
||||||
const verticalChartKyes = ["received_materials", "would_recommend"];
|
const verticalChartKyes = ["received_materials", "would_recommend"];
|
||||||
|
const openKeys = [
|
||||||
|
"course_negative_feedback",
|
||||||
|
"course_positive_feedback",
|
||||||
|
"instructor_open_feedback",
|
||||||
|
];
|
||||||
|
|
||||||
const feedbackData = reactive({});
|
const feedbackData = reactive({});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,10 +52,7 @@ def get_feedback_for_circle(request, course_id, circle_id):
|
||||||
)
|
)
|
||||||
|
|
||||||
# I guess this is ok for the üK case
|
# I guess this is ok for the üK case
|
||||||
feedback_data = {
|
feedback_data = {"amount": len(feedbacks), "questions": {}}
|
||||||
"amount": len(feedbacks),
|
|
||||||
"questions": {}
|
|
||||||
}
|
|
||||||
|
|
||||||
if feedback_data["amount"] == 0:
|
if feedback_data["amount"] == 0:
|
||||||
return Response(status=200, data=feedback_data)
|
return Response(status=200, data=feedback_data)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue