mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-11-03 19:17:29 -05:00 
			
		
		
		
	fileserver: Enable browse pagination with offset parameter (#3542)
* Update browse.go * Update browselisting.go * Update browsetpl.go * fix linter err * Update modules/caddyhttp/fileserver/browse.go Co-authored-by: Matt Holt <mholt@users.noreply.github.com> * Update modules/caddyhttp/fileserver/browselisting.go Co-authored-by: Matt Holt <mholt@users.noreply.github.com> * Update browsetpl.go change from -> offset * Update browse.go * Update browselisting.go Co-authored-by: Matt Holt <mholt@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									a2dae1d43f
								
							
						
					
					
						commit
						735c86658d
					
				@ -106,6 +106,7 @@ func (fsrv *FileServer) browseApplyQueryParams(w http.ResponseWriter, r *http.Re
 | 
			
		||||
	sortParam := r.URL.Query().Get("sort")
 | 
			
		||||
	orderParam := r.URL.Query().Get("order")
 | 
			
		||||
	limitParam := r.URL.Query().Get("limit")
 | 
			
		||||
	offsetParam := r.URL.Query().Get("offset")
 | 
			
		||||
 | 
			
		||||
	// first figure out what to sort by
 | 
			
		||||
	switch sortParam {
 | 
			
		||||
@ -130,7 +131,7 @@ func (fsrv *FileServer) browseApplyQueryParams(w http.ResponseWriter, r *http.Re
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// finally, apply the sorting and limiting
 | 
			
		||||
	listing.applySortAndLimit(sortParam, orderParam, limitParam)
 | 
			
		||||
	listing.applySortAndLimit(sortParam, orderParam, limitParam, offsetParam)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (fsrv *FileServer) browseWriteJSON(listing browseListing) (*bytes.Buffer, error) {
 | 
			
		||||
 | 
			
		||||
@ -101,6 +101,9 @@ type browseListing struct {
 | 
			
		||||
 | 
			
		||||
	// If ≠0 then Items have been limited to that many elements.
 | 
			
		||||
	ItemsLimitedTo int
 | 
			
		||||
 | 
			
		||||
	// If ≠0 then Items starting from that many elements.
 | 
			
		||||
	ItemOffset int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Breadcrumbs returns l.Path where every element maps
 | 
			
		||||
@ -131,7 +134,7 @@ func (l browseListing) Breadcrumbs() []crumb {
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (l *browseListing) applySortAndLimit(sortParam, orderParam, limitParam string) {
 | 
			
		||||
func (l *browseListing) applySortAndLimit(sortParam, orderParam, limitParam string, offsetParam string) {
 | 
			
		||||
	l.Sort = sortParam
 | 
			
		||||
	l.Order = orderParam
 | 
			
		||||
 | 
			
		||||
@ -159,8 +162,17 @@ func (l *browseListing) applySortAndLimit(sortParam, orderParam, limitParam stri
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if offsetParam != "" {
 | 
			
		||||
		offset, _ := strconv.Atoi(offsetParam)
 | 
			
		||||
		if offset > 0 && offset <= len(l.Items) {
 | 
			
		||||
			l.Items = l.Items[offset:]
 | 
			
		||||
			l.ItemOffset = offset
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if limitParam != "" {
 | 
			
		||||
		limit, _ := strconv.Atoi(limitParam)
 | 
			
		||||
 | 
			
		||||
		if limit > 0 && limit <= len(l.Items) {
 | 
			
		||||
			l.Items = l.Items[:limit]
 | 
			
		||||
			l.ItemsLimitedTo = limit
 | 
			
		||||
 | 
			
		||||
@ -296,37 +296,37 @@ footer {
 | 
			
		||||
						<th></th>
 | 
			
		||||
						<th>
 | 
			
		||||
							{{- if and (eq .Sort "namedirfirst") (ne .Order "desc")}}
 | 
			
		||||
							<a href="?sort=namedirfirst&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}" class="icon"><svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=namedirfirst&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}" class="icon"><svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							{{- else if and (eq .Sort "namedirfirst") (ne .Order "asc")}}
 | 
			
		||||
							<a href="?sort=namedirfirst&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}" class="icon"><svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=namedirfirst&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}" class="icon"><svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							{{- else}}
 | 
			
		||||
							<a href="?sort=namedirfirst&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}" class="icon sort"><svg class="top" width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg><svg class="bottom" width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=namedirfirst&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}" class="icon sort"><svg class="top" width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg><svg class="bottom" width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							{{- end}}
 | 
			
		||||
							
 | 
			
		||||
							{{- if and (eq .Sort "name") (ne .Order "desc")}}
 | 
			
		||||
							<a href="?sort=name&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Name <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=name&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Name <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							{{- else if and (eq .Sort "name") (ne .Order "asc")}}
 | 
			
		||||
							<a href="?sort=name&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Name <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=name&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Name <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							{{- else}}
 | 
			
		||||
							<a href="?sort=name&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Name</a>
 | 
			
		||||
							<a href="?sort=name&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Name</a>
 | 
			
		||||
							{{- end}}
 | 
			
		||||
						</th>
 | 
			
		||||
						<th>
 | 
			
		||||
							{{- if and (eq .Sort "size") (ne .Order "desc")}}
 | 
			
		||||
							<a href="?sort=size&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Size <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=size&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Size <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							{{- else if and (eq .Sort "size") (ne .Order "asc")}}
 | 
			
		||||
							<a href="?sort=size&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Size <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=size&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Size <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							{{- else}}
 | 
			
		||||
							<a href="?sort=size&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Size</a>
 | 
			
		||||
							<a href="?sort=size&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Size</a>
 | 
			
		||||
							{{- end}}
 | 
			
		||||
						</th>
 | 
			
		||||
						<th class="hideable">
 | 
			
		||||
							{{- if and (eq .Sort "time") (ne .Order "desc")}}
 | 
			
		||||
							<a href="?sort=time&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Modified <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=time&order=desc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Modified <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#up-arrow"></use></svg></a>
 | 
			
		||||
							{{- else if and (eq .Sort "time") (ne .Order "asc")}}
 | 
			
		||||
							<a href="?sort=time&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Modified <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							<a href="?sort=time&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Modified <svg width="1em" height=".5em" version="1.1" viewBox="0 0 12.922194 6.0358899"><use xlink:href="#down-arrow"></use></svg></a>
 | 
			
		||||
							{{- else}}
 | 
			
		||||
							<a href="?sort=time&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}">Modified</a>
 | 
			
		||||
							<a href="?sort=time&order=asc{{if ne 0 .ItemsLimitedTo}}&limit={{.ItemsLimitedTo}}{{end}}{{if ne 0 .ItemOffset}}&offset={{.ItemOffset}}{{end}}">Modified</a>
 | 
			
		||||
							{{- end}}
 | 
			
		||||
						</th>
 | 
			
		||||
						<th class="hideable"></th>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user