parent
15fe9c20df
commit
fad9ad2be4
22 changed files with 345 additions and 141 deletions
@ -0,0 +1,34 @@ |
||||
{{ define "title"}}{{ .category.Title }} > {{ t "page.feeds.title" }} ({{ .total }}){{ end }} |
||||
|
||||
{{ define "content"}} |
||||
<section class="page-header"> |
||||
<h1>{{ .category.Title }} > {{ t "page.feeds.title" }} ({{ .total }})</h1> |
||||
<ul> |
||||
<li> |
||||
<a href="{{ route "categories" }}">{{ t "menu.categories" }}</a> |
||||
</li> |
||||
<li> |
||||
<a href="{{ route "editCategory" "categoryID" .category.ID }}">{{ t "menu.edit_category" }}</a> |
||||
</li> |
||||
{{ if eq .total 0 }} |
||||
<li> |
||||
<a href="#" |
||||
data-confirm="true" |
||||
data-label-question="{{ t "confirm.question" }}" |
||||
data-label-yes="{{ t "confirm.yes" }}" |
||||
data-label-no="{{ t "confirm.no" }}" |
||||
data-label-loading="{{ t "confirm.loading" }}" |
||||
data-redirect-url="{{ route "categories" }}" |
||||
data-url="{{ route "removeCategory" "categoryID" .category.ID }}">{{ t "action.remove" }}</a> |
||||
</li> |
||||
{{ end }} |
||||
</ul> |
||||
</section> |
||||
|
||||
{{ if not .feeds }} |
||||
<p class="alert">{{ t "alert.no_feed_in_category" }}</p> |
||||
{{ else }} |
||||
{{ template "feed_list" dict "user" .user "feeds" .feeds "ParsingErrorCount" .ParsingErrorCount }} |
||||
{{ end }} |
||||
|
||||
{{ end }} |
@ -0,0 +1,56 @@ |
||||
{{ define "feed_list" }} |
||||
<div class="items"> |
||||
{{ range .feeds }} |
||||
<article class="item {{ if ne .ParsingErrorCount 0 }}feed-parsing-error{{ end }}"> |
||||
<div class="item-header"> |
||||
<span class="item-title"> |
||||
{{ if .Icon }} |
||||
<img src="{{ route "icon" "iconID" .Icon.IconID }}" width="16" height="16" loading="lazy" alt="{{ .Title }}"> |
||||
{{ end }} |
||||
{{ if .Disabled }} 🚫 {{ end }} |
||||
<a href="{{ route "feedEntries" "feedID" .ID }}">{{ .Title }}</a> |
||||
</span> |
||||
<span class="feed-entries-counter"> |
||||
(<span title="{{ t "page.feeds.unread_counter" }}">{{ .UnreadCount }}</span>/<span title="{{ t "page.feeds.read_counter" }}">{{ .ReadCount }}</span>) |
||||
</span> |
||||
<span class="category"> |
||||
<a href="{{ route "categoryEntries" "categoryID" .Category.ID }}">{{ .Category.Title }}</a> |
||||
</span> |
||||
</div> |
||||
<div class="item-meta"> |
||||
<ul> |
||||
<li> |
||||
<a href="{{ .SiteURL }}" title="{{ .SiteURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer" data-original-link="true">{{ domain .SiteURL }}</a> |
||||
</li> |
||||
<li> |
||||
{{ t "page.feeds.last_check" }} <time datetime="{{ isodate .CheckedAt }}" title="{{ isodate .CheckedAt }}">{{ elapsed $.user.Timezone .CheckedAt }}</time> |
||||
</li> |
||||
</ul> |
||||
<ul> |
||||
<li> |
||||
<a href="{{ route "refreshFeed" "feedID" .ID }}">{{ t "menu.refresh_feed" }}</a> |
||||
</li> |
||||
<li> |
||||
<a href="{{ route "editFeed" "feedID" .ID }}">{{ t "menu.edit_feed" }}</a> |
||||
</li> |
||||
<li> |
||||
<a href="#" |
||||
data-confirm="true" |
||||
data-label-question="{{ t "confirm.question" }}" |
||||
data-label-yes="{{ t "confirm.yes" }}" |
||||
data-label-no="{{ t "confirm.no" }}" |
||||
data-label-loading="{{ t "confirm.loading" }}" |
||||
data-url="{{ route "removeFeed" "feedID" .ID }}">{{ t "action.remove" }}</a> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
{{ if ne .ParsingErrorCount 0 }} |
||||
<div class="parsing-error"> |
||||
<strong title="{{ .ParsingErrorMsg }}" class="parsing-error-count">{{ plural "page.feeds.error_count" .ParsingErrorCount .ParsingErrorCount }}</strong> |
||||
- <small class="parsing-error-message">{{ .ParsingErrorMsg }}</small> |
||||
</div> |
||||
{{ end }} |
||||
</article> |
||||
{{ end }} |
||||
</div> |
||||
{{ end }} |
@ -0,0 +1,52 @@ |
||||
// Copyright 2019 Frédéric Guillot. All rights reserved.
|
||||
// Use of this source code is governed by the Apache 2.0
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ui // import "miniflux.app/ui"
|
||||
|
||||
import ( |
||||
"net/http" |
||||
|
||||
"miniflux.app/http/request" |
||||
"miniflux.app/http/response/html" |
||||
"miniflux.app/ui/session" |
||||
"miniflux.app/ui/view" |
||||
) |
||||
|
||||
func (h *handler) showCategoryFeedsPage(w http.ResponseWriter, r *http.Request) { |
||||
user, err := h.store.UserByID(request.UserID(r)) |
||||
if err != nil { |
||||
html.ServerError(w, r, err) |
||||
return |
||||
} |
||||
|
||||
categoryID := request.RouteInt64Param(r, "categoryID") |
||||
category, err := h.store.Category(request.UserID(r), categoryID) |
||||
if err != nil { |
||||
html.ServerError(w, r, err) |
||||
return |
||||
} |
||||
|
||||
if category == nil { |
||||
html.NotFound(w, r) |
||||
return |
||||
} |
||||
|
||||
feeds, err := h.store.FeedsByCategoryWithCounters(user.ID, categoryID) |
||||
if err != nil { |
||||
html.ServerError(w, r, err) |
||||
return |
||||
} |
||||
|
||||
sess := session.New(h.store, request.SessionID(r)) |
||||
view := view.New(h.tpl, r, sess) |
||||
view.Set("category", category) |
||||
view.Set("feeds", feeds) |
||||
view.Set("total", len(feeds)) |
||||
view.Set("menu", "categories") |
||||
view.Set("user", user) |
||||
view.Set("countUnread", h.store.CountUnreadEntries(user.ID)) |
||||
view.Set("countErrorFeeds", h.store.CountErrorFeeds(user.ID)) |
||||
|
||||
html.OK(w, r, view.Render("category_feeds")) |
||||
} |
Loading…
Reference in new issue