LogsDataViewer.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <div v-if="state.status === 'loading'" class="py-8 text-center">
  3. <ui-spinner color="text-primary" />
  4. </div>
  5. <template v-else-if="state.status === 'idle'">
  6. <div class="mb-2 flex items-center">
  7. <ui-input
  8. v-model="state.fileName"
  9. :placeholder="t('common.fileName')"
  10. :title="t('common.fileName')"
  11. />
  12. <div class="grow"></div>
  13. <ui-popover trigger-width>
  14. <template #trigger>
  15. <ui-button variant="accent">
  16. <span>{{ t('log.exportData.title') }}</span>
  17. <v-remixicon name="riArrowDropDownLine" class="ml-2 -mr-1" />
  18. </ui-button>
  19. </template>
  20. <ui-list class="space-y-1">
  21. <ui-list-item
  22. v-for="type in dataExportTypes"
  23. :key="type.id"
  24. v-close-popover
  25. class="cursor-pointer"
  26. @click="exportData(type.id)"
  27. >
  28. {{ t(`log.exportData.types.${type.id}`) }}
  29. </ui-list-item>
  30. </ui-list>
  31. </ui-popover>
  32. </div>
  33. <ui-tabs v-if="objectHasKey(logsData, 'table')" v-model="state.activeTab">
  34. <ui-tab value="table">
  35. {{ t('workflow.table.title') }}
  36. </ui-tab>
  37. <ui-tab value="variables">
  38. {{ t('workflow.variables.title', 2) }}
  39. </ui-tab>
  40. </ui-tabs>
  41. <shared-codemirror
  42. :model-value="dataStr"
  43. :class="editorClass"
  44. class="rounded-t-none"
  45. lang="json"
  46. readonly
  47. />
  48. </template>
  49. </template>
  50. <script setup>
  51. import {
  52. shallowReactive,
  53. computed,
  54. defineAsyncComponent,
  55. onMounted,
  56. } from 'vue';
  57. import { useI18n } from 'vue-i18n';
  58. import dbLogs from '@/db/logs';
  59. import { dataExportTypes } from '@/utils/shared';
  60. import { objectHasKey } from '@/utils/helper';
  61. import dataExporter from '@/utils/dataExporter';
  62. const SharedCodemirror = defineAsyncComponent(() =>
  63. import('@/components/newtab/shared/SharedCodemirror.vue')
  64. );
  65. const props = defineProps({
  66. log: {
  67. type: Object,
  68. default: () => ({}),
  69. },
  70. editorClass: {
  71. type: String,
  72. default: '',
  73. },
  74. });
  75. const { t } = useI18n();
  76. const state = shallowReactive({
  77. status: 'loading',
  78. activeTab: 'table',
  79. fileName: props.log.name,
  80. });
  81. const logsData = {
  82. table: '',
  83. variables: '',
  84. };
  85. const dataStr = computed(() => {
  86. if (state.status !== 'idle') return '';
  87. return logsData[state.activeTab] ? logsData[state.activeTab] : '';
  88. });
  89. function exportData(type) {
  90. dataExporter(
  91. logsData?.table || logsData,
  92. { name: state.fileName, type },
  93. true
  94. );
  95. }
  96. onMounted(async () => {
  97. const data = await dbLogs.logsData.where('logId').equals(props.log.id).last();
  98. if (!data) {
  99. state.status = 'error';
  100. return;
  101. }
  102. Object.keys(data.data).forEach((key) => {
  103. logsData[key] = JSON.stringify(data.data[key], null, 2);
  104. });
  105. state.status = 'idle';
  106. });
  107. </script>