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

Sprint/183 xt card

See merge request easycorp/zentaopms!1587
This commit is contained in:
孙广明
2022-01-25 03:19:35 +00:00
10 changed files with 276 additions and 54 deletions
+3 -3
View File
@@ -46,9 +46,9 @@ $config->kanban->editor->viewcard = array('id' => 'comment', 'tools' => 'simp
$config->kanban->fromType = array('execution', 'productplan', 'release', 'build');
$config->kanban->executionField = array('name', 'status', 'end', 'PM', 'type', 'deleted');
$config->kanban->productplanField = array();
$config->kanban->releaseField = array();
$config->kanban->buildField = array();
$config->kanban->productplanField = array('title', 'status', 'begin', 'end', 'deleted');
$config->kanban->releaseField = array('name', 'status', 'date', 'deleted');
$config->kanban->buildField = array('name', 'date', 'builder', 'deleted');
$config->kanban->default = new stdclass();
$config->kanban->default->story = new stdclass();
+14 -12
View File
@@ -12,7 +12,7 @@
#kanbanContainer {padding-bottom: 0; margin-bottom: 0;}
#kanbanContainer.fullscreen {overflow: auto;}
.region {border: 1px solid #dcdcdc; background-color: #fff;}
.region {border: 1px solid #dcdcdc; background-color: #fff; overflow: scroll;}
.region + .region {margin-top: 20px;}
.region .region-header {padding: 10px;}
.region .region-header span {font-size: 14px; color: #999EAB}
@@ -102,15 +102,17 @@
.gray .actions {display:none;}
.kanban-card .header .executionName {display: flex; width: 100%; float: left; white-space: nowrap; overflow: hidden;}
.kanban-card .header .executionName .title {padding-right: 0px; margin-right: 5px; white-space: nowrap; overflow: hidden;}
.kanban-card .header .executionName .title .icon {padding-right: 5px;}
.kanban-card .header .executionName .title, .releaseTitle, .productplanTitle {padding-right: 0px; margin-right: 5px; white-space: nowrap; overflow: hidden;}
.kanban-card .header .executionName > span {flex: none;}
.execInfo {margin-top: 23px;}
.execInfo .execStatus{margin-right: 20px;}
.execInfo .label-wait {background: #EFEFEF !important; color: #838A9D;}
.execInfo .label-doing {background: #f8d2d2 !important; color: #e64b4c;}
.execInfo .label-suspended {background: #fff3d9 !important; color: #ff9800;}
.execInfo .label-closed {background: #e5e5e5 !important; color: #b8b8b8;}
.execInfo .label-deleted {background: #ff5d5d !important; color: #fff;}
.region .kanban-item > .kanban-card > .execInfo > .user {position: absolute; right: 10px; bottom: -2px}
.region .kanban-item > .kanban-card > .execInfo > .user > .avatar {display: inline-block; width: 24px; height: 24px; line-height: 24px; margin-right: 0px; margin-left: 2px}
.execInfo, .releaseInfo, .productplanInfo {margin-top: 23px;}
.label-wait {background: #EFEFEF !important; color: #838A9D;}
.label-doing {background: #f8d2d2 !important; color: #e64b4c;}
.label-suspended {background: #fff3d9 !important; color: #ff9800;}
.label-future {background: #EFEFEF !important; color: #838A9D; border-radius: 9px}
.label-closed, .label-terminate {background: #e5e5e5 !important; color: #b8b8b8;}
.label-deleted {background: #ff5d5d !important; color: #fff;}
.label-normal {background: #e1e8d9 !important; color: #9abe76;}
.region .kanban-item > .kanban-card > .execInfo > .user, .region .kanban-item > .kanban-card > .releaseInfo > .user, .region .kanban-item > .kanban-card > .productplanInfo > .user {position: absolute; right: 10px; bottom: -2px}
.region .kanban-item > .kanban-card > .execInfo > .user > .avatar, .region .kanban-item > .kanban-card > .releaseInfo > .user > .avatar, .region .kanban-item > .kanban-card > .productplanInfo > .user > .avatar {display: inline-block; width: 24px; height: 24px; line-height: 24px; margin-right: 0px; margin-left: 2px}
.kanban-card .releaseTitle .icon, .kanban-card .title .icon, .kanban-card .productplanTitle .icon, .kanban-card .title .icon {padding-right: 5px;}
.kanban-card .releaseTitle, .kanban-card .productplanTitle {width: 100%; float: left;}
+196 -6
View File
@@ -280,6 +280,18 @@ function renderKanbanItem(item, $item)
{
renderExecutionItem(item, $item);
}
else if(item.fromType == 'release')
{
renderReleaseItem(item, $item);
}
else if(item.fromType == 'build')
{
renderBuildItem(item, $item);
}
else if(item.fromType == 'productplan')
{
renderProductplanItem(item, $item);
}
else
{
var $title = $item.children('.title');
@@ -457,9 +469,187 @@ function renderExecutionItem(item, $item)
/* Display avatars of PM. */
var $user = $info.children('.user');
var user = [item.PM];
if(!$user.length) $user = $('<div class="user"></div>').appendTo($info);
if(users[item.PM])
{
if(!$user.length) $user = $('<div class="user"></div>').appendTo($info);
$user.html(renderUsersAvatar(user, item.id)).attr('title', users[item.PM]);
}
}
$user.html(renderUsersAvatar(user, item.id)).attr('title', item.PM);
/**
* Render plan item.
*
* @param object item
* @param object $item
* @access public
* @return void
*/
function renderReleaseItem(item, $item)
{
var privs = item.actions;
/* Print name. */
var $title = $item.children('.releaseTitle');
if(!$title.length)
{
if(privs.includes('viewRelease') && item.deleted == '0') $title = $('<a class="releaseTitle"><i class="icon icon-flag"></i>' + item.name + '</a>').appendTo($item).attr('href', createLink('release', 'view', 'releaseID=' + item.fromID));
if(!privs.includes('viewRelease') || item.deleted == '1') $title = $('<a class="releaseTitle"><i class="icon icon-flag"></i>' + item.name + '</a>').appendTo($item);
}
$title.attr('title', item.name);
var $info = $item.children('.releaseInfo');
if(!$info.length) $info = $(
[
'<div class="releaseInfo">',
'</div>'
].join('')).appendTo($item);
var $statusBox = $info.children('.releaseStatus');
if(!$statusBox.length)
{
if(item.deleted == '0')
{
$statusBox = $('<span class="releaseStatus label label-' + item.status + '">' + releaseLang.statusList[item.status] + '</span>').appendTo($info);
}
else
{
$statusBox = $('<span class="releaseStatus label label-deleted">' + releaseLang.deleted + '</span>').appendTo($info);
}
}
/* Display release date. */
var $date = $info.children('.date');
var releaseDate = $.zui.createDate(item.date);
if(!$date.length) $date = $('<span class="date label label-wait"></span>').appendTo($info);
$date.text($.zui.formatDate(releaseDate, 'yyyy-MM-dd')).attr('title', $.zui.formatDate(releaseDate, 'yyyy-MM-dd')).show();
/* Display avatars of creator. */
var $user = $info.children('.user');
var user = [item.createdBy];
if(users[item.createdBy])
{
if(!$user.length) $user = $('<div class="user"></div>').appendTo($info);
$user.html(renderUsersAvatar(user, item.id)).attr('title', users[item.createdBy]);
}
}
/**
* Render product plan item.
*
* @param object item
* @param object $item
* @access public
* @return void
*/
function renderProductplanItem(item, $item)
{
var privs = item.actions;
/* Print name. */
var $title = $item.children('.productplanTitle');
if(!$title.length)
{
if(privs.includes('viewPlan') && item.deleted == '0') $title = $('<a class="productplanTitle"><i class="icon icon-delay"></i>' + item.title + '</a>').appendTo($item).attr('href', createLink('productplan', 'view', 'productplanID=' + item.fromID));
if(!privs.includes('viewPlan') || item.deleted == '1') $title = $('<a class="productplanTitle"><i class="icon icon-delay"></i>' + item.title + '</a>').appendTo($item);
}
$title.attr('title', item.title);
var $info = $item.children('.productplanInfo');
if(!$info.length) $info = $(
[
'<div class="productplanInfo">',
'</div>'
].join('')).appendTo($item);
var $statusBox = $info.children('.productplanStatus');
if(!$statusBox.length)
{
if(item.deleted == '0')
{
$statusBox = $('<span class="productplanStatus label label-' + item.status + '">' + productplanLang.statusList[item.status] + '</span>').appendTo($info);
}
else
{
$statusBox = $('<span class="productplanStatus label label-deleted">' + productplanLang.deleted + '</span>').appendTo($info);
}
}
/* Display date of product plan. */
var $date = $info.children('.date');
var begin = $.zui.createDate(item.begin);
var end = $.zui.createDate(item.end);
var today = new Date();
var labelType = end.toLocaleDateString() == today.toLocaleDateString() ? 'danger' : 'wait';
var labelTitle = $.zui.formatDate(begin, 'MM-dd') + ' ' + productplanLang.to + ' ' + $.zui.formatDate(end, 'MM-dd');
if((item.begin == '2030-01-01' || item.end == '2030-01-01'))
{
labelType = 'future';
labelTitle = productplanLang.future;
}
if(!$date.length) $date = $('<span class="date label label-' + labelType + '"></span>').appendTo($info);
$date.text(labelTitle).attr('title', labelTitle).show();
/* Display avatars of creator. */
var $user = $info.children('.user');
var user = [item.createdBy];
if(users[item.createdBy])
{
if(!$user.length) $user = $('<div class="user"></div>').appendTo($info);
$user.html(renderUsersAvatar(user, item.id)).attr('title', users[item.createdBy]);
}
}
/**
* Render build item.
*
* @param object item
* @param object $item
* @access public
* @return void
*/
function renderBuildItem(item, $item)
{
var privs = item.actions;
/* Print name. */
var $title = $item.children('.title');
if(!$title.length)
{
if(privs.includes('viewBuild') && item.deleted == '0') $title = $('<a class="title"><i class="icon icon-code"></i>' + item.name + '</a>').appendTo($item).attr('href', createLink('build', 'view', 'buildID=' + item.fromID));
if(!privs.includes('viewBuild') || item.deleted == '1') $title = $('<a class="title"><i class="icon icon-code"></i>' + item.name + '</a>').appendTo($item);
}
$title.attr('title', item.name);
var $info = $item.children('.info');
if(!$info.length) $info = $(
[
'<div class="info">',
'</div>'
].join('')).appendTo($item);
var $statusBox = $info.children('.buildStatus');
if(!$statusBox.length && item.deleted == '1')
{
$statusBox = $('<span class="buildStatus label label-deleted">' + productplanLang.deleted + '</span>').appendTo($info);
}
/* Display build date. */
var $date = $info.children('.date');
var buildDate = $.zui.createDate(item.date);
if(!$date.length) $date = $('<span class="date label label-wait"></span>').appendTo($info);
$date.text($.zui.formatDate(buildDate, 'yyyy-MM-dd')).attr('title', $.zui.formatDate(buildDate, 'yyyy-MM-dd')).show();
/* Display avatars of creator. */
var $user = $info.children('.user');
var user = [item.builder];
if(users[item.builder])
{
if(!$user.length) $user = $('<div class="user"></div>').appendTo($info);
$user.html(renderUsersAvatar(user, item.id)).attr('title', users[item.builder]);
}
}
/**
@@ -1099,10 +1289,10 @@ $(function()
var columnID = $(this).closest('.kanban-col').data('id');
/* The submenu of import. */
var importPlanLink = kanban.object.indexOf('plan') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importPlan', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID, '', true) + "'>" + kanbanLang.importPlan + '</a></li>' : '';
var importReleaseLink = kanban.object.indexOf('release') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importRelease', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID, '', true) + "'>" + kanbanLang.importRelease + '</a></li>' : '';
var importExecutionLink = kanban.object.indexOf('execution') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importExecution', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID, '', true) + "'>" + kanbanLang.importExecution + '</a></li>' : '';
var importBuildLink = kanban.object.indexOf('build') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importBuild', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID, '', true) + "'>" + kanbanLang.importBuild + '</a></li>' : '';
var importPlanLink = kanban.object.indexOf('plan') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importPlan', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importPlan + '</a></li>' : '';
var importReleaseLink = kanban.object.indexOf('release') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importRelease', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importRelease + '</a></li>' : '';
var importExecutionLink = kanban.object.indexOf('execution') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importExecution', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importExecution + '</a></li>' : '';
var importBuildLink = kanban.object.indexOf('build') != -1 ? "<li><a class='iframe' data-toggle='modal' data-width='80%' href='" + createLink('kanban', 'importBuild', 'kanbanID=' + kanban.id + '&regionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importBuild + '</a></li>' : '';
var importSubmenu = '<ul class="dropdown-menu">' + importPlanLink + importReleaseLink + importExecutionLink + importBuildLink +'</ul>';
$('.import').parent().append(importSubmenu);
+49 -23
View File
@@ -523,14 +523,17 @@ class kanbanModel extends model
$targetLaneID = $data->targetLane;
$objectCards = array();
$now = helper::now();
foreach($objectIDList as $objectID)
{
$cardData = new stdClass();
$cardData->kanban = $kanbanID;
$cardData->region = $regionID;
$cardData->group = $groupID;
$cardData->fromID = $objectID;
$cardData->fromType = $objectType;
$cardData->kanban = $kanbanID;
$cardData->region = $regionID;
$cardData->group = $groupID;
$cardData->fromID = $objectID;
$cardData->fromType = $objectType;
$cardData->createdBy = $this->app->user->account;
$cardData->createdDate = $now;
$this->dao->insert(TABLE_KANBANCARD)->data($cardData)->exec();
$cardID = $this->dao->lastInsertID();
@@ -1032,8 +1035,7 @@ class kanbanModel extends model
->andWhere('type')->eq('common')
->fetchAll();
$actions = array('editCard', 'finishCard', 'activateCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution');
$actions = array('editCard', 'finishCard', 'activateCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild');
$cardGroup = array();
foreach($cellList as $cell)
{
@@ -1051,13 +1053,17 @@ class kanbanModel extends model
$card->actions = array();
foreach($actions as $action)
{
if($action == 'viewExecution')
if(in_array($action, array('viewExecution', 'viewPlan', 'viewRelease', 'viewBuild')))
{
if($card->fromType == 'execution')
{
if($card->execType == 'kanban' and common::hasPriv('execution', 'kanban')) $card->actions[] = $action;
if($card->execType != 'kanban' and common::hasPriv('execution', 'view')) $card->actions[] = $action;
}
else
{
if(common::hasPriv($fromType, 'view')) $card->actions[] = $action;
}
continue;
}
if(common::hasPriv('kanban', $action)) $card->actions[] = $action;
@@ -1081,38 +1087,58 @@ class kanbanModel extends model
*/
public function getImportedCards($kanbanID, $cards, $fromType)
{
/* Get imported cards based on imported object type. */
$objectCards = $this->dao->select('*')->from(TABLE_KANBANCARD)
->where('deleted')->eq(0)
->andWhere('kanban')->eq($kanbanID)
->andWhere('archived')->eq(0)
->andWhere('fromType')->eq($fromType)
->fetchAll('fromID');
->fetchGroup('fromID', 'id');
if(!empty($objectCards))
{
/* Get imported objects. */
$table = $this->config->objectTables[$fromType];
$objects = $this->dao->select('*')->from($table)
->where('id')->in(array_keys($objectCards))
->fetchAll('id');
foreach($objectCards as $objectCard)
if($fromType == 'productplan' or $fromType == 'release')
{
$object = $objects[$objectCard->fromID];
$fieldType = $fromType . 'Field';
$creators = $this->dao->select('objectID, actor')->from(TABLE_ACTION)
->where('objectID')->in(array_keys($objectCards))
->andWhere('objectType')->eq($fromType)
->andWhere('action')->eq('opened')
->fetchPairs();
}
foreach($this->config->kanban->$fieldType as $field) $objectCard->$field = $object->$field;
if($fromType =='execution')
/* Data for constructing the card. */
foreach($objectCards as $objectID => $cardsInfo)
{
foreach($cardsInfo as $cardID => $objectCard)
{
if($object->status != 'done' and $object->status != 'closed' and $object->status != 'suspended')
{
$delay = helper::diffDate(helper::today(), $object->end);
if($delay > 0) $objectCard->delay = $delay;
}
$objectCard->execType = $object->type;
}
$object = $objects[$objectID];
$fieldType = $fromType . 'Field';
$cards[$objectCard->id] = $objectCard;
foreach($this->config->kanban->$fieldType as $field) $objectCard->$field = $object->$field;
if($fromType == 'productplan' or $fromType == 'release')
{
$objectCard->createdBy = zget($creators, $object->id, '');
}
if($fromType =='execution')
{
if($object->status != 'done' and $object->status != 'closed' and $object->status != 'suspended')
{
$delay = helper::diffDate(helper::today(), $object->end);
if($delay > 0) $objectCard->delay = $delay;
}
$objectCard->execType = $object->type;
}
$cards[$cardID] = $objectCard;
}
}
}
return $cards;
+2 -2
View File
@@ -24,11 +24,11 @@
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedProject;?></h4></div>
<div class='table-col'><?php echo html::select('project', $projects, $selectedProjectID, "onchange='reloadObjectList(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('project', $projects, $selectedProjectID, "onchange='reloadObjectList(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedLane;?></h4></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importBuildForm'>
<table class='table table-fixed' id='buildList'>
+2 -2
View File
@@ -24,11 +24,11 @@
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedKanban;?></h4></div>
<div class='table-col'><?php echo html::select('kanban', $kanbanPairs, $selectedKanbanID, "onchange='reloadObjectList(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('kanban', $kanbanPairs, $selectedKanbanID, "onchange='reloadObjectList(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedLane;?></h4></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importCardForm'>
<table class='table table-fixed' id='cardList'>
+2 -2
View File
@@ -24,11 +24,11 @@
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedProject;?></h4></div>
<div class='table-col'><?php echo html::select('project', $projects, $selectedProjectID, "onchange='reloadObjectList(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('project', $projects, $selectedProjectID, "onchange='reloadObjectList(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedLane;?></h4></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importExecutionForm'>
<table class='table table-fixed' id='executionList'>
+2 -2
View File
@@ -24,11 +24,11 @@
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedProduct;?></h4></div>
<div class='table-col'><?php echo html::select('product', $products, $selectedProductID, "onchange='reloadObjectList(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('product', $products, $selectedProductID, "onchange='reloadObjectList(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedLane;?></h4></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importPlanForm'>
<table class='table table-fixed' id='planList'>
+2 -2
View File
@@ -24,11 +24,11 @@
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedProduct;?></h4></div>
<div class='table-col'><?php echo html::select('product', $products, $selectedProductID, "onchange='reloadObjectList(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('product', $products, $selectedProductID, "onchange='reloadObjectList(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<div class='table-row p-10px'>
<div class='table-col w-150px text-center'><h4><?php echo $lang->kanban->selectedLane;?></h4></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen'");?></div>
<div class='table-col'><?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen' data-drop_direction='down'");?></div>
</div>
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importReleaseForm'>
<table class='table table-fixed' id='releaseList'>
+4
View File
@@ -15,6 +15,8 @@
<?php
$app->loadLang('execution');
$app->loadLang('release');
$app->loadLang('productplan');
$laneCount = 0;
foreach($regions as $region) $laneCount += $region->laneCount;
@@ -25,6 +27,8 @@ js::set('kanbanlaneLang', $lang->kanbanlane);
js::set('kanbancolumnLang', $lang->kanbancolumn);
js::set('kanbancardLang', $lang->kanbancard);
js::set('executionLang', $lang->execution);
js::set('releaseLang', $lang->release);
js::set('productplanLang', $lang->productplan);
js::set('kanbanID', $kanban->id);
js::set('laneCount', $laneCount);
js::set('userList', $userList);