* Finish task #45817.

This commit is contained in:
tianshujie
2021-12-09 15:19:37 +08:00
parent 12ce541d9e
commit a3e9d350eb
10 changed files with 315 additions and 30 deletions
+6
View File
@@ -8,16 +8,22 @@ $config->kanban->require->createregion = 'name';
$config->kanban->setwip = new stdclass();
$config->kanban->setlane = new stdclass();
$config->kanban->setlaneColumn = new stdclass();
$config->kanban->create = new stdclass();
$config->kanban->edit = new stdclass();
$config->kanban->createspace = new stdclass();
$config->kanban->editspace = new stdclass();
$config->kanban->setwip->requiredFields = 'limit';
$config->kanban->setlane->requiredFields = 'name,type';
$config->kanban->setlaneColumn->requiredFields = 'name';
$config->kanban->create->requiredFields = 'space,name';
$config->kanban->edit->requiredFields = 'space,name';
$config->kanban->createspace->requiredFields = 'name,owner';
$config->kanban->editspace->requiredFields = 'name,owner';
$config->kanban->editor = new stdclass();
$config->kanban->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
$config->kanban->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
$config->kanban->editor->createspace = array('id' => 'desc', 'tools' => 'simpleTools');
$config->kanban->editor->editspace = array('id' => 'desc', 'tools' => 'simpleTools');
+33 -2
View File
@@ -23,11 +23,16 @@ class kanban extends control
*/
public function space($browseType = 'my', $recTotal = 0, $recPerPage = 15, $pageID = 1)
{
$spaces = $this->kanban->getSpaces($browseType);
/* Load pager. */
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$recTotal = count($spaces);
$pager = new pager($recTotal, $recPerPage, $pageID);
$spaces = array_chunk($spaces, $pager->recPerPage);
$this->view->title = $this->lang->kanban->common;
$this->view->title = $this->lang->kanbanspace->common;
$this->view->spaces = empty($spaces) ? $spaces : $spaces[$pageID - 1];
$this->view->browseType = $browseType;
$this->view->pager = $pager;
@@ -84,6 +89,32 @@ class kanban extends control
$this->display();
}
/**
* Create a kanban.
*
* @param int $spaceID
* @access public
* @return void
*/
public function create($spaceID = 0)
{
if(!empty($_POST))
{
$kanbanID = $this->kanban->create();
if(dao::isError()) die(js::error(dao::getError()));
$this->loadModel('action')->create('kanban', $kanbanID, 'created');
die(js::reload('parent.parent'));
}
$this->view->users = $this->loadModel('user')->getPairs('noletter|noclosed');
$this->view->spaceID = $spaceID;
$this->view->spacePairs = array('' => '') + $this->kanban->getSpacePairs();
$this->display();
}
/**
* Set WIP.
*
+5
View File
@@ -0,0 +1,5 @@
#spaces {margin: 0 0; margin-bottom: 15px;}
#spaces .spaceTitle {margin-bottom: 15px;}
#spaces .spaceActions {margin-top: 10px;}
#spaces .spaceActions > a{margin-left: 10px;}
.table-footer .pager>li.disabled>a.pager-item {bottom: -3px;}
+29 -8
View File
@@ -1,6 +1,5 @@
<?php
/* Actions. */
$lang->kanban->space = 'Kanban Space';
$lang->kanban->create = 'Create Kanban';
$lang->kanban->createSpace = 'Create Space';
$lang->kanban->editSpace = 'Edit Space';
@@ -26,6 +25,18 @@ $lang->kanban->createCard = 'Create Card';
$lang->kanban->editCard = 'Edit Card';
$lang->kanban->viewCard = 'View Card';
$lang->kanban->sortCard = 'Sort Card';
$lang->kanban->setting = 'Setting';
/* Fields. */
$lang->kanban->space = 'Space';
$lang->kanban->name = 'Name';
$lang->kanban->owner = 'Owner';
$lang->kanban->team = 'Team';
$lang->kanban->desc = 'Description';
$lang->kanban->acl = 'ACL';
$lang->kanban->aclList['open'] = '继承空间访问权限(能访问当前空间,即可访问)';
$lang->kanban->aclList['private'] = '私有(看板团队成员、可访问)';
$lang->kanban->type = array();
$lang->kanban->type['all'] = "All KanBan";
@@ -87,6 +98,8 @@ $lang->kanban->error->mustBeInt = 'The WIPs must be positive integer.';
$lang->kanban->error->parentLimitNote = 'The WIPs in the parent column cannot be < the sum of the WIPs in the child column.';
$lang->kanban->error->childLimitNote = 'The sum of products in the child column cannot be > the number of products in the parent column.';
$lang->kanban->defaultColumn = array('wait', 'doing', 'done', 'close');
$this->lang->kanban->laneTypeList = array();
$this->lang->kanban->laneTypeList['story'] = $lang->SRCommon;
$this->lang->kanban->laneTypeList['bug'] = 'Bug';
@@ -126,14 +139,17 @@ $lang->kanban->taskColumn['canceled'] = 'Canceled';
$lang->kanban->taskColumn['closed'] = 'Closed';
$lang->kanbanspace = new stdclass();
$lang->kanbanspace->name = 'Name';
$lang->kanbanspace->owner = 'Owner';
$lang->kanbanspace->team = 'Team';
$lang->kanbanspace->desc = 'Description';
$lang->kanbanspace->acl = 'ACL';
$lang->kanbanspace->common = 'Kanban Space';
$lang->kanbanspace->name = 'Name';
$lang->kanbanspace->owner = 'Owner';
$lang->kanbanspace->team = 'Team';
$lang->kanbanspace->desc = 'Description';
$lang->kanbanspace->acl = 'ACL';
$lang->kanbanspace->empty = 'No Space';
$lang->kanbanspace->aclList['open'] = 'Open (Accessible with kanban view permissions)';
$lang->kanbanspace->aclList['private'] = 'Private (For the kanban owner and team members only)';
$lang->kanbanspace->aclList['private'] = 'Private (For the kanban owner team and whitelist members only)';
$lang->kanbanspace->featureBar['all'] = 'All';
$lang->kanbanspace->featureBar['my'] = 'My';
@@ -145,4 +161,9 @@ $lang->kanbancolumn->name = $lang->kanban->columnName;
$lang->kanbancolumn->limit = $lang->kanban->WIPCount;
$lang->kanbanlane = new stdclass();
$lang->kanbanlane->name = $lang->kanban->laneName;
$lang->kanbanlane->name = $lang->kanban->laneName;
$lang->kanbanlane->default = 'Default Lane';
$lang->kanbanregion = new stdclass();
$lang->kanbanregion->name = 'Kanban Region';
$lang->kanbanregion->default = 'Default Region';
+23 -9
View File
@@ -1,6 +1,5 @@
<?php
/* Actions. */
$lang->kanban->space = '看板空间';
$lang->kanban->create = '创建看板';
$lang->kanban->createSpace = '创建空间';
$lang->kanban->editSpace = '设置空间';
@@ -26,6 +25,18 @@ $lang->kanban->createCard = '创建卡片';
$lang->kanban->editCard = '编辑卡片';
$lang->kanban->viewCard = '查看卡片';
$lang->kanban->sortCard = '卡片排序';
$lang->kanban->setting = '设置';
/* Fields. */
$lang->kanban->space = '所属空间';
$lang->kanban->name = '看板名称';
$lang->kanban->owner = '负责人';
$lang->kanban->team = '团队';
$lang->kanban->desc = '空间描述';
$lang->kanban->acl = '访问控制';
$lang->kanban->aclList['open'] = '继承空间访问权限(能访问当前空间,即可访问)';
$lang->kanban->aclList['private'] = '私有(看板团队成员、空间负责人、白名单可访问)';
$lang->kanban->type = array();
$lang->kanban->type['all'] = "综合看板";
@@ -87,6 +98,8 @@ $lang->kanban->error->mustBeInt = '在制品数量必须是正整数。';
$lang->kanban->error->parentLimitNote = '父列的在制品数量不能小于子列在制品数量之和';
$lang->kanban->error->childLimitNote = '子列在制品数量之和不能大于父列的在制品数量';
$lang->kanban->defaultColumn = array('未开始', '进行中', '已完成', '已关闭');
$this->lang->kanban->laneTypeList = array();
$this->lang->kanban->laneTypeList['story'] = $lang->SRCommon;
$this->lang->kanban->laneTypeList['bug'] = 'Bug';
@@ -126,22 +139,23 @@ $lang->kanban->taskColumn['canceled'] = '已取消';
$lang->kanban->taskColumn['closed'] = '已关闭';
$lang->kanbanspace = new stdclass();
$lang->kanbanspace->name = '空间名称';
$lang->kanbanspace->owner = '负责人';
$lang->kanbanspace->team = '团队';
$lang->kanbanspace->desc = '空间描述';
$lang->kanbanspace->acl = '访问控制';
$lang->kanbanspace->common = '看板空间';
$lang->kanbanspace->name = '空间名称';
$lang->kanbanspace->owner = '负责人';
$lang->kanbanspace->team = '团队';
$lang->kanbanspace->desc = '空间描述';
$lang->kanbanspace->acl = '访问控制';
$lang->kanbanspace->empty = '暂时没有空间';
$lang->kanbanspace->aclList['open'] = '公开(有看板空间视图权限即可访问)';
$lang->kanbanspace->aclList['private'] = '私有(只有看板空间负责人、团队成员可访问)';
$lang->kanbanspace->aclList['private'] = '私有(只有看板空间负责人、团队成员、白名单可访问)';
$lang->kanbanspace->featureBar['all'] = '所有';
$lang->kanbanspace->featureBar['my'] = '我的空间';
$lang->kanbanspace->featureBar['other'] = '其他空间';
$lang->kanbanspace->featureBar['closed'] = '已关闭';
$lang->kanban->defaultColumn = array('未开始', '进行中', '已完成', '已关闭');
$lang->kanbancolumn = new stdclass();
$lang->kanbancolumn->name = $lang->kanban->columnName;
$lang->kanbancolumn->limit = $lang->kanban->WIPCount;
+124 -9
View File
@@ -340,32 +340,114 @@ class kanbanModel extends model
}
/**
* Create a space.
* Get spaces.
*
* @param string $browseType all|my|other|closed
* @access public
* @return array
*/
public function getSpaces($browseType)
{
$account = $this->app->user->account;
$spaces = $this->dao->select('*')->from(TABLE_KANBANSPACE)
->where('deleted')->eq(0)
->beginIF($browseType == 'my')->andWhere('owner')->eq($account)->fi()
->beginIF($browseType == 'other')->andWhere('owner')->ne($account)->fi()
->beginIF($browseType == 'closed')->andWhere('status')->eq('closed')->fi()
->orderBy('id_desc')
->fetchAll('id');
$spaces = $this->getCanViewObjects('space', $spaces);
return $spaces;
}
/**
* Get space pairs.
*
* @param string $browseType all|my|other|closed
* @access public
* @return array
*/
public function getSpacePairs($browseType = 'all')
{
$spaces = $this->getSpaces($browseType);
$spacePairs = $this->getCanViewObjects('space', $spaces, 'pairs');
return $spacePairs;
}
/**
* Get can view objects.
*
* @param string $objectType space|kanban
* @param array $objects
* @param string $returnType object|pairs
* @access public
* @return array
*/
public function getCanViewObjects($objectType, $objects, $returnType = 'object')
{
if($this->app->user->admin and $returnType == 'object') return $objects;
$account = $this->app->user->account;
$objectPairs = array();
foreach($objects as $objectID => $object)
{
if(($this->app->user->admin or $object->acl == 'open') and $returnType == 'pairs')
{
$objectPairs[$objectID] = $object->name;
}
elseif($object->acl == 'private')
{
$aclUsers = $object->owner . $object->team . $object->whitelist;
if(strpos(",$aclUsers,", ",$account,") === false)
{
unset($objects[$objectID]);
}
elseif($returnType == 'pairs')
{
$objectPairs[$objectID] = $object->name;
}
}
}
if($returnType == 'pairs') return $objectPairs;
return $objects;
}
/**
* Create a kanban.
*
* @access public
* @return int
*/
public function createSpace()
public function create()
{
$space = fixer::input('post')
->setDefault('createdBy', $this->app->user->account)
$account = $this->app->user->account;
$kanban = fixer::input('post')
->setDefault('createdBy', $account)
->setDefault('createdDate', helper::now())
->join('whitelist', ',')
->join('team', ',')
->remove('uid,contactListMenu')
->get();
$this->dao->insert(TABLE_KANBANSPACE)->data($space)
if(strpos(",{$kanban->team},", ",$account,") === false and $kanban->owner != $account) $kanban->team .= ",$account";
$this->dao->insert(TABLE_KANBAN)->data($kanban)
->autoCheck()
->batchCheck($this->config->kanban->createspace->requiredFields, 'notempty')
->batchCheck($this->config->kanban->create->requiredFields, 'notempty')
->exec();
if(!dao::isError())
{
$spaceID = $this->dao->lastInsertID();
$this->saveOrder(0, '', $spaceID, 'space', '', $spaceID);
$kanbanID = $this->dao->lastInsertID();
return $spaceID;
$this->saveOrder(0, '', $kanbanID, 'kanban', '', $kanbanID);
$this->initKanban($kanbanID);
return $kanbanID;
}
}
@@ -397,6 +479,39 @@ class kanbanModel extends model
if(!dao::isError()) return common::createChanges($oldSpace, $space);
}
/**
* Create a space.
*
* @access public
* @return int
*/
public function createSpace()
{
$account = $this->app->user->account;
$space = fixer::input('post')
->setDefault('createdBy', $this->app->user->account)
->setDefault('createdDate', helper::now())
->join('whitelist', ',')
->join('team', ',')
->remove('uid,contactListMenu')
->get();
if(strpos(",{$space->team},", ",$account,") === false and $space->owner != $account) $space->team .= ",$account";
$this->dao->insert(TABLE_KANBANSPACE)->data($space)
->autoCheck()
->batchCheck($this->config->kanban->createspace->requiredFields, 'notempty')
->exec();
if(!dao::isError())
{
$spaceID = $this->dao->lastInsertID();
$this->saveOrder(0, '', $spaceID, 'space', '', $spaceID);
return $spaceID;
}
}
/**
* Add execution Kanban lanes and columns.
*
+64
View File
@@ -0,0 +1,64 @@
<?php
/**
* The create file of kanban module of ZenTaoPMS.
*
* @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Shujie Tian <tianshujie@easycorp.ltd>
* @package kanban
* @version $Id: create.html.php 935 2021-12-09 13:48:24Z $
* @link https://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/kindeditor.html.php';?>
<div id='mainContent' class='main-content'>
<div class='main-header'>
<h2><?php echo $lang->kanban->create;?></h2>
</div>
<form class='form-indicator main-form' method='post' target='hiddenwin' id='dataform'>
<table class='table table-form'>
<tr>
<th><?php echo $lang->kanban->space;?></th>
<td><?php echo html::select('space', $spacePairs, $spaceID, "class='form-control chosen'");?></td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->kanban->name;?></th>
<td><?php echo html::input('name', '', "class='form-control'");?></td>
</tr>
<tr>
<th><?php echo $lang->kanban->owner;?></th>
<td><?php echo html::select('owner', $users, '', "class='form-control chosen'");?></td>
</tr>
<tr>
<th><?php echo $lang->kanban->team;?></th>
<td colspan='2'>
<div class="input-group">
<?php echo html::select('team[]', $users, '', "class='form-control chosen' multiple");?>
<?php echo $this->fetch('my', 'buildContactLists');?>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->kanban->desc;?></th>
<td colspan='2'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=kanban&link=desc');?>
<?php echo html::textarea('desc', '', "rows='10' class='form-control'");?>
</td>
</tr>
<tr>
<th><?php echo $lang->kanban->acl;?></th>
<td colspan='2'><?php echo nl2br(html::radio('acl', $lang->kanban->aclList, 'private', "onclick='setWhite(this.value);'", 'block'));?></td>
</tr>
<tr id="whitelistBox">
<th><?php echo $lang->whitelist;?></th>
<td><?php echo html::select('whitelist[]', $users, '', 'class="form-control chosen" multiple');?></td>
</tr>
<tr>
<td colspan='3' class='text-center form-actions'><?php echo html::submitButton();?></td>
</tr>
</table>
</form>
</div>
<?php include '../../common/view/footer.html.php';?>
+1 -1
View File
@@ -39,7 +39,7 @@
<tr>
<th><?php echo $lang->kanbanspace->desc;?></th>
<td colspan='2'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=space&link=desc');?>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=kanbanSpace&link=desc');?>
<?php echo html::textarea('desc', '', "rows='10' class='form-control'");?>
</td>
</tr>
+1 -1
View File
@@ -39,7 +39,7 @@
<tr>
<th><?php echo $lang->kanbanspace->desc;?></th>
<td colspan='2'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=space&link=desc');?>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=kanbanSpace&link=desc');?>
<?php echo html::textarea('desc', $space->desc, "rows='10' class='form-control'");?>
</td>
</tr>
+29
View File
@@ -25,4 +25,33 @@
<?php common::printLink('kanban', 'createSpace', '', '<i class="icon icon-plus"></i> ' . $lang->kanban->createSpace, '', 'class="btn btn-primary iframe"', '', true);?>
</div>
</div>
<div id='mainContent'>
<?php if(empty($spaces)):?>
<div class="table-empty-tip">
<p><span class="text-muted"><?php echo $lang->kanbanspace->empty;?></span></p>
</div>
<?php else:?>
<?php foreach($spaces as $space):?>
<div class='row cell' id='spaces'>
<div class='space'>
<div class='spaceTitle pull-left'>
<h4>
<?php echo $space->name;?>
<?php echo isset($space->kanbans) ? count($space->kanbans) : '';?>
</h4>
</div>
<div class='spaceActions pull-right'>
<?php common::printLink('kanban', 'create', "spaceID={$space->id}", '<i class="icon icon-plus"></i> ' . $lang->kanban->create, '', "class='iframe'", '', true);?>
<?php common::printLink('kanban', 'editSpace', "spaceID={$space->id}", '<i class="icon icon-cog-outline"></i> ' . $lang->kanban->setting, '', "class='iframe'", '', true);?>
<?php common::printLink('kanban', 'closeSpace', "spaceID={$space->id}", '<i class="icon icon-off"></i> ' . $lang->close, '', "class='iframe'", '', true);?>
<?php common::printLink('kanban', 'deleteSpace', "spaceID={$space->id}", '<i class="icon icon-trash"></i> ' . $lang->delete, 'hiddenwin', '', '', true);?>
</div>
</div>
</div>
<?php endforeach;?>
<?php endif;?>
</div>
<div id='spacesFooter' class='table-footer'>
<?php $pager->show('right', 'pagerjs');?>
</div>
<?php include '../../common/view/footer.html.php';?>