From c52edb75df851c5d5a51f9e83f69d86350743b97 Mon Sep 17 00:00:00 2001 From: StarFleetCPTN Date: Fri, 28 Mar 2025 08:24:09 -0700 Subject: [PATCH] feat: Implement file metadata management components - Added new types for file metadata filtering and data structures. - Created templates for displaying file metadata details, lists, and search functionalities. - Implemented JavaScript utilities for handling modals and notifications related to file metadata actions. - Enhanced the user interface with Tailwind CSS for better styling and responsiveness. - Introduced pagination and search capabilities for file metadata management. --- .../details/file_metadata_details.templ | 174 ++++++++++ .../details/file_metadata_details_templ.go | 256 ++++++++++++++ .../dialog/file_metadata_dialog.templ | 72 ++++ .../dialog/file_metadata_dialog_templ.go | 322 ++++++++++++++++++ .../list/file_metadata_list.templ | 72 ++++ .../list/file_metadata_list_partial.templ | 137 ++++++++ .../list/file_metadata_list_partial_templ.go | 315 +++++++++++++++++ .../list/file_metadata_list_templ.go | 122 +++++++ .../search/file_metadata_search.templ | 79 +++++ .../search/file_metadata_search_content.templ | 87 +++++ .../file_metadata_search_content_templ.go | 183 ++++++++++ .../search/file_metadata_search_templ.go | 103 ++++++ components/file_metadata/types.go | 39 +++ .../utils/file_metadata_js.templ | 91 +++++ .../utils/file_metadata_js_templ.go | 41 +++ .../utils/file_metadata_utils.go | 34 ++ 16 files changed, 2127 insertions(+) create mode 100644 components/file_metadata/details/file_metadata_details.templ create mode 100644 components/file_metadata/details/file_metadata_details_templ.go create mode 100644 components/file_metadata/dialog/file_metadata_dialog.templ create mode 100644 components/file_metadata/dialog/file_metadata_dialog_templ.go create mode 100644 components/file_metadata/list/file_metadata_list.templ create mode 100644 components/file_metadata/list/file_metadata_list_partial.templ create mode 100644 components/file_metadata/list/file_metadata_list_partial_templ.go create mode 100644 components/file_metadata/list/file_metadata_list_templ.go create mode 100644 components/file_metadata/search/file_metadata_search.templ create mode 100644 components/file_metadata/search/file_metadata_search_content.templ create mode 100644 components/file_metadata/search/file_metadata_search_content_templ.go create mode 100644 components/file_metadata/search/file_metadata_search_templ.go create mode 100644 components/file_metadata/types.go create mode 100644 components/file_metadata/utils/file_metadata_js.templ create mode 100644 components/file_metadata/utils/file_metadata_js_templ.go create mode 100644 components/file_metadata/utils/file_metadata_utils.go diff --git a/components/file_metadata/details/file_metadata_details.templ b/components/file_metadata/details/file_metadata_details.templ new file mode 100644 index 0000000..6a05496 --- /dev/null +++ b/components/file_metadata/details/file_metadata_details.templ @@ -0,0 +1,174 @@ +package details + +import ( + "context" + "fmt" + "strconv" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" + "github.com/starfleetcptn/gomft/components/layout" +) + +// FileMetadataDetails renders the details view for a file metadata +templ FileMetadataDetails(ctx context.Context, data file_metadata.FileMetadataDetailsData) { + @layout.LayoutWithContext("File Details", ctx) { + +
+ + @utils.fileMetadataJS() + +
+
+
+

+ + File Details +

+ +
+ +
+ +
+
+ File Information +
+

+ ID: { strconv.FormatInt(int64(data.File.ID), 10) } +

+
+ + +
+
+ +
+
File Information
+
+
+
Filename
+
{ data.File.FileName }
+
+
+
Size
+
{ strconv.FormatInt(data.File.FileSize, 10) } bytes
+
+
+
Hash
+
{ data.File.FileHash }
+
+
+
Status
+
+ + { data.File.Status } + +
+
+
+
+ + +
+
Processing Information
+
+
+
Original Path
+
{ data.File.OriginalPath }
+
+
+
Destination Path
+
{ data.File.DestinationPath }
+
+
+
Processed At
+
{ data.File.ProcessedTime.Format("2006-01-02 15:04:05") }
+
+ if data.File.Status == "error" && data.File.ErrorMessage != "" { +
+
Error
+
{ data.File.ErrorMessage }
+
+ } +
+
+
+ + +
+ +
+
+
+
+ + + + + +
+ } +} + +// getStatusClass returns the appropriate Tailwind CSS class for the given status +func getStatusClass(status string) string { + switch status { + case "processed": + return "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300" + case "archived": + return "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300" + case "deleted": + return "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300" + case "archived_and_deleted": + return "bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300" + case "error": + return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300" + default: + return "bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300" + } +} \ No newline at end of file diff --git a/components/file_metadata/details/file_metadata_details_templ.go b/components/file_metadata/details/file_metadata_details_templ.go new file mode 100644 index 0000000..4bcb60d --- /dev/null +++ b/components/file_metadata/details/file_metadata_details_templ.go @@ -0,0 +1,256 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package details + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "context" + "fmt" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" + "github.com/starfleetcptn/gomft/components/layout" + "strconv" +) + +// FileMetadataDetails renders the details view for a file metadata +func FileMetadataDetails(ctx context.Context, data file_metadata.FileMetadataDetailsData) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = utils.fileMetadataJS().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "

File Details

File Information

ID: ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(int64(data.File.ID), 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 41, Col: 55} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "

File Information
Filename
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.FileName) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 54, Col: 85} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
Size
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var5 string + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(data.File.FileSize, 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 58, Col: 108} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, " bytes
Hash
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.FileHash) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 62, Col: 85} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
Status
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 = []any{fmt.Sprintf("px-2 py-1 text-xs font-medium rounded-full %s", getStatusClass(data.File.Status))} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var7...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var9 string + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.Status) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 68, Col: 30} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "
Processing Information
Original Path
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var10 string + templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.OriginalPath) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 81, Col: 89} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "
Destination Path
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.DestinationPath) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 85, Col: 92} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, "
Processed At
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.ProcessedTime.Format("2006-01-02 15:04:05")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 89, Col: 120} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if data.File.Status == "error" && data.File.ErrorMessage != "" { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "
Error
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var13 string + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(data.File.ErrorMessage) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/details/file_metadata_details.templ`, Line: 94, Col: 91} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "

Delete File

Are you sure you want to delete this file? This action cannot be undone.

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) + templ_7745c5c3_Err = layout.LayoutWithContext("File Details", ctx).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +// getStatusClass returns the appropriate Tailwind CSS class for the given status +func getStatusClass(status string) string { + switch status { + case "processed": + return "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300" + case "archived": + return "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300" + case "deleted": + return "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300" + case "archived_and_deleted": + return "bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300" + case "error": + return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300" + default: + return "bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300" + } +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/dialog/file_metadata_dialog.templ b/components/file_metadata/dialog/file_metadata_dialog.templ new file mode 100644 index 0000000..fe85944 --- /dev/null +++ b/components/file_metadata/dialog/file_metadata_dialog.templ @@ -0,0 +1,72 @@ +package dialog + +import ( + "fmt" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" +) + +// FileMetadataDialog renders a confirmation dialog for file metadata actions +templ FileMetadataDialog(id string, title string, message string, confirmClass string, confirmText string, action string, fileID uint, fileName string, section string) { + @utils.fileMetadataJS() + +} + +script triggerFileDelete(dialogId string, fileID uint, fileName string) { + // Hide the dialog + document.getElementById(dialogId).classList.add("hidden"); + document.getElementById(dialogId).classList.remove("flex"); + + // Store data in a way that's accessible to event handlers + window.lastDeletedFile = { + id: fileID, + name: fileName + }; + + // Add custom marker to track this deletion + window.currentlyDeletingFile = true; +} \ No newline at end of file diff --git a/components/file_metadata/dialog/file_metadata_dialog_templ.go b/components/file_metadata/dialog/file_metadata_dialog_templ.go new file mode 100644 index 0000000..fadce73 --- /dev/null +++ b/components/file_metadata/dialog/file_metadata_dialog_templ.go @@ -0,0 +1,322 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package dialog + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "fmt" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" +) + +// FileMetadataDialog renders a confirmation dialog for file metadata actions +func FileMetadataDialog(id string, title string, message string, confirmClass string, confirmText string, action string, fileID uint, fileName string, section string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = utils.fileMetadataJS().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if action == "delete" { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } else { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(message) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/dialog/file_metadata_dialog.templ`, Line: 23, Col: 84} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if section == "list" { + templ_7745c5c3_Err = templ.RenderScriptItems(ctx, templ_7745c5c3_Buffer, triggerFileDelete(id, fileID, fileName)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } else { + templ_7745c5c3_Err = templ.RenderScriptItems(ctx, templ_7745c5c3_Buffer, triggerFileDelete(id, fileID, fileName)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templ.RenderScriptItems(ctx, templ_7745c5c3_Buffer, closeModal(id)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func triggerFileDelete(dialogId string, fileID uint, fileName string) templ.ComponentScript { + return templ.ComponentScript{ + Name: `__templ_triggerFileDelete_bdb5`, + Function: `function __templ_triggerFileDelete_bdb5(dialogId, fileID, fileName){// Hide the dialog + document.getElementById(dialogId).classList.add("hidden"); + document.getElementById(dialogId).classList.remove("flex"); + + // Store data in a way that's accessible to event handlers + window.lastDeletedFile = { + id: fileID, + name: fileName + }; + + // Add custom marker to track this deletion + window.currentlyDeletingFile = true; +}`, + Call: templ.SafeScript(`__templ_triggerFileDelete_bdb5`, dialogId, fileID, fileName), + CallInline: templ.SafeScriptInline(`__templ_triggerFileDelete_bdb5`, dialogId, fileID, fileName), + } +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/list/file_metadata_list.templ b/components/file_metadata/list/file_metadata_list.templ new file mode 100644 index 0000000..565686d --- /dev/null +++ b/components/file_metadata/list/file_metadata_list.templ @@ -0,0 +1,72 @@ +package list + +import ( + "context" + "strconv" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" + "github.com/starfleetcptn/gomft/components/layout" +) + +// FileMetadataList renders the list of file metadata +templ FileMetadataList(ctx context.Context, data file_metadata.FileMetadataListData) { + @layout.LayoutWithContext("Files", ctx) { + +
+ + @utils.fileMetadataJS() + +
+
+
+

+ + Files +

+ +
+ +
+ +
+
+ File List +
+

+ Showing { strconv.FormatInt(int64((data.Page - 1) * data.Limit + 1), 10) } to { strconv.FormatInt(int64(min(data.Page * data.Limit, int(data.TotalCount))), 10) } of { strconv.FormatInt(data.TotalCount, 10) } files +

+
+ + +
+ @FileMetadataListPartial(ctx, data) +
+
+
+ + +
+ } +} \ No newline at end of file diff --git a/components/file_metadata/list/file_metadata_list_partial.templ b/components/file_metadata/list/file_metadata_list_partial.templ new file mode 100644 index 0000000..b0910ad --- /dev/null +++ b/components/file_metadata/list/file_metadata_list_partial.templ @@ -0,0 +1,137 @@ +package list + +import ( + "context" + "fmt" + "strconv" + "github.com/starfleetcptn/gomft/components/file_metadata" +) + +// FileMetadataListPartial renders the list of file metadata in a table format +templ FileMetadataListPartial(ctx context.Context, data file_metadata.FileMetadataListData) { + + + + +
+ + + + + + + + + if data.Job != nil { + + } + + + + + for _, file := range data.Files { + + + + + + + if data.Job != nil { + + } + + + } + +
IDFilenameSizeProcessed timeStatusJobActions
+ { strconv.FormatInt(int64(file.ID), 10) } + + + { file.FileName } + + + { strconv.FormatInt(file.FileSize, 10) } bytes + + { file.ProcessedTime.Format("2006-01-02 15:04:05") } + + + { file.Status } + + + + { data.Job.Name } + + +
+ + + + +
+
+
+ + + if data.TotalPages > 1 { +
+
+ + Showing { strconv.FormatInt(int64((data.Page - 1) * data.Limit + 1), 10) } to { strconv.FormatInt(int64(min(data.Page * data.Limit, int(data.TotalCount))), 10) } of { strconv.FormatInt(data.TotalCount, 10) } files + +
+
+ if data.Page > 1 { + + Previous + + } + if data.Page < data.TotalPages { + + Next + + } +
+
+ } +} + +// getStatusClass returns the appropriate Tailwind CSS class for the given status +func getStatusClass(status string) string { + switch status { + case "processed": + return "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300" + case "archived": + return "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300" + case "deleted": + return "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300" + case "archived_and_deleted": + return "bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300" + case "error": + return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300" + default: + return "bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300" + } +} \ No newline at end of file diff --git a/components/file_metadata/list/file_metadata_list_partial_templ.go b/components/file_metadata/list/file_metadata_list_partial_templ.go new file mode 100644 index 0000000..9d89f0a --- /dev/null +++ b/components/file_metadata/list/file_metadata_list_partial_templ.go @@ -0,0 +1,315 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package list + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "context" + "fmt" + "github.com/starfleetcptn/gomft/components/file_metadata" + "strconv" +) + +// FileMetadataListPartial renders the list of file metadata in a table format +func FileMetadataListPartial(ctx context.Context, data file_metadata.FileMetadataListData) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

Delete File

Are you sure you want to delete this file? This action cannot be undone.

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if data.Job != nil { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, file := range data.Files { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if data.Job != nil { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, "
IDFilenameSizeProcessed timeStatusJobActions
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var2 string + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(int64(file.ID), 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 56, Col: 46} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(file.FileName) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 60, Col: 23} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var5 string + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(file.FileSize, 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 64, Col: 45} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, " bytes") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var6 string + templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(file.ProcessedTime.Format("2006-01-02 15:04:05")) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 67, Col: 57} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var7 = []any{fmt.Sprintf("px-2 py-1 text-xs font-medium rounded-full %s", getStatusClass(file.Status))} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var7...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 10, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var9 string + templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(file.Status) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 71, Col: 21} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(data.Job.Name) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 77, Col: 24} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if data.TotalPages > 1 { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "
Showing ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var14 string + templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(int64((data.Page-1)*data.Limit+1), 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 102, Col: 77} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 21, " to ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var15 string + templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(int64(min(data.Page*data.Limit, int(data.TotalCount))), 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 102, Col: 164} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 22, " of ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var16 string + templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(data.TotalCount, 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list_partial.templ`, Line: 102, Col: 210} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 23, " files
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if data.Page > 1 { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 24, "Previous ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + if data.Page < data.TotalPages { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 26, "Next") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 28, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + return nil + }) +} + +// getStatusClass returns the appropriate Tailwind CSS class for the given status +func getStatusClass(status string) string { + switch status { + case "processed": + return "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300" + case "archived": + return "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300" + case "deleted": + return "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300" + case "archived_and_deleted": + return "bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300" + case "error": + return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300" + default: + return "bg-gray-100 text-gray-800 dark:bg-gray-900 dark:text-gray-300" + } +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/list/file_metadata_list_templ.go b/components/file_metadata/list/file_metadata_list_templ.go new file mode 100644 index 0000000..36e4dc1 --- /dev/null +++ b/components/file_metadata/list/file_metadata_list_templ.go @@ -0,0 +1,122 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package list + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "context" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" + "github.com/starfleetcptn/gomft/components/layout" + "strconv" +) + +// FileMetadataList renders the list of file metadata +func FileMetadataList(ctx context.Context, data file_metadata.FileMetadataListData) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = utils.fileMetadataJS().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
File List

Showing ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(int64((data.Page-1)*data.Limit+1), 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list.templ`, Line: 40, Col: 79} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, " to ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var4 string + templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(int64(min(data.Page*data.Limit, int(data.TotalCount))), 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list.templ`, Line: 40, Col: 166} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, " of ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var5 string + templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(data.TotalCount, 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/list/file_metadata_list.templ`, Line: 40, Col: 212} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, " files

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = FileMetadataListPartial(ctx, data).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) + templ_7745c5c3_Err = layout.LayoutWithContext("Files", ctx).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/search/file_metadata_search.templ b/components/file_metadata/search/file_metadata_search.templ new file mode 100644 index 0000000..fe8c998 --- /dev/null +++ b/components/file_metadata/search/file_metadata_search.templ @@ -0,0 +1,79 @@ +package search + +import ( + "context" + "strconv" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/list" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" + "github.com/starfleetcptn/gomft/components/layout" +) + +// FileMetadataSearch renders the search interface for file metadata +templ FileMetadataSearch(ctx context.Context, data file_metadata.FileMetadataSearchData) { + @layout.LayoutWithContext("Search Files", ctx) { + +
+ + @utils.fileMetadataJS() + +
+
+
+

+ + Search Files +

+ +
+ +
+ +
+
+ Search Results +
+

+ Found { strconv.FormatInt(data.TotalCount, 10) } files matching your criteria +

+
+ + +
+ @list.FileMetadataListPartial(ctx, file_metadata.FileMetadataListData{ + Files: data.Files, + Page: data.Page, + Limit: data.Limit, + TotalCount: data.TotalCount, + TotalPages: data.TotalPages, + }) +
+
+
+ + +
+ } +} \ No newline at end of file diff --git a/components/file_metadata/search/file_metadata_search_content.templ b/components/file_metadata/search/file_metadata_search_content.templ new file mode 100644 index 0000000..9e0e8c4 --- /dev/null +++ b/components/file_metadata/search/file_metadata_search_content.templ @@ -0,0 +1,87 @@ +package search + +import ( + "context" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/list" +) + +// FileMetadataSearchContent renders the search form and results +templ FileMetadataSearchContent(ctx context.Context, data file_metadata.FileMetadataSearchData) { + +
+
Search Files
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+
+ + +
+ if len(data.Files) > 0 { + @list.FileMetadataListPartial(ctx, file_metadata.FileMetadataListData{ + Files: data.Files, + Page: data.Page, + Limit: data.Limit, + TotalCount: data.TotalCount, + TotalPages: data.TotalPages, + }) + } else { +
+ + + +

No files found matching your search criteria.

+
+ } +
+} \ No newline at end of file diff --git a/components/file_metadata/search/file_metadata_search_content_templ.go b/components/file_metadata/search/file_metadata_search_content_templ.go new file mode 100644 index 0000000..20245d2 --- /dev/null +++ b/components/file_metadata/search/file_metadata_search_content_templ.go @@ -0,0 +1,183 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package search + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "context" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/list" +) + +// FileMetadataSearchContent renders the search form and results +func FileMetadataSearchContent(ctx context.Context, data file_metadata.FileMetadataSearchData) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
Search Files
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + if len(data.Files) > 0 { + templ_7745c5c3_Err = list.FileMetadataListPartial(ctx, file_metadata.FileMetadataListData{ + Files: data.Files, + Page: data.Page, + Limit: data.Limit, + TotalCount: data.TotalCount, + TotalPages: data.TotalPages, + }).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } else { + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, "

No files found matching your search criteria.

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 18, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/search/file_metadata_search_templ.go b/components/file_metadata/search/file_metadata_search_templ.go new file mode 100644 index 0000000..0dfcc7d --- /dev/null +++ b/components/file_metadata/search/file_metadata_search_templ.go @@ -0,0 +1,103 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package search + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "context" + "github.com/starfleetcptn/gomft/components/file_metadata" + "github.com/starfleetcptn/gomft/components/file_metadata/list" + "github.com/starfleetcptn/gomft/components/file_metadata/utils" + "github.com/starfleetcptn/gomft/components/layout" + "strconv" +) + +// FileMetadataSearch renders the search interface for file metadata +func FileMetadataSearch(ctx context.Context, data file_metadata.FileMetadataSearchData) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = utils.fileMetadataJS().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "

Search Files

Search Results

Found ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(strconv.FormatInt(data.TotalCount, 10)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `components/file_metadata/search/file_metadata_search.templ`, Line: 41, Col: 53} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, " files matching your criteria

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = list.FileMetadataListPartial(ctx, file_metadata.FileMetadataListData{ + Files: data.Files, + Page: data.Page, + Limit: data.Limit, + TotalCount: data.TotalCount, + TotalPages: data.TotalPages, + }).Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) + templ_7745c5c3_Err = layout.LayoutWithContext("Search Files", ctx).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/types.go b/components/file_metadata/types.go new file mode 100644 index 0000000..a7e70d1 --- /dev/null +++ b/components/file_metadata/types.go @@ -0,0 +1,39 @@ +package file_metadata + +import "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 +} diff --git a/components/file_metadata/utils/file_metadata_js.templ b/components/file_metadata/utils/file_metadata_js.templ new file mode 100644 index 0000000..e10fec1 --- /dev/null +++ b/components/file_metadata/utils/file_metadata_js.templ @@ -0,0 +1,91 @@ +package utils + +// fileMetadataJS provides common JavaScript functions for file metadata components +templ fileMetadataJS() { + +} \ No newline at end of file diff --git a/components/file_metadata/utils/file_metadata_js_templ.go b/components/file_metadata/utils/file_metadata_js_templ.go new file mode 100644 index 0000000..c4b23d7 --- /dev/null +++ b/components/file_metadata/utils/file_metadata_js_templ.go @@ -0,0 +1,41 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.833 +package utils + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +// fileMetadataJS provides common JavaScript functions for file metadata components +func fileMetadataJS() templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/components/file_metadata/utils/file_metadata_utils.go b/components/file_metadata/utils/file_metadata_utils.go new file mode 100644 index 0000000..68d285e --- /dev/null +++ b/components/file_metadata/utils/file_metadata_utils.go @@ -0,0 +1,34 @@ +package utils + +import "fmt" + +// GetStatusBadgeClass returns the appropriate CSS class for a file status badge +func GetStatusBadgeClass(status string) string { + switch status { + case "processed": + return "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300" + case "archived": + return "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300" + case "deleted": + return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300" + case "archived_and_deleted": + return "bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300" + case "error": + return "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300" + default: + return "bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300" + } +} + +// 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)) + } +}