| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <script lang="ts" setup>
- // @ts-expect-error - module exports no types
- import {VueBarGraph} from 'vue-bar-graph';
- import {computed, onMounted, shallowRef, useTemplateRef} from 'vue';
-
- const colors = shallowRef({
- barColor: 'green',
- textColor: 'black',
- textAltColor: 'white',
- });
-
- type ActivityAuthorData = {
- avatar_link: string;
- commits: number;
- home_link: string;
- login: string;
- name: string;
- }
-
- const activityTopAuthors: Array<ActivityAuthorData> = window.config.pageData.repoActivityTopAuthors || [];
-
- const graphPoints = computed(() => {
- return activityTopAuthors.map((item) => {
- return {
- value: item.commits,
- label: item.name,
- };
- });
- });
-
- const graphAuthors = computed(() => {
- return activityTopAuthors.map((item, idx: number) => {
- return {
- position: idx + 1,
- ...item,
- };
- });
- });
-
- const graphWidth = computed(() => {
- return activityTopAuthors.length * 40;
- });
-
- const styleElement = useTemplateRef('styleElement');
- const altStyleElement = useTemplateRef('altStyleElement');
-
- onMounted(() => {
- const refStyle = window.getComputedStyle(styleElement.value);
- const refAltStyle = window.getComputedStyle(altStyleElement.value);
-
- colors.value = {
- barColor: refStyle.backgroundColor,
- textColor: refStyle.color,
- textAltColor: refAltStyle.color,
- };
- });
- </script>
-
- <template>
- <div>
- <div class="activity-bar-graph tw-w-0 tw-h-0" ref="styleElement"/>
- <div class="activity-bar-graph-alt tw-w-0 tw-h-0" ref="altStyleElement"/>
- <vue-bar-graph
- :points="graphPoints"
- :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 #label="opt">
- <g v-for="(author, idx) in graphAuthors" :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 #title="opt">
- <tspan v-for="(author, idx) in graphAuthors" :key="author.position">
- <tspan v-if="opt.bar.index === idx">
- {{ author.name }}
- </tspan>
- </tspan>
- </template>
- </vue-bar-graph>
- </div>
- </template>
|