Refactor competence main view
This commit is contained in:
parent
f4dafef005
commit
6f491ef661
|
|
@ -1,10 +1,12 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import ComptenceProgress from "@/components/competences/CompetenceProgress.vue";
|
import ComptenceProgress from "@/components/competences/CompetenceProgress.vue";
|
||||||
import PerformanceCriteriaRow from "@/components/competences/PerformanceCriteriaRow.vue";
|
import PerformanceCriteriaRow from "@/components/competences/PerformanceCriteriaRow.vue";
|
||||||
|
import { useCompetenceStore } from "@/stores/competence";
|
||||||
import type { CompetencePage } from "@/types";
|
import type { CompetencePage } from "@/types";
|
||||||
import _ from "lodash";
|
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
const competenceStore = useCompetenceStore();
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
competence: CompetencePage;
|
competence: CompetencePage;
|
||||||
}>();
|
}>();
|
||||||
|
|
@ -14,23 +16,6 @@ const isOpen = ref(false);
|
||||||
const togglePerformanceCriteria = () => {
|
const togglePerformanceCriteria = () => {
|
||||||
isOpen.value = !isOpen.value;
|
isOpen.value = !isOpen.value;
|
||||||
};
|
};
|
||||||
|
|
||||||
const calcStatusCount = () => {
|
|
||||||
if (props.competence) {
|
|
||||||
const grouped = _.groupBy(props.competence.children, "completion_status");
|
|
||||||
return {
|
|
||||||
fail: grouped?.fail?.length || 0,
|
|
||||||
success: grouped?.success?.length || 0,
|
|
||||||
unknown: grouped?.unknown?.length || 0,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
success: 0,
|
|
||||||
fail: 0,
|
|
||||||
unknown: 0,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
@ -46,7 +31,9 @@ const calcStatusCount = () => {
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<ComptenceProgress :status-count="calcStatusCount()"></ComptenceProgress>
|
<ComptenceProgress
|
||||||
|
:status-count="competenceStore.calcStatusCount(competence.children)"
|
||||||
|
></ComptenceProgress>
|
||||||
</div>
|
</div>
|
||||||
<ul v-if="isOpen">
|
<ul v-if="isOpen">
|
||||||
<li
|
<li
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { default as PerformanceCriteriaRow } from "@/components/competences/PerformanceCriteriaRow.vue";
|
import CompetenceProgress from "@/components/competences/CompetenceProgress.vue";
|
||||||
|
import PerformanceCriteriaRow from "@/components/competences/PerformanceCriteriaRow.vue";
|
||||||
import { useCompetenceStore } from "@/stores/competence";
|
import { useCompetenceStore } from "@/stores/competence";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import * as log from "loglevel";
|
import * as log from "loglevel";
|
||||||
|
|
@ -17,16 +18,27 @@ const failedCriteria = computed(() => {
|
||||||
.slice(0, 3);
|
.slice(0, 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const lastUpdatedCompetences = computed(() => {
|
||||||
|
if (competenceStore.competenceProfilePage?.children.length) {
|
||||||
|
return _.orderBy(
|
||||||
|
competenceStore.competenceProfilePage.children,
|
||||||
|
[
|
||||||
|
(competence) => {
|
||||||
|
return (
|
||||||
|
_.maxBy(competence.children, "completion_status_updated_at")
|
||||||
|
?.completion_status_updated_at || ""
|
||||||
|
);
|
||||||
|
},
|
||||||
|
],
|
||||||
|
["desc"]
|
||||||
|
).slice(0, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
|
||||||
const countStatus = computed(() => {
|
const countStatus = computed(() => {
|
||||||
const grouped = _.groupBy(
|
return competenceStore.calcStatusCount(competenceStore.flatPerformanceCriteria);
|
||||||
competenceStore.flatPerformanceCriteria,
|
|
||||||
"completion_status"
|
|
||||||
);
|
|
||||||
return {
|
|
||||||
fail: grouped?.fail?.length || 0,
|
|
||||||
success: grouped?.success?.length || 0,
|
|
||||||
unknown: grouped?.unknown?.length || 0,
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
@ -42,16 +54,18 @@ const countStatus = computed(() => {
|
||||||
<div>
|
<div>
|
||||||
<h3 class="pb-4 border-b border-gray-500">Letzte verbesserte Kompetenzen</h3>
|
<h3 class="pb-4 border-b border-gray-500">Letzte verbesserte Kompetenzen</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<!-- <li-->
|
<li
|
||||||
<!-- v-for="competence in lastCompetences"-->
|
v-for="competence in lastUpdatedCompetences"
|
||||||
<!-- :key="competence.description"-->
|
:key="competence.id"
|
||||||
<!-- class="py-4 flex flex-col lg:flex-row lg:items-center border-b border-gray-500 last:mb-8"-->
|
class="py-4 flex flex-col lg:flex-row lg:items-center border-b border-gray-500 last:mb-8"
|
||||||
<!-- >-->
|
>
|
||||||
<!-- <p class="mb-4 lg:mb-0 lg:w-1/4 inline-block lg:mr-5">-->
|
<p class="mb-4 lg:mb-0 lg:w-1/4 inline-block lg:mr-5">
|
||||||
<!-- {{ competence.description }}-->
|
{{ competence.title }}
|
||||||
<!-- </p>-->
|
</p>
|
||||||
<!-- <ComptenceProgress :total="7" :done="3" :open="2"></ComptenceProgress>-->
|
<CompetenceProgress
|
||||||
<!-- </li>-->
|
:status-count="competenceStore.calcStatusCount(competence.children)"
|
||||||
|
></CompetenceProgress>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<router-link to="/mediacenter/handlungsfeldlist" class="flex items-center">
|
<router-link to="/mediacenter/handlungsfeldlist" class="flex items-center">
|
||||||
<span>Alle anschauen</span>
|
<span>Alle anschauen</span>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { itGet } from "@/fetchHelpers";
|
import { itGet } from "@/fetchHelpers";
|
||||||
import { useCompletionStore } from "@/stores/completion";
|
import { useCompletionStore } from "@/stores/completion";
|
||||||
import type { CompetenceProfilePage } from "@/types";
|
import type { CompetenceProfilePage, PerformanceCriteria } from "@/types";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
|
|
||||||
|
|
@ -37,6 +37,22 @@ export const useCompetenceStore = defineStore({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
|
calcStatusCount(criteria: PerformanceCriteria[]) {
|
||||||
|
if (criteria) {
|
||||||
|
const grouped = _.groupBy(criteria, "completion_status");
|
||||||
|
return {
|
||||||
|
fail: grouped?.fail?.length || 0,
|
||||||
|
success: grouped?.success?.length || 0,
|
||||||
|
unknown: grouped?.unknown?.length || 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: 0,
|
||||||
|
fail: 0,
|
||||||
|
unknown: 0,
|
||||||
|
};
|
||||||
|
},
|
||||||
async loadCompetenceProfilePage(slug: string, reload = false) {
|
async loadCompetenceProfilePage(slug: string, reload = false) {
|
||||||
if (this.competenceProfilePage && !reload) {
|
if (this.competenceProfilePage && !reload) {
|
||||||
await this.parseCompletionData();
|
await this.parseCompletionData();
|
||||||
|
|
@ -68,8 +84,11 @@ export const useCompetenceStore = defineStore({
|
||||||
);
|
);
|
||||||
if (completion) {
|
if (completion) {
|
||||||
performanceCriteria.completion_status = completion.completion_status;
|
performanceCriteria.completion_status = completion.completion_status;
|
||||||
|
performanceCriteria.completion_status_updated_at =
|
||||||
|
completion.updated_at;
|
||||||
} else {
|
} else {
|
||||||
performanceCriteria.completion_status = "unknown";
|
performanceCriteria.completion_status = "unknown";
|
||||||
|
performanceCriteria.completion_status_updated_at = "";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,7 @@ export interface CourseWagtailPage {
|
||||||
readonly translation_key: string;
|
readonly translation_key: string;
|
||||||
readonly frontend_url: string;
|
readonly frontend_url: string;
|
||||||
completion_status: CourseCompletionStatus;
|
completion_status: CourseCompletionStatus;
|
||||||
|
completion_status_updated_at: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LearningContent extends CourseWagtailPage {
|
export interface LearningContent extends CourseWagtailPage {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue