custom->requiredModules as $requiredModule)
+ $reruiredModules = ksort($config->custom->requiredModules);
+ foreach($requiredModules as $requiredModule)
{
$requiredModuleName = zget($lang->custom->moduleName, $requiredModule, $lang->$requiredModule->common);
echo html::a(inlink('required', "module=$requiredModule"), $requiredModuleName, '', "id='{$requiredModule}Tab'");
diff --git a/module/doc/control.php b/module/doc/control.php
old mode 100644
new mode 100755
index 89c931c78e..101676c2de
--- a/module/doc/control.php
+++ b/module/doc/control.php
@@ -792,6 +792,28 @@ class doc extends control
return print($select);
}
+ /**
+ * Ajax get docs by lib.
+ *
+ * @param int $libID
+ * @access public
+ * @return void
+ */
+ public function ajaxGetDocs($libID)
+ {
+ if(!$libID) return print(html::select('doc', '', '', "class='form-control chosen'"));
+
+ $docIdList = $this->doc->getPrivDocs($libID, 0);
+ $docs = $this->dao->select('id, title')->from(TABLE_DOC)
+ ->where('lib')->eq($libID)
+ ->andWhere('deleted')->eq(0)
+ ->andWhere('id')->in($docIdList)
+ ->orderBy('`order` asc')
+ ->fetchPairs();
+
+ return print(html::select('doc', $docs, '', "class='form-control chosen'"));
+ }
+
/**
* Ajax save draft.
*
diff --git a/module/execution/control.php b/module/execution/control.php
index e89d613e03..6c0e162839 100644
--- a/module/execution/control.php
+++ b/module/execution/control.php
@@ -3820,17 +3820,18 @@ class execution extends control
* @param string $browseType
* @param string $groupBy
* @param string $from execution|RD
+ * @param string $searchValue
* @access public
* @return array
*/
- public function ajaxUpdateKanban($executionID = 0, $enterTime = '', $browseType = '', $groupBy = '', $from = 'execution')
+ public function ajaxUpdateKanban($executionID = 0, $enterTime = '', $browseType = '', $groupBy = '', $from = 'execution', $searchValue = '')
{
$enterTime = date('Y-m-d H:i:s', $enterTime);
$lastEditedTime = $this->dao->select("max(lastEditedTime) as lastEditedTime")->from(TABLE_KANBANLANE)->where('execution')->eq($executionID)->fetch('lastEditedTime');
- if($lastEditedTime > $enterTime or $groupBy != 'default')
+ if($lastEditedTime > $enterTime or $groupBy != 'default' or !empty($searchValue))
{
- $kanbanGroup = $from == 'execution' ? $this->loadModel('kanban')->getExecutionKanban($executionID, $browseType, $groupBy) : $this->loadModel('kanban')->getRDKanban($executionID, $browseType, 'id_asc', 0, $groupBy);
+ $kanbanGroup = $from == 'execution' ? $this->loadModel('kanban')->getExecutionKanban($executionID, $browseType, $groupBy) : $this->loadModel('kanban')->getRDKanban($executionID, $browseType, 'id_asc', 0, $groupBy, $searchValue);
return print(json_encode($kanbanGroup));
}
}
diff --git a/module/execution/css/kanban.css b/module/execution/css/kanban.css
index bb8b8d5bbd..8c3aff303c 100644
--- a/module/execution/css/kanban.css
+++ b/module/execution/css/kanban.css
@@ -110,3 +110,7 @@
#mainMenu .divider {margin: 10px}
.modal-header {padding: 15px 0;}
+#rdKanbanSearch.input-group {float: left; width: min-content;}
+#rdKanbanSearchInput {width: 150px;}
+#rdSearchBox {display: none; width: 150px;}
+.btn-link.querybox-toggle {background-color: rgba(0,0,0,0);}
diff --git a/module/execution/css/taskkanban.css b/module/execution/css/taskkanban.css
index 0127f0157c..166278d2f0 100644
--- a/module/execution/css/taskkanban.css
+++ b/module/execution/css/taskkanban.css
@@ -54,7 +54,7 @@
#type_chosen .icon-kanban {padding-right: 10px; font-size: 15px;}
.dropdown-menu a {text-align: left;}
-.scrollbar-hover {max-height: 2000px; overflow: scroll !important;}
+.scrollbar-hover {overflow: scroll !important;}
.c-type {width: 150px !important; overflow: unset;}
.c-group {width: 190px !important; overflow: unset;}
.c-type {margin-left: 0px !important;}
diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js
index 0ae0cece62..5c143b7fc3 100644
--- a/module/execution/js/kanban.js
+++ b/module/execution/js/kanban.js
@@ -478,7 +478,8 @@ function renderStoryItem(item, $item, col)
.attr('href', $.createLink('story', 'view', 'storyID=' + item.id + '&version=0¶m=' + execution.id, '', true)).attr('data-toggle', 'modal').attr('data-width', '95%');
$title.appendTo($item);
}
- $title.attr('title', item.title).find('.text').text(item.title);
+ var title = rdSearchValue != '' ? "
" + item.title.replaceAll(rdSearchValue, "" + rdSearchValue + "") + "": "
" + item.title + "";
+ $title.attr('title', item.title).find('.text').replaceWith(title);
}
if(scaleSize <= 2)
@@ -542,7 +543,8 @@ function renderBugItem(item, $item, col)
.attr('href', $.createLink('bug', 'view', 'bugID=' + item.id, '', true)).attr('data-toggle', 'modal').attr('data-width', '80%');
$title.appendTo($item);
}
- $title.attr('title', item.title).find('.text').text(item.title);
+ var title = rdSearchValue != '' ? "
" + item.title.replaceAll(rdSearchValue, "" + rdSearchValue + "") + "": "
" + item.title + "";
+ $title.attr('title', item.title).find('.text').replaceWith(title);
}
if(scaleSize <= 2)
@@ -608,7 +610,8 @@ function renderTaskItem(item, $item, col)
.attr('href', $.createLink('task', 'view', 'taskID=' + item.id, '', true)).attr('data-toggle', 'modal').attr('data-width', '80%');
$title.appendTo($item);
}
- $title.attr('title', item.name).find('.text').text(item.name);
+ var name = rdSearchValue != '' ? "
" + item.name.replaceAll(rdSearchValue, "" + rdSearchValue + "") + "": "
" + item.name + "";
+ $title.attr('title', item.name).find('.text').replaceWith(name);
}
if(scaleSize <= 2)
@@ -792,6 +795,16 @@ function updateRegion(regionID, regionData = [])
if(!regionData) regionData = regions[regionID];
var data = groupBy == 'default' ? regionData.groups : regionData;
+ if(data == null)
+ {
+ $("div[data-id^=" + regionID + "].region").hide();
+ return false;
+ }
+ else
+ {
+ $("div[data-id^=" + regionID + "].region").show();
+ }
+ $region.empty();
$region.data('zui.kanban').render(data);
resetRegionHeight('open');
return true;
@@ -1504,7 +1517,7 @@ $(function()
var lastUpdateData;
setInterval(function()
{
- $.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=" + entertime + "&browseType=" + browseType + "&groupBy=" + groupBy + '&from=RD'), function(data)
+ $.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=" + entertime + "&browseType=" + browseType + "&groupBy=" + groupBy + '&from=RD&searchValue' + rdSearchValue), function(data)
{
if(data && lastUpdateData !== data)
{
@@ -1580,3 +1593,58 @@ function resetRegionHeight(fold)
$('.region').css('height', regionHeaderHeight);
}
}
+
+/**
+ * Toggle RDSearchBox.
+ *
+ * @access public
+ * @return void
+ */
+function toggleRDSearchBox()
+{
+ rdSearchValue = '';
+ $('#rdSearchBox').toggle();
+ if($('#rdSearchBox').css('display') == 'block')
+ {
+ $(".querybox-toggle").css("color", "#0c64eb");
+ }
+ else
+ {
+ $(".querybox-toggle").css("color", "");
+ $('#rdKanbanSearchInput').attr('value', '');
+ searchCards('');
+ }
+}
+
+/**
+ * Search all cards.
+ *
+ * @param string $value
+ * @access public
+ * @return void
+ */
+function searchCards(value)
+{
+ rdSearchValue = value;
+ $.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=0&browseType=" + browseType + "&groupBy=" + groupBy + '&from=RD&searchValue=' + value), function(data)
+ {
+ var kanbanData = $.parseJSON(data);
+ var hideAll = true;
+ $('#kanban').children('.region').children("div[id^='kanban']").each(function()
+ {
+ var regionID = $(this).attr('data-id');
+ if(kanbanData != null) data = groupBy == 'default' ? kanbanData[regionID] : kanbanData[groupBy];
+
+ hideAll = hideAll && !updateRegion(regionID, data);
+ });
+
+ if(hideAll && rdSearchValue != '')
+ {
+ if($('.table-empty-tip').length == 0) $('#kanban').append('
');
+ }
+ else
+ {
+ $('.table-empty-tip').remove();
+ }
+ });
+}
diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php
index a4b945d24e..a6653e2522 100644
--- a/module/execution/lang/en.php
+++ b/module/execution/lang/en.php
@@ -396,6 +396,7 @@ $lang->execution->projectNotEmpty = 'Project cannot be empty.';
$lang->execution->confirmStoryToTask = $lang->SRCommon . '%s are converted to tasks in the current. Do you want to convert them anyways?';
$lang->execution->ge = "『%s』should be >= actual begin『%s』.";
$lang->execution->storyDragError = "The {$lang->SRCommon} is still a draft or has been changed, please drag it after the review";
+$lang->execution->pleaseInput = "Enter";
/* Statistics. */
$lang->execution->charts = new stdclass();
diff --git a/module/execution/lang/zh-cn.php b/module/execution/lang/zh-cn.php
index 66c76615ea..42264d001a 100644
--- a/module/execution/lang/zh-cn.php
+++ b/module/execution/lang/zh-cn.php
@@ -396,6 +396,7 @@ $lang->execution->projectNotEmpty = '所属项目不能为空。';
$lang->execution->confirmStoryToTask = '%s' . $lang->SRCommon . '已经在当前' . $lang->execution->common . '中转了任务,请确认是否重复转任务。';
$lang->execution->ge = "『%s』应当不小于实际开始时间『%s』。";
$lang->execution->storyDragError = "该{$lang->SRCommon}还是草稿或已变更状态,请评审通过后再拖动";
+$lang->execution->pleaseInput = "请输入";
/* 统计。*/
$lang->execution->charts = new stdclass();
diff --git a/module/execution/model.php b/module/execution/model.php
index 2e19ffa8a4..e39021bc1f 100644
--- a/module/execution/model.php
+++ b/module/execution/model.php
@@ -818,9 +818,11 @@ class executionModel extends model
->setDefault('status', 'doing')
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', $now)
+ ->stripTags($this->config->execution->editor->start['id'], $this->config->allowedTags)
->remove('comment')
->get();
+ $execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->start['id'], $this->post->uid);
$this->dao->update(TABLE_EXECUTION)->data($execution)
->autoCheck()
->check($this->config->execution->start->requiredFields, 'notempty')
@@ -849,6 +851,7 @@ class executionModel extends model
$execution = fixer::input('post')
->add('id', $executionID)
+ ->stripTags($this->config->execution->editor->putoff['id'], $this->config->allowedTags)
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', $now)
->remove('comment')
@@ -857,6 +860,7 @@ class executionModel extends model
if($this->config->systemMode == 'new') $this->checkBeginAndEndDate($oldExecution->project, $execution->begin, $execution->end);
if(dao::isError()) return false;
+ $execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->putoff['id'], $this->post->uid);
$this->dao->update(TABLE_EXECUTION)->data($execution)
->autoCheck()
->checkFlow()
@@ -884,8 +888,10 @@ class executionModel extends model
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', $now)
->setDefault('suspendedDate', helper::today())
+ ->stripTags($this->config->execution->editor->suspend['id'], $this->config->allowedTags)
->remove('comment')->get();
+ $execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->suspend['id'], $this->post->uid);
$this->dao->update(TABLE_EXECUTION)->data($execution)
->autoCheck()
->checkFlow()
@@ -913,6 +919,7 @@ class executionModel extends model
->setDefault('status', 'doing')
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', $now)
+ ->stripTags($this->config->execution->editor->activate['id'], $this->config->allowedTags)
->remove('comment,readjustTime,readjustTask')
->get();
@@ -922,6 +929,7 @@ class executionModel extends model
unset($execution->end);
}
+ $execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->activate['id'], $this->post->uid);
$this->dao->update(TABLE_EXECUTION)->data($execution)
->autoCheck()
->checkFlow()
@@ -995,11 +1003,13 @@ class executionModel extends model
->setDefault('closedDate', $now)
->setDefault('lastEditedBy', $this->app->user->account)
->setDefault('lastEditedDate', $now)
+ ->stripTags($this->config->execution->editor->close['id'], $this->config->allowedTags)
->remove('comment')
->get();
$this->lang->error->ge = $this->lang->execution->ge;
+ $execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->close['id'], $this->post->uid);
$this->dao->update(TABLE_EXECUTION)->data($execution)
->autoCheck()
->check($this->config->execution->close->requiredFields,'notempty')
diff --git a/module/execution/view/kanban.html.php b/module/execution/view/kanban.html.php
index ea835a478e..a1c1615e0a 100644
--- a/module/execution/view/kanban.html.php
+++ b/module/execution/view/kanban.html.php
@@ -52,6 +52,7 @@ js::set('vision', $this->config->vision);
js::set('productCount', count($productNames));
js::set('executionID', $execution->id);
js::set('reviewStoryParis', $reviewStoryParis);
+js::set('rdSearchValue', '');
$canSortRegion = commonModel::hasPriv('kanban', 'sortRegion') && count($regions) > 1;
$canEditRegion = commonModel::hasPriv('kanban', 'editRegion');
@@ -136,7 +137,13 @@ js::set('hasTaskButton', $hasTaskButton);
+
" . $lang->searchAB, '', "class='btn btn-link querybox-toggle'");
echo html::a('javascript:fullScreen()', "
" . $lang->kanban->fullScreen, '', "class='btn btn-link'");
$actions = '';
$printCreateRegion = (common::hasPriv('kanban', 'createRegion') and $groupBy == 'default');
diff --git a/module/kanban/css/space.css b/module/kanban/css/space.css
index 0af2b80557..a5e7c3e778 100644
--- a/module/kanban/css/space.css
+++ b/module/kanban/css/space.css
@@ -7,7 +7,9 @@
#spaceList .spaceActions > a{margin-left: 10px;}
.space .menu {margin-left: 5px; margin-right:5px;}
.space .table-empty-tip {padding: 40px 10px;}
-.space .spaceTitle.pull-left {overflow: hidden; white-space: nowrap; max-width: calc(100% - 255px)}
+.space .spaceTitle.pull-left {overflow: hidden; white-space: nowrap; max-width: calc(100% - 150px)}
+.spaceDesc {font-size: 13px; color: #838A9D; margin: -5px 0 5px 18px;}
+#more .setting {margin-left: -25px; min-width: 80px}
.kanbans > .col {width: 25% !important;}
@media screen and (max-width: 1500px) {.kanbans > .col {width: 25%;}}
diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php
index 661b6b5100..ada1af7205 100644
--- a/module/kanban/lang/en.php
+++ b/module/kanban/lang/en.php
@@ -26,6 +26,7 @@ $lang->kanban->columnWidth = 'Column Width';
$lang->kanban->setColumnWidth = 'Set Column Width';
$lang->kanban->deleteLane = 'Delete Lane';
$lang->kanban->createColumn = 'Create Column';
+$lang->kanban->emptyDesc = 'No description';
$lang->kanban->editColumn = 'Edit Column';
$lang->kanban->sortColumn = 'Sort Column';
$lang->kanban->deleteColumn = 'Delete Column';
@@ -275,14 +276,14 @@ $lang->kanbanspace->empty = 'No Space';
$lang->kanbanspace->aclList['open'] = 'Open (Accessible with kanban view permissions)';
$lang->kanbanspace->aclList['private'] = 'Private (For the space owner, team and whitelist members only)';
-$lang->kanbanspace->featureBar['private'] = 'Private Space';
+$lang->kanbanspace->featureBar['involved'] = 'Involved';
$lang->kanbanspace->featureBar['cooperation'] = 'Cooperation Space';
$lang->kanbanspace->featureBar['public'] = 'Public Space';
-$lang->kanbanspace->featureBar['involved'] = 'Involved';
+$lang->kanbanspace->featureBar['private'] = 'Private Space';
-$lang->kanbanspace->typeList['private'] = 'Private Space';
$lang->kanbanspace->typeList['cooperation'] = 'Cooperation Space';
$lang->kanbanspace->typeList['public'] = 'Public Space';
+$lang->kanbanspace->typeList['private'] = 'Private Space';
$lang->kanbancolumn = new stdclass();
$lang->kanbancolumn->name = $lang->kanban->columnName;
diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php
index a706e5927f..8fab1ef0f2 100644
--- a/module/kanban/lang/zh-cn.php
+++ b/module/kanban/lang/zh-cn.php
@@ -26,6 +26,7 @@ $lang->kanban->columnWidth = '列宽度';
$lang->kanban->setColumnWidth = '设置列宽度';
$lang->kanban->deleteLane = '删除泳道';
$lang->kanban->createColumn = '创建看板列';
+$lang->kanban->emptyDesc = '暂无描述';
$lang->kanban->editColumn = '编辑看板列';
$lang->kanban->sortColumn = '看板列排序';
$lang->kanban->deleteColumn = '删除看板列';
@@ -275,14 +276,14 @@ $lang->kanbanspace->empty = '暂时没有空间';
$lang->kanbanspace->aclList['open'] = '公开(有看板空间视图权限即可访问)';
$lang->kanbanspace->aclList['private'] = '私有(只有看板空间负责人、团队成员、白名单可访问)';
-$lang->kanbanspace->featureBar['private'] = '私人空间';
+$lang->kanbanspace->featureBar['involved'] = '我参与的';
$lang->kanbanspace->featureBar['cooperation'] = '协作空间';
$lang->kanbanspace->featureBar['public'] = '公共空间';
-$lang->kanbanspace->featureBar['involved'] = '我参与的';
+$lang->kanbanspace->featureBar['private'] = '私人空间';
-$lang->kanbanspace->typeList['private'] = '私人空间';
$lang->kanbanspace->typeList['cooperation'] = '协作空间';
$lang->kanbanspace->typeList['public'] = '公共空间';
+$lang->kanbanspace->typeList['private'] = '私人空间';
$lang->kanbancolumn = new stdclass();
$lang->kanbancolumn->name = $lang->kanban->columnName;
diff --git a/module/kanban/model.php b/module/kanban/model.php
index 0f814a8a07..1ec2c65282 100644
--- a/module/kanban/model.php
+++ b/module/kanban/model.php
@@ -808,13 +808,14 @@ class kanbanModel extends model
* @param string $orderBy
* @param int $regionID
* @param string $groupBy
+ * @param string $searchValue
*
* @access public
* @return array
*/
- public function getRDKanban($executionID, $browseType = 'all', $orderBy = 'id_desc', $regionID = 0, $groupBy = 'default')
+ public function getRDKanban($executionID, $browseType = 'all', $orderBy = 'id_desc', $regionID = 0, $groupBy = 'default', $searchValue = '')
{
- if($groupBy != 'default') return $this->getKanban4Group($executionID, $browseType, $groupBy);
+ if($groupBy != 'default') return $this->getKanban4Group($executionID, $browseType, $groupBy, $searchValue);
$kanbanData = array();
$actions = array('sortGroup');
@@ -823,7 +824,7 @@ class kanbanModel extends model
$groupGroup = $this->getGroupGroupByRegions($regionIDList);
$laneGroup = $this->getLaneGroupByRegions($regionIDList, $browseType);
$columnGroup = $this->getRDColumnGroupByRegions($regionIDList, array_keys($laneGroup));
- $cardGroup = $this->getCardGroupByExecution($executionID, $browseType, $orderBy);
+ $cardGroup = $this->getCardGroupByExecution($executionID, $browseType, $orderBy, $searchValue);
foreach($regions as $regionID => $regionName)
{
@@ -838,13 +839,16 @@ class kanbanModel extends model
$lanes = zget($laneGroup, $group->id, array());
if(!$lanes) continue;
- foreach($lanes as $lane)
+ foreach($lanes as $key => $lane)
{
$this->refreshCards($lane);
$lane->items = isset($cardGroup[$lane->id]) ? $cardGroup[$lane->id] : array();
$lane->defaultCardType = $lane->type;
+ if($searchValue != '' and count($lane->items) == 0) unset($lanes[$key]);
}
+ $lanes = array_values($lanes);
+ if($searchValue != '' and empty($lanes)) continue;
$group->columns = zget($columnGroup, $group->id, array());
$group->lanes = $lanes;
$group->actions = array();
@@ -1250,10 +1254,12 @@ class kanbanModel extends model
* @param int $kanbanID
* @param string $browseType all|task|bug|story
* @param string $orderBy
+ * @param string $searchValue
+ *
* @access public
* @return array
*/
- public function getCardGroupByExecution($executionID, $browseType = 'all', $orderBy = 'id_asc')
+ public function getCardGroupByExecution($executionID, $browseType = 'all', $orderBy = 'id_asc', $searchValue = '')
{
$cards = $this->dao->select('t1.*, t2.type as columnType')
->from(TABLE_KANBANCELL)->alias('t1')
@@ -1297,12 +1303,14 @@ class kanbanModel extends model
if($cell->type == 'task')
{
+ if($searchValue != '' and strpos($object->name, $searchValue) === false) continue;
$cardData['name'] = $object->name;
$cardData['status'] = $object->status;
$cardData['left'] = $object->left;
}
else
{
+ if($searchValue != '' and strpos($object->title, $searchValue) === false) continue;
$cardData['title'] = $object->title;
}
$cardGroup[$laneID][$cell->columnType][] = $cardData;
@@ -1406,12 +1414,14 @@ class kanbanModel extends model
if($lane->type == 'task')
{
+ if($searchValue != '' and strpos($object->name, $searchValue) === false) continue;
$cardData['name'] = $object->name;
$cardData['status'] = $object->status;
$cardData['left'] = $object->left;
}
else
{
+ if($searchValue != '' and strpos($object->title, $searchValue) === false) continue;
$cardData['title'] = $object->title;
}
@@ -1440,10 +1450,12 @@ class kanbanModel extends model
* @param int $executionID
* @param string $browseType
* @param string $groupBy
+ * @param string $searchValue
+ *
* @access public
* @return array
*/
- public function getKanban4Group($executionID, $browseType, $groupBy)
+ public function getKanban4Group($executionID, $browseType, $groupBy, $searchValue = '')
{
/* Get card data. */
$cardList = array();
@@ -1551,21 +1563,24 @@ class kanbanModel extends model
if($browseType == 'task')
{
+ if($searchValue != '' and strpos($object->name, $searchValue) === false) continue;
$cardData['name'] = $object->name;
$cardData['status'] = $object->status;
$cardData['left'] = $object->left;
}
else
{
+ if($searchValue != '' and strpos($object->title, $searchValue) === false) continue;
$cardData['title'] = $object->title;
}
$laneData['cards'][$column->columnType][] = $cardData;
$cardOrder ++;
}
- if(!isset($laneData['cards'][$column->columnType])) $laneData['cards'][$column->columnType] = array();
+ if(empty($searchValue) and !isset($laneData['cards'][$column->columnType])) $laneData['cards'][$column->columnType] = array();
}
+ if($searchValue != '' and empty($laneData['cards'])) continue;
$kanbanGroup[$groupBy]['id'] = $groupBy . $laneID;
$kanbanGroup[$groupBy]['columns'] = array_values($columnData);
$kanbanGroup[$groupBy]['lanes'][] = $laneData;
diff --git a/module/kanban/view/createspace.html.php b/module/kanban/view/createspace.html.php
index 5b846d738a..924bfcf17f 100644
--- a/module/kanban/view/createspace.html.php
+++ b/module/kanban/view/createspace.html.php
@@ -20,7 +20,7 @@