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>
tokarchuk/v1.17
gordon-- 4 years ago committed by GitHub
parent f3e64f677f
commit 343c756357
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      models/action.go
  2. 1
      routers/user/home.go
  3. 1
      routers/user/profile.go
  4. 21
      web_src/js/components/ActivityHeatmap.vue

@ -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…
Cancel
Save