]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
[ERP-188] Добавлена возможность назначать права на отдельных пользователей origin/feature_smirnov_erp-188_auth_refactor
authorAlexander Smirnov <fredeom@mail.ru>
Fri, 20 Sep 2024 19:10:51 +0000 (22:10 +0300)
committerAlexander Smirnov <fredeom@mail.ru>
Fri, 20 Sep 2024 19:10:51 +0000 (22:10 +0300)
erp24/commands/AuthController.php
erp24/controllers/AuthController.php
erp24/views/auth/menu.php
erp24/web/js/auth/menu.js

index 5dda9e03289eac5466ba3535a0b5f03a7f59a860..1b3819a92f748e92e1e32a6a1d29b3c93aa6f44d 100644 (file)
@@ -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 {
index 3c5a673a68bb2d4308f88f131cb06feb2ca625f9..bd5f70ca78efe8e52c774bb26b3524f30b3dac89 100644 (file)
@@ -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'));
index d090cdb544add0de10b6b8f1a55a89ee77eebda5..a7499c8b67471934e7e38d06cfe124acfc1e96b0 100644 (file)
@@ -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; }');
 
 ?>
 
index 13ee2b9b4a1b6c57b23dbe545e0fd87022fa7db3..d00a7ea1891e8cc8f420fe2dce836a20212b69bf 100644 (file)
@@ -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('<div class="m-1 p-1"></div>' +
+                            '<select class="m-1 p-1"><option value="-1">Выберите сотрудника для разрешения:</option></select>' +
+                            '<table class="m-1 p-1"><tbody></tbody></table>')
+                        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 = $('<tr><td>' + adminMap[adminId]
+                                + '</td><td><button class="btn btn-danger"">X</button></td></tr>')
+                            $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('<div class="row m-2"></div>');
+
+            $modalBody.append('<div id="adminsWithPermission" class="border-dark border-wd-1"></div>');
+
+            if (firstRadio) {
+                firstRadio.click();
+            }
+
             $('#mymodal').modal('show');
         }
     });