package components import ( "context" "strconv" "fmt" "github.com/starfleetcptn/gomft/internal/db" ) // FileMetadataFilter represents filter parameters for file metadata queries type FileMetadataFilter struct { Status string JobID string FileName string Hash string StartDate string EndDate string } // FileMetadataListData contains data for the file metadata list template type FileMetadataListData struct { Files []db.FileMetadata TotalCount int64 Page int Limit int TotalPages int Job *db.Job // Optional: if viewing files for a specific job Filter FileMetadataFilter } // FileMetadataDetailsData contains data for the file metadata details template type FileMetadataDetailsData struct { File db.FileMetadata } // FileMetadataSearchData contains data for the file metadata search template type FileMetadataSearchData struct { Files []db.FileMetadata TotalCount int64 Page int Limit int TotalPages int Filter FileMetadataFilter } // getStatusBadgeClass returns the appropriate CSS class for a file status badge func getStatusBadgeClass(status string) string { switch status { case "processed": return "badge-success" case "archived": return "badge-info" case "deleted": return "badge-warning" case "archived_and_deleted": return "badge-warning" case "error": return "badge-danger" default: return "badge-secondary" } } // formatFileSize formats a file size in bytes to a human-readable string func formatFileSize(size int64) string { if size < 1024 { return fmt.Sprintf("%d B", size) } else if size < 1024*1024 { return fmt.Sprintf("%.2f KB", float64(size)/1024) } else if size < 1024*1024*1024 { return fmt.Sprintf("%.2f MB", float64(size)/(1024*1024)) } else { return fmt.Sprintf("%.2f GB", float64(size)/(1024*1024*1024)) } } // FileMetadataList renders a list of file metadata with pagination and filters templ FileMetadataList(ctx context.Context, data FileMetadataListData) { @LayoutWithContext("File Metadata", ctx) {
| ID | Filename | Size | Processed | Status | if data.Job == nil {Job | }Actions |
|---|---|---|---|---|---|---|
| { strconv.FormatUint(uint64(file.ID), 10) } | { file.FileName } | { formatFileSize(file.FileSize) } | { file.ProcessedTime.Format("2006-01-02 15:04:05") } | { file.Status } | if data.Job == nil && file.Job.ID > 0 {{ file.Job.Name } | }
No file metadata found matching your criteria.
| ID | { strconv.FormatUint(uint64(data.File.ID), 10) } |
| Filename | { data.File.FileName } |
| Size | { formatFileSize(data.File.FileSize) } |
| Hash | if data.File.FileHash != "" { { data.File.FileHash } } else { Not available } |
| Status | { data.File.Status } |
| Original Path | { data.File.OriginalPath } |
| Destination Path | { data.File.DestinationPath } |
| Job | { data.File.Job.Name } |
| Processed Time | { data.File.ProcessedTime.Format("2006-01-02 15:04:05") } |
| Creation Time | { data.File.CreationTime.Format("2006-01-02 15:04:05") } |
| Modification Time | { data.File.ModTime.Format("2006-01-02 15:04:05") } |
| Error | { data.File.ErrorMessage } |
| Record Created | { data.File.CreatedAt.Format("2006-01-02 15:04:05") } |
| Record Updated | { data.File.UpdatedAt.Format("2006-01-02 15:04:05") } |
| ID | Filename | Size | Processed | Status | Job | Actions |
|---|---|---|---|---|---|---|
| { strconv.FormatUint(uint64(file.ID), 10) } | { file.FileName } | { formatFileSize(file.FileSize) } | { file.ProcessedTime.Format("2006-01-02 15:04:05") } | { file.Status } | { file.Job.Name } |
No files found matching your search criteria.