docs: Update README with file metadata tracking details

- Add new section describing file metadata tracking features
- Include screenshot for file metadata view
- Expand feature list with comprehensive metadata management capabilities
- Update user guide with instructions for managing file metadata
- Remove Font Awesome icons from status badges in components
- Improve layout and styling for mobile responsiveness
This commit is contained in:
StarFleetCPTN
2025-03-10 12:39:21 -07:00
parent 31410984cb
commit 6d0c215c38
4 changed files with 40 additions and 12 deletions
+22
View File
@@ -19,6 +19,10 @@ GoMFT is a web-based managed file transfer application built with Go, leveraging
![Job Scheduling](screenshots/new.job.gomft.png) ![Job Scheduling](screenshots/new.job.gomft.png)
*Scheduling transfers with flexible cron expressions* *Scheduling transfers with flexible cron expressions*
### File Metadata
![File Metadata](screenshots/file.metadata.gomft.png)
*Track and manage file metadata with detailed information about transferred files*
### User Management ### User Management
![User Management](screenshots/user.management.gomft.png) ![User Management](screenshots/user.management.gomft.png)
*Create user accounts and manage them* *Create user accounts and manage them*
@@ -39,6 +43,16 @@ GoMFT is a web-based managed file transfer application built with Go, leveraging
- And more via rclone - And more via rclone
- **Scheduled Transfers**: Configure transfers using cron expressions with flexible scheduling options - **Scheduled Transfers**: Configure transfers using cron expressions with flexible scheduling options
- **Transfer Monitoring**: Real-time status updates and detailed transfer logs with bytes and files transferred statistics - **Transfer Monitoring**: Real-time status updates and detailed transfer logs with bytes and files transferred statistics
- **File Metadata Tracking**: Complete history and status of all transferred files with detailed information:
- Process status (processed, archived, deleted)
- File size and hash information
- Advanced search and filtering capabilities
- Metadata retention for compliance and auditing
- Detailed file view with processing timestamps and job association
- Powerful filtering by status, filename, job, and date ranges
- Advanced search interface with multiple criteria
- Bulk management and record deletion capabilities
- Responsive design with mobile-friendly interface
- **Web Interface**: User-friendly interface for managing transfers, built with Templ components - **Web Interface**: User-friendly interface for managing transfers, built with Templ components
- **File Pattern Matching**: Support for file patterns to filter files during transfers - **File Pattern Matching**: Support for file patterns to filter files during transfers
- **File Output Patterns**: Dynamic naming of destination files using patterns with date variables - **File Output Patterns**: Dynamic naming of destination files using patterns with date variables
@@ -201,6 +215,14 @@ GoMFT uses a configuration file located at `./data/gomft/config.json`. On first
- Check detailed transfer history with performance metrics - Check detailed transfer history with performance metrics
- View job run details including any error messages - View job run details including any error messages
7. Manage file metadata:
- Navigate to the "Files" section to view all processed files
- Use filters to quickly find files by status, job ID, or filename
- Click on any file to view detailed metadata including timestamps, size, and hash
- Use the advanced search page for complex queries with multiple criteria
- Delete file metadata records when no longer needed
- View files associated with specific jobs by navigating from the job details
### User Management ### User Management
GoMFT uses a role-based access control system: GoMFT uses a role-based access control system:
+3 -3
View File
@@ -50,15 +50,15 @@ templ HistoryContent(ctx context.Context, data HistoryData) {
<p class="text-sm font-medium text-primary-600 dark:text-primary-400 truncate">{ history.Job.Config.Name }</p> <p class="text-sm font-medium text-primary-600 dark:text-primary-400 truncate">{ history.Job.Config.Name }</p>
if history.Status == "completed" { if history.Status == "completed" {
<span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-300"> <span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-300">
<i class="fas fa-check mr-1"></i> Completed Completed
</span> </span>
} else if history.Status == "failed" { } else if history.Status == "failed" {
<span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-300"> <span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-red-100 dark:bg-red-900 text-red-800 dark:text-red-300">
<i class="fas fa-times mr-1"></i> Failed Failed
</span> </span>
} else { } else {
<span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-300"> <span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-300">
<i class="fas fa-sync-alt mr-1"></i> { history.Status } { history.Status }
</span> </span>
} }
</div> </div>
-2
View File
@@ -288,12 +288,10 @@ templ Jobs(ctx context.Context, data JobsData) {
</p> </p>
if job.Enabled { if job.Enabled {
<span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-300"> <span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-300">
<i class="fas fa-check-circle mr-1"></i>
Active Active
</span> </span>
} else { } else {
<span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-secondary-100 dark:bg-secondary-700 text-secondary-800 dark:text-secondary-300"> <span class="ml-2 px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-secondary-100 dark:bg-secondary-700 text-secondary-800 dark:text-secondary-300">
<i class="fas fa-pause-circle mr-1"></i>
Inactive Inactive
</span> </span>
} }
+15 -7
View File
@@ -29,7 +29,7 @@ templ Layout(title string) {
templ LayoutWithContext(title string, ctx context.Context) { templ LayoutWithContext(title string, ctx context.Context) {
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" class="light h-full"> <html lang="en" class="light h-full p-0 m-0">
<head> <head>
<meta charset="UTF-8"/> <meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"/> <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"/>
@@ -128,6 +128,14 @@ templ LayoutWithContext(title string, ctx context.Context) {
} }
</script> </script>
<style type="text/tailwindcss"> <style type="text/tailwindcss">
/* Reset default browser margins and padding */
html, body {
margin: 0;
padding: 0;
overflow-x: hidden; /* Prevent horizontal scrolling */
width: 100%;
}
@layer components { @layer components {
.btn-primary { .btn-primary {
@apply px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-all duration-200 shadow-md hover:shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2; @apply px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-all duration-200 shadow-md hover:shadow-lg focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2;
@@ -277,9 +285,9 @@ templ LayoutWithContext(title string, ctx context.Context) {
</style> </style>
<link rel="stylesheet" href="https://rsms.me/inter/inter.css"> <link rel="stylesheet" href="https://rsms.me/inter/inter.css">
</head> </head>
<body class="min-h-screen flex flex-col bg-secondary-50 dark:bg-secondary-900 h-full"> <body class="min-h-screen flex flex-col bg-secondary-50 dark:bg-secondary-900 h-full p-0 m-0">
if isLoggedIn(ctx) { if isLoggedIn(ctx) {
<nav class="bg-white dark:bg-secondary-800 shadow-sm sticky top-0 z-10"> <nav class="bg-white dark:bg-secondary-800 shadow-sm sticky top-0 z-10 w-full">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16"> <div class="flex justify-between h-16">
<div class="flex"> <div class="flex">
@@ -381,9 +389,9 @@ templ LayoutWithContext(title string, ctx context.Context) {
x-transition:leave="transition ease-in duration-150" x-transition:leave="transition ease-in duration-150"
x-transition:leave-start="opacity-100 transform translate-y-0" x-transition:leave-start="opacity-100 transform translate-y-0"
x-transition:leave-end="opacity-0 transform -translate-y-2" x-transition:leave-end="opacity-0 transform -translate-y-2"
class="sm:hidden bg-white dark:bg-secondary-800 shadow-md" class="sm:hidden bg-white dark:bg-secondary-800 shadow-md w-full left-0 right-0"
> >
<div class="px-2 pt-2 pb-3 space-y-1"> <div class="max-w-7xl mx-auto px-2 pt-2 pb-3 space-y-1">
<a href="/dashboard" class="block px-3 py-2 rounded-md text-base font-medium text-secondary-700 dark:text-secondary-300 hover:bg-primary-50 dark:hover:bg-secondary-700 hover:text-primary-600 dark:hover:text-primary-400"> <a href="/dashboard" class="block px-3 py-2 rounded-md text-base font-medium text-secondary-700 dark:text-secondary-300 hover:bg-primary-50 dark:hover:bg-secondary-700 hover:text-primary-600 dark:hover:text-primary-400">
<i class="fas fa-tachometer-alt mr-2"></i> Dashboard <i class="fas fa-tachometer-alt mr-2"></i> Dashboard
</a> </a>
@@ -434,8 +442,8 @@ templ LayoutWithContext(title string, ctx context.Context) {
if isLoggedIn(ctx) { if isLoggedIn(ctx) {
<!-- Mobile Bottom Navigation --> <!-- Mobile Bottom Navigation -->
<div class="sm:hidden fixed bottom-0 left-0 right-0 bg-white dark:bg-secondary-800 border-t border-secondary-200 dark:border-secondary-700 shadow-lg mobile-nav-container z-10"> <div class="sm:hidden fixed bottom-0 left-0 right-0 bg-white dark:bg-secondary-800 border-t border-secondary-200 dark:border-secondary-700 shadow-lg w-full p-0 m-0">
<div class="grid grid-cols-5 h-16"> <div class="grid grid-cols-6 h-16">
<a href="/dashboard" class="flex flex-col items-center justify-center text-secondary-500 dark:text-secondary-400 hover:text-primary-600 dark:hover:text-primary-400"> <a href="/dashboard" class="flex flex-col items-center justify-center text-secondary-500 dark:text-secondary-400 hover:text-primary-600 dark:hover:text-primary-400">
<i class="fas fa-tachometer-alt text-lg"></i> <i class="fas fa-tachometer-alt text-lg"></i>
<span class="text-xs mt-1">Dashboard</span> <span class="text-xs mt-1">Dashboard</span>