mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-09-22 12:03:25 -04:00
(ts) migrate components/AdminDashboardCard.vue to composition API with typescript
This commit is contained in:
parent
9280d797ba
commit
77ecbeefcb
@ -1,3 +1,42 @@
|
||||
<script setup lang="ts">
|
||||
interface Count {
|
||||
name?: string;
|
||||
count: number;
|
||||
warning?: number;
|
||||
danger?: number;
|
||||
link?: string;
|
||||
enabled?: boolean;
|
||||
}
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
baseUrl?: string;
|
||||
icon: string;
|
||||
header: string;
|
||||
link?: string;
|
||||
counts?: Count[];
|
||||
}>(),
|
||||
{
|
||||
baseUrl: '',
|
||||
counts: () => [],
|
||||
},
|
||||
);
|
||||
|
||||
const visibleCounts = computed((): Count[] => {
|
||||
return props.counts.filter(({ enabled }) => enabled !== false);
|
||||
});
|
||||
|
||||
const counterClass = (count: number, warning: number | undefined, danger: number | undefined): string => {
|
||||
if (danger && count >= danger) {
|
||||
return 'text-bg-danger';
|
||||
}
|
||||
if (warning && count >= warning) {
|
||||
return 'text-bg-warning';
|
||||
}
|
||||
return 'bg-light text-dark border';
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="col-12 col-lg-3">
|
||||
<component :is="link ? 'a' : 'div'" :href="baseUrl + link" class="card mb-3" style="min-height: 128px;">
|
||||
@ -8,10 +47,14 @@
|
||||
{{ header }}
|
||||
</h4>
|
||||
<ul class="list-inline h5">
|
||||
<li v-for="{ name, count, warning, danger, link } in visibleCounts" class="list-inline-item">
|
||||
<li
|
||||
v-for="{ name, count, warning, danger, link: sublink } in visibleCounts"
|
||||
:key="name"
|
||||
class="list-inline-item"
|
||||
>
|
||||
<component
|
||||
:is="link ? 'a' : 'span'"
|
||||
:href="baseUrl + link"
|
||||
:is="sublink ? 'a' : 'span'"
|
||||
:href="baseUrl + sublink"
|
||||
:class="['badge', counterClass(count, warning, danger)]"
|
||||
>
|
||||
{{ count }} {{ name || '' }}
|
||||
@ -24,43 +67,3 @@
|
||||
</component>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import type { PropType } from 'vue';
|
||||
|
||||
interface Count {
|
||||
name?: string;
|
||||
count: number;
|
||||
warning?: number;
|
||||
danger?: number;
|
||||
link?: string;
|
||||
enabled?: boolean;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
baseUrl: { default: '', type: String },
|
||||
icon: { required: true, type: String },
|
||||
header: { required: true, type: String },
|
||||
link: { required: false, type: String },
|
||||
counts: { default: () => [], type: Array as PropType<Count[]> },
|
||||
},
|
||||
computed: {
|
||||
visibleCounts(): Count[] {
|
||||
return this.counts.filter(({ enabled }) => enabled !== false);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
counterClass(count: number, warning: number | undefined, danger: number | undefined): string {
|
||||
if (danger && count >= danger) {
|
||||
return 'text-bg-danger';
|
||||
}
|
||||
if (warning && count >= warning) {
|
||||
return 'text-bg-warning';
|
||||
}
|
||||
return 'bg-light text-dark border';
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
Loading…
x
Reference in New Issue
Block a user