mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Heatmap days clickable (#13935)
* Heatmap days clickable * Error handling * Unselect filter * better dayclick handler * made linter happy * clickable heatmap for profiles Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		| @@ -295,6 +295,7 @@ type GetFeedsOptions struct { | |||||||
| 	IncludePrivate  bool   // include private actions | 	IncludePrivate  bool   // include private actions | ||||||
| 	OnlyPerformedBy bool   // only actions performed by requested user | 	OnlyPerformedBy bool   // only actions performed by requested user | ||||||
| 	IncludeDeleted  bool   // include deleted actions | 	IncludeDeleted  bool   // include deleted actions | ||||||
|  | 	Date            string // the day we want activity for: YYYY-MM-DD | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetFeeds returns actions according to the provided options | // GetFeeds returns actions according to the provided options | ||||||
| @@ -380,5 +381,17 @@ func activityQueryCondition(opts GetFeedsOptions) (builder.Cond, error) { | |||||||
| 		cond = cond.And(builder.Eq{"is_deleted": false}) | 		cond = cond.And(builder.Eq{"is_deleted": false}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if opts.Date != "" { | ||||||
|  | 		dateLow, err := time.Parse("2006-01-02", opts.Date) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Warn("Unable to parse %s, filter not applied: %v", opts.Date, err) | ||||||
|  | 		} else { | ||||||
|  | 			dateHigh := dateLow.Add(86399000000000) // 23h59m59s | ||||||
|  |  | ||||||
|  | 			cond = cond.And(builder.Gte{"created_unix": dateLow.Unix()}) | ||||||
|  | 			cond = cond.And(builder.Lte{"created_unix": dateHigh.Unix()}) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return cond, nil | 	return cond, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -156,6 +156,7 @@ func Dashboard(ctx *context.Context) { | |||||||
| 		IncludePrivate:  true, | 		IncludePrivate:  true, | ||||||
| 		OnlyPerformedBy: false, | 		OnlyPerformedBy: false, | ||||||
| 		IncludeDeleted:  false, | 		IncludeDeleted:  false, | ||||||
|  | 		Date:            ctx.Query("date"), | ||||||
| 	}) | 	}) | ||||||
|  |  | ||||||
| 	if ctx.Written() { | 	if ctx.Written() { | ||||||
|   | |||||||
| @@ -202,6 +202,7 @@ func Profile(ctx *context.Context) { | |||||||
| 			IncludePrivate:  showPrivate, | 			IncludePrivate:  showPrivate, | ||||||
| 			OnlyPerformedBy: true, | 			OnlyPerformedBy: true, | ||||||
| 			IncludeDeleted:  false, | 			IncludeDeleted:  false, | ||||||
|  | 			Date:            ctx.Query("date"), | ||||||
| 		}) | 		}) | ||||||
| 		if ctx.Written() { | 		if ctx.Written() { | ||||||
| 			return | 			return | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ | |||||||
|       :end-date="endDate" |       :end-date="endDate" | ||||||
|       :values="values" |       :values="values" | ||||||
|       :range-color="colorRange" |       :range-color="colorRange" | ||||||
|  |       @day-click="handleDayClick($event)" | ||||||
|     /> |     /> | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
| @@ -48,7 +49,25 @@ export default { | |||||||
|       } |       } | ||||||
|       return s; |       return s; | ||||||
|     } |     } | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     handleDayClick(e) { | ||||||
|  |       // Reset filter if same date is clicked | ||||||
|  |       const params = new URLSearchParams(document.location.search); | ||||||
|  |       const queryDate = params.get('date'); | ||||||
|  |       // Timezone has to be stripped because toISOString() converts to UTC | ||||||
|  |       const clickedDate = new Date(e.date - (e.date.getTimezoneOffset() * 60000)).toISOString().substring(0, 10); | ||||||
|  |  | ||||||
|  |       if (queryDate && queryDate === clickedDate) { | ||||||
|  |         params.delete('date'); | ||||||
|  |       } else { | ||||||
|  |         params.set('date', clickedDate); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       const newSearch = params.toString(); | ||||||
|  |       window.location.search = newSearch.length ? `?${newSearch}` : ''; | ||||||
|  |     } | ||||||
|  |   }, | ||||||
| }; | }; | ||||||
| </script> | </script> | ||||||
| <style scoped/> | <style scoped/> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user