mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-06 11:31:54 +08:00
feat: Directory page UI improvements
These changes are needed to prepare for the Directory page UI improvements implemented in https://github.com/ipfs/dir-index-html/issues/37. - update dir-index-html type structs - emit gateway URL for root links - emit CID of each directoryItem - emit size of directory - emit breadcrumbs
This commit is contained in:

committed by
Adin Schmahmann

parent
2e7343ca0b
commit
044790a838
@ -328,8 +328,20 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
|
||||
size = humanize.Bytes(uint64(s))
|
||||
}
|
||||
|
||||
hash := ""
|
||||
if r, err := i.api.ResolvePath(r.Context(), ipath.Join(resolvedPath, dirit.Name())); err == nil {
|
||||
// Path may not be resolved. Continue anyways.
|
||||
hash = r.Cid().String()
|
||||
}
|
||||
|
||||
// See comment above where originalUrlPath is declared.
|
||||
di := directoryItem{size, dirit.Name(), gopath.Join(originalUrlPath, dirit.Name())}
|
||||
di := directoryItem{
|
||||
Size: size,
|
||||
Name: dirit.Name(),
|
||||
Path: gopath.Join(originalUrlPath, dirit.Name()),
|
||||
Hash: hash,
|
||||
ShortHash: shortHash(hash),
|
||||
}
|
||||
dirListing = append(dirListing, di)
|
||||
}
|
||||
if dirit.Err() != nil {
|
||||
@ -359,14 +371,34 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
|
||||
}
|
||||
}
|
||||
|
||||
size := "?"
|
||||
if s, err := dir.Size(); err == nil {
|
||||
// Size may not be defined/supported. Continue anyways.
|
||||
size = humanize.Bytes(uint64(s))
|
||||
}
|
||||
|
||||
hash := resolvedPath.Cid().String()
|
||||
|
||||
// Storage for gateway URL to be used when linking to other rootIDs. This
|
||||
// will be blank unless subdomain resolution is being used for this request.
|
||||
var gwURL string
|
||||
|
||||
// Get gateway hostname and build gateway URL.
|
||||
if h, ok := r.Context().Value("gw-hostname").(string); ok {
|
||||
gwURL = "//" + h
|
||||
} else {
|
||||
gwURL = ""
|
||||
}
|
||||
|
||||
// See comment above where originalUrlPath is declared.
|
||||
tplData := listingTemplateData{
|
||||
Listing: dirListing,
|
||||
Path: urlPath,
|
||||
BackLink: backLink,
|
||||
Hash: hash,
|
||||
GatewayURL: gwURL,
|
||||
Listing: dirListing,
|
||||
Size: size,
|
||||
Path: urlPath,
|
||||
Breadcrumbs: breadcrumbs(urlPath),
|
||||
BackLink: backLink,
|
||||
Hash: hash,
|
||||
}
|
||||
|
||||
err = listingTemplate.Execute(w, tplData)
|
||||
|
@ -7,22 +7,61 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/ipfs/go-ipfs/assets"
|
||||
ipfspath "github.com/ipfs/go-path"
|
||||
)
|
||||
|
||||
// structs for directory listing
|
||||
type listingTemplateData struct {
|
||||
Listing []directoryItem
|
||||
Path string
|
||||
BackLink string
|
||||
Hash string
|
||||
GatewayURL string
|
||||
Listing []directoryItem
|
||||
Size string
|
||||
Path string
|
||||
Breadcrumbs []breadcrumb
|
||||
BackLink string
|
||||
Hash string
|
||||
}
|
||||
|
||||
type directoryItem struct {
|
||||
Size string
|
||||
Size string
|
||||
Name string
|
||||
Path string
|
||||
Hash string
|
||||
ShortHash string
|
||||
}
|
||||
|
||||
type breadcrumb struct {
|
||||
Name string
|
||||
Path string
|
||||
}
|
||||
|
||||
func breadcrumbs(urlPath string) []breadcrumb {
|
||||
var ret []breadcrumb
|
||||
|
||||
p, err := ipfspath.ParsePath(urlPath)
|
||||
if err != nil {
|
||||
// No breadcrumbs, fallback to bare Path in template
|
||||
return ret
|
||||
}
|
||||
|
||||
segs := p.Segments()
|
||||
for i, seg := range segs {
|
||||
if i == 0 {
|
||||
ret = append(ret, breadcrumb{Name: seg})
|
||||
} else {
|
||||
ret = append(ret, breadcrumb{
|
||||
Name: seg,
|
||||
Path: "/" + strings.Join(segs[0:i+1], "/"),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func shortHash(hash string) string {
|
||||
return (hash[0:4] + "\u2026" + hash[len(hash)-4:])
|
||||
}
|
||||
|
||||
var listingTemplate *template.Template
|
||||
|
||||
func init() {
|
||||
|
@ -143,6 +143,10 @@ func HostnameOption() ServeOption {
|
||||
if gw, hostname, ns, rootID, ok := knownSubdomainDetails(host, knownGateways); ok {
|
||||
// Looks like we're using a known gateway in subdomain mode.
|
||||
|
||||
// Add gateway hostname context for linking to other root ids.
|
||||
// Example: localhost/ipfs/{cid}
|
||||
ctx := context.WithValue(r.Context(), "gw-hostname", hostname)
|
||||
|
||||
// Assemble original path prefix.
|
||||
pathPrefix := "/" + ns + "/" + rootID
|
||||
|
||||
@ -197,7 +201,7 @@ func HostnameOption() ServeOption {
|
||||
r.URL.Path = pathPrefix + r.URL.Path
|
||||
|
||||
// Serve path request
|
||||
childMux.ServeHTTP(w, r)
|
||||
childMux.ServeHTTP(w, r.WithContext(ctx))
|
||||
return
|
||||
}
|
||||
// We don't have a known gateway. Fallback on DNSLink lookup
|
||||
|
Reference in New Issue
Block a user