* Refactor group module using config file.

This commit is contained in:
zhujinyong
2023-09-20 10:49:32 +08:00
parent 41b4fb1394
commit a22b82cd91
10 changed files with 6173 additions and 548 deletions
+2
View File
@@ -44,3 +44,5 @@ $config->group->priv->search['params']['dependPrivs'] = array('operator' => '
$config->group->priv->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
$config->group->hiddenPriv = array('system-dashboard', 'store-browse', 'store-appView', 'space-getStoreAppInfo', 'system-dblist', 'system-configdomain', 'system-ossview', 'instance-ajaxStart', 'instance-ajaxStop', 'instance-upgrade');
include 'packagemanager.php';
+166 -221
View File
@@ -191,28 +191,174 @@ class group extends control
}
/**
* Manage privleges of a group.
* Manage priv by package or group.
*
* @param string $type byPackage|byGroup|byModule
* @param int $param
* @param string $menu
* @param int $groupID
* @param string $nav
* @param string $version
* @access public
* @return void
*/
public function managePriv($type = 'byPackage', $param = 0, $menu = '', $version = '')
protected function managePrivByGroup($groupID = 0, $nav = '', $version = '')
{
$this->lang->custom->common = $this->lang->group->config;
if(($this->config->edition == 'max' or $this->config->edition == 'ipd') and $this->config->vision == 'rnd' and isset($this->lang->baseline)) $this->lang->baseline->common = $this->lang->group->docTemplate;
$this->group->sortResource();
$group = $this->group->getById($groupID);
$groupPrivs = $this->group->getPrivs($groupID);
$versionPrivs = $this->group->getPrivsAfterVersion($version);
/* Subsets . */
$subsets = array();
foreach($this->config->group->subset as $subsetName => $subset)
{
$subset->code = $subsetName;
$subset->allCount = 0;
$subset->selectCount = 0;
$subsets[$subset->code] = $subset;
}
$selectPrivs = $this->group->getPrivListByGroup($groupID);
$allPrivList = $this->group->getPrivListByNav($nav, $version);
$selectedPrivList = array();
$packages = array();
foreach($allPrivList as $privCode => $priv)
{
$subsetCode = $priv->subset;
$packageCode = $priv->package;
if(!isset($packages[$subsetCode])) $packages[$subsetCode] = array();
if(!isset($packages[$subsetCode][$packageCode]))
{
$package = new stdclass();
$package->allCount = 0;
$package->selectCount = 0;
$package->subset = zget($packageData, 'subset', 'other');
$package->privs = array();
$packages[$subsetCode][$packageCode] = $package;
}
$packages[$subsetCode][$packageCode]->privs[$privCode] = $priv;
$packages[$subsetCode][$packageCode]->allCount ++;
$subsets[$subsetCode]->allCount ++;
if(isset($selectPrivs[$privCode]))
{
$packages[$subsetCode][$packageCode]->selectCount ++;
$subsets[$subsetCode]->selectCount ++;
$selectedPrivList[] = $privCode;
}
}
$allPrivList = array_keys($allPrivList);
$relatedPrivData = $this->group->getRelatedPrivs($allPrivList, $selectedPrivList);
$this->view->title = $this->lang->company->common . $this->lang->colon . $group->name . $this->lang->colon . $this->lang->group->managePriv;
$this->view->position[] = $group->name;
$this->view->position[] = $this->lang->group->managePriv;
$this->view->allPrivList = $allPrivList;
$this->view->selectedPrivList = $selectedPrivList;
$this->view->relatedPrivData = $relatedPrivData;
$this->view->group = $group;
$this->view->groupPrivs = $groupPrivs;
$this->view->groupID = $groupID;
$this->view->nav = $nav;
$this->view->version = $version;
$this->view->subsets = $subsets;
$this->view->packages = $packages;
}
/**
* Manage priv by module.
*
* @access public
* @return void
*/
protected function managePrivByModule()
{
$subsets = array();
$packages = array();
$privs = array();
/* Subsets in package. */
foreach($this->config->group->package as $packageCode => $packageData)
{
foreach($packageData->privs as $privCode => $priv)
{
list($moduleName, $methodName) = explode('-', $privCode);
if(strpos(',' . $priv['edition'] . ',', ',' . $this->config->edition . ',') === false) continue;
if(strpos(',' . $priv['vision'] . ',', ',' . $this->config->vision . ',') === false) continue;
/* Remove privs unused in the edition. */
if(!isset($this->lang->resource->$moduleName) || !isset($this->lang->resource->$moduleName->$methodName)) continue;
$subset = $packageData->subset;
if(!isset($subsets[$subset]))
{
$subsets[$subset] = $this->lang->$subset->common;
$packages[$subset] = array();
}
$packages[$subset][$packageCode] = isset($this->lang->group->package->$packageCode) ? $this->lang->group->package->$packageCode : $packageCode;
$privs[$privCode] = $privCode;
}
}
/* Subsets in resource but not in package. */
$this->group->sortResource();
foreach($this->lang->resource as $module => $methodList)
{
foreach($methodList as $method => $methodLang)
{
if(isset($privs["$module-$method"])) continue;
if(!isset($subsets[$module])) $subsets[$module] = isset($this->lang->$module) && isset($this->lang->$module->common) ? $this->lang->$module->common : $module;
$packages[$subset]['other'] = $this->lang->group->other;
}
}
$this->view->title = $this->lang->company->common . $this->lang->colon . $this->lang->group->managePriv;
$this->view->position[] = $this->lang->group->managePriv;
$this->view->groups = $this->group->getPairs();
$this->view->subsets = $subsets;
$this->view->packages = $packages;
$this->view->privs = $this->group->getPrivByParents(key($subsets));
}
/**
* Manage privleges of a group.
*
* @param string $type byPackage|byGroup|byModule
* @param int $param
* @param string $nav
* @param string $version
* @access public
* @return void
*/
public function managePriv($type = 'byPackage', $param = 0, $nav = '', $version = '')
{
if($type == 'byGroup' or $type == 'byPackage') $groupID = $param;
$this->view->type = $type;
foreach($this->lang->resource as $moduleName => $action)
{
if($this->group->checkMenuModule($menu, $moduleName) or ($type != 'byGroup' and $type != 'byPackage')) $this->app->loadLang($moduleName);
if($this->group->checkNavModule($nav, $moduleName) || ($type != 'byGroup' && $type != 'byPackage')) $this->app->loadLang($moduleName);
}
if(!empty($_POST))
{
if($type == 'byGroup' or $type == 'byPackage') $result = $this->group->updatePrivByGroup($groupID, $menu, $version);
if($type == 'byGroup' || $type == 'byPackage') $result = $this->group->updatePrivByGroup($groupID, $nav, $version);
if($type == 'byModule') $result = $this->group->updatePrivByModule();
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
@@ -220,177 +366,9 @@ class group extends control
if($type == 'byModule') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
}
if($type == 'byGroup' or $type == 'byPackage')
{
$this->group->sortResource();
$group = $this->group->getById($groupID);
$groupPrivs = $this->group->getPrivs($groupID);
if($type == 'byGroup' || $type == 'byPackage') $this->managePrivByGroup($groupID, $nav, $version);
if($type == 'byModule') $this->managePrivByModule($groupID, $nav, $version);
$this->view->title = $this->lang->company->common . $this->lang->colon . $group->name . $this->lang->colon . $this->lang->group->managePriv;
$this->view->position[] = $group->name;
$this->view->position[] = $this->lang->group->managePriv;
/* Join changelog when be equal or greater than this version.*/
$realVersion = str_replace('_', '.', $version);
$changelog = array();
foreach($this->lang->changelog as $currentVersion => $currentChangeLog)
{
if(version_compare($currentVersion, $realVersion, '>=')) $changelog[] = join(',', $currentChangeLog);
}
$changelogs = ',' . join(',', $changelog) . ',';
$this->lang->custom->common = $this->lang->group->config;
if(($this->config->edition == 'max' or $this->config->edition == 'ipd') and $this->config->vision == 'rnd' and isset($this->lang->baseline)) $this->lang->baseline->common = $this->lang->group->docTemplate;
$modules = $this->group->getPrivManagerPairs('module', $menu);
$this->view->group = $group;
$this->view->groupPrivs = $groupPrivs;
$this->view->groupID = $groupID;
$this->view->menu = $menu;
$this->view->version = $version;
$privs = $this->group->getPrivsListByView($menu);
$privs = $this->group->transformPrivLang($privs);
$privs = $this->group->getCustomPrivs($menu, $privs);
$privList = $modules;
$privMethods = array();
$selectPrivs = array();
$selectedPrivList = array();
$relatedList = array();
$groupPrivList = $this->group->getPrivListByGroup($groupID);
foreach($privs as $priv)
{
if(!empty($version) and strpos($changelogs, ",{$priv->module}-{$priv->method},") === false)
{
unset($groupPrivList["{$priv->module}-{$priv->method}"]);
continue;
}
if(!$this->config->inQuickon && in_array("{$priv->module}-{$priv->method}", $this->config->group->hiddenPriv)) continue;
if(!isset($privList[$priv->parentCode])) $privList[$priv->parentCode] = array();
if(!is_array($privList[$priv->parentCode])) $privList[$priv->parentCode] = array();
if(!isset($privList[$priv->parentCode][$priv->parent])) $privList[$priv->parentCode][$priv->parent] = array();
$privList[$priv->parentCode][$priv->parent][$priv->key] = $priv;
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] ++;
if(isset($priv->id))
{
$selectedPrivList["{$priv->module}-{$priv->method}"] = "{$priv->module}-{$priv->method}";
/* New permissions for secondary development are excluded. */
if(is_numeric($priv->id)) $relatedList["{$priv->module}-{$priv->method}"] = "{$priv->module}-{$priv->method}";
}
}
}
foreach($privList as $module => $privs)
{
if(!is_array($privList[$module])) unset($privList[$module]);
}
if(empty($menu) or $menu == 'general')
{
$unassignedModule = array_diff(array_keys(get_object_vars($this->lang->resource)), array_keys($modules));
foreach($unassignedModule as $index => $module)
{
if(!$this->group->checkMenuModule($menu, $module) or isset($privList[$module])) continue;
$selectPrivs[$module] = array();
$selectPrivs[$module][0] = 0;
foreach($this->lang->resource->{$module} as $method => $methodLabel)
{
if(isset($privMethods[$module][$method])) continue;
if(!$this->config->inQuickon && in_array("{$module}-{$method}", $this->config->group->hiddenPriv)) continue;
$privMethods[$module][$method] = $method;
$privList[$module][0]["{$module}-$method"] = new stdclass();
$privList[$module][0]["{$module}-$method"]->module = $module;
$privList[$module][0]["{$module}-$method"]->method = $method;
$privList[$module][0]["{$module}-$method"]->name = $this->lang->{$module}->{$methodLabel};
$privList[$module][0]["{$module}-$method"]->action = "{$module}-{$method}";
if(!empty($groupPrivs[$module][$method])) $selectPrivs[$module][0] ++;
}
}
}
$excludePrivList = array_diff(array_keys($groupPrivList), $selectedPrivList);
$relatedPrivData = $this->group->getRelatedPrivs($relatedList, '', $excludePrivList);
unset($privList['index']);
$this->view->privList = $privList;
$this->view->privMethods = $privMethods;
$this->view->selectPrivs = $selectPrivs;
$this->view->privPackages = $this->group->getPrivManagerPairs('package');
$this->view->selectedPrivList = $selectedPrivList;
$this->view->relatedPrivData = $relatedPrivData;
$this->view->excludePrivList = $excludePrivList;
}
elseif($type == 'byModule')
{
$this->group->sortResource();
$this->view->title = $this->lang->company->common . $this->lang->colon . $this->lang->group->managePriv;
$this->view->position[] = $this->lang->group->managePriv;
$privs = $this->group->getPrivsListByView('');
$privs = $this->group->getCustomPrivs('', $privs);
$modules = $this->dao->select('*')->from(TABLE_PRIVMANAGER)->where('type')->eq('module')->fetchAll('code');
$modulePairs = $this->group->getPrivManagerPairs('module');
$privArray = get_object_vars($this->lang->resource);
$privArray = array_filter($privArray, function($modulePrivs){$modulePrivs = (array)$modulePrivs; return !empty($modulePrivs);});
$unassignedModules = array_diff(array_keys($privArray), array_keys($modulePairs));
foreach($unassignedModules as $unassignedModule)
{
$this->app->loadLang($unassignedModule);
$modulePairs[$unassignedModule] = isset($this->lang->{$unassignedModule}->common) ? $this->lang->{$unassignedModule}->common : $unassignedModule;
}
$packageGroup = array();
foreach($modulePairs as $moduleCode => $moduleLang)
{
$modulePackages = $this->group->getPrivManagerPairs('package', $moduleCode);
$unassignedPrivs = $this->group->getUnassignedPrivsByModule($moduleCode);
$packageGroup[$moduleCode] = isset($modules[$moduleCode]) ? $modulePackages : array();
$unassignedPrivPackages = isset($modules[$moduleCode]) ? $modules[$moduleCode]->id : 0;
$packageGroup[$moduleCode] = $packageGroup[$moduleCode] + array($unassignedPrivPackages => $this->lang->group->other);
}
$hasPrivModule = array();
foreach($privs as $privKey => $priv)
{
if(!isset($modulePairs[$priv->module])) $modulePairs[$priv->module] = isset($this->lang->{$priv->module}->common) ? $this->lang->{$priv->module}->common : $priv->module;
$hasPrivModule[] = $priv->parentCode;
}
$emptyPrivModules = array_diff(array_keys($modulePairs), $hasPrivModule);
foreach($emptyPrivModules as $emptyPrivModule) unset($modulePairs[$emptyPrivModule]);
$indexPrivs = $this->group->getPrivByParent(isset($packageGroup['index']) ? array_keys($packageGroup['index']) : $modules['index']->id);
$indexPrivs = $this->group->transformPrivLang($indexPrivs);
foreach($indexPrivs as $privID => $priv)
{
$indexPrivs["{$priv->module}-{$priv->method}"] = $priv->name;
unset($indexPrivs[$privID]);
}
$this->view->groups = $this->group->getPairs();
$this->view->modulePairs = $modulePairs;
$this->view->packageGroup = $packageGroup;
$this->view->indexPrivs = $indexPrivs;
}
$this->display();
}
@@ -1056,50 +1034,16 @@ class group extends control
/**
* AJAX: Get privs by parents.
*
* @param string $module
* @param string $parentType
* @param string $parentList
* @param string $selectedSubset
* @param string $selectedPackages
* @access public
* @return bool
*/
public function ajaxGetPrivByParents($module, $parentType, $parentList)
public function ajaxGetPrivByParents($selectedSubset, $selectedPackages)
{
$menu = isset($this->lang->navGroup->$module) ? $this->lang->navGroup->$module : $module;
$privList = array();
if($parentType == 'module')
{
$privs = $this->group->getPrivByModule($parentList);
foreach($privs as $moduleID => $packages)
{
foreach($packages as $packageID => $packagePrivs)
{
foreach($packagePrivs as $privID => $packagePriv)
{
$privList["{$packagePriv->module}-{$packagePriv->method}"] = $packagePriv;
}
}
}
}
elseif($parentType == 'package')
{
$privList = $this->group->getPrivByParent(trim($parentList, ','));
foreach($privList as $privID => $priv)
{
$privList["{$priv->module}-{$priv->method}"] = $priv;
unset($privList[$privID]);
}
}
$privs = $this->group->getPrivByParents($selectedSubset, $selectedPackages);
$privList = $this->group->getCustomPrivs($menu, $privList);
foreach($privList as $privKey => $priv)
{
if((isset($priv->parentCode) and $priv->parentCode != $module) or (strpos($parentList, ",{$priv->parent},") === false and $parentType == 'package')) unset($privList[$privKey]);
if(!$this->config->inQuickon && in_array($privKey, $this->config->group->hiddenPriv)) unset($privList[$privKey]);
}
$privList = $this->group->transformPrivLang($privList, true);
return print(html::select('actions[]', $privList, '', "multiple='multiple' class='form-control'"));
return print(html::select('actions[]', $privs, '', "multiple='multiple' class='form-control'"));
}
/**
@@ -1110,10 +1054,11 @@ class group extends control
*/
public function ajaxGetRelatedPrivs()
{
$privList = zget($_POST, 'privList');
$recommedSelect = zget($_POST, 'recommedSelect');
$excludePrivList = zget($_POST, 'excludePrivList');
$privList = $this->group->getRelatedPrivs($privList, '', $excludePrivList, $recommedSelect);
return print(json_encode($privList));
$allPrivList = zget($_POST, 'allPrivList');
$selectedPrivList = zget($_POST, 'selectPrivList');
$recommendSelect = zget($_POST, 'recommendSelect');
$result = $this->group->getRelatedPrivs(explode(',', $allPrivList), explode(',', $selectedPrivList), explode(',', $recommendSelect));
return print(json_encode($result));
}
}
+18 -17
View File
@@ -16,7 +16,7 @@ function setModulePackages(module)
$('#packageBox select').val(''); // Unselect all select.
$("select[data-module='" + module + "']").removeClass('hidden'); // Show the action control for current module.
updatePrivList('module', module);
updatePrivList(module, '');
}
/**
@@ -29,9 +29,10 @@ function setActions()
{
$('#actionBox select').val('');
var hasSelectedPackage = ',' + $('#packageBox select').not('.hidden').val().join(',') + ',';
var selectedModule = $('#module').val();
var selectedPackages = ',' + $('#packageBox select').not('.hidden').val().join(',') + ',';
updatePrivList('package', hasSelectedPackage);
updatePrivList(selectedModule, selectedPackages);
}
@@ -48,15 +49,14 @@ function setNoChecked()
/**
* Update the action box when module or package selected.
*
* @param string parentType module|package
* @param string parentList
* @param string selectedModule
* @param string selectedPackages
* @access public
* @return void
*/
function updatePrivList(parentType, parentList)
function updatePrivList(selectedModule, selectedPackages)
{
var selectedModule = $('#module').val();
$.get(createLink('group', 'ajaxGetPrivByParents', 'module=' + selectedModule + '&parentType=' + parentType + '&parentList=' + parentList), function(data)
$.get(createLink('group', 'ajaxGetPrivByParents', 'module=' + selectedModule + '&packages=' + selectedPackages), function(data)
{
$('#actions').replaceWith(data);
})
@@ -136,9 +136,9 @@ function initRecomendTree(data)
initialState: 'expand',
itemCreator: function($li, item)
{
var index = item.relationPriv ? recommedSelect.indexOf(item.relationPriv.toString()) : -1;
if(item.relationPriv === undefined) item.relationPriv = '';
$li.append('<div class="checkbox-primary ' + (item.children ? 'check-all' : '') + '"><input ' + (index >= 0 ? 'checked="checked"' : '') + 'data-has-children="' + (item.children ? !!item.children.length : false) + '"' + (item.children ? '' : 'data-type="recommend" data-privid="' + item.privID + '" data-relationpriv="' + item.relationPriv + '"') + 'type="checkbox" name="recommendPrivs[]" value="' + item.relationPriv + '" title="' + item.title + '" id="recommendPrivs[' + item.module + ']' + item.method + '" data-module="' + item.module + '" data-method="' + item.method + '"><label>' + item.title + '</label></div>');
var privID = item.module + '-' + item.method;
var index = recommendSelect.indexOf(privID);
$li.append('<div class="checkbox-primary ' + (item.children ? 'check-all' : '') + '"><input ' + (index >= 0 ? 'checked="checked"' : '') + 'data-has-children="' + (item.children ? !!item.children.length : false) + '"' + (item.children ? '' : 'data-type="recommend" data-privid="' + privID + '" data-relationpriv="' + privID + '"') + 'type="checkbox" name="recommendPrivs[]" value="' + privID + '" title="' + item.title + '" id="recommendPrivs[' + item.module + ']' + item.method + '" data-module="' + item.module + '" data-method="' + item.method + '"><label>' + item.title + '</label></div>');
}
});
$('.menuTree.recommend i.list-toggle').remove();
@@ -159,7 +159,8 @@ function initDependTree(data)
initialState: 'expand',
itemCreator: function($li, item)
{
$li.append('<div class="checkbox-primary"><input disabled="disabled" checked="checked" data-has-children="' + (item.children ? !!item.children.length : false) + '"' + (item.children ? '' : 'data-type="depend" data-privid="' + item.privID + '" data-relationpriv="' + item.relationPriv + '"') + 'type="checkbox" name="dependPrivs[]" value="' + item.relationPriv + '" title="' + item.title + '" id="dependPrivs[' + item.module + ']' + item.method + '" data-module="' + item.module + '" data-method="' + item.method + '"><label>' + item.title + '</label></div>');
var privID = item.module + '-' + item.method;
$li.append('<div class="checkbox-primary"><input disabled="disabled" checked="checked" data-has-children="' + (item.children ? !!item.children.length : false) + '"' + (item.children ? '' : 'data-type="depend" data-privid="' + privID + '" data-relationpriv="' + item.relationPriv + '"') + 'type="checkbox" name="dependPrivs[]" value="' + item.relationPriv + '" title="' + item.title + '" id="dependPrivs[' + item.module + ']' + item.method + '" data-module="' + item.module + '" data-method="' + item.method + '"><label>' + item.title + '</label></div>');
}
});
$('.menuTree.depend i.list-toggle').remove();
@@ -190,7 +191,7 @@ function updatePrivTree(privList)
url: createLink('group', 'ajaxGetRelatedPrivs'),
dataType: 'json',
method: 'post',
data: {"privList" : privList.toString(), "recommedSelect": recommedSelect.toString(), "excludePrivList": Object.values(excludePrivList).toString()},
data: {"selectPrivList": privList.toString(), "recommendSelect": recommendSelect.toString(), "allPrivList": Object.values(allPrivList).toString()},
success: function(data)
{
if(data.depend == undefined || data.depend.length == 0)
@@ -385,10 +386,10 @@ function recommendChange($item, checked)
if(priv && index < 0 && checked) selectedPrivList.push(priv);
if(priv && index > -1 && !checked) selectedPrivList.splice(index, 1);
index = recommedSelect.indexOf(priv);
index = recommendSelect.indexOf(priv);
if(priv && index < 0 && checked) recommedSelect.push(priv);
if(priv && index > -1 && !checked) recommedSelect.splice(index, 1);
if(priv && index < 0 && checked) recommendSelect.push(priv);
if(priv && index > -1 && !checked) recommendSelect.splice(index, 1);
}
}
@@ -413,7 +414,7 @@ $(function()
selectedPrivList = Object.values(selectedPrivList);
recommedSelect = new Array();
recommendSelect = new Array();
relatedPrivData = $.parseJSON(relatedPrivData);
initDependTree(relatedPrivData.depend);
+380
View File
@@ -203,4 +203,384 @@ $lang->group->versions['1_2'] = 'ZenTao1.2';
$lang->group->versions['1_1'] = 'ZenTao1.1';
$lang->group->versions['1_0_1'] = 'ZenTao1.0.1';
$lang->group->package = new stdclass();
$lang->group->package->browseTodo = 'Browse Todo';
$lang->group->package->manageTodo = 'Manage Todo';
$lang->group->package->deleteTodo = 'Delete Todo';
$lang->group->package->importTodo = 'Import Todo';
$lang->group->package->manageContact = 'Manage Contact';
$lang->group->package->profile = 'Profile';
$lang->group->package->preference = 'Preference';
$lang->group->package->browseProgram = 'Browse Program';
$lang->group->package->manageProgram = 'Manage Program';
$lang->group->package->deleteProgram = 'Delete Program';
$lang->group->package->invest = 'Invest';
$lang->group->package->accessible = 'Accessible';
$lang->group->package->whitelist = 'Whitelist';
$lang->group->package->stakeholder = 'Stakeholder';
$lang->group->package->my = 'My';
$lang->group->package->browseProduct = 'Browse Product';
$lang->group->package->manageProductLine = 'Manage Product Line';
$lang->group->package->createProduct = 'Create Product';
$lang->group->package->importProduct = 'Import Product';
$lang->group->package->productWhitelist = 'Product Whitelist';
$lang->group->package->branch = 'Branch';
$lang->group->package->browseStory = 'Browse Story';
$lang->group->package->manageStory = 'Manage Story';
$lang->group->package->importStory = 'Import Story';
$lang->group->package->deleteStory = 'Delete Story';
$lang->group->package->reviewStory = 'Review Story';
$lang->group->package->deleteProduct = 'Delete Product';
$lang->group->package->browseRequirement = 'Browse Requirement';
$lang->group->package->manageRequirement = 'Manage Requirement';
$lang->group->package->importRequirement = 'Import Requirement';
$lang->group->package->deleteRequirement = 'Delete Requirement';
$lang->group->package->reviewRequirement = 'Review Requirement';
$lang->group->package->browseProductPlan = 'Browse Product Plan';
$lang->group->package->manageProductPlan = 'Manage Product Plan';
$lang->group->package->deleteProductPlan = 'Delete Product Plan';
$lang->group->package->browseRelease = 'Browse Release';
$lang->group->package->manageRelease = 'Manage Release';
$lang->group->package->importRelease = 'Import Release';
$lang->group->package->deleteRelease = 'Delete Release';
$lang->group->package->releaseNotify = 'Release Notify';
$lang->group->package->projectPlan = 'Project Plan';
$lang->group->package->manageProjectStory = 'Manage Project Story';
$lang->group->package->browseProject = 'Browse Project';
$lang->group->package->manageProject = 'Manage Project';
$lang->group->package->importProject = 'Import Project';
$lang->group->package->projectTeam = 'Project Team';
$lang->group->package->deleteProject = 'Delete Project';
$lang->group->package->projectWhitelist = 'Project Whitelist';
$lang->group->package->browseExecution = 'Browse Execution';
$lang->group->package->manageExecution = 'Manage Execution';
$lang->group->package->deleteExecution = 'Delete Execution';
$lang->group->package->importExecution = 'Import Execution';
$lang->group->package->executionWhitelist = 'Execution Whitelist';
$lang->group->package->gantt = 'Gantt';
$lang->group->package->browseTask = 'Browse Task';
$lang->group->package->manageTask = 'Manage Task';
$lang->group->package->deleteTask = 'Delete Task';
$lang->group->package->importTask = 'Import Task';
$lang->group->package->executionTeam = 'Execution Team';
$lang->group->package->kanban = 'Kanban';
$lang->group->package->groupView = 'Group View';
$lang->group->package->burndown = 'Burndown';
$lang->group->package->cfd = 'Cfd';
$lang->group->package->manageExecutionStory = 'Manage Execution Story';
$lang->group->package->manageExecutionEffort = 'Manage Execution Effort';
$lang->group->package->manageBuild = 'Manage Build';
$lang->group->package->deleteBuild = 'Delete Build';
$lang->group->package->browseStoryLib = 'Browse Story Lib';
$lang->group->package->manageStoryLib = 'Manage Story Lib';
$lang->group->package->deleteStoryLib = 'Delete Story Lib';
$lang->group->package->reviewStoryLib = 'Review Story Lib';
$lang->group->package->browseIssueLib = 'Browse Issue Lib';
$lang->group->package->manageIssueLib = 'Manage Issue Lib';
$lang->group->package->deleteIssueLib = 'Delete Issue Lib';
$lang->group->package->reviewIssue = 'Review Issue';
$lang->group->package->browseRiskLib = 'Browse Risk Lib';
$lang->group->package->manageRiskLib = 'Manage Risk Lib';
$lang->group->package->deleteRiskLib = 'Delete Risk Lib';
$lang->group->package->reivewRisk = 'Reivew Risk';
$lang->group->package->browseOpportunityLib = 'Browse Opportunity Lib';
$lang->group->package->manageOpportunityLib = 'Manage Opportunity Lib';
$lang->group->package->deleteOpportunityLib = 'Delete Opportunity Lib';
$lang->group->package->reviewOpportunity = 'Review Opportunity';
$lang->group->package->browsePracticeLib = 'Browse Practice Lib';
$lang->group->package->managePracticeLib = 'Manage Practice Lib';
$lang->group->package->deletePracticeLib = 'Delete Practice Lib';
$lang->group->package->reviewPractice = 'Review Practice';
$lang->group->package->browseComponentLib = 'Browse Component Lib';
$lang->group->package->manageComponentLib = 'Manage Component Lib';
$lang->group->package->deleteComponentLib = 'Delete Component Lib';
$lang->group->package->reviewComponent = 'Review Component';
$lang->group->package->browseCaseLib = 'Browse Case Lib';
$lang->group->package->manageCaseLib = 'Manage Case Lib';
$lang->group->package->deleteCaseLib = 'Delete Case Lib';
$lang->group->package->importCaseLib = 'Import Case Lib';
$lang->group->package->importToCaseLib = 'Import To Case Lib';
$lang->group->package->officeApproval = 'Office Approval';
$lang->group->package->attend = 'Attend';
$lang->group->package->officeSetting = 'Office Setting';
$lang->group->package->dataPermission = 'Data Permission';
$lang->group->package->leave = 'Leave';
$lang->group->package->makeup = 'Makeup';
$lang->group->package->overtime = 'Overtime';
$lang->group->package->lieu = 'Lieu';
$lang->group->package->holiday = 'Holiday';
$lang->group->package->exportOffice = 'Export Office';
$lang->group->package->browseFeedback = 'Browse Feedback';
$lang->group->package->manageFeedback = 'Manage Feedback';
$lang->group->package->importFeedback = 'Import Feedback';
$lang->group->package->manageFeedback = 'Manage Feedback';
$lang->group->package->faq = 'Faq';
$lang->group->package->browseTicket = 'Browse Ticket';
$lang->group->package->manageTicket = 'Manage Ticket';
$lang->group->package->importTicket = 'Import Ticket';
$lang->group->package->deleteFeedback = 'Delete Feedback';
$lang->group->package->deleteTIcket = 'Delete T Icket';
$lang->group->package->feedbackPriv = 'Feedback Priv';
$lang->group->package->browseCourse = 'Browse Course';
$lang->group->package->manageTrainCourse = 'Manage Train Course';
$lang->group->package->system = 'Platform';
$lang->group->package->host = 'Host';
$lang->group->package->serverRoom = 'Server Room';
$lang->group->package->account = 'Account';
$lang->group->package->domain = 'Domain';
$lang->group->package->service = 'Service';
$lang->group->package->deployPlan = 'Deploy Plan';
$lang->group->package->deployScope = 'Deploy Scope';
$lang->group->package->deployStep = 'Deploy Step';
$lang->group->package->deployCase = 'Deploy Case';
$lang->group->package->qaIndex = 'Qa Index';
$lang->group->package->browseBug = 'Browse Bug';
$lang->group->package->manageBug = 'Manage Bug';
$lang->group->package->deleteBug = 'Delete Bug';
$lang->group->package->importBug = 'Import Bug';
$lang->group->package->browseCase = 'Browse Case';
$lang->group->package->manageCase = 'Manage Case';
$lang->group->package->importCase = 'Import Case';
$lang->group->package->deleteCase = 'Delete Case';
$lang->group->package->reviewCase = 'Review Case';
$lang->group->package->browseTesttask = 'Browse Testtask';
$lang->group->package->manageTesttask = 'Manage Testtask';
$lang->group->package->deleteTesttask = 'Delete Testtask';
$lang->group->package->unitTest = 'Unit Test';
$lang->group->package->testsuite = 'Testsuite';
$lang->group->package->manageTestsuite = 'Manage Testsuite';
$lang->group->package->deleteTestsuite = 'Delete Testsuite';
$lang->group->package->browseTestreport = 'Browse Testreport';
$lang->group->package->manageTestreport = 'Manage Testreport';
$lang->group->package->deleteTestreport = 'Delete Testreport';
$lang->group->package->importTestreport = 'Import Testreport';
$lang->group->package->browseZAHost = 'Browse Z A Host';
$lang->group->package->manageZAHost = 'Manage Z A Host';
$lang->group->package->deleteZAHost = 'Delete Z A Host';
$lang->group->package->image = 'Image';
$lang->group->package->browseZANode = 'Browse Z A Node';
$lang->group->package->manageZANode = 'Manage Z A Node';
$lang->group->package->importZANode = 'Import Z A Node';
$lang->group->package->snapshot = 'Snapshot';
$lang->group->package->companyTeam = 'Company Team';
$lang->group->package->companyCalendar = 'Company Calendar';
$lang->group->package->companyEffort = 'Company Effort';
$lang->group->package->companyDynamic = 'Company Dynamic';
$lang->group->package->companySetting = 'Company Setting';
$lang->group->package->companyDataPermission = 'Company Data Permission';
$lang->group->package->programPlan = 'Program Plan';
$lang->group->package->browseDesign = 'Browse Design';
$lang->group->package->manageDesign = 'Manage Design';
$lang->group->package->deleteDesign = 'Delete Design';
$lang->group->package->manageReview = 'Manage Review';
$lang->group->package->manageIssue = 'Manage Issue';
$lang->group->package->projectSetting = 'Project Setting';
$lang->group->package->browseProjectRelease = 'Browse Project Release';
$lang->group->package->projectWeekly = 'Project Weekly';
$lang->group->package->projectMilestone = 'Project Milestone';
$lang->group->package->researchPlan = 'Research Plan';
$lang->group->package->researchReport = 'Research Report';
$lang->group->package->budget = 'Budget';
$lang->group->package->workEstimation = 'Work Estimation';
$lang->group->package->durationEstimation = 'Duration Estimation';
$lang->group->package->browseIssue = 'Browse Issue';
$lang->group->package->manageIssue = 'Manage Issue';
$lang->group->package->importIssue = 'Import Issue';
$lang->group->package->deleteIssue = 'Delete Issue';
$lang->group->package->importIssueLib = 'Import Issue Lib';
$lang->group->package->browseRisk = 'Browse Risk';
$lang->group->package->manageRisk = 'Manage Risk';
$lang->group->package->importRisk = 'Import Risk';
$lang->group->package->deleteRisk = 'Delete Risk';
$lang->group->package->importRiskLib = 'Import Risk Lib';
$lang->group->package->browseOpportunity = 'Browse Opportunity';
$lang->group->package->manageOpportunity = 'Manage Opportunity';
$lang->group->package->deleteOpportunity = 'Delete Opportunity';
$lang->group->package->importOpportunityLib = 'Import Opportunity Lib';
$lang->group->package->importOpportunity = 'Import Opportunity';
$lang->group->package->pssp = 'Pssp';
$lang->group->package->measrecord = 'Measrecord';
$lang->group->package->manageAuditPlan = 'Manage Audit Plan';
$lang->group->package->nc = 'Nc';
$lang->group->package->meeting = 'Meeting';
$lang->group->package->trainPlan = 'Train Plan';
$lang->group->package->gapAnalysis = 'Gap Analysis';
$lang->group->package->workflowField = 'Workflow Field';
$lang->group->package->workflowAction = 'Workflow Action';
$lang->group->package->workflowLayout = 'Workflow Layout';
$lang->group->package->workflowCondition = 'Workflow Condition';
$lang->group->package->workflowLinkage = 'Workflow Linkage';
$lang->group->package->workflowHook = 'Workflow Hook';
$lang->group->package->workflowLabel = 'Workflow Label';
$lang->group->package->workflowReport = 'Workflow Report';
$lang->group->package->workflowDatasource = 'Workflow Datasource';
$lang->group->package->workflowRule = 'Workflow Rule';
$lang->group->package->workflow = 'Workflow';
$lang->group->package->downloadCode = 'Download Code';
$lang->group->package->dev = 'Dev';
$lang->group->package->browseCodeIssue = 'Review List';
$lang->group->package->editor = 'Editor';
$lang->group->package->serverLink = 'Server Link';
$lang->group->package->browseMR = 'MR List';
$lang->group->package->managePriv = 'Manage Priv';
$lang->group->package->dept = 'Dept';
$lang->group->package->group = 'Group';
$lang->group->package->user = 'User';
$lang->group->package->extension = 'Extension';
$lang->group->package->message = 'Message';
$lang->group->package->mail = 'Mail';
$lang->group->package->webhook = 'Webhook';
$lang->group->package->gitlab = 'Gitlab';
$lang->group->package->sms = 'Sms';
$lang->group->package->gogs = 'Gogs';
$lang->group->package->gitea = 'Gitea';
$lang->group->package->sonarqube = 'Sonarqube';
$lang->group->package->repoRules = 'Repo Rules';
$lang->group->package->browseJob = 'PipeLine List';
$lang->group->package->manageJob = 'Manage PipeLine';
$lang->group->package->manageMR = 'Manage MR';
$lang->group->package->backup = 'Backup';
$lang->group->package->trash = 'Trash';
$lang->group->package->security = 'Security';
$lang->group->package->cron = 'Cron';
$lang->group->package->ldap = 'Ldap';
$lang->group->package->chat = 'Chat';
$lang->group->package->jenkins = 'Jenkins';
$lang->group->package->systemSetting = 'System Setting';
$lang->group->package->search = 'Search';
$lang->group->package->comment = 'Comment';
$lang->group->package->module = 'Module';
$lang->group->package->file = 'File';
$lang->group->package->commonEffort = 'Common Effort';
$lang->group->package->docTemplate = 'Doc Template';
$lang->group->package->importStoryLib = 'Import Story Lib';
$lang->group->package->projectStakeholder = 'Project Stakeholder';
$lang->group->package->projectBuild = 'Project Build';
$lang->group->package->importCaseLib = 'Import Case Lib';
$lang->group->package->commonSetting = 'Common Setting';
$lang->group->package->stageSetting = 'Stage Setting';
$lang->group->package->classify = 'Classify';
$lang->group->package->cmcl = 'Cmcl';
$lang->group->package->auditcl = 'Auditcl';
$lang->group->package->reviewcl = 'Reviewcl';
$lang->group->package->process = 'Process';
$lang->group->package->activity = 'Activity';
$lang->group->package->zoutput = 'Zoutput';
$lang->group->package->custom = 'Custom';
$lang->group->package->cmcl = 'Cmcl';
$lang->group->package->measurement = 'Measurement';
$lang->group->package->usercl = 'Usercl';
$lang->group->package->meetingroom = 'Meetingroom';
$lang->group->package->sqlBuilder = 'Sql Builder';
$lang->group->package->designSetting = 'Design Setting';
$lang->group->package->kanbanSpace = 'Kanban Space';
$lang->group->package->deleteKanbanSpace = 'Delete Kanban Space';
$lang->group->package->browseKanban = 'Browse Kanban';
$lang->group->package->manageKanban = 'Manage Kanban';
$lang->group->package->deleteKanban = 'Delete Kanban';
$lang->group->package->deleteZANode = 'Delete Z A Node';
$lang->group->package->autotesting = 'Autotesting';
$lang->group->package->executionTesting = 'Execution Testing';
$lang->group->package->manageEffort = 'Manage Effort';
$lang->group->package->projectTesting = 'Project Testing';
$lang->group->package->track = 'Track';
$lang->group->package->workflowRelation = 'Workflow Relation';
$lang->group->package->template = 'Template';
$lang->group->package->table = 'Table';
$lang->group->package->automation = 'Automation';
$lang->group->package->git = 'Git';
$lang->group->package->subversion = 'Subversion';
$lang->group->package->ping = 'Ping';
$lang->group->package->review = 'Review';
$lang->group->package->manageProjectRelease = 'Manage Project Release';
$lang->group->package->deleteProjectRelease = 'Delete Project Release';
$lang->group->package->importProjectRelease = 'Import Project Release';
$lang->group->package->projectReleaseNotify = 'Project Release Notify';
$lang->group->package->gantt = 'Gantt';
$lang->group->package->executionRelation = 'Execution Relation';
$lang->group->package->browseBuild = 'Browse Build';
$lang->group->package->browseExecutionStory = 'Browse Execution Story';
$lang->group->package->manageCard = 'Manage Card';
$lang->group->package->browseProjectStory = 'Browse Project Story';
$lang->group->package->chckAuditPlan = 'Chck Audit Plan';
$lang->group->package->reviewAssess = 'Review Assess';
$lang->group->package->reviewAudit = 'Review Audit';
$lang->group->package->dimension = 'Dimension';
$lang->group->package->browseScreen = 'Browse Screen';
$lang->group->package->manageScreen = 'Manage Screen';
$lang->group->package->deleteScreen = 'Delete Screen';
$lang->group->package->screenDataPermission = 'Screen Data Permission';
$lang->group->package->browsePivot = 'Browse Pivot';
$lang->group->package->designPivot = 'Design Pivot';
$lang->group->package->exportPivot = 'Export Pivot';
$lang->group->package->pivotDataPermission = 'Pivot Data Permission';
$lang->group->package->browseChart = 'Browse Chart';
$lang->group->package->designChart = 'Design Chart';
$lang->group->package->exportChart = 'Export Chart';
$lang->group->package->browseDataview = 'Browse Dataview';
$lang->group->package->manageDataview = 'Manage Dataview';
$lang->group->package->deleteDataview = 'Delete Dataview';
$lang->group->package->browseDoc = 'Browse Doc';
$lang->group->package->manageDoc = 'Manage Doc';
$lang->group->package->deleteDoc = 'Delete Doc';
$lang->group->package->exportDoc = 'Export Doc';
$lang->group->package->browseAPI = 'Browse API';
$lang->group->package->manageAPI = 'Manage API';
$lang->group->package->exportAPI = 'Export API';
$lang->group->package->deleteAPI = 'Delete API';
$lang->group->package->callAPI = 'Call API';
$lang->group->package->scene = 'Scene';
$lang->group->package->executionTree = 'Execution Tree';
$lang->group->package->taskEffort = 'Task Effort';
$lang->group->package->taskCalendar = 'Task Calendar';
$lang->group->package->code = 'Code';
$lang->group->package->repo = 'Repository';
$lang->group->package->browseDemandPool = 'Browse Demand Pool';
$lang->group->package->browseCharter = 'Browse Charter';
$lang->group->package->manageDemandPool = 'Manage Demand Pool';
$lang->group->package->manageCharter = 'Manage Charter';
$lang->group->package->reviewCharter = 'Review Charter';
$lang->group->package->browseDemand = 'Browse Demand';
$lang->group->package->manageDemand = 'Manage Demand';
$lang->group->package->reviewDemand = 'Review Demand';
$lang->group->package->importDemand = 'Import Demand';
$lang->group->package->deleteDemand = 'Delete Demand';
$lang->group->package->admin = 'Admin';
$lang->group->package->browseRoadmap = 'Browse Roadmap';
$lang->group->package->manageRoadmap = 'Manage Roadmap';
$lang->group->package->deleteRoadmap = 'Delete Roadmap';
$lang->group->package->deleteDemandPool = 'Delete Demand Pool';
$lang->group->package->exportDatatable = 'Export Datatable';
$lang->group->package->ai = 'AI';
$lang->group->package->executePrompt = 'Execute Prompts';
$lang->group->package->manageLLM = 'Manage Models';
$lang->group->package->browsePrompt = 'Browse Prompts';
$lang->group->package->managePrompt = 'Manage and Design Prompts';
$lang->group->package->publishPrompt = 'Publish and Unpublish Prompts';
$lang->group->package->deletePrompt = 'Delete Prompts';
$lang->group->package->dashboard = 'Dashboard';
$lang->group->package->resource = 'Resource';
$lang->group->package->manageServiceProvider = 'Provider';
$lang->group->package->manageCity = 'City';
$lang->group->package->manageCPU = 'Cpu Brand';
$lang->group->package->manageOS = 'OS Version';
$lang->group->package->browseRepo = 'Repo List';
$lang->group->package->manageRepo = 'Manage Repository';
$lang->group->package->deleteRepo = 'Delete Repository';
$lang->group->package->browseCode = 'Code View';
$lang->group->package->manageCode = 'Manage Code';
$lang->group->package->CodeIssule = 'Review';
$lang->group->package->manageCodeIssue = 'Manage Review';
$lang->group->package->deleteCodeIssue = 'Delete Review';
$lang->group->package->deleteMR = 'Delete MR';
$lang->group->package->deleteJob = 'Delete PipeLine';
$lang->group->package->artifactrepo = 'Artifact Repo';
$lang->group->package->browseArtifactrepo = 'Artifact Repo List';
$lang->group->package->manageArtifactrepo = 'Manage Artifact Repo';
$lang->group->package->deleteArtifactrepo = 'Delete Artifact Repo';
$lang->group->package->browseInstance = 'Application List';
$lang->group->package->browseInstance = 'Manage Application';
$lang->group->package->trainPracticeLib = 'Practice Library';
$lang->group->package->other = 'Other';
include (dirname(__FILE__) . '/resource.php');
+380
View File
@@ -203,4 +203,384 @@ $lang->group->versions['1_2'] = '禅道1.2';
$lang->group->versions['1_1'] = '禅道1.1';
$lang->group->versions['1_0_1'] = '禅道1.0.1';
$lang->group->package = new stdclass();
$lang->group->package->browseTodo = '浏览待办';
$lang->group->package->manageTodo = '创建维护待办';
$lang->group->package->deleteTodo = '删除待办';
$lang->group->package->importTodo = '导入导出待办';
$lang->group->package->manageContact = '维护联系人';
$lang->group->package->profile = '个人档案';
$lang->group->package->preference = '个性化设置';
$lang->group->package->browseProgram = '浏览项目集';
$lang->group->package->manageProgram = '创建维护项目集';
$lang->group->package->deleteProgram = '删除项目集';
$lang->group->package->invest = '投入人员';
$lang->group->package->accessible = '可访问人员';
$lang->group->package->whitelist = '维护白名单';
$lang->group->package->stakeholder = '维护干系人';
$lang->group->package->my = '浏览地盘';
$lang->group->package->browseProduct = '浏览产品';
$lang->group->package->manageProductLine = '创建维护产品线';
$lang->group->package->createProduct = '创建维护产品';
$lang->group->package->importProduct = '导入导出产品';
$lang->group->package->productWhitelist = '白名单管理';
$lang->group->package->branch = '分支管理';
$lang->group->package->browseStory = '浏览研发需求';
$lang->group->package->manageStory = '创建维护研发需求';
$lang->group->package->importStory = '导入导出研发需求';
$lang->group->package->deleteStory = '删除研发需求';
$lang->group->package->reviewStory = '评审研发需求';
$lang->group->package->deleteProduct = '删除产品';
$lang->group->package->browseRequirement = '浏览用户需求';
$lang->group->package->manageRequirement = '创建维护用户需求';
$lang->group->package->importRequirement = '导入导出用户需求';
$lang->group->package->deleteRequirement = '删除用户需求';
$lang->group->package->reviewRequirement = '评审用户需求';
$lang->group->package->browseProductPlan = '浏览产品计划';
$lang->group->package->manageProductPlan = '创建维护产品计划';
$lang->group->package->deleteProductPlan = '删除产品计划';
$lang->group->package->browseRelease = '浏览发布';
$lang->group->package->manageRelease = '创建维护发布';
$lang->group->package->importRelease = '导入导出发布';
$lang->group->package->deleteRelease = '删除发布';
$lang->group->package->releaseNotify = '发布通知';
$lang->group->package->projectPlan = '项目计划';
$lang->group->package->manageProjectStory = '维护项目研发需求';
$lang->group->package->browseProject = '浏览项目';
$lang->group->package->manageProject = '创建维护项目';
$lang->group->package->importProject = '导入导出项目';
$lang->group->package->projectTeam = '团队权限';
$lang->group->package->deleteProject = '删除项目';
$lang->group->package->projectWhitelist = '项目白名单';
$lang->group->package->browseExecution = '浏览执行';
$lang->group->package->manageExecution = '创建维护执行';
$lang->group->package->deleteExecution = '删除执行';
$lang->group->package->importExecution = '导入导出执行';
$lang->group->package->executionWhitelist = '执行白名单';
$lang->group->package->gantt = '执行甘特图';
$lang->group->package->browseTask = '浏览任务';
$lang->group->package->manageTask = '创建维护任务';
$lang->group->package->deleteTask = '删除任务';
$lang->group->package->importTask = '导入导出任务';
$lang->group->package->executionTeam = '执行团队';
$lang->group->package->kanban = '看板';
$lang->group->package->groupView = '分组视图';
$lang->group->package->burndown = '燃尽图';
$lang->group->package->cfd = '累积流图';
$lang->group->package->manageExecutionStory = '维护执行研发需求';
$lang->group->package->manageExecutionEffort = '维护执行日志';
$lang->group->package->manageBuild = '创建维护版本';
$lang->group->package->deleteBuild = '删除版本';
$lang->group->package->browseStoryLib = '浏览需求库';
$lang->group->package->manageStoryLib = '创建维护需求库';
$lang->group->package->deleteStoryLib = '删除需求库';
$lang->group->package->reviewStoryLib = '评审需求库';
$lang->group->package->browseIssueLib = '浏览问题库';
$lang->group->package->manageIssueLib = '创建编辑问题库';
$lang->group->package->deleteIssueLib = '删除问题库';
$lang->group->package->reviewIssue = '审批问题';
$lang->group->package->browseRiskLib = '浏览风险库';
$lang->group->package->manageRiskLib = '创建维护风险库';
$lang->group->package->deleteRiskLib = '删除风险库';
$lang->group->package->reivewRisk = '审批风险';
$lang->group->package->browseOpportunityLib = '浏览机会库';
$lang->group->package->manageOpportunityLib = '创建维护机会库';
$lang->group->package->deleteOpportunityLib = '删除机会库';
$lang->group->package->reviewOpportunity = '审批机会';
$lang->group->package->browsePracticeLib = '浏览最佳实践库';
$lang->group->package->managePracticeLib = '创建维护最佳实践库';
$lang->group->package->deletePracticeLib = '删除最佳实践库';
$lang->group->package->reviewPractice = '审批最佳实践';
$lang->group->package->browseComponentLib = '浏览组件库';
$lang->group->package->manageComponentLib = '创建维护组件库';
$lang->group->package->deleteComponentLib = '删除组件库';
$lang->group->package->reviewComponent = '审批组件';
$lang->group->package->browseCaseLib = '浏览用例库';
$lang->group->package->manageCaseLib = '创建维护用例库';
$lang->group->package->deleteCaseLib = '删除用例库';
$lang->group->package->importCaseLib = '导入导出用例库';
$lang->group->package->importToCaseLib = '导入到用例库';
$lang->group->package->officeApproval = '办公审批';
$lang->group->package->attend = '个人考勤';
$lang->group->package->officeSetting = '办公设置';
$lang->group->package->dataPermission = '数据权限';
$lang->group->package->leave = '个人请假';
$lang->group->package->makeup = '个人补班';
$lang->group->package->overtime = '个人加班';
$lang->group->package->lieu = '个人调休';
$lang->group->package->holiday = '节假日';
$lang->group->package->exportOffice = '办公导出';
$lang->group->package->browseFeedback = '浏览反馈';
$lang->group->package->manageFeedback = '创建维护反馈';
$lang->group->package->importFeedback = '导入导出反馈';
$lang->group->package->manageFeedback = '处理反馈';
$lang->group->package->faq = 'FAQ';
$lang->group->package->browseTicket = '浏览工单';
$lang->group->package->manageTicket = '创建维护工单';
$lang->group->package->importTicket = '导入导出工单';
$lang->group->package->deleteFeedback = '删除反馈';
$lang->group->package->deleteTIcket = '删除工单';
$lang->group->package->feedbackPriv = '设置反馈权限';
$lang->group->package->browseCourse = '课程';
$lang->group->package->manageTrainCourse = '后台管理';
$lang->group->package->system = '平台';
$lang->group->package->host = '主机管理';
$lang->group->package->serverRoom = '机房管理';
$lang->group->package->account = '账号管理';
$lang->group->package->domain = '域名管理';
$lang->group->package->service = '服务管理';
$lang->group->package->deployPlan = '运维计划';
$lang->group->package->deployScope = '上线范围';
$lang->group->package->deployStep = '上线步骤';
$lang->group->package->deployCase = '上线用例';
$lang->group->package->qaIndex = '测试仪表盘';
$lang->group->package->browseBug = '浏览Bug';
$lang->group->package->manageBug = '创建维护Bug';
$lang->group->package->deleteBug = '删除Bug';
$lang->group->package->importBug = '导入导出Bug';
$lang->group->package->browseCase = '浏览用例';
$lang->group->package->manageCase = '创建维护用例';
$lang->group->package->importCase = '导入导出用例';
$lang->group->package->deleteCase = '删除用例';
$lang->group->package->reviewCase = '评审用例';
$lang->group->package->browseTesttask = '浏览测试单';
$lang->group->package->manageTesttask = '创建维护测试单';
$lang->group->package->deleteTesttask = '删除测试单';
$lang->group->package->unitTest = '单元测试';
$lang->group->package->testsuite = '浏览套件';
$lang->group->package->manageTestsuite = '创建维护套件';
$lang->group->package->deleteTestsuite = '删除套件';
$lang->group->package->browseTestreport = '浏览测试报告';
$lang->group->package->manageTestreport = '创建维护测试报告';
$lang->group->package->deleteTestreport = '删除测试报告';
$lang->group->package->importTestreport = '导入导出测试报告';
$lang->group->package->browseZAHost = '浏览宿主机';
$lang->group->package->manageZAHost = '创建维护宿主机';
$lang->group->package->deleteZAHost = '删除宿主机';
$lang->group->package->image = '镜像';
$lang->group->package->browseZANode = '浏览执行节点';
$lang->group->package->manageZANode = '创建维护执行节点';
$lang->group->package->importZANode = '导入导出执行节点';
$lang->group->package->snapshot = '快照';
$lang->group->package->companyTeam = '浏览组织团队';
$lang->group->package->companyCalendar = '浏览组织日程';
$lang->group->package->companyEffort = '浏览组织日志';
$lang->group->package->companyDynamic = '浏览组织动态';
$lang->group->package->companySetting = '维护公司信息';
$lang->group->package->companyDataPermission = '部门数据权限';
$lang->group->package->programPlan = '项目阶段';
$lang->group->package->browseDesign = '浏览设计';
$lang->group->package->manageDesign = '创建维护设计';
$lang->group->package->deleteDesign = '删除设计';
$lang->group->package->manageReview = '维护基线评审';
$lang->group->package->manageIssue = '维护问题';
$lang->group->package->projectSetting = '项目配置';
$lang->group->package->browseProjectRelease = '浏览项目发布';
$lang->group->package->projectWeekly = '项目周报';
$lang->group->package->projectMilestone = '项目里程碑报告';
$lang->group->package->researchPlan = '调研计划';
$lang->group->package->researchReport = '调研报告';
$lang->group->package->budget = '费用估算';
$lang->group->package->workEstimation = '工作量估算';
$lang->group->package->durationEstimation = '项目工期估算';
$lang->group->package->browseIssue = '浏览问题';
$lang->group->package->manageIssue = '创建维护问题';
$lang->group->package->importIssue = '导入导出问题';
$lang->group->package->deleteIssue = '删除问题';
$lang->group->package->importIssueLib = '导入问题库';
$lang->group->package->browseRisk = '浏览风险';
$lang->group->package->manageRisk = '创建维护风险';
$lang->group->package->importRisk = '导入导出风险';
$lang->group->package->deleteRisk = '删除风险';
$lang->group->package->importRiskLib = '导入风险库';
$lang->group->package->browseOpportunity = '浏览机会';
$lang->group->package->manageOpportunity = '创建维护机会';
$lang->group->package->deleteOpportunity = '删除机会';
$lang->group->package->importOpportunityLib = '导入机会库';
$lang->group->package->importOpportunity = '导入导出机会';
$lang->group->package->pssp = '项目过程';
$lang->group->package->measrecord = '项目度量';
$lang->group->package->manageAuditPlan = '维护质量保证计划';
$lang->group->package->nc = '不符合项';
$lang->group->package->meeting = '会议';
$lang->group->package->trainPlan = '培训计划';
$lang->group->package->gapAnalysis = '能力差距分析';
$lang->group->package->workflowField = '工作流字段';
$lang->group->package->workflowAction = '工作流动作';
$lang->group->package->workflowLayout = '工作流界面';
$lang->group->package->workflowCondition = '工作流触发条件';
$lang->group->package->workflowLinkage = '工作流界面联动';
$lang->group->package->workflowHook = '工作流扩展动作';
$lang->group->package->workflowLabel = '工作流标签';
$lang->group->package->workflowReport = '工作流报表';
$lang->group->package->workflowDatasource = '工作流数据源';
$lang->group->package->workflowRule = '工作流验证规则';
$lang->group->package->workflow = '工作流';
$lang->group->package->downloadCode = '下载代码';
$lang->group->package->dev = '二次开发';
$lang->group->package->browseCodeIssue = '浏览代码问题';
$lang->group->package->editor = '编辑器';
$lang->group->package->serverLink = '接入禅道';
$lang->group->package->browseMR = '浏览合并请求';
$lang->group->package->managePriv = '权限后台设置';
$lang->group->package->dept = '部门结构';
$lang->group->package->group = '权限分组';
$lang->group->package->user = '维护用户';
$lang->group->package->extension = '插件管理';
$lang->group->package->message = '通知设置';
$lang->group->package->mail = '邮件配置';
$lang->group->package->webhook = 'Webhook';
$lang->group->package->gitlab = 'GitLab';
$lang->group->package->sms = '短信配置';
$lang->group->package->gogs = 'Gogs';
$lang->group->package->gitea = 'Gitea';
$lang->group->package->sonarqube = 'SonarQube';
$lang->group->package->repoRules = '指令';
$lang->group->package->browseJob = '浏览流水线';
$lang->group->package->manageJob = '创建维护流水线';
$lang->group->package->manageMR = '创建维护合并请求';
$lang->group->package->backup = '系统备份';
$lang->group->package->trash = '回收站';
$lang->group->package->security = '安全';
$lang->group->package->cron = '定时';
$lang->group->package->ldap = 'LDAP';
$lang->group->package->chat = '聊天';
$lang->group->package->jenkins = 'jenkins';
$lang->group->package->systemSetting = '系统设置';
$lang->group->package->search = '搜索';
$lang->group->package->comment = '备注';
$lang->group->package->module = '模块维护';
$lang->group->package->file = '附件';
$lang->group->package->commonEffort = '通用日志';
$lang->group->package->docTemplate = '文档模板';
$lang->group->package->importStoryLib = '导入需求库';
$lang->group->package->projectStakeholder = '项目干系人';
$lang->group->package->projectBuild = '项目版本';
$lang->group->package->importCaseLib = '导入用例库';
$lang->group->package->commonSetting = '通用配置';
$lang->group->package->stageSetting = '阶段列表设置';
$lang->group->package->classify = '分类项设置';
$lang->group->package->cmcl = '审计设置';
$lang->group->package->auditcl = 'QA检查项设置';
$lang->group->package->reviewcl = '评审设置';
$lang->group->package->process = '过程设置';
$lang->group->package->activity = '活动设置';
$lang->group->package->zoutput = '文档设置';
$lang->group->package->custom = '自定义配置';
$lang->group->package->cmcl = '审批设置';
$lang->group->package->measurement = '度量设置';
$lang->group->package->usercl = '用户设置';
$lang->group->package->meetingroom = '会议室设置';
$lang->group->package->sqlBuilder = 'sql构建器';
$lang->group->package->designSetting = '设计设置';
$lang->group->package->kanbanSpace = '维护空间';
$lang->group->package->deleteKanbanSpace = '删除空间';
$lang->group->package->browseKanban = '浏览看板';
$lang->group->package->manageKanban = '创建维护看板';
$lang->group->package->deleteKanban = '删除看板';
$lang->group->package->deleteZANode = '删除执行节点';
$lang->group->package->autotesting = '自动化测试';
$lang->group->package->executionTesting = '执行测试';
$lang->group->package->manageEffort = '维护日志';
$lang->group->package->projectTesting = '项目测试';
$lang->group->package->track = '矩阵';
$lang->group->package->workflowRelation = '工作流跨流程设置';
$lang->group->package->template = '模板';
$lang->group->package->table = '数据表格';
$lang->group->package->automation = '自动化';
$lang->group->package->git = 'Git';
$lang->group->package->subversion = 'Subversion';
$lang->group->package->ping = '防超时';
$lang->group->package->review = '审批';
$lang->group->package->manageProjectRelease = '创建维护项目发布';
$lang->group->package->deleteProjectRelease = '删除项目发布';
$lang->group->package->importProjectRelease = '导入导出项目发布';
$lang->group->package->projectReleaseNotify = '项目发布通知';
$lang->group->package->gantt = '阶段甘特图';
$lang->group->package->executionRelation = '维护任务关系';
$lang->group->package->browseBuild = '浏览版本';
$lang->group->package->browseExecutionStory = '浏览执行研发需求';
$lang->group->package->manageCard = '维护卡片';
$lang->group->package->browseProjectStory = '浏览项目研发需求';
$lang->group->package->chckAuditPlan = '检查质量保证计划';
$lang->group->package->reviewAssess = '评审基线评审';
$lang->group->package->reviewAudit = '审计基线评审';
$lang->group->package->dimension = '管理维度';
$lang->group->package->browseScreen = '浏览大屏';
$lang->group->package->manageScreen = '创建维护大屏';
$lang->group->package->deleteScreen = '删除大屏';
$lang->group->package->screenDataPermission = '大屏数据权限';
$lang->group->package->browsePivot = '浏览透视表';
$lang->group->package->designPivot = '设计透视表';
$lang->group->package->exportPivot = '导出透视表';
$lang->group->package->pivotDataPermission = '透视表数据权限';
$lang->group->package->browseChart = '浏览图表';
$lang->group->package->designChart = '设计图表';
$lang->group->package->exportChart = '导出图表';
$lang->group->package->browseDataview = '浏览数据表';
$lang->group->package->manageDataview = '创建维护数据表';
$lang->group->package->deleteDataview = '删除数据表';
$lang->group->package->browseDoc = '浏览文档';
$lang->group->package->manageDoc = '创建与维护文档';
$lang->group->package->deleteDoc = '删除文档';
$lang->group->package->exportDoc = '导出文档';
$lang->group->package->browseAPI = '浏览接口空间';
$lang->group->package->manageAPI = '创建维护接口';
$lang->group->package->exportAPI = '导出接口';
$lang->group->package->deleteAPI = '删除接口';
$lang->group->package->callAPI = '接口调用';
$lang->group->package->scene = '维护场景';
$lang->group->package->executionTree = '树状图';
$lang->group->package->taskEffort = '工时明细表';
$lang->group->package->taskCalendar = '任务日历';
$lang->group->package->code = '代码';
$lang->group->package->repo = '代码库';
$lang->group->package->browseDemandPool = '浏览需求池';
$lang->group->package->browseCharter = '浏览立项';
$lang->group->package->manageDemandPool = '创建维护需求池';
$lang->group->package->manageCharter = '创建维护立项';
$lang->group->package->reviewCharter = '立项审批';
$lang->group->package->browseDemand = '浏览需求';
$lang->group->package->manageDemand = '创建维护需求';
$lang->group->package->reviewDemand = '评审需求';
$lang->group->package->importDemand = '导入导出需求';
$lang->group->package->deleteDemand = '删除需求';
$lang->group->package->admin = '后台';
$lang->group->package->browseRoadmap = '浏览产品路标';
$lang->group->package->manageRoadmap = '创建维护产品路标';
$lang->group->package->deleteRoadmap = '删除产品路标';
$lang->group->package->deleteDemandPool = '删除需求池';
$lang->group->package->exportDatatable = '导出数据表';
$lang->group->package->ai = 'AI';
$lang->group->package->executePrompt = '执行提词';
$lang->group->package->manageLLM = '语言模型管理';
$lang->group->package->browsePrompt = '浏览提词';
$lang->group->package->managePrompt = '维护和设计提词';
$lang->group->package->publishPrompt = '提词上下架';
$lang->group->package->deletePrompt = '删除提词';
$lang->group->package->dashboard = '仪表盘';
$lang->group->package->resource = '资源';
$lang->group->package->manageServiceProvider = '服务商管理';
$lang->group->package->manageCity = '城市管理';
$lang->group->package->manageCPU = 'CPU管理';
$lang->group->package->manageOS = '系统版本管理';
$lang->group->package->browseRepo = '浏览代码库';
$lang->group->package->manageRepo = '创建维护代码库';
$lang->group->package->deleteRepo = '删除代码库';
$lang->group->package->browseCode = '浏览代码';
$lang->group->package->manageCode = '维护代码';
$lang->group->package->CodeIssule = '问题';
$lang->group->package->manageCodeIssue = '创建维护代码问题';
$lang->group->package->deleteCodeIssue = '删除代码问题';
$lang->group->package->deleteMR = '删除合并请求';
$lang->group->package->deleteJob = '删除流水线';
$lang->group->package->artifactrepo = '制品库';
$lang->group->package->browseArtifactrepo = '浏览制品库';
$lang->group->package->manageArtifactrepo = '创建维护制品库';
$lang->group->package->deleteArtifactrepo = '删除制品库';
$lang->group->package->browseInstance = '浏览应用';
$lang->group->package->browseInstance = '管理应用';
$lang->group->package->trainPracticeLib = '实践库';
$lang->group->package->other = '其他';
include (dirname(__FILE__) . '/resource.php');
+219 -222
View File
@@ -412,36 +412,15 @@ class groupModel extends model
* @access public
* @return bool
*/
public function updatePrivByGroup($groupID, $menu, $version)
public function updatePrivByGroup($groupID, $nav, $version)
{
/* Delete old. */
/* Set priv when have version. */
if($version)
{
$noCheckeds = trim($this->post->noChecked, ',');
if($noCheckeds)
{
$noCheckeds = explode(',', $noCheckeds);
foreach($noCheckeds as $noChecked)
{
/* Delete no checked priv*/
list($module, $method) = explode('-', $noChecked);
$this->dao->delete()->from(TABLE_GROUPPRIV)->where('`group`')->eq($groupID)->andWhere('module')->eq($module)->andWhere('method')->eq($method)->exec();
}
}
}
else
{
$privs = !empty($menu) ? $this->getPrivsListByView($menu) : array();
$privs = !empty($menu) ? $this->getCustomPrivs($menu, $privs) : array();
if(!empty($privs) or empty($menu))
{
$this->dao->delete()->from(TABLE_GROUPPRIV)
->where('`group`')->eq($groupID)
->beginIF(!empty($menu))->andWhere("CONCAT(module, '-', method)")->in(array_keys($privs))->fi()
->exec();
}
}
$privs = array_keys($this->getPrivListByNav($nav, $version));
$this->dao->delete()->from(TABLE_GROUPPRIV)
->where('`group`')->eq($groupID)
->beginIF(!empty($nav))->andWhere("CONCAT(module, '-', method)")->in($privs)->fi()
->exec();
$data = new stdclass();
$data->group = $groupID;
@@ -449,66 +428,59 @@ class groupModel extends model
$data->method = 'index';
$this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec();
$hasDepend = false;
/* Insert new. */
if($this->post->actions)
{
$depentedPrivs = array();
$privs = array();
$dependPrivs = array();
foreach($this->config->group->package as $packageCode => $packageData)
{
foreach($packageData->privs as $privCode => $priv)
{
if(isset($priv['depend'])) $dependPrivs[$privCode] = $priv['depend'];
}
}
$insertPrivs = array();
foreach($this->post->actions as $moduleName => $moduleActions)
{
if(empty($moduleName) or empty($moduleActions)) continue;
$privList = array();
foreach($moduleActions as $actionName) $privList["{$moduleName}-{$actionName}"] = "{$moduleName}-{$actionName}";
$relationPrivs = $this->getPrivRelationsByIdList($privList, 'depend', 'idGroup');
$depentedPrivs = array_merge($depentedPrivs, array_keys(zget($relationPrivs, 'depend', array())));
foreach($moduleActions as $actionName)
{
$data = new stdclass();
$data = new stdclass();
$data->group = $groupID;
$data->module = $moduleName;
$data->method = $actionName;
$privs[] = $data;
$insertPrivs["{$moduleName}-{$actionName}"] = $data;
}
}
$this->insertPrivs($privs);
foreach($depentedPrivs as $index => $priv)
foreach($insertPrivs as $key => $priv)
{
list($module, $method) = explode('-', $priv);
if(!empty($_POST['actions'][$module]) and in_array($method, $_POST['actions'][$module]))
foreach($dependPrivs[$key] as $depend)
{
unset($depentedPrivs[$index]);
continue;
if(isset($insertPrivs[$depend])) continue;
list($moduleName, $methodName) = explode('-', $depend);
$data = new stdclass();
$data->group = $groupID;
$data->module = $moduleName;
$data->method = $methodName;
$insertPrivs[$depend] = $data;
$hasDepend = true;
}
$data = new stdclass();
$data->group = $groupID;
$data->module = $module;
$data->method = $method;
$this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec();
}
$recommendPrivs = zget($_POST, 'recommendPrivs', array());
foreach($recommendPrivs as $moduleMethod => $priv)
{
list($module, $method) = explode('-', $moduleMethod);
if(in_array($method, zget($_POST['actions'], $module, array())))
{
unset($recommendPrivs[$moduleMethod]);
continue;
}
$data = new stdclass();
$data->group = $groupID;
$data->module = $module;
$data->method = $method;
$this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec();
}
$this->insertPrivs($insertPrivs);
}
return !empty($depentedPrivs) ? true : false;
return $hasDepend;
}
/**
@@ -794,19 +766,21 @@ class groupModel extends model
}
/**
* Check menu have module
* Check nav have module.
*
* @param string $menu
* @param string $nav
* @param string $moduleName
* @access public
* @return void
*/
public function checkMenuModule($menu, $moduleName)
public function checkNavModule($nav, $moduleName)
{
if(empty($menu)) return true;
if($menu == 'general' and (isset($this->lang->navGroup->$moduleName) or isset($this->lang->mainNav->$moduleName))) return false;
if($menu != 'general' and !($moduleName == $menu or (isset($this->lang->navGroup->$moduleName) and $this->lang->navGroup->$moduleName == $menu))) return false;
if($menu == 'project' and strpos('caselib|testsuite|report', $moduleName) !== false) return false;
if(empty($nav)) return true;
if($nav == 'general' and (isset($this->lang->navGroup->$moduleName) or isset($this->lang->mainNav->$moduleName))) return false;
if($nav != 'general' and !($moduleName == $nav or (isset($this->lang->navGroup->$moduleName) and $this->lang->navGroup->$moduleName == $nav))) return false;
if($nav == 'project' and strpos('caselib|testsuite|report', $moduleName) !== false) return false;
return true;
}
@@ -823,7 +797,7 @@ class groupModel extends model
$modules = array();
foreach($this->lang->resource as $moduleName => $action)
{
if($this->checkMenuModule($menu, $moduleName))
if($this->checkNavModule($menu, $moduleName))
{
$modules[$moduleName] = $moduleName;
if($translateLang)
@@ -1745,62 +1719,63 @@ class groupModel extends model
}
/**
* Get priv group by package.
* Get priv list by nav.
*
* @param array $parentList
* @param string $nav
* @param string $version
* @access public
* @return array
*/
public function getPrivByParent($parentList)
public function getPrivListByNav($nav = '', $version = '')
{
return $this->dao->select('t1.*,t2.`key`,t2.value')->from(TABLE_PRIV)->alias('t1')
->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID')
->where('t1.parent')->in($parentList)
->andWhere('t1.edition')->like("%,{$this->config->edition},%")
->andWhere('t1.vision')->like("%,{$this->config->vision},%")
->andWhere('t2.`objectType`')->eq('priv')
->andWhere('t2.lang')->eq($this->app->getClientLang())
->orderBy('order_asc')
->fetchAll('id');
}
$privList = array();
$allPrivs = array();
/**
* Get privs list by module.
*
* @param string $view
* @param object $pager
* @access public
* @return array
*/
public function getPrivsListByView($view = '', $pager = null)
{
$modules = $this->getPrivManagerPairs('module', $view);
$modules = array_keys($modules);
/* Filter privs equal or greater than this version.*/
if($version) $versionPrivs = $this->getPrivsAfterVersion($version);
$privs = $this->dao->select("t1.id, t1.module, t1.method, CONCAT(t1.module, '-', t1.method) AS action, IF(t3.type = 'module', 0, t1.parent) as parent, t1.order, t2.`key`, t2.`value`, t2.desc, IF(t3.type = 'module', t3.code, t4.code) as parentCode")->from(TABLE_PRIV)->alias('t1')
->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID')
->leftJoin(TABLE_PRIVMANAGER)->alias('t3')->on('t1.parent=t3.id')
->leftJoin(TABLE_PRIVMANAGER)->alias('t4')->on('t3.parent=t4.id')
->where('1=1')
->andWhere('t2.lang')->eq($this->app->getClientLang())
->andWhere('t2.objectType')->eq('priv')
->andWhere('((t3.type')->eq('package')
->andWhere('t4.type')->eq('module')
->beginIF(!empty($view) and $view != 'general')->andWhere('t4.code')->in($modules)->fi()
->beginIF(!empty($view) and $view == 'general')->andWhere('t4.parent')->eq('0')->fi()
->markRight(1)
->orWhere('(t3.type')->eq('module')
->andWhere('t4.type')->eq('view')
->beginIF(!empty($view) and $view != 'general')->andWhere('t3.code')->in($modules)->fi()
->beginIF(!empty($view) and $view == 'general')->andWhere('t3.parent')->eq('0')->fi()
->markRight(2)
->andWhere('t1.edition')->like("%,{$this->config->edition},%")
->andWhere('t1.vision')->like("%,{$this->config->vision},%")
->orderBy("t3.order asc, `order` asc")
->page($pager)
->fetchGroup('parentCode', 'action');
/* Privs in package. */
foreach($this->config->group->package as $packageCode => $packageData)
{
foreach($packageData->privs as $privCode => $priv)
{
list($moduleName, $methodName) = explode('-', $privCode);
$allPrivs[$privCode] = $privCode;
if(strpos(',' . $priv['edition'] . ',', ',' . $this->config->edition . ',') === false) continue;
if(strpos(',' . $priv['vision'] . ',', ',' . $this->config->vision . ',') === false) continue;
if(!$this->checkNavModule($nav, $moduleName)) continue;
/* If version is selected, only show privs before the version. */
if(!empty($version) and strpos($versionPrivs, ",$privCode,") === false) continue;
/* Remove privs unused in the edition. */
if(!isset($this->lang->resource->$moduleName) || !isset($this->lang->resource->$moduleName->$methodName)) continue;
$methodLang = $this->lang->resource->$moduleName->$methodName;
$priv = (object)array('subset' => $packageData->subset, 'package' => $packageCode, 'module' => $moduleName, 'method' => $methodName, 'selected' => false, 'name' => $this->lang->$moduleName->$methodLang);
$privList[$privCode] = $priv;
}
}
if($version || ($nav && $nav != 'general')) return $privList;
/* Privs in resource but not in package. */
foreach($this->lang->resource as $module => $methodList)
{
foreach($methodList as $method => $methodLang)
{
if(isset($allPrivs["$module-$method"])) continue;
if(!isset($this->lang->$module->$methodLang)) $this->app->loadLang($module);
$priv = (object)array('subset' => $module, 'package' => 'other', 'module' => $module, 'method' => $method, 'selected' => false, 'name' => $this->lang->$moduleName->$methodLang);
$privList["$module-$method"] = $priv;
}
}
$privList = array(); foreach($modules as $module) $privList = array_merge($privList, zget($privs, $module, array()));
return $privList;
}
@@ -2235,45 +2210,6 @@ class groupModel extends model
foreach($data->orders as $privID => $order) $this->dao->update(TABLE_PRIV)->set('order')->eq($order)->where('id')->eq($privID)->exec();
}
/**
* Get priv manager pairs.
*
* @param string $type
* @param string $parent
* @access public
* @return array
*/
public function getPrivManagerPairs($type, $parent = '')
{
$parentType = $type == 'package' ? 'module' : 'view';
$parent = !empty($parent) ? $this->dao->select('id as parent')->from(TABLE_PRIVMANAGER)->where('type')->eq($parentType)->andWhere('code')->eq($parent)->fetch('parent') : 0;
$moduleLang = $type == 'module' ? $this->getMenuModules('', true) : array();
$managers = $this->dao->select('t1.id,t1.code,t2.key,t2.value')
->from(TABLE_PRIVMANAGER)->alias('t1')
->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID')
->where('t1.type')->eq($type)
->andWhere('t2.objectType')->eq('manager')
->beginIF($type == 'module')->andWhere('code')->in(array_keys($moduleLang))->fi()
->beginIF(!empty($parent))->andWhere('t1.parent')->eq($parent)->fi()
->andWhere('t1.edition')->like("%,{$this->config->edition},%")
->andWhere('t1.vision')->like("%,{$this->config->vision},%")
->andWhere('t2.lang')->eq($this->app->getClientLang())
->orderBy('order asc')
->fetchAll('id');
$pairs = array();
foreach($managers as $managerID => $manager)
{
$key = $type == 'package' ? $managerID : $manager->code;
if(!empty($manager->value)) $pairs[$key] = $manager->value;
if(empty($manager->value) and $type == 'view') $pairs[$key] = $this->lang->{$manager->key}->common;
if(empty($manager->value) and $type == 'module') $pairs[$key] = isset($moduleLang[$manager->key]) ? $moduleLang[$manager->key] : $this->lang->{$manager->key}->common;
}
return $pairs;
}
/**
* Transform priv lang.
*
@@ -2350,7 +2286,7 @@ class groupModel extends model
foreach($methods as $method => $methodLabel)
{
if(isset($allPrivs[$module][$method])) continue;
if(!$this->checkMenuModule($menu, $module)) continue;
if(!$this->checkNavModule($menu, $module)) continue;
if(!isset($this->lang->{$module}->{$methodLabel})) $this->app->loadLang($module);
if(isset($this->lang->$module->menus) and $method == 'browse') continue;
@@ -2375,69 +2311,54 @@ class groupModel extends model
/**
* Get related privs.
*
* @param array $privList
* @param string $type
* @param array $excludePrivs
* @param array $recommedSelect
* @param array $allPrivList
* @param array $selectedPrivList
* @param array $recommendSelect
* @access public
* @return array
*/
public function getRelatedPrivs($privList, $type = '', $excludePrivs = array(), $recommedSelect = array())
public function getRelatedPrivs($allPrivList, $selectedPrivList, $recommendSelect = array())
{
$modulePairs = $this->getPrivManagerPairs('module');
$modules = array_keys($modulePairs);
$privs = $this->dao->select("t1.relationPriv,t1.type,t2.parent,t2.module,t2.method,t2.`order`,t3.`key`,t3.value, IF(t4.type = 'module', t4.code, t5.code) as parentCode,CONCAT(t2.module, '-', t2.method) as moduleMethod")->from(TABLE_PRIVRELATION)->alias('t1')
->leftJoin(TABLE_PRIV)->alias('t2')->on("t1.relationPriv=CONCAT(t2.module, '-', t2.method)")
->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.objectID')
->leftJoin(TABLE_PRIVMANAGER)->alias('t4')->on('t2.parent=t4.id')
->leftJoin(TABLE_PRIVMANAGER)->alias('t5')->on('t4.parent=t5.id')
->where('t1.priv')->in($privList)
->andWhere('t5.code')->in(array_keys($modulePairs))
->andWhere('(t1.relationPriv')->notin($privList)
->beginIF(!empty($recommedSelect))
->orWhere('(t1.relationPriv')->in($recommedSelect)
->andWhere('t1.type')->eq('recommend')->markRight(1)
->fi()
->markRight(1)
->beginIF(!empty($excludePrivs))->andWhere('t1.relationPriv')->notin($excludePrivs)->fi()
->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi()
->andWhere('t3.objectType')->eq('priv')
->andWhere('t2.edition')->like("%,{$this->config->edition},%")
->andWhere('t2.vision')->like("%,{$this->config->vision},%")
->andWhere('((t4.type')->eq('package')
->andWhere('t5.type')->eq('module')
->beginIF(!empty($view) and $view != 'general')->andWhere('t5.code')->in($modules)->fi()
->markRight(1)
->orWhere('(t4.type')->eq('module')
->andWhere('t5.type')->eq('view')
->beginIF(!empty($view) and $view != 'general')->andWhere('t1.module')->in($modules)->fi()
->markRight(2)
->orderBy('t2.`order`_asc, t1.`type` desc')
->fetchGroup('parentCode', 'relationPriv');
$relatedPrivs = array();
foreach($modules as $module) $relatedPrivs = array_merge($relatedPrivs, zget($privs, $module, array()));
$privList = empty($type) ? array('depend' => array(), 'recommend' => array()) : array($type => array());
if(empty($relatedPrivs)) return $privList;
$managerList = $this->dao->select('*')->from(TABLE_PRIVMANAGER)->fetchAll('id');
$relatedPrivs = $this->transformPrivLang($relatedPrivs);
foreach($relatedPrivs as $relatedPriv)
$privSubsets = array();
$relatedPrivs = array('depend' => array(), 'recommend' => array());
foreach($this->config->group->package as $packagePage => $package)
{
$module = $managerList[$relatedPriv->parent]->type == 'package' ? $managerList[$managerList[$relatedPriv->parent]->parent]->code : $managerList[$relatedPriv->parent]->code;
if(!isset($privList[$relatedPriv->type][$module])) $privList[$relatedPriv->type][$module] = array();
$privList[$relatedPriv->type][$module]['title'] = $modulePairs[$module];
$privList[$relatedPriv->type][$module]['id'] = $relatedPriv->parent;
$privList[$relatedPriv->type][$module]['children'][] = array('title' => $relatedPriv->name, 'relationPriv' => $relatedPriv->relationPriv, 'parent' => $relatedPriv->parent, 'module' => $relatedPriv->module, 'method' => $relatedPriv->method);
foreach($package->privs as $privCode => $priv)
{
$privSubsets[$privCode] = $package->subset;
foreach(array('depend', 'recommend') as $type)
{
/* Show related pirvs when select. */
if($type == 'recommend' && in_array($privCode, $recommendSelect)) $relatedPrivs[$type][$privCode] = $privCode;
if(!in_array($privCode, $selectedPrivList) || !isset($priv[$type])) continue;
foreach($priv[$type] as $relatedPriv)
{
if(!in_array($relatedPriv, $selectedPrivList) && in_array($relatedPriv, $allPrivList)) $relatedPrivs[$type][$relatedPriv] = $relatedPriv;
}
}
}
}
if(empty($type) or $type == 'depend') $privList['depend'] = array_values($privList['depend']);
if(empty($type) or $type == 'recommend') $privList['recommend'] = array_values($privList['recommend']);
return $privList;
$subsetPrivs = array('depend' => array(), 'recommend' => array());
foreach(array('depend', 'recommend') as $type)
{
foreach($relatedPrivs[$type] as $relatedPriv)
{
$subset = $privSubsets[$relatedPriv];
if(!isset($subsetPrivs[$type][$subset])) $subsetPrivs[$type][$subset] = array('id' => $subset, 'title' => $this->lang->$subset->common, 'children' => array());
list($moduleName, $methodName) = explode('-', $relatedPriv);
$method = $this->lang->resource->$moduleName->$methodName;
if(!isset($this->lang->$moduleName->$method)) $this->app->loadLang($moduleName);
$subsetPrivs[$type][$subset]['children'][] = array('id' => $relatedPriv, 'module' => $moduleName, 'method' => $methodName, 'subset' => $subset, 'title' => $this->lang->$moduleName->$method);
}
}
return array('depend' => array_values($subsetPrivs['depend']), 'recommend' => array_values($subsetPrivs['recommend']));
}
/**
@@ -2468,9 +2389,7 @@ class groupModel extends model
*/
public function getPrivListByGroup($groupID)
{
$modulePairs = $this->getPrivManagerPairs('module');
$modules = array_keys($modulePairs);
$actions = $this->dao->select("CONCAT(module, '-', method) AS action")->from(TABLE_GROUPPRIV)->where('`group`')->eq($groupID)->andWhere('module')->in($modules)->fetchPairs();
$actions = $this->dao->select("CONCAT(module, '-', method) AS action")->from(TABLE_GROUPPRIV)->where('`group`')->eq($groupID)->fetchPairs();
$actions = implode("','", $actions);
$privIdList = $this->dao->select("*")->from(TABLE_PRIV)
->where("CONCAT(module, '-', method) IN ('$actions')")
@@ -2483,4 +2402,82 @@ class groupModel extends model
return $privs;
}
/**
* AJAX: Get privs by parents.
*
* @param string $selectedSubset
* @param string $selectedPackages
* @access public
* @return bool
*/
public function getPrivByParents($selectedSubset, $selectedPackages = '')
{
$allPrivs = array();
$privs = array();
/* Privs in package. */
foreach($this->config->group->package as $packageCode => $packageData)
{
foreach($packageData->privs as $privCode => $priv)
{
list($moduleName, $methodName) = explode('-', $privCode);
/* Remove privs unused in the edition. */
if(!isset($this->lang->resource->$moduleName) || !isset($this->lang->resource->$moduleName->$methodName)) continue;
$allPrivs[$privCode] = $privCode;
$subset = $packageData->subset;
if($subset !== $selectedSubset) 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;
}
}
if(empty($selectedPackages) || strpos($selectedPackages, ',other,') !== false)
{
/* Privs in resource but not in package. */
$this->sortResource();
foreach($this->lang->resource as $module => $methodList)
{
foreach($methodList as $method => $methodLang)
{
if($module != $selectedSubset) continue;
if(isset($allPrivs["$module-$method"])) continue;
if(!isset($this->lang->$module->$methodLang)) $this->app->loadLang($module);
$privs["$module-$method"] = $this->lang->$module->$methodLang;
}
}
}
return $privs;
}
/**
* Get privs after version
*
* @param string $version
* @access public
* @return string
*/
public function getPrivsAfterVersion($version)
{
$realVersion = str_replace('_', '.', $version);
$changelog = array();
foreach($this->lang->changelog as $currentVersion => $currentChangeLog)
{
if(version_compare($currentVersion, $realVersion, '>=')) $changelog[] = join(',', $currentChangeLog);
}
$versionPrivs = ',' . join(',', $changelog) . ',';
return $versionPrivs;
}
}
File diff suppressed because it is too large Load Diff
+30 -39
View File
@@ -50,25 +50,25 @@
<div class='btn-toolbar pull-left'>
<span id='groupName'><i class='icon-lock'></i> <?php echo $group->name;?> <i class="icon icon-chevron-right"></i></span>
<?php $params = "type=byGroup&param=$groupID&menu=%s&version=$version";?>
<?php $active = empty($menu) ? 'btn-active-text' : '';?>
<?php $active = empty($nav) ? 'btn-active-text' : '';?>
<?php echo html::a(inlink('managePriv', sprintf($params, '')), "<span class='text'>{$lang->group->all}</span>", '', "class='btn btn-link $active'")?>
<?php
$i = 0;
foreach($lang->mainNav as $module => $title)
foreach($lang->mainNav as $navKey => $title)
{
if(!is_string($title)) continue;
$i++;
if($i == $config->group->maxToolBarCount) echo '<div class="btn-group"><a href="javascript:;" data-toggle="dropdown" class="btn btn-link">' . $lang->group->more . '<span class="caret"></span></a><ul class="dropdown-menu">';
$active = $menu == $module ? 'btn-active-text' : '';
$active = $nav == $navKey ? 'btn-active-text' : '';
if($i >= $config->group->maxToolBarCount) echo '<li>';
echo html::a(inlink('managePriv', sprintf($params, $module)), "<span class='text'>" . strip_tags(substr($title, 0, strpos($title, '|'))) . '</span>', '', "class='btn btn-link $active'");
echo html::a(inlink('managePriv', sprintf($params, $navKey)), "<span class='text'>" . strip_tags(substr($title, 0, strpos($title, '|'))) . '</span>', '', "class='btn btn-link $active'");
if($i >= $config->group->maxToolBarCount) echo '</li>';
}
if($i >= $config->group->maxToolBarCount) echo '</ul></div>';
?>
<?php $active = $menu == 'general' ? 'btn-active-text' : '';?>
<?php $active = $nav == 'general' ? 'btn-active-text' : '';?>
<?php echo html::a(inlink('managePriv', sprintf($params, 'general')), "<span class='text'>{$lang->group->general}</span>", '', "class='btn btn-link $active'");?>
<div class='input-control space w-150px'>
@@ -92,56 +92,47 @@
</tr>
</thead>
<tbody>
<?php foreach($privList as $moduleName => $packages):?>
<?php if(!count((array)$packages)) continue;?>
<?php
$i = 1;
$modulePrivs = count($privList[$moduleName], 1) - count($selectPrivs[$moduleName], 1);
$moduleSelect = array_sum($selectPrivs[$moduleName]);
?>
<?php foreach($packages as $packageID => $privs):?>
<?php foreach($subsets as $subsetName => $subset):?>
<?php if($subset->allCount == 0) continue;?>
<?php $i = 1;?>
<?php foreach($packages[$subsetName] as $packageCode => $package):?>
<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;?>" data-module='<?php echo $moduleName;?>' all-privs='<?php echo $modulePrivs;?>' select-privs='<?php echo $moduleSelect;?>'>
<th class='text-middle text-left module' rowspan="<?php echo $i == 1 ? count($packages[$subsetName]) : 1;?>" data-module='<?php echo $subsetName;?>' all-privs='<?php echo $subset->allCount;?>' select-privs='<?php echo $subset->selectCount;?>'>
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
<input type='checkbox' id='allChecker<?php echo $moduleName;?>' value='1' <?php if(!empty($moduleSelect) and $modulePrivs == $moduleSelect) echo 'checked';?>>
<?php $moduleTitle = $lang->$moduleName->common;?>
<?php if(in_array($moduleName, array('doc', 'api'))) $moduleTitle = $lang->$moduleName->manage;?>
<label class='text-left <?php if(!empty($moduleSelect) and $modulePrivs != $moduleSelect) echo 'checkbox-indeterminate-block';?>' for='allChecker<?php echo $moduleName;?>'><?php echo $moduleTitle;?></label>
<input type='checkbox' id='allChecker<?php echo $subsetName;?>' value='1' <?php if($subset->selectCount != 0 && $subset->selectCount == $subset->allCount) echo 'checked';?>>
<?php $subsetTitle = $lang->$subsetName->common;?>
<?php if(in_array($subsetName, array('doc', 'api'))) $subsetTitle = $lang->$subsetName->manage;?>
<label class='text-left <?php if($subset->selectCount != 0 && $subset->selectCount == $subset->allCount) echo 'checkbox-indeterminate-block';?>' for='allChecker<?php echo $moduleName;?>'><?php echo $subsetTitle;?></label>
</div>
</th>
<?php endif;?>
<?php
$packagePrivs = count($privs);
$packageSelect = $selectPrivs[$moduleName][$packageID];
?>
<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;?>'>
<th class='<?php echo $i == 1 ? 'td-sm' : 'td-md';?> text-middle text-left package' data-module='<?php echo $subsetName;?>' data-package='<?php echo $packageCode;?>' all-privs='<?php echo $package->allCount;?>' select-privs='<?php echo $package->selectCount;?>'>
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
<input type='checkbox' id='allCheckerModule<?php echo $moduleName;?>Package<?php echo $packageID;?>' value='browse' <?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->other);?></label>
<input type='checkbox' id='allCheckerModule<?php echo $subsetName;?>Package<?php echo $packageCode;?>' value='browse' <?php if($package->allCount == $package->selectCount) echo 'checked';?>>
<label class='text-left <?php if($package->selectCount != 0 && $package->allCount != $package->selectCount) echo 'checkbox-indeterminate-block';?>' for='allCheckerPackage<?php echo $packageCode;?>'><?php echo $lang->group->package->$packageCode;?></label>
</div>
</th>
<?php if(isset($lang->$moduleName->menus)):?>
<?php if(isset($lang->$subsetName->menus)):?>
<?php
$menusPrivs = count($lang->$moduleName->menus);
$menusSelect = count(array_intersect(array_keys($lang->$moduleName->menus), array_keys(zget($groupPrivs, $moduleName, array()))));
$menusPrivs = count($lang->$subsetName->menus);
$menusSelect = count(array_intersect(array_keys($lang->$subsetName->menus), array_keys(zget($groupPrivs, $subsetName, array()))));
?>
<td class='menus <?php echo $moduleName;?>' all-privs='<?php echo $menusPrivs;?>' select-privs='<?php echo $menusSelect;?>' data-module='<?php echo $moduleName;?>' data-package='0'>
<td class='menus <?php echo $subsetName;?>' all-privs='<?php echo $menusPrivs;?>' select-privs='<?php echo $menusSelect;?>' data-module='<?php echo $subsetName;?>' data-package='0'>
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
<input type='checkbox' name='<?php echo "actions[$moduleName][]"?>' value='browse' id='<?php echo "actions[$moduleName]browse"?>' <?php if($menusPrivs == $menusSelect) echo 'checked';?>>
<label class='text-left <?php if(!empty($menusSelect) and $menusPrivs != $menusSelect) echo 'checkbox-indeterminate-block';?>' for='actions[<?php echo $moduleName;?>]browse'><?php echo $lang->$moduleName->browse;?></label>
<input type='checkbox' name='<?php echo "actions[$subsetName][]"?>' value='browse' id='<?php echo "actions[$subsetName]browse"?>' <?php if($menusPrivs == $menusSelect) echo 'checked';?>>
<label class='text-left <?php if(!empty($menusSelect) and $menusPrivs != $menusSelect) echo 'checkbox-indeterminate-block';?>' for='actions[<?php echo $subsetName;?>]browse'><?php echo $lang->$subsetName->browse;?></label>
</div>
<a href='javascript:;'><i class='icon icon-plus'></i></a>
<?php echo html::checkbox("actions[$moduleName]", $lang->$moduleName->menus, isset($groupPrivs[$moduleName]) ? $groupPrivs[$moduleName] : array());?>
<?php echo html::checkbox("actions[$subsetName]", $lang->$subsetName->menus, isset($groupPrivs[$subsetName]) ? $groupPrivs[$subsetName] : array());?>
</td>
<?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):?>
<?php if(!empty($lang->$moduleName->menus) and ($priv->method == 'browse' or in_array($priv->method, array_keys($lang->$moduleName->menus)))) continue;?>
<div class="group-item" data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>' data-id='<?php echo zget($priv, 'id', 0);?>'>
<td id='<?php echo $subsetName;?>' class='pv-10px' colspan='<?php echo !empty($lang->$subsetName->menus) ? 1 : 2?>'>
<?php foreach($package->privs as $privCode => $priv):?>
<?php if(!empty($lang->$subsetName->menus) and ($priv->method == 'browse' or in_array($priv->method, array_keys($lang->$subsetName->menus)))) continue;?>
<div class="group-item" data-module='<?php echo $subsetName;?>' data-package='<?php echo $packageCode;?>' data-id='<?php echo $privCode;?>'>
<div class="checkbox-primary">
<?php echo html::checkbox("actions[$priv->module]", array($priv->method => $priv->name), isset($groupPrivs[$priv->module][$priv->method]) ? $priv->method : '', "title='{$priv->name}' id='actions[$priv->module]$priv->method' data-id='$priv->action'");?>
<?php echo html::checkbox("actions[$priv->module]", array($priv->method => $priv->name), isset($groupPrivs[$priv->module][$priv->method]) ? $priv->method : '', "title='{$priv->name}' id='actions[$priv->module]$priv->method' data-id='$privCode'");?>
</div>
</div>
<?php endforeach;?>
@@ -199,7 +190,7 @@
<?php js::set('menu', $menu);?>
<?php js::set('relatedPrivData', json_encode($relatedPrivData));?>
<?php js::set('selectedPrivList', $selectedPrivList);?>
<?php js::set('excludePrivList', $excludePrivList);?>
<?php js::set('allPrivList', $allPrivList);?>
<script>
$(document).ready(function()
{
+6 -6
View File
@@ -27,19 +27,19 @@
<td class='strong'><?php echo $lang->group->common;?></td>
</tr>
<tr class='text-top'>
<td class='w-p30'><?php echo html::select('module', $modulePairs, '', " size='10' onclick='setModulePackages(this.value)' class='form-control'");?></td>
<td class='w-p30'><?php echo html::select('module', $subsets, key($subsets), " size='10' onclick='setModulePackages(this.value)' class='form-control'");?></td>
<td class='w-p30' id='packageBox'>
<?php
$hiddenClass = '';
foreach($packageGroup as $module => $modulePackages)
foreach($packages as $subset => $subsetPackages)
{
echo html::select('packages[]', $modulePackages, '', "onclick='setActions()' multiple='multiple' class='form-control $hiddenClass' data-module='$module'");
echo html::select('packages[]', $subsetPackages, '', "onclick='setActions()' multiple='multiple' class='form-control $hiddenClass' data-module='$subset'");
$hiddenClass = 'hidden';
}
?>
</td>
<td class='w-p30' id='actionBox'>
<?php echo html::select('actions[]', $indexPrivs, '', "multiple='multiple' class='form-control'");?>
<?php echo html::select('actions[]', $privs, '', "multiple='multiple' class='form-control'");?>
</td>
<td><?php echo html::select('groups[]', $groups, '', "multiple='multiple' class='form-control'");?></td>
</tr>
@@ -53,6 +53,6 @@
</table>
</form>
</div>
<?php js::set('selectedPrivIdList', '[]');?>
<?php js::set('selectedPrivList', '[]');?>
<?php js::set('relatedPrivData', '[]');?>
<?php js::set('excludeIdList', '[]');?>
<?php js::set('allPrivList', array_keys($privs));?>
+33 -43
View File
@@ -50,25 +50,25 @@
<div class='btn-toolbar pull-left'>
<span id='groupName'><i class='icon-lock'></i> <?php echo $group->name;?> <i class="icon icon-chevron-right"></i></span>
<?php $params = "type=byPackage&param=$groupID&menu=%s&version=$version";?>
<?php $active = empty($menu) ? 'btn-active-text' : '';?>
<?php $active = empty($nav) ? 'btn-active-text' : '';?>
<?php echo html::a(inlink('managePriv', sprintf($params, '')), "<span class='text'>{$lang->group->all}</span>", '', "class='btn btn-link $active'")?>
<?php
$i = 0;
foreach($lang->mainNav as $module => $title)
foreach($lang->mainNav as $navKey => $title)
{
if(!is_string($title)) continue;
$i++;
if($i == $config->group->maxToolBarCount) echo '<div class="btn-group"><a href="javascript:;" data-toggle="dropdown" class="btn btn-link">' . $lang->group->more . '<span class="caret"></span></a><ul class="dropdown-menu">';
$active = $menu == $module ? 'btn-active-text' : '';
$active = $nav == $navKey ? 'btn-active-text' : '';
if($i >= $config->group->maxToolBarCount) echo '<li>';
echo html::a(inlink('managePriv', sprintf($params, $module)), "<span class='text'>" . strip_tags(substr($title, 0, strpos($title, '|'))) . '</span>', '', "class='btn btn-link $active'");
echo html::a(inlink('managePriv', sprintf($params, $navKey)), "<span class='text'>" . strip_tags(substr($title, 0, strpos($title, '|'))) . '</span>', '', "class='btn btn-link $active'");
if($i >= $config->group->maxToolBarCount) echo '</li>';
}
if($i >= $config->group->maxToolBarCount) echo '</ul></div>';
?>
<?php $active = $menu == 'general' ? 'btn-active-text' : '';?>
<?php $active = $nav == 'general' ? 'btn-active-text' : '';?>
<?php echo html::a(inlink('managePriv', sprintf($params, 'general')), "<span class='text'>{$lang->group->general}</span>", '', "class='btn btn-link $active'");?>
<div class='input-control space w-150px'>
@@ -91,67 +91,57 @@
</tr>
</thead>
<tbody>
<?php foreach($privList as $moduleName => $packages):?>
<?php if(!count((array)$packages)) continue;?>
<?php
$i = 1;
$modulePrivs = count($privList[$moduleName], 1) - count($selectPrivs[$moduleName], 1);
$moduleSelect = array_sum($selectPrivs[$moduleName]);
?>
<?php foreach($subsets as $subsetName => $subset):?>
<?php if($subset->allCount == 0) continue;?>
<tr class='<?php echo cycle('even, bg-gray');?>'>
<th class='text-middle text-left module' data-module='<?php echo $moduleName;?>' all-privs='<?php echo $modulePrivs;?>' select-privs='<?php echo $moduleSelect;?>'>
<th class='text-middle text-left module' data-module='<?php echo $subsetName;?>' all-privs='<?php echo $subset->allCount;?>' select-privs='<?php echo $subset->selectCount;?>'>
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
<input type='checkbox' id='allChecker<?php echo $moduleName;?>' value='1' <?php if(!empty($moduleSelect) and $modulePrivs == $moduleSelect) echo 'checked';?>>
<?php $moduleTitle = $lang->$moduleName->common;?>
<?php if(in_array($moduleName, array('doc', 'api'))) $moduleTitle = $lang->$moduleName->manage;?>
<label class='text-left <?php if(!empty($moduleSelect) and $modulePrivs != $moduleSelect) echo 'checkbox-indeterminate-block';?>' for='allChecker<?php echo $moduleName;?>'><?php echo $moduleTitle;?></label>
<input type='checkbox' id='allChecker<?php echo $subsetName;?>' value='1' <?php if($subset->selectCount && $subset->allCount == $subset->selectCount) echo 'checked';?>>
<?php $subsetTitle = $lang->$subsetName->common;?>
<?php if(in_array($subsetName, array('doc', 'api'))) $subsetTitle = $lang->$subsetName->manage;?>
<label class='text-left <?php if($subset->selectCount && $subset->allCount != $subset->selectCount) echo 'checkbox-indeterminate-block';?>' for='allChecker<?php echo $subsetName;?>'><?php echo $subsetTitle;?></label>
</div>
</th>
<td class='td-sm text-middle text-left package-column' data-module='<?php echo $moduleName;?>'>
<?php foreach($packages as $packageID => $privs):?>
<?php
$packagePrivs = count($privs);
$packageSelect = $selectPrivs[$moduleName][$packageID];
?>
<div class="package" data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>' all-privs='<?php echo $packagePrivs;?>' select-privs='<?php echo $packageSelect;?>'>
<td class='td-sm text-middle text-left package-column' data-module='<?php echo $subsetName;?>'>
<?php foreach($packages[$subsetName] as $packageCode => $package):?>
<div class="package" data-module='<?php echo $subsetName;?>' data-package='<?php echo $packageCode;?>' all-privs='<?php echo $package->allCount;?>' select-privs='<?php echo $package->selectCount;?>'>
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
<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->other);?></label>
<input type='checkbox' id='allCheckerModule<?php echo $subsetName;?>Package<?php echo $packageCode;?>' value='1' <?php if($package->allCount == $package->selectCount) echo 'checked';?>>
<label class='text-left <?php if($package->selectCount && $package->allCount != $package->selectCount) echo 'checkbox-indeterminate-block';?>' for='allCheckerPackage<?php echo $packageCode;?>'><?php echo zget($lang->group->package, $packageCode, $lang->group->other);?></label>
</div>
<i class="priv-toggle icon"></i>
</div>
<div class="privs hidden" data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>'>
<div class="privs hidden" data-module='<?php echo $subsetName;?>' data-package='<?php echo $packageCode;?>'>
<div class="arrow"></div>
<div class='popover-content'>
<?php if(isset($lang->$moduleName->menus)):?>
<?php if(isset($lang->$subsetName->menus)):?>
<?php
$menusPrivs = count($lang->$moduleName->menus);
$menusSelect = count(array_intersect(array_keys($lang->$moduleName->menus), array_keys(zget($groupPrivs, $moduleName, array()))));
$menusPrivs = count($lang->$subsetName->menus);
$menusSelect = count(array_intersect(array_keys($lang->$subsetName->menus), array_keys(zget($groupPrivs, $subsetName, array()))));
?>
<div class="group-item menus-browse" data-id='0' data-module='<?php echo $moduleName;?>' data-package='0'>
<div class="group-item menus-browse" data-id='0' data-module='<?php echo $subsetName;?>' data-package='0'>
<div class="checkbox-primary checkbox-inline checkbox-left check-all">
<input type='checkbox' name='<?php echo "actions[$moduleName][]"?>' value='browse' id='<?php echo "actions[$moduleName]browse"?>' <?php if($menusPrivs == $menusSelect) echo 'checked';?>>
<label class='text-left <?php if(!empty($menusSelect) and $menusPrivs != $menusSelect) echo 'checkbox-indeterminate-block';?>' for='actions[<?php echo $moduleName;?>]browse'><?php echo $lang->$moduleName->browse;?></label>
<input type='checkbox' name='<?php echo "actions[$subsetName][]"?>' value='browse' id='<?php echo "actions[$subsetName]browse"?>' <?php if($menusPrivs == $menusSelect) echo 'checked';?>>
<label class='text-left <?php if(!empty($menusSelect) and $menusPrivs != $menusSelect) echo 'checkbox-indeterminate-block';?>' for='actions[<?php echo $subsetName;?>]browse'><?php echo $lang->$subsetName->browse;?></label>
</div>
<i class="priv-toggle icon"></i>
<div class='menus-privs hidden data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>''>
<div class='menus-privs hidden data-module='<?php echo $subsetName;?>' data-package='<?php echo $packageID;?>''>
<div class="arrow"></div>
<div class='popover-content'>
<?php foreach($lang->$moduleName->menus as $method => $name):?>
<div class="group-item menus-item" data-id='<?php echo "$moduleName-$method";?>' data-module='<?php echo $moduleName;?>' data-package='0'>
<?php echo html::checkbox("actions[$moduleName]", array($method => $name), isset($groupPrivs[$moduleName][$method]) ? $groupPrivs[$moduleName][$method] : '', "title='{$name}' id='actions[$moduleName]$method' data-id='$moduleName-$method'");?>
<?php foreach($lang->$subsetName->menus as $method => $name):?>
<div class="group-item menus-item" data-id='<?php echo "$subsetName-$method";?>' data-module='<?php echo $subsetName;?>' data-package='0'>
<?php echo html::checkbox("actions[$subsetName]", array($method => $name), isset($groupPrivs[$subsetName][$method]) ? $groupPrivs[$subsetName][$method] : '', "title='{$name}' id='actions[$subsetName]$method' data-id='$subsetName-$method'");?>
</div>
<?php endforeach;?>
</div>
</div>
</div>
<?php endif;?>
<?php foreach($privs as $privID => $priv):?>
<?php if(!empty($lang->$moduleName->menus) and ($priv->method == 'browse' or in_array($priv->method, array_keys($lang->$moduleName->menus)))) continue;?>
<div class="group-item" data-id='<?php echo zget($priv, 'id', 0);?>' data-module='<?php echo $moduleName;?>' data-package='<?php echo $packageID;?>'>
<?php foreach($package->privs as $privCode => $priv):?>
<?php if(!empty($lang->$subsetName->menus) and ($priv->method == 'browse' or in_array($priv->method, array_keys($lang->$subsetName->menus)))) continue;?>
<div class="group-item" data-id='<?php echo $privCode;?>' data-module='<?php echo $subsetName;?>' data-package='<?php echo $packageCode;?>'>
<div class="checkbox-primary">
<?php echo html::checkbox("actions[$priv->module]", array($priv->method => $priv->name), isset($groupPrivs[$priv->module][$priv->method]) ? $priv->method : '', "title='{$priv->name}' id='actions[$priv->module]$priv->method' data-id='$priv->action'");?>
<?php echo html::checkbox("actions[$priv->module]", array($priv->method => $priv->name), isset($groupPrivs[$priv->module][$priv->method]) ? $priv->method : '', "title='{$priv->name}' id='actions[$priv->module]$priv->method' data-id='$privCode'");?>
</div>
</div>
<?php endforeach;?>
@@ -209,5 +199,5 @@
<?php js::set('groupID', $groupID);?>
<?php js::set('menu', $menu);?>
<?php js::set('relatedPrivData', json_encode($relatedPrivData));?>
<?php js::set('allPrivList', $allPrivList);?>
<?php js::set('selectedPrivList', $selectedPrivList);?>
<?php js::set('excludePrivList', $excludePrivList);?>