From 1938ec534ee1f2a20a7b45c12eb8ffbab4fb70c3 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 10 Apr 2023 10:24:13 +0800 Subject: [PATCH] * Finish task #89842. --- module/group/css/managepriv.css | 7 +++- module/group/js/managepriv.js | 73 +++++++++++++++++++++++++++++++-- module/group/model.php | 3 +- 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/module/group/css/managepriv.css b/module/group/css/managepriv.css index 76f745e3d6..8846c7cbd5 100644 --- a/module/group/css/managepriv.css +++ b/module/group/css/managepriv.css @@ -4,7 +4,7 @@ #mainContainer > .main {flex: 1 1 75%; overflow-y: auto; min-height: 445px;} #mainContainer > .side {flex: 1 1 25%;} .priv-panel {background: #fff; padding: 10px 16px; box-shadow: 0 1px 1px rgb(0 0 0 / 5%), 0 2px 6px 0 rgb(0 0 0 / 5%); height: 240px;} -.priv-panel > .panel-content {height: 200px; overflow-y: auto; min-height: 140px; padding-left: 4px;} +.priv-panel > .panel-content {height: 200px; overflow-y: auto; min-height: 140px; padding-left: 4px; padding-top: 5px;} .priv-panel > .panel-bottom {padding-top: 20px;} .priv-panel > .panel-title {position: relative;} .priv-panel > .panel-title > .icon-help {position: absolute; top: 3px; margin-left: 8px;} @@ -13,8 +13,13 @@ /* tree */ .tree ul > li {display: inline-block; width: 50%;} +.menuTree li > ul {margin-bottom: 0px;} +.menuTree > li.has-list.open:before {top: 25px;} .priv-item > .icon {padding-left: 5px;} .empty-tip {height: 100%;} +.menuTree.recommend > li {padding-left: 0;} +.menuTree.recommend > li.has-list.open:before {left: 7px;} +.menuTree.recommend ul > li {padding-left: 20px; padding-top: 10px;} .table-bymodule select.form-control {height: 250px;} .group-item {display: block; width: 180px; float: left; font-size: 14px;} diff --git a/module/group/js/managepriv.js b/module/group/js/managepriv.js index 7d06dcc8e5..ef0b2c1678 100644 --- a/module/group/js/managepriv.js +++ b/module/group/js/managepriv.js @@ -123,14 +123,13 @@ function initRecomendTree(data) $(".menuTree.recommend").tree( { data: data, - initialState: 'active', + initialState: 'expand', itemCreator: function($li, item) { - $li.append('' + item.title + (item.children ? '' : '') + ''); - // $li.append(''); } }); + $('.menuTree.recommend i.list-toggle').remove(); } /** @@ -170,6 +169,7 @@ function updatePrivTree(privList) { privList.push($(this).closest('.group-item').attr('data-id')); }); + selectedPrivIdList = privList; } $.ajax( @@ -203,6 +203,8 @@ function updatePrivTree(privList) } resizeContainer(); + $('.menuTree.recommend i.list-toggle').remove(); + $('.menuTree.recommend li.has-list').addClass('open'); } }); } @@ -259,6 +261,54 @@ function resizeContainer() } } +/** + * When recommend privs change. + * + * @param object $item + * @param bool $checked + * @access public + * @return void + */ +function recommendChange($item, checked) +{ + var privModule = $item.attr('data-module'); + var privMethod = $item.attr('data-method'); + var $actionItem = $('#privList input[data-id="' + privModule + '-' + privMethod + '"]'); + $actionItem.prop('checked', checked); + if(checked) + { + $item.attr('checked', 'checked'); + $actionItem.attr('checked', 'checked'); + } + else + { + $item.removeAttr('checked'); + $actionItem.removeAttr('checked'); + } + var moduleName = $actionItem.closest('tr').find('.module').attr('data-module'); + var packageID = $actionItem.closest('tr').find('.package').attr('data-package'); + changeParentChecked($actionItem, moduleName, packageID); + + var $parentItem = $item.closest('ul').closest('li').find('input[data-has-children="true"]'); + if($item.closest('ul').find('input[type=checkbox]').length == $item.closest('ul').find('input[type=checkbox][checked=checked]').length) + { + $parentItem.attr('checked', 'checked'); + } + else + { + $parentItem.removeAttr('checked'); + } + + var privID = $actionItem.closest('.group-item').attr('data-id'); + if(privID != 0) + { + var index = selectedPrivIdList.indexOf(privID); + + if(privID > 0 && index < 0 && checked) selectedPrivIdList.push(privID); + if(privID > 0 && index > -1 && !checked) selectedPrivIdList.splice(index, 1); + } +} + $(function() { selectedPrivIdList = Object.values(selectedPrivIdList); @@ -301,6 +351,21 @@ $(function() } }); + $('.side').on('click', '.recommend input[type=checkbox]', (function() + { + var checked = $(this).prop('checked'); + if($(this).attr('data-has-children') == 'true') + { + $(this).closest('li').find('ul > li input[type=checkbox]').each(function(){ + recommendChange($(this), checked); + }); + } + else + { + recommendChange($(this), checked); + } + })); + $('#submit').click(function() { $('#managePrivForm').submit(); diff --git a/module/group/model.php b/module/group/model.php index 720e959024..458b54b9ee 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -2092,7 +2092,8 @@ class groupModel extends model if(!isset($privList[$relatedPriv->type][$module])) $privList[$relatedPriv->type][$module] = array(); $moduleCode = $managerList[$relatedPriv->parent]->type == 'package' ? $managerList[$managerList[$relatedPriv->parent]->parent]->code : $managerList[$relatedPriv->parent]->code; $privList[$relatedPriv->type][$module]['title'] = $modulePairs[$module]; - $privList[$relatedPriv->type][$module]['children'][] = array('title' => $relatedPriv->name, 'relationPriv' => $privID); + $privList[$relatedPriv->type][$module]['id'] = $relatedPriv->parent; + $privList[$relatedPriv->type][$module]['children'][] = array('title' => $relatedPriv->name, 'relationPriv' => $privID, 'parent' => $relatedPriv->parent, 'module' => $relatedPriv->module, 'method' => $relatedPriv->method); } if(empty($type) or $type == 'depend') $privList['depend'] = array_values($privList['depend']);