- createLink('execution', 'ajaxKanbanSetting', "executionID=$executionID"), " " . $lang->execution->kanbanSetting, '', "class='iframe btn btn-link'");?>
- createLink('execution', 'printKanban', "executionID=$executionID"), " " . $lang->execution->printKanban, '', "class='iframe btn btn-link' id='printKanban' title='{$lang->execution->printKanban}' data-width='500'");?>
createLink('task', 'export', "execution=$executionID&orderBy=$orderBy&type=kanban");
- if(common::hasPriv('task', 'export')) echo html::a($link, " " . $lang->task->export, '', "class='btn btn-link iframe export' data-width='700'");
+ if(common::hasPriv('task', 'export')) echo html::a($link, " " . $lang->export, '', "class='btn btn-link iframe export' data-width='700'");
?>
- -1){var o=this.data[t];n=a.extend(o,n),this.data[t]=n}else this.data.push(n)}n.id||(n.id=a.zui.uuid());var i=this,d=i.$,s=d.children('.kanban-board[data-id="'+n.id+'"]');s.length?s.removeClass("kanban-expired"):(s=a('').appendTo(d),e||s.addClass("no-flex")),i.renderKanbanHeader(n,s),s.children(".kanban-lane").addClass("kanban-expired");for(var r=n.lanes||[],l=0;l .kanban-lane-items .kanban-item').length,b=s.find('.kanban-header-col[data-id="'+c+'"] > .title > .count');i.options.countRender?i.options.countRender(b,p,n.columns[l],i):b.text(p||(i.options.showZeroCount?0:""))}i.adjustKanbanSize(n,s),i.options.onRenderKanban&&i.options.onRenderKanban(s,n,i)},t.prototype.renderKanbanHeader=function(n,t){var o=this;t=t||o.$.children('.kanban-board[data-id="'+n.id+'"]');var i=t.children(".kanban-header");i.length||(i=a('').prependTo(t),e||i.addClass("clearfix")),i.children(".kanban-col").addClass("kanban-expired");for(var d=n.columns,s={},r=!1,l=0;l','
"].join("")).appendTo(e)),o.data("col",n),o.attr("data-type",n.type).attr("data-subs-count",n.subs.length);var i=o.children(".kanban-header-col");i.find(".title>.icon").attr("class","icon icon-"+(n.icon||""));var d=i.find(".title>.text").text(n.name);n.color&&d.css("color",n.color),t.options.showCount&&i.find(".title>.count").text(n.count||(t.options.showZeroCount?0:"")),t.options.onRenderHeaderCol&&t.options.onRenderHeaderCol(o,n,e)},t.prototype.renderHeaderCol=function(n,e,t){var o=this;if(n.parentType&&t){var i=e.children('.kanban-header-parent-col[data-id="'+t.id+'"]');i.attr("data-subs-count",t.subs.length),o.options.useFlex&&i.css("flex",t.subs.length+" 1 0%"),e=i.children(".kanban-header-sub-cols")}var d=e.children('.kanban-header-col[data-id="'+n.id+'"]'),s="ADD"===n.id;if(d.length)d.removeClass("kanban-expired"),s&&d.appendTo(e);else{d=a(['
+
+
+ ";
+ echo html::a('javascript:;', "", '', "data-toggle='dropdown' class='btn btn-link'");
+ // TODO 暂时解决样式问题
+ echo "
';
+?>
execution = $executionID;
diff --git a/module/kanban/config.php b/module/kanban/config.php
index 573728094d..8b0192b5de 100644
--- a/module/kanban/config.php
+++ b/module/kanban/config.php
@@ -2,8 +2,10 @@
global $lang;
$config->kanban = new stdclass();
-$config->kanban->setwip = new stdclass();
-$config->kanban->setwip->requiredFields = 'limit';
+$config->kanban->setwip = new stdclass();
+$config->kanban->setlane = new stdclass();
+$config->kanban->setwip->requiredFields = 'limit';
+$config->kanban->setlane->requiredFields = 'name,type';
$config->kanban->default = new stdclass();
$config->kanban->default->story = new stdclass();
@@ -64,3 +66,5 @@ $config->kanban->taskColumnStatusList['developed'] = 'done';
$config->kanban->taskColumnStatusList['pause'] = 'pause';
$config->kanban->taskColumnStatusList['canceled'] = 'cancel';
$config->kanban->taskColumnStatusList['closed'] = 'closed';
+
+$config->kanban->laneColorList = array('#7ec5ff', '#333', '#2b529c', '#e48600', '#d2323d', '#229f24', '#777', '#d2691e', '#008b8b', '#2e8b57', '#4169e1', '#4b0082', '#fa8072', '#ba55d3', '#2e8b57', '#6b8e23');
diff --git a/module/kanban/control.php b/module/kanban/control.php
index 94c1b179ca..42894954c6 100644
--- a/module/kanban/control.php
+++ b/module/kanban/control.php
@@ -27,7 +27,7 @@ class kanban extends control
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->loadModel('action')->create('wip', $columnID, 'Edited');
- die(js::reload('parent.parent'));
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
}
$this->app->loadLang('story');
@@ -43,4 +43,33 @@ class kanban extends control
$this->view->status = $status;
$this->display();
}
+
+ /**
+ * Set lane info.
+ *
+ * @param int $laneID
+ * @param int $executionID
+ * @access public
+ * @return void
+ */
+ public function setLane($laneID, $executionID = 0)
+ {
+ if($_POST)
+ {
+ $this->kanban->setLane($laneID);
+ if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
+
+ $this->loadModel('action')->create('lane', $laneID, 'Edited');
+
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
+ }
+
+ $lane = $this->kanban->getLaneById($laneID);
+ if(!$lane) die(js::error($this->lang->notFound) . js::locate($this->createLink('execution', 'kanban', "executionID=$executionID")));
+
+ $this->view->title = zget($this->lang->kanban->laneTypeList, $lane->type) . $this->lang->colon . $this->lang->kanban->setLane;
+ $this->view->lane = $lane;
+
+ $this->display();
+ }
}
diff --git a/module/kanban/css/setlane.css b/module/kanban/css/setlane.css
new file mode 100644
index 0000000000..1ae9a01187
--- /dev/null
+++ b/module/kanban/css/setlane.css
@@ -0,0 +1,4 @@
+td>ul {padding-left: 0;}
+li {display: block; float: left; padding: 5px; width: 28px; height: 28px;}
+li>a { position: relative; display: block; width: 100%; height: 100%; padding: 0; margin: 0; font-family: ZentaoIcon; font-size: 14px; font-style: normal; font-weight: 400; font-variant: normal; line-height: 1; text-align: center; text-transform: none; border: 1px solid transparent; border-radius: 50%; speak: none; -webkit-font-smoothing: antialiased; }
+li>a.active:before {font-size: 14px; content: "\e5ca"}
diff --git a/module/kanban/js/setlane.js b/module/kanban/js/setlane.js
new file mode 100644
index 0000000000..a01570f547
--- /dev/null
+++ b/module/kanban/js/setlane.js
@@ -0,0 +1,13 @@
+/**
+ * Set lane color.
+ *
+ * @param string $color
+ * @access public
+ * @return void
+ */
+function setColor(color)
+{
+ $('.cp-tile').removeClass('active');
+ $('.cp-tile[data-color="' + color + '"]').addClass('active');
+ $('#color').val(color);
+}
diff --git a/module/kanban/lang/en.php b/module/kanban/lang/en.php
index 091db93088..52f6561a5e 100644
--- a/module/kanban/lang/en.php
+++ b/module/kanban/lang/en.php
@@ -1,6 +1,22 @@
kanban = new stdClass();
+$lang->kanban->WIP = 'WIP';
+$lang->kanban->setWIP = 'WIP Settings';
+$lang->kanban->WIPStatus = 'WIP Status';
+$lang->kanban->WIPStage = 'WIP Stage';
+$lang->kanban->WIPType = 'WIP Type';
+$lang->kanban->WIPCount = 'WIP Count';
+$lang->kanban->noLimit = 'No Limit ∞';
+$lang->kanban->setLane = 'Lane Settings';
+$lang->kanban->laneName = 'Lane Name';
+$lang->kanban->laneColor = 'Lane Color';
+
+$this->lang->kanban->laneTypeList = array();
+$this->lang->kanban->laneTypeList['story'] = $lang->SRCommon;
+$this->lang->kanban->laneTypeList['bug'] = 'Bug';
+$this->lang->kanban->laneTypeList['task'] = 'Task';
+
$lang->kanban->storyColumn = array();
$lang->kanban->storyColumn['backlog'] = 'Backlog';
$lang->kanban->storyColumn['ready'] = 'Ready';
@@ -33,3 +49,9 @@ $lang->kanban->taskColumn['developed'] = 'Developed';
$lang->kanban->taskColumn['pause'] = 'Pause';
$lang->kanban->taskColumn['canceled'] = 'Canceled';
$lang->kanban->taskColumn['closed'] = 'Closed';
+
+$lang->kanbancolumn = new stdclass();
+$lang->kanbancolumn->limit = $lang->kanban->WIPCount;
+
+$lang->kanbanlane = new stdclass();
+$lang->kanbanlane->name = $lang->kanban->laneName;
diff --git a/module/kanban/lang/zh-cn.php b/module/kanban/lang/zh-cn.php
index 598b428eea..9ffcbc12e5 100644
--- a/module/kanban/lang/zh-cn.php
+++ b/module/kanban/lang/zh-cn.php
@@ -5,8 +5,17 @@ $lang->kanban->WIP = 'WIP';
$lang->kanban->setWIP = '在制品设置';
$lang->kanban->WIPStatus = '在制品状态';
$lang->kanban->WIPStage = '在制品阶段';
+$lang->kanban->WIPType = '在制品类型';
$lang->kanban->WIPCount = '在制品数量';
$lang->kanban->noLimit = '不限制∞';
+$lang->kanban->setLane = '泳道设置';
+$lang->kanban->laneName = '泳道名称';
+$lang->kanban->laneColor = '泳道颜色';
+
+$this->lang->kanban->laneTypeList = array();
+$this->lang->kanban->laneTypeList['story'] = $lang->SRCommon;
+$this->lang->kanban->laneTypeList['bug'] = 'Bug';
+$this->lang->kanban->laneTypeList['task'] = '任务';
$lang->kanban->storyColumn = array();
$lang->kanban->storyColumn['backlog'] = 'Backlog';
@@ -40,3 +49,9 @@ $lang->kanban->taskColumn['developed'] = '研发完毕';
$lang->kanban->taskColumn['pause'] = '已暂停';
$lang->kanban->taskColumn['canceled'] = '已取消';
$lang->kanban->taskColumn['closed'] = '已关闭';
+
+$lang->kanbancolumn = new stdclass();
+$lang->kanbancolumn->limit = $lang->kanban->WIPCount;
+
+$lang->kanbanlane = new stdclass();
+$lang->kanbanlane->name = $lang->kanban->laneName;
diff --git a/module/kanban/model.php b/module/kanban/model.php
index 388c2d17bd..ed594ba43d 100644
--- a/module/kanban/model.php
+++ b/module/kanban/model.php
@@ -60,7 +60,7 @@ class kanbanModel extends model
}
$kanban = array();
- foreach($lanes as $laneID => $lane)
+ foreach($lanes as $laneID => $lane)
{
$lane->columns = $columns[$laneID];
$kanban[$lane->type] = $lane;
@@ -308,6 +308,18 @@ class kanbanModel extends model
return $column;
}
+ /**
+ * Get lane by id.
+ *
+ * @param int $laneID
+ * @access public
+ * @return object
+ */
+ public function getLaneById($laneID)
+ {
+ return $this->dao->findById($laneID)->from(TABLE_KANBANLANE)->fetch();
+ }
+
/**
* Set WIP limit.
*
@@ -319,19 +331,37 @@ class kanbanModel extends model
{
$column = $this->getColumnById($columnID);
$data = fixer::input('post')
+ ->cleanInt('limit')
->remove('WIPCount,noLimit')
->get();
- $this->lang->kanbancolumn = new stdclass();
- $this->lang->kanbancolumn->limit = $this->lang->kanban->WIPCount;
-
$this->dao->update(TABLE_KANBANCOLUMN)->data($data)
->autoCheck()
- ->check(is_numeric($data->limit), 'limit', 'gt', 0)
+ ->check('limit', 'gt', 0)
->batchcheck($this->config->kanban->setwip->requiredFields, 'notempty')
->where('id')->eq($columnID)
->exec();
return dao::isError();
}
+
+ /**
+ * Set lane info.
+ *
+ * @param int $laneID
+ * @access public
+ * @return bool
+ */
+ public function setLane($laneID)
+ {
+ $lane = fixer::input('post')->get();
+
+ $this->dao->update(TABLE_KANBANLANE)->data($lane)
+ ->autoCheck()
+ ->batchcheck($this->config->kanban->setlane->requiredFields, 'notempty')
+ ->where('id')->eq($laneID)
+ ->exec();
+
+ return dao::isError();
+ }
}
diff --git a/module/kanban/view/setlane.html.php b/module/kanban/view/setlane.html.php
new file mode 100644
index 0000000000..980c88f6f3
--- /dev/null
+++ b/module/kanban/view/setlane.html.php
@@ -0,0 +1,58 @@
+
+ * @package kanban
+ * @version $Id: setlane.html.php 935 2021-10-26 16:24:24Z liyuchun@easycorp.ltd $
+ * @link https://www.zentao.net
+ */
+?>
+
+- ";
+ if(common::hasPriv('execution', 'printKanban')) echo '
- ' .html::a($this->createLink('execution', 'printKanban', "executionID=$executionID"), " " . $lang->execution->printKanban, '', "class='iframe btn btn-link' id='printKanban' title='{$lang->execution->printKanban}' data-width='500'") . ' '; + echo '
- ' .html::a('javascript:fullScreen()', " " . $lang->execution->fullScreen, '', "class='btn btn-link' title='{$lang->execution->fullScreen}' data-width='500'") . ' '; + echo '
+
+
diff --git a/module/project/model.php b/module/project/model.php
index 24dcbda385..8900dc5bab 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -868,6 +868,7 @@ class projectModel extends model
$this->dao->insert(TABLE_PRODUCT)->data($product)->exec();
$productID = $this->dao->lastInsertId();
+ $this->loadModel('action')->create('product', $productID, 'opened');
$this->dao->update(TABLE_PRODUCT)->set('`order`')->eq($productID * 5)->where('id')->eq($productID)->exec();
if($product->acl != 'open') $this->loadModel('user')->updateUserView($productID, 'product');
diff --git a/www/js/zui/kanban/min.css b/www/js/zui/kanban/min.css
index 530c038cd1..4af7426fa8 100644
--- a/www/js/zui/kanban/min.css
+++ b/www/js/zui/kanban/min.css
@@ -1,6 +1,6 @@
/*!
- * ZUI: ZUI Kanban View - v1.9.2 - 2021-10-26
+ * ZUI: ZUI Kanban View - v1.9.2 - 2021-10-27
* http://openzui.com
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2021 cnezsoft.com; Licensed MIT
- */.kanban{min-height:300px}.kanban-header,.kanban-lane,.kanban-sub-lane{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;flex-direction:row;background-color:#f1f3f5;border-bottom:2px solid #fff;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.kanban-header{padding-left:20px;background-color:rgba(0,0,0,.07)}.kanban-no-lane-name .kanban-header{padding-left:0}.kanban-col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.not-use-flex .kanban-col{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.no-flex .kanban-col{float:left}.kanban-col+.kanban-col{border-left:2px solid #fff}.kanban-header-col{position:relative;height:32px}.kanban-header-col>.title{display:block;height:32px;margin:0 32px;line-height:32px;text-align:center}.kanban-header-col>.title>.text{display:inline-block;max-width:100px;margin:0 5px;overflow:hidden;text-overflow:'';white-space:nowrap}.kanban-header-col>.title>.count,.kanban-header-col>.title>.icon{position:relative;top:-12px}.kanban-header-col>.title>.count{color:#8b91a2}.kanban-header-col[data-id=ADD]>.title{margin:6px;opacity:.7}.kanban-header-col[data-id=ADD]>.actions{display:none}.kanban-header-col>.actions{position:absolute;top:0;right:0}.kanban-header-col>.actions>.btn{min-width:32px}.kanban-header-col>.actions>.btn>.icon{opacity:.5}.kanban-header-has-parent>.kanban-header-col{height:64px;padding:16px 0}.kanban-header-parent-col{padding:0!important}.kanban-header-parent-col>.kanban-header-col{height:32px;padding:0}.kanban-header-sub-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:-1px;margin-left:-2px;flex-direction:row;border-top:2px solid #fff;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.kanban-header-sub-cols>.kanban-col{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.no-flex .kanban-header-sub-cols{display:table;table-layout:fixed}.no-flex .kanban-header-sub-cols>.kanban-col{width:50%}.kanban-lane{min-height:100px}.kanban-lane+.kanban-lane{margin-top:3px}.no-flex .kanban-lane{position:relative;padding-left:20px}.kanban-lane-name{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;overflow:hidden;color:#fff;text-align:center;background-color:#3dc6fd;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.kanban-lane-name>.text{position:absolute;top:5px;right:1px;bottom:5px;display:block;overflow:hidden;line-height:20px;text-align:center;white-space:normal;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;writing-mode:vertical-rl}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.kanban-header+.kanban-lane>.kanban-lane-name{margin-top:-33px}.kanban-header.kanban-header-has-parent+.kanban-lane>.kanban-lane-name{margin-top:-65px}.kanban-sub-lanes{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column}.kanban-sub-lanes.no-sub-lane{background-color:#f1f3f5}.kanban-sub-lane{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-lane-col.drop-to{outline:3px solid rgba(255,190,57,.25);outline-offset:-3px}.kanban-lane-col.drop-to .kanban-lane-actions>.btn{background-color:rgba(255,190,57,.25);border:1px dotted #ff9800}.kanban-lane-col.drop-to .kanban-lane-actions>.btn>span{opacity:0}.kanban-lane-col[data-type=EMPTY]{background-color:#fff}.kanban-lane-items{max-height:300px;padding:0 10px 10px;overflow:auto}.kanban-size-inited .kanban-lane-items{max-height:100%!important}.kanban-lane-actions{padding:10px 15px}.kanban-item{padding:10px;margin-top:10px;background:#fff;border:1px solid #fff;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .2s;-o-transition:box-shadow .2s,-o-transform .2s;transition:-webkit-box-shadow .2s,-webkit-transform .2s;transition:box-shadow .2s,transform .2s;transition:box-shadow .2s,transform .2s,-webkit-box-shadow .2s,-webkit-transform .2s,-o-transform .2s}.kanban-item.drag-from{background-color:#aaa;opacity:.2}.kanban-item:hover{border-color:rgba(0,0,0,.1);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09);box-shadow:0 4px 10px 0 rgba(0,0,0,.09)}.kanban-item.drag-shadow{border-color:rgba(0,0,0,.2);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09),0 4px 20px 0 rgba(0,0,0,.5);box-shadow:0 4px 10px 0 rgba(0,0,0,.09),0 4px 20px 0 rgba(0,0,0,.5);-webkit-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}
\ No newline at end of file
+ */.kanban{min-height:300px}.kanban-header,.kanban-lane,.kanban-sub-lane{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;flex-direction:row;background-color:#f1f3f5;border-bottom:2px solid #fff;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.kanban-header{padding-left:20px;background-color:rgba(0,0,0,.07)}.kanban-no-lane-name .kanban-header{padding-left:0}.kanban-col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.not-use-flex .kanban-col{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.no-flex .kanban-col{float:left}.kanban-col+.kanban-col{border-left:2px solid #fff}.kanban-header-col{position:relative;height:32px}.kanban-header-col>.title{display:block;height:32px;margin:0 32px;line-height:32px;text-align:center}.kanban-header-col>.title>.text{display:inline-block;max-width:100px;margin:0 5px;overflow:hidden;text-overflow:'';white-space:nowrap}.kanban-header-col>.title>.count,.kanban-header-col>.title>.icon{position:relative;top:-12px}.kanban-header-col>.title>.count{color:#8b91a2}.kanban-header-col[data-id=ADD]>.title{margin:6px;opacity:.7}.kanban-header-col[data-id=ADD]>.actions{display:none}.kanban-header-col>.actions{position:absolute;top:0;right:0}.kanban-header-col>.actions>.btn{min-width:32px}.kanban-header-col>.actions>.btn>.icon{opacity:.5}.kanban-header-has-parent>.kanban-header-col{height:64px;padding:16px 0}.kanban-header-parent-col{padding:0!important}.kanban-header-parent-col>.kanban-header-col{height:32px;padding:0}.kanban-header-sub-cols{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:-1px;margin-left:-2px;flex-direction:row;border-top:2px solid #fff;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row}.kanban-header-sub-cols>.kanban-col{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.no-flex .kanban-header-sub-cols{display:table;table-layout:fixed}.no-flex .kanban-header-sub-cols>.kanban-col{width:50%}.kanban-lane{min-height:100px}.kanban-lane+.kanban-lane{margin-top:3px}.no-flex .kanban-lane{position:relative;padding-left:20px}.kanban-lane-name{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:20px;overflow:hidden;color:#fff;text-align:center;background-color:#3dc6fd;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.kanban-lane-name>.text{position:absolute;top:5px;right:1px;bottom:5px;display:block;overflow:hidden;line-height:20px;text-align:center;white-space:normal;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl;-webkit-writing-mode:vertical-rl;writing-mode:vertical-rl}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.kanban-header+.kanban-lane>.kanban-lane-name{margin-top:-33px}.kanban-header.kanban-header-has-parent+.kanban-lane>.kanban-lane-name{margin-top:-65px}.kanban-sub-lanes{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column}.kanban-sub-lanes.no-sub-lane{background-color:#f1f3f5}.kanban-sub-lane{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.kanban-lane-col.drop-to{outline:3px solid rgba(255,190,57,.25);outline-offset:-3px}.kanban-lane-col.drop-to .kanban-lane-actions>.btn{background-color:rgba(255,190,57,.25);border:1px dotted #ff9800}.kanban-lane-col.drop-to .kanban-lane-actions>.btn>span{opacity:0}.kanban-lane-col[data-type=EMPTY]{background-color:#fff}.kanban-lane-items{max-height:300px;padding:0 10px 10px;overflow:auto}.kanban-size-inited .kanban-lane-items{max-height:100%!important}.kanban-lane-actions{padding:10px 15px}.kanban-item{padding:10px;margin-top:10px;background:#fff;border:1px solid #fff;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .2s;-o-transition:box-shadow .2s,-o-transform .2s;transition:-webkit-box-shadow .2s,-webkit-transform .2s;transition:box-shadow .2s,transform .2s;transition:box-shadow .2s,transform .2s,-webkit-box-shadow .2s,-webkit-transform .2s,-o-transform .2s}.kanban-item.drag-from{background-color:#aaa;opacity:.2}.kanban-item:hover{border-color:rgba(0,0,0,.1);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.09);box-shadow:0 4px 10px 0 rgba(0,0,0,.09)}.kanban-item.drag-shadow{border-color:rgba(0,0,0,.2);-webkit-box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);box-shadow:0 4px 10px 0 rgba(0,0,0,.05),0 4px 20px 0 rgba(0,0,0,.3);-webkit-transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;-o-transition:box-shadow .2s,-o-transform .4s!important;transition:-webkit-box-shadow .2s,-webkit-transform .4s!important;transition:box-shadow .2s,transform .4s!important;transition:box-shadow .2s,transform .4s,-webkit-box-shadow .2s,-webkit-transform .4s,-o-transform .4s!important}.kanban-item.drag-shadow.in{-webkit-transform:scale(1.1) rotate(5deg);-ms-transform:scale(1.1) rotate(5deg);-o-transform:scale(1.1) rotate(5deg);transform:scale(1.1) rotate(5deg)}.kanban-dragging{cursor:move}
\ No newline at end of file
diff --git a/www/js/zui/kanban/min.js b/www/js/zui/kanban/min.js
index ca1bfda77b..3547a6532c 100644
--- a/www/js/zui/kanban/min.js
+++ b/www/js/zui/kanban/min.js
@@ -1,7 +1,7 @@
/*!
- * ZUI: ZUI Kanban View - v1.9.2 - 2021-10-26
+ * ZUI: ZUI Kanban View - v1.9.2 - 2021-10-27
* http://openzui.com
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2021 cnezsoft.com; Licensed MIT
*/
-!function(a){"use strict";var n="zui.kanban",e="object"==typeof CSS&&CSS.supports("display","flex"),t=function(o,i){var d=this;d.name=n,d.$=a(o).addClass("kanban"),d.options=i=a.extend({},t.DEFAULTS,this.$.data(),i),d.data=i.data||[],d.render(d.data);var s=function(n){if(i.onAction){var e=a(this);i.onAction(e.data("action"),e,n,d)}};if(d.$.on("click",".action",s).on("dblclick",".action-dbc",s),"auto"===i.droppable&&(i.droppable=!i.readonly),i.droppable){var r={selector:".kanban-item",target:'.kanban-lane-col:not([data-type="EMPTY"])',drop:function(a){"function"==typeof i.droppable?i.droppable(a):i.onAction&&i.onAction("dropItem",a.element,a,d)}};"object"==typeof i.droppable&&a.extend(r,i.droppable),d.$.droppable(r)}e&&i.useFlex||a(window).on("resize",function(){d.adjustSize()}),i.useFlex&&e||d.$.addClass("not-use-flex"),i.onCreate&&i.onCreate(d)};t.prototype.render=function(a){var n=this;a&&(n.data=a),n.data&&!Array.isArray(n.data)&&(n.data=[n.data]);var t=n.data||[];n.options.beforeRender&&n.options.beforeRender(n,t),n.$.toggleClass("kanban-readonly",!!n.options.readonly).toggleClass("kanban-no-lane-name",!!n.options.noLaneName),n.$.children(".kanban-board").addClass("kanban-expired");for(var o=0;o
+
+
+
+
+ ','
",'','','',t.options.showCount?'':"","
","',"
","',"<"+(s?"a":"div")+' class="title">','','',o.options.showCount?'':"",""+(s?"a":"div")+">","
"].join("")).appendTo(e),s?d.children(".title").addClass("action").attr("data-action","addCol"):(d.children(".title").addClass("action-dbc").attr("data-action","editCol"),o.options.readonly||d.append(['','',"
"].join("")));var r=o.options.minColWidth;r&&d.css("min-width",r)}d.data("col",n),d.attr("data-type",n.type),d.find(".title>.icon").attr("class","icon icon-"+(n.icon||""));var l=d.find(".title>.text").text(n.name);n.color&&l.css("color",n.color),o.options.showCount&&d.find(".title>.count").text(n.count||(o.options.showZeroCount?0:"")),o.options.onRenderHeaderCol&&o.options.onRenderHeaderCol(d,n,e)},t.prototype.renderLane=function(n,t,o,i){var d=this;o=o||d.$.children('.kanban-board[data-id="'+n.kanban+'"]');var s=o.children('.kanban-lane[data-id="'+n.id+'"]');if(s.length?s.removeClass("kanban-expired"):(s=a('').appendTo(o),e||s.addClass("clearfix")),s.data("lane",n),!d.options.noLaneName){var r=s.children('.kanban-lane-name[data-id="'+n.id+'"]');r.length||(r=a('').appendTo(s)),r.empty().attr("title",n.name).append(a('').text(n.name)),n.color&&r.css("background-color",n.color),d.options.onRenderLaneName&&d.options.onRenderLaneName(r,n,o,t)}s.children(".kanban-col,.kanban-sub-lanes").addClass("kanban-expired"),s.toggleClass("has-sub-lane",!!n.subLanes),n.subLanes?d.renderSubLanes(n,t,s):d.renderLaneItems(t,n.items,s,n,i),d.options.readonly||d.renderLaneCol({id:"EMPTY",type:"EMPTY"},s),s.children(".kanban-expired").remove()},t.prototype.renderSubLanes=function(n,e,t){var o=this,i=t.children('.kanban-sub-lanes[data-id="'+n.id+'"]');i.length?i.removeClass("kanban-expired"):i=a('').appendTo(t),i.children(".kanban-sub-lane").addClass("kanban-expired");for(var d=0;d