Add filters to dashboard person table
This commit is contained in:
parent
49bd67f3e0
commit
46a2f6a3ba
|
|
@ -2,10 +2,117 @@
|
||||||
import LoadingSpinner from "@/components/ui/LoadingSpinner.vue";
|
import LoadingSpinner from "@/components/ui/LoadingSpinner.vue";
|
||||||
import log from "loglevel";
|
import log from "loglevel";
|
||||||
import { useDashboardPersons } from "@/composables";
|
import { useDashboardPersons } from "@/composables";
|
||||||
|
import ItDropdownSelect from "@/components/ui/ItDropdownSelect.vue";
|
||||||
|
import { computed, ref, watch } from "vue";
|
||||||
|
import { useTranslation } from "i18next-vue";
|
||||||
|
import _ from "lodash";
|
||||||
|
import type { DashboardPersonCourseSessionType } from "@/services/dashboard";
|
||||||
|
|
||||||
log.debug("DashboardPersonsPage created");
|
log.debug("DashboardPersonsPage created");
|
||||||
|
|
||||||
|
const UNFILTERED = 0;
|
||||||
|
|
||||||
|
type MenuItem = {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { loading: loadingPersons, dashboardPersons } = useDashboardPersons();
|
const { loading: loadingPersons, dashboardPersons } = useDashboardPersons();
|
||||||
|
|
||||||
|
const courses = computed(() => {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
id: UNFILTERED,
|
||||||
|
name: t("a.Alle Lehrgänge"),
|
||||||
|
},
|
||||||
|
..._(dashboardPersons.value)
|
||||||
|
.flatMap((person) => person.course_sessions)
|
||||||
|
.map((cs) => {
|
||||||
|
return { name: cs.course_title, id: cs.course_id };
|
||||||
|
})
|
||||||
|
.uniqBy("id")
|
||||||
|
.orderBy("name")
|
||||||
|
.value(),
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectedCourse = ref<MenuItem>(courses.value[0]);
|
||||||
|
|
||||||
|
const courseSessions = computed(() => {
|
||||||
|
let sessions = _(dashboardPersons.value)
|
||||||
|
.flatMap((person) => person.course_sessions)
|
||||||
|
.map((cs) => {
|
||||||
|
return Object.assign({}, cs, { name: cs.session_title, id: cs.id });
|
||||||
|
})
|
||||||
|
.uniqBy("id")
|
||||||
|
.orderBy("name")
|
||||||
|
.value();
|
||||||
|
|
||||||
|
// filter by selected course
|
||||||
|
if (selectedCourse.value.id !== UNFILTERED) {
|
||||||
|
sessions = sessions.filter((cs) => cs.course_id === selectedCourse.value.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
id: UNFILTERED,
|
||||||
|
name: t("a.AlleDurchführungen"),
|
||||||
|
},
|
||||||
|
...sessions,
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(selectedCourse, () => {
|
||||||
|
selectedSession.value = courseSessions.value[0];
|
||||||
|
});
|
||||||
|
|
||||||
|
const selectedSession = ref<MenuItem>(courseSessions.value[0]);
|
||||||
|
|
||||||
|
const filteredPersons = computed(() => {
|
||||||
|
return _.orderBy(
|
||||||
|
dashboardPersons.value
|
||||||
|
.filter((person) => {
|
||||||
|
if (selectedCourse.value.id === UNFILTERED) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return person.course_sessions.some(
|
||||||
|
(cs) => cs.course_id === selectedCourse.value.id
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.filter((person) => {
|
||||||
|
if (selectedSession.value.id === UNFILTERED) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return person.course_sessions.some((cs) => cs.id === selectedSession.value.id);
|
||||||
|
}),
|
||||||
|
["last_name", "first_name"]
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const filtersVisible = computed(() => {
|
||||||
|
return courses.value.length > 2 || courseSessions.value.length > 2;
|
||||||
|
});
|
||||||
|
|
||||||
|
function personRoleDisplayValue(personCourseSession: DashboardPersonCourseSessionType) {
|
||||||
|
if (personCourseSession.is_uk) {
|
||||||
|
if (personCourseSession.user_role === "EXPERT") {
|
||||||
|
return t("a.Trainer");
|
||||||
|
}
|
||||||
|
if (personCourseSession.user_role === "LEARNING_MENTOR") {
|
||||||
|
return t("a.Praxisbildner");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (personCourseSession.is_vv) {
|
||||||
|
if (personCourseSession.user_role === "LEARNING_MENTOR") {
|
||||||
|
return t("a.Lernbegleitung");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
@ -16,8 +123,28 @@ const { loading: loadingPersons, dashboardPersons } = useDashboardPersons();
|
||||||
<div v-else class="bg-gray-200">
|
<div v-else class="bg-gray-200">
|
||||||
<div class="container-large">
|
<div class="container-large">
|
||||||
<div class="bg-white px-4 py-2">
|
<div class="bg-white px-4 py-2">
|
||||||
|
<section
|
||||||
|
v-if="filtersVisible"
|
||||||
|
class="flex flex-col space-x-0 border-b bg-white lg:flex-row lg:space-x-3"
|
||||||
|
>
|
||||||
|
<ItDropdownSelect
|
||||||
|
v-if="courses.length > 2"
|
||||||
|
v-model="selectedCourse"
|
||||||
|
data-cy="session-select"
|
||||||
|
:items="courses"
|
||||||
|
borderless
|
||||||
|
></ItDropdownSelect>
|
||||||
|
|
||||||
|
<ItDropdownSelect
|
||||||
|
v-if="courseSessions.length > 2"
|
||||||
|
v-model="selectedSession"
|
||||||
|
data-cy="session-select"
|
||||||
|
:items="courseSessions"
|
||||||
|
borderless
|
||||||
|
></ItDropdownSelect>
|
||||||
|
</section>
|
||||||
<div
|
<div
|
||||||
v-for="person in dashboardPersons"
|
v-for="person in filteredPersons"
|
||||||
:key="person.user_id"
|
:key="person.user_id"
|
||||||
data-cy="person"
|
data-cy="person"
|
||||||
class="flex flex-col justify-between gap-4 border-b p-2 last:border-b-0 md:flex-row md:items-center md:justify-between md:gap-16"
|
class="flex flex-col justify-between gap-4 border-b p-2 last:border-b-0 md:flex-row md:items-center md:justify-between md:gap-16"
|
||||||
|
|
@ -51,8 +178,9 @@ const { loading: loadingPersons, dashboardPersons } = useDashboardPersons();
|
||||||
<div v-if="cs.is_uk">{{ cs.session_title }}</div>
|
<div v-if="cs.is_uk">{{ cs.session_title }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="md:w-1/4">
|
<div class="md:w-1/4">
|
||||||
<div>{{ cs.user_role }}</div>
|
<!-- <div>{{ cs.user_role }}</div>-->
|
||||||
<div>my role: {{ cs.my_role }}</div>
|
<!-- <div>my role: {{ cs.my_role }}</div>-->
|
||||||
|
{{ personRoleDisplayValue(cs) }}
|
||||||
</div>
|
</div>
|
||||||
<div class="md:w-1/4 md:text-right">
|
<div class="md:w-1/4 md:text-right">
|
||||||
<div
|
<div
|
||||||
|
|
@ -81,14 +209,6 @@ const { loading: loadingPersons, dashboardPersons } = useDashboardPersons();
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- <button-->
|
|
||||||
<!-- class="underline"-->
|
|
||||||
<!-- data-cy="lm-my-mentor-remove"-->
|
|
||||||
<!-- @click="removeMyMentor(learningMentor.id)"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- {{ $t("a.Entfernen") }}-->
|
|
||||||
<!-- </button>-->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue