* Finish task #99082.
This commit is contained in:
@@ -240,7 +240,7 @@ class deptModel extends model
|
||||
*/
|
||||
public function createManageProjectAdminLink($dept, $groupID)
|
||||
{
|
||||
return html::a(helper::createLink('group', 'manageProjectAdmin', "groupID=$groupID&deptID={$dept->id}"), $dept->name, '_self', "id='dept{$dept->id}'");
|
||||
return helper::createLink('group', 'manageProjectAdmin', "groupID=$groupID&deptID={$dept->id}");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -58,7 +58,6 @@ $config->group->actionList['manageProjectAdmin']['icon'] = 'persons';
|
||||
$config->group->actionList['manageProjectAdmin']['text'] = $lang->group->manageProjectAdmin;
|
||||
$config->group->actionList['manageProjectAdmin']['hint'] = $lang->group->manageProjectAdmin;
|
||||
$config->group->actionList['manageProjectAdmin']['url'] = helper::createLink('group', 'manageProjectAdmin', 'groupID={id}');
|
||||
$config->group->actionList['manageProjectAdmin']['data-toggle'] = 'modal';
|
||||
|
||||
$config->group->actionList['manageMember']['icon'] = 'persons';
|
||||
$config->group->actionList['manageMember']['text'] = $lang->group->manageMember;
|
||||
|
||||
@@ -424,7 +424,7 @@ class group extends control
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$this->group->updateProjectAdmin($groupID);
|
||||
return print(js::locate(inlink('manageProjectAdmin', "group=$groupID"), 'parent'));
|
||||
return print($this->sendSuccess(array('load' => true)));
|
||||
}
|
||||
|
||||
list($programs, $projects, $products, $executions) = $this->group->getObject4AdminGroup();
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
.text-center th {text-align: center;}
|
||||
.text-center div {justify-content: center;}
|
||||
.projectTd .input-group-addon, .productTd .input-group-addon, .executionTd .input-group-addon {padding: 0px 14px}
|
||||
@@ -0,0 +1,87 @@
|
||||
function addItem(e)
|
||||
{
|
||||
let maxNum = 0;
|
||||
$(e.target).closest('table').find("tr[class^='line']").each(function()
|
||||
{
|
||||
let trname = $(this).attr('class');
|
||||
let index = trname.match(/\d+/g);
|
||||
|
||||
index = parseInt(index);
|
||||
maxNum = index > maxNum ? index : maxNum;
|
||||
})
|
||||
|
||||
maxNum = parseInt(maxNum);
|
||||
maxNum += 1;
|
||||
|
||||
let className = $(e.target).closest('tr').attr('class');
|
||||
let lastTr = $('table tr.' + className).last();
|
||||
$($('table tr.' + className).get().reverse()).each(function()
|
||||
{
|
||||
let $newRow = $(this).clone();
|
||||
$newRow.attr('class', className.replace(/\d+/g, maxNum));
|
||||
|
||||
$newRow.find("input[type='checkbox']").each(function()
|
||||
{
|
||||
let name = $(this).attr('name');
|
||||
let id = $(this).attr('id');
|
||||
$(this).prop('name', name.replace(/\d+/g, maxNum));
|
||||
$(this).prop('id', id.replace(/\d+/g, maxNum));
|
||||
$(this).prop('checked', false);
|
||||
})
|
||||
|
||||
let optionArr = [];
|
||||
$newRow.find('select').each(function()
|
||||
{
|
||||
let name = $(this).attr('name');
|
||||
let options = zui.Picker.query(`[name='${name}']`).options;
|
||||
|
||||
let newName = name.replace(/\d+/g, maxNum);
|
||||
let newID = newName.replace(/\[|\]/g, '');
|
||||
|
||||
options.name = newName;
|
||||
options.defaultValue = '';
|
||||
|
||||
optionArr[newID] = options;
|
||||
|
||||
$(this).closest('td').find('div[data-zui-picker]').parent().append(`<div id='${newID}' style='width: 100%'></div>`);
|
||||
$(this).closest('td').find('div[data-zui-picker]').remove();
|
||||
|
||||
});
|
||||
|
||||
/* Append btn-delete. */
|
||||
$newRow.find('.btn-group .btn').length == 1 ? $newRow.find('.btn-group').append('<button class="btn ghost btn-delete square" type="button"><i class="icon icon-trash"></i></button>') : '';
|
||||
$(lastTr).after($newRow);
|
||||
|
||||
for(let key in optionArr)
|
||||
{
|
||||
let options = optionArr[key];
|
||||
let newID = key;
|
||||
|
||||
new zui.Picker(`#${newID}`, options);
|
||||
$(`#${newID}`).zui('picker').render({disabled: false});
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function deleteItem(e)
|
||||
{
|
||||
let currentClass = $(e.target).closest('tr').attr('class');
|
||||
$(e.target).closest('table').find('tr.' + currentClass).remove();
|
||||
}
|
||||
|
||||
function toggleDisabled(e)
|
||||
{
|
||||
let name = e.target.name;
|
||||
let checked = e.target.checked;
|
||||
|
||||
let $picker = $(e.target).closest('tr').find('.input-group select').zui('picker');
|
||||
|
||||
if(checked)
|
||||
{
|
||||
$picker.render({disabled: true});
|
||||
}
|
||||
else
|
||||
{
|
||||
$picker.render({disabled: false});
|
||||
}
|
||||
}
|
||||
@@ -703,7 +703,7 @@ class groupModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
if($executionAll[$lineID] or $projectAll[$lineID]) $products[$lineID] = array_merge($products[$lineID], $shadowProductIDList);
|
||||
if(isset($executionAll[$lineID]) or isset($projectAll[$lineID])) $products[$lineID] = array_merge($products[$lineID], $shadowProductIDList);
|
||||
|
||||
if(empty($accounts)) continue;
|
||||
foreach($accounts as $account)
|
||||
|
||||
@@ -0,0 +1,413 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* The manage project admin view file of group module of ZenTaoPMS.
|
||||
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
|
||||
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Sun Guangming<sunguangming@easycorp.ltd>
|
||||
* @package group
|
||||
* @link https://www.zentao.net
|
||||
*/
|
||||
namespace zin;
|
||||
|
||||
sidebar
|
||||
(
|
||||
moduleMenu(set(array(
|
||||
'modules' => $deptTree,
|
||||
'activeKey' => $deptID,
|
||||
'closeLink' => $this->createLink('group', 'manageProjectAdmin', "groupID={$groupID}"),
|
||||
'showDisplay' => false,
|
||||
)))
|
||||
);
|
||||
|
||||
$tbody = array();
|
||||
$hiddenProgram = in_array($config->systemMode, array('ALM', 'PLM')) ? '' : 'hidden';
|
||||
$rowspan = in_array($config->systemMode, array('ALM', 'PLM')) ? 4 : 3;
|
||||
|
||||
if($projectAdmins)
|
||||
{
|
||||
$i = 1;
|
||||
foreach($projectAdmins as $account => $group)
|
||||
{
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass("line{$group->group}"),
|
||||
h::td
|
||||
(
|
||||
set::rowspan($rowspan),
|
||||
picker
|
||||
(
|
||||
set::name("members[$group->group][]"),
|
||||
set::items($allUsers),
|
||||
set::value($account),
|
||||
set::multiple(true),
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass($hiddenProgram),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProgram,
|
||||
picker
|
||||
(
|
||||
set::disabled($group->programs == 'all'),
|
||||
set::name("program[$group->group][]"),
|
||||
set::items($programs),
|
||||
set::value($group->programs == 'all' ? '' : $group->programs),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass("$hiddenProgram text-center"),
|
||||
checkbox
|
||||
(
|
||||
set::name("programAll[$group->group]"),
|
||||
set::items(array(1 => '')),
|
||||
set::checked($group->programs == 'all'),
|
||||
)
|
||||
),
|
||||
$hiddenProgram ? h::td
|
||||
(
|
||||
setClass('projectTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProject,
|
||||
picker
|
||||
(
|
||||
set::disabled($group->projects == 'all'),
|
||||
set::name("project[$group->group][]"),
|
||||
set::items($projects),
|
||||
set::checked($group->projects == 'all'),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
) : null,
|
||||
$hiddenProgram ? h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name("projectAll[$group->group]"),
|
||||
set::items(array(1 => '')),
|
||||
set::checked($group->projects == 'all'),
|
||||
)
|
||||
) : null,
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
set::rowspan($rowspan),
|
||||
btnGroup
|
||||
(
|
||||
$i > 1 ? set::items
|
||||
(
|
||||
array
|
||||
(
|
||||
array('icon' => 'plus', 'class' => 'btn ghost btn-add'),
|
||||
array('icon' => 'trash', 'class' => 'btn ghost btn-delete')
|
||||
)
|
||||
)
|
||||
:
|
||||
set::items(array(array('icon' => 'plus', 'class' => 'btn ghost btn-add'))),
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
if(empty($hiddenProgram))
|
||||
{
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass("line{$group->group}"),
|
||||
h::td
|
||||
(
|
||||
setClass('projectTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProject,
|
||||
picker
|
||||
(
|
||||
set::disabled($group->projects == 'all'),
|
||||
set::name("project[$group->group][]"),
|
||||
set::value($group->projects == 'all' ? '' : $group->projects),
|
||||
set::items($projects),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name("projectAll[$group->group]"),
|
||||
set::items(array(1 => '')),
|
||||
set::checked($group->projects == 'all'),
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass("line{$group->group}"),
|
||||
h::td
|
||||
(
|
||||
setClass('productTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProduct,
|
||||
picker
|
||||
(
|
||||
set::disabled($group->products == 'all'),
|
||||
set::name("product[$group->group][]"),
|
||||
set::items($products),
|
||||
set::value($group->products == 'all' ? '' : $group->products),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name("productAll[$group->group]"),
|
||||
set::items(array(1 => '')),
|
||||
set::checked($group->products == 'all'),
|
||||
)
|
||||
),
|
||||
);
|
||||
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass("line{$group->group}"),
|
||||
h::td
|
||||
(
|
||||
setClass('executionTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageExecution,
|
||||
picker
|
||||
(
|
||||
set::disabled($group->executions == 'all'),
|
||||
set::name("execution[$group->group][]"),
|
||||
set::value($group->executions == 'all' ? '' : $group->executions),
|
||||
set::items($executions),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name("executionAll[$group->group]]"),
|
||||
set::items(array(1 => '')),
|
||||
set::checked($group->executions == 'all'),
|
||||
)
|
||||
),
|
||||
);
|
||||
|
||||
$i ++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass('line1'),
|
||||
h::td
|
||||
(
|
||||
set::rowspan($rowspan),
|
||||
picker
|
||||
(
|
||||
set::name('members[1][]'),
|
||||
set::items($allUsers),
|
||||
set::multiple(true),
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass($hiddenProgram),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProgram,
|
||||
picker
|
||||
(
|
||||
set::name('program[1][]'),
|
||||
set::items($programs),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass("$hiddenProgram text-center"),
|
||||
checkbox
|
||||
(
|
||||
set::name('programAll[1]'),
|
||||
set::items(array(1 => '')),
|
||||
)
|
||||
),
|
||||
$hiddenProgram ? h::td
|
||||
(
|
||||
setClass('projectTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProject,
|
||||
picker
|
||||
(
|
||||
set::name('project[1][]'),
|
||||
set::items($projects),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
) : null,
|
||||
$hiddenProgram ? h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name('projectAll[1]'),
|
||||
set::items(array(1 => '')),
|
||||
)
|
||||
) : null,
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
set::rowspan($rowspan),
|
||||
btnGroup
|
||||
(
|
||||
set::items(array(array('icon' => 'plus', 'class' => 'btn ghost btn-add')))
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
if(empty($hiddenProgram))
|
||||
{
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass('line1'),
|
||||
h::td
|
||||
(
|
||||
setClass('projectTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProject,
|
||||
picker
|
||||
(
|
||||
set::name('project[1][]'),
|
||||
set::items($projects),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name('projectAll[1]'),
|
||||
set::items(array(1 => '')),
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass('line1'),
|
||||
h::td
|
||||
(
|
||||
setClass('productTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageProduct,
|
||||
picker
|
||||
(
|
||||
set::name('product[1][]'),
|
||||
set::items($products),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name('productAll[1]'),
|
||||
set::items(array(1 => '')),
|
||||
)
|
||||
),
|
||||
);
|
||||
|
||||
$tbody[] = h::tr
|
||||
(
|
||||
setClass('line1'),
|
||||
h::td
|
||||
(
|
||||
setClass('executionTd'),
|
||||
inputGroup
|
||||
(
|
||||
$lang->group->manageExecution,
|
||||
picker
|
||||
(
|
||||
set::name('execution[1][]'),
|
||||
set::items($executions),
|
||||
set::multiple(true),
|
||||
)
|
||||
)
|
||||
),
|
||||
h::td
|
||||
(
|
||||
setClass('text-center'),
|
||||
checkbox
|
||||
(
|
||||
set::name('executionAll[1]'),
|
||||
set::items(array(1 => '')),
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
panel
|
||||
(
|
||||
form
|
||||
(
|
||||
on::click('.btn-add', 'addItem'),
|
||||
on::click('.btn-delete', 'deleteItem'),
|
||||
on::change('[name^=programAll]', 'toggleDisabled'),
|
||||
on::change('[name^=productAll]', 'toggleDisabled'),
|
||||
on::change('[name^=projectAll]', 'toggleDisabled'),
|
||||
on::change('[name^=executionAll]', 'toggleDisabled'),
|
||||
h::table
|
||||
(
|
||||
setClass('table condensed bordered'),
|
||||
h::tr
|
||||
(
|
||||
setClass('text-center'),
|
||||
h::th
|
||||
(
|
||||
width('220px'),
|
||||
$lang->group->inside
|
||||
),
|
||||
h::th($lang->group->object),
|
||||
h::th
|
||||
(
|
||||
width('100px'),
|
||||
$lang->group->allCheck
|
||||
),
|
||||
h::th
|
||||
(
|
||||
width('120px'),
|
||||
$lang->actions
|
||||
),
|
||||
),
|
||||
$tbody
|
||||
)
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user