diff options
-rw-r--r-- | pkg/service/filesystem.go | 15 | ||||
-rw-r--r-- | pkg/view/filesystem.go | 17 | ||||
-rw-r--r-- | static.go | 24 | ||||
-rw-r--r-- | templates/base.qtpl | 6 | ||||
-rw-r--r-- | templates/fs.html | 29 | ||||
-rw-r--r-- | templates/fs.qtpl | 41 | ||||
-rw-r--r-- | templates/layout.html | 29 |
7 files changed, 65 insertions, 96 deletions
diff --git a/pkg/service/filesystem.go b/pkg/service/filesystem.go index 2e4b510..b4479ea 100644 --- a/pkg/service/filesystem.go +++ b/pkg/service/filesystem.go @@ -6,6 +6,7 @@ import ( "net/url" "path" "strings" + "syscall" "git.sr.ht/~gabrielgio/img/pkg/database/repository" "git.sr.ht/~gabrielgio/img/pkg/list" @@ -33,6 +34,20 @@ type ( } ) +func (f *FileParam) GetUid() int { + if stat, ok := f.Info.Sys().(*syscall.Stat_t); ok { + return int(stat.Uid) + } + return 0 +} + +func (f *FileParam) GetGid() int { + if stat, ok := f.Info.Sys().(*syscall.Stat_t); ok { + return int(stat.Gid) + } + return 0 +} + func NewFileSystemController( fsRepository repository.FileSystemRepository, userRepository repository.UserRepository, diff --git a/pkg/view/filesystem.go b/pkg/view/filesystem.go index 7fd7331..6a01117 100644 --- a/pkg/view/filesystem.go +++ b/pkg/view/filesystem.go @@ -3,10 +3,10 @@ package view import ( "github.com/valyala/fasthttp" - "git.sr.ht/~gabrielgio/img" "git.sr.ht/~gabrielgio/img/pkg/database/repository" "git.sr.ht/~gabrielgio/img/pkg/ext" "git.sr.ht/~gabrielgio/img/pkg/service" + "git.sr.ht/~gabrielgio/img/templates" ) type ( @@ -45,17 +45,12 @@ func (self *FileSystemView) Index(ctx *fasthttp.RequestCtx) error { return err } - err = img.Render(ctx, "fs.html", &img.HTMLView[*FilePage]{ - Title: pathValue, - Data: &FilePage{ - Page: page, - ShowMode: settings.ShowMode, - ShowOwner: settings.ShowOwner, - }, + templates.WritePageTemplate(ctx, &templates.FilePage{ + Page: page, + ShowMode: settings.ShowMode, + ShowOwner: settings.ShowOwner, }) - if err != nil { - return err - } + return nil } @@ -2,33 +2,9 @@ package img import ( "embed" - "fmt" - "html/template" - "io" ) var ( - //go:embed templates/*.html - TemplateFS embed.FS - //go:embed static/* StaticFS embed.FS - - Template *template.Template ) - -type HTMLView[T any] struct { - Title string - Username string - Data T -} - -func Render[T any](w io.Writer, page string, view *HTMLView[T]) error { - pageFile := fmt.Sprintf("templates/%s", page) - tmpl, err := template.New("").ParseFS(TemplateFS, "templates/layout.html", pageFile) - if err != nil { - return err - } - - return tmpl.ExecuteTemplate(w, page, view) -} diff --git a/templates/base.qtpl b/templates/base.qtpl index cbde355..0c05782 100644 --- a/templates/base.qtpl +++ b/templates/base.qtpl @@ -22,13 +22,13 @@ Page prints a page implementing Page interface. <body> <nav class="navbar"> <div class="navbar-start"> - <a href="/fs" class="navbar-item"> + <a href="/fs/" class="navbar-item"> files </a> - <a href="/media" class="navbar-item"> + <a href="/media/" class="navbar-item"> media </a> - <a href="/settings" class="navbar-item"> + <a href="/settings/" class="navbar-item"> settings </a> </div> diff --git a/templates/fs.html b/templates/fs.html deleted file mode 100644 index a44d78f..0000000 --- a/templates/fs.html +++ /dev/null @@ -1,29 +0,0 @@ -{{template "layout.html" .}} -{{define "title"}} {{.Title}} {{end}} -{{define "content"}} -<div class="panel"> - <div class="panel-block"> - <div class="columns file-row is-gapless is-mobile"> - <div id="path" class="container-fluid"> - <small>{{range .Data.Page.History}}<a href="/fs?path={{.UrlEncodedPath}}" >{{.Name}}/</a>{{end}}</small> - </div> - </div> - </div> - {{range .Data.Page.Files}} - <div class="panel-block"> - <div class="columns wide-column is-mono is-gapless is-mobile"> - <div class="column"> - {{if $.Data.ShowMode}}{{.Info.Mode}} {{end}} - {{if $.Data.ShowOwner}}{{.Info.Sys.Gid}}:{{.Info.Sys.Uid}} {{end}} - {{if .Info.IsDir}} - <a href="/?path={{.UrlEncodedPath}}">{{.Info.Name}}/</a> - {{else}} - {{.Info.Name}} - {{end}} - </div> - <div class="column has-text-right">{{.Info.Size}} B</div> - </div> - </div> - {{end}} -</div> -{{end}} diff --git a/templates/fs.qtpl b/templates/fs.qtpl new file mode 100644 index 0000000..489f79f --- /dev/null +++ b/templates/fs.qtpl @@ -0,0 +1,41 @@ +{% import "git.sr.ht/~gabrielgio/img/pkg/service" %} + +{% code +type FilePage struct { + Page *service.Page + ShowMode bool + ShowOwner bool + }%} + +{% func (p *FilePage) Title() %}Files{% endfunc %} + +{% func (p *FilePage) Content() %} +<div class="panel"> + <div class="panel-block"> + <div class="columns file-row is-gapless is-mobile"> + <div id="path" class="container-fluid"> + <small>{% for _, h := range p.Page.History %}<a href="/fs?path={%s h.UrlEncodedPath %}" >{%s h.Name %}/</a>{% endfor %}</small> + </div> + </div> + </div> + {% for _, f := range p.Page.Files %} + <div class="panel-block"> + <div class="columns wide-column is-mono is-gapless is-mobile"> + <div class="column"> + {% if p.ShowMode %}{%s f.Info.Mode().String() %} {% endif %} + {% if p.ShowOwner %}{%d f.GetGid() %}:{%d f.GetUid() %} {% endif %} + {% if f.Info.IsDir() %} + <a href="/?path={%s f.UrlEncodedPath %}">{%s f.Info.Name() %}/</a> + {% else %} + {%s f.Info.Name() %} + {% endif %} + </div> + <div class="column has-text-right">{%dl f.Info.Size() %} B</div> + </div> + </div> + {% endfor %} +</div> +{% endfunc %} + +{% func (p *FilePage) Script() %} +{% endfunc %} diff --git a/templates/layout.html b/templates/layout.html deleted file mode 100644 index bbf1558..0000000 --- a/templates/layout.html +++ /dev/null @@ -1,29 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>img | {{block "title" .}} noop {{end}}</title> - <link rel="stylesheet" href="/static/main.css"> - <link rel="icon" href="/static/square.svg" sizes="any" type="image/svg+xml"> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - </head> - <body> - <nav class="navbar"> - <div class="navbar-start"> - <a href="/fs" class="navbar-item"> - files - </a> - <a href="/media" class="navbar-item"> - media - </a> - <a href="/settings" class="navbar-item"> - settings - </a> - </div> - </nav> - <div class="container"> - {{block "content" .}}noop{{end}} - </div> - </body> - {{block "script" .}}{{end}} -</html> |