LedgerPage.vue 1.83 KB
<script setup>
import { onMounted, ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { useRoute, useRouter } from 'vue-router'
import { Card } from '@drama/ui'

import { api, getToken } from '../api.js'

const { t, te } = useI18n()
const route = useRoute()
const router = useRouter()
const ledger = ref(null)

onMounted(async () => {
  if (getToken() === null) {
    await router.push({ path: '/login', query: { next: route.fullPath } })
    return
  }
  ledger.value = (await api('GET', `/api/voko/agents/${route.params.id}/ledger`)).ledger
})
</script>

<template>
  <h1>{{ t('ledger.title') }}</h1>
  <p><router-link to="/agents">{{ t('board.back') }}</router-link></p>
  <Card v-if="ledger">
    <p v-if="ledger.length === 0">{{ t('ledger.empty') }}</p>
    <table v-else class="voko-ledger">
      <thead>
        <tr><th scope="col">{{ t('ledger.when') }}</th><th scope="col">{{ t('ledger.what') }}</th><th scope="col" class="voko-amount">{{ t('ledger.amount') }}</th></tr>
      </thead>
      <tbody>
        <tr v-for="row in ledger" :key="row.id">
          <td>{{ new Date(row.at).toLocaleString() }}</td>
          <td>
            {{ te(`ledger.reason.${row.reason}`) ? t(`ledger.reason.${row.reason}`) : row.reason }}
            <router-link v-if="row.task_id" :to="`/agents/${route.params.id}/tasks/${row.task_id}`">{{ t('ledger.task') }}</router-link>
          </td>
          <td class="voko-amount">{{ row.amount > 0 ? `+${row.amount}` : row.amount }}</td>
        </tr>
      </tbody>
    </table>
  </Card>
</template>

<style scoped>
.voko-ledger {
  width: 100%;
  border-collapse: collapse;
}
.voko-ledger th,
.voko-ledger td {
  padding: var(--drama-space-sm);
  border-bottom: 1px solid var(--drama-color-border);
  text-align: left;
}
.voko-ledger .voko-amount {
  text-align: right;
  font-variant-numeric: tabular-nums;
}
</style>