From 55845b4b45da30a5d898524a4118c1650e0a8cbf Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Wed, 29 May 2024 10:49:44 +0700 Subject: [PATCH] view(subreddits): added nsfw filter to subreddit details view --- api/subreddits_get_by_name.go | 15 +- views/subreddits/details/details.templ | 208 ------------------------- views/subreddits/details/filter.templ | 92 +++++++++++ views/subreddits/details/view.templ | 144 +++++++++++++++++ 4 files changed, 243 insertions(+), 216 deletions(-) delete mode 100644 views/subreddits/details/details.templ create mode 100644 views/subreddits/details/filter.templ create mode 100644 views/subreddits/details/view.templ diff --git a/api/subreddits_get_by_name.go b/api/subreddits_get_by_name.go index 7b46fab..7ba7daf 100644 --- a/api/subreddits_get_by_name.go +++ b/api/subreddits_get_by_name.go @@ -37,7 +37,7 @@ type SubredditGetByNameImageParams struct { Offset int64 OrderBy string Sort string - SFW int + NSFW int After time.Time Device string } @@ -103,11 +103,10 @@ func (sgb *SubredditGetByNameImageParams) FillFromQuery(query Queryable) { sgb.After = time.Now().Add(time.Duration(afterint) * time.Second) } - sgb.SFW, _ = strconv.Atoi(query.Get("sfw")) - if sgb.SFW < 0 { - sgb.SFW = 0 - } else if sgb.SFW > 1 { - sgb.SFW = 1 + if nsfw, err := strconv.Atoi(query.Get("nsfw")); err == nil { + sgb.NSFW = nsfw + } else { + sgb.NSFW = -1 } } @@ -132,8 +131,8 @@ func (sgb *SubredditGetByNameImageParams) CountQuery() (expr []bob.Mod[*dialect. expr = append(expr, models.SelectWhere.Images.CreatedAt.GTE(sgb.After.Unix())) } - if sgb.SFW == 1 { - expr = append(expr, models.SelectWhere.Images.NSFW.EQ(0)) + if sgb.NSFW >= 0 { + expr = append(expr, models.SelectWhere.Images.NSFW.EQ(int32(sgb.NSFW))) } return expr diff --git a/views/subreddits/details/details.templ b/views/subreddits/details/details.templ deleted file mode 100644 index 698a425..0000000 --- a/views/subreddits/details/details.templ +++ /dev/null @@ -1,208 +0,0 @@ -package details - -import "github.com/tigorlazuardi/redmage/views" -import "github.com/tigorlazuardi/redmage/models" -import "github.com/tigorlazuardi/redmage/views/components" -import "strconv" -import "github.com/tigorlazuardi/redmage/api" -import "fmt" -import "github.com/tigorlazuardi/redmage/views/icons" - -type Data struct { - Subreddit *models.Subreddit - Devices models.DeviceSlice - Images models.ImageSlice - TotalImages int64 - Error string - Params api.SubredditGetByNameImageParams - FlashMessageSuccess string -} - -templ View(c *views.Context, data Data) { - @components.Doctype() { - if data.Subreddit != nil { - @components.Head(c, components.HeadTitle(fmt.Sprintf("Subreddit - %s", data.Subreddit.Name))) - } else { - @components.Head(c, components.HeadTitle("Subreddit - 404 NOT FOUND")) - } - @components.Body(c) { - @Content(c, data) - @components.NotificationContainer() { - if data.FlashMessageSuccess != "" { - @components.SuccessNotification(data.FlashMessageSuccess) - } - } - } - } -} - -templ Content(c *views.Context, data Data) { -
- @components.Container() { - if data.Error != "" { -

Error: { data.Error }

- } else { -
-

Subreddit { data.Subreddit.Name }

-
- -
-
-

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

-
- @FilterBar(c, data) -
- @components.Pagination(c, components.PaginationData{ - Offset: data.Params.Offset, - Limit: data.Params.Limit, - BaseURL: fmt.Sprintf("/subreddits/details/%s", data.Subreddit.Name), - Total: data.TotalImages, - }) -
- @showingImageFromTo(data) -
- for _, image := range data.Images { - @components.ImageCard(image, components.HideNothing.SetCond(components.HideDevice, data.Params.Device != "")) - } -
-
- @components.Pagination(c, components.PaginationData{ - Offset: data.Params.Offset, - Limit: data.Params.Limit, - BaseURL: fmt.Sprintf("/subreddits/details/%s", data.Subreddit.Name), - Total: data.TotalImages, - }) -
- } - } -
-} - -templ FilterBar(c *views.Context, data Data) { -
- - - -
-} - -templ limitOption(params api.SubredditGetByNameImageParams, value int) { - if int(params.Limit) == value { - - } else { - - } -} - -templ deviceOption(params api.SubredditGetByNameImageParams, device *models.Device) { - if params.Device == device.Slug { - - } else { - - } -} - -templ showingImageFromTo(data Data) { - if data.TotalImages > 1 { -

{ showingFromToImages(data) }

- } -} - -func showingFromToImages(data Data) string { - params := data.Params - 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) -} diff --git a/views/subreddits/details/filter.templ b/views/subreddits/details/filter.templ new file mode 100644 index 0000000..09516c1 --- /dev/null +++ b/views/subreddits/details/filter.templ @@ -0,0 +1,92 @@ +package details + +import "github.com/tigorlazuardi/redmage/views" +import "fmt" +import "github.com/tigorlazuardi/redmage/api" +import "strconv" +import "github.com/tigorlazuardi/redmage/models" + +templ FilterBar(c *views.Context, data Data) { +
+ @searchInput(data.Params) + @nsfwInput(data.Params) + @limitInput(data.Params) + @deviceInput(data) +
+} + +templ searchInput(params api.SubredditGetByNameImageParams) { + + +} + +templ nsfwInput(params api.SubredditGetByNameImageParams) { + + +} + +templ limitInput(params api.SubredditGetByNameImageParams) { + + +} + +templ limitOption(params api.SubredditGetByNameImageParams, value int) { + if int(params.Limit) == value { + + } else { + + } +} + +templ deviceInput(data Data) { + + +} + +templ deviceOption(params api.SubredditGetByNameImageParams, device *models.Device) { + if params.Device == device.Slug { + + } else { + + } +} diff --git a/views/subreddits/details/view.templ b/views/subreddits/details/view.templ new file mode 100644 index 0000000..237ca3c --- /dev/null +++ b/views/subreddits/details/view.templ @@ -0,0 +1,144 @@ +package details + +import "github.com/tigorlazuardi/redmage/views" +import "github.com/tigorlazuardi/redmage/models" +import "github.com/tigorlazuardi/redmage/views/components" +import "strconv" +import "github.com/tigorlazuardi/redmage/api" +import "fmt" +import "github.com/tigorlazuardi/redmage/views/icons" + +type Data struct { + Subreddit *models.Subreddit + Devices models.DeviceSlice + Images models.ImageSlice + TotalImages int64 + Error string + Params api.SubredditGetByNameImageParams + FlashMessageSuccess string +} + +templ View(c *views.Context, data Data) { + @components.Doctype() { + if data.Subreddit != nil { + @components.Head(c, components.HeadTitle(fmt.Sprintf("Subreddit - %s", data.Subreddit.Name))) + } else { + @components.Head(c, components.HeadTitle("Subreddit - 404 NOT FOUND")) + } + @components.Body(c) { + @Content(c, data) + @components.NotificationContainer() { + if data.FlashMessageSuccess != "" { + @components.SuccessNotification(data.FlashMessageSuccess) + } + } + } + } +} + +templ Content(c *views.Context, data Data) { +
+ @components.Container() { + if data.Error != "" { +

Error: { data.Error }

+ } else { +
+

Subreddit { data.Subreddit.Name }

+ @actionButton(data) +
+
+ @FilterBar(c, data) +
+

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

+
+ @components.Pagination(c, components.PaginationData{ + Offset: data.Params.Offset, + Limit: data.Params.Limit, + BaseURL: fmt.Sprintf("/subreddits/details/%s", data.Subreddit.Name), + Total: data.TotalImages, + }) +
+ @showingImageFromTo(data) +
+ for _, image := range data.Images { + @components.ImageCard(image, components.HideNothing.SetCond(components.HideDevice, data.Params.Device != "")) + } +
+
+ @components.Pagination(c, components.PaginationData{ + Offset: data.Params.Offset, + Limit: data.Params.Limit, + BaseURL: fmt.Sprintf("/subreddits/details/%s", data.Subreddit.Name), + Total: data.TotalImages, + }) +
+
+ } + } +
+} + +templ actionButton(data Data) { +
+ +
+} + +templ showingImageFromTo(data Data) { + if data.TotalImages > 1 { +

{ showingFromToImages(data) }

+ } +} + +func showingFromToImages(data Data) string { + params := data.Params + 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) +}