mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-08-05 12:07:22 -04:00
46 lines
1.6 KiB
Vue
46 lines
1.6 KiB
Vue
<script setup lang="ts" generic="T extends Entry">
|
|
import type { Entry, Filter } from '~/src/classes.ts';
|
|
|
|
const props = defineProps<{
|
|
kind: 'sources' | 'nouns' | 'terms' | 'inclusive';
|
|
entries: T[];
|
|
moderationFilters?: Filter['moderation'][];
|
|
}>();
|
|
|
|
const modelValue = defineModel<Filter['moderation']>();
|
|
|
|
const entriesCountApproved = computed(() => {
|
|
return props.entries.filter((entry) => entry.approved).length;
|
|
});
|
|
|
|
const entriesCountForFilter = (moderationFilter: Filter['moderation']) => {
|
|
const filter = { text: '', category: '', moderation: moderationFilter };
|
|
return props.entries.filter((entry) => entry.matches(filter)).length;
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<section v-if="$isGranted(kind)">
|
|
<div class="alert alert-info">
|
|
<strong>{{ entriesCountApproved }}</strong>
|
|
approved
|
|
<div class="d-flex gap-1">
|
|
<button
|
|
v-for="moderationFilter of moderationFilters"
|
|
:key="moderationFilter"
|
|
type="button"
|
|
:class="[
|
|
'btn btn-secondary',
|
|
modelValue === moderationFilter ? 'active' : '',
|
|
'd-flex justify-content-center align-items-center gap-1',
|
|
]"
|
|
@click="modelValue = modelValue === moderationFilter ? undefined : moderationFilter"
|
|
>
|
|
<strong>{{ entriesCountForFilter(moderationFilter) }}</strong>
|
|
{{ moderationFilter }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</template>
|