Refactor CompetenceDetail component
This commit is contained in:
parent
934d4c6945
commit
91c19f29b4
|
|
@ -8,32 +8,48 @@ import { ref } from "vue";
|
||||||
|
|
||||||
const competenceStore = useCompetenceStore();
|
const competenceStore = useCompetenceStore();
|
||||||
|
|
||||||
const props = defineProps<{
|
interface Props {
|
||||||
competence: CompetencePage;
|
competence: CompetencePage;
|
||||||
}>();
|
isInline?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<Props>(), {
|
||||||
|
isInline: false,
|
||||||
|
});
|
||||||
|
|
||||||
const isOpen = ref(false);
|
const isOpen = ref(false);
|
||||||
|
|
||||||
const togglePerformanceCriteria = () => {
|
function togglePerformanceCriteria() {
|
||||||
isOpen.value = !isOpen.value;
|
isOpen.value = !isOpen.value;
|
||||||
};
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<div :class="{ 'pb-8 border-b mb-4': isOpen }" class="-mx-8 px-8">
|
<div :class="{ 'pb-8 border-b mb-4': isOpen }" class="-mx-8 px-8">
|
||||||
<div
|
<div
|
||||||
class="mb-4 flex flex-row justify-between items-center"
|
class="flex flex-row justify-between items-center"
|
||||||
|
:class="props.isInline ? '' : 'mb-4'"
|
||||||
role="button"
|
role="button"
|
||||||
aria-pressed="false"
|
aria-pressed="false"
|
||||||
@click="togglePerformanceCriteria()"
|
@click="togglePerformanceCriteria()"
|
||||||
>
|
>
|
||||||
<h2 class="text-large">
|
<h2 :class="props.isInline ? ['text-bold', 'w-2/5'] : 'text-large'">
|
||||||
{{ competence.competence_id }} {{ competence.title }}
|
{{ competence.competence_id }} {{ competence.title }}
|
||||||
</h2>
|
</h2>
|
||||||
<ItToggleArrow :is-open="isOpen"></ItToggleArrow>
|
<CompetenceProgress
|
||||||
|
v-if="isInline"
|
||||||
|
class="w-[330px]"
|
||||||
|
:status-count="
|
||||||
|
competenceStore.calcStatusCount(
|
||||||
|
competenceStore.criteriaByCompetence(competence)
|
||||||
|
)
|
||||||
|
"
|
||||||
|
></CompetenceProgress>
|
||||||
|
<ItToggleArrow :is-open="isOpen" :small="isInline"></ItToggleArrow>
|
||||||
</div>
|
</div>
|
||||||
<CompetenceProgress
|
<CompetenceProgress
|
||||||
|
v-if="!isInline"
|
||||||
:status-count="
|
:status-count="
|
||||||
competenceStore.calcStatusCount(
|
competenceStore.calcStatusCount(
|
||||||
competenceStore.criteriaByCompetence(competence)
|
competenceStore.criteriaByCompetence(competence)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
isOpen: boolean;
|
isOpen: boolean;
|
||||||
small?: boolean;
|
small?: boolean;
|
||||||
|
|
@ -10,14 +9,14 @@ const props = withDefaults(defineProps<Props>(), {
|
||||||
small: false,
|
small: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
function sizeClasses(isSmall: boolean) {
|
function sizeClasses() {
|
||||||
return isSmall ? ["h-8", "w-8"] : ["h-10", "w-10"];
|
return props.small ? ["h-8", "w-8"] : ["h-10", "w-10"];
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="transition-transform" :class="{ 'rotate-180': isOpen }">
|
<div class="transition-transform" :class="{ 'rotate-180': isOpen }">
|
||||||
<it-icon-arrow-down :class="sizeClasses(small)" aria-hidden="true" />
|
<it-icon-arrow-down :class="sizeClasses()" aria-hidden="true" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped></style>
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -23,7 +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')",
|
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