144 lines
4.2 KiB
Plaintext
144 lines
4.2 KiB
Plaintext
package homeview
|
|
|
|
import "github.com/tigorlazuardi/redmage/views/components"
|
|
import "github.com/tigorlazuardi/redmage/views"
|
|
import "github.com/tigorlazuardi/redmage/views/utils"
|
|
import "github.com/tigorlazuardi/redmage/models"
|
|
import "strconv"
|
|
import "fmt"
|
|
|
|
templ Home(c *views.Context, data Data) {
|
|
@components.Doctype() {
|
|
@components.Head(c,
|
|
components.HeadTitle("Redmage - Home"),
|
|
)
|
|
@components.Body(c) {
|
|
@HomeContent(c, data)
|
|
}
|
|
}
|
|
}
|
|
|
|
// HomeContent returns the main content of the home page.
|
|
//
|
|
// Use this template if request is HX-Boosted.
|
|
templ HomeContent(c *views.Context, data Data) {
|
|
<main class="prose min-w-full">
|
|
@components.Container() {
|
|
if data.Error != "" {
|
|
@components.ErrorToast(data.Error)
|
|
} else {
|
|
<section class="mb-4 mx-auto">
|
|
<h1 class="mb-4">
|
|
Recently Added
|
|
</h1>
|
|
<div id="recently-added-images">
|
|
if data.TotalImages == 0 {
|
|
<h2 class="mt-4">There are no recently added images in the current time range.</h2>
|
|
} else {
|
|
<h2 class="mt-4">
|
|
{ strconv.FormatInt(data.TotalImages, 10) } Images
|
|
</h2>
|
|
}
|
|
<div
|
|
id="filter-bar"
|
|
hx-get="/"
|
|
hx-target="#recently-added-images"
|
|
hx-select="#recently-added-images"
|
|
hx-swap="outerHTML"
|
|
hx-trigger="change"
|
|
hx-include="this"
|
|
hx-push-url="true"
|
|
class="flex flex-wrap content-center gap-x-8"
|
|
>
|
|
@recentRangeInput(c)
|
|
@nsfwToggle(c, data)
|
|
</div>
|
|
for _, recently := range data.RecentlyAddedImages {
|
|
<div class="divider"></div>
|
|
<h2 class="mt-4">{ recently.Device.Name }</h2>
|
|
for _, subreddit := range recently.Subreddits {
|
|
<h4>
|
|
<a class="text-primary" href={ templ.SafeURL(fmt.Sprintf("/subreddits/details/%s?device=%s", subreddit.Subreddit.Name, recently.Device.Slug)) }>
|
|
{ subreddit.Subreddit.Name }
|
|
</a>
|
|
- { strconv.Itoa(len(subreddit.Images)) } images
|
|
</h4>
|
|
@RecentlyAddedImageList(subreddit.Images, 0)
|
|
}
|
|
}
|
|
</div>
|
|
</section>
|
|
<section>
|
|
<h1>Subreddits</h1>
|
|
for _, subreddit := range data.SubredditsList.Data {
|
|
<h3>
|
|
{ subreddit.Name } -
|
|
@utils.RelativeTimeNode(subreddit.Name, utils.NextScheduleTime(subreddit.Schedule).Unix())
|
|
</h3>
|
|
}
|
|
</section>
|
|
}
|
|
}
|
|
</main>
|
|
}
|
|
|
|
templ recentRangeInput(c *views.Context) {
|
|
<div class="form-control">
|
|
<label class="label gap-4">
|
|
<span class="label-text">Range</span>
|
|
<select
|
|
id="select-range"
|
|
name="created_at"
|
|
class="select select-ghost select-bordered"
|
|
>
|
|
@recentlyRangeOption(c, "-10800", "3 Hours")
|
|
@recentlyRangeOption(c, "-21600", "6 Hours")
|
|
@recentlyRangeOption(c, "-43200", "12 Hours")
|
|
@recentlyRangeOption(c, "-86400", "1 Day")
|
|
@recentlyRangeOption(c, "-172800", "2 Days")
|
|
@recentlyRangeOption(c, "-259200", "3 Days")
|
|
@recentlyRangeOption(c, "-604800", "7 Days")
|
|
@recentlyRangeOption(c, "-2592000", "30 Days")
|
|
</select>
|
|
</label>
|
|
</div>
|
|
}
|
|
|
|
templ recentlyRangeOption(c *views.Context, value, text string) {
|
|
if c.Request.URL.Query().Get("created_at") == "" && value == "-86400" {
|
|
<option selected="selected" value={ value }>{ text }</option>
|
|
} else if c.Request.URL.Query().Get("created_at") == value {
|
|
<option selected="selected" value={ value }>{ text }</option>
|
|
} else {
|
|
<option value={ value }>{ text }</option>
|
|
}
|
|
}
|
|
|
|
templ nsfwToggle(c *views.Context, data Data) {
|
|
<div class="form-control">
|
|
<label class="label gap-4">
|
|
<span class="label-text">NSFW</span>
|
|
<select
|
|
name="sfw"
|
|
class="select select-ghost select-bordered"
|
|
>
|
|
if (c.Request.URL.Query().Get("sfw") == "1") || data.SFW {
|
|
<option value="0">Show</option>
|
|
<option selected="selected" value="1">Hide</option>
|
|
} else {
|
|
<option selected="selected" value="0">Show</option>
|
|
<option value="1">Hide</option>
|
|
}
|
|
</select>
|
|
</label>
|
|
</div>
|
|
}
|
|
|
|
templ RecentlyAddedImageList(images models.ImageSlice, opts components.ImageCardOption) {
|
|
<div class="overflow-x-auto flex gap-4 p-6 shadow-inner bg-base-300 rounded-2xl w-[85vw] md:w-full scrollbar-track-base-100 scrollbar-thumb-primary scrollbar-thin hover:scrollbar-thumb-base-300">
|
|
for _, data := range images {
|
|
@components.ImageCard(data, 0)
|
|
}
|
|
</div>
|
|
}
|