Files
HostKeeper/app/backend/internal/handler/sftp.go
T
swanadiva 8357d9d76e fix: UI overhaul — align all HTMX views with Lumina Design System (46 fixes)
- All 7 pages rewritten: Dashboard, Terminal, Snippets, Keychain, SFTP, Settings, Brief
- Apply consistent Lumina glassmorphic theme (rounded-2xl, shadows, borders, tracking)
- Fix SVG icons not rendering — return template.HTML instead of string
- Fix Alpine x-data scoping: terminal tabs, SFTP modals, snippet tag buttons
- Fix dashboard search sending literal ?q=...
- Rebuild CSS with all new Tailwind classes (62KB)
- Add .air.toml with hot-reload config, docs/PERBAIKANUI.md checklist
- Remove unused backup partials
2026-07-07 14:55:42 +07:00

83 lines
2.0 KiB
Go

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()
data := fiber.Map{
"View": "sftp",
"Title": "SFTP",
"LocalFiles": local,
"RemoteFiles": remote,
"LocalBreadcrumb": fileStore.LocalBreadcrumb,
"RemoteBreadcrumb": fileStore.RemoteBreadcrumb,
"NavItems": navItems,
}
if c.Get("HX-Request") != "" {
return c.Render("sftp_content", data)
}
return c.Render("sftp", data)
}
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,
})
}