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;
}