feat: Sprint 4 — SFTP dual-pane with per-type icons, breadcrumb, drop-zone, create/delete, toast

This commit is contained in:
swanadiva
2026-07-07 13:35:01 +07:00
parent c5ac07e27f
commit 941a67b6ea
8 changed files with 364 additions and 10 deletions
+78
View File
@@ -0,0 +1,78 @@
package handler
import (
"github.com/gofiber/fiber/v2"
"git.tukangketik.id/swanadiva/hostkeeper/v2/internal/model"
)
var fileStore = model.NewFileStore()
func SFTP(c *fiber.Ctx) error {
local, remote := fileStore.All()
return c.Render("sftp", fiber.Map{
"View": "sftp",
"Title": "SFTP",
"LocalFiles": local,
"RemoteFiles": remote,
"LocalBreadcrumb": fileStore.LocalBreadcrumb,
"RemoteBreadcrumb": fileStore.RemoteBreadcrumb,
"NavItems": navItems,
})
}
func SFTPPane(c *fiber.Ctx) error {
pane := c.Query("pane", "local")
dir := c.Query("dir", "/")
local, remote := fileStore.All()
files := local
breadcrumb := fileStore.LocalBreadcrumb
if pane == "remote" {
files = remote
breadcrumb = fileStore.RemoteBreadcrumb
}
return c.Render("sftp_pane", fiber.Map{
"Pane": pane,
"Files": files,
"Breadcrumb": breadcrumb,
"CurrentDir": dir,
})
}
func CreateFolder(c *fiber.Ctx) error {
pane := c.FormValue("pane", "local")
name := c.FormValue("name")
if name != "" {
item := model.FileItem{
Name: name, Size: "—", Modified: "Just now",
Type: "folder", Permissions: "drwxr-xr-x",
}
if pane == "remote" {
fileStore.Remote = append([]model.FileItem{item}, fileStore.Remote...)
} else {
fileStore.Local = append([]model.FileItem{item}, fileStore.Local...)
}
}
files := fileStore.Local
if pane == "remote" { files = fileStore.Remote }
return c.Render("sftp_pane", fiber.Map{
"Pane": pane, "Files": files,
"Breadcrumb": fileStore.LocalBreadcrumb,
})
}
func DeleteFile(c *fiber.Ctx) error {
pane := c.Query("pane", "local")
name := c.Query("name")
files := &fileStore.Local
if pane == "remote" { files = &fileStore.Remote }
for i, f := range *files {
if f.Name == name {
*files = append((*files)[:i], (*files)[i+1:]...)
break
}
}
return c.Render("sftp_pane", fiber.Map{
"Pane": pane, "Files": *files,
"Breadcrumb": fileStore.LocalBreadcrumb,
})
}