Code for task #89846.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
})
|
||||
|
||||
@@ -87,44 +87,55 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($lang->resource as $moduleName => $moduleActions):?>
|
||||
<?php if(!count((array)$moduleActions)) continue;?>
|
||||
<?php if(!$this->group->checkMenuModule($menu, $moduleName)) continue;?>
|
||||
<?php foreach($privList as $moduleName => $packages):?>
|
||||
<?php if(!count((array)$packages)) continue;?>
|
||||
<?php
|
||||
$moduleActions = !empty($lang->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]);
|
||||
?>
|
||||
<?php $i = 1;?>
|
||||
<?php $packages = zget($privList, $moduleName, array());?>
|
||||
<?php foreach($packages as $packageID => $privs):?>
|
||||
<tr class='<?php echo cycle('even, bg-gray');?>'>
|
||||
<?php if($i == 1):?>
|
||||
<th class='text-middle text-left module' rowspan="<?php echo $i == 1 ? count($packages) : 1;?>">
|
||||
<th class='text-middle text-left module' rowspan="<?php echo $i == 1 ? count($packages) : 1;?>" data-module='<?php echo $moduleName;?>' all-privs='<?php echo $modulePrivs;?>' select-privs='<?php echo $moduleSelect;?>'>
|
||||
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
|
||||
<label class='text-left' for='allChecker<?php echo $moduleName;?>'><?php echo $lang->$moduleName->common;?></label>
|
||||
<input type='checkbox' id='allChecker<?php echo $moduleName;?>'>
|
||||
<input type='checkbox' id='allChecker<?php echo $moduleName;?>' value='1' <?php if(!empty($moduleSelect) and $modulePrivs == $moduleSelect) echo 'checked';?>>
|
||||
<label class='text-left <?php if(!empty($moduleSelect) and $modulePrivs != $moduleSelect) echo 'checkbox-indeterminate-block';?>' for='allChecker<?php echo $moduleName;?>'><?php echo $lang->$moduleName->common;?></label>
|
||||
</div>
|
||||
</th>
|
||||
<?php endif;?>
|
||||
<th class='<?php echo $i == 1 ? 'td-sm' : 'td-md';?> text-middle text-left package'>
|
||||
<?php
|
||||
$packagePrivs = count($privs);
|
||||
$packageSelect = $selectPrivs[$moduleName][$packageID] + ($packageID == 0 ? count($unassigned) : 0);
|
||||
?>
|
||||
<th class='<?php echo $i == 1 ? 'td-sm' : 'td-md';?> text-middle text-left package' data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>' all-privs='<?php echo $packagePrivs;?>' select-privs='<?php echo $packageSelect;?>'>
|
||||
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
|
||||
<label class='text-left checkbox-indeterminate-block' for='allCheckerPackage<?php echo $packageID;?>'><?php echo zget($privPackages, $packageID, $lang->group->unassigned);?></label>
|
||||
<input type='checkbox' id='allCheckerPackage<?php echo $packageID;?>'>
|
||||
<input type='checkbox' id='allCheckerModule<?php echo $moduleName;?>Package<?php echo $packageID;?>' value='1' <?php if($packagePrivs == $packageSelect) echo 'checked';?>>
|
||||
<label class='text-left <?php if(!empty($packageSelect) and $packagePrivs != $packageSelect) echo 'checkbox-indeterminate-block';?>' for='allCheckerPackage<?php echo $packageID;?>'><?php echo zget($privPackages, $packageID, $lang->group->unassigned);?></label>
|
||||
</div>
|
||||
</th>
|
||||
|
||||
<?php if(isset($lang->$moduleName->menus)):?>
|
||||
<td class='menus'>
|
||||
<?php echo html::checkbox("actions[$moduleName]", array('browse' => $lang->$moduleName->browse), isset($groupPrivs[$moduleName]) ? $groupPrivs[$moduleName] : '');?>
|
||||
@@ -134,19 +145,18 @@
|
||||
<?php endif;?>
|
||||
<td id='<?php echo $moduleName;?>' class='pv-10px' colspan='<?php echo !empty($lang->$moduleName->menus) ? 1 : 2?>'>
|
||||
<?php foreach($privs as $privID => $priv):?>
|
||||
<div class="group-item">
|
||||
<div class="group-item" data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>'>
|
||||
<div class="checkbox-primary">
|
||||
<?php $action = $priv->method;?>
|
||||
<?php $privName = is_string($privLang[$privID]->name) ? $privLang[$privID]->name : $privLang[$privID]->name->title;?>
|
||||
<?php echo html::checkbox("actions[$moduleName][]", array($action => $privName), isset($groupPrivs[$moduleName][$action]) ? $action : '', "title='{$privName}' id='actions[$moduleName]$action' data-id='$privID'");?>
|
||||
<?php echo html::checkbox("actions[$moduleName][]", array($action => $privName), isset($groupPrivs[$priv->module][$action]) ? $action : '', "title='{$privName}' id='actions[$moduleName]$action' data-id='$privID'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php if($packageID == 0):?>
|
||||
<?php $unassigned = array_diff(array_keys(json_decode(json_encode($moduleActions), true)), zget($privMethods, $moduleName));?>
|
||||
<?php foreach($moduleActions as $action => $actionLabel):?>
|
||||
<?php if(array_search($action, $unassigned) === false) continue;?>
|
||||
<div class="group-item">
|
||||
<div class="group-item" data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>'>
|
||||
<div class="checkbox-primary">
|
||||
<?php echo html::checkbox("actions[{$moduleName}]", array($action => $lang->$moduleName->$actionLabel), isset($groupPrivs[$moduleName][$action]) ? $action : '', "title='{$lang->$moduleName->$actionLabel}'", 'inline');?>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user