diff --git a/httpd-client/lib/project.ts b/httpd-client/lib/project.ts index 7184212db..9ec796449 100644 --- a/httpd-client/lib/project.ts +++ b/httpd-client/lib/project.ts @@ -56,6 +56,10 @@ const projectSchema = object({ defaultBranch: string(), delegates: array(string()), head: string(), + visibility: union([ + object({ type: literal("public") }), + object({ type: literal("private"), allow: optional(array(string())) }), + ]).optional(), patches: object({ open: number(), draft: number(), diff --git a/src/App/Header/Breadcrumbs/ProjectSegment.svelte b/src/App/Header/Breadcrumbs/ProjectSegment.svelte index 0bcd2b11e..6831a4f8b 100644 --- a/src/App/Header/Breadcrumbs/ProjectSegment.svelte +++ b/src/App/Header/Breadcrumbs/ProjectSegment.svelte @@ -2,11 +2,12 @@ import type { ProjectLoadedRoute } from "@app/views/projects/router"; import * as utils from "@app/lib/utils"; + import { unreachable } from "@app/lib/utils"; import CopyableId from "@app/components/CopyableId.svelte"; + import IconSmall from "@app/components/IconSmall.svelte"; import Link from "@app/components/Link.svelte"; import Separator from "./Separator.svelte"; - import { unreachable } from "@app/lib/utils"; export let activeRoute: ProjectLoadedRoute; @@ -23,6 +24,9 @@ + {#if activeRoute.params.project.visibility?.type === "private"} + + {/if} + {:else if name === "lock"} + + {:else if name === "key"} import type { WeeklyActivity } from "@app/lib/commit"; + import capitalize from "lodash/capitalize"; import { formatCommit, twemoji } from "@app/lib/utils"; import ActivityDiagram from "@app/components/ActivityDiagram.svelte"; + import Badge from "@app/components/Badge.svelte"; + import IconSmall from "@app/components/IconSmall.svelte"; export let activity: WeeklyActivity[]; export let compact = false; export let description: string; export let head: string; + export let visibility: "public" | "private" = "public"; export let id: string; export let name: string; @@ -63,12 +67,19 @@ .description { font-size: var(--font-size-small); } - .id { + .title { display: flex; - justify-content: space-between; + flex-direction: row; + gap: 1rem; + align-items: center; font-size: var(--font-size-medium); font-weight: var(--font-weight-medium); } + .name { + white-space: nowrap; + overflow-x: hidden; + text-overflow: ellipsis; + } .rid { visibility: hidden; color: var(--color-fill-secondary); @@ -93,7 +104,22 @@
-
{name}
+
+ + {name} + + {#if visibility === "private"} + {#if compact} +
+ +
+ {:else} + + {capitalize(visibility)} + + {/if} + {/if} +
{description}
{#if compact} diff --git a/src/views/home/Index.svelte b/src/views/home/Index.svelte index 46fb1c5b5..86b799fe6 100644 --- a/src/views/home/Index.svelte +++ b/src/views/home/Index.svelte @@ -98,6 +98,7 @@ compact description={project.description} head={project.head} + visibility={project.visibility?.type} id={project.id} name={project.name} {activity} /> diff --git a/src/views/nodes/View.svelte b/src/views/nodes/View.svelte index dcc7eaa41..c5bc66675 100644 --- a/src/views/nodes/View.svelte +++ b/src/views/nodes/View.svelte @@ -141,6 +141,7 @@ {activity} id={project.id} name={project.name} + visibility={project.visibility?.type} description={project.description} head={project.head} /> diff --git a/src/views/projects/Layout.svelte b/src/views/projects/Layout.svelte index f28d01f62..15bcb972d 100644 --- a/src/views/projects/Layout.svelte +++ b/src/views/projects/Layout.svelte @@ -4,15 +4,16 @@ import dompurify from "dompurify"; + import capitalize from "lodash/capitalize"; import markdown from "@app/lib/markdown"; import { twemoji } from "@app/lib/utils"; + import Badge from "@app/components/Badge.svelte"; import CloneButton from "@app/views/projects/Header/CloneButton.svelte"; - import Link from "@app/components/Link.svelte"; - - import Header from "./Header.svelte"; - import TrackButton from "./Header/TrackButton.svelte"; import CopyableId from "@app/components/CopyableId.svelte"; + import Header from "@app/views/projects/Header.svelte"; + import Link from "@app/components/Link.svelte"; + import TrackButton from "@app/views/projects/Header/TrackButton.svelte"; export let activeTab: ActiveTab = undefined; export let baseUrl: BaseUrl; @@ -32,6 +33,7 @@ } .title { align-items: center; + gap: 0.5rem; color: var(--color-foreground-contrast); display: flex; font-size: var(--font-size-x-large); @@ -88,6 +90,11 @@ + {#if project.visibility && project.visibility.type === "private"} + + {capitalize(project.visibility.type)} + + {/if}