From 378fb4f83935be7622918f5e03df9d86d5de75a2 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Thu, 9 Mar 2023 07:17:42 +0000 Subject: [PATCH 01/23] * Code for task #86260. --- module/group/control.php | 71 ++++++++++++++++++- module/group/js/editmanagepriv.js | 13 +++- module/group/lang/de.php | 33 ++++----- module/group/lang/en.php | 33 ++++----- module/group/lang/fr.php | 33 ++++----- module/group/lang/zh-cn.php | 39 +++++----- module/group/model.php | 52 ++++++++++++-- module/group/view/editmanagepriv.html.php | 2 +- .../group/view/editmanageprivbycard.html.php | 45 +++--------- 9 files changed, 210 insertions(+), 111 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index 0b7a5f98a4..6fcbe5369b 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 @@ -407,11 +407,37 @@ class group extends control $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recTotal=$recTotal&recPerPage=$recPerPage"); $this->group->buildPrivSearchForm($queryID, $actionURL); + $moduleLang = $this->group->getMenuModules('', true); + + 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(); + + $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; + } + $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->pager = $pager; + $this->display(); } @@ -583,6 +609,7 @@ class group extends control } } } + /** * * edit priv @@ -621,4 +648,46 @@ class group extends control $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/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index 7234ab73dc..d0193e7c8a 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -70,13 +70,22 @@ $(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) { console.log($(e.target).attr('type')); }).on('click', 'label', function(e) { - if($(e.target).prop('tagName') == 'LABEL'); - console.log('label'); + if($(e.target).prop('tagName') == 'LABEL') + { + var selectedID = $(this).siblings('input:checkbox').data('id'); + $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + selectedID), function(data) + { + var relatedPriv = JSON.parse(data); + var dependData = relatedPriv.depend; + var recommendData = relatedPriv.recommend; + }) + } }); }); diff --git a/module/group/lang/de.php b/module/group/lang/de.php index f67ff53f3c..aa380f4e3e 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -65,22 +65,23 @@ $lang->group->addRecommendation = 'Add Recommendation'; $lang->group->selectedPrivs = 'Selected Privilege: %s'; $lang->group->selectModule = 'Select Module'; -$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'; 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..49537dbce7 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -65,22 +65,23 @@ $lang->group->addRecommendation = 'Add Recommendation'; $lang->group->selectedPrivs = 'Selected Privilege: %s'; $lang->group->selectModule = 'Select Module'; -$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'; 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..a7b87ebd51 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -65,22 +65,23 @@ $lang->group->addRecommendation = 'Add Recommendation'; $lang->group->selectedPrivs = 'Selected Privilege: %s'; $lang->group->selectModule = 'Select Module'; -$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'; 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..a2f30591ae 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 = '维护权限包'; @@ -65,22 +65,23 @@ $lang->group->addRecommendation = '添加推荐'; $lang->group->selectedPrivs = '选中权限:%s'; $lang->group->selectModule = '选择模块'; -$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 = '未分配'; if(!isset($lang->privpackage)) $lang->privpackage = new stdclass(); $lang->privpackage->common = '权限包'; diff --git a/module/group/model.php b/module/group/model.php index 115b54c400..205a6a6061 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) @@ -842,6 +843,17 @@ class groupModel extends model 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. * @@ -1113,12 +1125,13 @@ 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') + ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv') ->where('t1.priv')->eq($priv) - ->andWhere('t1.type')->eq($type) + ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() ->beginIF($module)->andWhere('t2.module')->eq($module)->fi() ->fetchAll('id'); } @@ -1246,5 +1259,32 @@ class groupModel extends model $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/editmanagepriv.html.php b/module/group/view/editmanagepriv.html.php index d35956ce29..a088648a08 100644 --- a/module/group/view/editmanagepriv.html.php +++ b/module/group/view/editmanagepriv.html.php @@ -46,7 +46,7 @@
- ' . $lang->group->add, '', 'btn btn-primary');?> + inLink('addDependent'), $lang->group->add, '', "class='btn btn-primary'");?>
diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index 950bb72b4e..e85831289f 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -21,48 +21,25 @@ + $packages):?> - 首页 - 首页 - -
-
- - -
-
- - - - 地盘 - 地盘 + + $privs):?> + group->unassigned);?> + $priv):?>
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - + methodName;?> + + $label), $action, "title='{$label}' id='actions[$module]$action' data-id='$privID'");?>
+ + + From dac0e8fad438c60b440a68442cbf1ae500e12992 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Thu, 9 Mar 2023 15:30:56 +0800 Subject: [PATCH 02/23] * Adjust code . --- module/group/css/manageprivpackage.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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;} From 70947f311157a72d5d661de6237c7f6a045886c7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 9 Mar 2023 15:33:51 +0800 Subject: [PATCH 03/23] * code for add recommendation. --- module/group/control.php | 38 ++++++++------- module/group/model.php | 48 ++++++++++++++----- module/group/view/addrecommendation.html.php | 50 ++++++++++++++------ 3 files changed, 94 insertions(+), 42 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index 0b7a5f98a4..9f49265b42 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -501,52 +501,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 = "
    • "; $tree .= html::a('#', $modules[$module]); $tree .= "
        "; foreach($modulePrivs[$module] as $id => $modulePriv) { - if($privID == $id) continue; + if(in_array($id, $privIdList)) continue; $tree .= '
      • '; - $tree .= html::checkbox('relation', array($id => $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : ''); + $tree .= html::checkbox("relation[$module]", array($id => $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : ''); $tree .= '
      • '; } - $tree .= '
    • '; + $tree .= '
  • '; return print($tree); } @@ -585,7 +589,7 @@ class group extends control } /** * - * edit priv + * edit priv * @param int $privID * @access public * @return void @@ -597,7 +601,7 @@ class group extends control $privID = intval($privID); $currentLang = $this->app->clientLang ? : 'zh-cn'; $priv = $this->group->getPrivInfo($privID,$currentLang); - + if(!empty($_POST)) { $responseResult = "success"; @@ -619,6 +623,6 @@ class group extends control { $this->view->priv = $priv; $this->display(); - } + } } } diff --git a/module/group/model.php b/module/group/model.php index 115b54c400..155da2dd89 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1034,6 +1034,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. * @@ -1117,7 +1133,7 @@ class groupModel extends model { return $this->dao->select('t2.*')->from(TABLE_PRIVRELATION)->alias('t1') ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id') - ->where('t1.priv')->eq($priv) + ->where('t1.priv')->in($priv) ->andWhere('t1.type')->eq($type) ->beginIF($module)->andWhere('t2.module')->eq($module)->fi() ->fetchAll('id'); @@ -1133,18 +1149,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(); + } } } } @@ -1173,7 +1199,7 @@ class groupModel extends model } return $privInfo; } - + /** * @@ -1185,13 +1211,13 @@ class groupModel extends model **/ public function getModuleAndPackageTree() { - + $this->loadModel('setting'); $views = empty($viewName) ? $this->setting->getItem("owner=system&module=priv&key=views") : $viewName; if(empty($views)) return array(); $views = explode(',', $views); - + $tree = []; foreach($views as $viewIndex => $view) { @@ -1202,7 +1228,7 @@ class groupModel extends model foreach($viewModules as $moduleIndex => $module) { $this->app->loadLang($module); - + $tree[$module] = $this->lang->{$module}->common;; $packages = $this->getPrivPackagesByModule($module); foreach($packages as $packageID => $package) @@ -1212,7 +1238,7 @@ class groupModel extends model } } return $tree; - + } /** * @@ -1229,7 +1255,7 @@ class groupModel extends model $data = fixer::input('post')->remove('name,desc')->get(); if($data->module) - { + { $update = []; $module = explode(",",$data->module); $update['module'] = $module[0]; 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);?> + From b7c89a959ee822d121bb6906054ba2e558e3e540 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 9 Mar 2023 15:37:47 +0800 Subject: [PATCH 04/23] * adjust for merge. --- module/group/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/group/model.php b/module/group/model.php index b1618b55c2..b9badc56b6 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1146,7 +1146,7 @@ class groupModel extends model return $this->dao->select('t1.type,t2.*,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')->eq($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'); From 038c47e67543aacfcac95a162fad4b8cb28de6cd Mon Sep 17 00:00:00 2001 From: guofeilong Date: Thu, 9 Mar 2023 15:48:22 +0800 Subject: [PATCH 05/23] * Adjust code . --- module/group/js/editmanagepriv.js | 44 +++++++++++-------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index d0193e7c8a..049818141f 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -28,6 +28,12 @@ $(function() }); }; + function updatePrivTree(objTree) + { + $(".menuTree.depend").data('zui.tree').reload(objTree.dependData); + $(".menuTree.recommend").data('zui.tree').reload(objTree.recommendData); + }; + $(".menuTree").on('mouseover', ".priv-item", function() { $(this).addClass('text-primary'); @@ -38,30 +44,10 @@ $(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: '我的日程'}, - ] - } - ]; + var data = []; initRecomendTree(data); initDependTree(data); + $('li.has-list > ul').addClass("menu-active-primary menu-hover-primary"); $('.sorter-group').sortable(); @@ -71,19 +57,21 @@ $(function() location.href = location.href; }); - $('.permission-row .checkbox-primary').on('click', 'input', function(e) - { - console.log($(e.target).attr('type')); - }).on('click', 'label', function(e) + $('.permission-row .checkbox-primary').on('click', 'label', function(e) { + e.stopPropagation(); if($(e.target).prop('tagName') == 'LABEL') { var selectedID = $(this).siblings('input:checkbox').data('id'); $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + selectedID), function(data) { + if(!data) return; var relatedPriv = JSON.parse(data); - var dependData = relatedPriv.depend; - var recommendData = relatedPriv.recommend; + updatePrivTree( + { + dependData: relatedPriv.depend, + recommendData: relatedPriv.recommend + }); }) } }); From 8e7a31f397a4f9c9ea483b88338f157ce0269e17 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Thu, 9 Mar 2023 16:08:32 +0800 Subject: [PATCH 06/23] * Adjust code . --- module/group/css/editmanagepriv.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index ab30377650..92d251cafc 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -2,7 +2,7 @@ .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;} #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%);} @@ -12,7 +12,6 @@ /* 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-content {flex: 1 1 70%;} .sorter-group {display: flex; flex-wrap: wrap;} From 6b9346430ab24e4f2f194ccc86e30052214793e0 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Thu, 9 Mar 2023 08:27:33 +0000 Subject: [PATCH 07/23] * Finish task #86269, #86272. --- module/group/control.php | 60 ++++++++---- module/group/css/editmanagepriv.css | 1 + module/group/lang/de.php | 1 + module/group/lang/en.php | 1 + module/group/lang/fr.php | 1 + module/group/lang/zh-cn.php | 2 + module/group/model.php | 61 +++++++++++- module/group/view/editmanagepriv.html.php | 4 + .../group/view/editmanageprivbylist.html.php | 96 ++++++++++++------- 9 files changed, 169 insertions(+), 58 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index dcf43ff8b4..bd08ec2f14 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -395,17 +395,7 @@ 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';; - - $this->app->loadClass('pager', $static = true); - $pager = new pager($recTotal, $recPerPage, $pageID); - - $privList = $browseType != 'bysearch' ? $this->group->getPrivsListByView($view, $pager) : $this->group->getPrivsListBySearch($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); + if(empty($browseType) and $browseType != 'bysearch') $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard';; $moduleLang = $this->group->getMenuModules('', true); @@ -430,17 +420,53 @@ class group extends control $this->view->privLang = $privLang; $this->view->privPackages = $privPackages; } + else + { + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); - $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->pager = $pager; + $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); + } + + $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->pager = $pager; + $this->view->modulePackages = $this->group->getModuleAndPackageTree(); $this->display(); } + /** + * Batch change package. + * + * @param int $packageID + * @access public + * @return void + */ + public function batchChangePackage($packageID) + { + if(empty($_POST['privIdList'])) return print(js::reload('parent')); + $privIdList = array_unique($_POST['privIdList']); + $allChanges = $this->group->batchChangePackage($privIdList, $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. * diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index 92d251cafc..dde445eb68 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -25,3 +25,4 @@ #privList .c-view, #privList .c-module, #privList .c-package {width: 100px;} #privList .c-privs {width: 180px;} #privList .c-actions {width: 50px;} +#privList tbody tr td {overflow: hidden; white-space: nowrap;} diff --git a/module/group/lang/de.php b/module/group/lang/de.php index aa380f4e3e..1713434128 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -82,6 +82,7 @@ $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 49537dbce7..a17a3f4c0f 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -82,6 +82,7 @@ $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 a7b87ebd51..7eeee24575 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -82,6 +82,7 @@ $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 a2f30591ae..3c665cad5e 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -82,6 +82,7 @@ $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 = '权限包'; @@ -90,6 +91,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 b9badc56b6..1b8057fdcb 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -863,8 +863,20 @@ class groupModel extends model */ 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(); } /** @@ -1089,15 +1101,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; } /** @@ -1278,6 +1297,38 @@ class groupModel extends model } } + /** + * Batch change package. + * + * @param array $privIdList + * @param string $packageID + * @access public + * @return void + */ + public function batchChangePackage($privIdList, $packageID) + { + $oldPrivs = $this->getPrivByIdList($privIdList); + foreach($privIdList as $privID) + { + $oldPriv = $oldPrivs[$privID]; + if($packageID == $oldPriv->package) continue; + + $priv = new stdclass(); + $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); + } + } + + /** + * 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; diff --git a/module/group/view/editmanagepriv.html.php b/module/group/view/editmanagepriv.html.php index a088648a08..fbd3dd65d0 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?>
    +
    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);?>
    - + +
    + + + + + + + + + + + + + + + + + lang->navGroup->{$priv->module}) ? $this->lang->navGroup->{$priv->module} : $priv->module;?> + + + + + + + + + +
    lang->selectAll}'>" : '') . $lang->group->privName;?>group->view;?>group->module;?>privpackage->belong;?>privp->p1;?>privp->p2;?>actions;?>
    id => '')) : '') . $priv->name;?>{$view}->common) ? $lang->{$view}->common : $view;?>module]) ? $moduleLang[$priv->module] : $priv->module;?>'>package, '');?>'>'>id", '', 'list', 'edit', '', 'iframe', true);?>
    + +
    From d15d23647d7de873b51cc122d0004f65a17f0e62 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 00:53:48 +0000 Subject: [PATCH 08/23] * Optimize code after code review. --- module/group/control.php | 14 ++--- module/group/js/manageprivpackage.js | 14 ++--- module/group/model.php | 56 +++++++++++--------- module/group/view/manageprivpackage.html.php | 2 +- 4 files changed, 45 insertions(+), 41 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index bd08ec2f14..35247b81f1 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -431,6 +431,7 @@ class group extends control $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); + $this->view->pager = $pager; } $this->view->title = $this->lang->group->editManagePriv; @@ -438,8 +439,7 @@ class group extends control $this->view->privList = $privList; $this->view->packages = $this->group->getPrivPackagesByView($view); $this->view->moduleLang = $moduleLang; - $this->view->pager = $pager; - $this->view->modulePackages = $this->group->getModuleAndPackageTree(); + $this->view->modulePackages = $this->group->getModuleAndPackageTree(); $this->display(); } @@ -610,27 +610,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) 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/model.php b/module/group/model.php index 1b8057fdcb..dc698baf9c 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -770,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'); @@ -791,7 +790,7 @@ class groupModel extends model * * @param int $packageID * @access public - * @return bool + * @return array */ public function updatePrivPackage($packageID) { @@ -812,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(); @@ -820,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) { @@ -836,7 +842,7 @@ class groupModel extends model * * @param string $module * @access public - * @return void + * @return array */ public function getPrivPackagesByModule($module) { @@ -859,7 +865,7 @@ class groupModel extends model * * @param string $view * @access public - * @return void + * @return array */ public function getPrivPackagesByView($view = '') { @@ -876,7 +882,7 @@ class groupModel extends model $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(); + return $this->dao->select("id,name,INSTR('$modules', `module`) as moduleOrder")->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('moduleOrder_asc,order_asc')->fetchPairs(); } /** @@ -890,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"); @@ -902,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]); } } @@ -925,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},"; @@ -946,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; @@ -963,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},"; @@ -1108,7 +1115,7 @@ class groupModel extends model 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') + $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() @@ -1319,6 +1326,7 @@ class groupModel extends model $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; } /** diff --git a/module/group/view/manageprivpackage.html.php b/module/group/view/manageprivpackage.html.php index b79bae800e..5b58391b60 100644 --- a/module/group/view/manageprivpackage.html.php +++ b/module/group/view/manageprivpackage.html.php @@ -39,7 +39,7 @@ - > + > name?> desc?> ';?> From 706ed8a3489ecd0bde8fc9578e7e0ce5fa759802 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 01:14:28 +0000 Subject: [PATCH 09/23] * Finish task #86269. --- module/group/control.php | 10 +++++++++- module/group/css/editmanagepriv.css | 3 ++- module/group/lang/de.php | 2 ++ module/group/lang/en.php | 2 ++ module/group/lang/fr.php | 2 ++ module/group/lang/zh-cn.php | 2 ++ module/group/model.php | 20 +++++++++++++++++++ .../group/view/editmanageprivbylist.html.php | 6 ++++-- 8 files changed, 43 insertions(+), 4 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index 35247b81f1..9217624529 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -431,7 +431,15 @@ class group extends control $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); - $this->view->pager = $pager; + + $privRelations = array(); + $privRelations['recommend'] = $this->group->getPrivRelationPairs(array_keys($privList), 'recommend'); + $privRelations['recommend'] = implode(',', $privRelations['recommend']); + $privRelations['dependent'] = $this->group->getPrivRelationPairs(array_keys($privList), 'dependent'); + $privRelations['dependent'] = implode(',', $privRelations['dependent']); + + $this->view->pager = $pager; + $this->view->privRelations = $privRelations; } $this->view->title = $this->lang->group->editManagePriv; diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index dde445eb68..3175eaf6e4 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -22,7 +22,8 @@ .tree ul > li {display: inline-block; width: 50%;} .priv-item > .icon {padding-left: 5px;} +#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/lang/de.php b/module/group/lang/de.php index 1713434128..3e88cff8d3 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -64,6 +64,8 @@ $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'; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index a17a3f4c0f..3d89cd4056 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -64,6 +64,8 @@ $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'; diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php index 7eeee24575..f39541c308 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -64,6 +64,8 @@ $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'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index 3c665cad5e..800c387e2c 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -64,6 +64,8 @@ $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 = '分组名称'; diff --git a/module/group/model.php b/module/group/model.php index dc698baf9c..e914c3f178 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1178,6 +1178,26 @@ class groupModel extends model ->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(); + } + /** * Save relation. * diff --git a/module/group/view/editmanageprivbylist.html.php b/module/group/view/editmanageprivbylist.html.php index 59ced2e61e..8431292ee8 100644 --- a/module/group/view/editmanageprivbylist.html.php +++ b/module/group/view/editmanageprivbylist.html.php @@ -25,6 +25,7 @@ $lang->privp->p2 = '推荐权限'; privpackage->belong;?> privp->p1;?> privp->p2;?> + group->privDesc;?> actions;?> @@ -36,8 +37,9 @@ $lang->privp->p2 = '推荐权限'; {$view}->common) ? $lang->{$view}->common : $view;?> module]) ? $moduleLang[$priv->module] : $priv->module;?> '>package, '');?> - '> - '> + id);?>'>id);?> + id);?>'>id);?> + desc;?> id", '', 'list', 'edit', '', 'iframe', true);?> From 11a18a2188b571b74dae492d662e43178ec2d8fe Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 01:19:46 +0000 Subject: [PATCH 10/23] * Fix bug. --- module/group/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/group/model.php b/module/group/model.php index e914c3f178..287fab12bc 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -882,7 +882,7 @@ class groupModel extends model $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); } $modules = trim($modules, ','); - return $this->dao->select("id,name,INSTR('$modules', `module`) as moduleOrder")->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('moduleOrder_asc,order_asc')->fetchPairs(); + return $this->dao->select('id,name')->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('order_asc')->fetchPairs(); } /** From 43d59e1a46355ebf642df6574638b4ea8e0d1c00 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 01:25:17 +0000 Subject: [PATCH 11/23] * Fix bug of batch change package. --- module/group/control.php | 5 +++-- module/group/model.php | 8 +++++--- module/group/view/editmanageprivbylist.html.php | 7 ++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index 9217624529..ade655055b 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -455,15 +455,16 @@ class group extends control /** * Batch change package. * + * @param string $module * @param int $packageID * @access public * @return void */ - public function batchChangePackage($packageID) + public function batchChangePackage($module, $packageID) { if(empty($_POST['privIdList'])) return print(js::reload('parent')); $privIdList = array_unique($_POST['privIdList']); - $allChanges = $this->group->batchChangePackage($privIdList, $packageID); + $allChanges = $this->group->batchChangePackage($privIdList, $module, $packageID); if(dao::isError()) return print(js::error(dao::getError())); $this->loadModel('action'); diff --git a/module/group/model.php b/module/group/model.php index 287fab12bc..3f77d01cfe 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1328,19 +1328,21 @@ class groupModel extends model * Batch change package. * * @param array $privIdList - * @param string $packageID + * @param string $module + * @param int $packageID * @access public * @return void */ - public function batchChangePackage($privIdList, $packageID) + public function batchChangePackage($privIdList, $module, $packageID) { $oldPrivs = $this->getPrivByIdList($privIdList); foreach($privIdList as $privID) { $oldPriv = $oldPrivs[$privID]; - if($packageID == $oldPriv->package) continue; + 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(); diff --git a/module/group/view/editmanageprivbylist.html.php b/module/group/view/editmanageprivbylist.html.php index 8431292ee8..1b97244024 100644 --- a/module/group/view/editmanageprivbylist.html.php +++ b/module/group/view/editmanageprivbylist.html.php @@ -62,9 +62,10 @@ $lang->privp->p2 = '推荐权限'; $packagesPinYin = common::convert2Pinyin($modulePackages); foreach($modulePackages as $id => $name) { - $packageID = explode(',', $id); - $packageID = isset($packageID[1]) ? $packageID[1] : $packageID[0]; - $actionLink = $this->createLink('group', 'batchChangePackage', "packageID=$packageID"); + $id = explode(',', $id); + $module = $id[0]; + $packageID = isset($id[1]) ? $id[1] : 0; + $actionLink = $this->createLink('group', 'batchChangePackage', "module=$module&packageID=$packageID"); echo html::a('#', $name, '', "data-key='" . zget($packagesPinYin, $name, '') . "' title='{$name}' onclick=\"setFormAction('$actionLink', 'hiddenwin', '#privForm')\""); } ?> From c64d1d411cf2182c65ce6c2b8ee6422f9c8e3b25 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 02:46:58 +0000 Subject: [PATCH 12/23] * Finish task #86271. --- module/group/config.php | 16 +++- module/group/lang/de.php | 2 +- module/group/lang/en.php | 2 +- module/group/lang/fr.php | 2 +- module/group/lang/zh-cn.php | 2 +- module/group/model.php | 80 ++++++++++++++++++- .../group/view/editmanageprivbylist.html.php | 8 ++ 7 files changed, 104 insertions(+), 8 deletions(-) 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/lang/de.php b/module/group/lang/de.php index 3e88cff8d3..e9549e5f3f 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -65,7 +65,7 @@ $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->dependentPrivs = 'Dependented Privs'; $lang->group->id = 'ID'; $lang->group->name = 'Name'; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index 3d89cd4056..04ce460a69 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -65,7 +65,7 @@ $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->dependentPrivs = 'Dependented Privs'; $lang->group->id = 'ID'; $lang->group->name = 'Group'; diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php index f39541c308..d75d5035f7 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -65,7 +65,7 @@ $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->dependentPrivs = 'Dependented Privs'; $lang->group->id = 'ID'; $lang->group->name = 'Groupe'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index 800c387e2c..ab60c59d4e 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -65,7 +65,7 @@ $lang->group->addRecommendation = '添加推荐'; $lang->group->selectedPrivs = '选中权限:%s'; $lang->group->selectModule = '选择模块'; $lang->group->recommendPrivs = '依赖权限'; -$lang->group->DependentPrivs = '推荐权限'; +$lang->group->dependentPrivs = '推荐权限'; $lang->group->id = '编号'; $lang->group->name = '分组名称'; diff --git a/module/group/model.php b/module/group/model.php index 3f77d01cfe..3d09749421 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1148,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')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('recommend')->fetchAll('priv'); + $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')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('dependent')->fetchAll('priv'); + $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'); } @@ -1364,6 +1409,37 @@ class groupModel extends model $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); } diff --git a/module/group/view/editmanageprivbylist.html.php b/module/group/view/editmanageprivbylist.html.php index 1b97244024..326920a586 100644 --- a/module/group/view/editmanageprivbylist.html.php +++ b/module/group/view/editmanageprivbylist.html.php @@ -15,6 +15,13 @@ $lang->privp->p1 = '依赖权限'; $lang->privp->p2 = '推荐权限'; ?> + +
    +

    + noData;?> +

    +
    +
    @@ -77,3 +84,4 @@ $lang->privp->p2 = '推荐权限'; show('right', 'pagerjs');?> + From 28f6ecc8514f36ec85a9c7616a7aab90821f909a Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 10:54:54 +0800 Subject: [PATCH 13/23] * Code for view editmanagepriv . --- module/group/css/editmanagepriv.css | 5 +- module/group/js/editmanagepriv.js | 111 ++++++++++++++-------- module/group/view/editmanagepriv.html.php | 7 +- 3 files changed, 78 insertions(+), 45 deletions(-) diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index 3175eaf6e4..d31496b93d 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -1,5 +1,5 @@ .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%; overflow-y: auto;} @@ -15,12 +15,13 @@ .flex-sm {flex: 1 1 15%;} .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;} /* 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;} diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index 049818141f..ba5030c125 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -1,38 +1,63 @@ +/** + * 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'); + $(".menuTree.recommend").data('zui.tree').reload(objTree.recommendData || []); + if(objTree.recommendData && objTree.recommendData.length) $(".menuTree.recommend + .empty-tip").addClass('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'); - } - }); - }; - - function updatePrivTree(objTree) - { - $(".menuTree.depend").data('zui.tree').reload(objTree.dependData); - $(".menuTree.recommend").data('zui.tree').reload(objTree.recommendData); - }; $(".menuTree").on('mouseover', ".priv-item", function() { @@ -44,9 +69,8 @@ $(function() $(this).find('.icon').addClass('hidden'); }); - var data = []; - initRecomendTree(data); - initDependTree(data); + initRecomendTree([]); + initDependTree([]); $('li.has-list > ul').addClass("menu-active-primary menu-hover-primary"); $('.sorter-group').sortable(); @@ -65,13 +89,16 @@ $(function() var selectedID = $(this).siblings('input:checkbox').data('id'); $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + selectedID), function(data) { - if(!data) return; - var relatedPriv = JSON.parse(data); - updatePrivTree( + var objTree = {}; + if(data) { - dependData: relatedPriv.depend, - recommendData: relatedPriv.recommend - }); + var relatedPriv = JSON.parse(data); + objTree = { + dependData: relatedPriv.depend, + recommendData: relatedPriv.recommend + }; + } + updatePrivTree(objTree); }) } }); diff --git a/module/group/view/editmanagepriv.html.php b/module/group/view/editmanagepriv.html.php index fbd3dd65d0..6da4f38a02 100644 --- a/module/group/view/editmanagepriv.html.php +++ b/module/group/view/editmanagepriv.html.php @@ -41,13 +41,15 @@ { include 'editmanageprivbylist.html.php'; }?> -
    依赖的权限
    +
    +

    noData;?>

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

    noData;?>

    +
    ' . $lang->group->add, '', "class='btn btn-primary iframe'");?> From b47cfb59eff8626e2c1b67736668a0bc7e48c566 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 11:07:39 +0800 Subject: [PATCH 14/23] * Adjust code . --- module/group/css/editmanagepriv.css | 4 ++-- module/group/js/editmanagepriv.js | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index d31496b93d..d29218a30d 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -2,7 +2,7 @@ .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%; overflow-y: auto;} +#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,9 +10,9 @@ .priv-panel > .panel-bottom {padding-top: 20px;} /* permission-table */ -/* .permission-head {padding-right: 20px;}*/ #permissionEditForm tr {display: flex;} .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%; overflow: hidden;} diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index ba5030c125..498b033c82 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -51,9 +51,23 @@ function initDependTree(data) function updatePrivTree(objTree) { $(".menuTree.depend").data('zui.tree').reload(objTree.dependData || [] ); - if(objTree.dependData && objTree.dependData.length) $(".menuTree.depend + .empty-tip").addClass('hidden'); + 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'); + if(objTree.recommendData && objTree.recommendData.length) + { + $(".menuTree.recommend + .empty-tip").addClass('hidden'); + } + else + { + $(".menuTree.recommend + .empty-tip").removeClass('hidden'); + } }; $(function() From 640ec334bb03420d4d584bf3e6d99fd4214e3ef0 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Fri, 10 Mar 2023 03:13:00 +0000 Subject: [PATCH 15/23] * Code for task #86260. --- module/group/view/editmanageprivbycard.html.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index e85831289f..25812b95f3 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -22,10 +22,14 @@
    $packages):?> + + $privs):?> - - $privs):?> - + + + + + - + +
    group->unassigned);?>group->unassigned);?> $priv):?>
    @@ -37,10 +41,10 @@
    - From 4d21e6e6443f6cc4155d20eaf1d58684fe55859f Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 03:14:44 +0000 Subject: [PATCH 16/23] * Fix bug of editmanageprivbylist. --- module/group/control.php | 8 +++--- module/group/model.php | 25 +++++++++++++++++++ .../group/view/editmanageprivbylist.html.php | 4 +-- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index ade655055b..64a41f23bb 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -432,11 +432,9 @@ class group extends control $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recTotal=$recTotal&recPerPage=$recPerPage"); $this->group->buildPrivSearchForm($queryID, $actionURL); - $privRelations = array(); - $privRelations['recommend'] = $this->group->getPrivRelationPairs(array_keys($privList), 'recommend'); - $privRelations['recommend'] = implode(',', $privRelations['recommend']); - $privRelations['dependent'] = $this->group->getPrivRelationPairs(array_keys($privList), 'dependent'); - $privRelations['dependent'] = implode(',', $privRelations['dependent']); + $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; diff --git a/module/group/model.php b/module/group/model.php index 3d09749421..b338c3380a 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1243,6 +1243,31 @@ class groupModel extends model ->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. * diff --git a/module/group/view/editmanageprivbylist.html.php b/module/group/view/editmanageprivbylist.html.php index 326920a586..02bb2d04e1 100644 --- a/module/group/view/editmanageprivbylist.html.php +++ b/module/group/view/editmanageprivbylist.html.php @@ -44,8 +44,8 @@ $lang->privp->p2 = '推荐权限'; {$view}->common) ? $lang->{$view}->common : $view;?> module]) ? $moduleLang[$priv->module] : $priv->module;?> '>package, '');?> - id);?>'>id);?> - id);?>'>id);?> + id, '');?>'>id, '');?> + id, '');?>'>id, '');?> desc;?> id", '', 'list', 'edit', '', 'iframe', true);?> From 1fc88fb6bd4c8dc4f376c95a76f615581fd5d17b Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Fri, 10 Mar 2023 03:18:19 +0000 Subject: [PATCH 17/23] * Remove the checked status. --- module/group/view/editmanageprivbycard.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index 25812b95f3..d61627b047 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -36,7 +36,7 @@
    methodName;?> - $label), $action, "title='{$label}' id='actions[$module]$action' data-id='$privID'");?> + $label), '', "title='{$label}' id='actions[$module]$action' data-id='$privID'");?>
    From 866d343211b9ba83bcc5af71074beb826084dd23 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 11:19:01 +0800 Subject: [PATCH 18/23] * Adjust code . --- module/group/view/editmanageprivbycard.html.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index d61627b047..08559a47cb 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -33,10 +33,17 @@ $priv):?>
    +<<<<<<< Updated upstream
    methodName;?> $label), '', "title='{$label}' id='actions[$module]$action' data-id='$privID'");?> +======= + methodName;?> + +
    $label), $action, "title='{$label}' id='actions[$module]$action' data-id='$privID'");?> +>>>>>>> Stashed changes
    From acdcbaf8e3f513472ff68a2895ed9d05681a1993 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 11:21:36 +0800 Subject: [PATCH 19/23] * Adjust code . --- module/group/view/editmanageprivbycard.html.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index d61627b047..e53394df75 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -33,10 +33,10 @@ $priv):?>
    -
    - methodName;?> - - $label), '', "title='{$label}' id='actions[$module]$action' data-id='$privID'");?> + methodName;?> + +
    $label), $action, "title='{$label}' id='actions[$module]$action' data-id='$privID'");?>
    From 621778b3720ed415e607e4f12add739a145974f2 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 11:23:20 +0800 Subject: [PATCH 20/23] * Adjust code . --- module/group/view/editmanageprivbycard.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php index e53394df75..bb6c9bd3ef 100644 --- a/module/group/view/editmanageprivbycard.html.php +++ b/module/group/view/editmanageprivbycard.html.php @@ -36,7 +36,7 @@ methodName;?>
    $label), $action, "title='{$label}' id='actions[$module]$action' data-id='$privID'");?> + $label), '', "title='{$label}' id='actions[$module]$action' data-id='$privID'");?>
    From 4c1aca27fe34bc14185b355ccead19c2b37babf4 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Fri, 10 Mar 2023 05:13:25 +0000 Subject: [PATCH 21/23] * Fix bug. --- module/group/control.php | 1 + module/group/model.php | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/module/group/control.php b/module/group/control.php index 64a41f23bb..998e485a54 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -396,6 +396,7 @@ class group extends control public function editManagePriv($browseType = '', $view = '', $paramID = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1) { if(empty($browseType) and $browseType != 'bysearch') $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard';; + if($browseType == 'bysearch' and $this->cookie->managePrivEditType == 'bycard') $browseType = 'bycard'; $moduleLang = $this->group->getMenuModules('', true); diff --git a/module/group/model.php b/module/group/model.php index b338c3380a..0744cf158b 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1169,7 +1169,7 @@ class groupModel extends model foreach($out[1] as $priv) { $priv = str_replace('%', '', $priv); - $privs = $this->dao->select('priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('recommend')->fetchAll('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); } @@ -1181,7 +1181,7 @@ class groupModel extends model foreach($out[1] as $priv) { $priv = str_replace('%', '', $priv); - $privs = $this->dao->select('priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('dependent')->fetchAll('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); } From 5d18d0d7932ea73e1e5cd7732b0c8eea949c9509 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 13:14:44 +0800 Subject: [PATCH 22/23] * Adjust code . --- module/group/js/editmanagepriv.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index 498b033c82..e233e6ed66 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -5,7 +5,6 @@ * @access public * @return void */ - function initRecomendTree(data) { $(".menuTree.depend").tree( @@ -72,7 +71,6 @@ function updatePrivTree(objTree) $(function() { - $(".menuTree").on('mouseover', ".priv-item", function() { $(this).addClass('text-primary'); @@ -87,7 +85,10 @@ $(function() 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() { @@ -117,4 +118,3 @@ $(function() } }); }); - From d9e7f415e561b55060445abe6db46d9874701031 Mon Sep 17 00:00:00 2001 From: guofeilong Date: Fri, 10 Mar 2023 13:32:56 +0800 Subject: [PATCH 23/23] * Adjust code . --- module/group/css/editmanagepriv.css | 1 + module/group/js/editmanagepriv.js | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css index d29218a30d..bb94dca5a6 100644 --- a/module/group/css/editmanagepriv.css +++ b/module/group/css/editmanagepriv.css @@ -17,6 +17,7 @@ .sorter-group {display: flex; flex-wrap: wrap;} .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%;} diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js index e233e6ed66..ad394eea16 100644 --- a/module/group/js/editmanagepriv.js +++ b/module/group/js/editmanagepriv.js @@ -101,6 +101,11 @@ $(function() 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) {