diff --git a/public/index.css b/public/index.css index e724a60df..981574a3e 100644 --- a/public/index.css +++ b/public/index.css @@ -41,6 +41,12 @@ body { font-weight: var(--font-weight-semibold); } +.global-none { + color: var(--color-foreground-disabled); + font-weight: var(--font-weight-bold); + font-family: var(--font-family-monospace); +} + .global-flex { display: flex; align-items: center; diff --git a/src/components/Changes.svelte b/src/components/Changes.svelte index 066995d9a..9c8d9a16a 100644 --- a/src/components/Changes.svelte +++ b/src/components/Changes.svelte @@ -5,6 +5,7 @@ import type { Revision } from "@bindings/cob/patch/Revision"; import { invoke } from "@app/lib/invoke"; + import { pluralize } from "@app/lib/utils"; import Changeset from "@app/components/Changeset.svelte"; import CobCommitTeaser from "./CobCommitTeaser.svelte"; @@ -24,6 +25,9 @@ let hideChanges = $state(false); let filesExpanded = $state(true); + let selectedCommit = $state(); + let base = $state(revision.base); + let head = $state(revision.head); $effect(() => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions @@ -33,6 +37,27 @@ filesExpanded = true; }); + function selectRevision({ + headId, + baseId, + commitId = undefined, + showFiles = true, + }: { + headId: string; + baseId: string; + commitId?: string; + showFiles?: boolean; + }) { + head = headId; + base = baseId; + selectedCommit = commitId; + filesExpanded = showFiles; + } + + const isActiveCommit = (commitId: string) => selectedCommit === commitId; + const isTeaserDisabled = (commitId: string) => + selectedCommit ? selectedCommit !== commitId : false; + async function loadHighlightedDiff(rid: string, base: string, head: string) { return invoke("get_diff", { rid, @@ -81,6 +106,28 @@ left: -18.5px; background-color: var(--color-fill-separator); } + .commit { + cursor: pointer; + } + .commit-dot.active { + background-color: var(--color-border-focus); + } + .commit:hover .commit-dot:not(.active) { + background-color: var(--color-foreground-contrast); + } + .commit:hover { + background-color: var(--color-background-float); + } + .disabled { + color: var(--color-foreground-disabled) !important; + } + .summary { + padding: 0.25rem 0; + } + .summary:hover { + background-color: var(--color-background-float); + color: var(--color-foreground-contrast) !important; + } .hide { display: none; } @@ -113,23 +160,48 @@
{#await loadCommits(rid, revision.base, revision.head) then commits}
- + {#snippet leftHeader()}
Commits
{/snippet} {#snippet children()}
+ +
- + class="global-flex txt-small summary" + class:disabled={selectedCommit} + style:cursor="pointer" + onclick={() => + selectRevision({ + headId: revision.head, + baseId: revision.base, + })}> + + {commits.length} + {pluralize("commit", commits.length)} on base +
base
{#each commits.reverse() as commit}
- +
+
+ + selectRevision({ + headId: commit.id, + baseId: commit.parents[0], + commitId: commit.id, + })} + {commit} />
{/each}
@@ -139,13 +211,9 @@
{/await} - {#await loadHighlightedDiff(rid, revision.base, revision.head)} + {#await loadHighlightedDiff(rid, base, head)} Loading… {:then diff} - + {/await}
diff --git a/src/components/CobCommitTeaser.svelte b/src/components/CobCommitTeaser.svelte index be56f4104..eef017d9f 100644 --- a/src/components/CobCommitTeaser.svelte +++ b/src/components/CobCommitTeaser.svelte @@ -10,10 +10,12 @@ import NakedButton from "@app/components/NakedButton.svelte"; interface Props { + disabled: boolean; commit: Commit; + onclick: () => void; } - const { commit }: Props = $props(); + const { disabled, commit, onclick }: Props = $props(); let commitMessageVisible = $state(false); @@ -58,13 +60,21 @@ display: flex; align-items: center; } + .disabled { + color: var(--color-foreground-disabled) !important; + } pre { white-space: pre-wrap; word-wrap: break-word; } + .summary { + cursor: pointer; + } -
+ + +
@@ -75,7 +85,8 @@ { + onclick={e => { + e.stopPropagation(); commitMessageVisible = !commitMessageVisible; }}> @@ -91,7 +102,7 @@
- +
diff --git a/src/components/CommitsContainer.svelte b/src/components/CommitsContainer.svelte index a78b20128..486a7de5d 100644 --- a/src/components/CommitsContainer.svelte +++ b/src/components/CommitsContainer.svelte @@ -8,12 +8,11 @@ interface Props { leftHeader: Snippet; children: Snippet; - expanded: boolean; } - /* eslint-disable prefer-const */ - let { leftHeader, children, expanded }: Props = $props(); - /* eslint-enable prefer-const */ + const { leftHeader, children }: Props = $props(); + + let expanded = $state(true);