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:
		
							parent
							
								
									f3e64f677f
								
							
						
					
					
						commit
						343c756357
					
				
					 4 changed files with 41 additions and 7 deletions
				
			
		|  | @ -289,12 +289,13 @@ func (a *Action) GetIssueContent() string { | ||||||
| 
 | 
 | ||||||
| // GetFeedsOptions options for retrieving feeds
 | // GetFeedsOptions options for retrieving feeds
 | ||||||
| type GetFeedsOptions struct { | type GetFeedsOptions struct { | ||||||
| 	RequestedUser   *User // the user we want activity for
 | 	RequestedUser   *User  // the user we want activity for
 | ||||||
| 	RequestedTeam   *Team // the team we want activity for
 | 	RequestedTeam   *Team  // the team we want activity for
 | ||||||
| 	Actor           *User // the user viewing the activity
 | 	Actor           *User  // the user viewing the activity
 | ||||||
| 	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/> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue