Browse Source

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>
pull/14763/head
gordon-- 3 days ago
committed by GitHub
parent
commit
343c756357
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 7 deletions
  1. +19
    -6
      models/action.go
  2. +1
    -0
      routers/user/home.go
  3. +1
    -0
      routers/user/profile.go
  4. +20
    -1
      web_src/js/components/ActivityHeatmap.vue

+ 19
- 6
models/action.go View File

@ -289,12 +289,13 @@ func (a *Action) GetIssueContent() string {
// GetFeedsOptions options for retrieving feeds
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
@ -380,5 +381,17 @@ func activityQueryCondition(opts GetFeedsOptions) (builder.Cond, error) {
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
}

+ 1
- 0
routers/user/home.go View File

@ -156,6 +156,7 @@ func Dashboard(ctx *context.Context) {
IncludePrivate: true,
OnlyPerformedBy: false,
IncludeDeleted: false,
Date: ctx.Query("date"),
})
if ctx.Written() {

+ 1
- 0
routers/user/profile.go View File

@ -202,6 +202,7 @@ func Profile(ctx *context.Context) {
IncludePrivate: showPrivate,
OnlyPerformedBy: true,
IncludeDeleted: false,
Date: ctx.Query("date"),
})
if ctx.Written() {
return

+ 20
- 1
web_src/js/components/ActivityHeatmap.vue View File

@ -10,6 +10,7 @@
:end-date="endDate"
:values="values"
:range-color="colorRange"
@day-click="handleDayClick($event)"
/>
</div>
</template>
@ -48,7 +49,25 @@ export default {
}
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>
<style scoped/>

Loading…
Cancel
Save