mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-28 02:14:06 -05:00
e9be8b25ae
Continuation of https://github.com/go-gitea/gitea/pull/25439. Fixes #847 Before: <img width="1296" alt="image" src="https://github.com/go-gitea/gitea/assets/32161460/24571ac8-b254-43c9-b178-97340f0dc8a9"> ---- After: <img width="1296" alt="image" src="https://github.com/go-gitea/gitea/assets/32161460/c60b2459-9d10-4d42-8d83-d5ef0f45bf94"> --- #### Overview This is the implementation of a requested feature: Contributors graph (#847) It makes Activity page a multi-tab page and adds a new tab called Contributors. Contributors tab shows the contribution graphs over time since the repository existed. It also shows per user contribution graphs for top 100 contributors. Top 100 is calculated based on the selected contribution type (commits, additions or deletions). --- #### Demo (The demo is a bit old but still a good example to show off the main features) <video src="https://github.com/go-gitea/gitea/assets/32161460/9f68103f-8145-4cc2-94bc-5546daae7014" controls width="320" height="240"> <a href="https://github.com/go-gitea/gitea/assets/32161460/9f68103f-8145-4cc2-94bc-5546daae7014">Download</a> </video> #### Features: - Select contribution type (commits, additions or deletions) - See overall and per user contribution graphs for the selected contribution type - Zoom and pan on graphs to see them in detail - See top 100 contributors based on the selected contribution type and selected time range - Go directly to users' profile by clicking their name if they are registered gitea users - Cache the results so that when the same repository is visited again fetching data will be faster --------- Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: hiifong <i@hiif.ong> Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: yp05327 <576951401@qq.com> (cherry picked from commit 21331be30cb8f6c2d8b9dd99f1061623900632b9)
46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
import dayjs from 'dayjs';
|
|
|
|
// Returns an array of millisecond-timestamps of start-of-week days (Sundays)
|
|
export function startDaysBetween(startDate, endDate) {
|
|
// Ensure the start date is a Sunday
|
|
while (startDate.getDay() !== 0) {
|
|
startDate.setDate(startDate.getDate() + 1);
|
|
}
|
|
|
|
const start = dayjs(startDate);
|
|
const end = dayjs(endDate);
|
|
const startDays = [];
|
|
|
|
let current = start;
|
|
while (current.isBefore(end)) {
|
|
startDays.push(current.valueOf());
|
|
// we are adding 7 * 24 hours instead of 1 week because we don't want
|
|
// date library to use local time zone to calculate 1 week from now.
|
|
// local time zone is problematic because of daylight saving time (dst)
|
|
// used on some countries
|
|
current = current.add(7 * 24, 'hour');
|
|
}
|
|
|
|
return startDays;
|
|
}
|
|
|
|
export function firstStartDateAfterDate(inputDate) {
|
|
if (!(inputDate instanceof Date)) {
|
|
throw new Error('Invalid date');
|
|
}
|
|
const dayOfWeek = inputDate.getDay();
|
|
const daysUntilSunday = 7 - dayOfWeek;
|
|
const resultDate = new Date(inputDate.getTime());
|
|
resultDate.setDate(resultDate.getDate() + daysUntilSunday);
|
|
return resultDate.valueOf();
|
|
}
|
|
|
|
export function fillEmptyStartDaysWithZeroes(startDays, data) {
|
|
const result = {};
|
|
|
|
for (const startDay of startDays) {
|
|
result[startDay] = data[startDay] || {'week': startDay, 'additions': 0, 'deletions': 0, 'commits': 0};
|
|
}
|
|
|
|
return Object.values(result);
|
|
}
|