Newer
Older
gnexus-tasks / frontend / src / components / TaskBadges.vue
<script setup lang="ts">
// Строка бейджей метаданных задачи (статус, проект, приоритет, время, дедлайн, бюджет, теги).
import { useI18n } from 'vue-i18n'
import type { Task } from '../api'
import {
  budgetBadge,
  deadlineLabel,
  deadlineOverdue,
  formatMinutes,
  recurrenceLabel,
  statusLabel,
  statusVariant,
} from '../taskui'

defineProps<{ task: Task; hideProject?: boolean }>()

const { t } = useI18n()
</script>

<template>
  <GnBadge :variant="statusVariant(task.status)">{{ statusLabel(task.status) }}</GnBadge>
  <GnBadge v-if="task.project && !hideProject" variant="neutral"><i class="ph ph-folder" aria-hidden="true" />
    {{ task.project.name }}
  </GnBadge>
  <GnBadge v-if="task.priority !== null" variant="warning">P{{ task.priority }}</GnBadge>
  <GnBadge v-if="task.estimated_minutes" variant="neutral">
    ≈ {{ formatMinutes(task.estimated_minutes) }}
  </GnBadge>
  <GnBadge v-if="task.task_type === 'recurring'" variant="info"><i class="ph ph-repeat" aria-hidden="true" />
    {{ recurrenceLabel(task) || t('taskui.recur.recurring') }}
  </GnBadge>
  <GnBadge
    v-if="deadlineLabel(task)"
    :variant="deadlineOverdue(task) ? 'error' : 'warning'"
  ><i class="ph ph-alarm" aria-hidden="true" />
    {{ deadlineLabel(task) }}
  </GnBadge>
  <GnBadge v-if="task.budget_money !== null" variant="neutral">{{ budgetBadge(task) }}</GnBadge>
  <GnBadge v-for="tag in task.tags" :key="tag.id" variant="neutral">{{ tag.name }}</GnBadge>
</template>