Skip to content

Commit

Permalink
Add user setting for marking entry as read on view
Browse files Browse the repository at this point in the history
  • Loading branch information
xl authored and fguillot committed Jun 30, 2023
1 parent 6046a74 commit 09f21a8
Showing 35 changed files with 84 additions and 29 deletions.
2 changes: 2 additions & 0 deletions client/model.go
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ type User struct {
CJKReadingSpeed int `json:"cjk_reading_speed"`
DefaultHomePage string `json:"default_home_page"`
CategoriesSortingOrder string `json:"categories_sorting_order"`
MarkReadOnView bool `json:"mark_read_on_view"`
}

func (u User) String() string {
@@ -78,6 +79,7 @@ type UserModificationRequest struct {
CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
}

// Users represents a list of users.
5 changes: 5 additions & 0 deletions database/migrations.go
Original file line number Diff line number Diff line change
@@ -702,4 +702,9 @@ var migrations = []func(tx *sql.Tx) error{

return nil
},
func(tx *sql.Tx) (err error) {
sql := `ALTER TABLE users ADD COLUMN mark_read_on_view boolean default 't'`
_, err = tx.Exec(sql)
return err
},
}
1 change: 1 addition & 0 deletions locale/translations/de_DE.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Eintrag Sortierspalte",
"form.prefs.label.default_home_page": "Standard Startseite",
"form.prefs.label.categories_sorting_order": "Kategorien sortieren",
"form.prefs.label.mark_read_on_view": "Einträge automatisch als gelesen markieren, wenn sie angezeigt werden",
"form.import.label.file": "OPML Datei",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Fever API aktivieren",
1 change: 1 addition & 0 deletions locale/translations/el_EL.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Στήλη ταξινόμησης εισόδου",
"form.prefs.label.default_home_page": "Προεπιλεγμένη αρχική σελίδα",
"form.prefs.label.categories_sorting_order": "Ταξινόμηση κατηγοριών",
"form.prefs.label.mark_read_on_view": "Αυτόματη επισήμανση καταχωρήσεων ως αναγνωσμένων κατά την προβολή",
"form.import.label.file": "Αρχείο OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Ενεργοποιήστε το Fever API",
1 change: 1 addition & 0 deletions locale/translations/en_US.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Entry sorting column",
"form.prefs.label.default_home_page": "Default home page",
"form.prefs.label.categories_sorting_order": "Categories sorting",
"form.prefs.label.mark_read_on_view": "Automatically mark entries as read when viewed",
"form.import.label.file": "OPML file",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Activate Fever API",
1 change: 1 addition & 0 deletions locale/translations/es_ES.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Columna de clasificación de artículos",
"form.prefs.label.default_home_page": "Página de inicio por defecto",
"form.prefs.label.categories_sorting_order": "Clasificación por categorías",
"form.prefs.label.mark_read_on_view": "Marcar automáticamente las entradas como leídas cuando se vean",
"form.import.label.file": "Archivo OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Activar API de Fever",
1 change: 1 addition & 0 deletions locale/translations/fi_FI.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Lajittele sarakkeen mukaan",
"form.prefs.label.default_home_page": "Oletusarvoinen etusivu",
"form.prefs.label.categories_sorting_order": "Kategorioiden lajittelu",
"form.prefs.label.mark_read_on_view": "Merkitse kohdat automaattisesti luetuiksi, kun niitä tarkastellaan",
"form.import.label.file": "OPML-tiedosto",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Ota Fever API käyttöön",
1 change: 1 addition & 0 deletions locale/translations/fr_FR.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Colonne de tri des entrées",
"form.prefs.label.default_home_page": "Page d'accueil par défaut",
"form.prefs.label.categories_sorting_order": "Colonne de tri des catégories",
"form.prefs.label.mark_read_on_view": "Marquer automatiquement les entrées comme lues lorsqu'elles sont consultées",
"form.import.label.file": "Fichier OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Activer l'API de Fever",
1 change: 1 addition & 0 deletions locale/translations/hi_IN.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "प्रवेश छँटाई कॉलम",
"form.prefs.label.default_home_page": "डिफ़ॉल्ट होमपेज़",
"form.prefs.label.categories_sorting_order": "श्रेणियाँ छँटाई",
"form.prefs.label.mark_read_on_view": "देखे जाने पर स्वचालित रूप से प्रविष्टियों को पढ़ने के रूप में चिह्नित करें",
"form.import.label.file": "ओपीएमएल फ़ाइल",
"form.import.label.url": "यूआरएल",
"form.integration.fever_activate": "फीवर एपीआई सक्रिय करें",
1 change: 1 addition & 0 deletions locale/translations/id_ID.json
Original file line number Diff line number Diff line change
@@ -319,6 +319,7 @@
"form.prefs.label.entry_order": "Pengurutan Kolom Entri",
"form.prefs.label.default_home_page": "Beranda Baku",
"form.prefs.label.categories_sorting_order": "Pengurutan Kategori",
"form.prefs.label.mark_read_on_view": "Secara otomatis menandai entri sebagai telah dibaca saat dilihat",
"form.import.label.file": "Berkas OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Aktifkan API Fever",
1 change: 1 addition & 0 deletions locale/translations/it_IT.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Colonna di ordinamento delle voci",
"form.prefs.label.default_home_page": "Pagina iniziale predefinita",
"form.prefs.label.categories_sorting_order": "Ordinamento delle categorie",
"form.prefs.label.mark_read_on_view": "Contrassegna automaticamente le voci come lette quando visualizzate",
"form.import.label.file": "File OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Abilita l'API di Fever",
1 change: 1 addition & 0 deletions locale/translations/ja_JP.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "記事の表示順の基準",
"form.prefs.label.default_home_page": "デフォルトのトップページ",
"form.prefs.label.categories_sorting_order": "カテゴリの表示順",
"form.prefs.label.mark_read_on_view": "表示時にエントリを自動的に既読としてマークします",
"form.import.label.file": "OPML ファイル",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Fever API を有効にする",
1 change: 1 addition & 0 deletions locale/translations/nl_NL.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Ingang Sorteerkolom",
"form.prefs.label.default_home_page": "Standaard startpagina",
"form.prefs.label.categories_sorting_order": "Categorieën sorteren",
"form.prefs.label.mark_read_on_view": "Items automatisch markeren als gelezen wanneer ze worden bekeken",
"form.import.label.file": "OPML-bestand",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Activeer Fever API",
1 change: 1 addition & 0 deletions locale/translations/pl_PL.json
Original file line number Diff line number Diff line change
@@ -324,6 +324,7 @@
"form.prefs.label.entry_order": "Kolumna sortowania wpisów",
"form.prefs.label.default_home_page": "Domyślna strona główna",
"form.prefs.label.categories_sorting_order": "Sortowanie kategorii",
"form.prefs.label.mark_read_on_view": "Automatycznie oznaczaj wpisy jako przeczytane podczas przeglądania",
"form.import.label.file": "Plik OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Aktywuj Fever API",
1 change: 1 addition & 0 deletions locale/translations/pt_BR.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Coluna de Ordenação de Entrada",
"form.prefs.label.default_home_page": "Página inicial predefinida",
"form.prefs.label.categories_sorting_order": "Classificação das categorias",
"form.prefs.label.mark_read_on_view": "Marcar automaticamente as entradas como lidas quando visualizadas",
"form.import.label.file": "Arquivo OPML",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Ativar API do Fever",
1 change: 1 addition & 0 deletions locale/translations/ru_RU.json
Original file line number Diff line number Diff line change
@@ -324,6 +324,7 @@
"form.prefs.label.entry_order": "Столбец сортировки статей",
"form.prefs.label.default_home_page": "Домашняя страница по умолчанию",
"form.prefs.label.categories_sorting_order": "Сортировка категорий",
"form.prefs.label.mark_read_on_view": "Автоматически отмечать записи как прочитанные при просмотре",
"form.import.label.file": "OPML файл",
"form.import.label.url": "Ссылка",
"form.integration.fever_activate": "Активировать Fever API",
1 change: 1 addition & 0 deletions locale/translations/tr_TR.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "Giriş Sıralama Sütunu",
"form.prefs.label.default_home_page": "Varsayılan ana sayfa",
"form.prefs.label.categories_sorting_order": "Kategoriler sıralama",
"form.prefs.label.mark_read_on_view": "Girişleri görüntülendiğinde otomatik olarak okundu olarak işaretle",
"form.import.label.file": "OPML dosyası",
"form.import.label.url": "URL",
"form.integration.fever_activate": "Fever API'yi Etkinleştir",
1 change: 1 addition & 0 deletions locale/translations/uk_UA.json
Original file line number Diff line number Diff line change
@@ -321,6 +321,7 @@
"form.prefs.label.entry_order": "Стовпець сортування записів",
"form.prefs.label.default_home_page": "Домашня сторінка за умовчанням",
"form.prefs.label.categories_sorting_order": "Сортування за категоріями",
"form.prefs.label.mark_read_on_view": "Автоматично позначати записи як прочитані під час перегляду",
"form.import.label.file": "Файл OPML",
"form.import.label.url": "URL-адреса",
"form.integration.fever_activate": "Увімкнути API Fever",
1 change: 1 addition & 0 deletions locale/translations/zh_CN.json
Original file line number Diff line number Diff line change
@@ -320,6 +320,7 @@
"form.prefs.label.entry_order": "文章排序依据",
"form.prefs.label.default_home_page": "默认主页",
"form.prefs.label.categories_sorting_order": "分类排序",
"form.prefs.label.mark_read_on_view": "查看时自动将条目标记为已读",
"form.import.label.file": "OPML 文件",
"form.import.label.url": "URL",
"form.integration.fever_activate": "启用 Fever API",
1 change: 1 addition & 0 deletions locale/translations/zh_TW.json
Original file line number Diff line number Diff line change
@@ -322,6 +322,7 @@
"form.prefs.label.entry_order": "文章排序依據",
"form.prefs.label.default_home_page": "默認主頁",
"form.prefs.label.categories_sorting_order": "分類排序",
"form.prefs.label.mark_read_on_view": "查看時自動將條目標記為已讀",
"form.import.label.file": "OPML 檔案",
"form.import.label.url": "URL",
"form.integration.fever_activate": "啟用 Fever API",
6 changes: 6 additions & 0 deletions model/user.go
Original file line number Diff line number Diff line change
@@ -34,6 +34,7 @@ type User struct {
CJKReadingSpeed int `json:"cjk_reading_speed"`
DefaultHomePage string `json:"default_home_page"`
CategoriesSortingOrder string `json:"categories_sorting_order"`
MarkReadOnView bool `json:"mark_read_on_view"`
}

// UserCreationRequest represents the request to create a user.
@@ -68,6 +69,7 @@ type UserModificationRequest struct {
CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
}

// Patch updates the User object with the modification request.
@@ -155,6 +157,10 @@ func (u *UserModificationRequest) Patch(user *User) {
if u.CategoriesSortingOrder != nil {
user.CategoriesSortingOrder = *u.CategoriesSortingOrder
}

if u.MarkReadOnView != nil {
user.MarkReadOnView = *u.MarkReadOnView
}
}

// UseTimezone converts last login date to the given timezone.
39 changes: 26 additions & 13 deletions storage/user.go
Original file line number Diff line number Diff line change
@@ -86,10 +86,11 @@ func (s *Storage) CreateUser(userCreationRequest *model.UserCreationRequest) (*m
openid_connect_id,
display_mode,
entry_order,
default_reading_speed,
cjk_reading_speed,
default_home_page,
categories_sorting_order
default_reading_speed,
cjk_reading_speed,
default_home_page,
categories_sorting_order,
mark_read_on_view
`

tx, err := s.db.Begin()
@@ -127,6 +128,7 @@ func (s *Storage) CreateUser(userCreationRequest *model.UserCreationRequest) (*m
&user.CJKReadingSpeed,
&user.DefaultHomePage,
&user.CategoriesSortingOrder,
&user.MarkReadOnView,
)
if err != nil {
tx.Rollback()
@@ -182,9 +184,10 @@ func (s *Storage) UpdateUser(user *model.User) error {
default_reading_speed=$18,
cjk_reading_speed=$19,
default_home_page=$20,
categories_sorting_order=$21
categories_sorting_order=$21,
mark_read_on_view=$22
WHERE
id=$22
id=$23
`

_, err = s.db.Exec(
@@ -210,6 +213,7 @@ func (s *Storage) UpdateUser(user *model.User) error {
user.CJKReadingSpeed,
user.DefaultHomePage,
user.CategoriesSortingOrder,
user.MarkReadOnView,
user.ID,
)
if err != nil {
@@ -237,9 +241,10 @@ func (s *Storage) UpdateUser(user *model.User) error {
default_reading_speed=$17,
cjk_reading_speed=$18,
default_home_page=$19,
categories_sorting_order=$20
categories_sorting_order=$20,
mark_read_on_view=$21
WHERE
id=$21
id=$22
`

_, err := s.db.Exec(
@@ -264,6 +269,7 @@ func (s *Storage) UpdateUser(user *model.User) error {
user.CJKReadingSpeed,
user.DefaultHomePage,
user.CategoriesSortingOrder,
user.MarkReadOnView,
user.ID,
)

@@ -310,7 +316,8 @@ func (s *Storage) UserByID(userID int64) (*model.User, error) {
default_reading_speed,
cjk_reading_speed,
default_home_page,
categories_sorting_order
categories_sorting_order,
mark_read_on_view
FROM
users
WHERE
@@ -344,7 +351,8 @@ func (s *Storage) UserByUsername(username string) (*model.User, error) {
default_reading_speed,
cjk_reading_speed,
default_home_page,
categories_sorting_order
categories_sorting_order,
mark_read_on_view
FROM
users
WHERE
@@ -378,7 +386,8 @@ func (s *Storage) UserByField(field, value string) (*model.User, error) {
default_reading_speed,
cjk_reading_speed,
default_home_page,
categories_sorting_order
categories_sorting_order,
mark_read_on_view
FROM
users
WHERE
@@ -419,7 +428,8 @@ func (s *Storage) UserByAPIKey(token string) (*model.User, error) {
u.default_reading_speed,
u.cjk_reading_speed,
u.default_home_page,
u.categories_sorting_order
u.categories_sorting_order,
u.mark_read_on_view
FROM
users u
LEFT JOIN
@@ -455,6 +465,7 @@ func (s *Storage) fetchUser(query string, args ...interface{}) (*model.User, err
&user.CJKReadingSpeed,
&user.DefaultHomePage,
&user.CategoriesSortingOrder,
&user.MarkReadOnView,
)

if err == sql.ErrNoRows {
@@ -551,7 +562,8 @@ func (s *Storage) Users() (model.Users, error) {
default_reading_speed,
cjk_reading_speed,
default_home_page,
categories_sorting_order
categories_sorting_order,
mark_read_on_view
FROM
users
ORDER BY username ASC
@@ -588,6 +600,7 @@ func (s *Storage) Users() (model.Users, error) {
&user.CJKReadingSpeed,
&user.DefaultHomePage,
&user.CategoriesSortingOrder,
&user.MarkReadOnView,
)

if err != nil {
2 changes: 1 addition & 1 deletion template/templates/common/feed_list.html
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@
<div class="item-meta">
<ul class="item-meta-info">
<li class="item-meta-info-site-url" dir="auto">
<a href="{{ .SiteURL | safeURL }}" title="{{ .SiteURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer" data-original-link="true">{{ domain .SiteURL }}</a>
<a href="{{ .SiteURL | safeURL }}" title="{{ .SiteURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer" data-original-link="{{ $.user.MarkReadOnView }}">{{ domain .SiteURL }}</a>
</li>
<li class="item-meta-info-checked-at">
{{ t "page.feeds.last_check" }} <time datetime="{{ isodate .CheckedAt }}" title="{{ isodate .CheckedAt }}">{{ elapsed $.user.Timezone .CheckedAt }}</time>
2 changes: 1 addition & 1 deletion template/templates/common/item_meta.html
Original file line number Diff line number Diff line change
@@ -68,7 +68,7 @@
target="_blank"
rel="noopener noreferrer"
referrerpolicy="no-referrer"
data-original-link="true">{{ icon "external-link" }}<span class="icon-label">{{ t "entry.external_link.label" }}</span></a>
data-original-link="{{ .user.MarkReadOnView }}">{{ icon "external-link" }}<span class="icon-label">{{ t "entry.external_link.label" }}</span></a>
</li>
{{ if .entry.CommentsURL }}
<li class="item-meta-icons-comments">
2 changes: 1 addition & 1 deletion template/templates/views/entry.html
Original file line number Diff line number Diff line change
@@ -72,7 +72,7 @@ <h1 dir="auto">
target="_blank"
rel="noopener noreferrer"
referrerpolicy="no-referrer"
data-original-link="true">{{ icon "external-link" }}<span class="icon-label">{{ t "entry.external_link.label" }}</span></a>
data-original-link="{{ .user.MarkReadOnView }}">{{ icon "external-link" }}<span class="icon-label">{{ t "entry.external_link.label" }}</span></a>
</li>
<li>
<a href="#"
2 changes: 1 addition & 1 deletion template/templates/views/feed_entries.html
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
{{ define "content"}}
<section class="page-header">
<h1 dir="auto">
<a href="{{ .feed.SiteURL | safeURL }}" title="{{ .feed.SiteURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer" data-original-link="true">{{ .feed.Title }}</a>
<a href="{{ .feed.SiteURL | safeURL }}" title="{{ .feed.SiteURL }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer" data-original-link="{{ .user.MarkReadOnView }}">{{ .feed.Title }}</a>
({{ .total }})
</h1>
<ul>
2 changes: 2 additions & 0 deletions template/templates/views/settings.html
Original file line number Diff line number Diff line change
@@ -99,6 +99,8 @@ <h1>{{ t "page.settings.title" }}</h1>

<label><input type="checkbox" name="show_reading_time" value="1" {{ if .form.ShowReadingTime }}checked{{ end }}> {{ t "form.prefs.label.show_reading_time" }}</label>

<label><input type="checkbox" name="mark_read_on_view" value="1" {{ if .form.MarkReadOnView }}checked{{ end }}> {{ t "form.prefs.label.mark_read_on_view" }}</label>

<label for="form-cjk-reading-speed">{{ t "form.prefs.label.cjk_reading_speed" }}</label>
<input type="number" name="cjk_reading_speed" id="form-cjk-reading-speed" value="{{ .form.CJKReadingSpeed }}" min="1">

2 changes: 1 addition & 1 deletion ui/entry_bookmark.go
Original file line number Diff line number Diff line change
@@ -38,7 +38,7 @@ func (h *handler) showStarredEntryPage(w http.ResponseWriter, r *http.Request) {
return
}

if entry.Status == model.EntryStatusUnread {
if user.MarkReadOnView && entry.Status == model.EntryStatusUnread {
err = h.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead)
if err != nil {
html.ServerError(w, r, err)
2 changes: 1 addition & 1 deletion ui/entry_category.go
Original file line number Diff line number Diff line change
@@ -41,7 +41,7 @@ func (h *handler) showCategoryEntryPage(w http.ResponseWriter, r *http.Request)
return
}

if entry.Status == model.EntryStatusUnread {
if user.MarkReadOnView && entry.Status == model.EntryStatusUnread {
err = h.store.SetEntriesStatus(user.ID, []int64{entry.ID}, model.EntryStatusRead)
if err != nil {
html.ServerError(w, r, err)
Loading

0 comments on commit 09f21a8

Please sign in to comment.