summaryrefslogtreecommitdiffstats
path: root/web_src/js/components/ActivityTopAuthors.vue
blob: a5c6e062b249aee231a1976b398310f707a576a9 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<template>
    <div>
        <div class="activity-bar-graph" ref="style" style="width:0px;height:0px"></div>
        <div class="activity-bar-graph-alt" ref="altStyle" style="width:0px;height:0px"></div>
        <vue-bar-graph
            :points="graphData"
            :show-x-axis="true"
            :show-y-axis="false"
            :show-values="true"
            :width="graphWidth"
            :bar-color="colors.barColor"
            :text-color="colors.textColor"
            :text-alt-color="colors.textAltColor"
            :height="100"
            :label-height="20"
        >
            <template v-slot:label="opt">
                <g v-for="(author, idx) in authors" :key="author.position">
                    <a
                        v-if="opt.bar.index === idx && author.home_link !== ''"
                        :href="author.home_link"
                    >
                        <image
                            :x="`${opt.bar.midPoint - 10}px`"
                            :y="`${opt.bar.yLabel}px`"
                            height="20"
                            width="20"
                            :href="author.avatar_link"
                        />
                    </a>
                    <image
                        v-else-if="opt.bar.index === idx"
                        :x="`${opt.bar.midPoint - 10}px`"
                        :y="`${opt.bar.yLabel}px`"
                        height="20"
                        width="20"
                        :href="author.avatar_link"
                    />
                </g>
            </template>
            <template v-slot:title="opt">
                <tspan v-for="(author, idx) in authors" :key="author.position"><tspan v-if="opt.bar.index === idx">{{ author.name }}</tspan></tspan>
            </template>
        </vue-bar-graph>
    </div>
</template>

<script>
import VueBarGraph from 'vue-bar-graph';

export default {
    components: {
        VueBarGraph,
    },
    props: {
        data: { type: Array, default: () => [] },
    },
    mounted() {
        const st = window.getComputedStyle(this.$refs.style);
        const stalt = window.getComputedStyle(this.$refs.altStyle);

        this.colors.barColor = st.backgroundColor;
        this.colors.textColor = st.color;
        this.colors.textAltColor = stalt.color;
    },
    data() {
        return {
            colors: {
                barColor: 'green',
                textColor: 'black',
                textAltColor: 'white',
            },
        };
    },
    computed: {
        graphData() {
            return this.data.map((item) => {
                return {
                    value: item.commits,
                    label: item.name,
                };
            });
        },
        authors() {
            return this.data.map((item, idx) => {
                return {
                    position: idx+1,
                    ...item,
                }
            });
        },
        graphWidth() {
            return this.data.length * 40;
        },
    },
    methods: {
        hasHomeLink(i) {
            return this.graphData[i].homeLink !== '' && this.graphData[i].homeLink !== null;
        },
    }
}
</script>