mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Add top author stats to activity page (#9615)
This commit is contained in:
		
							
								
								
									
										102
									
								
								web_src/js/components/ActivityTopAuthors.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								web_src/js/components/ActivityTopAuthors.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,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> | ||||
| @@ -7,6 +7,8 @@ import './gitGraphLoader.js'; | ||||
| import './semanticDropdown.js'; | ||||
| import initContextPopups from './features/contextPopup'; | ||||
|  | ||||
| import ActivityTopAuthors from './components/ActivityTopAuthors.vue'; | ||||
|  | ||||
| function htmlEncode(text) { | ||||
|   return jQuery('<div />').text(text).html(); | ||||
| } | ||||
| @@ -2894,9 +2896,13 @@ function initVueApp() { | ||||
|     delimiters: ['${', '}'], | ||||
|     el, | ||||
|     data: { | ||||
|       searchLimit: document.querySelector('meta[name=_search_limit]').content, | ||||
|       searchLimit: (document.querySelector('meta[name=_search_limit]') || {}).content, | ||||
|       suburl: document.querySelector('meta[name=_suburl]').content, | ||||
|       uid: Number(document.querySelector('meta[name=_context_uid]').content), | ||||
|       uid: Number((document.querySelector('meta[name=_context_uid]') || {}).content), | ||||
|       activityTopAuthors: window.ActivityTopAuthors || [], | ||||
|     }, | ||||
|     components: { | ||||
|       ActivityTopAuthors, | ||||
|     }, | ||||
|   }); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Lauris BH
					Lauris BH