- ← {name}
+ ← {name}
Cached Objects
diff --git a/ui/src/pages/Remotes.tsx b/ui/src/pages/Remotes.tsx
index 77dcd4f..d80e8c9 100644
--- a/ui/src/pages/Remotes.tsx
+++ b/ui/src/pages/Remotes.tsx
@@ -32,9 +32,10 @@ export function Remotes() {
.finally(() => setLoading(false));
}, []);
- const types = [...new Set(remotes.map(r => r.package_type))].sort();
+ const remoteOnly = remotes.filter(r => r.repo_type !== 'local');
+ const types = [...new Set(remoteOnly.map(r => r.package_type))].sort();
- const filtered = remotes.filter(r => {
+ const filtered = remoteOnly.filter(r => {
if (typeFilter && r.package_type !== typeFilter) return false;
if (filter && !r.name.toLowerCase().includes(filter.toLowerCase())) return false;
return true;
diff --git a/ui/src/pages/Virtuals.tsx b/ui/src/pages/Virtuals.tsx
index fa51f82..08e38ad 100644
--- a/ui/src/pages/Virtuals.tsx
+++ b/ui/src/pages/Virtuals.tsx
@@ -1,21 +1,38 @@
import { useEffect, useState } from 'react';
+import { Link } from 'react-router-dom';
import { api } from '../api/client';
-import type { Virtual } from '../api/types';
+import type { Remote, Virtual } from '../api/types';
import { Badge } from '../components/Badge';
import { DataTable } from '../components/DataTable';
import './Virtuals.css';
export function Virtuals() {
const [virtuals, setVirtuals] = useState
([]);
+ const [remoteMap, setRemoteMap] = useState>({});
const [loading, setLoading] = useState(true);
const [expanded, setExpanded] = useState(null);
useEffect(() => {
- api.listVirtuals()
- .then(v => setVirtuals(v || []))
+ Promise.all([api.listVirtuals(), api.listRemotes()])
+ .then(([v, r]) => {
+ setVirtuals(v || []);
+ const map: Record = {};
+ for (const remote of r || []) {
+ map[remote.name] = remote;
+ }
+ setRemoteMap(map);
+ })
.finally(() => setLoading(false));
}, []);
+ function memberLink(name: string) {
+ const remote = remoteMap[name];
+ if (remote?.repo_type === 'local') {
+ return `/locals/${name}`;
+ }
+ return `/remotes/${name}`;
+ }
+
return (
Virtual Repositories
@@ -40,7 +57,7 @@ export function Virtuals() {
key: 'members',
header: 'Members',
render: (v: Virtual) => (
-
{v.members?.length || 0} remotes
+
{v.members?.length || 0} repos
),
width: '110px',
},
@@ -69,12 +86,17 @@ export function Virtuals() {
{virtuals
.find(v => v.name === expanded)
- ?.members?.map((m, i) => (
- -
- {i + 1}
- {m}
-
- ))}
+ ?.members?.map((m, i) => {
+ const remote = remoteMap[m];
+ const typeLabel = remote?.repo_type === 'local' ? 'local' : 'remote';
+ return (
+ -
+ {i + 1}
+ {m}
+ {typeLabel}
+
+ );
+ })}
)}