SharedLogsTable.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <template>
  2. <table>
  3. <tbody class="divide-y dark:divide-gray-800">
  4. <tr v-for="log in logs" :key="log.id" class="hoverable">
  5. <slot name="item-prepend" :log="log" />
  6. <td class="text-overflow" style="min-width: 140px; max-width: 330px">
  7. <router-link
  8. :to="`/logs/${log.id}`"
  9. class="inline-block text-overflow w-full align-middle min-h"
  10. style="min-height: 28px"
  11. >
  12. {{ log.name }}
  13. </router-link>
  14. </td>
  15. <td class="log-time dark:text-gray-200">
  16. <v-remixicon
  17. :title="t('log.startedDate')"
  18. name="riCalendarLine"
  19. class="mr-2 inline-block align-middle"
  20. />
  21. <span :title="formatDate(log.startedAt, 'DD MMM YYYY, hh:mm A')">
  22. {{ formatDate(log.startedAt, 'relative') }}
  23. </span>
  24. </td>
  25. <td class="log-time dark:text-gray-200" :title="t('log.duration')">
  26. <v-remixicon name="riTimerLine"></v-remixicon>
  27. <span>{{ countDuration(log.startedAt, log.endedAt) }}</span>
  28. </td>
  29. <td class="text-right">
  30. <span
  31. :class="statusColors[log.status]"
  32. :title="log.status === 'error' ? getErrorMessage(log) : null"
  33. class="inline-block py-1 w-16 text-center text-sm rounded-md dark:text-black"
  34. >
  35. {{ t(`logStatus.${log.status}`) }}
  36. </span>
  37. </td>
  38. <slot name="item-append" :log="log" />
  39. </tr>
  40. </tbody>
  41. </table>
  42. </template>
  43. <script setup>
  44. import { useI18n } from 'vue-i18n';
  45. import { countDuration } from '@/utils/helper';
  46. import dayjs from '@/lib/dayjs';
  47. defineProps({
  48. logs: {
  49. type: Array,
  50. default: () => [],
  51. },
  52. });
  53. const { t, te } = useI18n();
  54. const statusColors = {
  55. error: 'bg-red-200 dark:bg-red-300',
  56. success: 'bg-green-200 dark:bg-green-300',
  57. stopped: 'bg-yellow-200 dark:bg-yellow-300',
  58. };
  59. function formatDate(date, format) {
  60. if (format === 'relative') return dayjs(date).fromNow();
  61. return dayjs(date).format(format);
  62. }
  63. function getErrorMessage({ message }) {
  64. const messagePath = `log.messages.${message}`;
  65. if (message && te(messagePath)) {
  66. return t(messagePath);
  67. }
  68. return '';
  69. }
  70. </script>
  71. <style scoped>
  72. .log-time svg {
  73. @apply mr-2;
  74. }
  75. .log-time svg,
  76. .log-time span {
  77. display: inline-block;
  78. vertical-align: middle;
  79. }
  80. </style>