diff --git a/module/dept/model.php b/module/dept/model.php index 6cd1ba90c5..3dc625517c 100644 --- a/module/dept/model.php +++ b/module/dept/model.php @@ -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}"); } /** diff --git a/module/group/config.php b/module/group/config.php index a3397125a6..c08de977cf 100644 --- a/module/group/config.php +++ b/module/group/config.php @@ -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; diff --git a/module/group/control.php b/module/group/control.php index bdccdcf976..638dd93822 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -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(); diff --git a/module/group/css/manageprojectadmin.ui.css b/module/group/css/manageprojectadmin.ui.css new file mode 100644 index 0000000000..8e3415988c --- /dev/null +++ b/module/group/css/manageprojectadmin.ui.css @@ -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} diff --git a/module/group/js/manageprojectadmin.ui.js b/module/group/js/manageprojectadmin.ui.js new file mode 100644 index 0000000000..0fd743f740 --- /dev/null +++ b/module/group/js/manageprojectadmin.ui.js @@ -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(`
`); + $(this).closest('td').find('div[data-zui-picker]').remove(); + + }); + + /* Append btn-delete. */ + $newRow.find('.btn-group .btn').length == 1 ? $newRow.find('.btn-group').append('') : ''; + $(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}); + } +} diff --git a/module/group/model.php b/module/group/model.php index f845832b60..cb9be02028 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -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) diff --git a/module/group/ui/manageprojectadmin.html.php b/module/group/ui/manageprojectadmin.html.php new file mode 100644 index 0000000000..4c972afbbc --- /dev/null +++ b/module/group/ui/manageprojectadmin.html.php @@ -0,0 +1,413 @@ + + * @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 + ) + ) +);