Merge branch 'sprint/183_mayue_47998' into 'master'

* Finish task #47998.

See merge request easycorp/zentaopms!1529
This commit is contained in:
孙广明
2022-01-21 06:00:56 +00:00
9 changed files with 128 additions and 15 deletions

View File

@@ -3,6 +3,7 @@ UPDATE `zt_kanbanspace` SET `type` = 'cooperation';
ALTER TABLE `zt_kanban` ADD `importObject` varchar(255) NOT NULL AFTER `displayCards`;
ALTER TABLE `zt_kanban` ADD `performable` enum ('0', '1') NOT NULL DEFAULT '0' AFTER `archived`;
ALTER TABLE `zt_kanbancard` ADD `status` varchar(30) NOT NULL AFTER `name`;
ALTER TABLE `zt_job` ADD `sonarqubeServer` mediumint(8) unsigned NOT NULL AFTER `triggerType`;
ALTER TABLE `zt_job` ADD `projectKey` varchar(255) NOT NULL AFTER `sonarqubeServer`;
ALTER TABLE `zt_job` ADD `projectKey` varchar(255) NOT NULL AFTER `sonarqubeServer`;

View File

@@ -644,6 +644,7 @@ $lang->resource->kanban->close = 'close';
$lang->resource->kanban->delete = 'delete';
$lang->resource->kanban->createRegion = 'createRegion';
$lang->resource->kanban->editRegion = 'editRegion';
$lang->resource->kanban->performable = 'performable';
$lang->resource->kanban->sortRegion = 'sortRegion';
$lang->resource->kanban->sortGroup = 'sortGroup';
$lang->resource->kanban->deleteRegion = 'deleteRegion';
@@ -668,6 +669,8 @@ $lang->resource->kanban->assigntoCard = 'assigntoCard';
//$lang->resource->kanban->copyCard = 'copyCard';
$lang->resource->kanban->deleteCard = 'deleteCard';
$lang->resource->kanban->moveCard = 'moveCard';
$lang->resource->kanban->finishCard = 'finishCard';
$lang->resource->kanban->activateCard = 'activateCard';
$lang->resource->kanban->setCardColor = 'setCardColor';
$lang->resource->kanban->laneMove = 'laneMove';
$lang->resource->kanban->viewArchivedColumn = 'viewArchivedColumn';

View File

@@ -766,6 +766,44 @@ class kanban extends control
$this->display();
}
/**
* Finish a card.
*
* @param int $cardID
* @param int $kanbanID
* @access public
* @return void
*/
public function finishCard($cardID, $kanbanID)
{
$this->dao->update(TABLE_KANBANCARD)->set('status')->eq('done')->where('id')->eq($cardID)->exec();
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
if(isonlybody()) return print(js::reload('parent.parent'));
$kanbanGroup = $this->kanban->getKanbanData($kanbanID);
return print(json_encode($kanbanGroup));
}
/**
* Activate a card.
*
* @param int $cardID
* @param int $kanbanID
* @access public
* @return void
*/
public function activate($cardID, $kanbanID)
{
$this->dao->update(TABLE_KANBANCARD)->set('status')->eq('doing')->where('id')->eq($cardID)->exec();
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
if(isonlybody()) return print(js::reload('parent.parent'));
$kanbanGroup = $this->kanban->getKanbanData($kanbanID);
return print(json_encode($kanbanGroup));
}
/**
* View a card.
*
@@ -1065,13 +1103,13 @@ class kanban extends control
}
/**
* Set done function.
* Setup done function.
*
* @param int $kanbanID
* @access public
* @return void
*/
public function setDoneFunction($kanbanID)
public function performable($kanbanID)
{
if(!empty($_POST))
{

View File

@@ -256,7 +256,7 @@ function renderKanbanItem(item, $item)
{
var $title = $item.children('.title');
var privs = item.actions;
var printMoreBtn = (privs.includes('editCard') || privs.includes('archiveCard') || privs.includes('copyCard') || privs.includes('deleteCard') || privs.includes('moveCard') || privs.includes('setCardColor'));
var printMoreBtn = (privs.includes('editCard') || privs.includes('finishCard') || privs.includes('activateCard') ||privs.includes('archiveCard') || privs.includes('copyCard') || privs.includes('deleteCard') || privs.includes('moveCard') || privs.includes('setCardColor'));
if(privs.includes('sortCard')) $item.parent().addClass('sort');
if(!$title.length)
@@ -436,7 +436,6 @@ function setCardColor(cardID, color, kanbanID, regionID)
url: url,
success: function(data)
{
regions = data;
updateRegion(regionID, data[regionID]);
},
error: function(xhr, status, error)
@@ -446,6 +445,56 @@ function setCardColor(cardID, color, kanbanID, regionID)
});
}
/**
* Finish a card.
*
* @param int $cardID
* @param int $kanbanID
* @param int $regionID
* @access public
* @return void
*/
function finishCard(cardID, kanbanID, regionID)
{
if(!cardID) return false;
var url = createLink('kanban', 'finishCard', 'cardID=' + cardID + '&kanbanID=' + kanbanID);
return $.ajax(
{
method: 'post',
dataType: 'json',
url: url,
success: function(data)
{
updateRegion(regionID, data[regionID]);
}
});
}
/**
* Activate a card.
*
* @param int $cardID
* @param int $kanbanID
* @param int $regionID
* @access public
* @return void
*/
function activateCard(cardID, kanbanID, regionID)
{
if(!cardID) return false;
var url = createLink('kanban', 'activateCard', 'cardID=' + cardID + '&kanbanID=' + kanbanID);
return $.ajax(
{
method: 'post',
dataType: 'json',
url: url,
success: function(data)
{
updateRegion(regionID, data[regionID]);
}
});
}
/**
* Update a region.
*
@@ -698,6 +747,17 @@ function createCardMenu(options)
var items = [];
if(privs.includes('editCard')) items.push({label: kanbanLang.editCard, icon: 'edit', url: createLink('kanban', 'editCard', 'cardID=' + card.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
if(kanban.performable == 1)
{
if(privs.includes('activateCard') && card.status != 'doing')
{
items.push({label: kanbanLang.activateCard, icon: 'magic', onClick: function(){activateCard(card.id, card.kanban, card.region);}});
}
else
{
items.push({label: kanbanLang.finishCard, icon: 'checked', onClick: function(){finishCard(card.id, card.kanban, card.region);}});
}
}
if(privs.includes('archiveCard') && kanban.archived == '1') items.push({label: kanbanLang.archiveCard, icon: 'card-archive', url: createLink('kanban', 'archiveCard', 'cardID=' + card.id), attrs: {'target': 'hiddenwin'}});
if(privs.includes('copyCard')) items.push({label: kanbanLang.copyCard, icon: 'copy', url: createLink('kanban', 'copyCard', 'cardID=' + card.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal'}});
if(privs.includes('deleteCard')) items.push({label: kanbanLang.deleteCard, icon: 'trash', url: createLink('kanban', 'deleteCard', 'cardID=' + card.id), attrs: {'target': 'hiddenwin'}});

View File

@@ -27,6 +27,8 @@ $lang->kanban->sortColumn = 'Sort Column';
$lang->kanban->deleteColumn = 'Delete Column';
$lang->kanban->createCard = 'Create Card';
$lang->kanban->editCard = 'Edit Card';
$lang->kanban->finishCard = 'Finish Card';
$lang->kanban->activateCard = 'Activate Card';
$lang->kanban->viewCard = 'View Card';
$lang->kanban->archiveCard = 'Archive Card';
$lang->kanban->sortCard = 'Sort Card';
@@ -37,7 +39,7 @@ $lang->kanban->setCardColor = 'Set Card Color';
$lang->kanban->deleteCard = 'Delete Card';
$lang->kanban->assigntoCard = 'Assign';
$lang->kanban->setting = 'Setting';
$lang->kanban->setDoneFunction = 'Set done function';
$lang->kanban->performable = 'Set done function';
$lang->kanban->doneFunction = 'Done function';
$lang->kanban->splitColumn = 'Split Column';
$lang->kanban->createColumnOnLeft = 'Create Column On Left';

View File

@@ -27,6 +27,8 @@ $lang->kanban->sortColumn = '看板列排序';
$lang->kanban->deleteColumn = '删除看板列';
$lang->kanban->createCard = '创建卡片';
$lang->kanban->editCard = '编辑卡片';
$lang->kanban->finishCard = '完成卡片';
$lang->kanban->activateCard = '激活卡片';
$lang->kanban->viewCard = '查看卡片';
$lang->kanban->archiveCard = '归档卡片';
$lang->kanban->sortCard = '卡片排序';
@@ -37,7 +39,7 @@ $lang->kanban->setCardColor = '设置卡片颜色';
$lang->kanban->deleteCard = '删除卡片';
$lang->kanban->assigntoCard = '指派';
$lang->kanban->setting = '设置';
$lang->kanban->setDoneFunction = '设置完成功能';
$lang->kanban->performable = '设置完成功能';
$lang->kanban->doneFunction = '完成功能';
$lang->kanban->splitColumn = '新增子看板列';
$lang->kanban->createColumnOnLeft = '左侧新增看板列';

View File

@@ -944,7 +944,7 @@ class kanbanModel extends model
->andWhere('type')->eq('common')
->fetchAll();
$actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard');
$actions = array('editCard', 'finishCard', 'activateCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard');
$cardGroup = array();
foreach($cellList as $cell)
{
@@ -2611,7 +2611,7 @@ class kanbanModel extends model
$actions .= "<div class='btn-group'>";
$actions .= "<a href='javascript:fullScreen();' id='fullScreenBtn' class='btn btn-link'><i class='icon icon-fullscreen'></i> {$this->lang->kanban->fullScreen}</a>";
$printSettingBtn = (common::hasPriv('kanban', 'createRegion') or $printSetHeight or common::hasPriv('kanban', 'setDoneFunction') or common::hasPriv('kanban', 'edit') or common::hasPriv('kanban', 'close') or common::hasPriv('kanban', 'delete'));
$printSettingBtn = (common::hasPriv('kanban', 'createRegion') or $printSetHeight or common::hasPriv('kanban', 'performable') or common::hasPriv('kanban', 'edit') or common::hasPriv('kanban', 'close') or common::hasPriv('kanban', 'delete'));
if($printSettingBtn)
{
@@ -2625,7 +2625,7 @@ class kanbanModel extends model
$actions .= '<li>' . html::a(helper::createLink('kanban', 'setLaneHeight', "kanbanID=$kanban->id", '', true), '<i class="icon icon-size-height"></i>' . $this->lang->kanban->laneHeight, '', "class='iframe btn btn-link' data-width='$width'") . '</li>';
}
if(common::hasPriv('kanban', 'setDoneFunction')) $actions .= '<li>' . html::a(helper::createLink('kanban', 'setDoneFunction', "kanbanID=$kanban->id", '', true), '<i class="icon icon-checked"></i>' . $this->lang->kanban->doneFunction, '', "class='iframe btn btn-link'") . '</li>';
if(common::hasPriv('kanban', 'performable')) $actions .= '<li>' . html::a(helper::createLink('kanban', 'performable', "kanbanID=$kanban->id", '', true), '<i class="icon icon-checked"></i>' . $this->lang->kanban->doneFunction, '', "class='iframe btn btn-link'") . '</li>';
$kanbanActions = '';
$attr = $kanban->status == 'closed' ? "disabled='disabled'" : '';
@@ -2634,7 +2634,7 @@ class kanbanModel extends model
if(common::hasPriv('kanban', 'delete')) $kanbanActions .= '<li>' . html::a(helper::createLink('kanban', 'delete', "kanbanID=$kanban->id"), '<i class="icon icon-trash"></i>' . $this->lang->kanban->delete, 'hiddenwin', "class='btn btn-link'") . '</li>';
if($kanbanActions)
{
$actions .= ((common::hasPriv('kanban', 'createRegion') or $printSetHeight or common::hasPriv('kanban', 'setDoneFunction')) and (common::hasPriv('kanban', 'edit') or common::hasPriv('kanban', 'close') or common::hasPriv('kanban', 'delete'))) ? "<div class='divider'></div>" . $kanbanActions : $kanbanActions;
$actions .= ((common::hasPriv('kanban', 'createRegion') or $printSetHeight or common::hasPriv('kanban', 'performable')) and (common::hasPriv('kanban', 'edit') or common::hasPriv('kanban', 'close') or common::hasPriv('kanban', 'delete'))) ? "<div class='divider'></div>" . $kanbanActions : $kanbanActions;
}
$actions .= "</ul>";
}

View File

@@ -1,12 +1,12 @@
<?php
/**
* The setdonefunction file of kanban module of ZenTaoPMS.
* The performable file of kanban module of ZenTaoPMS.
*
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yue Ma <mayue@easycorp.ltd>
* @package kanban
* @version $Id: setdonefunction.html.php 935 2022-01-1 14:20:24Z $
* @version $Id: performable.html.php 935 2022-01-1 14:20:24Z $
* @link https://www.zentao.net
*/
?>
@@ -14,7 +14,7 @@
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
<h2><?php echo $lang->kanban->setDoneFunction;?></h2>
<h2><?php echo $lang->kanban->performable;?></h2>
</div>
<form class='main-form form-ajax' method='post' enctype='multipart/form-data' id='dataform'>
<table class='table table-form'>

View File

@@ -39,12 +39,19 @@
//common::printLink('kanban', 'assigntoCard', "cardID=$card->id", "<i class='icon icon-hand-right'></i><span class='text'>{$lang->kanbancard->assign}</span>", '', "class='btn btn-link iframe' title='{$lang->kanbancard->assign}'", true, true);
if($kanban->archived)
{
common::printLink('kanban', 'archiveCard', "cardID=$card->id", "<i class='icon icon-ban-circle'></i><span class='text'>{$lang->kanbancard->archive}</span>", 'hiddenwin', "class='btn btn-link' title='{$lang->kanbancard->archive}'", true, true);
common::printLink('kanban', 'archiveCard', "cardID=$card->id", "<i class='icon icon-ban-circle'></i><span class='text'>{$lang->kanbancard->archive}</span>", 'hiddenwin', "class='btn btn-link' title='{$lang->kanbancard->archive}'", true, true);
echo "<div class='divider'></div>";
}
common::printLink('kanban', 'editCard', "cardID=$card->id", '<i class="icon icon-edit"></i>', '', "class='btn btn-link iframe' data-width='80%' title='{$lang->kanbancard->edit}'", true, true);
if($kanban->performable)
{
if($card->status == 'done') common::printLink('kanban', 'activateCard', "cardID={$card->id}&kanbanID={$kanban->id}", '<i class="icon icon-magic"></i>', '', "class='btn btn-link iframe' title='{$lang->kanban->activateCard}'", true, true);
if($card->status == 'doing') common::printLink('kanban', 'finishCard', "cardID={$card->id}&kanbanID={$kanban->id}", '<i class="icon icon-checked"></i>', '', "class='btn btn-link iframe' title='{$lang->kanban->finishCard}'", true, true);
}
common::printLink('kanban', 'copyCard', "cardID=$card->id", '<i class="icon icon-copy"></i>', '', "class='btn btn-link iframe' title='{$lang->kanbancard->copy}'", true, true);
common::printLink('kanban', 'deleteCard', "cardID=$card->id", '<i class="icon icon-trash"></i>', 'hiddenwin', "class='btn btn-link' title='{$lang->kanbancard->delete}'",true, true);
?>