* Merge 18 version code for group module.

This commit is contained in:
tianshujie
2023-10-09 10:38:59 +08:00
parent 58fcc81ced
commit f8d5e5fbda
8 changed files with 99 additions and 145 deletions
+1 -1
View File
@@ -205,7 +205,7 @@ class group extends control
}
if($type == 'byGroup' || $type == 'byPackage') $this->groupZen->managePrivByGroup($groupID, $nav, $version);
if($type == 'byModule') $this->groupZen->managePrivByModule($groupID, $nav, $version);
if($type == 'byModule') $this->groupZen->managePrivByModule();
$this->display();
}
+16 -17
View File
@@ -321,28 +321,27 @@ function positionBtn()
* @access public
* @return void
*/
window.setModulePackages = function()
window.setSubsetPackages = function()
{
const module = $(this).val();
let subset = $(this).val();
$('#packageBox select').addClass('hidden'); // Hide all select first.
$('#packageBox select').val(''); // Unselect all select.
$("select[data-module='" + module + "']").removeClass('hidden'); // Show the action control for current module.
$("select[data-module='" + subset + "']").removeClass('hidden'); // Show the action control for current module.
updatePrivList('module', module);
updatePrivList(subset, '');
}
/**
* Update the action box when module or package selected.
* Update the action box when subset or package selected.
*
* @param string parentType module|package
* @param string parentList
* @param string selectedSubset
* @param string selectedPackages
* @access public
* @return void
*/
function updatePrivList(parentType, parentList)
function updatePrivList(selectedSubset, selectedPackages)
{
const selectedModule = $('#module').val();
$.get($.createLink('group', 'ajaxGetPrivByParents', 'module=' + selectedModule + '&parentType=' + parentType + '&parentList=' + parentList), function(data)
$.get($.createLink('group', 'ajaxGetPrivByParents', 'subset=' + selectedSubset + '&packages=' + selectedPackages), function(data)
{
$('#actions').replaceWith(data);
})
@@ -358,10 +357,10 @@ function setActions()
{
$('#actionBox select').val('');
var hasSelectedPackage = ',' + $('#packageBox select').not('.hidden').val().join(',') + ',';
updatePrivList('package', hasSelectedPackage);
var selectedSubset = $('[name=module]').val();
var selectedPackages = '|' + $('#packageBox select').not('.hidden').val().join('|') + '|';
updatePrivList(selectedSubset, selectedPackages);
}
window.setNoChecked = function()
@@ -411,12 +410,12 @@ function groupItemChange()
changeParentChecked($(this), moduleName, packageID);
var privID = $(this).closest('.group-item').attr('data-id');
if(privID != 0)
if(privID)
{
var index = selectedPrivIdList.indexOf(privID);
if(privID > 0 && index < 0 && checked) selectedPrivIdList.push(privID);
if(privID > 0 && index > -1 && !checked) selectedPrivIdList.splice(index, 1);
if(index < 0 && checked) selectedPrivIdList.push(privID);
if(index > -1 && !checked) selectedPrivIdList.splice(index, 1);
updatePrivTree(selectedPrivIdList);
}
@@ -469,7 +468,7 @@ function recommendChange($item, checked)
$parentItem.closest('.checkbox-primary').find('label').addClass('checkbox-indeterminate-block');
}
var privID = $item.attr('module') + '-' + $item.attr('method');
var privID = $item.attr('data-id');
if(privID)
{
var index = selectedPrivIdList.indexOf(privID);
+1 -1
View File
@@ -632,7 +632,7 @@ $lang->resource->productplan->batchUnlinkStory = 'batchUnlinkStory';
$lang->resource->productplan->linkBug = 'linkBug';
$lang->resource->productplan->unlinkBug = 'unlinkBug';
$lang->resource->productplan->batchUnlinkBug = 'batchUnlinkBug';
$lang->resource->productplan->batchEdit = 'batchEditAction';
$lang->resource->productplan->batchEdit = 'batchEdit';
$lang->resource->productplan->start = 'start';
$lang->resource->productplan->finish = 'finish';
$lang->resource->productplan->close = 'close';
+8 -6
View File
@@ -1849,7 +1849,9 @@ class groupModel extends model
$this->app->loadLang($moduleName);
if($moduleName == 'requirement') $this->app->loadLang('story');
}
$priv = (object)array('subset' => $packageData->subset, 'package' => $packageCode, 'module' => $moduleName, 'method' => $methodName, 'selected' => false, 'name' => $this->lang->$moduleName->$methodLang);
$privName = isset($this->lang->$moduleName) && isset($this->lang->$moduleName->$methodLang) ? $this->lang->$moduleName->$methodLang : $privCode;
$priv = (object)array('subset' => $packageData->subset, 'package' => $packageCode, 'module' => $moduleName, 'method' => $methodName, 'selected' => false, 'name' => $privName);
$privList[$privCode] = $priv;
}
@@ -2516,7 +2518,7 @@ class groupModel extends model
$method = $this->lang->resource->$moduleName->$methodName;
if(!isset($this->lang->$moduleName->$method)) $this->app->loadLang($moduleName);
$subsetPrivs[$type][$subsetName]['children'][] = array('id' => $relatedPriv, 'module' => $moduleName, 'method' => $methodName, 'subset' => $subsetName, 'text' => $this->lang->$moduleName->$method);
$subsetPrivs[$type][$subsetName]['children'][] = array('id' => $relatedPriv, 'data-module' => $moduleName, 'data-method' => $methodName, 'subset' => $subsetName, 'text' => $this->lang->$moduleName->$method, 'data-id' => $relatedPriv);
}
}
@@ -2582,16 +2584,16 @@ class groupModel extends model
$subset = $packageData->subset;
if($subset !== $selectedSubset) continue;
if($selectedPackages && strpos($selectedPackages, ",$packageCode,") === false) continue;
if($selectedPackages && strpos($selectedPackages, "|$packageCode|") === false) continue;
$methodLang = $this->lang->resource->$moduleName->$methodName;
if(!isset($this->lang->$moduleName->$methodLang)) $this->app->loadLang($moduleName);
$privs[$privCode] = $this->lang->$moduleName->$methodLang;
$privs[$privCode] = isset($this->lang->$moduleName) && isset($this->lang->$moduleName->$methodLang) ? $this->lang->$moduleName->$methodLang : $privCode;
}
}
if(empty($selectedPackages) || strpos($selectedPackages, ',other,') !== false)
if(empty($selectedPackages) || strpos($selectedPackages, '|other|') !== false)
{
/* Privs in resource but not in package. */
$this->sortResource();
@@ -2604,7 +2606,7 @@ class groupModel extends model
if(isset($allPrivs["$module-$method"])) continue;
if(!isset($this->lang->$module->$methodLang)) $this->app->loadLang($module);
$privs["$module-$method"] = $this->lang->$module->$methodLang;
$privs["$module-$method"] = isset($this->lang->$module) && isset($this->lang->$module->$methodLang) ? $this->lang->$module->$methodLang : "$module-$method";
}
}
}
-28
View File
@@ -783,10 +783,6 @@ $config->group->package->importRequirement->privs['requirement-export']
$config->group->package->importRequirement->privs['requirement-import'] = array('edition' => 'max,ipd', 'vision' => 'rnd,or', 'order' => 115, 'depend' => array('product-requirement', 'requirement-exportTemplate'), 'recommend' => array());
$config->group->package->importRequirement->privs['requirement-exportTemplate'] = array('edition' => 'max,ipd', 'vision' => 'rnd,or', 'order' => 120, 'depend' => array('product-requirement'), 'recommend' => array());
$config->group->package->deleteRequirement = new stdclass();
$config->group->package->deleteRequirement->order = 25;
$config->group->package->deleteRequirement->subset = 'requirement';
$config->group->package->reviewRequirement = new stdclass();
$config->group->package->reviewRequirement->order = 15;
$config->group->package->reviewRequirement->subset = 'requirement';
@@ -2523,10 +2519,6 @@ $config->group->package->workflow->privs['workflow-setApproval'] = array('editio
$config->group->package->workflow->privs['workflow-setJS'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 80, 'depend' => array('workflow-browseFlow'), 'recommend' => array());
$config->group->package->workflow->privs['workflow-setCSS'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 85, 'depend' => array('workflow-browseFlow'), 'recommend' => array());
$config->group->package->downloadCode = new stdclass();
$config->group->package->downloadCode->order = 10;
$config->group->package->downloadCode->subset = 'repocode';
$config->group->package->dev = new stdclass();
$config->group->package->dev->order = 5;
$config->group->package->dev->subset = 'dev';
@@ -2664,10 +2656,6 @@ $config->group->package->webhook->privs['webhook-log'] = array('edition'
$config->group->package->webhook->privs['webhook-bind'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 30, 'depend' => array('webhook-chooseDept'), 'recommend' => array());
$config->group->package->webhook->privs['webhook-chooseDept'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 35, 'depend' => array('webhook-browse'), 'recommend' => array('webhook-create', 'webhook-delete', 'webhook-edit'));
$config->group->package->gitlab = new stdclass();
$config->group->package->gitlab->order = 10;
$config->group->package->gitlab->subset = 'repo';
$config->group->package->sms = new stdclass();
$config->group->package->sms->order = 20;
$config->group->package->sms->subset = 'notifysetting';
@@ -2777,10 +2765,6 @@ $config->group->package->chat->privs['client-create'] = array('edition'
$config->group->package->chat->privs['client-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 6, 'depend' => array('admin-xuanxuan'), 'recommend' => array());
$config->group->package->chat->privs['client-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 7, 'depend' => array('admin-xuanxuan'), 'recommend' => array());
$config->group->package->jenkins = new stdclass();
$config->group->package->jenkins->order = 25;
$config->group->package->jenkins->subset = 'repo';
$config->group->package->systemSetting = new stdclass();
$config->group->package->systemSetting->order = 5;
$config->group->package->systemSetting->subset = 'systemsetting';
@@ -3061,10 +3045,6 @@ $config->group->package->measurement->privs['report-saveReport'] = arra
$config->group->package->measurement->privs['report-crystalExport'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 22, 'depend' => array('measurement-template'), 'recommend' => array());
$config->group->package->measurement->privs['report-export'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 25, 'depend' => array('measurement-template'), 'recommend' => array());
$config->group->package->usercl = new stdclass();
$config->group->package->usercl->order = 25;
$config->group->package->usercl->subset = 'featureconfig';
$config->group->package->meetingroom = new stdclass();
$config->group->package->meetingroom->order = 30;
$config->group->package->meetingroom->subset = 'featureconfig';
@@ -3213,10 +3193,6 @@ $config->group->package->template->privs = array();
$config->group->package->template->privs['user-setPublicTemplate'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 10, 'depend' => array(), 'recommend' => array());
$config->group->package->template->privs['datatable-setGlobal'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 5, 'depend' => array(), 'recommend' => array());
$config->group->package->table = new stdclass();
$config->group->package->table->order = 5;
$config->group->package->table->subset = 'datatable';
$config->group->package->automation = new stdclass();
$config->group->package->automation->order = 5;
$config->group->package->automation->subset = 'ci';
@@ -3807,10 +3783,6 @@ $config->group->package->deletePrompt->subset = 'ai';
$config->group->package->deletePrompt->privs = array();
$config->group->package->deletePrompt->privs['ai-promptDelete'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 30, 'depend' => array('admin-index', 'ai-prompts', 'ai-promptView'), 'recommend' => array());
$config->group->package->resource = new stdclass();
$config->group->package->resource->order = 2200;
$config->group->package->resource->subset = 'ops';
$config->group->package->manageServiceProvider = new stdclass();
$config->group->package->manageServiceProvider->order = 2300;
$config->group->package->manageServiceProvider->subset = 'ops';
+64 -85
View File
@@ -9,11 +9,11 @@ declare(strict_types=1);
* @link https://www.zentao.net
*/
namespace zin;
jsVar('window.selectedPrivIdList', $selectedPrivIdList);
jsVar('excludeIdList', $excludePrivsIdList);
jsVar('window.selectedPrivIdList', $selectedPrivList);
jsVar('allPrivList', $allPrivList);
jsVar('groupID', $groupID);
jsVar('type', $type);
jsVar('menu', $menu);
jsVar('nav', $nav);
if($group->role == 'limited')
{
@@ -89,11 +89,11 @@ if($group->role == 'limited')
}
else
{
$params = "type=byGroup&param=$groupID&menu=%s&version=$version";
$params = "type=byGroup&param=$groupID&nav=%s&version=$version";
$mainNavItems = null;
$i = 0;
$dropDownItems = array();
foreach($lang->mainNav as $module => $title)
foreach($lang->mainNav as $navKey => $title)
{
if(!is_string($title)) continue;
@@ -103,14 +103,14 @@ else
$dropDownItems[] = array
(
'text' => strip_tags(substr($title, 0, strpos($title, '|'))),
'url' => inlink('managePriv', sprintf($params, $module)),
'class' => $menu == $module ? 'active' : ''
'url' => inlink('managePriv', sprintf($params, $navKey)),
'class' => $nav == $navKey ? 'active' : ''
);
}
}
$i = 0;
foreach($lang->mainNav as $module => $title)
foreach($lang->mainNav as $navKey => $title)
{
if(!is_string($title) || $i >= $config->group->maxToolBarCount) continue;
@@ -137,8 +137,8 @@ else
setClass('nav-item'),
a
(
setClass($menu == $module ? 'active' : ''),
set::href(inlink('managePriv', sprintf($params, $module))),
setClass($nav == $navKey ? 'active' : ''),
set::href(inlink('managePriv', sprintf($params, $navKey))),
strip_tags(substr($title, 0, strpos($title, '|')))
)
);
@@ -172,7 +172,7 @@ else
setclass('nav-item'),
a
(
setclass(empty($menu) ? 'active' : ''),
setclass(empty($nav) ? 'active' : ''),
set::href(inlink('managepriv', sprintf($params, ''))),
span($lang->group->all)
)
@@ -183,7 +183,7 @@ else
setClass('nav-item'),
a
(
setClass($menu == 'general' ? 'active' : ''),
setClass($nav == 'general' ? 'active' : ''),
set::href(inlink('managePriv', sprintf($params, 'general'))),
span($lang->group->general)
)
@@ -200,19 +200,18 @@ else
),
);
$getMethodItems = function($privs, $moduleName, $packageID, $groupPrivs)
$getMethodItems = function($package, $subsetName, $packageID, $groupPrivs)
{
$methodItems = array();
foreach($privs as $privID => $priv)
foreach($package->privs as $privID => $priv)
{
if(!empty($lang->$moduleName->menus) and ($priv->method == 'browse' or in_array($priv->method, array_keys($lang->$moduleName->menus)))) continue;
$methodItems[] = div
(
setClass('group-item'),
set('data-module', $moduleName),
set('data-module', $subsetName),
set('data-package', $packageID),
set('data-divid', "{$moduleName}{$packageID}"),
set('data-id', zget($priv, 'id', 0)),
set('data-divid', "{$subsetName}{$packageID}"),
set('data-id', $privID),
checkbox
(
set::name("actions[{$priv->module}][]"),
@@ -220,33 +219,42 @@ else
set::checked(isset($groupPrivs[$priv->module][$priv->method])),
setID("actions[{$priv->module}][{$priv->method}]"),
set::text($priv->name),
set('data-id', $priv->action),
set('data-id', $privID),
)
);
}
return $methodItems;
};
$privBody = null;
foreach($privList as $moduleName => $packages)
$dependTree = null;
foreach($relatedPrivData['depend'] as $dependPrivs)
{
if(!count((array)$packages)) continue;
$dependTree[] = checkboxGroup
(
set::title(array('text' => $dependPrivs['text'], 'id' => "dependPrivs[{$dependPrivs['id']}]", 'name' => 'dependPrivs[]', 'data-id' => $dependPrivs['id'], 'data-has-children' => !empty($dependPrivs['children']), 'disabled' => true, 'checked' => true)),
!empty($dependPrivs['children']) ? set::items($dependPrivs['children']) : null,
);
}
$i = 1;
$modulePrivs = count($privList[$moduleName], 1) - count($selectPrivs[$moduleName], 1);
$moduleSelect = array_sum($selectPrivs[$moduleName]);
foreach($packages as $packageID => $privs)
$recommendTree = null;
foreach($relatedPrivData['recommend'] as $recommendPrivs)
{
$recommendTree[] = checkboxGroup
(
set::title(array('text' => $recommendPrivs['text'], 'id' => "recommendPrivs[{$recommendPrivs['id']}]", 'name' => 'recommendPrivs[]', 'data-id' => $recommendPrivs['id'], 'data-has-children' => !empty($recommendPrivs['children']))),
!empty($recommendPrivs['children']) ? set::items($recommendPrivs['children']) : null,
);
}
$privBody = null;
foreach($subsets as $subsetName => $subset)
{
if($subset->allCount == 0) continue;
$i = 1;
foreach($packages[$subsetName] as $packageID => $package)
{
$packagePrivs = count($privs);
$packageSelect = $selectPrivs[$moduleName][$packageID];
$moduleTitle = $lang->$moduleName->common;
if(in_array($moduleName, array('doc', 'api'))) $moduleTitle = $lang->$moduleName->manage;
if(isset($lang->$moduleName->menus))
{
$menusPrivs = count($lang->$moduleName->menus);
$menusSelect = count(array_intersect(array_keys($lang->$moduleName->menus), array_keys(zget($groupPrivs, $moduleName, array()))));
}
$subsetTitle = isset($lang->$subsetName) && isset($lang->$subsetName->common) ? $lang->$subsetName->common : $subsetName;
$privBody[] = h::tr
(
@@ -254,20 +262,20 @@ else
$i == 1 ? h::th
(
setClass('text-middle text-left module'),
set('rowspan', $i == 1 ? count($packages) : 1),
set('data-module', $moduleName),
set('all-privs', $moduleprivs),
set('select-privs', $moduleSelect),
set('rowspan', count($packages[$subsetName]) ? count($packages[$subsetName]) : 1),
set('data-module', $subsetName),
set('all-privs', $subset->allCount),
set('select-privs', $subset->selectCount),
div
(
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
checkbox
(
setID("allChecker{$moduleName}"),
setID("allChecker{$subsetName}"),
set::value(1),
set::checked(!empty($moduleSelect) && $modulePrivs == $moduleSelect),
set::text($moduleTitle),
set::labelClass(!empty($moduleSelect) && $modulePrivs != $moduleSelect ? 'text-left checkbox-indeterminate-block' : 'text-left'),
set::checked($subset->selectCount && $subset->selectCount == $subset->allCount),
set::text($subsetTitle),
set::labelClass($subset->selectCount && $subset->selectCount != $subset->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left'),
)
)
) : null,
@@ -275,58 +283,29 @@ else
(
setClass('text-middle text-left package'),
setClass($i == 1 ? 'td-sm' : 'td-md'),
set('data-module', $moduleName),
set('data-module', $subsetName),
set('data-package', $packageID),
set('data-divid', "{$moduleName}{$packageID}"),
set('all-privs', $packagePrivs),
set('select-privs', $packageSelect),
set('data-divid', "{$subsetName}{$packageID}"),
set('all-privs', $package->allCount),
set('select-privs', $package->selectCount),
div
(
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
checkbox
(
setID("allCheckerModule{$moduleName}Package{$packageID}"),
setID("allCheckerModule{$subsetName}Package{$packageID}"),
set::value('browse'),
set::checked($packagePrivs == $packageSelect),
set::text(zget($privPackages, $packageID, $lang->group->other)),
set::labelClass(!empty($packageSelect) && $packagePrivs != $packageSelect ? 'text-left checkbox-indeterminate-block' : 'text-left'),
set::checked($package->allCount == $package->selectCount),
set::text($lang->group->package->$packageID),
set::labelClass($package->selectCount && $package->selectCount != $package->allCount ? 'text-left checkbox-indeterminate-block' : 'text-left'),
)
)
),
isset($lang->$moduleName->menus) ? h::td
(
setClass("menus {$moduleName}"),
set('all-privs', $menusPrivs),
set('select-privs', $menusSelect),
set('data-module', $moduleName),
set('data-package', 0),
set('data-divid', "{$moduleName}0"),
div
(
setClass('checkbox-primary checkbox-inline checkbox-left check-all'),
checkbox
(
setID("actions[{$moduleName}]browse"),
set::value('browse'),
set::checked($menusPrivs == $menusSelect),
set::text($lang->$moduleName->browse),
set::labelClass(!empty($menusSelect) && $menusPrivs != $menusSelect ? 'text-left checkbox-indeterminate-block' : 'text-left'),
),
icon('plus'),
checkList
(
set::items($lang->$moduleName->menus),
set::name("actions[{$moduleName}]"),
set::value(isset($groupPrivs[$moduleName]) ? implode(',', $groupPrivs[$moduleName]) : ''),
),
)
) : null,
h::td
(
setClass('pv-10px'),
setID($moduleName),
set('colspan', !empty($lang->$moduleName->menus) ? 1 : 2),
$getMethodItems($privs, $moduleName, $packageID, $groupPrivs),
setID($subsetName),
$getMethodItems($package, $subsetName, $packageID, $groupPrivs),
)
);
$i ++;
@@ -352,13 +331,13 @@ else
a
(
setClass('btn switchBtn'),
set::href(inlink('managePriv', "type=byPackage&param={$groupID}&menu={$menu}&version={$version}")),
set::href(inlink('managePriv', "type=byPackage&param={$groupID}&nav={$nav}&version={$version}")),
html("<i class='icon-has-authority-pack'></i>"),
),
a
(
setClass('btn switchBtn text-primary'),
set::href(inlink('managePriv', "type=byGroup&param={$groupID}&menu={$menu}&version={$version}")),
set::href(inlink('managePriv', "type=byGroup&param={$groupID}&nav={$nav}&version={$version}")),
html("<i class='icon-without-authority-pack'></i>"),
),
),
+8 -6
View File
@@ -9,6 +9,7 @@ declare(strict_types=1);
* @link https://www.zentao.net
*/
namespace zin;
jsVar('window.selectedPrivIdList', array());
to::header(
span
@@ -25,16 +26,16 @@ to::header(
$packageBox = null;
$hiddenClass = '';
foreach($packageGroup as $module => $modulePackages)
foreach($packages as $subset => $subsetPackages)
{
$packageBox[] = select
(
set::name('packages[]'),
set::className($hiddenClass),
set::items($modulePackages),
set::items($subsetPackages),
set::multiple(true),
set::required(true),
set('data-module', $module),
set('data-module', $subset),
on::change('setActions'),
);
@@ -62,10 +63,11 @@ form
select
(
set::name('module'),
set::items($modulePairs),
set::items($subsets),
set::size(10),
set::value(key($subsets)),
set::required(true),
on::change('window.setModulePackages'),
on::change('window.setSubsetPackages'),
)
)
),
@@ -99,7 +101,7 @@ form
select
(
set::name('actions[]'),
set::items($indexPrivs),
set::items($privs),
set::multiple(true),
set::required(true)
)
+1 -1
View File
@@ -130,7 +130,7 @@ class groupZen extends group
$subset = $packageData->subset;
if(!isset($subsets[$subset]))
{
$subsets[$subset] = $this->lang->$subset->common;
$subsets[$subset] = isset($this->lang->$subset) && isset($this->lang->$subset->common) ? $this->lang->$subset->common : $subset;
$packages[$subset] = array();
}