Files
ulitka-app/src/components/IssueFilter.vue
T
vadim 6af9993c4f
Gitea Actions / Deploy (push) Successful in 30s
multiple filter
2026-10-18 19:55:48 +03:00

47 lines
1.4 KiB
Vue

<script setup lang="ts">
import { computed } from 'vue'
import AssigneeFilter from '@/components/AssigneeFilter.vue'
import TextFilter from '@/components/TextFilter.vue'
import StatusFilter from '@/components/StatusFilter.vue'
interface Props {
text?: string | null
assigneeId?: string | null
status?: string[]
}
const props = withDefaults(defineProps<Props>(), { text: null, assigneeId: null, status: () => [] })
const emit = defineEmits<{
'update:text': [value: string | null]
'update:assigneeId': [value: string | null]
'update:status': [value: string[]]
'update:clear': []
}>()
const selectedAssignees = computed(() => (props.assigneeId ? [props.assigneeId] : []))
function onAssigneeChanged(value: string[]) {
emit('update:assigneeId', value.at(-1) ?? null)
}
function onStatusChanged(value: string[]) {
emit('update:status', value)
}
</script>
<template>
<div class="filter-grid ga-4 align-center">
<text-filter :model-value="text" @update:model-value="emit('update:text', $event)" />
<status-filter :status="status" @changed="onStatusChanged" />
<assignee-filter :selected="selectedAssignees" @changed="onAssigneeChanged" />
<v-btn density="compact" variant="text" @click="emit('update:clear')">Clear Filters</v-btn>
</div>
</template>
<style scoped lang="scss">
.filter-grid {
display: grid;
grid-template-columns: 1fr auto auto auto;
}
</style>