File: D:/web/matomo.vdk/plugins/MultiSites/vue/src/AllWebsitesDashboard/KPICard.vue
<!--
Matomo - free/libre analytics platform
@link https://matomo.org
@license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
-->
<template>
<div class="kpiCard">
<div class="kpiCardTitle">
<span :class="`kpiCardIcon ${kpi.icon}`" />
{{ translate(kpi.title) }}
</div>
<div style="display: none;" ref="kpiCardTooltipTemplate">
<div role="tooltip">
<h3>{{ translate(kpi.title) }}</h3>
<template v-if="kpi.tooltipBody">
{{ translate(kpi.tooltipBody) }}
</template>
<template v-else>
{{ kpi.value }}
</template>
</div>
</div>
<div class="kpiCardValue"
:title="kpi.value"
v-tooltips="{ duration: 200, delay: 200, content: tooltipContent }"
>{{ kpi.valueCompact }}</div>
<div class="kpiCardEvolution">
<template v-if="kpi.evolutionValue !== ''">
<span :class="`kpiCardEvolutionTrend ${evolutionTrendClass}`">
<span :class="`kpiCardEvolutionIcon ${evolutionTrendIcon}`" />
{{ kpi.evolutionValue }}
</span>
<span>{{ translate(evolutionTrendFrom) }}</span>
</template>
<template v-else>
<div class="kpiCardEvolution">
<span class="kpiCardEvolutionTrend"> </span>
</div>
</template>
</div>
<div v-if="kpi.badge"
class="kpiCardBadge"
:title="kpi.badge.title"
v-html="$sanitize(kpi.badge.label)"
v-tooltips="{ duration: 200, delay: 200 }">
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { Tooltips } from 'CoreHome';
import { KPICardData } from '../types';
export default defineComponent({
directives: {
Tooltips,
},
props: {
modelValue: {
type: Object,
required: true,
},
},
computed: {
tooltipContent(): () => string {
return () => (this.$refs.kpiCardTooltipTemplate as HTMLElement)?.innerHTML || '';
},
evolutionTrendFrom(): string {
switch (this.kpi.evolutionPeriod) {
case 'day':
return 'MultiSites_EvolutionFromPreviousDay';
case 'week':
return 'MultiSites_EvolutionFromPreviousWeek';
case 'month':
return 'MultiSites_EvolutionFromPreviousMonth';
case 'year':
return 'MultiSites_EvolutionFromPreviousYear';
default:
return 'MultiSites_EvolutionFromPreviousPeriod';
}
},
evolutionTrendClass(): string {
if (this.kpi.evolutionTrend === 1) {
return 'kpiTrendPositive';
}
if (this.kpi.evolutionTrend === -1) {
return 'kpiTrendNegative';
}
return 'kpiTrendNeutral';
},
evolutionTrendIcon(): string {
if (this.kpi.evolutionTrend === 1) {
return 'icon-chevron-up';
}
if (this.kpi.evolutionTrend === -1) {
return 'icon-chevron-down';
}
return 'icon-circle';
},
kpi(): KPICardData {
return this.modelValue as KPICardData;
},
},
});
</script>