unexport page
parent
4fa7426b99
commit
1ba9608a9c
4
error.go
4
error.go
|
@ -50,8 +50,8 @@ const errTemplate = `<!DOCTYPE html>
|
||||||
</div>
|
</div>
|
||||||
</html>`
|
</html>`
|
||||||
|
|
||||||
// PrintErrorHTML prints the error page
|
// htmlError prints the error page
|
||||||
func PrintErrorHTML(w http.ResponseWriter, code int, err error) (int, error) {
|
func htmlError(w http.ResponseWriter, code int, err error) (int, error) {
|
||||||
tpl := errTemplate
|
tpl := errTemplate
|
||||||
tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1)
|
tpl = strings.Replace(tpl, "TITLE", strconv.Itoa(code)+" "+http.StatusText(code), -1)
|
||||||
tpl = strings.Replace(tpl, "CODE", err.Error(), -1)
|
tpl = strings.Replace(tpl, "CODE", err.Error(), -1)
|
||||||
|
|
6
http.go
6
http.go
|
@ -112,7 +112,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er
|
||||||
// Checks if the User is allowed to access this file
|
// Checks if the User is allowed to access this file
|
||||||
if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) {
|
if !user.Allowed(strings.TrimPrefix(r.URL.Path, c.BaseURL)) {
|
||||||
if r.Method == http.MethodGet {
|
if r.Method == http.MethodGet {
|
||||||
return PrintErrorHTML(
|
return htmlError(
|
||||||
w, http.StatusForbidden,
|
w, http.StatusForbidden,
|
||||||
errors.New("You don't have permission to access this page"),
|
errors.New("You don't have permission to access this page"),
|
||||||
)
|
)
|
||||||
|
@ -134,7 +134,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er
|
||||||
fi, err = GetInfo(r.URL, c, user)
|
fi, err = GetInfo(r.URL, c, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if r.Method == http.MethodGet {
|
if r.Method == http.MethodGet {
|
||||||
return PrintErrorHTML(w, code, err)
|
return htmlError(w, code, err)
|
||||||
}
|
}
|
||||||
code = errorToHTTP(err, false)
|
code = errorToHTTP(err, false)
|
||||||
return code, err
|
return code, err
|
||||||
|
@ -162,7 +162,7 @@ func (c *FileManager) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, er
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
code, err = PrintErrorHTML(w, code, err)
|
code, err = htmlError(w, code, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return code, err
|
return code, err
|
||||||
|
|
|
@ -77,9 +77,8 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *use
|
||||||
Secure: r.TLS != nil,
|
Secure: r.TLS != nil,
|
||||||
})
|
})
|
||||||
|
|
||||||
page := &Page{
|
p := &page{
|
||||||
Minimal: r.Header.Get("Minimal") == "true",
|
Minimal: r.Header.Get("Minimal") == "true",
|
||||||
PageInfo: &PageInfo{
|
|
||||||
Name: listing.Name,
|
Name: listing.Name,
|
||||||
Path: i.VirtualPath,
|
Path: i.VirtualPath,
|
||||||
IsDir: true,
|
IsDir: true,
|
||||||
|
@ -87,10 +86,9 @@ func serveListing(w http.ResponseWriter, r *http.Request, c *FileManager, u *use
|
||||||
Config: c,
|
Config: c,
|
||||||
Display: displayMode,
|
Display: displayMode,
|
||||||
Data: listing,
|
Data: listing,
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return page.PrintAsHTML(w, "listing")
|
return p.PrintAsHTML(w, "listing")
|
||||||
}
|
}
|
||||||
|
|
||||||
// handleSortOrder gets and stores for a Listing the 'sort' and 'order',
|
// handleSortOrder gets and stores for a Listing the 'sort' and 'order',
|
||||||
|
|
|
@ -14,15 +14,13 @@ func serveSingle(w http.ResponseWriter, r *http.Request, c *FileManager, u *user
|
||||||
return errorToHTTP(err, true), err
|
return errorToHTTP(err, true), err
|
||||||
}
|
}
|
||||||
|
|
||||||
p := &Page{
|
p := &page{
|
||||||
PageInfo: &PageInfo{
|
|
||||||
Name: i.Name,
|
Name: i.Name,
|
||||||
Path: i.VirtualPath,
|
Path: i.VirtualPath,
|
||||||
IsDir: false,
|
IsDir: false,
|
||||||
Data: i,
|
Data: i,
|
||||||
User: u,
|
User: u,
|
||||||
Config: c,
|
Config: c,
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the request accepts JSON, we send the file information.
|
// If the request accepts JSON, we send the file information.
|
||||||
|
|
160
page.go
160
page.go
|
@ -12,84 +12,8 @@ import (
|
||||||
"github.com/hacdias/filemanager/variables"
|
"github.com/hacdias/filemanager/variables"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Page contains the informations and functions needed to show the Page
|
// functions contains the non-standard functions that are available
|
||||||
type Page struct {
|
// to use on the HTML templates.
|
||||||
*PageInfo
|
|
||||||
Minimal bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// PageInfo contains the information of a Page
|
|
||||||
type PageInfo struct {
|
|
||||||
Name string
|
|
||||||
Path string
|
|
||||||
IsDir bool
|
|
||||||
User *user
|
|
||||||
Config *FileManager
|
|
||||||
Data interface{}
|
|
||||||
Editor bool
|
|
||||||
Display string
|
|
||||||
}
|
|
||||||
|
|
||||||
// BreadcrumbMapItem ...
|
|
||||||
type BreadcrumbMapItem struct {
|
|
||||||
Name string
|
|
||||||
URL string
|
|
||||||
}
|
|
||||||
|
|
||||||
// BreadcrumbMap returns p.Path where every element is a map
|
|
||||||
// of URLs and path segment names.
|
|
||||||
func (i PageInfo) BreadcrumbMap() []BreadcrumbMapItem {
|
|
||||||
result := []BreadcrumbMapItem{}
|
|
||||||
|
|
||||||
if len(i.Path) == 0 {
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip trailing slash
|
|
||||||
lpath := i.Path
|
|
||||||
if lpath[len(lpath)-1] == '/' {
|
|
||||||
lpath = lpath[:len(lpath)-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
parts := strings.Split(lpath, "/")
|
|
||||||
for i, part := range parts {
|
|
||||||
if i == len(parts)-1 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if i == 0 && part == "" {
|
|
||||||
result = append([]BreadcrumbMapItem{{
|
|
||||||
Name: "/",
|
|
||||||
URL: "/",
|
|
||||||
}}, result...)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
result = append([]BreadcrumbMapItem{{
|
|
||||||
Name: part,
|
|
||||||
URL: strings.Join(parts[:i+1], "/") + "/",
|
|
||||||
}}, result...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// PreviousLink returns the path of the previous folder
|
|
||||||
func (i PageInfo) PreviousLink() string {
|
|
||||||
path := strings.TrimSuffix(i.Path, "/")
|
|
||||||
path = strings.TrimPrefix(path, "/")
|
|
||||||
path = i.Config.AbsoluteURL() + "/" + path
|
|
||||||
path = path[0 : len(path)-len(i.Name)]
|
|
||||||
|
|
||||||
if len(path) < len(i.Config.AbsoluteURL()+"/") {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return path
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the functions map, then the template, check for erros and
|
|
||||||
// execute the template if there aren't errors
|
|
||||||
var functions = template.FuncMap{
|
var functions = template.FuncMap{
|
||||||
"Defined": variables.FieldInStruct,
|
"Defined": variables.FieldInStruct,
|
||||||
"CSS": func(s string) template.CSS {
|
"CSS": func(s string) template.CSS {
|
||||||
|
@ -104,9 +28,79 @@ var functions = template.FuncMap{
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrintAsHTML formats the page in HTML and executes the template
|
// page contains the information needed to fill a page template.
|
||||||
func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) {
|
type page struct {
|
||||||
|
Minimal bool
|
||||||
|
Name string
|
||||||
|
Path string
|
||||||
|
IsDir bool
|
||||||
|
User *user
|
||||||
|
Config *FileManager
|
||||||
|
Data interface{}
|
||||||
|
Editor bool
|
||||||
|
Display string
|
||||||
|
}
|
||||||
|
|
||||||
|
// breadcrumbItem contains the Name and the URL of a breadcrumb piece.
|
||||||
|
type breadcrumbItem struct {
|
||||||
|
Name string
|
||||||
|
URL string
|
||||||
|
}
|
||||||
|
|
||||||
|
// BreadcrumbMap returns p.Path where every element is a map
|
||||||
|
// of URLs and path segment names.
|
||||||
|
func (p page) BreadcrumbMap() []breadcrumbItem {
|
||||||
|
result := []breadcrumbItem{}
|
||||||
|
|
||||||
|
if len(p.Path) == 0 {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip trailing slash
|
||||||
|
lpath := p.Path
|
||||||
|
if lpath[len(lpath)-1] == '/' {
|
||||||
|
lpath = lpath[:len(lpath)-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.Split(lpath, "/")
|
||||||
|
for i, part := range parts {
|
||||||
|
if i == len(parts)-1 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if i == 0 && part == "" {
|
||||||
|
result = append([]breadcrumbItem{{
|
||||||
|
Name: "/",
|
||||||
|
URL: "/",
|
||||||
|
}}, result...)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
result = append([]breadcrumbItem{{
|
||||||
|
Name: part,
|
||||||
|
URL: strings.Join(parts[:i+1], "/") + "/",
|
||||||
|
}}, result...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// PreviousLink returns the URL of the previous folder.
|
||||||
|
func (p page) PreviousLink() string {
|
||||||
|
path := strings.TrimSuffix(p.Path, "/")
|
||||||
|
path = strings.TrimPrefix(path, "/")
|
||||||
|
path = p.Config.AbsoluteURL() + "/" + path
|
||||||
|
path = path[0 : len(path)-len(p.Name)]
|
||||||
|
|
||||||
|
if len(path) < len(p.Config.AbsoluteURL()+"/") {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// PrintAsHTML formats the page in HTML and executes the template
|
||||||
|
func (p page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, error) {
|
||||||
if p.Minimal {
|
if p.Minimal {
|
||||||
templates = append(templates, "minimal")
|
templates = append(templates, "minimal")
|
||||||
} else {
|
} else {
|
||||||
|
@ -141,7 +135,7 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
err := tpl.Execute(buf, p.PageInfo)
|
err := tpl.Execute(buf, p)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return http.StatusInternalServerError, err
|
return http.StatusInternalServerError, err
|
||||||
|
@ -153,8 +147,8 @@ func (p Page) PrintAsHTML(w http.ResponseWriter, templates ...string) (int, erro
|
||||||
}
|
}
|
||||||
|
|
||||||
// PrintAsJSON prints the current Page information in JSON
|
// PrintAsJSON prints the current Page information in JSON
|
||||||
func (p Page) PrintAsJSON(w http.ResponseWriter) (int, error) {
|
func (p page) PrintAsJSON(w http.ResponseWriter) (int, error) {
|
||||||
marsh, err := json.MarshalIndent(p.PageInfo.Data, "", " ")
|
marsh, err := json.MarshalIndent(p.Data, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return http.StatusInternalServerError, err
|
return http.StatusInternalServerError, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue