From 38b506e98b3a4028ba278c579b1679755b80acb0 Mon Sep 17 00:00:00 2001 From: Alexander Smirnov Date: Fri, 20 Sep 2024 22:10:51 +0300 Subject: [PATCH] =?utf8?q?[ERP-188]=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?utf8?q?=D0=B5=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?utf8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87?= =?utf8?q?=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B0=20=D0=BD?= =?utf8?q?=D0=B0=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85?= =?utf8?q?=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?utf8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/commands/AuthController.php | 5 +- erp24/controllers/AuthController.php | 43 +++++++-- erp24/views/auth/menu.php | 1 + erp24/web/js/auth/menu.js | 130 +++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 6 deletions(-) diff --git a/erp24/commands/AuthController.php b/erp24/commands/AuthController.php index 5dda9e03..1b3819a9 100644 --- a/erp24/commands/AuthController.php +++ b/erp24/commands/AuthController.php @@ -109,7 +109,10 @@ class AuthController extends Controller } else { $permission = $auth->getPermission($permissionName); } - foreach (Admin::find()->where(['group_id' => $adminGroupRbacConfig->admin_group_id])->all() as $admin) { + foreach (Admin::find()->where(['or', + ['group_id' => $adminGroupRbacConfig->admin_group_id], + ['id' => $adminGroupRbacConfig->admin_group_id - (1e+6)] + ])->all() as $admin) { if ($roleOrPermission) { $auth->assign($roleOrPermission, $admin->id); } else { diff --git a/erp24/controllers/AuthController.php b/erp24/controllers/AuthController.php index 3c5a673a..bd5f70ca 100644 --- a/erp24/controllers/AuthController.php +++ b/erp24/controllers/AuthController.php @@ -107,7 +107,9 @@ class AuthController extends BaseController } $permissionValue = []; foreach (AdminGroupRbacConfig::find()->all() as $adminGroupRbacConfig) { - $permissionValue[$adminGroupRbacConfig->admin_group_id] = explode(',', $adminGroupRbacConfig->config); + if ($adminGroupRbacConfig->admin_group_id < 1e+6) { + $permissionValue[$adminGroupRbacConfig->admin_group_id] = explode(',', $adminGroupRbacConfig->config); + } }; return json_encode([ @@ -125,14 +127,21 @@ class AuthController extends BaseController return 'ok'; } } - if ($action == 'updatePermissionConfigForAdminGroup') { - $adminGroupId = Yii::$app->request->post("adminGroupId"); + if ($action == 'updatePermissionConfigForAdminGroup' || $action == 'updatePermissionConfigForSingleAdmin') { + $adminGroupId = null; + if ($action == 'updatePermissionConfigForAdminGroup') { + $adminGroupId = Yii::$app->request->post("adminGroupId"); + } + $adminId = null; + if ($action == 'updatePermissionConfigForSingleAdmin') { + $adminId = Yii::$app->request->post("adminId"); + } $configKey = Yii::$app->request->post("configKey"); $configValue = filter_var(Yii::$app->request->post("configValue"), FILTER_VALIDATE_BOOLEAN); - $adminGroupRbacConfig = AdminGroupRbacConfig::findOne(['admin_group_id' => $adminGroupId]); + $adminGroupRbacConfig = AdminGroupRbacConfig::findOne(['admin_group_id' => $adminGroupId ?? ($adminId + 1e+6)]); if (!$adminGroupRbacConfig) { $adminGroupRbacConfig = new AdminGroupRbacConfig; - $adminGroupRbacConfig->admin_group_id = $adminGroupId; + $adminGroupRbacConfig->admin_group_id = $adminGroupId ?? ($adminId + 1e+6); $adminGroupRbacConfig->config = ''; } $config = explode(',', $adminGroupRbacConfig->config); @@ -151,6 +160,30 @@ class AuthController extends BaseController return "ok"; } + if ($action == 'listPermissionConfigForSingleAdmins') { + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; + + $configKey = Yii::$app->request->post("configKey"); + + $adminArr = []; + foreach (\yii_app\records\Admin::find()->with('adminGroup')->all() as $admin) { + if ($admin->group_id > 0) { + $adminArr[] = ['id' => $admin->id, 'name' => $admin->name, 'groupName' => $admin->adminGroup->name ?? "Другие"]; + } + } + $admins = ArrayHelper::map($adminArr, 'id', 'name', 'groupName'); + + $adminsWithPermissionIds = []; + + foreach (AdminGroupRbacConfig::find()->all() as $adminGroupRbacConfig) { + if ($adminGroupRbacConfig->admin_group_id > 1e+6 && in_array($configKey, explode(',', $adminGroupRbacConfig->config))) { + $adminsWithPermissionIds[] = $adminGroupRbacConfig->admin_group_id - (1e+6); + } + }; + + return compact('admins', 'adminsWithPermissionIds'); + } + if ($action == 'initVisibilitySettingsDialog') { $authMenuVisibilityPermissions = Yii::$app->session->get("authMenuVisibilityPermissions", true); return $this->asJson(compact('authMenuVisibilityPermissions')); diff --git a/erp24/views/auth/menu.php b/erp24/views/auth/menu.php index d090cdb5..a7499c8b 100644 --- a/erp24/views/auth/menu.php +++ b/erp24/views/auth/menu.php @@ -64,6 +64,7 @@ $this->registerCssFile('/css/customSortable.css'); $this->registerJsFile('/js/Sortable.js', ['position' => \yii\web\View::POS_END]); $this->registerJsFile('/js/customSortable.js', ['position' => \yii\web\View::POS_END]); $this->registerJsFile('/js/auth/menu.js', ['position' => \yii\web\View::POS_END]); +$this->registerCSS('.select2-search { background-color: #00f; }'); ?> diff --git a/erp24/web/js/auth/menu.js b/erp24/web/js/auth/menu.js index 13ee2b9b..d00a7ea1 100644 --- a/erp24/web/js/auth/menu.js +++ b/erp24/web/js/auth/menu.js @@ -1,3 +1,5 @@ +/* jshint esversion: 6 */ + const param = $('meta[name=csrf-param]').attr('content'); const token = $('meta[name=csrf-token]').attr('content'); @@ -40,6 +42,125 @@ function showPermissionDialog(menu_id, url, index) { tbody.append(htr); } + function filterAdminTable(e) { + const mask = e.target.value || ''; + const $adminsWithPermissionTbody = $modalBody.find("#adminsWithPermission").find('tbody'); + $.each($adminsWithPermissionTbody.find('tr'), (_, atr) => { + if ($(atr).find('td').text().includes(mask)) { + $(atr).show(); + } else { + $(atr).hide(); + } + }); + } + + function refreshAdminPermissionsPane(key) { + document.removeEventListener('keyup', filterAdminTable); + + $.ajax({ + method: 'POST', + url: window.location.href, + data: { + action: 'listPermissionConfigForSingleAdmins', + configKey: key, + [param]: token + }, + dataType: 'json', + success: function (response) { + const $adminsWithPermission = $modalBody.find("#adminsWithPermission"); + $adminsWithPermission.html('
' + + '' + + '
') + const $adminsWithPermissionHeader = $adminsWithPermission.find('div') + $adminsWithPermissionHeader.text(key) + const $adminsWithPermissionSelect = $adminsWithPermission.find('select'); + + const adminMap = {}; + + $.each(response.admins, (groupName) => { + const optgroup = document.createElement('optgroup'); + optgroup.label = groupName; + $.each(response.admins[groupName], (adminId) => { + const option = document.createElement('option'); + const adminName = response.admins[groupName][adminId]; + option.value = adminId; + option.text = adminName; + optgroup.append(option); + adminMap[adminId] = adminName + ' - ' + groupName; + }) + $adminsWithPermissionSelect.append(optgroup); + }); + + $adminsWithPermissionSelect.select2({ dropdownParent: $modalBody }); + $adminsWithPermissionSelect.on('change', () => { + const adminId = $adminsWithPermissionSelect.val() + $.ajax({ + method: 'POST', + url: window.location.href, + data: { + action: 'updatePermissionConfigForSingleAdmin', + configKey: key, + adminId, + configValue: true, + [param]: token + }, + dataType: 'text', + success: () => refreshAdminPermissionsPane(key) + }); + }) + + document.addEventListener('keyup', filterAdminTable, true); + + const $adminsWithPermissionTable = $adminsWithPermission.find('tbody'); + $.each(response.adminsWithPermissionIds, (_, adminId) => { + const $atr = $('' + adminMap[adminId] + + '') + $atr.find('button').on('click', () => { + $.ajax({ + method: 'POST', + url: window.location.href, + data: { + action: 'updatePermissionConfigForSingleAdmin', + configKey: key, + adminId, + configValue: false, + [param]: token + }, + dataType: 'text', + success: () => { + $atr.remove(); + } + }); + }) + $adminsWithPermissionTable.append($atr); + }) + } + }); + } + + let firstRadio = null; + + function drawThFooter(data, tbody) { + const htr = document.createElement('TR'); + const hth1 = document.createElement('TH'); + hth1.append(document.createTextNode('Права для отдельных пользователей')); + htr.append(hth1) + + $.each(data.permissions, function(key) { + const hth = document.createElement('TH') + const radio = document.createElement('INPUT'); + radio.type = 'radio'; + radio.name = 'radio'; + radio.onclick = () => refreshAdminPermissionsPane(key); + if (!firstRadio) { + firstRadio = radio; + } + hth.append(radio); + htr.append(hth) + }) + tbody.append(htr); + } + drawTH(data, tbody); $.each(data.adminGroups, function(ind) { @@ -80,10 +201,19 @@ function showPermissionDialog(menu_id, url, index) { }); drawTH(data, tbody); + drawThFooter(data, tbody); table.append(tbody); $modalBody.append(table); + $modalBody.append('
'); + + $modalBody.append('
'); + + if (firstRadio) { + firstRadio.click(); + } + $('#mymodal').modal('show'); } }); -- 2.39.5