mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	Migrate ActivityHeatmap to Vue SFC (#10953)
* Migrate ActivityHeatmap to Vue SFC Signed-off-by: Gary Kim <gary@garykim.dev> * Readd vue compiler alias Signed-off-by: Gary Kim <gary@garykim.dev> * Remove unneeded use of v-html Signed-off-by: Gary Kim <gary@garykim.dev> Co-authored-by: zeripath <art27@cantab.net>
This commit is contained in:
		
							
								
								
									
										79
									
								
								web_src/js/components/ActivityHeatmap.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								web_src/js/components/ActivityHeatmap.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | <template> | ||||||
|  |     <div> | ||||||
|  |         <div v-show="isLoading"> | ||||||
|  |             <slot name="loading"></slot> | ||||||
|  |         </div> | ||||||
|  |         <h4 class="total-contributions" v-if="!isLoading"> | ||||||
|  |             {{ totalContributions }} total contributions in the last 12 months | ||||||
|  |         </h4> | ||||||
|  |         <calendar-heatmap v-show="!isLoading" :locale="locale" :no-data-text="locale.no_contributions" :tooltip-unit="locale.contributions" :end-date="endDate" :values="values" :range-color="colorRange"/> | ||||||
|  |     </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script> | ||||||
|  | import {CalendarHeatmap} from 'vue-calendar-heatmap'; | ||||||
|  | const {AppSubUrl, heatmapUser} = window.config; | ||||||
|  |  | ||||||
|  | export default { | ||||||
|  |     name: "ActivityHeatmap", | ||||||
|  |     components: { | ||||||
|  |         CalendarHeatmap | ||||||
|  |     }, | ||||||
|  |     data() { | ||||||
|  |         return { | ||||||
|  |             isLoading: true, | ||||||
|  |             colorRange: [], | ||||||
|  |             endDate: null, | ||||||
|  |             values: [], | ||||||
|  |             totalContributions: 0, | ||||||
|  |             suburl: AppSubUrl, | ||||||
|  |             user: heatmapUser, | ||||||
|  |             locale: { | ||||||
|  |                 contributions: 'contributions', | ||||||
|  |                 no_contributions: 'No contributions', | ||||||
|  |             }, | ||||||
|  |         }; | ||||||
|  |     }, | ||||||
|  |     mounted() { | ||||||
|  |         this.colorRange = [ | ||||||
|  |             this.getColor(0), | ||||||
|  |             this.getColor(1), | ||||||
|  |             this.getColor(2), | ||||||
|  |             this.getColor(3), | ||||||
|  |             this.getColor(4), | ||||||
|  |             this.getColor(5) | ||||||
|  |         ]; | ||||||
|  |         this.endDate = new Date(); | ||||||
|  |         this.loadHeatmap(this.user); | ||||||
|  |     }, | ||||||
|  |     methods: { | ||||||
|  |         loadHeatmap(userName) { | ||||||
|  |             const self = this; | ||||||
|  |             $.get(`${this.suburl}/api/v1/users/${userName}/heatmap`, (chartRawData) => { | ||||||
|  |                 const chartData = []; | ||||||
|  |                 for (let i = 0; i < chartRawData.length; i++) { | ||||||
|  |                     self.totalContributions += chartRawData[i].contributions; | ||||||
|  |                     chartData[i] = {date: new Date(chartRawData[i].timestamp * 1000), count: chartRawData[i].contributions}; | ||||||
|  |                 } | ||||||
|  |                 self.values = chartData; | ||||||
|  |                 self.isLoading = false; | ||||||
|  |             }); | ||||||
|  |         }, | ||||||
|  |         getColor(idx) { | ||||||
|  |             const el = document.createElement('div'); | ||||||
|  |             el.className = `heatmap-color-${idx}`; | ||||||
|  |             document.body.appendChild(el); | ||||||
|  |  | ||||||
|  |             const color = getComputedStyle(el).backgroundColor; | ||||||
|  |  | ||||||
|  |             document.body.removeChild(el); | ||||||
|  |  | ||||||
|  |             return color; | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  |  | ||||||
|  | </style> | ||||||
| @@ -1,98 +1,10 @@ | |||||||
| import Vue from 'vue'; | import Vue from 'vue'; | ||||||
|  |  | ||||||
| const {AppSubUrl, heatmapUser} = window.config; | import ActivityHeatmap from '../components/ActivityHeatmap.vue'; | ||||||
|  |  | ||||||
| export default async function initHeatmap() { | export default async function initUserHeatmap() { | ||||||
|   const el = document.getElementById('user-heatmap'); |   const el = document.getElementById('user-heatmap'); | ||||||
|   if (!el) return; |   if (!el) return; | ||||||
|  |   const View = Vue.extend(ActivityHeatmap); | ||||||
|   const {CalendarHeatmap} = await import(/* webpackChunkName: "userheatmap" */'vue-calendar-heatmap'); |   new View().$mount(el); | ||||||
|   Vue.component('calendarHeatmap', CalendarHeatmap); |  | ||||||
|  |  | ||||||
|   const vueDelimeters = ['${', '}']; |  | ||||||
|  |  | ||||||
|   Vue.component('activity-heatmap', { |  | ||||||
|     delimiters: vueDelimeters, |  | ||||||
|  |  | ||||||
|     props: { |  | ||||||
|       user: { |  | ||||||
|         type: String, |  | ||||||
|         required: true |  | ||||||
|       }, |  | ||||||
|       suburl: { |  | ||||||
|         type: String, |  | ||||||
|         required: true |  | ||||||
|       }, |  | ||||||
|       locale: { |  | ||||||
|         type: Object, |  | ||||||
|         required: true |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     data() { |  | ||||||
|       return { |  | ||||||
|         isLoading: true, |  | ||||||
|         colorRange: [], |  | ||||||
|         endDate: null, |  | ||||||
|         values: [], |  | ||||||
|         totalContributions: 0, |  | ||||||
|       }; |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     mounted() { |  | ||||||
|       this.colorRange = [ |  | ||||||
|         this.getColor(0), |  | ||||||
|         this.getColor(1), |  | ||||||
|         this.getColor(2), |  | ||||||
|         this.getColor(3), |  | ||||||
|         this.getColor(4), |  | ||||||
|         this.getColor(5) |  | ||||||
|       ]; |  | ||||||
|       this.endDate = new Date(); |  | ||||||
|       this.loadHeatmap(this.user); |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     methods: { |  | ||||||
|       loadHeatmap(userName) { |  | ||||||
|         const self = this; |  | ||||||
|         $.get(`${this.suburl}/api/v1/users/${userName}/heatmap`, (chartRawData) => { |  | ||||||
|           const chartData = []; |  | ||||||
|           for (let i = 0; i < chartRawData.length; i++) { |  | ||||||
|             self.totalContributions += chartRawData[i].contributions; |  | ||||||
|             chartData[i] = {date: new Date(chartRawData[i].timestamp * 1000), count: chartRawData[i].contributions}; |  | ||||||
|           } |  | ||||||
|           self.values = chartData; |  | ||||||
|           self.isLoading = false; |  | ||||||
|         }); |  | ||||||
|       }, |  | ||||||
|  |  | ||||||
|       getColor(idx) { |  | ||||||
|         const el = document.createElement('div'); |  | ||||||
|         el.className = `heatmap-color-${idx}`; |  | ||||||
|         document.body.appendChild(el); |  | ||||||
|  |  | ||||||
|         const color = getComputedStyle(el).backgroundColor; |  | ||||||
|  |  | ||||||
|         document.body.removeChild(el); |  | ||||||
|  |  | ||||||
|         return color; |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|  |  | ||||||
|     template: '<div><div v-show="isLoading"><slot name="loading"></slot></div><h4 class="total-contributions" v-if="!isLoading"><span v-html="totalContributions"></span> total contributions in the last 12 months</h4><calendar-heatmap v-show="!isLoading" :locale="locale" :no-data-text="locale.no_contributions" :tooltip-unit="locale.contributions" :end-date="endDate" :values="values" :range-color="colorRange"/></div>' |  | ||||||
|   }); |  | ||||||
|  |  | ||||||
|   new Vue({ |  | ||||||
|     delimiters: vueDelimeters, |  | ||||||
|     el, |  | ||||||
|  |  | ||||||
|     data: { |  | ||||||
|       suburl: AppSubUrl, |  | ||||||
|       heatmapUser, |  | ||||||
|       locale: { |  | ||||||
|         contributions: 'contributions', |  | ||||||
|         no_contributions: 'No contributions', |  | ||||||
|       }, |  | ||||||
|     }, |  | ||||||
|   }); |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user