diff options
| author | 2019-12-03 22:32:17 +0100 | |
|---|---|---|
| committer | 2019-12-03 22:32:17 +0100 | |
| commit | 0de7e84380dff5222e6728aacbbb42abaac51dd9 (patch) | |
| tree | 07eba3a6070f11fd966c9f257aa652b6f6242eed | |
| parent | 68c006b7ad61d0730a3aa8f75c6232c00d0f14e1 (diff) | |
Upgrade user management page (#2417)
Before, the use of the user management page was a little bit tedious
when there was many users. One must select a user to view some
metrics, to update it, or to delete it.
Now, the view is clearer because it shows all users at once with
their metrics. I introduced a detail page that repeats the metrics
but also allow to purge the user's feeds, to update or delete the
user.
This is the first step to make that page more useful and user-friendly.
I have in mind to add a pager for when there is a lot of users, a metric
to know when was the last time the user was using the application, and
a flag to know if the user has admin rights.
See #2096 and #2504 for ideas and inspiration
35 files changed, 253 insertions, 73 deletions
diff --git a/app/Controllers/userController.php b/app/Controllers/userController.php index 39b4769fd..05e7475e7 100644 --- a/app/Controllers/userController.php +++ b/app/Controllers/userController.php @@ -118,7 +118,6 @@ class FreshRSS_user_Controller extends Minz_ActionController { Minz_Request::bad(_t('feedback.user.updated.error', $username), array('c' => 'user', 'a' => 'manage')); } - } } @@ -194,6 +193,23 @@ class FreshRSS_user_Controller extends Minz_ActionController { } } + public function purgeAction() { + if (!FreshRSS_Auth::hasAccess('admin')) { + Minz_Error::error(403); + } + + if (Minz_Request::isPost()) { + $username = Minz_Request::param('username'); + + if (!FreshRSS_UserDAO::exists($username)) { + Minz_Error::error(404); + } + + $feedDAO = FreshRSS_Factory::createFeedDao($username); + $feedDAO->purge(); + } + } + /** * This action displays the user management page. */ @@ -204,18 +220,22 @@ class FreshRSS_user_Controller extends Minz_ActionController { Minz_View::prependTitle(_t('admin.user.title') . ' · '); + if (Minz_Request::isPost()) { + $action = Minz_Request::param('action'); + if ('delete' === $action) { + $this->deleteAction(); + } elseif ('update' === $action) { + $this->updateAction(); + } elseif ('purge' === $action) { + $this->purgeAction(); + } + } + $this->view->show_email_field = FreshRSS_Context::$system_conf->force_email_validation; $this->view->current_user = Minz_Request::param('u'); - $this->view->nb_articles = 0; - $this->view->size_user = 0; - if ($this->view->current_user) { - // Get information about the current user. - $entryDAO = FreshRSS_Factory::createEntryDao($this->view->current_user); - $this->view->nb_articles = $entryDAO->count(); - - $databaseDAO = FreshRSS_Factory::createDatabaseDAO($this->view->current_user); - $this->view->size_user = $databaseDAO->size(); + foreach (listUsers() as $user) { + $this->view->users[$user] = $this->retrieveUserDetails($user); } } @@ -542,4 +562,30 @@ class FreshRSS_user_Controller extends Minz_ActionController { Minz_Request::forward($redirect_url, true); } + + public function detailsAction() { + if (!FreshRSS_Auth::hasAccess('admin')) { + Minz_Error::error(403); + } + + $username = Minz_Request::param('username'); + if (!FreshRSS_UserDAO::exists($username)) { + Minz_Error::error(404); + } + + $this->view->username = $username; + $this->view->details = $this->retrieveUserDetails($username); + } + + private function retrieveUserDetails($username) { + $feedDAO = FreshRSS_Factory::createFeedDao($username); + $entryDAO = FreshRSS_Factory::createEntryDao($username); + $databaseDAO = FreshRSS_Factory::createDatabaseDAO($username); + + return array( + 'feed_count' => $feedDAO->count(), + 'article_count' => $entryDAO->count(), + 'database_size' => $databaseDAO->size(), + ); + } } diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php index 2bff50d52..417b37773 100644 --- a/app/Models/FeedDAO.php +++ b/app/Models/FeedDAO.php @@ -421,6 +421,29 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable { return $affected; } + public function purge() { + $sql = 'DELETE FROM `_entry`'; + $stm = $this->pdo->prepare($sql); + $this->pdo->beginTransaction(); + if (!($stm && $stm->execute())) { + $info = $stm == null ? $this->pdo->errorInfo() : $stm->errorInfo(); + Minz_Log::error('SQL error truncate: ' . $info[2]); + $this->pdo->rollBack(); + return false; + } + + $sql = 'UPDATE `_feed` SET `cache_nbEntries` = 0, `cache_nbUnreads` = 0'; + $stm = $this->pdo->prepare($sql); + if (!($stm && $stm->execute())) { + $info = $stm == null ? $this->pdo->errorInfo() : $stm->errorInfo(); + Minz_Log::error('SQL error truncate: ' . $info[2]); + $this->pdo->rollBack(); + return false; + } + + $this->pdo->commit(); + } + public static function daoToFeed($listDAO, $catID = null) { $list = array(); @@ -481,4 +504,14 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo implements FreshRSS_Searchable { $stm->execute(array(':new_value' => -3600, ':old_value' => -1)); } } + + public function count() { + $sql = 'SELECT COUNT(e.id) AS count FROM `_feed` e'; + $stm = $this->pdo->query($sql); + if ($stm == false) { + return false; + } + $res = $stm->fetchAll(PDO::FETCH_COLUMN, 0); + return isset($res[0]) ? $res[0] : 0; + } } diff --git a/app/Models/FeedDAOSQLite.php b/app/Models/FeedDAOSQLite.php index 0f685867a..397b69941 100644 --- a/app/Models/FeedDAOSQLite.php +++ b/app/Models/FeedDAOSQLite.php @@ -13,5 +13,4 @@ class FreshRSS_FeedDAOSQLite extends FreshRSS_FeedDAO { } return false; } - } diff --git a/app/i18n/cz/admin.php b/app/i18n/cz/admin.php index a2a509560..aa7f5003a 100644 --- a/app/i18n/cz/admin.php +++ b/app/i18n/cz/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s článků (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Vytvořit nového uživatele', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Jazyk', + 'list' => 'User list', // TODO - Translation 'number' => 'Zatím je vytvořen %d účet', 'numbers' => 'Zatím je vytvořeno %d účtů', 'password_form' => 'Heslo<br /><small>(pro přihlášení webovým formulářem)</small>', diff --git a/app/i18n/cz/gen.php b/app/i18n/cz/gen.php index de1456187..3772c90be 100644 --- a/app/i18n/cz/gen.php +++ b/app/i18n/cz/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Spravovat', 'mark_favorite' => 'Označit jako oblíbené', 'mark_read' => 'Označit jako přečtené', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Odstranit', 'see_website' => 'Navštívit WWW stránku', 'submit' => 'Odeslat', diff --git a/app/i18n/de/admin.php b/app/i18n/de/admin.php index f7ddac2d3..4450ce28f 100644 --- a/app/i18n/de/admin.php +++ b/app/i18n/de/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s Artikel (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Neuen Benutzer erstellen', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Lösche Benutzer', + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Sprache', + 'list' => 'User list', // TODO - Translation 'number' => 'Es wurde bis jetzt %d Account erstellt', 'numbers' => 'Es wurden bis jetzt %d Accounts erstellt', 'password_form' => 'Passwort<br /><small>(für die Anmeldemethode per Webformular)</small>', diff --git a/app/i18n/de/gen.php b/app/i18n/de/gen.php index 977b0a52f..f095b760f 100644 --- a/app/i18n/de/gen.php +++ b/app/i18n/de/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Verwalten', 'mark_favorite' => 'Als Favorit markieren', 'mark_read' => 'Als gelesen markieren', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Entfernen', 'see_website' => 'Webseite ansehen', 'submit' => 'Abschicken', diff --git a/app/i18n/en/admin.php b/app/i18n/en/admin.php index c5ab183e8..152c70337 100644 --- a/app/i18n/en/admin.php +++ b/app/i18n/en/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s articles (%s)', + 'article_count' => 'Articles', + 'back_to_manage' => '← Return to user list', 'create' => 'Create new user', + 'database_size' => 'Database size', 'delete_users' => 'Delete user', + 'feed_count' => 'Feeds', 'language' => 'Language', + 'list' => 'User list', 'number' => 'There is %d account created', 'numbers' => 'There are %d accounts created', 'password_form' => 'Password<br /><small>(for the Web-form login method)</small>', diff --git a/app/i18n/en/gen.php b/app/i18n/en/gen.php index fc1bd587a..c77950c9f 100644 --- a/app/i18n/en/gen.php +++ b/app/i18n/en/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Manage', 'mark_favorite' => 'Mark as favourite', 'mark_read' => 'Mark as read', + 'purge' => 'Purge', 'remove' => 'Remove', 'see_website' => 'See website', 'submit' => 'Submit', diff --git a/app/i18n/es/admin.php b/app/i18n/es/admin.php index 1af3bdcb2..a31702c70 100755 --- a/app/i18n/es/admin.php +++ b/app/i18n/es/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s articles (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Crear nuevo usuario', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Idioma', + 'list' => 'User list', // TODO - Translation 'number' => 'Hay %d cuenta creada', 'numbers' => 'Hay %d cuentas creadas', 'password_form' => 'Contraseña<br /><small>(para el método de identificación por formulario web)</small>', diff --git a/app/i18n/es/gen.php b/app/i18n/es/gen.php index 538ddc8fe..5a1b9ae56 100755 --- a/app/i18n/es/gen.php +++ b/app/i18n/es/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Administrar', 'mark_favorite' => 'Marcar como favorita', 'mark_read' => 'Marcar como leído', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Borrar', 'see_website' => 'Ver web', 'submit' => 'Enviar', diff --git a/app/i18n/fr/admin.php b/app/i18n/fr/admin.php index 6002617fc..bdf7ba7b7 100644 --- a/app/i18n/fr/admin.php +++ b/app/i18n/fr/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s articles (%s)', + 'article_count' => 'Articles', + 'back_to_manage' => '← Revenir à la liste des utilisateurs', 'create' => 'Créer un nouvel utilisateur', + 'database_size' => 'Volumétrie', 'delete_users' => 'Supprimer un utilisateur', + 'feed_count' => 'Flux', 'language' => 'Langue', + 'list' => 'Liste des utilisateurs', 'number' => '%d compte a déjà été créé', 'numbers' => '%d comptes ont déjà été créés', 'password_form' => 'Mot de passe<br /><small>(pour connexion par formulaire)</small>', diff --git a/app/i18n/fr/gen.php b/app/i18n/fr/gen.php index a6875dd05..551b614a3 100644 --- a/app/i18n/fr/gen.php +++ b/app/i18n/fr/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Gérer', 'mark_favorite' => 'Mettre en favori', 'mark_read' => 'Marquer comme lu', + 'purge' => 'Purger', 'remove' => 'Supprimer', 'see_website' => 'Voir le site', 'submit' => 'Valider', diff --git a/app/i18n/he/admin.php b/app/i18n/he/admin.php index 759b74e2a..73a040aad 100644 --- a/app/i18n/he/admin.php +++ b/app/i18n/he/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s articles (%s)', //TODO - Translation + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', 'create' => 'יצירת משתמש חדש', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'שפה', + 'list' => 'User list', // TODO - Translation 'number' => 'There is %d account created', //TODO - Translation 'numbers' => 'There are %d accounts created', //TODO - Translation 'password_form' => 'סיסמה<br /><small>(לשימוש בטפוס ההרשמה)</small>', diff --git a/app/i18n/he/gen.php b/app/i18n/he/gen.php index 34e6d77de..3e882e2b2 100644 --- a/app/i18n/he/gen.php +++ b/app/i18n/he/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'ניהול', 'mark_read' => 'סימון כנקרא', 'mark_favorite' => 'סימון כמועדף', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Remove', //TODO - Translation 'see_website' => 'ראו אתר', 'submit' => 'אישור', diff --git a/app/i18n/it/admin.php b/app/i18n/it/admin.php index 8bb6c7bfe..768cb8eb5 100644 --- a/app/i18n/it/admin.php +++ b/app/i18n/it/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s articoli (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Crea nuovo utente', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Lingua', + 'list' => 'User list', // TODO - Translation 'number' => ' %d profilo utente creato', 'numbers' => 'Sono presenti %d profili utente', 'password_form' => 'Password<br /><small>(per il login classico)</small>', diff --git a/app/i18n/it/gen.php b/app/i18n/it/gen.php index 50d4b4e6c..c74d386df 100644 --- a/app/i18n/it/gen.php +++ b/app/i18n/it/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Gestisci', 'mark_favorite' => 'Segna come preferito', 'mark_read' => 'Segna come letto', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Rimuovi', 'see_website' => 'Vai al sito', 'submit' => 'Conferma', diff --git a/app/i18n/kr/admin.php b/app/i18n/kr/admin.php index 4a8e425d5..044c8a273 100644 --- a/app/i18n/kr/admin.php +++ b/app/i18n/kr/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s 개의 글 (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => '새 사용자 생성', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => '사용자 삭제', + 'feed_count' => 'Feeds', //TODO - Translation 'language' => '언어', + 'list' => 'User list', // TODO - Translation 'number' => '%d 개의 계정이 생성되었습니다', 'numbers' => '%d 개의 계정이 생성되었습니다', 'password_form' => '암호<br /><small>(웹폼 로그인 방식 사용시)</small>', diff --git a/app/i18n/kr/gen.php b/app/i18n/kr/gen.php index fdc95d431..b6a975606 100644 --- a/app/i18n/kr/gen.php +++ b/app/i18n/kr/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => '관리', 'mark_favorite' => '즐겨찾기에 등록', 'mark_read' => '읽음으로 표시', + 'purge' => 'Purge', // TODO - Translation 'remove' => '삭제', 'see_website' => '웹사이트 열기', 'submit' => '설정 저장', diff --git a/app/i18n/nl/admin.php b/app/i18n/nl/admin.php index 1083c630b..41fa5ff68 100644 --- a/app/i18n/nl/admin.php +++ b/app/i18n/nl/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s artikelen (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Creëer nieuwe gebruiker', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Verwijder gebruiker', + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Taal', + 'list' => 'User list', // TODO - Translation 'number' => 'Er is %d accounts gemaakt', 'numbers' => 'Er zijn %d accounts gemaakt', 'password_form' => 'Wachtwoord<br /><small>(voor de Web-formulier loginmethode)</small>', diff --git a/app/i18n/nl/gen.php b/app/i18n/nl/gen.php index fdbb866fc..d276e72a9 100644 --- a/app/i18n/nl/gen.php +++ b/app/i18n/nl/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Beheren', 'mark_favorite' => 'Markeer als favoriet', 'mark_read' => 'Markeer als gelezen', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Verwijder', 'see_website' => 'Bekijk website', 'submit' => 'Opslaan', diff --git a/app/i18n/oc/admin.php b/app/i18n/oc/admin.php index 1fb8d5c3a..a0d49faaa 100644 --- a/app/i18n/oc/admin.php +++ b/app/i18n/oc/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s articles (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Crear un nòu utilizaire', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Suprimir un utilizaire', + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Lenga', + 'list' => 'User list', // TODO - Translation 'number' => '%d compte ja creat', 'numbers' => '%d comptes ja creats', 'password_form' => 'Senhal <br /><small>(ex. : per la connexion via formulari)</small>', diff --git a/app/i18n/oc/gen.php b/app/i18n/oc/gen.php index a5bd003c2..a2054a16a 100644 --- a/app/i18n/oc/gen.php +++ b/app/i18n/oc/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Gerir', 'mark_favorite' => 'Ajustar als favorits', 'mark_read' => 'Marcar coma legit', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Levar', 'see_website' => 'Veire lo site', 'submit' => 'Mandar', diff --git a/app/i18n/pt-br/admin.php b/app/i18n/pt-br/admin.php index cef6694c2..6a51ca2e7 100644 --- a/app/i18n/pt-br/admin.php +++ b/app/i18n/pt-br/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s artigos (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Criar novo usuário', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Idioma', + 'list' => 'User list', // TODO - Translation 'number' => 'Há %d conta criada', 'numbers' => 'Há %d contas criadas', 'password_form' => 'Senha<br /><small>(para o login pelo método do formulário)</small>', diff --git a/app/i18n/pt-br/gen.php b/app/i18n/pt-br/gen.php index 0e7f367ee..c14499f00 100644 --- a/app/i18n/pt-br/gen.php +++ b/app/i18n/pt-br/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Gerenciar', 'mark_favorite' => 'Marcar como favorito', 'mark_read' => 'Marcar como lido', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Remover', 'see_website' => 'Ver o site', 'submit' => 'Enviar', diff --git a/app/i18n/ru/admin.php b/app/i18n/ru/admin.php index adf091df9..2b93a0099 100644 --- a/app/i18n/ru/admin.php +++ b/app/i18n/ru/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s статей (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Создать нового пользователя', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Язык', + 'list' => 'User list', // TODO - Translation 'number' => 'На данный момент создан %d аккаунт', 'numbers' => 'На данный момент аккаунтов создано: %d', 'password_form' => 'Пароль<br /><small>(для входа через Веб-форму)</small>', diff --git a/app/i18n/ru/gen.php b/app/i18n/ru/gen.php index 5200a7005..b8647bec3 100644 --- a/app/i18n/ru/gen.php +++ b/app/i18n/ru/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Manage', //TODO - Translation 'mark_favorite' => 'Mark as favourite', //TODO - Translation 'mark_read' => 'Mark as read', //TODO - Translation + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Remove', //TODO - Translation 'see_website' => 'See website', //TODO - Translation 'submit' => 'Submit', //TODO - Translation diff --git a/app/i18n/sk/admin.php b/app/i18n/sk/admin.php index 347204f37..209641a70 100644 --- a/app/i18n/sk/admin.php +++ b/app/i18n/sk/admin.php @@ -182,9 +182,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s článkov (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => 'Vytvoriť nového používateľa', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => 'Zmazať používateľa', + 'feed_count' => 'Feeds', //TODO - Translation 'language' => 'Jazyk', + 'list' => 'User list', // TODO - Translation 'number' => 'Je vytvorený používateľ: %d', 'numbers' => 'Je vytvorených používateľov: %d', 'password_form' => 'Heslo<br /><small>(pre spôsob prihlásenia cez webový formulár)</small>', diff --git a/app/i18n/sk/gen.php b/app/i18n/sk/gen.php index 7303ffa9f..b9c1d5155 100644 --- a/app/i18n/sk/gen.php +++ b/app/i18n/sk/gen.php @@ -15,6 +15,7 @@ return array( 'manage' => 'Spravovať', 'mark_favorite' => 'Označiť ako obľúbené', 'mark_read' => 'Označiť ako prečítané', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Odstrániť', 'see_website' => 'Zobraziť webovú stránku', 'submit' => 'Poslať', diff --git a/app/i18n/tr/admin.php b/app/i18n/tr/admin.php index 2c7d0fd6d..b399358c4 100644 --- a/app/i18n/tr/admin.php +++ b/app/i18n/tr/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s makale (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation + 'database_size' => 'Database size', // TODO - Translation 'create' => 'Yeni kullanıcı oluştur', + 'feed_count' => 'Feeds', //TODO - Translation 'delete_users' => 'Delete user', //TODO - Translation 'language' => 'Dil', + 'list' => 'User list', // TODO - Translation 'number' => 'Oluşturulmuş %d hesap var', 'numbers' => 'Oluşturulmuş %d hesap var', 'password_form' => 'Şifre<br /><small>(Tarayıcı girişi için)</small>', diff --git a/app/i18n/tr/gen.php b/app/i18n/tr/gen.php index ccc5b9ee6..8f138d482 100644 --- a/app/i18n/tr/gen.php +++ b/app/i18n/tr/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => 'Yönet', 'mark_favorite' => 'Favoriye ekle', 'mark_read' => 'Okundu olarak işaretle', + 'purge' => 'Purge', // TODO - Translation 'remove' => 'Sil', 'see_website' => 'Siteyi gör', 'submit' => 'Onayla', diff --git a/app/i18n/zh-cn/admin.php b/app/i18n/zh-cn/admin.php index cdc8449a3..a663d31fe 100644 --- a/app/i18n/zh-cn/admin.php +++ b/app/i18n/zh-cn/admin.php @@ -183,9 +183,14 @@ return array( ), 'user' => array( 'articles_and_size' => '%s 篇文章 (%s)', + 'article_count' => 'Articles', // TODO - Translation + 'back_to_manage' => '← Return to user list', // TODO - Translation 'create' => '创建新用户', + 'database_size' => 'Database size', // TODO - Translation 'delete_users' => '删除用户', + 'feed_count' => 'Feeds', //TODO - Translation 'language' => '语言', + 'list' => 'User list', // TODO - Translation 'number' => '已有 %d 个用户', 'numbers' => '已有 %d 个用户', 'password_form' => '密码<br /><small>(用于 Web-form 登录方式)</small>', diff --git a/app/i18n/zh-cn/gen.php b/app/i18n/zh-cn/gen.php index 31817260e..5009e9183 100644 --- a/app/i18n/zh-cn/gen.php +++ b/app/i18n/zh-cn/gen.php @@ -16,6 +16,7 @@ return array( 'manage' => '管理', 'mark_favorite' => '加入收藏', 'mark_read' => '设为已读', + 'purge' => 'Purge', // TODO - Translation 'remove' => '删除', 'see_website' => '查看网站', 'submit' => '提交', diff --git a/app/views/user/details.phtml b/app/views/user/details.phtml new file mode 100644 index 000000000..2e37be872 --- /dev/null +++ b/app/views/user/details.phtml @@ -0,0 +1,51 @@ +<?php $this->partial('aside_configure'); ?> + +<div class="post"> + <a href="<?= _url('user', 'manage'); ?>"><?= _t('admin.user.back_to_manage'); ?></a> + + <legend><?= $this->username; ?></legend> + <form method="post" action="<?= _url('user', 'manage', 'username', $this->username); ?>"> + <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken(); ?>" /> + + <div class="form-group"> + <label class="group-name"><?= _t('admin.user.feed_count') ?></label> + <div class="group-controls"> + <?= format_number($this->details['feed_count']) ?> + </div> + </div> + + <div class="form-group"> + <label class="group-name"><?= _t('admin.user.article_count') ?></label> + <div class="group-controls"> + <?= format_number($this->details['article_count']) ?> + </div> + </div> + + <div class="form-group"> + <label class="group-name"><?= _t('admin.user.database_size') ?></label> + <div class="group-controls"> + <?= format_bytes($this->details['database_size']) ?> + </div> + </div> + + <div class="form-group"> + <label class="group-name" for="newPasswordPlain"><?= _t('admin.user.password_form') ?></label> + <div class="group-controls"> + <div class="stick"> + <input type="password" id="newPasswordPlain" name="newPasswordPlain" autocomplete="new-password" pattern=".{7,}" <?= cryptAvailable() ? '' : 'disabled="disabled" ' ?>/> + <a class="btn toggle-password" data-toggle="password-<?= $this->username; ?>"><?= _i('key') ?></a> + </div> + <?= _i('help'); ?> <?= _t('admin.user.password_format') ?> + </div> + </div> + + <div class="form-group form-actions"> + <noscript><b><?= _t('gen.js.should_be_activated'); ?></b></noscript> + <div class="group-controls"> + <button type="submit" class="btn btn-important" name="action" value="update"><?= _t('gen.action.update') ?></button> + <button type="submit" class="btn btn-attention confirm" name="action" value="purge"><?= _t('gen.action.purge') ?></button> + <button type="submit" class="btn btn-attention confirm" name="action" value="delete"><?= _t('gen.action.remove') ?></button> + <div> + </div> + </form> +</div> diff --git a/app/views/user/manage.phtml b/app/views/user/manage.phtml index 93d1008b5..e5d5717fa 100644 --- a/app/views/user/manage.phtml +++ b/app/views/user/manage.phtml @@ -57,66 +57,27 @@ </div> </form> - <form method="post" action="<?= _url('user', 'update') ?>"> - <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" /> - <legend><?= _t('admin.user.update_users') ?></legend> - - <div class="form-group"> - <label class="group-name" for="current_user"><?= _t('admin.user.selected') ?></label> - <div class="group-controls"> - <select id="current_user" name="username"> - <option selected="selected"> </option> - <?php foreach (listUsers() as $username) { ?> - <option value="<?= $username ?>"><?= $username ?></option> - <?php } ?> - </select> - </div> - </div> - - <div class="form-group"> - <label class="group-name" for="newPasswordPlain"><?= _t('admin.user.password_form') ?></label> - <div class="group-controls"> - <div class="stick"> - <input type="password" id="newPasswordPlain" name="newPasswordPlain" autocomplete="new-password" pattern=".{7,}" <?= cryptAvailable() ? '' : 'disabled="disabled" ' ?>/> - <a class="btn toggle-password" data-toggle="newPasswordPlain"><?= _i('key') ?></a> - </div> - <?= _i('help') ?> <?= _t('conf.profile.password_format') ?> - <noscript><b><?= _t('gen.js.should_be_activated') ?></b></noscript> - </div> - </div> - - <div class="form-group form-actions"> - <div class="group-controls"> - <button type="submit" class="btn btn-important"><?= _t('gen.action.update') ?></button> - <button type="reset" class="btn"><?= _t('gen.action.cancel') ?></button> - </div> - </div> - </form> - - <form method="post" action="<?= _url('user', 'delete') ?>"> - <input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" /> - <legend><?= _t('admin.user.delete_users') ?></legend> - - <div class="form-group"> - <label class="group-name" for="user-list"><?= _t('admin.user.selected') ?></label> - <div class="group-controls"> - <select id="user-list" class="select-change" name="username"> - <option selected="selected"> </option> - <?php foreach (listUsers() as $username) { ?> - <option data-url="<?= _url('user', 'manage', 'u', $username) ?>" <?= $this->current_user === $username ? 'selected="selected"' : '' ?> value="<?= $username ?>"><?= $username ?></option> - <?php } ?> - </select> - - <p><?php echo _t('admin.user.articles_and_size', - format_number($this->nb_articles), - format_bytes($this->size_user)); ?></p> - </div> - </div> - - <div class="form-group form-actions"> - <div class="group-controls"> - <button type="submit" class="btn btn-attention confirm"><?= _t('gen.action.remove') ?></button> - </div> - </div> - </form> + <legend><?= _t('admin.user.list'); ?></legend> + <table id="user-list"> + <thead> + <tr> + <th><?= _t('admin.user.username') ?></th> + <th><?= _t('admin.user.feed_count') ?></th> + <th><?= _t('admin.user.article_count') ?></th> + <th><?= _t('admin.user.database_size') ?></th> + <th> </th> + </tr> + </thead> + <tbody> + <?php foreach ($this->users as $username => $values) : ?> + <tr> + <td><?= $username ?></td> + <td><?= format_number($values['feed_count']) ?></td> + <td><?= format_number($values['article_count']) ?></td> + <td><?= format_bytes($values['database_size']) ?></td> + <td><a href="<?= _url('user', 'details', 'username', $username) ?>">Details</a></td> + </tr> + <?php endforeach ?> + </tbody> + </table> </div> |
