* Finish task #7234.
This commit is contained in:
@@ -6,3 +6,7 @@ ADD `budget` varchar(30) NOT NULL DEFAULT '0' AFTER `program`,
|
||||
ADD `budgetUnit` char(30) NOT NULL DEFAULT 'yuan' AFTER `budget`,
|
||||
ADD `realStarted` date NOT NULL AFTER `end`,
|
||||
ADD `realFinished` date NOT NULL AFTER `realStarted`;
|
||||
|
||||
INSERT INTO `zt_group` (`name`, `role`, `desc`, `acl`, `developer`) VALUES ('项目管理员', 'prgadmin', '项目管理员可以维护项目的权限', NULL, '1');
|
||||
|
||||
ALTER TABLE `zt_usergroup` ADD `program` text NOT NULL;
|
||||
|
||||
@@ -232,6 +232,19 @@ class deptModel extends model
|
||||
return html::a(helper::createLink('group', 'managemember', "groupID=$groupID&deptID={$dept->id}"), $dept->name, '_self', "id='dept{$dept->id}'");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the group manage program admin link.
|
||||
*
|
||||
* @param int $dept
|
||||
* @param int $groupID
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function createManagePgmAdminLink($dept, $groupID)
|
||||
{
|
||||
return html::a(helper::createLink('group', 'managePgmAdmin', "groupID=$groupID&deptID={$dept->id}"), $dept->name, '_self', "id='dept{$dept->id}'");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sons of a department.
|
||||
*
|
||||
|
||||
@@ -260,6 +260,42 @@ class group extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Manage members of a group.
|
||||
*
|
||||
* @param int $groupID
|
||||
* @param int $deptID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function managePgmAdmin($groupID, $deptID = 0)
|
||||
{
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$this->group->updatePgmAdmin($groupID);
|
||||
die(js::locate(inlink('managePgmAdmin', "group=$groupID"), 'parent'));
|
||||
}
|
||||
$group = $this->group->getById($groupID);
|
||||
$groupUsers = $this->group->getUserPairs($groupID);
|
||||
$userPrograms = $this->group->getUserPrograms($groupID);
|
||||
$allUsers = array('' => '') + $groupUsers + $this->loadModel('dept')->getDeptUserPairs($deptID);
|
||||
|
||||
$title = $this->lang->company->common . $this->lang->colon . $group->name . $this->lang->colon . $this->lang->group->manageMember;
|
||||
$position[] = $group->name;
|
||||
$position[] = $this->lang->group->manageMember;
|
||||
|
||||
$this->view->title = $title;
|
||||
$this->view->position = $position;
|
||||
$this->view->allUsers = $allUsers;
|
||||
$this->view->group = $group;
|
||||
$this->view->programs = $this->dao->select('id, name')->from(TABLE_PROJECT)->where('program')->eq(0)->andWhere('deleted')->eq(0)->fetchPairs();
|
||||
$this->view->deptTree = $this->loadModel('dept')->getTreeMenu($rooteDeptID = 0, array('deptModel', 'createManagePgmAdminLink'), $groupID);
|
||||
$this->view->groupUsers = $groupUsers;
|
||||
$this->view->userPrograms = $userPrograms;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a group.
|
||||
*
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#sidebar .cell{margin-top: 40px}
|
||||
@@ -0,0 +1,27 @@
|
||||
function addItem(obj)
|
||||
{
|
||||
var $currentRow = $(obj).closest('tr');
|
||||
var $newRow = $currentRow.clone().addClass('highlight');
|
||||
$currentRow.after($newRow);
|
||||
$newRow.find('th').text('');
|
||||
|
||||
$newRow.find('div[id^=members], div[id^=program]').remove();
|
||||
$newRow.find('select[name^="members"], select[name^="program"]').val('').chosen();
|
||||
setTimeout(function()
|
||||
{
|
||||
$newRow.removeClass('highlight');
|
||||
}, 1600);
|
||||
}
|
||||
|
||||
function deleteItem(obj)
|
||||
{
|
||||
var $currentLine= $(obj).closest('tr');
|
||||
$currentLine.remove();
|
||||
}
|
||||
|
||||
function resetProgramName(obj)
|
||||
{
|
||||
var programSelect = $(obj).closest('tr').find('select[name^="program"]');
|
||||
var newName = 'program[' + $(obj).val() + '][]';
|
||||
programSelect.attr('name', newName);
|
||||
}
|
||||
@@ -21,9 +21,11 @@ $lang->group->managePrivByGroup = 'Manage Privileges by Group';
|
||||
$lang->group->managePrivByModule = 'Manage Privileges by Module';
|
||||
$lang->group->byModuleTips = '<span class="tips">(Press Shift/Ctrl to Multi-select)</span>';
|
||||
$lang->group->manageMember = 'Manage Members';
|
||||
$lang->group->managePgmAdmin = 'Manage Program Admins';
|
||||
$lang->group->confirmDelete = 'Do you want to delete this user group?';
|
||||
$lang->group->successSaved = 'Saved.';
|
||||
$lang->group->errorNotSaved = 'Failed. Please select actions and groups.';
|
||||
$lang->group->program = 'Manage Programs';
|
||||
$lang->group->viewList = 'Access Sight';
|
||||
$lang->group->productList = 'Access Product';
|
||||
$lang->group->projectList = 'Access Project';
|
||||
|
||||
@@ -891,14 +891,15 @@ $lang->dept->methodOrder[25] = 'delete';
|
||||
|
||||
/* Group. */
|
||||
$lang->resource->group = new stdclass();
|
||||
$lang->resource->group->browse = 'browse';
|
||||
$lang->resource->group->create = 'create';
|
||||
$lang->resource->group->edit = 'edit';
|
||||
$lang->resource->group->copy = 'copy';
|
||||
$lang->resource->group->delete = 'delete';
|
||||
$lang->resource->group->manageView = 'manageView';
|
||||
$lang->resource->group->managePriv = 'managePriv';
|
||||
$lang->resource->group->manageMember = 'manageMember';
|
||||
$lang->resource->group->browse = 'browse';
|
||||
$lang->resource->group->create = 'create';
|
||||
$lang->resource->group->edit = 'edit';
|
||||
$lang->resource->group->copy = 'copy';
|
||||
$lang->resource->group->delete = 'delete';
|
||||
$lang->resource->group->manageView = 'manageView';
|
||||
$lang->resource->group->managePriv = 'managePriv';
|
||||
$lang->resource->group->manageMember = 'manageMember';
|
||||
$lang->resource->group->managePgmAdmin = 'managePgmAdmin';
|
||||
|
||||
$lang->group->methodOrder[5] = 'browse';
|
||||
$lang->group->methodOrder[10] = 'create';
|
||||
@@ -907,6 +908,7 @@ $lang->group->methodOrder[20] = 'copy';
|
||||
$lang->group->methodOrder[25] = 'delete';
|
||||
$lang->group->methodOrder[30] = 'managePriv';
|
||||
$lang->group->methodOrder[35] = 'manageMember';
|
||||
$lang->group->methodOrder[40] = 'managePgmAdmin';
|
||||
|
||||
/* User. */
|
||||
$lang->resource->user = new stdclass();
|
||||
|
||||
@@ -21,9 +21,11 @@ $lang->group->managePrivByGroup = '权限维护';
|
||||
$lang->group->managePrivByModule = '按模块分配权限';
|
||||
$lang->group->byModuleTips = '<span class="tips">(可以按住Shift或者Ctrl键进行多选)</span>';
|
||||
$lang->group->manageMember = '成员维护';
|
||||
$lang->group->managePgmAdmin = '维护项目管理员';
|
||||
$lang->group->confirmDelete = '您确定删除该用户分组吗?';
|
||||
$lang->group->successSaved = '成功保存';
|
||||
$lang->group->errorNotSaved = '没有保存,请确认选择了权限数据。';
|
||||
$lang->group->program = '可管理项目';
|
||||
$lang->group->viewList = '可访问视图';
|
||||
$lang->group->productList = '可访问' . $lang->productCommon;
|
||||
$lang->group->projectList = '可访问' . $lang->projectCommon;
|
||||
|
||||
@@ -178,6 +178,24 @@ class groupModel extends model
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user programs of a group.
|
||||
*
|
||||
* @param int $groupID
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getUserPrograms($groupID)
|
||||
{
|
||||
return $this->dao->select('t1.account, t1.program')
|
||||
->from(TABLE_USERGROUP)->alias('t1')
|
||||
->leftJoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account')
|
||||
->where('`group`')->eq((int)$groupID)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->orderBy('account')
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a group.
|
||||
*
|
||||
@@ -354,6 +372,34 @@ class groupModel extends model
|
||||
foreach($changedUsers as $account) $this->user->computeUserView($account, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update program admins.
|
||||
*
|
||||
* @param int $groupID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function updatePgmAdmin($groupID)
|
||||
{
|
||||
$this->dao->delete()->from(TABLE_USERGROUP)->where('`group`')->eq($groupID)->exec();
|
||||
|
||||
$members = $this->post->members ? $this->post->members : array();
|
||||
$programs = $this->post->program ? $this->post->program : array();
|
||||
foreach($members as $id => $account)
|
||||
{
|
||||
if(!$account) continue;
|
||||
$data = new stdclass();
|
||||
$data->group = $groupID;
|
||||
$data->account = $account;
|
||||
$data->program = implode($programs[$account], ',');
|
||||
|
||||
$this->dao->replace(TABLE_USERGROUP)->data($data)->exec();
|
||||
}
|
||||
|
||||
if(!dao::isError()) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort resource.
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<td title='<?php echo $group->desc?>'><?php echo $group->desc;?></td>
|
||||
<td title='<?php echo $users;?>'><?php echo $users;?></td>
|
||||
<td class='c-actions'>
|
||||
<?php if($group->role != 'prgadmin'):?>
|
||||
<?php $lang->group->managepriv = $lang->group->managePrivByGroup;?>
|
||||
<?php common::printIcon('group', 'manageView', "groupID=$group->id", $group, 'list', 'eye');?>
|
||||
<?php common::printIcon('group', 'managepriv', "type=byGroup¶m=$group->id", $group, 'list', 'lock');?>
|
||||
@@ -60,6 +61,15 @@
|
||||
echo "<button class='btn disabled'><i class='icon icon-trash disabled' title='{$lang->group->delete}'></i></button>";
|
||||
}
|
||||
?>
|
||||
<?php else:?>
|
||||
<?php common::printIcon('group', 'manageView', "groupID=$group->id", $group, 'list', 'eye', '', 'disabled');?>
|
||||
<?php common::printIcon('group', 'managepriv', "type=byGroup¶m=$group->id", $group, 'list', 'lock');?>
|
||||
<?php $lang->group->managemember = $lang->group->manageMember;?>
|
||||
<?php common::printIcon('group', 'managePgmAdmin', "groupID=$group->id", $group, 'list', 'persons');?>
|
||||
<?php common::printIcon('group', 'edit', "groupID=$group->id", $group, 'list', '', '', 'disabled');?>
|
||||
<?php common::printIcon('group', 'copy', "groupID=$group->id", $group, 'list', '', '', 'disabled');?>
|
||||
<?php echo "<button class='btn disabled'><i class='icon icon-trash disabled' title='{$lang->group->delete}'></i></button>";?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
/**
|
||||
* The manage member view of group module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package group
|
||||
* @version $Id: managemember.html.php 4627 2013-04-10 05:42:20Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='mainContent' class='main-row fade in'>
|
||||
<div class="side-col" id="sidebar">
|
||||
<div id="sidebarHeader">
|
||||
<div class="title">
|
||||
<span class='label label-id'><?php echo $group->id;?></span>
|
||||
<?php echo $group->name;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class='cell'>
|
||||
<div class='panel panel-sm'>
|
||||
<div class='panel-heading nobr'><strong><?php echo $lang->dept->common;?></strong></div>
|
||||
<?php echo $deptTree;?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main-col">
|
||||
<form class='main-table table-members' method='post' target='hiddenwin'>
|
||||
<table class='table table-form'>
|
||||
<?php if($userPrograms):?>
|
||||
<?php $i = 0;?>
|
||||
<?php foreach($userPrograms as $account => $program):?>
|
||||
<tr>
|
||||
<th class='w-100px'><?php echo $i == 0 ? $lang->group->inside : '';?></th>
|
||||
<td id='group' class='pv-10px'>
|
||||
<div class='group-item'><?php echo html::select('members[]', $allUsers, $account, "class='form-control chosen' onchange=resetProgramName(this)");?></div>
|
||||
</td>
|
||||
<td class='pv-10px' colspan='2'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'> <?php echo $lang->group->program;?></span>
|
||||
<?php echo html::select("program[$account][]", $programs, $program, "class='form-control chosen' multiple");?>
|
||||
</div>
|
||||
</td>
|
||||
<td class='pv-10px'>
|
||||
<button type="button" class="btn btn-link btn-icon btn-add" onclick="addItem(this)"><i class="icon icon-plus"></i></button>
|
||||
<button type="button" class="btn btn-link btn-icon btn-delete" onclick="deleteItem(this)"><i class="icon icon-close"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i ++;?>
|
||||
<?php endforeach;?>
|
||||
<?php else:?>
|
||||
<tr>
|
||||
<th class='w-100px' rowspan='1'><?php echo $lang->group->inside;?></th>
|
||||
<td id='group' class='pv-10px'>
|
||||
<div class='group-item'><?php echo html::select('members[]', $allUsers, '', "class='form-control chosen' onchange=resetProgramName(this)");?></div>
|
||||
</td>
|
||||
<td class='pv-10px' colspan='2'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'> <?php echo $lang->group->program;?></span>
|
||||
<?php echo html::select('program[0][]', $programs, '', "class='form-control chosen' multiple");?>
|
||||
</div>
|
||||
</td>
|
||||
<td class='pv-10px'>
|
||||
<button type="button" class="btn btn-link btn-icon btn-add" onclick="addItem(this)"><i class="icon icon-plus"></i></button>
|
||||
<button type="button" class="btn btn-link btn-icon btn-delete" onclick="deleteItem(this)"><i class="icon icon-close"></i></button>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<td class='text-center form-actions' colspan='5'>
|
||||
<?php
|
||||
echo html::submitButton('', '', "btn btn-primary");
|
||||
echo html::linkButton($lang->goback, $this->createLink('group', 'browse'));
|
||||
echo html::hidden('foo'); // Just a var, to make sure $_POST is not empty.
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
Reference in New Issue
Block a user