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/>
|
||||||
|
|
Reference in a new issue