diff --git a/api/images_list.go b/api/images_list.go index 22e24e1..78bd1ac 100644 --- a/api/images_list.go +++ b/api/images_list.go @@ -37,8 +37,10 @@ func (ilp *ImageListParams) FillFromQuery(query Queryable) { ilp.OrderBy = query.Get("order_by") ilp.Sort = strings.ToLower(query.Get("sort")) ilp.Offset, _ = strconv.ParseInt(query.Get("offset"), 10, 64) - ilp.Limit, _ = strconv.ParseInt(query.Get("limit"), 10, 64) - if ilp.Limit < 1 { + limit := query.Get("limit") + var err error + ilp.Limit, err = strconv.ParseInt(limit, 10, 64) + if err != nil || ilp.Limit < 0 { ilp.Limit = 25 } ilp.Device = query.Get("device") @@ -88,6 +90,8 @@ func (ilp ImageListParams) Query() (expr []bob.Mod[*dialect.SelectQuery]) { expr = append(expr, ilp.CountQuery()...) if ilp.Limit > 0 { expr = append(expr, sm.Limit(ilp.Limit)) + } else if ilp.Offset > 0 { + expr = append(expr, sm.Limit(-1)) } if ilp.Offset > 0 { diff --git a/api/subreddits_list.go b/api/subreddits_list.go index fecc07e..3c9af63 100644 --- a/api/subreddits_list.go +++ b/api/subreddits_list.go @@ -51,6 +51,8 @@ func (l ListSubredditsParams) Query() (expr []bob.Mod[*dialect.SelectQuery]) { } if l.Limit > 0 { expr = append(expr, sm.Limit(l.Limit)) + } else if l.Offset > 0 { + expr = append(expr, sm.Limit(-1)) } if l.Offset > 0 { expr = append(expr, sm.Offset(l.Offset)) diff --git a/server/routes/page_home.go b/server/routes/page_home.go index 1ac237c..3517a09 100644 --- a/server/routes/page_home.go +++ b/server/routes/page_home.go @@ -4,6 +4,7 @@ import ( "net/http" "time" + "github.com/tigorlazuardi/redmage/api" "github.com/tigorlazuardi/redmage/pkg/errs" "github.com/tigorlazuardi/redmage/pkg/log" "github.com/tigorlazuardi/redmage/views" @@ -20,6 +21,7 @@ func (routes *Routes) PageHome(rw http.ResponseWriter, r *http.Request) { data.ListSubredditParams.FillFromQuery(r.URL.Query()) data.ListSubredditParams.Limit = 0 + data.ListSubredditParams.Offset = 0 list, err := routes.API.ListSubreddits(ctx, data.ListSubredditParams) if err != nil { log.New(ctx).Err(err).Error("failed to list subreddits") @@ -36,7 +38,9 @@ func (routes *Routes) PageHome(rw http.ResponseWriter, r *http.Request) { if data.ImageListParams.CreatedAt.IsZero() { data.ImageListParams.CreatedAt = time.Now().Add(-time.Hour * 24) // images in the last 24 hours } - data.ImageListParams.Limit = 0 + if r.URL.Query().Get("limit") == "" { + data.ImageListParams.Limit = 100 + } imageList, err := routes.API.ImagesListWithDevicesAndSubreddits(ctx, data.ImageListParams) if err != nil { @@ -50,6 +54,17 @@ func (routes *Routes) PageHome(rw http.ResponseWriter, r *http.Request) { return } + data.Devices, err = routes.API.GetDevices(ctx, api.DevicesListParams{Status: -1}) + if err != nil { + log.New(ctx).Err(err).Error("failed to list subreddits") + code, message := errs.HTTPMessage(err) + data := homeview.Data{Error: message} + rw.WriteHeader(code) + if err := homeview.Home(vc, data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render home view") + } + return + } data.SubredditsList = list data.RecentlyAddedImages = homeview.NewRecentlyAddedImages(imageList.Images) data.Now = time.Now() diff --git a/views/homeview/homeview.templ b/views/homeview/homeview.templ index 68199fa..46ac174 100644 --- a/views/homeview/homeview.templ +++ b/views/homeview/homeview.templ @@ -31,13 +31,22 @@ templ HomeContent(c *views.Context, data Data) {

Recently Added

@filterBar(c, data)
- if data.TotalImages == 0 { + if data.TotalImages <= 0 {

There are no recently added images in the current time range.

} else { -

+

{ strconv.FormatInt(data.TotalImages, 10) } Images

+ @showingImageFromTo(data) } +
+ @components.Pagination(c, components.PaginationData{ + Limit: data.ImageListParams.Limit, + Total: data.TotalImages, + Offset: data.ImageListParams.Offset, + BaseURL: "/", + }) +
for _, recently := range data.RecentlyAddedImages {

{ recently.Device.Name }

@@ -71,6 +80,22 @@ templ HomeContent(c *views.Context, data Data) { } +templ showingImageFromTo(data Data) { + if data.TotalImages > 1 { +

{ showingFromToImages(data) }

+ } +} + +func showingFromToImages(data Data) string { + params := data.ImageListParams + start := params.Offset + 1 + end := params.Limit + params.Offset + if end > data.TotalImages { + end = data.TotalImages + } + return fmt.Sprintf("Showing from %d to %d", start, end) +} + templ filterBar(c *views.Context, data Data) {
@nsfwToggle(data) + @deviceFilterInput(data) @limitInput(data.ImageListParams) @recentRangeInput(c.Query.Get("created_at"))
@@ -136,3 +162,17 @@ templ nsfwToggle(data Data) { } + +templ deviceFilterInput(data Data) { + + +} diff --git a/views/homeview/homeview_data.go b/views/homeview/homeview_data.go index 425101d..1278d03 100644 --- a/views/homeview/homeview_data.go +++ b/views/homeview/homeview_data.go @@ -17,6 +17,7 @@ type Data struct { Now time.Time ListSubredditParams api.ListSubredditsParams ImageListParams api.ImageListParams + Devices models.DeviceSlice } type RecentlyAddedImages = []RecentlyAddedImage