LogsDataViewer.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <template>
  2. <div class="flex items-center">
  3. <ui-input v-model="fileName" placeholder="File name" title="File name" />
  4. <div class="flex-grow"></div>
  5. <ui-popover>
  6. <template #trigger>
  7. <ui-button variant="accent">
  8. <span>Export data</span>
  9. <v-remixicon name="riArrowDropDownLine" class="ml-2 -mr-1" />
  10. </ui-button>
  11. </template>
  12. <ui-list class="space-y-1">
  13. <ui-list-item
  14. v-for="type in dataExportTypes"
  15. :key="type.id"
  16. v-close-popover
  17. class="cursor-pointer"
  18. @click="exportData(type.id)"
  19. >
  20. as {{ type.name }}
  21. </ui-list-item>
  22. </ui-list>
  23. </ui-popover>
  24. </div>
  25. <prism-editor
  26. :model-value="dataStr"
  27. :highlight="highlighter('json')"
  28. :class="editorClass"
  29. readonly
  30. class="my-editor p-4 bg-gray-900 rounded-lg mt-4"
  31. ></prism-editor>
  32. </template>
  33. <script setup>
  34. import { ref } from 'vue';
  35. import { PrismEditor } from 'vue-prism-editor';
  36. import { highlighter } from '@/lib/prism';
  37. import { dataExportTypes } from '@/utils/shared';
  38. import dataExporter, { generateJSON } from '@/utils/data-exporter';
  39. const props = defineProps({
  40. log: {
  41. type: Object,
  42. default: () => ({}),
  43. },
  44. editorClass: {
  45. type: String,
  46. default: '',
  47. },
  48. });
  49. const data = Array.isArray(props.log.data)
  50. ? props.log.data
  51. : generateJSON(Object.keys(props.log.data), props.log.data);
  52. const dataStr = JSON.stringify(data, null, 2);
  53. const fileName = ref(props.log.name);
  54. function exportData(type) {
  55. dataExporter(data, { name: fileName.value, type }, true);
  56. }
  57. </script>