* 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>tags/v1.15.0-dev
@@ -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 | |||||
RequestedTeam *Team // the team we want activity for | |||||
Actor *User // the user viewing the activity | |||||
IncludePrivate bool // include private actions | |||||
OnlyPerformedBy bool // only actions performed by requested user | |||||
IncludeDeleted bool // include deleted actions | |||||
RequestedUser *User // the user we want activity for | |||||
RequestedTeam *Team // the team we want activity for | |||||
Actor *User // the user viewing the activity | |||||
IncludePrivate bool // include private actions | |||||
OnlyPerformedBy bool // only actions performed by requested user | |||||
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/> |