Code for task #89846.

This commit is contained in:
liumengyi
2023-04-05 23:30:40 +08:00
parent bbe679c233
commit 08e4ae2e2e
3 changed files with 123 additions and 28 deletions
+9 -3
View File
@@ -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;
}
+83 -4
View File
@@ -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);
});
})
+31 -21
View File
@@ -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>