diff --git a/app/Controllers/Routing.php b/app/Controllers/Routing.php index 664972c3..7acdf20b 100644 --- a/app/Controllers/Routing.php +++ b/app/Controllers/Routing.php @@ -128,7 +128,6 @@ class Routing $r->add(['GET', 'POST'], '/admin/users/result/{data}[/{page:[1-9]\d*}]', 'AdminUsersResult:view', 'AdminUsersResult'); $r->add(['GET', 'POST'], '/admin/users/{action:\w+}/{ids:\d+(?:-\d+)*}', 'AdminUsersAction:view', 'AdminUsersAction'); - if ($user->canViewIP) { $r->add('GET', '/admin/get/host/{ip:[0-9a-fA-F:.]+}', 'AdminHost:view', 'AdminHost'); $r->add('GET', '/admin/users/user/{id:[2-9]|[1-9]\d+}[/{page:[1-9]\d*}]', 'AdminUsersStat:view', 'AdminUserStat'); diff --git a/app/Models/Pages/Admin/Users.php b/app/Models/Pages/Admin/Users.php index 952bcea3..5960be87 100644 --- a/app/Models/Pages/Admin/Users.php +++ b/app/Models/Pages/Admin/Users.php @@ -79,14 +79,17 @@ abstract class Users extends Admin * Проверяет доступность действий над выбранными пользователями * * @param array $selected - * @param string $action // ???? + * @param string $action * * @return false|array */ protected function checkSelected(array $selected, $action) { + $selected = \array_map(function ($value) { // ???? + return (int) $value; + }, $selected); $bad = \array_filter($selected, function ($value) { - return $value < 2; // ???? например '03' + return $value < 2; }); if (! empty($bad)) { @@ -143,6 +146,11 @@ abstract class Users extends Admin $result[] = $user->id; } + if (empty($result)) { + $this->fIswev = ['v', \ForkBB\__('No users selected')]; + return false; + } + return $result; } } diff --git a/app/Models/Pages/Admin/Users/Action.php b/app/Models/Pages/Admin/Users/Action.php new file mode 100644 index 00000000..7dfb57e4 --- /dev/null +++ b/app/Models/Pages/Admin/Users/Action.php @@ -0,0 +1,177 @@ +rules = $this->c->UsersRules->init(); + + $error = false; + switch ($args['action']) { + case self::ACTION_BAN: + if (! $this->rules->banUsers) { + $error = true; + } + break; + case self::ACTION_DEL: + if (! $this->rules->deleteUsers) { + $error = true; + } + break; + case self::ACTION_CHG: + if (! $this->rules->changeGroup) { + $error = true; + } + break; + default: + $error = true; + } + + if ($error) { + return $this->c->Message->message('Bad request'); + } + + $ids = $this->checkSelected(\explode('-', $args['ids']), $args['action']); + if (false === $ids) { + $message = $this->c->Message->message('Action not available'); + $message->fIswev = $this->fIswev; //???? + return $message; + } + + $this->userList = $this->c->users->load($ids); + switch ($args['action']) { + case self::ACTION_BAN: + return $this->ban($args, $method); + case self::ACTION_DEL: + return $this->delete($args, $method); + case self::ACTION_CHG: + return $this->change($args, $method); + default: + throw new RuntimeException("The action {$args['action']} is unavailable"); + } + } + + /** + * Удаляет пользователей + * + * @param array $args + * @param string $method + * + * @return Page + */ + protected function delete(array $args, $method) + { + + + $this->nameTpl = 'admin/form'; + $this->classForm = 'delete-users'; + $this->titleForm = \ForkBB\__('Deleting users'); + $this->aCrumbs[] = [$this->c->Router->link('AdminUsersAction', $args), \ForkBB\__('Deleting users')]; + $this->form = $this->formDelete($args); + + return $this; + + } + + /** + * Возвращает список имен пользователей + * + * @param array $users + * + * @return array + */ + protected function nameList(array $users) + { + $result = []; + foreach ($users as $user) { + $result[] = $user->username; + } + \sort($result, \SORT_STRING | \SORT_FLAG_CASE); + return $result; + } + + /** + * Создает массив данных для формы статистики пользователя по ip + * + * @param array $stat + * @param int $number + * + * @return array + */ + protected function formDelete(array $args) + { + $yn = [1 => \ForkBB\__('Yes'), 0 => \ForkBB\__('No')]; + $names = \implode(', ', $this->nameList($this->userList)); + $form = [ + 'action' => $this->c->Router->link('AdminUsersAction', $args), + 'hidden' => [ + 'token' => $this->c->Csrf->create('AdminUsersAction', $args), + ], + 'sets' => [ + 'info' => [ + 'info' => [ + 'info1' => [ + 'type' => '', //???? + 'value' => \ForkBB\__('Confirm delete info', $names), + ], + ], + ], + 'options' => [ + 'fields' => [ + 'confirm' => [ + 'type' => 'radio', + 'value' => 0, + 'values' => $yn, + 'caption' => \ForkBB\__('Delete users'), + ], + 'delete_posts' => [ + 'type' => 'radio', + 'value' => 0, + 'values' => $yn, + 'caption' => \ForkBB\__('Delete posts'), + ], + ], + ], + 'info2' => [ + 'info' => [ + 'info2' => [ + 'type' => '', //???? + 'value' => \ForkBB\__('Delete warning'), + 'html' => true, + ], + ], + ], + ], + 'btns' => [ + 'delete' => [ + 'type' => 'submit', + 'value' => \ForkBB\__('Delete users'), + 'accesskey' => 'd', + ], + 'cancel' => [ + 'type' => 'btn', + 'value' => \ForkBB\__('Cancel'), + 'link' => $this->c->Router->link('AdminUsers'), + ], + ], + ]; + + return $form; + } +} diff --git a/app/config/main.dist.php b/app/config/main.dist.php index a817fbd2..6a16841c 100644 --- a/app/config/main.dist.php +++ b/app/config/main.dist.php @@ -169,6 +169,7 @@ return [ 'AdminUsers' => \ForkBB\Models\Pages\Admin\Users\View::class, 'AdminUsersResult' => \ForkBB\Models\Pages\Admin\Users\Result::class, 'AdminUsersStat' => \ForkBB\Models\Pages\Admin\Users\Stat::class, + 'AdminUsersAction' => \ForkBB\Models\Pages\Admin\Users\Action::class, 'AdminHost' => \ForkBB\Models\Pages\Admin\Host::class, 'ConfigModel' => \ForkBB\Models\Config\Model::class, diff --git a/app/lang/en/admin_users.po b/app/lang/en/admin_users.po index 00b11ec8..2d44e05e 100644 --- a/app/lang/en/admin_users.po +++ b/app/lang/en/admin_users.po @@ -66,6 +66,9 @@ msgstr "Invalid group ID." msgid "Users move redirect" msgstr "User group changed. Redirecting …" +msgid "Deleting users" +msgstr "Delete users" + msgid "Delete users" msgstr "Delete users" @@ -73,13 +76,13 @@ msgid "Confirm delete legend" msgstr "Important: read before deleting users" msgid "Confirm delete info" -msgstr "Please confirm that you want to delete these users." +msgstr "Please confirm that you want to delete these users: %s." msgid "Delete posts" -msgstr "Delete any posts and topics these users have made." +msgstr "Delete any posts and topics" msgid "Delete warning" -msgstr "Warning! Deleted users and/or posts cannot be restored. If you choose not to delete the posts made by these users, the posts can only be deleted manually at a later time." +msgstr "Warning! Deleted users and/or posts cannot be restored. If you choose not to delete the posts made by these users, the posts can only be deleted manually at a later time." msgid "Users delete redirect" msgstr "Users deleted. Redirecting …" diff --git a/app/lang/ru/admin_users.po b/app/lang/ru/admin_users.po index 17bdfbbf..1591d5be 100644 --- a/app/lang/ru/admin_users.po +++ b/app/lang/ru/admin_users.po @@ -66,20 +66,23 @@ msgstr "Неверная группа." msgid "Users move redirect" msgstr "Пользователям изменена группа. Переадресация..." -msgid "Delete users" +msgid "Deleting users" msgstr "Удаление пользователей" +msgid "Delete users" +msgstr "Удалить пользователей" + msgid "Confirm delete legend" msgstr "ВАЖНО: прочтите перед удалением" msgid "Confirm delete info" -msgstr "Пожалуйста, подтвердите удаление пользователя." +msgstr "Пожалуйста, подтвердите удаление этих пользователей: %s." msgid "Delete posts" -msgstr "Удалить все темы и сообщения пользователей." +msgstr "Удалить все темы и сообщения" msgid "Delete warning" -msgstr "Предупреждаем! Удалённых пользователей и/или сообщения невозможно восстановить. Если вы выберете "не удалять сообщения", их можно будет удалить вручную в любое время." +msgstr "Предупреждение! Удалённых пользователей (и сообщения) невозможно восстановить. Если вы выберете "не удалять сообщения", их можно будет удалить вручную в любое время." msgid "Users delete redirect" msgstr "Пользователи удалены. Переадресация..." diff --git a/public/style/ForkBB/style.css b/public/style/ForkBB/style.css index acaef890..69ef405f 100644 --- a/public/style/ForkBB/style.css +++ b/public/style/ForkBB/style.css @@ -41,7 +41,10 @@ img, abbr, cite, address, -article { +article, +input, +textarea, +a { border: 0; font-style: normal; font-weight: normal; @@ -49,11 +52,13 @@ article { padding: 0; box-sizing: border-box; word-wrap: break-word; + font-family: Arial, Helvetica, sans-serif; } ul, ol { list-style: none; + font-family: Arial, Helvetica, sans-serif; } /*******************/ @@ -90,7 +95,6 @@ ol { } html { - font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: 1.5; } @@ -175,6 +179,7 @@ body, -ms-user-select: none; user-select: none; white-space: nowrap; + text-align: center; } .f-btn.f-minor { @@ -1647,7 +1652,7 @@ select { .f-btnsrow-form .f-btns .f-btn { width: auto; - display: inline; + display: inline-block; } #id-message { @@ -2294,8 +2299,9 @@ select { text-align: right; } -.f-search-result-form .f-btns .f-btn { - display: inline; +.f-search-result-form .f-btns .f-btn, +.f-delete-users-form .f-btns .f-btn{ + display: inline-block; width: auto; }