Merge branch 'kanban' into 'sprint/177_tianshujie_46148'

# Conflicts:
#   module/kanban/control.php
#   module/kanban/model.php
This commit is contained in:
孙广明
2021-12-16 06:28:32 +00:00
12 changed files with 148 additions and 33 deletions
+1 -1
View File
@@ -77,7 +77,7 @@ class design extends control
/* Print top and right actions. */
$this->lang->TRActions = '<div class="btn-toolbar pull-right">';
if($this->config->maxVersion)
if($this->config->maxVersion and common::hasPriv('design', 'submit'))
{
$this->lang->TRActions .= '<div class="btn-group">';
$this->lang->TRActions .= html::a($this->createLink('design', 'submit', "productID=$productID", '', true), "<i class='icon-plus'></i> {$this->lang->design->createReview}", '', "class='btn btn-secondary iframe'");
+12 -2
View File
@@ -647,6 +647,11 @@ $lang->resource->kanban->editCard = 'editCard';
$lang->resource->kanban->viewCard = 'viewCard';
$lang->resource->kanban->sortCard = 'sortCard';
$lang->resource->kanban->archiveCard = 'archiveCard';
$lang->resource->kanban->assigntoCard = 'assigntoCard';
$lang->resource->kanban->copyCard = 'copyCard';
$lang->resource->kanban->deleteCard = 'deleteCard';
$lang->resource->kanban->moveCard = 'moveCard';
$lang->resource->kanban->setCardColor = 'setCardColor';
$lang->resource->kanban->laneMove = 'laneMove';
$lang->resource->kanban->cardsSort = 'cardsSort';
@@ -679,8 +684,13 @@ $lang->kanban->methodOrder[130] = 'editCard';
$lang->kanban->methodOrder[135] = 'viewCard';
$lang->kanban->methodOrder[140] = 'sortCard';
$lang->kanban->methodOrder[145] = 'archivedCard';
$lang->kanban->methodOrder[150] = 'laneMove';
$lang->kanban->methodOrder[155] = 'cardsSort';
$lang->kanban->methodOrder[150] = 'copyCard';
$lang->kanban->methodOrder[155] = 'deleteCard';
$lang->kanban->methodOrder[160] = 'assigntoCard';
$lang->kanban->methodOrder[165] = 'moveCard';
$lang->kanban->methodOrder[170] = 'setCardColor';
$lang->kanban->methodOrder[175] = 'laneMove';
$lang->kanban->methodOrder[180] = 'cardsSort';
/* Execution. */
$lang->resource->execution = new stdclass();
+3 -3
View File
@@ -16,8 +16,8 @@ $config->kanban->createspace = new stdclass();
$config->kanban->editspace = new stdclass();
$config->kanban->createregion = new stdclass();
$config->kanban->createcard = new stdclass();
$config->kanban->editcard = new stdclass();
$config->kanban->editregion = new stdclass();
$config->kanban->setwip->requiredFields = 'limit';
$config->kanban->setlane->requiredFields = 'name,type';
@@ -28,8 +28,8 @@ $config->kanban->createspace->requiredFields = 'name,owner';
$config->kanban->editspace->requiredFields = 'name,owner';
$config->kanban->createregion->requiredFields = 'name';
$config->kanban->createcard->requiredFields = 'name';
$config->kanban->editcard->requiredFields = 'name';
$config->kanban->editcard->requiredFields = 'name';
$config->kanban->editregion->requiredFields = 'name';
$config->kanban->editor = new stdclass();
$config->kanban->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
+31 -4
View File
@@ -319,6 +319,32 @@ class kanban extends control
$this->display();
}
* Edit a region
*
* @param int $regionID
* @access public
* @return void
*/
public function editRegion($regionID = 0)
{
$this->loadModel('action');
if(!empty($_POST))
{
$changes = $this->kanban->updateRegion($regionID);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$actionID = $this->action->create('kanbanregion', $regionID, 'edited');
$this->action->logHistory($actionID, $changes);
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
}
$this->view->region = $this->kanban->getRegionByID($regionID);
$this->display();
}
/**
* Delete a region
*
@@ -362,7 +388,7 @@ class kanban extends control
$this->view->lanes = $this->kanban->getLanePairsByRegion($regionID);
$this->display();
}
/**
* Delete a lane.
*
@@ -375,7 +401,7 @@ class kanban extends control
{
if($confirm == 'no')
{
die(js::confirm($this->lang->kanban->confirmDelete, $this->createLink('kanban', 'deleteLane', "laneID=$laneID&confirm=yes"), ''));
die(js::confirm($this->lang->kanbanlane->confirmDelete, $this->createLink('kanban', 'deleteLane', "laneID=$laneID&confirm=yes"), ''));
}
else
{
@@ -424,7 +450,7 @@ class kanban extends control
{
if($confirm == 'no')
{
die(js::confirm($this->lang->kanban->confirmDelete, $this->createLink('kanban', 'deleteColumn', "columnID=$columnID&confirm=yes"), ''));
die(js::confirm($this->lang->kanbancolumn->confirmDelete, $this->createLink('kanban', 'deleteColumn', "columnID=$columnID&confirm=yes"), ''));
}
else
{
@@ -526,7 +552,7 @@ class kanban extends control
{
if($confirm == 'no')
{
die(js::confirm($this->lang->kanban->confirmDelete, $this->createLink('kanban', 'deleteCard', "cardID=$cardID&confirm=yes")));
die(js::confirm($this->lang->kanbancard->confirmDelete, $this->createLink('kanban', 'deleteCard', "cardID=$cardID&confirm=yes")));
}
else
{
@@ -637,6 +663,7 @@ class kanban extends control
}
$this->view->column = $column;
$this->view->title = $column->name . $this->lang->colon . $this->lang->kanban->setColumn;
$this->display();
}
+1 -5
View File
@@ -65,7 +65,6 @@ body {background-color: #fff}
.region .kanban-item > .kanban-card > .info > .estimate{margin-left: 10px; color: #999}
.region .kanban-item > .kanban-card > .info > .time {margin-left: 10px; font-size: 12px; background: rgb(242, 242, 242)}
.region .kanban-item > .kanban-card > .info > .user {position: absolute; right: 0; top: 0}
.region .kanban-item > .kanban-card > .actions {position: absolute; top: 0px; right: 4px; opacity: 0;}
.region .kanban-item > .kanban-card > .actions > a {display: block; float: left; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; opacity: .7;}
.region .kanban-item > .kanban-card > .actions > a:hover {background-color: rgba(0,0,0,.075); opacity: 1;}
.region .kanban-item:hover > .actions {opacity: 1;}
@@ -76,15 +75,12 @@ body {background-color: #fff}
.region .kanban-item.has-color .info > .label-pri {border-color: #FFFFFF;}
.region .kanban-item .item-more {position: absolute; right: 6px; top: 0px;}
.kanban + .kanban {margin-top: 15px}
.kanban-card {height: 60px !important}
.kanban-card > .title {display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis}
.kanban-card > .info {position: relative; margin-top: 5px}
.kanban-card > .info > .info + .info {margin-left: 8px}
.kanban-card > .info > .pri {min-width: 16px; line-height: 14px; height: 16px; padding: 0}
.kanban-card > .info > .user {position: absolute; right: 0; top: 0}
.kanban-card > .actions {position: absolute; top: 4px; right: 4px; opacity: 0;}
.kanban-card:hover > .actions {opacity: 1;}
.kanban-card > .actions {position: absolute; top: 4px; right: 4px; opacity: 0;}
.kanban-card > .actions > a {display: block; float: left; width: 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 4px; opacity: .7;}
.kanban-card > .actions > a:hover {background-color: rgba(0,0,0,.075); opacity: 1;}
+1 -1
View File
@@ -267,7 +267,7 @@ function renderKanbanItem(item, $item)
var $avatar = $(
priv.canAssignCard ? '<a class="avatar avatar-sm avatar-user avatar-circle iframe"></a>'
: '<div class="avatar avatar-sm avatar-user"></div>'
: '<div class="avatar avatar-sm avatar-user avatar-circle"></div>'
).attr('data-name', user.realname || user.account)
.attr('data-id', user.id || user.account);
if(user.avatar)
+16 -8
View File
@@ -30,7 +30,9 @@ $lang->kanban->sortCard = 'Sort Card';
$lang->kanban->copyCard = 'Copy Card';
$lang->kanban->moveCard = 'Move Card';
$lang->kanban->cardColor = 'Card Color';
$lang->kanban->setCardColor = 'Set Card Color';
$lang->kanban->deleteCard = 'Delete Card';
$lang->kanban->assigntoCard = 'Assign';
$lang->kanban->setting = 'Setting';
$lang->kanban->splitColumn = 'Split Column';
$lang->kanban->createColumnOnLeft = 'Create Column On Left';
@@ -65,7 +67,7 @@ $lang->kanban->createColumnOnLeft = 'Create Column On Left';
$lang->kanban->createColumnOnRight = 'Create Column On Right';
$lang->kanban->accessDenied = "You have no access to the kanban.";
$lang->kanban->confirmDelete = 'Do you want to delelte this?';
$lang->kanban->confirmDelete = 'Do you want to delete this?';
$lang->kanban->aclGroup['open'] = 'Open';
$lang->kanban->aclGroup['private'] = 'Private';
@@ -210,19 +212,23 @@ $lang->kanbancolumn->name = $lang->kanban->columnName;
$lang->kanbancolumn->limit = $lang->kanban->WIPCount;
$lang->kanbancolumn->color = 'Column Color';
$lang->kanbancolumn->confirmDelete = 'Are you sure to delete this column? After deleting the column, all cards in this column will also be deleted.';
$lang->kanbanlane = new stdclass();
$lang->kanbanlane->name = $lang->kanban->laneName;
$lang->kanbanlane->common = 'Lane';
$lang->kanbanlane->default = 'Default Lane';
$lang->kanbanlane->column = 'Lane Kanban Column';
$lang->kanbanlane->otherlane = 'Select Existed Lane';
$lang->kanbanlane->color = 'Lane Color';
$lang->kanbanlane->name = $lang->kanban->laneName;
$lang->kanbanlane->common = 'Lane';
$lang->kanbanlane->default = 'Default Lane';
$lang->kanbanlane->column = 'Lane Kanban Column';
$lang->kanbanlane->otherlane = 'Select Existed Lane';
$lang->kanbanlane->color = 'Lane Color';
$lang->kanbanlane->confirmDelete = 'Are you sure to delete this lane? After deleting the lane, all data (columns and cards) in the lane will also be deleted.';
$lang->kanbanlane->modeList['sameAsOther'] = 'Use the same Kanban column as other lanes';
$lang->kanbanlane->modeList['independent'] = 'Independent Kanban column is adopted';
$lang->kanbanregion = new stdclass();
$lang->kanbanregion->name = 'Kanban Region';
$lang->kanbanregion->name = 'Region Name';
$lang->kanbanregion->default = 'Default Region';
$lang->kanbanregion->style = 'Region Style';
@@ -259,6 +265,8 @@ $lang->kanbancard->lblHour = 'h';
$lang->kanbancard->noAssigned = 'No Assigned';
$lang->kanbancard->deadlineAB = 'DL';
$lang->kanbancard->confirmDelete = 'Do you want to delete this card? After deleting the card, it will be deleted from the Kanban. You can only view it in the system recycle bin.';
$lang->kanbancard->priList[1] = 1;
$lang->kanbancard->priList[2] = 2;
$lang->kanbancard->priList[3] = 3;
+15 -7
View File
@@ -30,7 +30,9 @@ $lang->kanban->sortCard = '卡片排序';
$lang->kanban->copyCard = '复制卡片';
$lang->kanban->moveCard = '移动卡片';
$lang->kanban->cardColor = '卡片颜色';
$lang->kanban->setCardColor = '设置卡片颜色';
$lang->kanban->deleteCard = '删除卡片';
$lang->kanban->assigntoCard = '指派';
$lang->kanban->setting = '设置';
$lang->kanban->splitColumn = '新增子看板列';
$lang->kanban->createColumnOnLeft = '左侧新增看板列';
@@ -210,19 +212,23 @@ $lang->kanbancolumn->name = $lang->kanban->columnName;
$lang->kanbancolumn->limit = $lang->kanban->WIPCount;
$lang->kanbancolumn->color = '看板列颜色';
$lang->kanbancolumn->confirmDelete = '您确认删除该列吗?删除列后,该列中所有卡片也会被删除。';
$lang->kanbanlane = new stdclass();
$lang->kanbanlane->name = $lang->kanban->laneName;
$lang->kanbanlane->common = '泳道';
$lang->kanbanlane->default = '默认泳道';
$lang->kanbanlane->column = '泳道看板列';
$lang->kanbanlane->otherlane = '选择共享看板列的泳道';
$lang->kanbanlane->color = '泳道颜色';
$lang->kanbanlane->name = $lang->kanban->laneName;
$lang->kanbanlane->common = '泳道';
$lang->kanbanlane->default = '默认泳道';
$lang->kanbanlane->column = '泳道看板列';
$lang->kanbanlane->otherlane = '选择共享看板列的泳道';
$lang->kanbanlane->color = '泳道颜色';
$lang->kanbanlane->confirmDelete = '您确认删除该泳道吗?删除泳道后,该泳道中所有数据(列、卡片)也会被删除。';
$lang->kanbanlane->modeList['sameAsOther'] = '与其他泳道使用相同看板列';
$lang->kanbanlane->modeList['independent'] = '采用独立的看板列';
$lang->kanbanregion = new stdclass();
$lang->kanbanregion->name = '看板区域';
$lang->kanbanregion->name = '区域名称';
$lang->kanbanregion->default = '默认区域';
$lang->kanbanregion->style = '区域样式';
@@ -259,6 +265,8 @@ $lang->kanbancard->lblHour = 'h';
$lang->kanbancard->noAssigned = '未指派';
$lang->kanbancard->deadlineAB = '截止';
$lang->kanbancard->confirmDelete = '您确认删除该卡片吗?删除卡片后,该卡片将从看板中删除,您只能通过系统回收站查看。';
$lang->kanbancard->priList[1] = 1;
$lang->kanbancard->priList[2] = 2;
$lang->kanbancard->priList[3] = 3;
+28
View File
@@ -1326,6 +1326,34 @@ class kanbanModel extends model
}
}
/**
* Update a region.
*
* @param int $regionID
* @access public
* @return array
*/
public function updateRegion($regionID)
{
$region = fixer::input('post')
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', helper::now())
->trim('name')
->get();
$oldRegion = $this->getRegionById($regionID);
$this->dao->update(TABLE_KANBANREGION)->data($region)
->autoCheck()
->batchcheck($this->config->kanban->editregion->requiredFields, 'notempty')
->where('id')->eq($regionID)
->exec();
if(dao::isError()) return;
$changes = common::createChanges($oldRegion, $region);
return $changes;
}
/**
* Update kanban lane.
*
+1 -1
View File
@@ -18,7 +18,7 @@
<h2>
<span class='label label-id'><?php echo $kanban->id;?></span>
<?php echo "<span title='$kanban->name'>" . $kanban->name . '</span>';?>
</div>
</h2>
</div>
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
<table class='table table-form'>
+1 -1
View File
@@ -18,7 +18,7 @@
<h2>
<span class='label label-id'><?php echo $space->id;?></span>
<?php echo "<span title='$space->name'>" . $space->name . '</span>';?>
</div>
</h2>
</div>
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
<table class='table table-form'>
+38
View File
@@ -0,0 +1,38 @@
<?php
/**
* The editregion file of task 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 Mengyi Liu <liumengyi@easycorp.ltd>
* @package kanban
* @version $Id: editregion.html.php 935 2021-10-26 16:24:24Z liumengyi@easycorp.ltd $
* @link https://www.zentao.net
*/
?>
<?php include '../../common/view/header.lite.html.php';?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
<h2>
<?php echo $lang->kanban->editRegion;?>
</h2>
</div>
<form class="load-indicator main-form form-ajax" method='post'>
<table align='center' class='table table-form'>
<tr>
<th><?php echo $lang->kanbanregion->name;?></th>
<td colspan='2'>
<?php echo html::input('name', $region->name, "class='form-control'");?>
</td>
</tr>
<tr>
<td colspan='4' class='text-center form-actions'>
<?php echo html::submitButton();?>
</td>
</tr>
</table>
</form>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>