Add favicon and enable sorting on all table columns

- Add custom Orchard favicon (tree with apples)
- Simplify browser tab title to "Orchard"
- Enable sorting on all columns except description:
  - Home: name, visibility, owner, created, updated
  - Project: name, format, tags, artifacts, size, created
  - Package: tag, size, type, filename, created
- Fix column keys to match API field names for proper sorting
This commit is contained in:
Mondo Diaz
2026-01-15 18:29:07 +00:00
parent ece5341199
commit 193e02baad
6 changed files with 29 additions and 8 deletions

View File

@@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Replaced project card grid with sortable data table on Home page for better handling of large project lists
- Replaced package card grid with sortable data table on Project page for consistency
- Replaced SortDropdown with table header sorting on Package page for consistency
- Enabled sorting on all table columns (except description) across Home, Project, and Package pages
- Updated browser tab title to "Orchard" with custom favicon
- Improved pod naming: Orchard pods now named `orchard-{env}-server-*` for clarity (#51)
### Fixed

View File

@@ -2,9 +2,9 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link rel="icon" type="image/svg+xml" href="/orchard.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Orchard - Content-Addressable Storage</title>
<title>Orchard</title>
</head>
<body>
<div id="root"></div>

View File

@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
<!-- Tree trunk -->
<rect x="14" y="20" width="4" height="10" rx="1" fill="#8B5A2B"/>
<!-- Tree crown -->
<circle cx="16" cy="12" r="10" fill="#4CAF50"/>
<!-- Fruits/apples -->
<circle cx="12" cy="10" r="2.5" fill="#E53935"/>
<circle cx="20" cy="11" r="2.5" fill="#E53935"/>
<circle cx="16" cy="16" r="2.5" fill="#E53935"/>
</svg>

After

Width:  |  Height:  |  Size: 420 B

View File

@@ -234,6 +234,7 @@ function Home() {
{
key: 'visibility',
header: 'Visibility',
sortable: true,
render: (project) => (
<Badge variant={project.is_public ? 'public' : 'private'}>
{project.is_public ? 'Public' : 'Private'}
@@ -243,6 +244,7 @@ function Home() {
{
key: 'created_by',
header: 'Owner',
sortable: true,
className: 'cell-owner',
render: (project) => project.created_by,
},

View File

@@ -193,20 +193,23 @@ function PackagePage() {
),
},
{
key: 'size',
key: 'artifact_size',
header: 'Size',
sortable: true,
render: (t: TagDetail) => <span>{formatBytes(t.artifact_size)}</span>,
},
{
key: 'content_type',
key: 'artifact_content_type',
header: 'Type',
sortable: true,
render: (t: TagDetail) => (
<span className="content-type">{t.artifact_content_type || '-'}</span>
),
},
{
key: 'original_name',
key: 'artifact_original_name',
header: 'Filename',
sortable: true,
className: 'cell-truncate',
render: (t: TagDetail) => (
<span title={t.artifact_original_name || undefined}>{t.artifact_original_name || '-'}</span>

View File

@@ -327,21 +327,25 @@ function ProjectPage() {
{
key: 'format',
header: 'Format',
sortable: true,
render: (pkg) => <Badge variant="default">{pkg.format}</Badge>,
},
{
key: 'tags',
key: 'tag_count',
header: 'Tags',
sortable: true,
render: (pkg) => pkg.tag_count ?? '—',
},
{
key: 'artifacts',
key: 'artifact_count',
header: 'Artifacts',
sortable: true,
render: (pkg) => pkg.artifact_count ?? '—',
},
{
key: 'size',
key: 'total_size',
header: 'Size',
sortable: true,
render: (pkg) =>
pkg.total_size !== undefined && pkg.total_size > 0 ? formatBytes(pkg.total_size) : '—',
},