diff --git a/module/group/config.php b/module/group/config.php index 7c5db1716d..0c031248bb 100644 --- a/module/group/config.php +++ b/module/group/config.php @@ -21,6 +21,18 @@ $config->privPackage->edit->requiredFields = 'name,module'; global $lang; $config->group->priv = new stdclass(); $config->group->priv->search['module'] = 'priv'; -$config->group->priv->search['fields']['name'] = $lang->group->name; -$config->group->priv->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->group->priv->search['fields']['name'] = $lang->group->privName; +$config->group->priv->search['fields']['view'] = $lang->group->view; +$config->group->priv->search['fields']['module'] = $lang->group->module; +$config->group->priv->search['fields']['package'] = $lang->privpackage->belong; +$config->group->priv->search['fields']['recommendPrivs'] = $lang->group->recommendPrivs; +$config->group->priv->search['fields']['dependentPrivs'] = $lang->group->dependentPrivs; +$config->group->priv->search['fields']['desc'] = $lang->group->privDesc; +$config->group->priv->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); +$config->group->priv->search['params']['view'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->group->priv->search['params']['module'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->group->priv->search['params']['package'] = array('operator' => '=', 'control' => 'select', 'values' => ''); +$config->group->priv->search['params']['recommendPrivs'] = array('operator' => 'include', 'control' => 'select', 'values' => ''); +$config->group->priv->search['params']['dependentPrivs'] = array('operator' => 'include', 'control' => 'select', 'values' => ''); +$config->group->priv->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); diff --git a/module/group/control.php b/module/group/control.php index db54bdaf57..f57fee425b 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -382,7 +382,7 @@ class group extends control } /** - * edit manage priv. + * Edit manage priv. * * @param string $browseType * @param string $view @@ -395,26 +395,86 @@ class group extends control */ public function editManagePriv($browseType = '', $view = '', $paramID = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1) { - if(empty($browseType)) $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard';; + if(empty($browseType) and $browseType != 'bysearch') $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard';; + if($browseType == 'bysearch' and $this->cookie->managePrivEditType == 'bycard') $browseType = 'bycard'; - $this->app->loadClass('pager', $static = true); - $pager = new pager($recTotal, $recPerPage, $pageID); + $moduleLang = $this->group->getMenuModules('', true); - $privList = $browseType != 'bysearch' ? $this->group->getPrivsListByView($view, $pager) : $this->group->getPrivsListBySearch($pager); + if($browseType == 'bycard') + { + $moduleList = $this->loadModel('setting')->getItem("owner=system&module=priv§ion=&key={$view}Modules"); + $privGroup = $this->group->getPrivGroup($moduleList); + $privPackages = $this->group->getPrivPackagePairs(); + $privLang = $this->group->getPrivLangPairs(); - /* Build the search form. */ - $queryID = ($browseType == 'bysearch') ? (int)$paramID : 0; - $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recTotal=$recTotal&recPerPage=$recPerPage"); - $this->group->buildPrivSearchForm($queryID, $actionURL); + $privList = array(); + foreach($privGroup as $module => $privs) + { + if(!isset($privList[$module])) $privList[$module] = array(); + foreach($privs as $priv) + { + if(!isset($privList[$module][$priv->package])) $privList[$module][$priv->package] = array(); + $privList[$module][$priv->package][$priv->id] = $priv; + } + } + + $this->view->privLang = $privLang; + $this->view->privPackages = $privPackages; + } + else + { + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $privList = $browseType != 'bysearch' ? $this->group->getPrivsListByView($view, $pager) : $this->group->getPrivsListBySearch($paramID, $pager); + + /* Build the search form. */ + $queryID = ($browseType == 'bysearch') ? (int)$paramID : 0; + $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recTotal=$recTotal&recPerPage=$recPerPage"); + $this->group->buildPrivSearchForm($queryID, $actionURL); + + $privRelations = $this->group->getPrivRelationsByIdList(array_keys($privList)); + if(!isset($privRelations['recommend'])) $privRelations['recommend'] = array(); + if(!isset($privRelations['dependent'])) $privRelations['dependent'] = array(); + + $this->view->pager = $pager; + $this->view->privRelations = $privRelations; + } + + $this->view->title = $this->lang->group->editManagePriv; + $this->view->browseType = $browseType; + $this->view->privList = $privList; + $this->view->packages = $this->group->getPrivPackagesByView($view); + $this->view->moduleLang = $moduleLang; + $this->view->modulePackages = $this->group->getModuleAndPackageTree(); - $this->view->title = $this->lang->group->editManagePriv; - $this->view->browseType = $browseType; - $this->view->privList = $privList; - $this->view->packages = $this->group->getPrivPackagesByView($view); - $this->view->pager = $pager; $this->display(); } + /** + * Batch change package. + * + * @param string $module + * @param int $packageID + * @access public + * @return void + */ + public function batchChangePackage($module, $packageID) + { + if(empty($_POST['privIdList'])) return print(js::reload('parent')); + $privIdList = array_unique($_POST['privIdList']); + $allChanges = $this->group->batchChangePackage($privIdList, $module, $packageID); + if(dao::isError()) return print(js::error(dao::getError())); + + $this->loadModel('action'); + foreach($allChanges as $privID => $changes) + { + $actionID = $this->action->create('priv', $privID, 'Edited'); + $this->action->logHistory($actionID, $changes); + } + return print(js::reload('parent')); + } + /** * Manage privilege packages. * @@ -501,52 +561,56 @@ class group extends control /** * Add recommendation. * - * @param int $privID + * @param string $privIdList * @access public * @return void */ - public function addRecommendation($privID) + public function addRecommendation($privIdList) { if($_POST) { - $this->group->saveRelation(array($privID), 'recommend'); + $this->group->saveRelation($privIdList, 'recommend'); return print(js::reload('parent')); } - $priv = $this->group->getPrivByID($privID); + $privs = $this->group->getPrivByIdList($privIdList); + $modules = array(); + foreach($privs as $priv) $modules[$priv->module] = $priv->module; - $this->view->priv = $priv; + $this->view->privs = $privs; $this->view->modules = array('' => $this->lang->group->selectModule) + $this->group->getMenuModules(null, true); - $this->view->modulePrivs = $this->group->getPrivByModule($priv->module); - $this->view->recommends = $this->group->getPrivRelation($priv->id, 'recommend'); + $this->view->modulePrivs = $this->group->getPrivByModule($modules); + $this->view->recommends = $this->group->getPrivRelation($privIdList, 'recommend'); $this->display(); } /** * Ajax get priv tree. * - * @param int $privID + * @param string $privIdList * @param string $module * @access public * @return void */ - public function ajaxGetPrivTree($privID, $module) + public function ajaxGetPrivTree($privIdList, $module) { + if(is_string($privIdList)) $privIdList = explode(',', $privIdList); + $modules = $this->group->getMenuModules(null, true); $modulePrivs = $this->group->getPrivByModule($module); - $recommends = $this->group->getPrivRelation($privID, 'recommend', $module); + $recommends = $this->group->getPrivRelation($privIdList, 'recommend', $module); - $tree = '
  • '; + $tree = "
  • '; return print($tree); } @@ -554,27 +618,27 @@ class group extends control * Sort priv packages. * * @param int $parentID - * @param int $grade + * @param string $type * @access public * @return void */ - public function sortPrivPackages($parentID = 0, $grade = 0) + public function sortPrivPackages($parentID = 0, $type = '') { $orders = $_POST['orders']; if(empty($orders)) return false; - if($grade == '1') + if($type == 'view') { $orders = str_replace('View,', ',', $orders); $orders = trim($orders, ','); $this->loadModel('setting')->setItem("system.priv.views", $orders); } - if($grade == '2') + if($type == 'module') { $orders = trim($orders, ','); $parentID = rtrim($parentID, 'View'); $this->loadModel('setting')->setItem("system.priv.{$parentID}Modules", $orders); } - if($grade == '3') + if($type == 'package') { $orders = explode(',', $orders); foreach($orders as $index => $id) @@ -583,18 +647,19 @@ class group extends control } } } + /** * edit priv * - * @param int $privID - * @access public - * @return void + * @param int $privID + * @access public + * @return void **/ public function editPriv($privID) { - $privID = intval($privID); + $privID = intval($privID); $currentLang = $this->app->clientLang ? : 'zh-cn'; - $priv = $this->group->getPrivInfo($privID, $currentLang); + $priv = $this->group->getPrivInfo($privID, $currentLang); if(!$priv) { @@ -624,4 +689,46 @@ class group extends control $this->view->priv = $priv; $this->display(); } + + /** + * Add dependent privs. + * + * @access public + * @return void + */ + public function addDependent() + { + $this->display(); + } + + /** + * AJAX: Get priv's related priv list. + * + * @param int $privID + * @param string $type + * @access public + * @return bool + */ + public function ajaxGetPrivRelations($privID, $type = 'depend') + { + $moduleLang = $this->group->getMenuModules('', true); + $relatedPrivs = $this->group->getPrivRelation($privID); + + if(empty($relatedPrivs)) return print(''); + + $privList = array(); + foreach($relatedPrivs as $relatedPrivID => $relatedPriv) + { + if(!isset($privList[$relatedPriv->type])) $privList[$relatedPriv->type] = array(); + if(!isset($privList[$relatedPriv->type][$relatedPriv->module])) $privList[$relatedPriv->type][$relatedPriv->module] = array(); + $privList[$relatedPriv->type][$relatedPriv->module]['title'] = zget($moduleLang, $relatedPriv->module, $relatedPriv->module); + $privList[$relatedPriv->type][$relatedPriv->module]['module'] = $relatedPriv->module; + $privList[$relatedPriv->type][$relatedPriv->module]['children'][] = array('title' => $relatedPriv->name); + } + + $privList['depend'] = array_values($privList['depend']); + $privList['recommend'] = array_values($privList['recommend']); + + return print(json_encode($privList)); + } } diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index ab30377650..bb94dca5a6 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -1,8 +1,8 @@ .mt-m {margin-top: 16px;} - +.flex-center {display: flex; justify-content: center; align-items: center;} .flex-space-center {display: flex; justify-content: space-between; align-items: center;} #mainContent {display: flex; gap: 16px; height: calc(100vh - 120px)} -#mainContent > .main {flex: 1 1 75%;} +#mainContent > .main {flex: 1 1 75%; overflow-y: auto; min-height: 480px;} #mainContent > .side {flex: 1 1 25%;} .priv-panel {background: #fff; padding: 10px; box-shadow: 0 1px 1px rgb(0 0 0 / 5%), 0 2px 6px 0 rgb(0 0 0 / 5%);} @@ -10,19 +10,22 @@ .priv-panel > .panel-bottom {padding-top: 20px;} /* permission-table */ -/* .permission-head {padding-right: 20px;}*/ #permissionEditForm tr {display: flex;} -#permissionEditForm {overflow-y: auto; height: calc(100vh - 180px)} .flex-sm {flex: 1 1 15%;} +.flex-md {flex: 1 1 30%;} .flex-content {flex: 1 1 70%;} .sorter-group {display: flex; flex-wrap: wrap;} -.sorter-group > .group-item {flex: 0 0 25%;} +.sorter-group > .group-item {flex: 0 0 25%; overflow: hidden;} .checkbox-primary > input {width: 20px;} +.permission-row label.active {background: #e6f0ff;} /* tree */ .tree ul > li {display: inline-block; width: 50%;} .priv-item > .icon {padding-left: 5px;} +.empty-tip {height: 100%;} +#privList .c-name {min-width: 100px;} #privList .c-view, #privList .c-module, #privList .c-package {width: 100px;} -#privList .c-privs {width: 180px;} +#privList .c-privs {min-width: 180px;} #privList .c-actions {width: 50px;} +#privList tbody tr td {overflow: hidden; white-space: nowrap;} diff --git a/module/group/css/manageprivpackage.css b/module/group/css/manageprivpackage.css index 239f3d0587..6581007e0d 100644 --- a/module/group/css/manageprivpackage.css +++ b/module/group/css/manageprivpackage.css @@ -8,4 +8,5 @@ #privPackageTableList > tr.drop-not-allowed {opacity: 0.1!important} tbody.sortable > tr > td.sort-handler .table-nest-toggle:before {cursor: pointer !important;} tbody.sortable > tr > td.sort-handler {color: #3c4353 !important;} - +.has-nest-child > td > .table-nest-toggle {opacity: unset;} +.table-nest-toggle {opacity: 0;} diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index 7234ab73dc..ad394eea16 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -1,33 +1,76 @@ +/** + * Init comp recomend-tree. + * + * @param array data + * @access public + * @return void + */ +function initRecomendTree(data) +{ + $(".menuTree.depend").tree( + { + data: data, + initialState: 'active', + itemCreator: function($li, item) + { + $li.append('' + item.title + (item.children ? '' : '') + ''); + if(item.active) $li.addClass('active open in'); + } + }); +}; + +/** + * Init comp depend-tree. + * + * @param array data + * @access public + * @return void + */ +function initDependTree(data) +{ + $(".menuTree.recommend").tree( + { + data: data, + initialState: 'active', + itemCreator: function($li, item) + { + $li.append('' + item.title + (item.children ? '' : '') + ''); + if(item.active) $li.addClass('active open in'); + } + }); +}; + +/** + * update comp tree after click checkbox-label. + * + * @param obj objTree + * @access public + * @return void + */ +function updatePrivTree(objTree) +{ + $(".menuTree.depend").data('zui.tree').reload(objTree.dependData || [] ); + if(objTree.dependData && objTree.dependData.length) + { + $(".menuTree.depend + .empty-tip").addClass('hidden'); + } + else + { + $(".menuTree.depend + .empty-tip").removeClass('hidden'); + } + $(".menuTree.recommend").data('zui.tree').reload(objTree.recommendData || []); + if(objTree.recommendData && objTree.recommendData.length) + { + $(".menuTree.recommend + .empty-tip").addClass('hidden'); + } + else + { + $(".menuTree.recommend + .empty-tip").removeClass('hidden'); + } +}; + $(function() { - function initRecomendTree(data) - { - $(".menuTree.depend").tree( - { - data: data, - initialState: 'active', - itemCreator: function($li, item) - { - $li.append('' + item.title + (item.children ? '' : '') + ''); - if (item.active) $li.addClass('active open in'); - } - }); - }; - - function initDependTree(data) - { - $(".menuTree.recommend").tree( - { - data: data, - initialState: 'active', - itemCreator: function($li, item) - { - $li.append('' + item.title + (item.children ? '' : '') + ''); - if (item.active) $li.addClass('active open in'); - } - }); - }; - $(".menuTree").on('mouseover', ".priv-item", function() { $(this).addClass('text-primary'); @@ -38,45 +81,45 @@ $(function() $(this).find('.icon').addClass('hidden'); }); - var data = [ - { - title: '地盘', - children: [ - {title: '地盘仪表盘'}, - {title: '我的项目'}, - {title: '个性化设置'}, - {title: '维护联系人'}, - {title: '我的日程'}, - {title: '地盘仪表盘'}, - {title: '我的项目'}, - {title: '个性化设置'}, - {title: '维护联系人'}, - {title: '我的日程'}, - {title: '地盘仪表盘'}, - {title: '我的项目'}, - {title: '个性化设置'}, - {title: '维护联系人'}, - {title: '我的日程'}, - ] - } - ]; - initRecomendTree(data); - initDependTree(data); + initRecomendTree([]); + initDependTree([]); + $('li.has-list > ul').addClass("menu-active-primary menu-hover-primary"); - $('.sorter-group').sortable(); + $('.sorter-group').sortable( + { + 'selector': '.group-item' + }); $('.btn-switch').on('click', function() { $.cookie('managePrivEditType', $(this).data('type'), {expires: config.cookieLife, path: config.webRoot}); location.href = location.href; }); - $('.permission-row .checkbox-primary').on('click', 'input', function(e) + + $('.permission-row .checkbox-primary').on('click', 'label', function(e) { - console.log($(e.target).attr('type')); - }).on('click', 'label', function(e) - { - if($(e.target).prop('tagName') == 'LABEL'); - console.log('label'); + e.stopPropagation(); + if($(e.target).prop('tagName') == 'LABEL') + { + if($('.permission-row label.bg-primary-pale').length) + { + $('.permission-row label.bg-primary-pale').removeClass('bg-primary-pale'); + } + $(e.target).addClass('bg-primary-pale'); + var selectedID = $(this).siblings('input:checkbox').data('id'); + $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + selectedID), function(data) + { + var objTree = {}; + if(data) + { + var relatedPriv = JSON.parse(data); + objTree = { + dependData: relatedPriv.depend, + recommendData: relatedPriv.recommend + }; + } + updatePrivTree(objTree); + }) + } }); }); - diff --git a/module/group/js/manageprivpackage.js b/module/group/js/manageprivpackage.js index 1f17308144..55b0eec102 100644 --- a/module/group/js/manageprivpackage.js +++ b/module/group/js/manageprivpackage.js @@ -6,10 +6,6 @@ $(function() selector: 'tr', dragCssClass: 'drag-row', trigger: $list.find('.sort-handler').length ? '.sort-handler' : null, - before: function(e) - { - // if($(e.event.target).closest('a,.btn').length) return false; - }, canMoveHere: function($ele, $target) { return $ele.data('parent') === $target.data('parent'); @@ -20,15 +16,15 @@ $(function() }, finish: function(e) { - var orders = ''; - var $parent = $(e.element).data('parent'); - var parentID = typeof $parent == 'object' ? $parent.id : 0; - var grade = typeof $parent == 'object' ? parseInt($parent.level + 1) : 1; + var orders = ''; + var $item = $(e.element); + var type = $item.data('type'); + var parentID = type == 'view' ? 0 : $(e.element).data('parent').id; $list.find('tr[data-parent="' + parentID + '"]').each(function(){ orders += $(this).data('id') + ','; }); - $.post(createLink('group', 'sortPrivPackages', 'parent=' + parentID + '&grade=' + grade), {'orders': orders}); + $.post(createLink('group', 'sortPrivPackages', 'parent=' + parentID + '&type=' + type), {'orders': orders}); e.element.addClass('drop-success'); setTimeout(function(){e.element.removeClass('drop-success');}, 800); diff --git a/module/group/lang/de.php b/module/group/lang/de.php index f67ff53f3c..e9549e5f3f 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = 'Sort Priv Package'; $lang->group->addRecommendation = 'Add Recommendation'; $lang->group->selectedPrivs = 'Selected Privilege: %s'; $lang->group->selectModule = 'Select Module'; +$lang->group->recommendPrivs = 'Recommended Privs'; +$lang->group->dependentPrivs = 'Dependented Privs'; -$lang->group->id = 'ID'; -$lang->group->name = 'Name'; -$lang->group->desc = 'Beschreibung'; -$lang->group->role = 'Rolle'; -$lang->group->acl = 'Rechte'; -$lang->group->users = 'Benutzer'; -$lang->group->module = 'Module'; -$lang->group->method = 'Methoden'; -$lang->group->priv = 'Gruppe'; -$lang->group->option = 'Option'; -$lang->group->inside = 'Gruppenbenutzer'; -$lang->group->outside = 'Andere Benutzer'; -$lang->group->limited = 'Limited Users'; -$lang->group->other = 'Andere'; -$lang->group->all = 'Alle'; -$lang->group->config = 'Config'; +$lang->group->id = 'ID'; +$lang->group->name = 'Name'; +$lang->group->desc = 'Beschreibung'; +$lang->group->role = 'Rolle'; +$lang->group->acl = 'Rechte'; +$lang->group->users = 'Benutzer'; +$lang->group->module = 'Module'; +$lang->group->method = 'Methoden'; +$lang->group->priv = 'Gruppe'; +$lang->group->option = 'Option'; +$lang->group->inside = 'Gruppenbenutzer'; +$lang->group->outside = 'Andere Benutzer'; +$lang->group->limited = 'Limited Users'; +$lang->group->other = 'Andere'; +$lang->group->all = 'Alle'; +$lang->group->config = 'Config'; +$lang->group->unassigned = 'Unassigned'; +$lang->group->view = 'View'; if(!isset($lang->privPackage)) $lang->privPackage = new stdclass(); $lang->privpackage->common = 'Priv Package'; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index c2024c7d9b..04ce460a69 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = 'Sort Priv Package'; $lang->group->addRecommendation = 'Add Recommendation'; $lang->group->selectedPrivs = 'Selected Privilege: %s'; $lang->group->selectModule = 'Select Module'; +$lang->group->recommendPrivs = 'Recommended Privs'; +$lang->group->dependentPrivs = 'Dependented Privs'; -$lang->group->id = 'ID'; -$lang->group->name = 'Group'; -$lang->group->desc = 'Description'; -$lang->group->role = 'Role'; -$lang->group->acl = 'Right'; -$lang->group->users = 'Group Members'; -$lang->group->module = 'Module'; -$lang->group->method = 'Method'; -$lang->group->priv = 'Privilege Group'; -$lang->group->option = 'Option'; -$lang->group->inside = 'Group Users'; -$lang->group->outside = 'Other Users'; -$lang->group->limited = 'Limited Users'; -$lang->group->other = 'Others'; -$lang->group->all = 'All Privileges'; -$lang->group->config = 'Config'; +$lang->group->id = 'ID'; +$lang->group->name = 'Group'; +$lang->group->desc = 'Description'; +$lang->group->role = 'Role'; +$lang->group->acl = 'Right'; +$lang->group->users = 'Group Members'; +$lang->group->module = 'Module'; +$lang->group->method = 'Method'; +$lang->group->priv = 'Privilege Group'; +$lang->group->option = 'Option'; +$lang->group->inside = 'Group Users'; +$lang->group->outside = 'Other Users'; +$lang->group->limited = 'Limited Users'; +$lang->group->other = 'Others'; +$lang->group->all = 'All Privileges'; +$lang->group->config = 'Config'; +$lang->group->unassigned = 'Unassigned'; +$lang->group->view = 'View'; if(!isset($lang->privpackage)) $lang->privpackage = new stdclass(); $lang->privpackage->common = 'Priv Package'; diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php index fa9776dcf0..d75d5035f7 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = 'Sort Priv Package'; $lang->group->addRecommendation = 'Add Recommendation'; $lang->group->selectedPrivs = 'Selected Privilege: %s'; $lang->group->selectModule = 'Select Module'; +$lang->group->recommendPrivs = 'Recommended Privs'; +$lang->group->dependentPrivs = 'Dependented Privs'; -$lang->group->id = 'ID'; -$lang->group->name = 'Groupe'; -$lang->group->desc = 'Description'; -$lang->group->role = 'Rôle'; -$lang->group->acl = 'Right'; -$lang->group->users = 'Membres Groupe'; -$lang->group->module = 'Module'; -$lang->group->method = 'Méthode'; -$lang->group->priv = 'Groupe de Privilèges'; -$lang->group->option = 'Option'; -$lang->group->inside = "Groupe d'utilisateurs"; -$lang->group->outside = 'Autres utilisateurs'; -$lang->group->limited = 'Limited Users'; -$lang->group->other = 'Autres'; -$lang->group->all = 'Tous les Privilèges'; -$lang->group->config = 'Config'; +$lang->group->id = 'ID'; +$lang->group->name = 'Groupe'; +$lang->group->desc = 'Description'; +$lang->group->role = 'Rôle'; +$lang->group->acl = 'Right'; +$lang->group->users = 'Membres Groupe'; +$lang->group->module = 'Module'; +$lang->group->method = 'Méthode'; +$lang->group->priv = 'Groupe de Privilèges'; +$lang->group->option = 'Option'; +$lang->group->inside = "Groupe d'utilisateurs"; +$lang->group->outside = 'Autres utilisateurs'; +$lang->group->limited = 'Limited Users'; +$lang->group->other = 'Autres'; +$lang->group->all = 'Tous les Privilèges'; +$lang->group->config = 'Config'; +$lang->group->unassigned = 'Unassigned'; +$lang->group->view = 'View'; if(!isset($lang->privpackage)) $lang->privpackage = new stdclass(); $lang->privpackage->common = 'Priv Package'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index d35a1cc8b3..ab60c59d4e 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -51,9 +51,9 @@ $lang->group->noGroup = '暂时没有分组。'; $lang->group->repeat = "『%s』已经有『%s』这条记录了,请调整后再试。"; $lang->group->noneProject = '暂时没有项目'; $lang->group->addPriv = '新增权限'; -$lang->group->editPriv = '编辑权限'; -$lang->group->privName = '权限名称'; -$lang->group->privDesc = '描述'; +$lang->group->editPriv = '编辑权限'; +$lang->group->privName = '权限名称'; +$lang->group->privDesc = '描述'; $lang->group->add = '添加'; $lang->group->batchSetDependency = '批量设置依赖'; $lang->group->managePrivPackage = '维护权限包'; @@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = '权限包排序'; $lang->group->addRecommendation = '添加推荐'; $lang->group->selectedPrivs = '选中权限:%s'; $lang->group->selectModule = '选择模块'; +$lang->group->recommendPrivs = '依赖权限'; +$lang->group->dependentPrivs = '推荐权限'; -$lang->group->id = '编号'; -$lang->group->name = '分组名称'; -$lang->group->desc = '分组描述'; -$lang->group->role = '角色'; -$lang->group->acl = '权限'; -$lang->group->users = '用户列表'; -$lang->group->module = '模块'; -$lang->group->method = '方法'; -$lang->group->priv = '权限'; -$lang->group->option = '选项'; -$lang->group->inside = '组内用户'; -$lang->group->outside = '组外用户'; -$lang->group->limited = '受限用户组'; -$lang->group->other = '其他模块'; -$lang->group->all = '所有权限'; -$lang->group->config = '配置'; +$lang->group->id = '编号'; +$lang->group->name = '分组名称'; +$lang->group->desc = '分组描述'; +$lang->group->role = '角色'; +$lang->group->acl = '权限'; +$lang->group->users = '用户列表'; +$lang->group->module = '模块'; +$lang->group->method = '方法'; +$lang->group->priv = '权限'; +$lang->group->option = '选项'; +$lang->group->inside = '组内用户'; +$lang->group->outside = '组外用户'; +$lang->group->limited = '受限用户组'; +$lang->group->other = '其他模块'; +$lang->group->all = '所有权限'; +$lang->group->config = '配置'; +$lang->group->unassigned = '未分配'; +$lang->group->view = '视图'; if(!isset($lang->privpackage)) $lang->privpackage = new stdclass(); $lang->privpackage->common = '权限包'; @@ -89,6 +93,7 @@ $lang->privpackage->name = '权限包名称'; $lang->privpackage->module = '所属模块'; $lang->privpackage->desc = '权限包说明'; $lang->privpackage->belong = '所属权限包'; + $lang->group->copyOptions['copyPriv'] = '复制权限'; $lang->group->copyOptions['copyUser'] = '复制用户'; diff --git a/module/group/model.php b/module/group/model.php index 12398d3067..83d4586d52 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -723,11 +723,12 @@ class groupModel extends model /** * Get modules in menu * - * @param string $menu + * @param string $menu + * @param bool $translateLang * @access public * @return array */ - public function getMenuModules($menu, $translateLang = false) + public function getMenuModules($menu = '', $translateLang = false) { $modules = array(); foreach($this->lang->resource as $moduleName => $action) @@ -769,16 +770,15 @@ class groupModel extends model * Create a privilege package. * * @access public - * @return bool + * @return int */ public function createPrivPackage() { $package = fixer::input('post')->get(); - if(isset($package->module)) - { - $packages = $this->getPrivPackagesByModule($package->module); - $package->order = (count($packages) + 1) * 5; - } + + $packages = $this->getPrivPackagesByModule($package->module); + $package->order = (count($packages) + 1) * 5; + $this->dao->insert(TABLE_PRIVPACKAGE)->data($package)->batchCheck($this->config->privPackage->create->requiredFields, 'notempty')->exec(); $packageID = $this->dao->lastInsertId(); $this->loadModel('action')->create('privpackage', $packageID, 'Opened'); @@ -790,7 +790,7 @@ class groupModel extends model * * @param int $packageID * @access public - * @return bool + * @return array */ public function updatePrivPackage($packageID) { @@ -811,6 +811,13 @@ class groupModel extends model return $changes; } + /** + * Delete a priv package. + * + * @param int $packageID + * @access public + * @return bool + */ public function deletePrivPackage($packageID) { $this->dao->delete()->from(TABLE_PRIVPACKAGE)->where('id')->eq($packageID)->exec(); @@ -819,11 +826,11 @@ class groupModel extends model } /** - * Get priv package by ID. + * Get priv package by id. * * @param int $packageID * @access public - * @return void + * @return object */ public function getPrivPackageByID($packageID) { @@ -835,24 +842,47 @@ class groupModel extends model * * @param string $module * @access public - * @return void + * @return array */ public function getPrivPackagesByModule($module) { return $this->dao->select('*')->from(TABLE_PRIVPACKAGE)->where('module')->eq($module)->orderBy('order_asc')->fetchAll('id'); } + /** + * Get all priv package pairs. + * + * @access public + * @return array + */ + public function getPrivPackagePairs() + { + return $this->dao->select('id,name')->from(TABLE_PRIVPACKAGE)->fetchPairs(); + } + /** * Get priv packages by view. * * @param string $view * @access public - * @return void + * @return array */ public function getPrivPackagesByView($view = '') { - $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - return $this->dao->select('*')->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('order_asc')->fetchAll('id'); + $this->loadModel('setting'); + if(empty($view)) + { + $modules = ''; + $views = $this->setting->getItem("owner=system&module=priv&key=views"); + $views = explode(',', $views); + foreach($views as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); + } + else + { + $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); + } + $modules = trim($modules, ','); + return $this->dao->select('id,name')->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('order_asc')->fetchPairs(); } /** @@ -866,10 +896,11 @@ class groupModel extends model { $this->loadModel('setting'); - $tree = array(); - $views = empty($viewName) ? $this->setting->getItem("owner=system&module=priv&key=views") : $viewName; - $views = explode(',', $views); - $modules = array(); + $tree = array(); + $views = empty($viewName) ? $this->setting->getItem("owner=system&module=priv&key=views") : $viewName; + $views = explode(',', $views); + $modules = array(); + $moduleLang = $this->getMenuModules('', true); foreach($views as $view) { $viewModules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); @@ -878,8 +909,7 @@ class groupModel extends model $viewModules = explode(',', $viewModules); foreach($viewModules as $index => $module) { - $this->app->loadLang($module); - $modules[$module] = $this->lang->{$view}->common . '/' . $this->lang->{$module}->common; + $modules[$module] = $this->lang->{$view}->common . '/' . zget($moduleLang, $module); unset($viewModules[$index]); } } @@ -901,13 +931,14 @@ class groupModel extends model if(empty($views)) return array(); $views = explode(',', $views); - $modules = array(); + $modules = array(); + $moduleLang = $this->getMenuModules('', true); foreach($views as $viewIndex => $view) { - $this->app->loadLang($view); $viewID = $view . 'View'; $treeView = new stdclass(); $treeView->id = $viewID; + $treeView->type = 'view'; $treeView->name = $this->lang->{$view}->common; $treeView->parent = 0; $treeView->path = ",{$viewID},"; @@ -922,11 +953,10 @@ class groupModel extends model $viewModules = explode(',', $viewModules); foreach($viewModules as $moduleIndex => $module) { - $this->app->loadLang($module); - $treeModule = new stdclass(); $treeModule->id = $module; - $treeModule->name = $this->lang->{$module}->common; + $treeModule->type = 'module'; + $treeModule->name = zget($moduleLang, $module); $treeModule->parent = $viewID; $treeModule->path = ",{$viewID},{$module},"; $treeModule->grade = 2; @@ -939,6 +969,7 @@ class groupModel extends model { $treePackage = new stdclass(); $treePackage->id = $packageID; + $treePackage->type = 'package'; $treePackage->name = $package->name; $treePackage->parent = $module; $treePackage->path = ",{$viewID},{$module},{$packageID},"; @@ -1034,6 +1065,22 @@ class groupModel extends model ->fetch(); } + /** + * Get priv by id list. + * + * @param string $privIdList + * @access public + * @return array + */ + public function getPrivByIdList($privIdList) + { + return $this->dao->select('t1.*,t2.name,t2.desc')->from(TABLE_PRIV)->alias('t1') + ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv') + ->where('t1.id')->in($privIdList) + ->andWhere('t2.lang')->eq($this->app->getClientLang()) + ->fetchAll('id'); + } + /** * Get priv by module. * @@ -1061,15 +1108,22 @@ class groupModel extends model */ public function getPrivsListByView($view = '', $pager = null) { - $modules = $this->loadModel('setting')->getItem("owner=system&module=priv&key={$view}Modules"); - return $this->dao->select('t1.*,t2.name,t2.desc')->from(TABLE_PRIV)->alias('t1') + $this->loadModel('setting'); + $views = empty($view) ? $this->setting->getItem("owner=system&module=priv&key=views") : $view; + $views = explode(',', $views); + $modules = ''; + foreach($views as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); + $modules = trim($modules, ','); + + $privs = $this->dao->select("t1.*,t2.name,t2.desc, INSTR('$modules', `module`) as moduleOrder")->from(TABLE_PRIV)->alias('t1') ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv') ->where('1=1') ->beginIF(!empty($view))->andWhere('t1.module')->in($modules)->fi() ->andWhere('t2.lang')->eq($this->app->getClientLang()) - ->orderBy('`order`') + ->orderBy("moduleOrder asc, `order` asc") ->page($pager) ->fetchAll('id'); + return $privs; } /** @@ -1094,12 +1148,57 @@ class groupModel extends model $privQuery = $this->session->privQuery; - return $this->dao->select('t1.*,t2.name,t2.desc')->from(TABLE_PRIV)->alias('t1') + $this->loadModel('setting'); + if(strpos($privQuery, '`view`') !== false) + { + preg_match_all("/`view`[^']+'([^']+)'/Ui", $privQuery, $out); + $privQuery = str_replace(array('`view` =', '`view` LIKE', '`view` =', '`view` !=', '`view` NOT LIKE'), array('`view` IN', '`view` IN', '`view` IN', '`view` NOT IN', '`view` NOT IN'), $privQuery); + foreach($out[1] as $view) + { + $view = str_replace('%', '', $view); + $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); + $modules = str_replace(',', "','", $modules); + $privQuery = preg_replace("/`view`([^']+)'([%]?{$view}[%]?)'/Ui", "`module`$1('{$modules}')", $privQuery); + } + } + + if(strpos($privQuery, '`recommendPrivs`') !== false) + { + preg_match_all("/`recommendPrivs`[^']+'([^']+)'/Ui", $privQuery, $out); + $privQuery = str_replace(array('`recommendPrivs` =', '`recommendPrivs` LIKE', '`recommendPrivs` =', '`recommendPrivs` !=', '`recommendPrivs` NOT LIKE'), array('`recommendPrivs` IN', '`recommendPrivs` IN', '`recommendPrivs` IN', '`recommendPrivs` NOT IN', '`recommendPrivs` NOT IN'), $privQuery); + foreach($out[1] as $priv) + { + $priv = str_replace('%', '', $priv); + $privs = $this->dao->select('priv,priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('recommend')->fetchPairs(); + $privs = implode("','", $privs); + $privQuery = preg_replace("/`recommendPrivs`([^']+)'([%]?{$priv}[%]?)'/Ui", (!empty($privs) ? "`id`$1('{$privs}')" : '0=1'), $privQuery); + } + } + if(strpos($privQuery, '`dependentPrivs`') !== false) + { + preg_match_all("/`dependentPrivs`[^']+'([^']+)'/Ui", $privQuery, $out); + $privQuery = str_replace(array('`dependentPrivs` =', '`dependentPrivs` LIKE', '`dependentPrivs` =', '`dependentPrivs` !=', '`dependentPrivs` NOT LIKE'), array('`dependentPrivs` IN', '`dependentPrivs` IN', '`dependentPrivs` IN', '`dependentPrivs` NOT IN', '`dependentPrivs` NOT IN'), $privQuery); + foreach($out[1] as $priv) + { + $priv = str_replace('%', '', $priv); + $privs = $this->dao->select('priv,priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('dependent')->fetchPairs(); + $privs = implode(',', $privs); + $privQuery = preg_replace("/`dependentPrivs`([^']+)'([%]?{$priv}[%]?)'/Ui", (!empty($privs) ? "`id`$1('{$privs}')" : '0=1'), $privQuery); + } + } + + $views = empty($view) ? $this->setting->getItem("owner=system&module=priv&key=views") : $view; + $views = explode(',', $views); + $modules = ''; + foreach($views as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); + $modules = trim($modules, ','); + + return $this->dao->select("t1.*,t2.name,t2.desc, INSTR('$modules', `module`) as moduleOrder")->from(TABLE_PRIV)->alias('t1') ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv') ->where('1=1') ->andWhere($privQuery) ->andWhere('t2.lang')->eq($this->app->getClientLang()) - ->orderBy('`order`') + ->orderBy('`moduleOrder` asc, `order`') ->page($pager) ->fetchAll('id'); } @@ -1113,16 +1212,62 @@ class groupModel extends model * @access public * @return array */ - public function getPrivRelation($priv, $type, $module = '') + public function getPrivRelation($priv, $type = '', $module = '') { - return $this->dao->select('t2.*')->from(TABLE_PRIVRELATION)->alias('t1') + return $this->dao->select('t1.type,t2.*,t3.name')->from(TABLE_PRIVRELATION)->alias('t1') ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id') - ->where('t1.priv')->eq($priv) - ->andWhere('t1.type')->eq($type) + ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv') + ->where('t1.priv')->in($priv) + ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() ->beginIF($module)->andWhere('t2.module')->eq($module)->fi() ->fetchAll('id'); } + /** + * Get priv relation. + * + * @param int $priv + * @param string $type + * @param string $module + * @access public + * @return array + */ + public function getPrivRelationPairs($priv, $type = '', $module = '') + { + return $this->dao->select('t2.id,t3.name')->from(TABLE_PRIVRELATION)->alias('t1') + ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id') + ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv') + ->where('t1.priv')->in($priv) + ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() + ->beginIF($module)->andWhere('t2.module')->eq($module)->fi() + ->fetchPairs(); + } + + /** + * Get priv relation. + * + * @param array $privs + * @access public + * @return array + */ + public function getPrivRelationsByIdList($privs, $type = '') + { + $privs = $this->dao->select('t1.priv,t3.name,t1.type,t1.relationPriv')->from(TABLE_PRIVRELATION)->alias('t1') + ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id') + ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv') + ->where('t1.priv')->in($privs) + ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() + ->fetchGroup('type'); + $relationPrivs = array(); + foreach($privs as $type => $typePrivs) + { + $relationPrivs[$type] = array(); + foreach($typePrivs as $priv) $relationPrivs[$type][$priv->priv] = empty($relationPrivs[$type][$priv->priv]) ? $priv->name : "{$relationPrivs[$type][$priv->priv]},{$priv->name}"; + } + + return $relationPrivs; + } + /** * Save relation. * @@ -1133,18 +1278,28 @@ class groupModel extends model */ public function saveRelation($privIdList, $type) { + if(is_string($privIdList)) $privIdList = explode(',', $privIdList); $data = fixer::input('post')->get(); - $this->dao->delete()->from(TABLE_PRIVRELATION)->where('priv')->in($privIdList)->andWhere('type')->eq($type)->exec(); + $deleteModuleSQL = $this->dao->select('id')->from(TABLE_PRIV)->where('module')->in(array_keys($data->relation))->get(); + $this->dao->delete()->from(TABLE_PRIVRELATION) + ->where('priv')->in($privIdList) + ->andWhere('type')->eq($type) + ->andWhere('relationPriv IN(' . $deleteModuleSQL . ')') + ->exec(); + foreach($privIdList as $privID) { $relation = new stdclass(); $relation->priv = $privID; $relation->type = $type; - foreach($data->relation as $privRelation) + foreach($data->relation as $privModule => $privRelations) { - $relation->relationPriv = $privRelation; - $this->dao->insert(TABLE_PRIVRELATION)->data($relation)->exec(); + foreach($privRelations as $privRelation) + { + $relation->relationPriv = $privRelation; + $this->dao->insert(TABLE_PRIVRELATION)->data($relation)->exec(); + } } } } @@ -1152,12 +1307,13 @@ class groupModel extends model /** * get a priv * - * @param int $privID - * @return object + * @param int $privID + * @param string $lang + * @return object **/ public function getPrivInfo($priv,$lang) { - $privInfo = $this->dao->select("t1.priv,t1.name,t1.desc,t2.module,t2.package")->from(TABLE_PRIVLANG)->alias('t1') + $privInfo = $this->dao->select("t1.priv, t1.name, t1.desc, t2.module, t2.package")->from(TABLE_PRIVLANG)->alias('t1') ->leftJoin(TABLE_PRIV )->alias('t2') ->on("t1.priv = t2.id") ->where('t1.priv')->eq($priv) @@ -1168,7 +1324,7 @@ class groupModel extends model return $privInfo; } - + /** * get prvi package tree @@ -1177,14 +1333,14 @@ class groupModel extends model **/ public function getModuleAndPackageTree() { - $modules = $this->getMenuModules(null,true); + $modules = $this->getMenuModules(null, true); $tree = []; foreach($modules as $module => $moduleName) { - $tree[$module] = $moduleName; - $packages = $this->getPrivPackagesByModule($module); + $tree[$module] = $moduleName; + $packages = $this->getPrivPackagesByModule($module); foreach($packages as $packageID => $package) { $tree[$module . ',' . $packageID] = $moduleName . '/' . $package->name; @@ -1195,8 +1351,8 @@ class groupModel extends model /** * update Priv Info * - * @param void - * @return void + * @param void + * @return void **/ public function updatePrivLang($privID, $lang) { @@ -1207,7 +1363,7 @@ class groupModel extends model if($data->module) { $update = []; - $module = explode(",",$data->module); + $module = explode(",", $data->module); $update['module'] = $module[0]; $update['package'] = 0; if(count($module) > 1) $update['package'] = $module[1]; @@ -1216,12 +1372,105 @@ class groupModel extends model } } + /** + * Batch change package. + * + * @param array $privIdList + * @param string $module + * @param int $packageID + * @access public + * @return void + */ + public function batchChangePackage($privIdList, $module, $packageID) + { + $oldPrivs = $this->getPrivByIdList($privIdList); + foreach($privIdList as $privID) + { + $oldPriv = $oldPrivs[$privID]; + if($packageID == $oldPriv->package and $module == $oldPriv->module) continue; + + $priv = new stdclass(); + $priv->module = $module; + $priv->package = $packageID; + + $this->dao->update(TABLE_PRIV)->data($priv)->autoCheck()->where('id')->eq((int)$privID)->exec(); + if(!dao::isError()) $allChanges[$privID] = common::createChanges($oldPriv, $priv); + } + return $allChanges; + } + + /** + * Build priv search form. + * + * @param int $queryID + * @param string $actionURL + * @access public + * @return void + */ public function buildPrivSearchForm($queryID, $actionURL) { $this->config->group->priv->search['actionURL'] = $actionURL; $this->config->group->priv->search['queryID'] = $queryID; + $this->loadModel('setting'); + + $views = $this->setting->getItem("owner=system&module=priv&key=views"); + $views = explode(',', $views); + foreach($views as $index => $view) + { + $views[$view] = $this->lang->{$view}->common; + unset($views[$index]); + } + + $modules = ''; + foreach(array_keys($views) as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); + $modules = trim($modules, ','); + $modules = explode(',', $modules); + $moduleLang = $this->getMenuModules('', true); + foreach($modules as $index => $module) + { + $modules[$module] = zget($moduleLang, $module); + unset($modules[$index]); + } + + $packages = $this->getPrivPackagesByView(''); + + $privs = $this->getPrivLangPairs(); + + $this->config->group->priv->search['params']['view']['values'] = array('' => '') + $views; + $this->config->group->priv->search['params']['module']['values'] = array('' => '') + $modules; + $this->config->group->priv->search['params']['package']['values'] = array('' => '') + $packages; + $this->config->group->priv->search['params']['recommendPrivs']['values'] = array('' => '') + $privs; + $this->config->group->priv->search['params']['dependentPrivs']['values'] = array('' => '') + $privs; + $this->loadModel('search')->setSearchParams($this->config->group->priv->search); } -} + /** + * Get priv group by module. + * + * @param array $moduleList + * @access public + * @return array + */ + public function getPrivGroup($moduleList = array()) + { + return $this->dao->select('*')->from(TABLE_PRIV) + ->beginIF(!empty($moduleList))->where('module')->in($moduleList)->fi() + ->orderBy('order_asc') + ->fetchGroup('module'); + } + + /** + * Get all priv's lang pairs. + * + * @access public + * @return array + */ + public function getPrivLangPairs() + { + return $this->dao->select('priv,name')->from(TABLE_PRIVLANG) + ->where('lang')->eq($this->app->clientLang) + ->fetchPairs(); + } +} diff --git a/module/group/view/addrecommendation.html.php b/module/group/view/addrecommendation.html.php index 51c4613ff6..3013e5a81b 100644 --- a/module/group/view/addrecommendation.html.php +++ b/module/group/view/addrecommendation.html.php @@ -13,6 +13,7 @@
    @@ -20,33 +21,54 @@
    -
    group->selectedPrivs, $priv->name)?>
    +
    + name; + $privModules[$priv->module][] = $priv->id; + } + $privName = implode('、', $privName); + printf($lang->group->selectedPrivs, $privName); + ?> +
    -
      -
    • - module]);?> -
        - module] as $id => $modulePriv):?> - id) continue;?> -
      • $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : '')?>
      • - -
      -
    • -
    +
    + $privIdList):?> +
      +
    • + +
        + $modulePriv):?> + +
      • module}]", array($id => $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : '')?>
      • + +
      +
    • +
    + +
    -id);?> + diff --git a/module/group/view/editmanagepriv.html.php b/module/group/view/editmanagepriv.html.php index d35956ce29..6da4f38a02 100644 --- a/module/group/view/editmanagepriv.html.php +++ b/module/group/view/editmanagepriv.html.php @@ -15,6 +15,9 @@
    createLink('group', 'browse', ''), '' . $lang->goback, '', 'class="btn btn-back"');?> group->all?> + + searchAB;?> +
    @@ -26,6 +29,7 @@ group->batchSetDependency?>
    +
    -
    依赖的权限
    +
    +

    noData;?>

    +
    - ' . $lang->group->add, '', 'btn btn-primary');?> + inLink('addDependent'), $lang->group->add, '', "class='btn btn-primary'");?>
    推荐的权限
    +
    +

    noData;?>

    +
    ' . $lang->group->add, '', "class='btn btn-primary iframe'");?> diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index 950bb72b4e..d61627b047 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -21,49 +21,30 @@ + $packages):?> + + $privs):?> - 首页 - 首页 - -
    -
    - - -
    -
    - - - - 地盘 - 地盘 + + + + + group->unassigned);?> + $priv):?>
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - + methodName;?> + + $label), '', "title='{$label}' id='actions[$module]$action' data-id='$privID'");?>
    + + + + - diff --git a/module/group/view/editmanageprivbylist.html.php b/module/group/view/editmanageprivbylist.html.php index 576300167f..02bb2d04e1 100644 --- a/module/group/view/editmanageprivbylist.html.php +++ b/module/group/view/editmanageprivbylist.html.php @@ -11,42 +11,77 @@ */ $lang->privp = new stdclass(); -$lang->privp->name = '权限名称'; -$lang->privp->view = '视图'; -$lang->privp->module = '模块'; -$lang->privp->package = '所属权限包'; $lang->privp->p1 = '依赖权限'; $lang->privp->p2 = '推荐权限'; -$lang->privp->module = '模块'; -$lang->privp->desc = '说明'; ?> - - - - - - - - - - - - - - - - - lang->navGroup->{$priv->module}) ? $this->lang->navGroup->{$priv->module} : $priv->module;?> - - - - - - - - - -
    privp->name;?>privp->view;?>privp->module;?>privp->package;?>privp->p1;?>privp->p2;?>actions;?>
    name;?>{$view}->common) ? $lang->{$view}->common : $view;?>{$priv->module}->common) ? $lang->{$priv->module}->common : $priv->module;?>package, '');?>id", '', 'list', 'edit', '', 'iframe', true);?>
    -