diff --git a/module/group/control.php b/module/group/control.php index 50c66030b0..b239f127de 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -248,9 +248,10 @@ class group extends control $privs = $this->group->getPrivsListByView($menu); $privPackages = $this->group->getPrivManagerPairs('package'); $privLang = $this->group->transformPrivLang($privs); - $privMethods = $this->group->transformPrivLang($privs); - $privList = array(); + $privList = array(); + $privMethods = array(); + $selectPrivs = array(); foreach($privs as $priv) { if(!isset($privList[$priv->parentCode])) $privList[$priv->parentCode] = array(); @@ -259,10 +260,15 @@ class group extends control if(!isset($privMethod[$priv->module])) $privMethod[$priv->module] = array(); $privMethods[$priv->module][$priv->method] = $priv->method; + + if(!isset($selectPrivs[$priv->parentCode])) $selectPrivs[$priv->parentCode] = array(); + if(!isset($selectPrivs[$priv->parentCode][$priv->parent])) $selectPrivs[$priv->parentCode][$priv->parent] = 0; + if(!empty($groupPrivs[$priv->module][$priv->method])) $selectPrivs[$priv->parentCode][$priv->parent] ++; } - $this->view->privMethods = $privMethods; $this->view->privList = $privList; + $this->view->privMethods = $privMethods; + $this->view->selectPrivs = $selectPrivs; $this->view->privLang = $privLang; $this->view->privPackages = $privPackages; } diff --git a/module/group/js/managepriv.js b/module/group/js/managepriv.js index 0366b9b158..e3cd655c85 100644 --- a/module/group/js/managepriv.js +++ b/module/group/js/managepriv.js @@ -61,20 +61,99 @@ function updatePrivList(parentType, parentList) }) } +/** + * Change parent item checked. + * + * @access public + * @return void + */ +function changeParentChecked($item, moduleName, packageID) +{ + var moduleAllPrivs = $item.closest('tbody').find('.group-item[data-module=' + moduleName +']').length; + var moduleSelectPrivs = $item.closest('tbody').find('.group-item[data-module=' + moduleName +']').find('[checked=checked]').length; + var $moduleItem = $item.closest('tbody').find('.module[data-module=' + moduleName +']'); + if(moduleSelectPrivs == 0) + { + $moduleItem.find('input[type=checkbox]').removeAttr('checked'); + $moduleItem.find('label').removeClass('checkbox-indeterminate-block'); + } + else if(moduleAllPrivs == moduleSelectPrivs) + { + $moduleItem.find('input[type=checkbox]').attr('checked', 'checked'); + $moduleItem.find('label').removeClass('checkbox-indeterminate-block'); + } + else + { + $moduleItem.find('input[type=checkbox]').removeAttr('checked'); + $moduleItem.find('label').addClass('checkbox-indeterminate-block'); + } + + if(packageID == '') return; + + var packageAllPrivs = $item.closest('tbody').find('.group-item[data-module=' + moduleName +'][data-package=' + packageID +']').length; + var packageSelectPrivs = $item.closest('tbody').find('.group-item[data-module=' + moduleName +'][data-package=' + packageID +']').find('[checked=checked]').length; + var $packageItem = $item.closest('tbody').find('.package[data-module=' + moduleName +'][data-package=' + packageID +']'); + if(packageSelectPrivs == 0) + { + $packageItem.find('input[type=checkbox]').removeAttr('checked'); + $packageItem.find('label').removeClass('checkbox-indeterminate-block'); + } + else if(packageAllPrivs == packageSelectPrivs) + { + $packageItem.find('input[type=checkbox]').attr('checked', 'checked'); + $packageItem.find('label').removeClass('checkbox-indeterminate-block'); + } + else + { + $packageItem.find('input[type=checkbox]').removeAttr('checked'); + $packageItem.find('label').addClass('checkbox-indeterminate-block'); + } +} + $(function() { - $('#privList > tbody > tr > th input[type=checkbox]').change(function() + $('#privList > tbody > tr > th .check-all').change(function() { - var id = $(this).attr('id'); - var checked = $(this).prop('checked'); + var id = $(this).find('input[type=checkbox]').attr('id'); + var checked = $(this).find('input[type=checkbox]').prop('checked'); if(id == 'allChecker') { $('input[type=checkbox]').prop('checked', checked); + + if(checked) $('input[type=checkbox]').attr('checked', checked); + if(!checked) $('input[type=checkbox]').removeAttr('checked'); + $(this).closest('tbody').find('.checkbox-indeterminate-block').removeClass('checkbox-indeterminate-block'); } else { - $(this).parents('tr').find('input[type=checkbox]').prop('checked', checked); + var moduleName = $(this).closest('th').attr('data-module'); + var packageID = $(this).closest('th').hasClass('package') ? $(this).closest('th').attr('data-package') : ''; + var $children = $(this).closest('th').hasClass('package') ? $(this).closest('tbody').find('[data-module=' + moduleName +'][data-package=' + packageID +']') : $(this).closest('tbody').find('[data-module=' + moduleName +']'); + + $children.find('input[type=checkbox]').prop('checked', checked); + $children.find('.checkbox-indeterminate-block').removeClass('checkbox-indeterminate-block'); + + if(checked) $children.find('input[type=checkbox]').attr('checked', checked); + if(!checked) $children.find('input[type=checkbox]').removeAttr('checked'); + + changeParentChecked($(this), moduleName, packageID); } }); + + $('#privList > tbody > tr > td input[type=checkbox]').change(function() + { + var checked = $(this).prop('checked'); + if(checked) + { + $(this).attr('checked', 'checked'); + } + else + { + $(this).removeAttr('checked'); + } + var moduleName = $(this).closest('.group-item').attr('data-module'); + var packageID = $(this).closest('.group-item').attr('data-package'); + changeParentChecked($(this), moduleName, packageID); + }); }) diff --git a/module/group/view/privbygroup.html.php b/module/group/view/privbygroup.html.php index 81f072a8f3..ac1b5153ea 100644 --- a/module/group/view/privbygroup.html.php +++ b/module/group/view/privbygroup.html.php @@ -87,44 +87,55 @@ - resource as $moduleName => $moduleActions):?> - - group->checkMenuModule($menu, $moduleName)) continue;?> + $packages):?> + resource->{$moduleName}) ? $lang->resource->{$moduleName} : null; + /* Check method in select version. */ if($version) { $hasMethod = false; - foreach($moduleActions as $action => $actionLabel) + foreach($privMethods as $module => $methods) { - if(strpos($changelogs, ",$moduleName-$actionLabel,") !== false) + foreach($methods as $method) { - $hasMethod = true; - break; + if(strpos($changelogs, ",$module-$method,") !== false) + { + $hasMethod = true; + break; + } + if(!$hasMethod) continue; } } - if(!$hasMethod) continue; } + + $i = 1; + + $unassigned = (!empty($moduleActions) and !empty($privMethods[$moduleName])) ? array_diff(array_keys(json_decode(json_encode($moduleActions), true)), $privMethods[$moduleName]) : array(); + $modulePrivs = count($privList[$moduleName], 1) - count($selectPrivs[$moduleName], 1) + count($unassigned); + $moduleSelect = array_sum($selectPrivs[$moduleName]); ?> - - $privs):?> '> - +
- - + > +
- text-middle text-left package'> + + text-middle text-left package' data-module='' data-package='' all-privs='' select-privs=''>
- - + > +
- $moduleName->menus)):?> $lang->$moduleName->browse), isset($groupPrivs[$moduleName]) ? $groupPrivs[$moduleName] : '');?> @@ -134,19 +145,18 @@ $priv):?> -
+
method;?> name) ? $privLang[$privID]->name : $privLang[$privID]->name->title;?> - $privName), isset($groupPrivs[$moduleName][$action]) ? $action : '', "title='{$privName}' id='actions[$moduleName]$action' data-id='$privID'");?> + $privName), isset($groupPrivs[$priv->module][$action]) ? $action : '', "title='{$privName}' id='actions[$moduleName]$action' data-id='$privID'");?>
- $actionLabel):?> -
+
$lang->$moduleName->$actionLabel), isset($groupPrivs[$moduleName][$action]) ? $action : '', "title='{$lang->$moduleName->$actionLabel}'", 'inline');?>