This commit is contained in:
lichengjun
2021-09-14 03:02:55 +00:00
57 changed files with 255 additions and 102 deletions
+2 -2
View File
@@ -25,7 +25,7 @@ class bugEntry extends entry
$data = $this->getData();
$bug = $data->data->bug;
$this->send(200, $this->format($bug, 'deleted:bool,activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time'));
$this->send(200, $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool'));
}
/**
@@ -52,7 +52,7 @@ class bugEntry extends entry
if(!isset($data->status)) return $this->sendError(400, 'error');
$bug = $this->bug->getByID($bugID);
$this->send(200, $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time'));
$this->send(200, $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool'));
}
/**
+30 -4
View File
@@ -15,13 +15,37 @@ class bugsEntry extends entry
* GET method.
*
* @param int $productID
* @param int $projectID
* @param int $executionID
* @access public
* @return void
*/
public function get($productID)
public function get($productID = 0, $projectID = 0, $executionID = 0)
{
$control = $this->loadController('bug', 'browse');
$control->browse($productID, $this->param('branch', ''), $this->param('status', ''), 0, $this->param('order', ''), 0, $this->param('limit', 20), $this->param('page', 1));
if(!$productID) $productID = $this->param('product', 0);
if(!$projectID) $projectID = $this->param('project', 0);
if(!$executionID) $executionID = $this->param('execution', 0);
if($projectID)
{
$control = $this->loadController('project', 'bug');
$control->bug($projectID, $productID, $this->param('order', 'status,id_desc'), $this->param('build', 0), $this->param('status', 'all'), 0, $this->param('limit', 20), $this->param('page', 1));
}
elseif($executionID)
{
$control = $this->loadController('execution', 'bug');
$control->bug($executionID, $productID, $this->param('order', 'status,id_desc'), $this->param('build', 0), $this->param('status', 'all'), 0, $this->param('limit', 20), $this->param('page', 1));
}
elseif($productID)
{
$control = $this->loadController('bug', 'browse');
$control->browse($productID, $this->param('branch', ''), $this->param('status', ''), 0, $this->param('order', ''), 0, $this->param('limit', 20), $this->param('page', 1));
}
else
{
return $this->sendError(400, 'Need product or project or execution id.');
}
$data = $this->getData();
if(isset($data->status) and $data->status == 'success')
@@ -31,10 +55,12 @@ class bugsEntry extends entry
$result = array();
foreach($bugs as $bug)
{
$result[] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time');
$result[] = $this->format($bug, 'activatedDate:time,openedDate:time,assignedDate:time,resolvedDate:time,closedDate:time,lastEditedDate:time,deadline:date,deleted:bool');
}
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'bugs' => $result));
}
if(isset($data->status) and $data->status == 'fail')
{
return $this->sendError(400, $data->message);
+1 -1
View File
@@ -32,7 +32,7 @@ class executionEntry extends Entry
return isset($data->code) and $data->code == 404 ? $this->send404() : $this->sendError(400, $data->message);
}
$execution = $this->format($data->data->execution, 'openedDate:time,lastEditedDate:time,closedDate:time,canceledDate:time');
$execution = $this->format($data->data->execution, 'openedDate:time,lastEditedDate:time,closedDate:time,canceledDate:time,begin:date,end:date,realBegan:date,realEnd:date,deleted:bool');
if(!$fields) $this->send(200, $execution);
/* Set other fields. */
+1 -1
View File
@@ -30,7 +30,7 @@ class executionsEntry extends entry
$result = array();
foreach($data->data->executionStats as $execution)
{
$result[] = $this->format($execution, 'openedDate:time,lastEditedDate:time,closedDate:time,canceledDate:time');
$result[] = $this->format($execution, 'openedDate:time,lastEditedDate:time,closedDate:time,canceledDate:time,begin:date,end:date,realBegan:date,realEnd:date,deleted:bool');
}
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'executions' => $result));
}
+2 -2
View File
@@ -20,7 +20,7 @@ class productplansEntry extends entry
*/
public function get($productID = 0)
{
if(!$productID) $productID = $this->param('product');
if(!$productID) $productID = $this->param('product', 0);
if(!$productID) return $this->sendError(400, 'No product id.');
$control = $this->loadController('productplan', 'browse');
@@ -34,7 +34,7 @@ class productplansEntry extends entry
$plans = $data->data->plans;
foreach($plans as $plan) $result[] = $plan;
return $this->send(200, array('productplans' => $result));
return $this->send(200, array('plans' => $result));
}
if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
+1 -13
View File
@@ -20,19 +20,7 @@ class projectreleasesEntry extends entry
*/
public function get($projectID = 0)
{
$control = $this->loadController('projectrelease', 'browse');
$control->browse($projectID, $this->param('executionID', 0), $this->param('type', 'all'));
$data = $this->getData();
if(!isset($data->status)) return $this->sendError(400, 'error');
if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
$result = array();
foreach($data->data->releases as $release)
{
$result[] = $release;
}
return $this->send(200, $result);
$this->fetch('releases', 'get', array('productID' => 0, 'projectID' => $projectID));
}
/**
+2 -2
View File
@@ -30,9 +30,9 @@ class releaseEntry extends Entry
return isset($data->code) and $data->code == 404 ? $this->send404() : $this->sendError(400, $data->message);
}
$plan = $this->format($data->data->release, 'date:date,deleted:bool');
$release = $this->format($data->data->release, 'date:date,deleted:bool');
return $this->send(200, $plan);
return $this->send(200, $release);
}
/**
+15 -5
View File
@@ -15,16 +15,26 @@ class releasesEntry extends entry
* GET method.
*
* @param int $productID
* @param int $projectID
* @access public
* @return void
*/
public function get($productID = 0)
public function get($productID = 0, $projectID = 0)
{
if(!$productID) $productID = $this->param('product');
if(!$productID) return $this->sendError(400, 'No product id.');
if(!$projectID) $projectID = $this->param('project');
if(!$productID and !$projectID) return $this->sendError(400, 'Need product or project id.');
$control = $this->loadController('release', 'browse');
$control->browse($productID, $this->param('branch', 0), $this->param('status', 'all'));
if($projectID)
{
$control = $this->loadController('projectrelease', 'browse');
$control->browse($projectID, 0, $this->param('status', 'all'));
}
else
{
$control = $this->loadController('release', 'browse');
$control->browse($productID, $this->param('branch', 0), $this->param('status', 'all'));
}
/* Response */
$data = $this->getData();
@@ -32,7 +42,7 @@ class releasesEntry extends entry
{
$result = array();
$releases = $data->data->releases;
foreach($releases as $release) $result[] = $release;
foreach($releases as $release) $result[] = $this->format($release, 'deleted:bool,date:date');
return $this->send(200, array('releases' => $result));
}
+19 -5
View File
@@ -15,14 +15,28 @@ class storiesEntry extends entry
* GET method.
*
* @param int $productID
* @param int $projectID
* @access public
* @return void
*/
public function get($productID)
public function get($productID = 0, $projectID = 0)
{
$control = $this->loadController('product', 'browse');
$control->browse($productID, $this->param('branch', 0), $this->param('type', ''), 0, 'story', $this->param('order', ''), $this->param('total', 0), $this->param('limit', 20), $this->param('page', 1));
$data = $this->getData();
if(!$productID) $productID = $this->param('product');
if(!$projectID) $projectID = $this->param('project');
if(!$productID and !$projectID) return $this->sendError(400, 'Need product or project id.');
if($projectID)
{
$control = $this->loadController('projectstory', 'story');
$control->story($projectID, $productID, $this->param('branch', 0), $this->param('type', ''), 0, 'story', $this->param('order', ''), $this->param('total', 0), $this->param('limit', 20), $this->param('page', 1));
$data = $this->getData();
}
else
{
$control = $this->loadController('product', 'browse');
$control->browse($productID, $this->param('branch', 0), $this->param('type', ''), 0, 'story', $this->param('order', ''), $this->param('total', 0), $this->param('limit', 20), $this->param('page', 1));
$data = $this->getData();
}
if(isset($data->status) and $data->status == 'success')
{
@@ -31,7 +45,7 @@ class storiesEntry extends entry
$result = array();
foreach($stories as $story)
{
$result[] = $this->format($story, 'openedDate:time,assignedDate:time,reviewedDate:time,lastEditedDate:time,closedDate:time');
$result[] = $this->format($story, 'openedDate:time,assignedDate:time,reviewedDate:time,lastEditedDate:time,closedDate:time,deleted:bool');
}
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'stories' => $result));
}
+1 -1
View File
@@ -32,7 +32,7 @@ class taskEntry extends Entry
}
$task = $data->data->task;
$this->send(200, $this->format($task, 'openedDate:time,assignedDate:time,realStarted:time,finishedDate:time,canceledDate:time,closedDate:time,lastEditedDate:time'));
$this->send(200, $this->format($task, 'openedDate:time,assignedDate:time,realStarted:time,finishedDate:time,canceledDate:time,closedDate:time,lastEditedDate:time,deleted:bool'));
}
/**
+1 -1
View File
@@ -42,7 +42,7 @@ class tasksEntry extends entry
$result = array();
foreach($tasks as $task)
{
$result[] = $this->format($task, 'openedDate:time,assignedDate:time,realStarted:time,finishedDate:time,canceledDate:time,closedDate:time,lastEditedDate:time');
$result[] = $this->format($task, 'openedDate:time,assignedDate:time,realStarted:time,finishedDate:time,canceledDate:time,closedDate:time,lastEditedDate:time,deleted:bool');
}
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'tasks' => $result));
}
+8 -1
View File
@@ -28,9 +28,16 @@ class testcaseEntry extends entry
if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
if(!isset($data->case)) $this->sendError(400, 'error');
$this->send(200, $this->format($data->case, 'openedDate:time,lastEditedDate:time,lastRunDate:time'));
$this->send(200, $this->format($data->case, 'openedDate:time,lastEditedDate:time,lastRunDate:time,scriptedDate:date,reviewedDate:date,deleted:bool'));
}
/**
* DELETE method.
*
* @param int $testcaseID
* @access public
* @return void
*/
public function delete($testcaseID)
{
$control = $this->loadController('testcase', 'delete');
+34 -9
View File
@@ -14,22 +14,47 @@ class testcasesEntry extends entry
/**
* GET method.
*
* @param int $productID
* @param int $projectID
* @param int $executionID
* @access public
* @return void
*/
public function get()
public function get($productID = 0, $projectID = 0, $executionID = 0)
{
$this->app->loadClass('pager', $static = true);
$pager = pager::init($this->param('total', 0), $this->param('limit', 20), $this->param('page', 1));
if(!$productID) $productID = $this->param('product', 0);
if(!$projectID) $projectID = $this->param('project', 0);
if(!$executionID) $executionID = $this->param('execution', 0);
if(!$productID and !$projectID and !$executionID) return $this->sendError(400, 'Need product or project or execution id.');
$testcases = $this->loadModel('testcase')->getByStatus($this->param('productID', 0), $this->param('branch', ''), $this->param('type', 'all'), $this->param('status', 'all'), $this->param('moduleID', 0), $this->param('order', 'id_desc'), $pager, $this->param('auto', 'no'));
$result = array();
foreach($testcases as $testcase)
if($executionID)
{
$result[] = $this->format($testcase, 'openedDate:time,lastEditedDate:time,lastRunDate:time');
$control = $this->loadController('execution', 'testcase');
$control->testcase($executionID, $this->param('status', 'all'), $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1));
}
else
{
$control = $this->loadController('testcase', 'browse');
$control->browse($productID, $this->param('branch', ''), $this->param('status', 'all'), 0, $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1), $projectID);
}
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'testcases' => $result));
$data = $this->getData();
if(isset($data->status) and $data->status == 'success')
{
$cases = $data->data->cases;
$pager = $data->data->pager;
$result = array();
foreach($cases as $case)
{
$result[] = $this->format($case, 'openedDate:time,lastEditedDate:time,lastRunDate:time,scriptedDate:date,reviewedDate:date,deleted:bool');
}
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'tasks' => $result));
}
if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message);
return $this->sendError(400, 'error');
}
}
+1
View File
@@ -0,0 +1 @@
<?php
+1
View File
@@ -0,0 +1 @@
<?php
+1
View File
@@ -0,0 +1 @@
<?php
+8 -5
View File
@@ -16,21 +16,23 @@ $routes['/products/:id'] = 'product';
$routes['/productlines'] = 'productLines';
$routes['/productlines/:id'] = 'productLine';
$routes['/productplans'] = 'productPlans';
$routes['/product/:id/productplans'] = 'productPlans';
$routes['/productplans/:id'] = 'productPlan';
$routes['/productplans'] = 'productPlans';
$routes['/products/:id/plans'] = 'productPlans';
$routes['/productplans/:id'] = 'productPlan';
$routes['/releases'] = 'releases';
$routes['/product/:id/releases'] = 'releases';
$routes['/projects/:id/releases'] = 'projectreleases';
$routes['/releases/:id'] = 'release';
$routes['/stories'] = 'stories';
$routes['/products/:id/stories'] = 'stories';
$routes['/executions/:id/stories'] = 'executionStories';
$routes['/stories/:id'] = 'story';
$routes['/stories/:id/change'] = 'storyChange';
$routes['/products/:id/bugs'] = 'bugs';
$routes['/bugs'] = 'bugs';
$routes['/bugs/:id'] = 'bug';
$routes['/programs/:id/projects'] = 'projects';
@@ -67,8 +69,9 @@ $routes['/projects/:projectID/builds'] = 'builds';
$routes['/builds'] = 'builds';
$routes['/builds/:id'] = 'build';
$routes['/testcases'] = 'testcases';
$routes['/testcases/:id'] = 'testcase';
$routes['/products/:id/testcases'] = 'testcases';
$routes['/testcases'] = 'testcases';
$routes['/testcases/:id'] = 'testcase';
$routes['/projects/:projectID/testtasks'] = 'testtasks';
$routes['/testtasks'] = 'testtasks';
+4 -3
View File
@@ -142,14 +142,14 @@ class router extends baseRouter
if(!defined('FUNCTIONPOINT_KEY')) define('FUNCTIONPOINT_KEY', 2);
global $lang, $app, $config;
$sprintConcept = $hourPoint = false;
$sprintConcept = $hourPoint = false;
$commonSettings = array();
/* Get config from DB. */
if($this->dbh and !empty($this->config->db->name))
{
if(!isset($config->global)) $config->global = new stdclass();
$config->global->flow = 'full';
$commonSettings = array();
try
{
$commonSettings = $this->dbh->query('SELECT section, `key`, value FROM' . TABLE_CONFIG . "WHERE `owner`='system' AND (`module`='custom' or `module`='common') and `key` in ('sprintConcept', 'hourPoint', 'URSR', 'mode', 'URAndSR', 'scoreStatus')")->fetchAll();
@@ -206,7 +206,8 @@ class router extends baseRouter
$config->executionLink = 'execution-task';
/* Get user preference. */
$account = isset($this->session->user->account) ? $this->session->user->account : '';
$account = isset($this->session->user->account) ? $this->session->user->account : '';
$userSetting = array();
if($this->dbh and !empty($this->config->db->name)) $userSetting = $this->dbh->query('SELECT `key`, value FROM' . TABLE_CONFIG . "WHERE `owner`='{$account}' AND `module`='common' and `key` in ('programLink', 'productLink', 'projectLink', 'executionLink', 'URSR')")->fetchAll();
foreach($userSetting as $setting)
{
+1 -4
View File
@@ -224,10 +224,7 @@ class html extends baseHTML
if($stringLength == 0) return 0;
$code = 0;
for($i = 0; $i < $stringLength; ++$i)
{
$code += ($i + 1) * ord($string[$i]);
}
for($i = 0; $i < $stringLength; ++ $i) $code += ($i + 1) * ord($string[$i]);
return $code;
}
-1
View File
@@ -1,5 +1,4 @@
$(function()
{
if($('#bugList thead th.c-title').width() < 150) $('#bugList thead th.c-title').width(150);
$('#mainMenu .pull-left').width($('#mainMenu').width() - $('#sidebarHeader').width() - $('#mainMenu .pull-right').width() - 45);
});
+2
View File
@@ -93,6 +93,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
?>
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->bug->byQuery;?></a>
</div>
<?php if(!isonlybody()):?>
<div class="btn-toolbar pull-right">
<?php common::printIcon('bug', 'report', "productID=$productID&browseType=$browseType&branchID=$branch&moduleID=$moduleID", '', 'button', 'bar-chart muted');?>
<div class='btn-group'>
@@ -182,6 +183,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
<?php endif;?>
<?php endif;?>
</div>
<?php endif;?>
</div>
<?php endif;?>
<div id="mainContent" class="main-row fade">
+2
View File
@@ -378,6 +378,8 @@ class commonModel extends model
if(common::hasPriv($objectType, $createMethod))
{
if($objectType == 'doc' and !common::hasPriv('doc', 'tableContents')) continue;
/* Determines whether to print a divider. */
if($needPrintDivider and $showCreateList)
{
+7
View File
@@ -122,6 +122,13 @@ class custom extends control
if($review->needReview) $data = fixer::input('post')->join('forceNotReview', ',')->remove('forceReview')->get();
if(!$review->needReview) $data = fixer::input('post')->join('forceReview', ',')->remove('forceNotReview')->get();
$this->loadModel('setting')->setItems("system.$module", $data);
$reviewCase = isset($review->reviewCase) ? $review->reviewCase : 0;
if($review->needReview == 0 and $reviewCase)
{
$waitCases = $this->loadModel('testcase')->getByStatus(0, 0, 'all', 'wait');
$this->testcase->batchReview(array_keys($waitCases), 'pass');
}
}
elseif($module == 'task' and $field == 'hours')
{
+29
View File
@@ -34,4 +34,33 @@ $('[name*=unitList]').change(function()
$("#defaultCurrency").trigger("chosen:updated");
});
$('#submit').click(function()
{
if(module == 'testcase' && field == 'review' && stopSubmit)
{
var needReview = $('input:radio[name="needReview"]:checked').val();
stopSubmit = false;
if(needReview == 0)
{
$.post(createLink('testcase', 'ajaxGetReviewCount'), function(count)
{
if(count == 0)
{
$('#submit').click();
return true;
}
bootbox.confirm(confirmReviewCase, function(result)
{
if(result) $('#submit').append("<input type='text' class='hidden' name='reviewCase' value='1'>");
$('#submit').click();
})
})
return false;
}
}
})
$('[name*=unitList]').change();
+1
View File
@@ -174,6 +174,7 @@ $lang->custom->notice->readOnlyOfProduct = 'If Change Forbidden, any change on
$lang->custom->notice->readOnlyOfExecution = "If Change Forbidden, any change on tasks, builds, efforts and stories of the closed {$lang->executionCommon} is also forbidden.";
$lang->custom->notice->URSREmpty = 'Custom requirement name can not be empty!';
$lang->custom->notice->confirmDelete = 'Are you sure you want to delete it?';
$lang->custom->notice->confirmReviewCase = 'Set the case in Wait to Normal?';
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Home. Do you want to go to Product Home?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Home. Do you want to go to Project Home?";
+1
View File
@@ -174,6 +174,7 @@ $lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $la
$lang->custom->notice->readOnlyOfExecution = "禁止修改后,已关闭{$lang->custom->execution}下的任务、版本、日志以及关联需求都禁止修改。";
$lang->custom->notice->URSREmpty = '自定义需求名称不能为空!';
$lang->custom->notice->confirmDelete = '您确定要删除吗?';
$lang->custom->notice->confirmReviewCase = '是否将待评审的用例修改为正常状态?';
$lang->custom->notice->indexPage['product'] = "从8.2版本起增加了产品主页视图,是否默认进入产品主页?";
$lang->custom->notice->indexPage['project'] = "从8.2版本起增加了项目主页视图,是否默认进入项目主页?";
+2
View File
@@ -31,6 +31,8 @@ EOT;
<?php js::set('itemRow', $itemRow)?>
<?php js::set('module', $module)?>
<?php js::set('field', $field)?>
<?php js::set('confirmReviewCase', $lang->custom->notice->confirmReviewCase)?>
<?php js::set('stopSubmit', true)?>
<style>
.checkbox-primary {width: 170px; margin: 0 10px 10px 0; display: inline-block;}
</style>
+1 -1
View File
@@ -110,7 +110,7 @@ $sessionString .= session_name() . '=' . session_id();
<img onload="setImageSize(this, 0)" src="<?php echo $this->createLink('file', 'read', "fileID={$file->id}");?>" alt="<?php echo $file->title?>" title="<?php echo $file->title;?>">
</a>
<span class='right-icon'>
<?php if(common::hasPriv('file', 'download')) echo html::a($this->createLink('file', 'download', 'fileID=' . $file->id) . $sessionString, "<i class='icon icon-export'></i>", '', "class='btn-icon' style='margin-right: 10px;' title=\"{$lang->doc->download}\"");?>
<?php if(common::hasPriv('file', 'download')) echo html::a($this->createLink('file', 'download', 'fileID=' . $file->id) . $sessionString, "<i class='icon icon-import'></i>", '', "class='btn-icon' style='margin-right: 10px;' title=\"{$lang->doc->download}\"");?>
<?php if(common::hasPriv('doc', 'deleteFile')) echo html::a('###', "<i class='icon icon-trash'></i>", '', "class='btn-icon' title=\"{$lang->doc->deleteFile}\" onclick='deleteFile($file->id)'");?>
</span>
</div>
+1 -1
View File
@@ -130,7 +130,7 @@ js::set('docID', $doc->id);
<img onload="setImageSize(this, 0)" src="<?php echo $this->createLink('file', 'read', "fileID={$file->id}");?>" alt="<?php echo $file->title?>" title="<?php echo $file->title;?>">
</a>
<span class='right-icon'>
<?php if(common::hasPriv('file', 'download')) echo html::a($this->createLink('file', 'download', 'fileID=' . $file->id) . $sessionString, "<i class='icon icon-export'></i>", '', "class='btn-icon' style='margin-right: 10px;' title=\"{$lang->doc->download}\"");?>
<?php if(common::hasPriv('file', 'download')) echo html::a($this->createLink('file', 'download', 'fileID=' . $file->id) . $sessionString, "<i class='icon icon-import'></i>", '', "class='btn-icon' style='margin-right: 10px;' title=\"{$lang->doc->download}\"");?>
<?php if(common::hasPriv('doc', 'deleteFile')) echo html::a('###', "<i class='icon icon-trash'></i>", '', "class='btn-icon' title=\"{$lang->doc->deleteFile}\" onclick='deleteFile($file->id)'");?>
</span>
</div>
+3 -1
View File
@@ -8,4 +8,6 @@ tbody > tr > td > .btn-icon {margin-right: 4px;}
#batchToTask .checkbox-primary {display: inline-block; margin-left: 10px;}
th.c-pri{width:50px;}
.c-estimate {width: 50px;}
.c-status, .c-user {width: 80px;}
.c-status, .c-user {width: 70px;}
.c-category {width: 80px;}
.c-actions-7 {width: 190px;}
+1 -1
View File
@@ -430,4 +430,4 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+1 -1
View File
@@ -439,4 +439,4 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+1 -1
View File
@@ -430,4 +430,4 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+1 -1
View File
@@ -431,4 +431,4 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+1 -1
View File
@@ -439,4 +439,4 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+1 -1
View File
@@ -439,4 +439,4 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#FFC20E', '#00A78E', '#7FBB00', '#424BAC', '#C0E9FF', '#EC2761');
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+1 -1
View File
@@ -63,7 +63,7 @@ class executionModel extends model
*/
public function setMenu($executionID, $buildID = 0, $extra = '')
{
if(!$this->app->user->admin and strpos(",{$this->app->user->view->sprints},", ",$executionID,") === false and !defined('TUTORIAL')) die(js::error($this->lang->execution->accessDenied) . js::locate('back'));
if(!$this->app->user->admin and strpos(",{$this->app->user->view->sprints},", ",$executionID,") === false and !defined('TUTORIAL') and $executionID != 0) die(js::error($this->lang->execution->accessDenied) . js::locate('back'));
$executions = $this->loadModel('execution')->getPairs(0, 'all', 'nocode');
if(!$executionID and $this->session->execution) $executionID = $this->session->execution;
@@ -52,13 +52,15 @@
<div class='table-row'>
<div class='table-col'>
<?php
$executionName = empty($projectID) ? zget($projects, $execution->project) . ' / ' . $execution->name : $execution->name;
if(common::hasPriv('execution', 'task'))
{
echo html::a($this->createLink('execution', 'task', "executionID=$execution->id"), $execution->name, '', "title='{$execution->name}'");
echo html::a($this->createLink('execution', 'task', "executionID=$execution->id"), $executionName, '', "title='{$executionName}'");
}
else
{
echo "<span title='{$execution->name}'>{$execution->name}</span>";
echo "<span title='{$executionName}'>{$executionName}</span>";
}
?>
</div>
@@ -83,7 +85,7 @@
</td>
</tr>
<?php $rowIndex++; ?>
<?php if($rowIndex == 9) $rowIndex = 0;?>
<?php if($rowIndex == 8) $rowIndex = 0;?>
<?php endforeach;?>
</tbody>
</table>
+5 -1
View File
@@ -49,4 +49,8 @@ th.table-nest-title .table-nest-toggle:hover {opacity: 1;}
.main-table thead>tr>th {padding: 0px 8px; line-height: 24px;}
.icon-move {color: #16a8f8;}
.c-name {text-overflow: unset !important;}
.c-name {text-overflow: unset !important; width: 110px !important;}
.c-checkbox {width: 45px;}
.c-story {width: 300px;}
.c-bug {width: 200px;}
.c-plan, .c-release {width: 60px;}
+1 -1
View File
@@ -1984,7 +1984,7 @@ class productModel extends model
*/
public function setMenu($productID, $branch = 0, $module = 0, $moduleType = '', $extra = '')
{
if(!$this->app->user->admin and strpos(",{$this->app->user->view->products},", ",$productID,") === false) die(js::error($this->lang->product->accessDenied) . js::locate('back'));
if(!$this->app->user->admin and strpos(",{$this->app->user->view->products},", ",$productID,") === false and $productID != 0) die(js::error($this->lang->product->accessDenied) . js::locate('back'));
$product = $this->getByID($productID);
$params = array('branch' => $branch);
+8 -8
View File
@@ -41,22 +41,22 @@
<thead>
<tr class="text-center">
<?php if($canBatchEdit):?>
<th class='text-left w-45px' rowspan="2">
<th class='text-left c-checkbox' rowspan="2">
<?php echo "<div class='checkbox-primary check-all' title='{$this->lang->selectAll}'><label></label></div>";?>
</th>
<?php endif;?>
<th class='table-nest-title text-left' rowspan="2">
<th class='table-nest-title text-left c-name' rowspan="2">
<a class='table-nest-toggle table-nest-toggle-global' data-expand-text='<?php echo $lang->expand; ?>' data-collapse-text='<?php echo $lang->collapse; ?>'></a>
<?php common::printOrderLink('name', $orderBy, $vars, $lang->product->name);?>
</th>
<?php if($this->config->URAndSR):?>
<th class="w-300px" colspan="4"><?php echo $lang->story->requirement;?></th>
<th class="c-story" colspan="4"><?php echo $lang->story->requirement;?></th>
<?php endif;?>
<th class="w-300px" colspan="4"><?php echo $lang->story->story;?></th>
<th class="w-200px" colspan="3"><?php echo $lang->bug->common;?></th>
<th class="w-80px" rowspan="2"><?php echo $lang->product->plan;?></th>
<th class="w-80px" rowspan="2"><?php echo $lang->product->release;?></th>
<th class='c-actions w-70px' rowspan="2"><?php echo $lang->actions;?></th>
<th class="c-story" colspan="4"><?php echo $lang->story->story;?></th>
<th class="c-bug" colspan="3"><?php echo $lang->bug->common;?></th>
<th class="c-plan" rowspan="2"><?php echo $lang->product->plan;?></th>
<th class="c-release" rowspan="2"><?php echo $lang->product->release;?></th>
<th class='c-actions-2' rowspan="2"><?php echo $lang->actions;?></th>
</tr>
<tr class="text-center">
<?php if($this->config->URAndSR):?>
+1 -1
View File
@@ -21,7 +21,7 @@
<?php js::set('storyRecTotal', $storyPager->recTotal);?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<?php $browseLink = $this->session->productPlanList ? $this->session->productPlanList : inlink('browse', "planID=$plan->id");?>
<?php $browseLink = $this->session->productPlanList ? $this->session->productPlanList : inlink('browse', "planID=$plan->product");?>
<?php common::printBack($browseLink, 'btn btn-primary');?>
<div class='divider'></div>
<div class='page-title'>
+4 -1
View File
@@ -76,7 +76,10 @@ class program extends control
public function kanban()
{
$this->app->loadLang('release');
$this->app->session->set('projectList', $this->app->getURI(true), 'project');
$this->session->set('projectList', $this->app->getURI(true), 'project');
$this->session->set('productPlanList', $this->app->getURI(true), 'product');
$this->session->set('releaseList', $this->app->getURI(true), 'product');
$this->view->title = $this->lang->program->kanban->common;
$this->view->kanbanGroup = array_filter($this->program->getKanbanGroup());
+1 -1
View File
@@ -23,7 +23,7 @@ class qaModel extends model
*/
public function setMenu($products, $productID, $branch = 0, $extra = '')
{
if(!$this->app->user->admin and strpos(",{$this->app->user->view->products},", ",$productID,") === false)
if(!$this->app->user->admin and strpos(",{$this->app->user->view->products},", ",$productID,") === false and $productID != 0)
{
$this->app->loadLang('product');
die(js::error($this->lang->product->accessDenied) . js::locate('back'));
+1
View File
@@ -2,3 +2,4 @@
#affectedProjects .table + h6 {border-top: 1px solid #ddd;}
.nav-tabs>li>a {height: 36px;}
.table-form>tbody>tr>th {width: 100px !important;}
.colorpicker {right: 7px; top: 7px; opacity: 1;}
+11 -2
View File
@@ -16,7 +16,7 @@
<div class='main-header'>
<h2>
<span class='label label-id'><?php echo $story->id;?></span>
<?php echo html::a($this->createLink('story', 'view', "storyID=$story->id"), $story->title);?>
<?php echo html::a($this->createLink('story', 'view', "storyID=$story->id"), $story->title, '', 'class="story-title"');?>
<small><?php echo $lang->arrow . ' ' . $lang->story->change;?></small>
</h2>
</div>
@@ -42,7 +42,16 @@
<?php $this->printExtendFields($story, 'table');?>
<tr>
<th><?php echo $lang->story->title;?></th>
<td colspan='2'><?php echo html::input('title', $story->title, 'class="form-control"');?></td>
<td colspan='2'>
<div class="colorpicker">
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown" title="<?php echo $lang->task->colorTag ?>"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
<ul class="dropdown-menu clearfix">
<li class="heading"><?php echo $lang->story->colorTag; ?><i class="icon icon-close"></i></li>
</ul>
<input type="hidden" class="colorpicker" id="color" name="color" value="<?php echo $story->color ?>" data-icon="color" data-wrapper="input-control-icon-right" data-update-color=".story-title" data-provide="colorpicker">
</div>
<?php echo html::input('title', $story->title, 'class="form-control story-title"');?>
</td>
</tr>
<tr>
<th><?php echo $lang->story->spec;?></th>
+1
View File
@@ -230,6 +230,7 @@ class task extends control
$this->view->executions = $this->config->systemMode == 'classic' ? $executions : $this->execution->getByProject(0, 'all', 0, true);
$this->view->task = $task;
$this->view->users = $users;
$this->view->storyID = $storyID;
$this->view->stories = $stories;
$this->view->testStoryIdList = $this->loadModel('story')->getTestStories(array_keys($stories), $execution->id);
$this->view->members = $members;
+3
View File
@@ -15,6 +15,9 @@
<?php include '../../common/view/sortable.html.php';?>
<?php js::set('toTaskList', !empty($task->id));?>
<?php js::set('blockID', $blockID);?>
<?php if(!empty($storyID)):?>
<style> .title-group.required > .required:after {right: 110px;}</style>
<?php endif;?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
+11
View File
@@ -1963,4 +1963,15 @@ class testcase extends control
if($methodName == 'update') $status = zget($status, 1, '');
die($status);
}
/**
* Ajax: Get count of need review casese.
*
* @access public
* @return int
*/
public function ajaxGetReviewCount()
{
echo $this->dao->select('count(id) as count')->from(TABLE_CASE)->where('status')->eq('wait')->fetch('count');
}
}
+3 -3
View File
@@ -319,7 +319,7 @@ class testcaseModel extends model
}
/**
* Get by suite.
* Get cases by suite.
*
* @param int $productID
* @param int $branch
@@ -329,7 +329,7 @@ class testcaseModel extends model
* @param object $pager
* @param string $auto no|unit
* @access public
* @return void
* @return array
*/
public function getBySuite($productID, $branch = 0, $suiteID, $moduleIdList = 0, $orderBy = 'id_desc', $pager = null, $auto = 'no')
{
@@ -586,7 +586,7 @@ class testcaseModel extends model
* @access public
* @return array
*/
public function getByStatus($productID = 0, $branch, $type = 'all', $status = 'all', $moduleID, $orderBy = 'id_desc', $pager, $auto = 'no')
public function getByStatus($productID = 0, $branch, $type = 'all', $status = 'all', $moduleID = 0, $orderBy = 'id_desc', $pager = null, $auto = 'no')
{
$modules = $moduleID ? $this->loadModel('tree')->getAllChildId($moduleID) : '0';
+2 -2
View File
@@ -65,12 +65,12 @@ $lang->tutorial->tasks['manageTeam']['desc'] = "<p>Manage {$lang->projectCommon}
$lang->tutorial->tasks['createProjectExecution'] = array('title' => 'Create a ' . $lang->executionCommon);
$lang->tutorial->tasks['createProjectExecution']['mode'] = 'new';
$lang->tutorial->tasks['createProjectExecution']['nav'] = array('app' => 'project', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#navbar>.nav>li[data-id="browse"],#cards>.col>.panel:first .project-name,#projectTableList>tr:first>.c-name a,#navbar>.nav>li[data-id="execution"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => 'Create' . $lang->executionCommon);
$lang->tutorial->tasks['createProjectExecution']['desc'] = "<p>Create a new {$lang->executionCommon}:</p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} list <i class='icon icon-angle-right'></i> Create {$lang->executionCommon}</span>;</li><li data-target='form'>Fill the form with {$lang->executionCommon} information;</li><li data-target='submit'>Save {$lang->executionCommon}</li></ul>";
$lang->tutorial->tasks['createProjectExecution']['desc'] = "<p>Create a new {$lang->executionCommon}:</p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} list <i class='icon icon-angle-right'></i> Create {$lang->executionCommon}</span>;</li><li data-target='form'>Fill the form with {$lang->executionCommon} information;</li><li data-target='submit'>Save {$lang->executionCommon}</li></ul>";
$lang->tutorial->tasks['createExecution'] = array('title' => 'Create a ' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['mode'] = 'classic';
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => 'Create ' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>Create a new {$lang->executionCommon}:</p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} list <i class='icon icon-angle-right'></i> Create {$lang->executionCommon}</span>;</li><li data-target='form'>Fill the form with {$lang->executionCommon} information;</li><li data-target='submit'>Save {$lang->executionCommon}</li></ul>";
$lang->tutorial->tasks['createExecution']['desc'] = "<p>Create a new {$lang->executionCommon}:</p><ul><li data-target='nav'>Open <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon} list <i class='icon icon-angle-right'></i> Create {$lang->executionCommon}</span>;</li><li data-target='form'>Fill the form with {$lang->executionCommon} information;</li><li data-target='submit'>Save {$lang->executionCommon}</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "Manage Team");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
+1 -1
View File
@@ -70,7 +70,7 @@ $lang->tutorial->tasks['createProjectExecution']['desc'] = "<p>在系统创建
$lang->tutorial->tasks['createExecution'] = array('title' => '创建' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['mode'] = 'classic';
$lang->tutorial->tasks['createExecution']['nav'] = array('app' => 'execution', 'module' => 'execution', 'method' => 'create', 'menuModule' => 'browse', 'menu' => '#heading>.header-btn:first,#navbar>.nav>li[data-id="all"],.create-execution-btn', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-execution-btn', 'targetPageName' => '添加' . $lang->executionCommon);
$lang->tutorial->tasks['createExecution']['desc'] = "<p>在系统创建一个新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->executionCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['createExecution']['desc'] = "<p>在系统创建一个新的{$lang->executionCommon}:</p><ul><li data-target='nav'>打开 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> {$lang->executionCommon}列表 <i class='icon icon-angle-right'></i> 添加{$lang->executionCommon}</span> 页面;</li><li data-target='form'>在表单中填写要创建的{$lang->executionCommon}信息;</li><li data-target='submit'>保存{$lang->executionCommon}信息。</li></ul>";
$lang->tutorial->tasks['manageExecutionTeam'] = array('title' => "管理团队");
$lang->tutorial->tasks['manageExecutionTeam']['mode'] = 'classic';
+2 -2
View File
@@ -1,6 +1,6 @@
/*!
* ZUI: ZUI Kanban View - v1.9.2 - 2021-09-10
* ZUI: ZUI Kanban View - v1.9.2 - 2021-09-14
* http://openzui.com
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2021 cnezsoft.com; Licensed MIT
*/.kanban{min-height:300px;overflow-x:auto}.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:1px solid #d5d9de;-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:1px solid #d5d9de}.kanban-header-col{position:relative;height:32px}.kanban-header-col>.title{display:block;margin:6px 32px;line-height:20px;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:-6px}.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-lane{min-height:100px;margin-bottom: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;-webkit-writing-mode:sideways-lr;-ms-writing-mode:sideways-lr;writing-mode:sideways-lr}.no-flex .kanban-lane-name{position:absolute;top:0;bottom:0;left:0}.kanban-header+.kanban-lane>.kanban-lane-name{margin-top:-33px}.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 15px;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-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)}
*/.kanban{min-height:300px;overflow-x:auto}.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:1px solid #d5d9de;-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:1px solid #d5d9de}.kanban-header-col{position:relative;height:32px}.kanban-header-col>.title{display:block;margin:6px 32px;line-height:20px;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:-6px}.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-lane{min-height:100px;margin-bottom: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-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 15px;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-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)}
+1 -1
View File
@@ -1,5 +1,5 @@
/*!
* ZUI: ZUI Kanban View - v1.9.2 - 2021-09-10
* ZUI: ZUI Kanban View - v1.9.2 - 2021-09-14
* http://openzui.com
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2021 cnezsoft.com; Licensed MIT
+3 -3
View File
File diff suppressed because one or more lines are too long
Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 53 KiB

File diff suppressed because one or more lines are too long