summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/notebook/cells/output/index.vue
blob: 91b2269a83a7b2f7fe06425245519615aafd3d53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<script>
  import CodeCell from '../code/index.vue';
  import Html from './html.vue';
  import Image from './image.vue';

  export default {
    components: {
      'code-cell': CodeCell,
      'html-output': Html,
      'image-output': Image,
    },
    props: {
      codeCssClass: {
        type: String,
        required: false,
        default: '',
      },
      count: {
        type: Number,
        required: false,
        default: 0,
      },
      output: {
        type: Object,
        requred: true,
        default: () => ({}),
      },
    },
    computed: {
      componentName() {
        if (this.output.text) {
          return 'code-cell';
        } else if (this.output.data['image/png']) {
          return 'image-output';
        } else if (this.output.data['text/html']) {
          return 'html-output';
        } else if (this.output.data['image/svg+xml']) {
          return 'html-output';
        }

        return 'code-cell';
      },
      rawCode() {
        if (this.output.text) {
          return this.output.text.join('');
        }

        return this.dataForType(this.outputType);
      },
      outputType() {
        if (this.output.text) {
          return '';
        } else if (this.output.data['image/png']) {
          return 'image/png';
        } else if (this.output.data['text/html']) {
          return 'text/html';
        } else if (this.output.data['image/svg+xml']) {
          return 'image/svg+xml';
        }

        return 'text/plain';
      },
    },
    methods: {
      dataForType(type) {
        let data = this.output.data[type];

        if (typeof data === 'object') {
          data = data.join('');
        }

        return data;
      },
    },
  };
</script>

<template>
  <component
    :is="componentName"
    type="output"
    :output-type="outputType"
    :count="count"
    :raw-code="rawCode"
    :code-css-class="codeCssClass"
  />
</template>