e.stopPropagation()}
>
{ setViewArtifactId(a.id); setShowArtifactIdModal(true); setOpenMenuId(null); setMenuPosition(null); }}>
View Artifact ID
{ navigator.clipboard.writeText(a.id); setOpenMenuId(null); setMenuPosition(null); }}>
Copy Artifact ID
{ const version = getArtifactVersion(a); const ref = version || `artifact:${a.id}`; fetchEnsureFileForRef(ref); setOpenMenuId(null); setMenuPosition(null); }}>
View Ensure File
{ handleArtifactSelect(a); setShowDepsModal(true); setOpenMenuId(null); setMenuPosition(null); }}>
View Dependencies
);
};
if (loading && !artifactsData) {
return Loading...
;
}
if (accessDenied) {
return (
{packageName}
{pkg &&
{pkg.format} }
{user && canWrite && !isSystemProject && (
setShowUploadModal(true)}
>
Upload
)}
{pkg?.description &&
{pkg.description}
}
in {projectName}
{pkg && (
<>
Created {new Date(pkg.created_at).toLocaleDateString()}
{pkg.updated_at !== pkg.created_at && (
Updated {new Date(pkg.updated_at).toLocaleDateString()}
)}
>
)}
{pkg && pkg.artifact_count !== undefined && (
{pkg.artifact_count !== undefined && (
{pkg.artifact_count} {isSystemProject ? 'versions' : 'artifacts'}
)}
{pkg.total_size !== undefined && pkg.total_size > 0 && (
{formatBytes(pkg.total_size)} total
)}
)}
{error &&
{error}
}
{uploadSuccess &&
{uploadSuccess}
}
{isSystemProject ? 'Versions' : 'Artifacts'}
{hasActiveFilters && (
{search && handleSearchChange('')} />}
)}
a.id}
emptyMessage={
hasActiveFilters
? 'No artifacts match your filters. Try adjusting your search.'
: 'No artifacts yet. Upload a file to get started!'
}
onSort={handleSortChange}
sortKey={sort}
sortOrder={order}
/>
{pagination && pagination.total_pages > 1 && (
)}
{/* Used By (Reverse Dependencies) Section - only show if there are reverse deps or error */}
{(reverseDeps.length > 0 || reverseDepsError) && (
Used By
{reverseDepsError && (
{reverseDepsError}
)}
{reverseDepsTotal} {reverseDepsTotal === 1 ? 'package depends' : 'packages depend'} on this:
{reverseDeps.map((dep) => (
{dep.project}/{dep.package}
{dep.version && (
v{dep.version}
)}
requires @ {dep.constraint_value}
))}
{(reverseDepsHasMore || reverseDepsPage > 1) && (
fetchReverseDeps(reverseDepsPage - 1)}
disabled={reverseDepsPage <= 1 || reverseDepsLoading}
>
Previous
Page {reverseDepsPage}
fetchReverseDeps(reverseDepsPage + 1)}
disabled={!reverseDepsHasMore || reverseDepsLoading}
>
Next
)}
)}
{/* Dependency Graph Modal */}
{showGraph && selectedArtifact && (
setShowGraph(false)}
/>
)}
{/* Upload Modal */}
{showUploadModal && (
setShowUploadModal(false)}>
e.stopPropagation()}>
Upload Artifact
setShowUploadModal(false)}
title="Close"
>
{
handleUploadComplete(result);
setShowUploadModal(false);
}}
onUploadError={handleUploadError}
/>
)}
{/* Ensure File Modal */}
{showEnsureFile && (
setShowEnsureFile(false)}>
e.stopPropagation()}>
orchard.ensure for {ensureFileTagName}
{ensureFileContent && (
)}
setShowEnsureFile(false)}
title="Close"
>
{ensureFileLoading ? (
Loading...
) : ensureFileError ? (
{ensureFileError}
) : ensureFileContent ? (
{ensureFileContent}
) : (
No dependencies defined for this artifact.
)}
Save this as orchard.ensure in your project root to declare dependencies.
)}
{/* Dependencies Modal */}
{showDepsModal && selectedArtifact && (
setShowDepsModal(false)}>
e.stopPropagation()}>
Dependencies for {selectedArtifact.original_name || selectedArtifact.id.slice(0, 12)}
setShowDepsModal(false)}
title="Close"
>
View Ensure File
{ setShowDepsModal(false); setShowGraph(true); }}
>
View Graph
{depsLoading ? (
Loading dependencies...
) : depsError ? (
{depsError}
) : dependencies.length === 0 ? (
No dependencies
) : (
{dependencies.length} {dependencies.length === 1 ? 'dependency' : 'dependencies'}:
{dependencies.map((dep) => (
setShowDepsModal(false)}
>
{dep.project}/{dep.package}
@ {dep.version}
✓
))}
)}
)}
{/* Artifact ID Modal */}
{showArtifactIdModal && viewArtifactId && (
setShowArtifactIdModal(false)}>
e.stopPropagation()}>
Artifact ID
setShowArtifactIdModal(false)}
title="Close"
>
SHA256 hash identifying this artifact:
{viewArtifactId}
)}
{/* Action Menu Dropdown */}
{renderActionMenu()}
);
}
export default PackagePage;