From 356d32c6fe2b17e8ecae19047b455d8998d9760d Mon Sep 17 00:00:00 2001 From: xl Date: Fri, 17 Mar 2023 21:56:17 +0800 Subject: [PATCH] Add user setting for marking entry as read on view --- client/model.go | 2 ++ database/migrations.go | 5 +++ locale/translations/de_DE.json | 1 + locale/translations/el_EL.json | 1 + locale/translations/en_US.json | 1 + locale/translations/es_ES.json | 1 + locale/translations/fi_FI.json | 1 + locale/translations/fr_FR.json | 1 + locale/translations/hi_IN.json | 1 + locale/translations/id_ID.json | 1 + locale/translations/it_IT.json | 1 + locale/translations/ja_JP.json | 1 + locale/translations/nl_NL.json | 1 + locale/translations/pl_PL.json | 1 + locale/translations/pt_BR.json | 1 + locale/translations/ru_RU.json | 1 + locale/translations/tr_TR.json | 1 + locale/translations/uk_UA.json | 1 + locale/translations/zh_CN.json | 1 + locale/translations/zh_TW.json | 1 + model/user.go | 6 ++++ storage/user.go | 39 ++++++++++++++-------- template/templates/common/feed_list.html | 2 +- template/templates/common/item_meta.html | 2 +- template/templates/views/entry.html | 2 +- template/templates/views/feed_entries.html | 2 +- template/templates/views/settings.html | 2 ++ ui/entry_bookmark.go | 2 +- ui/entry_category.go | 2 +- ui/entry_feed.go | 2 +- ui/entry_search.go | 2 +- ui/entry_unread.go | 17 ++++++---- ui/form/settings.go | 3 ++ ui/settings_show.go | 1 + ui/static/js/bootstrap.js | 4 +-- 35 files changed, 84 insertions(+), 29 deletions(-) diff --git a/client/model.go b/client/model.go index e544c832..6d1209ba 100644 --- a/client/model.go +++ b/client/model.go @@ -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. diff --git a/database/migrations.go b/database/migrations.go index 55f80529..d4ebb55d 100644 --- a/database/migrations.go +++ b/database/migrations.go @@ -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 + }, } diff --git a/locale/translations/de_DE.json b/locale/translations/de_DE.json index c6bf9bdd..5a001d4e 100644 --- a/locale/translations/de_DE.json +++ b/locale/translations/de_DE.json @@ -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", diff --git a/locale/translations/el_EL.json b/locale/translations/el_EL.json index ffed2d12..acfca611 100644 --- a/locale/translations/el_EL.json +++ b/locale/translations/el_EL.json @@ -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", diff --git a/locale/translations/en_US.json b/locale/translations/en_US.json index 414c23f5..0d5e0350 100644 --- a/locale/translations/en_US.json +++ b/locale/translations/en_US.json @@ -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", diff --git a/locale/translations/es_ES.json b/locale/translations/es_ES.json index 30dbd914..d1b9fcc5 100644 --- a/locale/translations/es_ES.json +++ b/locale/translations/es_ES.json @@ -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", diff --git a/locale/translations/fi_FI.json b/locale/translations/fi_FI.json index 42b277d9..554fe014 100644 --- a/locale/translations/fi_FI.json +++ b/locale/translations/fi_FI.json @@ -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", diff --git a/locale/translations/fr_FR.json b/locale/translations/fr_FR.json index 0ff76fa7..13b5481b 100644 --- a/locale/translations/fr_FR.json +++ b/locale/translations/fr_FR.json @@ -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", diff --git a/locale/translations/hi_IN.json b/locale/translations/hi_IN.json index 82514b35..dbe6107d 100644 --- a/locale/translations/hi_IN.json +++ b/locale/translations/hi_IN.json @@ -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": "फीवर एपीआई सक्रिय करें", diff --git a/locale/translations/id_ID.json b/locale/translations/id_ID.json index 35c7c0ce..3fa277fb 100644 --- a/locale/translations/id_ID.json +++ b/locale/translations/id_ID.json @@ -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", diff --git a/locale/translations/it_IT.json b/locale/translations/it_IT.json index e3121855..31876b79 100644 --- a/locale/translations/it_IT.json +++ b/locale/translations/it_IT.json @@ -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", diff --git a/locale/translations/ja_JP.json b/locale/translations/ja_JP.json index 751f9aab..4d4ba130 100644 --- a/locale/translations/ja_JP.json +++ b/locale/translations/ja_JP.json @@ -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 を有効にする", diff --git a/locale/translations/nl_NL.json b/locale/translations/nl_NL.json index 4d74b6cf..102d1359 100644 --- a/locale/translations/nl_NL.json +++ b/locale/translations/nl_NL.json @@ -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", diff --git a/locale/translations/pl_PL.json b/locale/translations/pl_PL.json index 5df0bd10..d22775bf 100644 --- a/locale/translations/pl_PL.json +++ b/locale/translations/pl_PL.json @@ -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", diff --git a/locale/translations/pt_BR.json b/locale/translations/pt_BR.json index c7a500e9..ac8b2059 100644 --- a/locale/translations/pt_BR.json +++ b/locale/translations/pt_BR.json @@ -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", diff --git a/locale/translations/ru_RU.json b/locale/translations/ru_RU.json index 0247e81e..7df14c03 100644 --- a/locale/translations/ru_RU.json +++ b/locale/translations/ru_RU.json @@ -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", diff --git a/locale/translations/tr_TR.json b/locale/translations/tr_TR.json index 97bd613d..78cbdbe9 100644 --- a/locale/translations/tr_TR.json +++ b/locale/translations/tr_TR.json @@ -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", diff --git a/locale/translations/uk_UA.json b/locale/translations/uk_UA.json index 50ed751b..4e06b6e5 100644 --- a/locale/translations/uk_UA.json +++ b/locale/translations/uk_UA.json @@ -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", diff --git a/locale/translations/zh_CN.json b/locale/translations/zh_CN.json index 46ffdfda..e333885e 100644 --- a/locale/translations/zh_CN.json +++ b/locale/translations/zh_CN.json @@ -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", diff --git a/locale/translations/zh_TW.json b/locale/translations/zh_TW.json index 34c90e44..1ef1e2b1 100644 --- a/locale/translations/zh_TW.json +++ b/locale/translations/zh_TW.json @@ -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", diff --git a/model/user.go b/model/user.go index 19fbf612..235827f4 100644 --- a/model/user.go +++ b/model/user.go @@ -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. diff --git a/storage/user.go b/storage/user.go index a3ff2715..5e20cee4 100644 --- a/storage/user.go +++ b/storage/user.go @@ -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 { diff --git a/template/templates/common/feed_list.html b/template/templates/common/feed_list.html index 906385fe..b41bcfbe 100644 --- a/template/templates/common/feed_list.html +++ b/template/templates/common/feed_list.html @@ -20,7 +20,7 @@