diff --git a/src/App.svelte b/src/App.svelte index 02ba3deb9..937bcb2c3 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -16,6 +16,7 @@ import Header from '@app/Header.svelte'; import Loading from '@app/Loading.svelte'; import Modal from '@app/Modal.svelte'; + import LinearGradient from "@app/LinearGradient.svelte"; const loadConfig = getConfig().then(async cfg => { if ($state.connection === Connection.Connected) { @@ -112,4 +113,6 @@ {/await} + + diff --git a/src/Diagram.svelte b/src/Diagram.svelte new file mode 100644 index 000000000..c2cdbd6d3 --- /dev/null +++ b/src/Diagram.svelte @@ -0,0 +1,78 @@ + + + + + + + + + diff --git a/src/LinearGradient.svelte b/src/LinearGradient.svelte new file mode 100644 index 000000000..64515412e --- /dev/null +++ b/src/LinearGradient.svelte @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/src/base/orgs/View/Projects.svelte b/src/base/orgs/View/Projects.svelte index 946b21bc0..1ff3eeb20 100644 --- a/src/base/orgs/View/Projects.svelte +++ b/src/base/orgs/View/Projects.svelte @@ -67,7 +67,7 @@ {@const pendingAnchor = pendingAnchors[project.urn]} {#if project.head}
- onClick(project)}> + onClick(project)}> {#if profile?.org?.safe && account && anchor} {#if pendingAnchor} diff --git a/src/base/projects/History.svelte b/src/base/projects/History.svelte index 84937c5ba..9dc9ce9ff 100644 --- a/src/base/projects/History.svelte +++ b/src/base/projects/History.svelte @@ -1,6 +1,7 @@ @@ -55,7 +56,7 @@ {#each history.headers as group (group.time)}
-

{group.time}

+

{group.date}

{#each group.commits as commit (commit.header.sha1)} diff --git a/src/base/projects/Widget.svelte b/src/base/projects/Widget.svelte index 380144673..a48dd86bb 100644 --- a/src/base/projects/Widget.svelte +++ b/src/base/projects/Widget.svelte @@ -1,27 +1,70 @@
-
- {project.name} - {project.urn} -
-
{project.description || ""}
-
- - - {#if project.head} - {project.head} - {:else} - ✗ No head - {/if} - - - - - - - - - - {#if anchor && project.head} - +
+
+ {project.name} +
+
{project.description || ""}
+
+ + + {#if project.head} + {project.head} + {:else} + ✗ No head {/if} - +
+
+
+
+ {project.urn} +
+
+ + + + + + + + {#if anchor && project.head} + + {/if} + + + +
+ {#await loadCommits() then points} +
+ +
+ {/await}
diff --git a/src/commit.ts b/src/commit.ts index 9941e9573..12e8962f2 100644 --- a/src/commit.ts +++ b/src/commit.ts @@ -17,7 +17,6 @@ export interface GroupedCommitsHistory { } export interface Author { - avatar: string; email: string; name: string; } @@ -54,8 +53,10 @@ export interface CommitHeader { // A set of commits grouped by time. export interface CommitGroup { - time: string; + date: string; + time: number; commits: CommitMetadata[]; + week: number; } export interface CommitStats { @@ -112,8 +113,10 @@ export function groupCommits(commits: { header: CommitHeader; context: CommitCon if (isNewDay) { groupedCommits.push({ - time: formatGroupTime(time), + date: formatGroupTime(time), + time, commits: [], + week: 0 }); groupDate = date; } @@ -128,3 +131,61 @@ export function groupCommits(commits: { header: CommitHeader; context: CommitCon export const formatCommitTime = (t: number): string => { return new Date(t * 1000).toUTCString(); }; + +export function groupCommitsByWeek(commits: CommitMetadata[]): CommitGroup[] { + const groupedCommits: CommitGroup[] = []; + let groupDate: Date | undefined = undefined; + + if (commits.length === 0) { + return []; + } + + commits = commits.sort((a, b) => { + if (a.header.committerTime > b.header.committerTime) { + return -1; + } else if (a.header.committerTime < b.header.committerTime) { + return 1; + } + + return 0; + }); + + // A accumulator that increments by the amount of weeks between weekly commit groups + let weekAccumulator = Math.floor(getDaysPassed(new Date(commits[0].header.committerTime * 1000), new Date()) / 7); + + // Loops over all commits and stores them by week with some additional metadata in groupedCommits. + for (const commit of commits) { + const time = commit.header.committerTime * 1000; + const date = new Date(time); + const isNewWeek = + !groupedCommits.length || + !groupDate || + getDaysPassed(date, groupDate) > 7 || + date.getFullYear() < groupDate.getFullYear(); + + if (isNewWeek) { + let daysPassed = 0; + if (groupDate) { + daysPassed = getDaysPassed(date, groupDate); + } + groupedCommits.push({ + date: formatGroupTime(time), + time, + commits: [], + week: Math.floor(daysPassed / 7) + weekAccumulator + }); + groupDate = date; + weekAccumulator += Math.floor(daysPassed / 7); + } + groupedCommits[groupedCommits.length - 1].commits.push(commit); + } + + return groupedCommits; +} + +// Get amount of days passed between two dates +function getDaysPassed(from: Date, to: Date): number { + return Math.floor( + (to.getTime() - from.getTime()) / (24 * 60 * 60 * 1000) + ); +} diff --git a/src/project.ts b/src/project.ts index 4db458954..eed013498 100644 --- a/src/project.ts +++ b/src/project.ts @@ -274,8 +274,12 @@ export class Project implements ProjectInfo { return api.get(`projects/${urn}/remotes`, {}, host); } - async getCommits(commit: string): Promise { - return api.get(`projects/${this.urn}/commits?parent=${commit}`, {}, this.seed.api); + static async getCommits(urn: string, host: api.Host, parent?: string, since?: string, until?: string, perPage?: string, page?: string): Promise { + const params: Record = { parent, since, until, "per-page": perPage, page }; + // Removes the undefined params. + Object.keys(params).forEach(key => params[key] === undefined && delete params[key]); + + return api.get(`projects/${urn}/commits`, params, host); } async getCommit(commit: string): Promise {