* Finish task #46242.

This commit is contained in:
tianshujie
2021-12-23 09:59:34 +08:00
parent 6282b7e066
commit 25a2e79f43
8 changed files with 285 additions and 78 deletions
+46 -40
View File
@@ -621,45 +621,48 @@ $lang->release->methodOrder[75] = 'notify';
/* Kanban */
$lang->resource->kanban = new stdclass();
$lang->resource->kanban->space = 'spaceCommon';
$lang->resource->kanban->createSpace = 'createSpace';
$lang->resource->kanban->editSpace = 'editSpace';
$lang->resource->kanban->closeSpace = 'closeSpace';
$lang->resource->kanban->deleteSpace = 'deleteSpace';
$lang->resource->kanban->sortSpace = 'sortSpace';
$lang->resource->kanban->create = 'create';
$lang->resource->kanban->edit = 'edit';
$lang->resource->kanban->view = 'view';
$lang->resource->kanban->close = 'close';
$lang->resource->kanban->delete = 'delete';
$lang->resource->kanban->createRegion = 'createRegion';
$lang->resource->kanban->editRegion = 'editRegion';
$lang->resource->kanban->sortRegion = 'sortRegion';
$lang->resource->kanban->sortGroup = 'sortGroup';
$lang->resource->kanban->deleteRegion = 'deleteRegion';
$lang->resource->kanban->createLane = 'createLane';
$lang->resource->kanban->setLane = 'setLane';
$lang->resource->kanban->sortLane = 'sortLane';
$lang->resource->kanban->deleteLane = 'deleteLane';
$lang->resource->kanban->createColumn = 'createColumn';
$lang->resource->kanban->splitColumn = 'splitColumn';
$lang->resource->kanban->restoreColumn = 'restoreColumn';
$lang->resource->kanban->setColumn = 'setColumn';
$lang->resource->kanban->setWIP = 'setWIP';
$lang->resource->kanban->sortColumn = 'sortColumn';
$lang->resource->kanban->deleteColumn = 'deleteColumn';
$lang->resource->kanban->createCard = 'createCard';
$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';
$lang->resource->kanban->space = 'spaceCommon';
$lang->resource->kanban->createSpace = 'createSpace';
$lang->resource->kanban->editSpace = 'editSpace';
$lang->resource->kanban->closeSpace = 'closeSpace';
$lang->resource->kanban->deleteSpace = 'deleteSpace';
$lang->resource->kanban->sortSpace = 'sortSpace';
$lang->resource->kanban->create = 'create';
$lang->resource->kanban->edit = 'edit';
$lang->resource->kanban->view = 'view';
$lang->resource->kanban->close = 'close';
$lang->resource->kanban->delete = 'delete';
$lang->resource->kanban->createRegion = 'createRegion';
$lang->resource->kanban->editRegion = 'editRegion';
$lang->resource->kanban->sortRegion = 'sortRegion';
$lang->resource->kanban->sortGroup = 'sortGroup';
$lang->resource->kanban->deleteRegion = 'deleteRegion';
$lang->resource->kanban->createLane = 'createLane';
$lang->resource->kanban->setLane = 'setLane';
$lang->resource->kanban->sortLane = 'sortLane';
$lang->resource->kanban->deleteLane = 'deleteLane';
$lang->resource->kanban->createColumn = 'createColumn';
$lang->resource->kanban->splitColumn = 'splitColumn';
$lang->resource->kanban->archiveColumn = 'archiveColumn';
$lang->resource->kanban->restoreColumn = 'restoreColumn';
$lang->resource->kanban->setColumn = 'setColumn';
$lang->resource->kanban->setWIP = 'setWIP';
$lang->resource->kanban->sortColumn = 'sortColumn';
$lang->resource->kanban->deleteColumn = 'deleteColumn';
$lang->resource->kanban->createCard = 'createCard';
$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';
$lang->resource->kanban->viewArchivedColumn = 'viewArchivedColumn';
$lang->resource->kanban->viewArchivedCard = 'viewArchivedCard';
$lang->kanban->methodOrder[5] = 'space';
$lang->kanban->methodOrder[10] = 'createSpace';
@@ -693,13 +696,16 @@ $lang->kanban->methodOrder[140] = 'editCard';
$lang->kanban->methodOrder[145] = 'viewCard';
$lang->kanban->methodOrder[150] = 'sortCard';
$lang->kanban->methodOrder[155] = 'archivedCard';
$lang->kanban->methodOrder[160] = 'copyCard';
//$lang->kanban->methodOrder[160] = 'copyCard';
$lang->kanban->methodOrder[165] = 'deleteCard';
$lang->kanban->methodOrder[170] = 'assigntoCard';
$lang->kanban->methodOrder[175] = 'moveCard';
$lang->kanban->methodOrder[180] = 'setCardColor';
$lang->kanban->methodOrder[185] = 'laneMove';
$lang->kanban->methodorder[190] = 'cardsSort';
$lang->kanban->methodOrder[195] = 'viewArchivedColumn';
$lang->kanban->methodorder[200] = 'viewArchivedCard';
$lang->kanban->methodorder[205] = 'archiveColumn';
/* Execution. */
$lang->resource->execution = new stdclass();
+49 -1
View File
@@ -583,7 +583,7 @@ class kanban extends control
*/
public function viewArchivedColumn($regionID)
{
$columns = $this->kanban->getColumnsByRegion($regionID);
$columns = $this->kanban->getColumnsByObject('region', $regionID, '', '');
$columnsData = array();
foreach($columns as $column)
{
@@ -768,6 +768,54 @@ class kanban extends control
}
}
/**
* View archived cards.
*
* @param int $regionID
* @access public
* @return void
*/
public function viewArchivedCard($regionID)
{
$this->view->cards = $this->kanban->getCardsByObject('region', $regionID, 1);
$this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted');
$this->view->usersAvatar = $this->user->getAvatarPairs();
$this->display();
}
/**
* Restore a card.
*
* @param int $cardID
* @param string $confirm no|yes
* @access public
* @return void
*/
public function restoreCard($cardID, $confirm = 'no')
{
if($confirm == 'no')
{
$card = $this->kanban->getCardByID($cardID);
$column = $this->dao->select('*')->from(TABLE_KANBANCOLUMN)->where('id')->eq($card->column)->fetch();
if($column->archived) die(js::alert(sprintf($this->lang->kanbancard->confirmRestoreTip, $column->name)));
die(js::confirm(sprintf($this->lang->kanbancard->confirmRestore, $column->name), $this->createLink('kanban', 'restoreCard', "cardID=$cardID&confirm=yes"), ''));
}
else
{
$this->kanban->restoreCard($cardID);
$changes = $this->kanban->restoreCard($cardID);
if(dao::isError()) die(js::error(dao::getError()));
$actionID = $this->loadModel('action')->create('kanbancard', $cardID, 'restore');
$this->action->logHistory($actionID, $changes);
die(js::reload('parent'));
}
}
/**
* Delete a card.
*
+4 -2
View File
@@ -287,8 +287,10 @@ $lang->kanbancard->deadlineAB = 'DL';
$lang->kanbancard->beginAB = 'Begin';
$lang->kanbancard->to = 'to';
$lang->kanbancard->confirmArchive = 'Are you sure to archive this card? After archiving the card, it will be hidden from the column and you can view it in the Region - Archived.';
$lang->kanbancard->confirmDelete = 'Are you sure 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->confirmArchive = 'Are you sure to archive this card? After archiving the card, it will be hidden from the column and you can view it in the Region - Archived.';
$lang->kanbancard->confirmDelete = 'Are you sure 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->confirmRestore = 'Are you sure you want to restore this card? After the card is restored, the card will be restored to the "%s" Kanban column.';
$lang->kanbancard->confirmRestoreTip = "The card's column has been archived, please restore '%s' column first.";
$lang->kanbancard->priList[1] = 1;
$lang->kanbancard->priList[2] = 2;
+7 -5
View File
@@ -79,12 +79,12 @@ $lang->kanban->createColumnOnRight = '在右侧添加看板列';
$lang->kanban->accessDenied = '您无权访问该看板';
$lang->kanban->confirmDelete = '您确认删除吗?';
$lang->kanban->aclList['extend'] = '继承空间访问权限(能访问当前空间,即可访问)';
$lang->kanban->aclList['private'] = '私有(看板团队成员、白名单、空间负责人可访问)';
$lang->kanban->aclGroup['open'] = '公开';
$lang->kanban->aclGroup['private'] = '私有';
$lang->kanban->aclList['extend'] = '继承空间访问权限(能访问当前空间,即可访问)';
$lang->kanban->aclList['private'] = '私有(看板团队成员、白名单、空间负责人可访问)';
$lang->kanban->enableArchived['0'] = '不启用';
$lang->kanban->enableArchived['1'] = '启用';
@@ -287,8 +287,10 @@ $lang->kanbancard->deadlineAB = '截止';
$lang->kanbancard->beginAB = '开始';
$lang->kanbancard->to = '至';
$lang->kanbancard->confirmArchive = '您确认归档该卡片吗?归档卡片后,该卡片将从列中隐藏,您可以在区域-已归档中查看。';
$lang->kanbancard->confirmDelete = '您确认删除该卡片吗?删除卡片后,该卡片将从看板中删除,您只能通过系统回收站查看。';
$lang->kanbancard->confirmArchive = '您确认归档该卡片吗?归档卡片后,该卡片将从列中隐藏,您可以在区域-已归档中查看。';
$lang->kanbancard->confirmDelete = '您确认删除该卡片吗?删除卡片后,该卡片将从看板中删除,您只能通过系统回收站查看。';
$lang->kanbancard->confirmRestore = '您确定要还原该卡片吗?还原卡片后,该卡片将还原到“%s”看板列中。';
$lang->kanbancard->confirmRestoreTip = '该卡片所属的看板列已被归档,请先还原“%s”看板列。';
$lang->kanbancard->priList[1] = 1;
$lang->kanbancard->priList[2] = 2;
+54 -23
View File
@@ -266,7 +266,7 @@ class kanbanModel extends model
return false;
}
$childColumns = $this->getColumnsByParent($column->parent);
$childColumns = $this->getColumnsByObject('parent', $column->parent);
foreach($childColumns as $childColumn)
{
$limit += (int)$childColumn->limit;
@@ -594,7 +594,7 @@ class kanbanModel extends model
->orderBy('order')
->fetchGroup('group');
$actions = array('createColumn', 'copyColumn', 'editColumn', 'splitColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'splitColumn');
$actions = array('createColumn', 'editColumn', 'splitColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'splitColumn');
/* Group by parent. */
$parentColumnGroup = array();
@@ -2055,6 +2055,29 @@ class kanbanModel extends model
if(!dao::isError()) return common::createChanges($oldCard, $card);
}
/**
* Restore a card.
*
* @param int $cardID
* @access public
* @return array
*/
public function restoreCard($cardID)
{
$oldCard = $this->getCardByID($cardID);
$this->dao->update(TABLE_KANBANCARD)
->set('archived')->eq(0)
->set('archivedBy')->eq('')
->set('archivedDate')->eq('')
->where('id')->eq($cardID)
->exec();
$card = $this->getCardByID($cardID);
if(!dao::isError()) return common::createChanges($oldCard, $card);
}
/**
* Get space by id.
*
@@ -2139,35 +2162,22 @@ class kanbanModel extends model
}
/**
* Get child columns by parent id.
* Get columns by object id.
*
* @param int $parentID
* @param string $objectType
* @param int $objectID
* @param string $archived
* @param string $deleted
* @access public
* @return array
*/
public function getColumnsByParent($parentID, $archived = '0', $deleted = '0')
public function getColumnsByObject($objectType = '', $objectID = 0, $archived = 0, $deleted = 0)
{
return $this->dao->select('*')->from(TABLE_KANBANCOLUMN)
->where('parent')->eq($parentID)
->andWhere('archived')->eq($archived)
->andWhere('deleted')->eq($deleted)
->orderBy('order')
->fetchAll('id');
}
/**
* Get columns by region id.
*
* @param int $regionID
* @access public
* @return array
*/
public function getColumnsByRegion($regionID)
{
return $this->dao->select('*')->from(TABLE_KANBANCOLUMN)
->where('region')->eq($regionID)
->where(true)
->beginIF($objectType)->andWhere($objectType)->eq($objectID)->fi()
->beginIF($archived != '')->andWhere('archived')->eq($archived)->fi()
->beginIF($deleted != '')->andWhere('deleted')->eq($deleted)->fi()
->orderBy('order')
->fetchAll('id');
}
@@ -2246,6 +2256,27 @@ class kanbanModel extends model
return $card;
}
/**
* Get cards by object id.
*
* @param string $objectType
* @param int $objectID
* @param string $archived
* @param string $deleted
* @access public
* @return array
*/
public function getCardsByObject($objectType = '', $objectID = 0, $archived = 0, $deleted = 0)
{
return $this->dao->select('*')->from(TABLE_KANBANCARD)
->where(true)
->beginIF($objectType)->andWhere($objectType)->eq($objectID)->fi()
->beginIF($archived != '')->andWhere('archived')->eq($archived)->fi()
->beginIF($deleted != '')->andWhere('deleted')->eq($deleted)->fi()
->orderBy('order')
->fetchAll('id');
}
/**
* Get Kanban cards menus by execution id.
*
+14 -4
View File
@@ -62,10 +62,20 @@ $canCreateLane = commonModel::hasPriv('kanban', 'createLane');
<?php endif;?>
</span>
<span>
<button data-toggle="dropdown" class="btn btn-link action" type="button" title=<?php echo $this->lang->kanban->archived;?>>
<span><?php echo $this->lang->kanban->archived;?></span>
<span class="caret"></span>
</button>
<?php $canViewArchivedCard = commonModel::hasPriv('kanban', 'viewArchivedCard');?>
<?php $canViewArchivedColumn = commonModel::hasPriv('kanban', 'viewArchivedColumn');?>
<?php if($canViewArchivedCard or $canViewArchivedColumn):?>
<span>
<button data-toggle="dropdown" class="btn btn-link action" type="button" title=<?php echo $this->lang->kanban->archived;?>>
<span><?php echo $this->lang->kanban->archived;?></span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right">
<?php if($canViewArchivedCard) echo '<li>' . html::a("javascript:loadMore(\"Card\", $region->id)", '<i class="icon icon-card-archive"></i>' . $this->lang->kanban->viewArchivedCard) . '</li>';?>
<?php if($canViewArchivedColumn) echo '<li>' . html::a("javascript:loadMore(\"Column\", $region->id)", '<i class="icon icon-col-archive"></i>' . $this->lang->kanban->viewArchivedColumn) . '</li>';?>
</ul>
</span>
<?php endif;?>
<ul class="dropdown-menu pull-right">
<?php echo '<li>' . html::a(inlink('viewArchivedCard', "", '', 1), '<i class="icon icon-card-archive"></i>' . $this->lang->kanban->viewArchivedCard, '', 'class="iframe" data-toggle="modal" data-width="600px"') . '</li>';?>
<?php echo '<li>' . html::a(inlink('viewArchivedColumn', "", '', 1), '<i class="icon icon-col-archive"></i>' . $this->lang->kanban->viewArchivedColumn, '', 'class="iframe" data-toggle="modal" data-width="600px"') . '</li>';?>
@@ -0,0 +1,102 @@
<?php
/**
* The viewarchivedcard 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: viewarchivedcard.html.php 935 2021-12-22 15:44:24Z $
* @link https://www.zentao.net
*/
?>
<style>
#archivedCards {top: 48px; right: -400px; width: 400px; position: fixed; z-index: 1050; background-color: rgb(255,255,255);}
#archivedCards .panel .panel-body {overflow: auto; padding: 10px;}
#archivedCards .kanban-item {border: 1px solid #ddd; border-radius: 4px; padding: 5px;}
#archivedCards .kanban-item > .title {display: block; max-height: 38px; overflow: hidden; color: inherit; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;}
#archivedCards .kanban-item > .title:hover {color: #2272eb}
#archivedCards .kanban-item > .info {margin-top: 5px; position: relative;}
#archivedCards .kanban-item > .info > .pri {height: 14px; border-width: 1px; font-size: 12px; line-height: 12px; min-width: 14px; padding: 0 1px;}
#archivedCards .kanban-item > .info > .time {margin-left: 10px; font-size: 12px}
#archivedCards .kanban-item > .info > .user {position: absolute; right: 0; top: 0}
#archivedCards .card-actions {position: relative; padding: 15px 10px; padding-top: 0px;}
#archivedCards .card-actions > .btn {display: block;}
#archivedCards .card-actions > .btn + .btn {margin-top: 10px;}
#archivedCards .info > .users > span:before {left: -4px;}
#archivedCards .info > .users > span:after {right: -4px;}
#archivedCards .info > .users .avatar {display: inline-block; position: relative; border-radius: 50%; top: -5px; margin: 5px; right: -7px; margin-left: -4px;}
#archivedCards .cardName {word-wrap: break-word;}
</style>
<div class='panel'>
<div class='panel-heading text-center'>
<strong><?php echo $lang->kanban->archivedCard;?></strong>
<button type="button" class="close" aria-hidden="true">×</button>
</div>
<div class='panel-body'>
<?php foreach($cards as $card):?>
<div class='card-item' data-card='<?php echo $card->id;?>'>
<div class='col-xs-10'>
<div class="kanban-item" data-id="<?php echo $card->id;?>">
<?php echo html::a($this->createLink('kanban', 'viewCard', "cardID=$card->id", '', true), $card->name, '', "class='cardName iframe' data-toggle='modal' data-width='80%' title='$card->name'");?>
<div class="info">
<span class="pri label-pri label-pri-<?php echo $card->pri;?>"><?php echo $card->pri;?></span>
<?php if($card->estimate and $card->estimate != 0) echo "<span class='text-gray'>{$card->estimate}h</span>";?>
<?php if($card->end and $card->end != '0000-00-00'):?>
<span class="time label label-light"><?php echo $card->end;?></span>
<?php endif;?>
<?php
$assignedToList = explode(',', $card->assignedTo);
$count = 0;
$members = '';
?>
<?php
foreach($assignedToList as $index => $account)
{
if(!isset($users[$account]))
{
unset($assignedToList[$index]);
continue;
}
$members .= $users[$account] . ',';
}
$userCount = count($assignedToList);
?>
<?php if($userCount > 0):?>
<div class='users pull-right' title="<?php echo $members;?>">
<?php
foreach($assignedToList as $account)
{
if($count > 4) continue;
echo html::smallAvatar(array('avatar' => $usersAvatar[$account], 'account' => $account));
$count ++;
}
?>
</div>
<?php endif;?>
</div>
</div>
</div>
<div class='col-xs-2 card-actions'>
<?php
$canRestore = commonModel::hasPriv('kanban', 'restoreCard');
$canDelete = commonModel::hasPriv('kanban', 'deleteCard');
if($canRestore) echo html::a(inlink('restoreCard', "cardID={$card->id}", '',true), $lang->kanban->restore, '', "class='btn btn-xs btn-primary' target='hiddenwin'");
if($canDelete) echo html::a($this->createLink('kanban', 'deleteCard', "cardID=$card->id", '', true), $lang->delete, '', "class='btn btn-xs delete-card' target='hiddenwin'");
?>
</div>
</div>
<?php endforeach;?>
</div>
</div>
<script>
$(function()
{
$('#archivedCards .panel .close').click(function()
{
$('#archivedCards').animate({right: -400}, 500);
});
})
</script>
@@ -13,7 +13,9 @@
<style>
#archivedColumns {top: 50px; right: -400px; width: 400px; position: fixed; z-index: 1050; background-color: rgb(255,255,255);}
#archivedColumns .panel .panel-body {overflow: auto; padding: 0px 20px;}
#archivedColumns .parent-item,#archivedColumns .child-item {padding: 20px 0px; border-bottom: 1px solid #ddd; line-height: 26px; overflow: hidden;}
.hr {border-bottom: 1px solid #ddd;}
#archivedColumns .parent-item,#archivedColumns .child-item {padding: 20px 0px; line-height: 26px; overflow: hidden;}
#archivedColumns .child-item {padding: 5px 0px;}
#archivedColumns .title {width: 250px; float: left;}
#archivedColumns .label-child {border-radius: 12px; background-color: #DDDDDD; color: #333; margin-right: 10px;}
#archivedColumns .btn {float: right; line-height: 26px; height: 26px; padding: 0 20px;}
@@ -31,15 +33,19 @@
<?php else:?>
<?php foreach($columns as $column):?>
<div class="item-body">
<div class="item parent-item" data-archived='<?php echo $column->archived;?>' data-id="<?php echo $column->id;?>">
<div class="item parent-item hr" data-archived='<?php echo $column->archived;?>' data-id="<?php echo $column->id;?>">
<div class="title text-ellipsis"><?php echo $column->name;?></div>
<?php if(commonModel::hasPriv('kanban', 'restoreColumn') && $column->archived == '1') echo html::a(inlink('restoreColumn', "columnID={$column->id}", '',true), $lang->kanban->restore, '', "class='btn btn-primary' target='hiddenwin'");?>
</div>
<?php if(!empty($column->child) && $column->archived == '0'):?>
<?php $count = 1;?>
<?php foreach($column->child as $childColumn):?>
<div class="item child-item" data-id="<?php echo $childColumn->id;?>" data-archived='<?php echo $childColumn->archived;?>'>
<?php $class = $count == count($column->child) ? 'hr' : '';?>
<div class="item child-item <?php echo $class;?>" data-id="<?php echo $childColumn->id;?>" data-archived='<?php echo $childColumn->archived;?>'>
<div class="title text-ellipsis"><label class="label label-child"><?php echo $lang->kanban->child;?></label><?php echo $childColumn->name;?></div>
<?php if(commonModel::hasPriv('kanban', 'restoreColumn') && $childColumn->archived == '1') echo html::a(inlink('restoreColumn', "columnID={$childColumn->id}", '',true), $lang->kanban->restore, 'hiddenwin', "class='btn btn-primary");?>
</div>
<?php $count ++;?>
<?php endforeach;?>
<?php endif;?>
</div>