Fix labels in anonymous mode (#5650)

* Fix labels in anonymous mode
fix https://github.com/FreshRSS/FreshRSS/issues/4305

* Show all tags

* Revert "Show all tags"

This reverts commit 24dfba5017.

* Add message when no labels

* fixed no label style

* i18n de translation

* Fix in non-anomymous mode

* No class in anonymous mode

---------

Co-authored-by: maTh <1645099+math-GH@users.noreply.github.com>
Co-authored-by: math-gh <>
This commit is contained in:
authored and GitHub committed 2023-09-14 20:23:33 +02:00
1 parent 52d87c3eaa
commit bc5666cd27
31 files changed
+123 -31

No files matched your search

+18 -3
View File
@@ -17,9 +17,6 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
* underlying framework.
*/
public function firstAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
Minz_Error::error(403);
}
// If ajax request, we do not print layout
$this->ajax = Minz_Request::paramBoolean('ajax');
if ($this->ajax) {
@@ -32,6 +29,9 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
* This action adds (checked=true) or removes (checked=false) a tag to an entry.
*/
public function tagEntryAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
Minz_Error::error(403);
}
if (Minz_Request::isPost()) {
$id_tag = Minz_Request::paramInt('id_tag');
$name_tag = Minz_Request::paramString('name_tag');
@@ -64,6 +64,9 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
}
public function deleteAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
Minz_Error::error(403);
}
if (Minz_Request::isPost()) {
$id_tag = Minz_Request::paramInt('id_tag');
if ($id_tag !== 0) {
@@ -82,6 +85,9 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
}
public function getTagsForEntryAction(): void {
if (!FreshRSS_Auth::hasAccess() && !FreshRSS_Context::$system_conf->allow_anonymous) {
Minz_Error::error(403);
}
$this->view->_layout(null);
header('Content-Type: application/json; charset=UTF-8');
header('Cache-Control: private, no-cache, no-store, must-revalidate');
@@ -91,6 +97,9 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
}
public function addAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
Minz_Error::error(403);
}
if (!Minz_Request::isPost()) {
Minz_Error::error(405);
}
@@ -110,6 +119,9 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
* @throws Minz_PDOConnectionException|JsonException
*/
public function renameAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
Minz_Error::error(403);
}
if (!Minz_Request::isPost()) {
Minz_Error::error(405);
}
@@ -139,6 +151,9 @@ class FreshRSS_tag_Controller extends FreshRSS_ActionController {
}
public function indexAction(): void {
if (!FreshRSS_Auth::hasAccess()) {
Minz_Error::error(403);
}
$tagDAO = FreshRSS_Factory::createTagDao();
$this->view->tags = $tagDAO->listTags() ?: [];
}
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Požadavek selhal, to může být způsobeno problémy s připojení k internetu.',
'title_new_articles' => 'FreshRSS: nové články!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Jsou dostupné nové články, klikněte pro obnovení stránky.',
'should_be_activated' => 'JavaScript musí být povolen',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Eine Anfrage ist fehlgeschlagen, dies könnte durch Probleme mit der Internetverbindung verursacht worden sein.',
'title_new_articles' => 'FreshRSS: neue Artikel!',
),
'labels_empty' => 'Keine Labels',
'new_article' => 'Es gibt neue verfügbare Artikel. Klicken Sie, um die Seite zu aktualisieren.',
'should_be_activated' => 'JavaScript muss aktiviert sein',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'A request has failed, it may have been caused by internet connection problems.', // TODO
'title_new_articles' => 'FreshRSS: new articles!', // TODO
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'There are new articles available, click to refresh the page.', // TODO
'should_be_activated' => 'JavaScript must be enabled', // TODO
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'A request has failed, it may have been caused by internet connection problems.', // IGNORE
'title_new_articles' => 'FreshRSS: new articles!', // IGNORE
),
'labels_empty' => 'No labels', // IGNORE
'new_article' => 'There are new articles available, click to refresh the page.', // IGNORE
'should_be_activated' => 'JavaScript must be enabled', // IGNORE
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'A request has failed, it may have been caused by internet connection problems.',
'title_new_articles' => 'FreshRSS: new articles!',
),
'labels_empty' => 'No labels',
'new_article' => 'There are new articles available, click to refresh the page.',
'should_be_activated' => 'JavaScript must be enabled',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'La petición ha fallado. Puede ser debido a problemas de conexión a internet.',
'title_new_articles' => 'FreshRSS: ¡Nuevos artículos!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Hay nuevos artículos disponibles. Pincha para refrescar la página.',
'should_be_activated' => 'JavaScript debe estar activado',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => ' یک درخواست شکست خورده است',
'title_new_articles' => ' FreshRSS: مقالات جدید!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'مقالات جدیدی موجود است',
'should_be_activated' => ' جاوا اسکریپت باید فعال باشد',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Une requête a échoué, cela peut être dû à des problèmes de connexion à Internet.',
'title_new_articles' => 'FreshRSS : nouveaux articles !',
),
'labels_empty' => 'Pas d’étiquettes', // DIRTY
'new_article' => 'Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.',
'should_be_activated' => 'Le JavaScript doit être activé.',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'A request has failed, it may have been caused by internet connection problems.', // TODO
'title_new_articles' => 'FreshRSS: מאמרים חדשים!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'מאמרים חדשים זמינים, לחצו לרענון העמוד.',
'should_be_activated' => 'חובה להפעיל JavaScript',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Egy művelet nem sikerült, lehetséges hogy az internet kapcsolattal vannak problémák.',
'title_new_articles' => 'FreshRSS: új cikkek!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Új cikkek elérhetőek, kattints a lap frissítéséhez.',
'should_be_activated' => 'A JavaScript futtatásának engedélyezve kell lennie',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'A request has failed, it may have been caused by internet connection problems.', // TODO
'title_new_articles' => 'FreshRSS: new articles!', // TODO
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'There are new articles available, click to refresh the page.', // TODO
'should_be_activated' => 'JavaScript must be enabled', // TODO
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Richiesta fallita, probabilmente a causa di problemi di connessione',
'title_new_articles' => 'Feed RSS Reader: nuovi articoli!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Sono disponibili nuovi articoli, clicca qui per caricarli.',
'should_be_activated' => 'JavaScript deve essere abilitato',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'おそらくインターネット接続に問題があるため、リクエストは失敗しました。',
'title_new_articles' => 'FreshRSS: 新規記事!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => '新しい記事があるのでクリックしてページをリフレッシュしてください。',
'should_be_activated' => 'JavaScriptは有効になっている必要があります。',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => '요청한 작업을 수행할 수 없습니다. 인터넷 연결에 문제가 발생한 것 같습니다.',
'title_new_articles' => 'FreshRSS: 새 글이 있습니다!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => '새 글이 있습니다. 여기를 클릭하면 페이지를 다시 불러옵니다.',
'should_be_activated' => '자바스크립트를 사용하도록 설정해야합니다',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Pieprasījums nav izdevies, iespējams, to izraisījušas interneta savienojuma problēmas.',
'title_new_articles' => 'FreshRSS: jauni raksti!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Ir pieejami jauni raksti, noklikšķiniet, lai atsvaidzinātu lapu..',
'should_be_activated' => 'JavaScript jābūt ieslēgtam',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Een opdracht is mislukt, mogelijk door Internet verbindings problemen.',
'title_new_articles' => 'FreshRSS: nieuwe artikelen!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Er zijn nieuwe artikelen beschikbaar. Klik om de pagina te vernieuwen.',
'should_be_activated' => 'JavaScript moet aanstaan',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Una requèsta a fach meuca, aquò pòt venir d’un problèma de connexion Internet.',
'title_new_articles' => 'FreshRSS : nòus articles !',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'I a d’articles nòus disponibles, clicatz per actualizar la pagina.',
'should_be_activated' => 'JavaScript deu èsser activat',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Zapytanie nie powiodło się. Może to być spowodowane problemami z łącznością z internetem.',
'title_new_articles' => 'FreshRSS: nowe wiadomości!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Dostępne są nowe wiadomości. Kliknij, aby odświeżyć stronę.',
'should_be_activated' => 'JavaScript musi być włączony',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Uma solicitação falhou, isto pode ter sido causado por problemas de conexão com a internet.',
'title_new_articles' => 'FreshRSS: novos artigos!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Há novos artigos disponíveis, clique para atualizar a página.',
'should_be_activated' => 'O JavaScript precisa estar ativo',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Запрос не удался. Возможно, это вызвано проблемами с подключением к Интернет.',
'title_new_articles' => 'FreshRSS: новые статьи!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Появились новые статьи. Нажмите, чтобы обновить страницу.',
'should_be_activated' => 'JavaScript должен быть включён',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Nepodarilo sa spracovať váš dopyt, pravdepodobne kvôli problému s pripojením do internetu.',
'title_new_articles' => 'FreshRSS: nové články!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Našli sa nové články. Kliknite na obnovenie stránky.',
'should_be_activated' => 'Musíte povoliť JavaScript',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => 'Hata. İnternet bağlantınızı kontrol edin.',
'title_new_articles' => 'FreshRSS: yeni makaleler!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => 'Yeni makaleler mevcut. Sayfayı yenilemek için tıklayın.',
'should_be_activated' => 'JavaScript aktif olmalıdır.',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => '请求失败,这可能是因为网络连接问题。',
'title_new_articles' => 'FreshRSS: 新文章!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => '发现新文章,点击刷新页面。',
'should_be_activated' => '必须启用 JavaScript',
),
+1
View File
@@ -134,6 +134,7 @@ return array(
'request_failed' => '請求失敗,這可能是因為網絡連接問題。',
'title_new_articles' => 'FreshRSS: 新文章!',
),
'labels_empty' => 'No labels', // TODO
'new_article' => '發現新文章,點擊刷新頁面。',
'should_be_activated' => '必須啟用 JavaScript',
),
+1
View File
@@ -65,6 +65,7 @@ echo htmlspecialchars(json_encode(array(
'notif_body_unread_articles' => _t('gen.js.feedback.body_unread_articles'),
'notif_request_failed' => _t('gen.js.feedback.request_failed'),
'category_empty' => _t('gen.js.category_empty'),
'labels_empty' => _t('gen.js.labels_empty'),
'language' => FreshRSS_Context::$user_conf->language,
),
'icons' => array(
+44 -28
View File
@@ -1300,47 +1300,63 @@ function loadDynamicTags(div) {
return req.onerror(e);
}
const li_item0 = document.createElement('li');
li_item0.setAttribute('class', 'item addItem');
if (!context.anonymous) {
const li_item0 = document.createElement('li');
li_item0.setAttribute('class', 'item addItem');
const label = document.createElement('label');
label.setAttribute('class', 'noHover');
const label = document.createElement('label');
label.setAttribute('class', 'noHover');
const input_checkboxTag = document.createElement('input');
input_checkboxTag.setAttribute('class', 'checkboxTag checkboxNewTag');
input_checkboxTag.setAttribute('name', 't_0');
input_checkboxTag.setAttribute('type', 'checkbox');
const input_checkboxTag = document.createElement('input');
input_checkboxTag.setAttribute('class', 'checkboxTag checkboxNewTag');
input_checkboxTag.setAttribute('name', 't_0');
input_checkboxTag.setAttribute('type', 'checkbox');
const input_newTag = document.createElement('input');
input_newTag.setAttribute('type', 'text');
input_newTag.setAttribute('name', 'newTag');
input_newTag.addEventListener('keydown', function (ev) { if (ev.key.toUpperCase() == 'ENTER') { this.parentNode.previousSibling.click(); } });
const input_newTag = document.createElement('input');
input_newTag.setAttribute('type', 'text');
input_newTag.setAttribute('name', 'newTag');
input_newTag.addEventListener('keydown', function (ev) { if (ev.key.toUpperCase() == 'ENTER') { this.parentNode.previousSibling.click(); } });
const button_btn = document.createElement('button');
button_btn.setAttribute('type', 'button');
button_btn.setAttribute('class', 'btn');
button_btn.addEventListener('click', function () { this.parentNode.parentNode.click(); });
const button_btn = document.createElement('button');
button_btn.setAttribute('type', 'button');
button_btn.setAttribute('class', 'btn');
button_btn.addEventListener('click', function () { this.parentNode.parentNode.click(); });
const text_plus = document.createTextNode('+');
const text_plus = document.createTextNode('+');
const div_stick = document.createElement('div');
div_stick.setAttribute('class', 'stick');
const div_stick = document.createElement('div');
div_stick.setAttribute('class', 'stick');
button_btn.appendChild(text_plus);
div_stick.appendChild(input_newTag);
div_stick.appendChild(button_btn);
label.appendChild(input_checkboxTag);
label.appendChild(div_stick);
li_item0.appendChild(label);
button_btn.appendChild(text_plus);
div_stick.appendChild(input_newTag);
div_stick.appendChild(button_btn);
label.appendChild(input_checkboxTag);
label.appendChild(div_stick);
li_item0.appendChild(label);
div.querySelector('.dropdown-menu').appendChild(li_item0);
div.querySelector('.dropdown-menu').appendChild(li_item0);
}
let html = '';
if (json && json.length) {
let nbLabelsChecked = 0;
for (let i = 0; i < json.length; i++) {
const tag = json[i];
html += '<li class="item"><label><input class="checkboxTag" name="t_' + tag.id + '" type="checkbox"' +
(tag.checked ? ' checked="checked"' : '') + '> ' + tag.name + '</label></li>';
if (context.anonymous && !tag.checked) {
// In anomymous mode, show only the used tags
continue;
}
if (tag.checked) {
nbLabelsChecked++;
}
html += '<li class="item"><label><input ' +
(context.anonymous ? '' : 'class="checkboxTag" ') +
'name="t_' + tag.id + '"type="checkbox" ' +
(context.anonymous ? 'disabled="disabled" ' : '') +
(tag.checked ? 'checked="checked" ' : '') + '/> ' + tag.name + '</label></li>';
}
if (context.anonymous && nbLabelsChecked === 0) {
html += '<li class="item"><span class="emptyLabels">' + context.i18n.labels_empty + '</span></li>';
}
}
div.querySelector('.dropdown-menu').insertAdjacentHTML('beforeend', html);
+9
View File
@@ -378,6 +378,15 @@ form th {
border-radius: 3px;
}
.dropdown-menu input[type="checkbox"] {
margin-left: 1rem;
}
.dropdown-menu .item .emptyLabels {
padding-left: 1rem;
padding-right: 1rem;
}
.item ~ .dropdown-header,
.dropdown-section ~ .dropdown-section,
.item.separator {
+9
View File
@@ -378,6 +378,15 @@ form th {
border-radius: 3px;
}
.dropdown-menu input[type="checkbox"] {
margin-right: 1rem;
}
.dropdown-menu .item .emptyLabels {
padding-right: 1rem;
padding-left: 1rem;
}
.item ~ .dropdown-header,
.dropdown-section ~ .dropdown-section,
.item.separator {
+9
View File
@@ -496,6 +496,15 @@ a:hover .icon {
border-radius: 3px;
}
.dropdown-menu input[type="checkbox"] {
margin-left: 1rem;
}
.dropdown-menu .item .emptyLabels {
padding-left: 1rem;
padding-right: 1rem;
}
.item ~ .dropdown-header,
.dropdown-section ~ .dropdown-section,
.item.separator {
+9
View File
@@ -496,6 +496,15 @@ a:hover .icon {
border-radius: 3px;
}
.dropdown-menu input[type="checkbox"] {
margin-right: 1rem;
}
.dropdown-menu .item .emptyLabels {
padding-right: 1rem;
padding-left: 1rem;
}
.item ~ .dropdown-header,
.dropdown-section ~ .dropdown-section,
.item.separator {