Add page, refactor arrow
This commit is contained in:
parent
fb1ac5fe65
commit
934d4c6945
|
|
@ -1,6 +1,7 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import ComptenceProgress from "@/components/competences/CompetenceProgress.vue";
|
import CompetenceProgress from "@/components/competences/CompetenceProgress.vue";
|
||||||
import PerformanceCriteriaRow from "@/components/competences/PerformanceCriteriaRow.vue";
|
import PerformanceCriteriaRow from "@/components/competences/PerformanceCriteriaRow.vue";
|
||||||
|
import ItToggleArrow from "@/components/ui/ItToggleArrow.vue";
|
||||||
import { useCompetenceStore } from "@/stores/competence";
|
import { useCompetenceStore } from "@/stores/competence";
|
||||||
import type { CompetencePage } from "@/types";
|
import type { CompetencePage } from "@/types";
|
||||||
import { ref } from "vue";
|
import { ref } from "vue";
|
||||||
|
|
@ -30,17 +31,15 @@ const togglePerformanceCriteria = () => {
|
||||||
<h2 class="text-large">
|
<h2 class="text-large">
|
||||||
{{ competence.competence_id }} {{ competence.title }}
|
{{ competence.competence_id }} {{ competence.title }}
|
||||||
</h2>
|
</h2>
|
||||||
<div class="transition-transform" :class="{ 'rotate-180': isOpen }">
|
<ItToggleArrow :is-open="isOpen"></ItToggleArrow>
|
||||||
<it-icon-arrow-down class="h-10 w-10" aria-hidden="true" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<CompetenceProgress
|
||||||
<ComptenceProgress
|
|
||||||
:status-count="
|
:status-count="
|
||||||
competenceStore.calcStatusCount(
|
competenceStore.calcStatusCount(
|
||||||
competenceStore.criteriaByCompetence(competence)
|
competenceStore.criteriaByCompetence(competence)
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
></ComptenceProgress>
|
></CompetenceProgress>
|
||||||
</div>
|
</div>
|
||||||
<ul v-if="isOpen">
|
<ul v-if="isOpen">
|
||||||
<li
|
<li
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from "vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
statusCount?: {
|
||||||
|
fail: number;
|
||||||
|
success: number;
|
||||||
|
unknown: number;
|
||||||
|
};
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const total = computed(() => {
|
||||||
|
return (
|
||||||
|
(props.statusCount?.fail || 0) +
|
||||||
|
(props.statusCount?.success || 0) +
|
||||||
|
(props.statusCount?.unknown || 0)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
const done = computed(() => {
|
||||||
|
if (total.value === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((props.statusCount?.success || 0) / total.value) * 100;
|
||||||
|
});
|
||||||
|
|
||||||
|
const notDone = computed(() => {
|
||||||
|
if (total.value === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((props.statusCount?.fail || 0) / total.value) * 100 + done.value;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<span class="relative w-full h-2 bg-gray-300 inline-block">
|
||||||
|
<span
|
||||||
|
v-if="notDone !== done"
|
||||||
|
class="absolute bg-orange-500 h-full"
|
||||||
|
:style="{ width: `${notDone}%` }"
|
||||||
|
></span>
|
||||||
|
<span
|
||||||
|
v-if="done > 0"
|
||||||
|
class="absolute bg-green-500 h-full"
|
||||||
|
:style="{ width: `${done}%` }"
|
||||||
|
></span>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
isOpen: boolean;
|
||||||
|
small?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
|
isOpen: false,
|
||||||
|
small: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
function sizeClasses(isSmall: boolean) {
|
||||||
|
return isSmall ? ["h-8", "w-8"] : ["h-10", "w-10"];
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="transition-transform" :class="{ 'rotate-180': isOpen }">
|
||||||
|
<it-icon-arrow-down :class="sizeClasses(small)" aria-hidden="true" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
|
|
@ -10,7 +10,12 @@
|
||||||
"save": "Speichern",
|
"save": "Speichern",
|
||||||
"learningUnit": "Lerneinheit",
|
"learningUnit": "Lerneinheit",
|
||||||
"learningPath": "Lernpfad",
|
"learningPath": "Lernpfad",
|
||||||
"show": "Anschauen"
|
"show": "Anschauen",
|
||||||
|
"circles": "Circles",
|
||||||
|
"transferTask": "Transferauftrag | Transferaufträge",
|
||||||
|
"feedback": "Feedback | Feedbacks",
|
||||||
|
"exam": "Prüfung | Prüfungen",
|
||||||
|
"certificate": "Zertifikat | Zertifikate"
|
||||||
},
|
},
|
||||||
"mainNavigation": {
|
"mainNavigation": {
|
||||||
"logout": "Abmelden",
|
"logout": "Abmelden",
|
||||||
|
|
@ -45,6 +50,7 @@
|
||||||
"progressLink": "KompetenzNavi öffnen"
|
"progressLink": "KompetenzNavi öffnen"
|
||||||
},
|
},
|
||||||
"competences": {
|
"competences": {
|
||||||
|
"competences": "Kompetenzen",
|
||||||
"title": "KompetenzNavi",
|
"title": "KompetenzNavi",
|
||||||
"lastImprovements": "Letzte verbesserte Kompetenzen",
|
"lastImprovements": "Letzte verbesserte Kompetenzen",
|
||||||
"showAll": "Alle anschauen",
|
"showAll": "Alle anschauen",
|
||||||
|
|
@ -68,5 +74,8 @@
|
||||||
"imprint": "Impressum",
|
"imprint": "Impressum",
|
||||||
"contact": "Kontakt",
|
"contact": "Kontakt",
|
||||||
"faq": "FAQ"
|
"faq": "FAQ"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"sendMessage": "Nachricht schreiben"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,78 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import * as log from "loglevel";
|
import * as log from "loglevel";
|
||||||
|
import ItProgress from "@/components/ui/ItProgress.vue";
|
||||||
|
|
||||||
log.debug("ProfileView created");
|
log.debug("ProfileView created");
|
||||||
|
|
||||||
|
const fakeData = {
|
||||||
|
statusCount: {
|
||||||
|
fail: 2,
|
||||||
|
success: 9,
|
||||||
|
unknown: 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function setActiveClasses(isActive: boolean) {
|
||||||
|
return isActive
|
||||||
|
? ["border-blue-900", "border-b-2"]
|
||||||
|
: ["text-bg-900"];
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main class="px-8 py-8">
|
<div class="bg-gray-200">
|
||||||
<h1>Profil</h1>
|
<div class="container-large">
|
||||||
|
<nav class="py-4 pb-4">
|
||||||
|
<router-link
|
||||||
|
class="btn-text inline-flex items-center pl-0"
|
||||||
|
:to="'/'"
|
||||||
|
>
|
||||||
|
<it-icon-arrow-left/>
|
||||||
|
<span>{{ $t("general.back") }}</span>
|
||||||
|
</router-link>
|
||||||
|
</nav>
|
||||||
|
<header class="flex flex-row items-center mb-12">
|
||||||
|
<img class="w-44 h-44 rounded-full mr-8" src="https://picsum.photos/200"/>
|
||||||
|
<div>
|
||||||
|
<h1 class="mb-2">Daniel Baumgartner</h1>
|
||||||
|
<p class="mb-2">d.baumgartner@gmail.com</p>
|
||||||
|
<p class="bg-message bg-no-repeat pl-6 bg-[center_left_-4px]">{{ $t("messages.sendMessage") }}</p>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<div class="bg-white w-full mb-8">
|
||||||
|
ich bin ein Lernpfad
|
||||||
|
</div>
|
||||||
|
<ul class="flex flex-row border-b-2 mb-5">
|
||||||
|
<li class="mr-12 pb-3 relative top-px" :class="setActiveClasses(true)">
|
||||||
|
<button>{{ $t("competences.competences") }}</button>
|
||||||
|
</li>
|
||||||
|
<li class="mr-12">
|
||||||
|
<button>{{ $t("general.transferTask", 2) }}</button>
|
||||||
|
</li>
|
||||||
|
<li class="mr-12">
|
||||||
|
<button>{{ $t("general.exam", 2) }}</button>
|
||||||
|
</li>
|
||||||
|
<li class="mr-12">
|
||||||
|
<button>{{ $t("general.certificate", 2) }}</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div>
|
||||||
|
<ul class="bg-white px-8 py-2">
|
||||||
|
<li class="border-b border-grey-200 last:border-01 flex flex-row py-4">
|
||||||
|
<h2 class="text-bold w-1/2">Weiterempfehlung für Neukunden generieren</h2>
|
||||||
|
<div class="w-1/2">
|
||||||
|
<ItProgress
|
||||||
|
:status-count="fakeData.statusCount">
|
||||||
|
</ItProgress>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ module.exports = {
|
||||||
"handlungsfelder-overview":
|
"handlungsfelder-overview":
|
||||||
"url('/static/icons/icon-handlungsfelder-overview.svg')",
|
"url('/static/icons/icon-handlungsfelder-overview.svg')",
|
||||||
"lernmedien-overview": "url('/static/icons/icon-lernmedien-overview.svg')",
|
"lernmedien-overview": "url('/static/icons/icon-lernmedien-overview.svg')",
|
||||||
|
"message": "url('/static/icons/icon-message.svg')",
|
||||||
},
|
},
|
||||||
borderColor: (theme) => ({
|
borderColor: (theme) => ({
|
||||||
DEFAULT: theme("colors.gray.500"),
|
DEFAULT: theme("colors.gray.500"),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue