Merge branch 'Hubcapp-master'

This commit is contained in:
Athou
2016-09-23 08:54:18 +02:00
36 changed files with 111 additions and 17 deletions

View File

@@ -41,6 +41,7 @@
"refresh" : "إعادة انعاش", "refresh" : "إعادة انعاش",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "الترتيب حسب التاريخ تصاعدي / تنازلي", "sort_by_asc_desc" : "الترتيب حسب التاريخ تصاعدي / تنازلي",
"sort_by_abc_zyx" : "Sort alphabetically",
"titles_only" : "العناوين فقط", "titles_only" : "العناوين فقط",
"expanded_view" : "عرض موسع", "expanded_view" : "عرض موسع",
"mark_all_as_read" : "اعتبر الكل مقروء", "mark_all_as_read" : "اعتبر الكل مقروء",

View File

@@ -41,6 +41,7 @@
"refresh" : "Actualitzar", "refresh" : "Actualitzar",
"refresh_all" : "Força l'actualització de tots els canals", "refresh_all" : "Força l'actualització de tots els canals",
"sort_by_asc_desc" : "Ordenar per data asc/desc", "sort_by_asc_desc" : "Ordenar per data asc/desc",
"sort_by_abc_zyx" : "Sort alphabetically",
"titles_only" : "Només títols", "titles_only" : "Només títols",
"expanded_view" : "Vista ampliada", "expanded_view" : "Vista ampliada",
"mark_all_as_read" : "Marcar tots llegits", "mark_all_as_read" : "Marcar tots llegits",

View File

@@ -41,6 +41,7 @@
"refresh " : " Obnovit", "refresh " : " Obnovit",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc " : " Seřadit podle nejnovějšího/nejstaršího", "sort_by_asc_desc " : " Seřadit podle nejnovějšího/nejstaršího",
"sort_by_abc_zyx" : "Sort alphabetically",
"titles_only " : " Zobrazit jenom titulky", "titles_only " : " Zobrazit jenom titulky",
"expanded_view " : " Rozšířený náhled", "expanded_view " : " Rozšířený náhled",
"mark_all_as_read " : " Označit vše jako přečtené", "mark_all_as_read " : " Označit vše jako přečtené",

View File

@@ -41,6 +41,7 @@
"refresh" : "Adnewyddu", "refresh" : "Adnewyddu",
"refresh_all" : "Gorfodi ail-lwytho pob ffrwd", "refresh_all" : "Gorfodi ail-lwytho pob ffrwd",
"sort_by_asc_desc" : "Trefnu yn ôl dyddiad", "sort_by_asc_desc" : "Trefnu yn ôl dyddiad",
"sort_by_abc_zyx" : "Sort alphabetically",
"titles_only" : "Teitlau yn unig", "titles_only" : "Teitlau yn unig",
"expanded_view" : "Golwg estynedig", "expanded_view" : "Golwg estynedig",
"mark_all_as_read" : "Nodi'r cyfan fel wedi ei ddarllen", "mark_all_as_read" : "Nodi'r cyfan fel wedi ei ddarllen",

View File

@@ -41,6 +41,7 @@
"refresh" : "Opdater", "refresh" : "Opdater",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Sorter efter dato ny/gammel", "sort_by_asc_desc" : "Sorter efter dato ny/gammel",
"sort_by_abc_zyx" : "Sort alphabetically",
"titles_only" : "Kun titler", "titles_only" : "Kun titler",
"expanded_view" : "Udvidet visning", "expanded_view" : "Udvidet visning",
"mark_all_as_read" : "Marker alle som læst", "mark_all_as_read" : "Marker alle som læst",

View File

@@ -41,6 +41,7 @@
"refresh" : "Aktualisieren", "refresh" : "Aktualisieren",
"refresh_all" : "Erzwinge Aktualisierung aller Feeds", "refresh_all" : "Erzwinge Aktualisierung aller Feeds",
"sort_by_asc_desc" : "Nach Datum sortieren (auf-/absteigend)", "sort_by_asc_desc" : "Nach Datum sortieren (auf-/absteigend)",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Nur Überschriften", "titles_only" : "Nur Überschriften",
"expanded_view" : "Ausgedehnte Ansicht", "expanded_view" : "Ausgedehnte Ansicht",
"mark_all_as_read" : "Alle Artikel als gelesen markieren", "mark_all_as_read" : "Alle Artikel als gelesen markieren",

View File

@@ -41,6 +41,7 @@
"refresh" : "Refresh", "refresh" : "Refresh",
"refresh_all" : "Force refresh all my feeds", "refresh_all" : "Force refresh all my feeds",
"sort_by_asc_desc" : "Sort by date asc/desc", "sort_by_asc_desc" : "Sort by date asc/desc",
"sort_by_abc_zyx" : "Sort alphabetically",
"titles_only" : "Titles only", "titles_only" : "Titles only",
"expanded_view" : "Expanded view", "expanded_view" : "Expanded view",
"mark_all_as_read" : "Mark all as read", "mark_all_as_read" : "Mark all as read",

View File

@@ -43,6 +43,7 @@
"refresh" : "Atualizar", "refresh" : "Atualizar",
"refresh_all" : "Forzar la actualización de todos mis canales.", "refresh_all" : "Forzar la actualización de todos mis canales.",
"sort_by_asc_desc" : "Ordenar por fecha asc/desc.", "sort_by_asc_desc" : "Ordenar por fecha asc/desc.",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Sólo títulos", "titles_only" : "Sólo títulos",
"expanded_view" : "Vista expandida", "expanded_view" : "Vista expandida",
"mark_all_as_read" : "Marcar todos como leído", "mark_all_as_read" : "Marcar todos como leído",

View File

@@ -41,6 +41,7 @@
"refresh" : "تازه‌سازی", "refresh" : "تازه‌سازی",
"refresh_all" : "مجبورکردن تازه‌سازی همهٔ خوراک‌ها", "refresh_all" : "مجبورکردن تازه‌سازی همهٔ خوراک‌ها",
"sort_by_asc_desc" : "مرتب‌کردن بر اساس تاریخ به‌صورت صعودی/نزولی", "sort_by_asc_desc" : "مرتب‌کردن بر اساس تاریخ به‌صورت صعودی/نزولی",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "فقط عنوان‌ها", "titles_only" : "فقط عنوان‌ها",
"expanded_view" : "نمای گسترش‌یافته", "expanded_view" : "نمای گسترش‌یافته",
"mark_all_as_read" : "علامت‌گذاری تمامی مطالب به‌عنوان خوانده‌شده", "mark_all_as_read" : "علامت‌گذاری تمامی مطالب به‌عنوان خوانده‌شده",

View File

@@ -41,6 +41,7 @@
"refresh" : "Päivitä", "refresh" : "Päivitä",
"refresh_all" : "Pakota kaikkien syötteiden päivitys", "refresh_all" : "Pakota kaikkien syötteiden päivitys",
"sort_by_asc_desc" : "Järjestä päivämäärän mukaan nousevasti/laskevasti", "sort_by_asc_desc" : "Järjestä päivämäärän mukaan nousevasti/laskevasti",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Näytä vain otsikot", "titles_only" : "Näytä vain otsikot",
"expanded_view" : "Laajennettu näkymä", "expanded_view" : "Laajennettu näkymä",
"mark_all_as_read" : "Merkitse kaikki luetuiksi", "mark_all_as_read" : "Merkitse kaikki luetuiksi",

View File

@@ -41,6 +41,7 @@
"refresh" : "Rafraîchir", "refresh" : "Rafraîchir",
"refresh_all" : "Rafraîchir tous les flux", "refresh_all" : "Rafraîchir tous les flux",
"sort_by_asc_desc" : "Trier par date croissante/décroissante", "sort_by_asc_desc" : "Trier par date croissante/décroissante",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Titres uniquement", "titles_only" : "Titres uniquement",
"expanded_view" : "Vue étendue", "expanded_view" : "Vue étendue",
"mark_all_as_read" : "Tout marquer comme lu", "mark_all_as_read" : "Tout marquer comme lu",

View File

@@ -41,6 +41,7 @@
"refresh" : "Actualizar", "refresh" : "Actualizar",
"refresh_all" : "Forzar a actualización de todas as fontes ", "refresh_all" : "Forzar a actualización de todas as fontes ",
"sort_by_asc_desc" : "Ordenar por data asc/desc", "sort_by_asc_desc" : "Ordenar por data asc/desc",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Só títulos", "titles_only" : "Só títulos",
"expanded_view" : "Vista expandida", "expanded_view" : "Vista expandida",
"mark_all_as_read" : "Marcar todos como lidos", "mark_all_as_read" : "Marcar todos como lidos",

View File

@@ -41,6 +41,7 @@
"refresh" : "واج‌أری", "refresh" : "واج‌أری",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "تاریخˇ سر دچئن", "sort_by_asc_desc" : "تاریخˇ سر دچئن",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "خالی تیتران", "titles_only" : "خالی تیتران",
"expanded_view" : "واشاده نما", "expanded_view" : "واشاده نما",
"mark_all_as_read" : "همه‌ته مطالبه چاکون بخانده", "mark_all_as_read" : "همه‌ته مطالبه چاکون بخانده",

View File

@@ -41,6 +41,7 @@
"refresh" : "Frissítés", "refresh" : "Frissítés",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Rendezés időrend szerint", "sort_by_asc_desc" : "Rendezés időrend szerint",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Csak cím", "titles_only" : "Csak cím",
"expanded_view" : "Részletes nézet", "expanded_view" : "Részletes nézet",
"mark_all_as_read" : "Az összes megjelölése olvasottként", "mark_all_as_read" : "Az összes megjelölése olvasottként",

View File

@@ -41,6 +41,7 @@
"refresh" : "Segarkan", "refresh" : "Segarkan",
"refresh_all" : "Memaksa menyegarkan semua umpan saya", "refresh_all" : "Memaksa menyegarkan semua umpan saya",
"sort_by_asc_desc" : "Urutkan menurut tanggal asc/desc", "sort_by_asc_desc" : "Urutkan menurut tanggal asc/desc",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Hanya Judul", "titles_only" : "Hanya Judul",
"expanded_view" : "Penglihatan diperluas", "expanded_view" : "Penglihatan diperluas",
"mark_all_as_read" : "Tandai semua sebagai telah dibaca", "mark_all_as_read" : "Tandai semua sebagai telah dibaca",

View File

@@ -41,6 +41,7 @@
"refresh" : "Aggiorna", "refresh" : "Aggiorna",
"refresh_all" : "Forza l'aggiornamento di tutti i feed", "refresh_all" : "Forza l'aggiornamento di tutti i feed",
"sort_by_asc_desc" : "Ordina per data crescente/decrescente", "sort_by_asc_desc" : "Ordina per data crescente/decrescente",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Solo i titoli", "titles_only" : "Solo i titoli",
"expanded_view" : "Espandi", "expanded_view" : "Espandi",
"mark_all_as_read" : "Segna tutti come già letti", "mark_all_as_read" : "Segna tutti come già letti",

View File

@@ -41,6 +41,7 @@
"refresh" : "更新", "refresh" : "更新",
"refresh_all" : "全てのフィードを更新", "refresh_all" : "全てのフィードを更新",
"sort_by_asc_desc" : "昇順/降順にソート", "sort_by_asc_desc" : "昇順/降順にソート",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "タイトルのみ", "titles_only" : "タイトルのみ",
"expanded_view" : "拡張ビュー", "expanded_view" : "拡張ビュー",
"mark_all_as_read" : "全て既読にする", "mark_all_as_read" : "全て既読にする",

View File

@@ -41,6 +41,7 @@
"refresh" : "새로고침", "refresh" : "새로고침",
"refresh_all" : "모든 피드를 강제로 새로고침", "refresh_all" : "모든 피드를 강제로 새로고침",
"sort_by_asc_desc" : "날짜별 오름차/내림차순 정렬", "sort_by_asc_desc" : "날짜별 오름차/내림차순 정렬",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "제목만 표시하기", "titles_only" : "제목만 표시하기",
"expanded_view" : "Expanded View", "expanded_view" : "Expanded View",
"mark_all_as_read" : "읽음으로 표시", "mark_all_as_read" : "읽음으로 표시",

View File

@@ -41,6 +41,7 @@
"refresh" : "Refresh", "refresh" : "Refresh",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Aturkan mengikut tarikh (baru/lama)", "sort_by_asc_desc" : "Aturkan mengikut tarikh (baru/lama)",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Tajuk sahaja", "titles_only" : "Tajuk sahaja",
"expanded_view" : "Wide view", "expanded_view" : "Wide view",
"mark_all_as_read" : "Tanda kesemuanya telah dibaca", "mark_all_as_read" : "Tanda kesemuanya telah dibaca",

View File

@@ -41,6 +41,7 @@
"refresh" : "Oppdater", "refresh" : "Oppdater",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Sorter etter dato ny/gammel", "sort_by_asc_desc" : "Sorter etter dato ny/gammel",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Kun titler", "titles_only" : "Kun titler",
"expanded_view" : "Utvidet visning", "expanded_view" : "Utvidet visning",
"mark_all_as_read" : "Merk alle som lest", "mark_all_as_read" : "Merk alle som lest",

View File

@@ -41,6 +41,7 @@
"refresh" : "Vernieuwen", "refresh" : "Vernieuwen",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Sorteer op datum opl/afl", "sort_by_asc_desc" : "Sorteer op datum opl/afl",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Alleen titels", "titles_only" : "Alleen titels",
"expanded_view" : "Uitgebreide weergave", "expanded_view" : "Uitgebreide weergave",
"mark_all_as_read" : "Markeer alles als gelezen", "mark_all_as_read" : "Markeer alles als gelezen",

View File

@@ -41,6 +41,7 @@
"refresh" : "Oppdater", "refresh" : "Oppdater",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Sorter etter dato ny/gamal", "sort_by_asc_desc" : "Sorter etter dato ny/gamal",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Berre titlar", "titles_only" : "Berre titlar",
"expanded_view" : "Utvida visning", "expanded_view" : "Utvida visning",
"mark_all_as_read" : "Merk alle som lesne", "mark_all_as_read" : "Merk alle som lesne",

View File

@@ -41,6 +41,7 @@
"refresh" : "Odswież", "refresh" : "Odswież",
"refresh_all" : "Force refresh all my feeds ", "refresh_all" : "Force refresh all my feeds ",
"sort_by_asc_desc" : "Sortuj od najnowszego/najstarszego", "sort_by_asc_desc" : "Sortuj od najnowszego/najstarszego",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Widok listy", "titles_only" : "Widok listy",
"expanded_view" : "Widok rozwinięty", "expanded_view" : "Widok rozwinięty",
"mark_all_as_read" : "Oznacz wszystko jako przeczytane", "mark_all_as_read" : "Oznacz wszystko jako przeczytane",

View File

@@ -41,6 +41,7 @@
"refresh" : "Atualizar", "refresh" : "Atualizar",
"refresh_all" : "Forçar atualização de todos os meus feeds", "refresh_all" : "Forçar atualização de todos os meus feeds",
"sort_by_asc_desc" : "Ordenar por data cresc/decres", "sort_by_asc_desc" : "Ordenar por data cresc/decres",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Somente títulos", "titles_only" : "Somente títulos",
"expanded_view" : "Modo Expandido", "expanded_view" : "Modo Expandido",
"mark_all_as_read" : "Marcar tudo como lido", "mark_all_as_read" : "Marcar tudo como lido",

View File

@@ -41,6 +41,7 @@
"refresh" : "Обновить", "refresh" : "Обновить",
"refresh_all" : "Обновить все подписки вручную", "refresh_all" : "Обновить все подписки вручную",
"sort_by_asc_desc" : "Сначала новые/старые", "sort_by_asc_desc" : "Сначала новые/старые",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Только заголовки", "titles_only" : "Только заголовки",
"expanded_view" : "Развёрнутый вид", "expanded_view" : "Развёрнутый вид",
"mark_all_as_read" : "Отметить всё как прочитанное", "mark_all_as_read" : "Отметить всё как прочитанное",

View File

@@ -41,6 +41,7 @@
"refresh" : "Obnoviť", "refresh" : "Obnoviť",
"refresh_all" : "Vynútené obnovenie všetkých položiek", "refresh_all" : "Vynútené obnovenie všetkých položiek",
"sort_by_asc_desc" : "Zoradiť podľa najnovšieho/najstaršieho", "sort_by_asc_desc" : "Zoradiť podľa najnovšieho/najstaršieho",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Náhľad titulkov", "titles_only" : "Náhľad titulkov",
"expanded_view" : "Rozšírený náhľad", "expanded_view" : "Rozšírený náhľad",
"mark_all_as_read" : "Označiť všetky ako prečítané", "mark_all_as_read" : "Označiť všetky ako prečítané",

View File

@@ -41,6 +41,7 @@
"refresh" : "Uppdatera", "refresh" : "Uppdatera",
"refresh_all" : "Tvinga uppdatering av alla prenumerationer", "refresh_all" : "Tvinga uppdatering av alla prenumerationer",
"sort_by_asc_desc" : "Sortera efter datum stigande/fallande", "sort_by_asc_desc" : "Sortera efter datum stigande/fallande",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Endast titlar", "titles_only" : "Endast titlar",
"expanded_view" : "Expanderad vy", "expanded_view" : "Expanderad vy",
"mark_all_as_read" : "Markera alla som lästa", "mark_all_as_read" : "Markera alla som lästa",

View File

@@ -41,6 +41,7 @@
"refresh" : "Yenile", "refresh" : "Yenile",
"refresh_all" : "Tüm yayınları yenilemek için zorla", "refresh_all" : "Tüm yayınları yenilemek için zorla",
"sort_by_asc_desc" : "Tarihe göre sırala artan/azalan", "sort_by_asc_desc" : "Tarihe göre sırala artan/azalan",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "Sadece başlıklar", "titles_only" : "Sadece başlıklar",
"expanded_view" : "Genişletilmiş görünüm", "expanded_view" : "Genişletilmiş görünüm",
"mark_all_as_read" : "Tümünü okundu işaretle", "mark_all_as_read" : "Tümünü okundu işaretle",

View File

@@ -41,6 +41,7 @@
"refresh" : "刷新", "refresh" : "刷新",
"refresh_all" : "刷新所有订阅", "refresh_all" : "刷新所有订阅",
"sort_by_asc_desc" : "按日期升序/降序排序", "sort_by_asc_desc" : "按日期升序/降序排序",
"sort_by_abc_zyx" : "Sort Alphabetically",
"titles_only" : "仅显示标题", "titles_only" : "仅显示标题",
"expanded_view" : "显示内容", "expanded_view" : "显示内容",
"mark_all_as_read" : "标记所有为已读", "mark_all_as_read" : "标记所有为已读",

View File

@@ -531,7 +531,11 @@ module.controller('ToolbarCtrl', [
$scope.toggleOrder = function() { $scope.toggleOrder = function() {
var settings = $scope.settingsService.settings; var settings = $scope.settingsService.settings;
settings.readingOrder = settings.readingOrder == 'asc' ? 'desc' : 'asc'; settings.readingOrder = settings.readingOrder == 'desc' ? 'asc' : 'desc';
};
$scope.toggleAbcOrder = function() {
var settings = $scope.settingsService.settings;
settings.readingOrder = settings.readingOrder == 'abc' ? 'zyx' : 'abc';
}; };
$scope.toAdmin = function() { $scope.toAdmin = function() {

View File

@@ -67,10 +67,14 @@
</div> </div>
<div class="btn-group" id="toolbar-read-order"> <div class="btn-group" id="toolbar-read-order">
<a type="button" class="btn btn-default" ng-click="toggleOrder()" title="{{ 'toolbar.sort_by_asc_desc' | translate }}"> <a type="button" class="btn btn-default" ng-click="toggleOrder()" title="{{ 'toolbar.sort_by_asc_desc' | translate }}"
ng-class="{'active' : settingsService.settings.readingOrder == 'asc' || settingsService.settings.readingOrder == 'desc'}">
<i <i
ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder == 'desc'}"></i> ng-class="{'icon-arrow-up' : settingsService.settings.readingOrder == 'asc', 'icon-arrow-down': settingsService.settings.readingOrder != 'asc'}"></i>
</a> </a>
<button type="button" class="btn btn-default" ng-click="toggleAbcOrder()" title="{{ 'toolbar.sort_by_abc_zyx' | translate }}"
ng-class="{'active' : settingsService.settings.readingOrder == 'abc' || settingsService.settings.readingOrder == 'zyx'}">{{ ((settingsService.settings.readingOrder == 'abc' || settingsService.settings.readingOrder == 'zyx') ? settingsService.settings.readingOrder.toUpperCase() : "ABC") }}
</button>
</div> </div>
<div class="btn-group" id="toolbar-read-view-settings"> <div class="btn-group" id="toolbar-read-view-settings">

View File

@@ -17,6 +17,7 @@ import com.commafeed.backend.FixedSizeSortedSet;
import com.commafeed.backend.feed.FeedEntryKeyword; import com.commafeed.backend.feed.FeedEntryKeyword;
import com.commafeed.backend.feed.FeedEntryKeyword.Mode; import com.commafeed.backend.feed.FeedEntryKeyword.Mode;
import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntry;
import com.commafeed.backend.model.FeedEntryContent;
import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedEntryStatus;
import com.commafeed.backend.model.FeedEntryTag; import com.commafeed.backend.model.FeedEntryTag;
import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.FeedSubscription;
@@ -67,6 +68,19 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
private static final Comparator<FeedEntryStatus> STATUS_COMPARATOR_ASC = Ordering.from(STATUS_COMPARATOR_DESC).reverse(); private static final Comparator<FeedEntryStatus> STATUS_COMPARATOR_ASC = Ordering.from(STATUS_COMPARATOR_DESC).reverse();
private static final Comparator<FeedEntryStatus> STATUS_COMPARATOR_ABC = new Comparator<FeedEntryStatus>() {
@Override
public int compare(FeedEntryStatus o1, FeedEntryStatus o2) {
CompareToBuilder builder = new CompareToBuilder();
builder.append(o1.getEntry().getContent().getTitle(), o2.getEntry().getContent().getTitle());
builder.append(o1.getId(), o2.getId());
return builder.toComparison();
}
};
private static final Comparator<FeedEntryStatus> STATUS_COMPARATOR_ZYX = Ordering.from(STATUS_COMPARATOR_ABC).reverse();
public FeedEntryStatus getStatus(User user, FeedSubscription sub, FeedEntry entry) { public FeedEntryStatus getStatus(User user, FeedSubscription sub, FeedEntry entry) {
List<FeedEntryStatus> statuses = query().selectFrom(status).where(status.entry.eq(entry), status.subscription.eq(sub)).fetch(); List<FeedEntryStatus> statuses = query().selectFrom(status).where(status.entry.eq(entry), status.subscription.eq(sub)).fetch();
FeedEntryStatus status = Iterables.getFirst(statuses, null); FeedEntryStatus status = Iterables.getFirst(statuses, null);
@@ -100,8 +114,12 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
if (order == ReadingOrder.asc) { if (order == ReadingOrder.asc) {
query.orderBy(status.entryUpdated.asc(), status.id.asc()); query.orderBy(status.entryUpdated.asc(), status.id.asc());
} else { } else if (order == ReadingOrder.desc){
query.orderBy(status.entryUpdated.desc(), status.id.desc()); query.orderBy(status.entryUpdated.desc(), status.id.desc());
} else if (order == ReadingOrder.abc) {
query.orderBy(status.entry.content.title.asc(), status.id.desc());
} else { //order == ReadingOrder.xyz
query.orderBy(status.entry.content.title.desc(), status.id.desc());
} }
query.offset(offset).limit(limit); query.offset(offset).limit(limit);
@@ -119,7 +137,7 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
} }
private HibernateQuery<FeedEntry> buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List<FeedEntryKeyword> keywords, private HibernateQuery<FeedEntry> buildQuery(User user, FeedSubscription sub, boolean unreadOnly, List<FeedEntryKeyword> keywords,
Date newerThan, int offset, int limit, ReadingOrder order, Date last, String tag) { Date newerThan, int offset, int limit, ReadingOrder order, FeedEntryStatus last, String tag) {
HibernateQuery<FeedEntry> query = query().selectFrom(entry).where(entry.feed.eq(sub.getFeed())); HibernateQuery<FeedEntry> query = query().selectFrom(entry).where(entry.feed.eq(sub.getFeed()));
@@ -163,17 +181,29 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
if (last != null) { if (last != null) {
if (order == ReadingOrder.desc) { if (order == ReadingOrder.desc) {
query.where(entry.updated.gt(last)); query.where(entry.updated.gt(last.getEntryUpdated()));
} else { } else if (order == ReadingOrder.asc) {
query.where(entry.updated.lt(last)); query.where(entry.updated.lt(last.getEntryUpdated()));
} else if (order == ReadingOrder.abc) {
query.join(entry.content, content);
query.where(content.title.lt(last.getEntry().getContent().getTitle()));
} else { //order == ReadingOrder.zyx
query.join(entry.content, content);
query.where(content.title.gt(last.getEntry().getContent().getTitle()));
} }
} else if (order != null && (order == ReadingOrder.abc || order == ReadingOrder.zyx)) {
query.join(entry.content, content);
} }
if (order != null) { if (order != null) {
if (order == ReadingOrder.asc) { if (order == ReadingOrder.asc) {
query.orderBy(entry.updated.asc(), entry.id.asc()); query.orderBy(entry.updated.asc(), entry.id.asc());
} else { } else if (order == ReadingOrder.desc) {
query.orderBy(entry.updated.desc(), entry.id.desc()); query.orderBy(entry.updated.desc(), entry.id.desc());
} else if (order == ReadingOrder.abc) {
query.orderBy(content.title.asc(), entry.id.asc());
} else { //order == ReadingOrder.zyx
query.orderBy(content.title.desc(), entry.id.desc());
} }
} }
if (offset > -1) { if (offset > -1) {
@@ -193,20 +223,36 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
List<FeedEntryKeyword> keywords, Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent, List<FeedEntryKeyword> keywords, Date newerThan, int offset, int limit, ReadingOrder order, boolean includeContent,
boolean onlyIds, String tag) { boolean onlyIds, String tag) {
int capacity = offset + limit; int capacity = offset + limit;
Comparator<FeedEntryStatus> comparator = order == ReadingOrder.desc ? STATUS_COMPARATOR_DESC : STATUS_COMPARATOR_ASC;
Comparator<FeedEntryStatus> comparator;
if (order == ReadingOrder.desc) {
comparator = STATUS_COMPARATOR_DESC;
} else if (order == ReadingOrder.abc) {
comparator = STATUS_COMPARATOR_ABC;
} else if (order == ReadingOrder.zyx) {
comparator = STATUS_COMPARATOR_ZYX;
} else {
comparator = STATUS_COMPARATOR_ASC;
}
FixedSizeSortedSet<FeedEntryStatus> set = new FixedSizeSortedSet<FeedEntryStatus>(capacity, comparator); FixedSizeSortedSet<FeedEntryStatus> set = new FixedSizeSortedSet<FeedEntryStatus>(capacity, comparator);
for (FeedSubscription sub : subs) { for (FeedSubscription sub : subs) {
Date last = (order != null && set.isFull()) ? set.last().getEntryUpdated() : null; FeedEntryStatus last = (order != null && set.isFull()) ? set.last() : null;
HibernateQuery<FeedEntry> query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag); HibernateQuery<FeedEntry> query = buildQuery(user, sub, unreadOnly, keywords, newerThan, -1, capacity, order, last, tag);
List<Tuple> tuples = query.select(entry.id, entry.updated, status.id).fetch(); List<Tuple> tuples = query.select(entry.id, entry.updated, status.id, entry.content.title).fetch();
for (Tuple tuple : tuples) { for (Tuple tuple : tuples) {
Long id = tuple.get(entry.id); Long id = tuple.get(entry.id);
Date updated = tuple.get(entry.updated); Date updated = tuple.get(entry.updated);
Long statusId = tuple.get(status.id); Long statusId = tuple.get(status.id);
FeedEntryContent content = new FeedEntryContent();
content.setTitle(tuple.get(entry.content.title));
FeedEntry entry = new FeedEntry(); FeedEntry entry = new FeedEntry();
entry.setId(id); entry.setId(id);
entry.setUpdated(updated); entry.setUpdated(updated);
entry.setContent(content);
FeedEntryStatus status = new FeedEntryStatus(); FeedEntryStatus status = new FeedEntryStatus();
status.setId(statusId); status.setId(statusId);

View File

@@ -27,7 +27,7 @@ public class UserSettings extends AbstractModel {
} }
public enum ReadingOrder { public enum ReadingOrder {
asc, desc asc, desc, abc, zyx
} }
public enum ViewMode { public enum ViewMode {

View File

@@ -103,7 +103,7 @@ public class CategoryREST {
@ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan,
@ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset,
@ApiParam(value = "limit for paging, default 20, maximum 1000") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "limit for paging, default 20, maximum 1000") @DefaultValue("20") @QueryParam("limit") int limit,
@ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam(value = "ordering", allowableValues = "asc,desc,abc,zyx") @QueryParam("order") @DefaultValue("desc") ReadingOrder order,
@ApiParam( @ApiParam(
value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords, value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords,
@ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds, @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds,

View File

@@ -141,7 +141,7 @@ public class FeedREST {
@ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan,
@ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset,
@ApiParam(value = "limit for paging, default 20, maximum 1000") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "limit for paging, default 20, maximum 1000") @DefaultValue("20") @QueryParam("limit") int limit,
@ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam(value = "ordering", allowableValues = "asc,desc,abc,zyx") @QueryParam("order") @DefaultValue("desc") ReadingOrder order,
@ApiParam( @ApiParam(
value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords, value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords,
@ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds) { @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds) {

View File

@@ -61,7 +61,18 @@ public class NextUnreadServlet extends HttpServlet {
return; return;
} }
final ReadingOrder order = StringUtils.equals(orderParam, "asc") ? ReadingOrder.asc : ReadingOrder.desc; final ReadingOrder order = (StringUtils.equals(orderParam, "asc") ?
ReadingOrder.asc :
(
StringUtils.equals(orderParam, "desc") ?
ReadingOrder.desc :
(
StringUtils.equals(orderParam, "abc") ?
ReadingOrder.abc :
(ReadingOrder.zyx)
)
)
);
FeedEntryStatus status = UnitOfWork.call(sessionFactory, () -> { FeedEntryStatus status = UnitOfWork.call(sessionFactory, () -> {
FeedEntryStatus s = null; FeedEntryStatus s = null;