Merge branch 'master' into zenops_41
This commit is contained in:
+17
-1
@@ -1,4 +1,10 @@
|
||||
stages:
|
||||
- sonar
|
||||
- unit_test
|
||||
- cleanup_packages
|
||||
- package
|
||||
sonarqube:
|
||||
stage: sonar
|
||||
variables:
|
||||
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
|
||||
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
|
||||
@@ -11,12 +17,21 @@ sonarqube:
|
||||
allow_failure: true
|
||||
only:
|
||||
- master # or the name of your main branch
|
||||
packages:
|
||||
package:
|
||||
stage: package
|
||||
script:
|
||||
- make cizip
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
unit_test:
|
||||
stage: unit_test
|
||||
script:
|
||||
- "/home/gitlab-runner/bin/zentao-unittest.sh ${CI_PROJECT_DIR}"
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
- merge_requests
|
||||
#notify:
|
||||
# script:
|
||||
# - 'curl --location --request POST ''http://api.lf.oop.cc/api/v1/xuan/chatMessage'' --header ''Content-Type: application/json'' --data-raw ''{"gid": "84be4c6e-02e3-4fdc-b081-318c0c1eca02", "title": "开源包下载地址", "content": "点击查看详情链接", "url": "http://10.0.7.242:8080/allpacks/"}'''
|
||||
@@ -24,6 +39,7 @@ packages:
|
||||
# only:
|
||||
# - master
|
||||
cleanup_packages:
|
||||
stage: cleanup_packages
|
||||
script:
|
||||
- make clean
|
||||
when: on_failure
|
||||
|
||||
@@ -29,6 +29,7 @@ $filter->default->cookie['fingerprint'] = 'reg::word';
|
||||
$filter->default->cookie['hideMenu'] = 'equal::true';
|
||||
$filter->default->cookie['tab'] = 'reg::word';
|
||||
$filter->default->cookie['goback'] = 'reg::any';
|
||||
$filter->default->cookie['maxImport'] = 'reg::any';
|
||||
|
||||
$filter->index = new stdclass();
|
||||
$filter->my = new stdclass();
|
||||
|
||||
@@ -222,6 +222,8 @@ $config->openMethods[] = 'kanban.deleteobjectcard';
|
||||
$config->openMethods[] = 'admin.ignore';
|
||||
$config->openMethods[] = 'personnel.unbindwhitelist';
|
||||
$config->openMethods[] = 'tree.viewhistory';
|
||||
$config->openMethods[] = 'doc.createbasicinfo';
|
||||
$config->openMethods[] = 'project.createguide';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
ALTER TABLE `zt_task` ADD `order` mediumint(8) NOT NULL DEFAULT 0 AFTER `activatedDate`;
|
||||
ALTER TABLE `zt_task` ADD INDEX `order` (`order`);
|
||||
ALTER TABLE `zt_story` ADD COLUMN `linkRequirements` varchar(255) NOT NULL AFTER `linkStories`;
|
||||
|
||||
ALTER TABLE `zt_productplan` ADD `createdBy` varchar(30) NOT NULL AFTER `closedReason`;
|
||||
ALTER TABLE `zt_productplan` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_release` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`;
|
||||
ALTER TABLE `zt_release` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_testtask` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`;
|
||||
ALTER TABLE `zt_testtask` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_build` ADD `createdBy` varchar(30) NOT NULL AFTER `desc`;
|
||||
ALTER TABLE `zt_build` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
INSERT IGNORE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `name`, `control`, `expression`, `options`, `default`, `rules`, `placeholder`, `order`, `searchOrder`, `exportOrder`, `canExport`, `canSearch`, `isValue`, `readonly`, `buildin`, `role`, `desc`, `createdBy`, `createdDate`, `editedBy`, `editedDate`) VALUES
|
||||
('testtask', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 393, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('testtask', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 394, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('productplan', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 11, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('productplan', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 12, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('build', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 15, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('build', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 16, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('release', 'createdBy', 'varchar', '30', '由谁创建', 'select', '', 'user', '', '', '', 14, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00'),
|
||||
('release', 'createdDate', 'datetime', '', '创建时间', 'datetime', '', '', '', '', '', 15, 0, 0, '0', '0', '0', '1', 1, 'buildin', '', '', '2022-08-02 14:49', '', '0000-00-00 00:00:00');
|
||||
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackType' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='type';
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackSolution' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='solution';
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackclosedReason' ORDER BY `id` DESC LIMIT 1), `control`='select' WHERE `module`='feedback' AND `field`='closedReason';
|
||||
|
||||
UPDATE `zt_project` SET `closedDate`='' AND `closedBy`='' WHERE `status` != 'closed';
|
||||
UPDATE `zt_grouppriv` SET `method`='exportTemplate' WHERE `method` = 'exportTemplet';
|
||||
|
||||
INSERT IGNORE INTO `zt_workflowaction` (`module`, `action`, `method`, `name`, `type`, `batchMode`, `extensionType`, `open`, `position`, `layout`, `show`, `buildin`, `role`, `createdBy`, `createdDate`) VALUES
|
||||
('bug', 'batchactivate', 'batchoperate', '批量激活', 'batch', 'different', 'none', 'normal', 'browse', 'normal', 'direct', '1', 'buildin', '', '2022-08-09 15:52');
|
||||
|
||||
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'reply' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
|
||||
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'ask' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
|
||||
+230
-220
File diff suppressed because it is too large
Load Diff
@@ -82,6 +82,13 @@
|
||||
33530 资产机会库机会列表页面审批字段居左显示
|
||||
33823 问题指派页面增加备注
|
||||
34097 修改执行QA不符合项详情页面中解决图标
|
||||
34729 QA质量保证计划可以批量编辑
|
||||
30071 项目甘特图中增加任务名称的显示
|
||||
28556 瀑布项目中计划的甘特图支持按日/周/月维度查看
|
||||
29700 项目甘特图中的任务支持点击查看详情
|
||||
29944 项目甘特图中支持显示阶段和任务的负责人
|
||||
34795 项目甘特图可以在阶段或任务前增加图标显示状态
|
||||
34742 项目甘特图中没有起止日期的任务的时间显示为所属阶段时间
|
||||
禅道客户端:
|
||||
34124 XXD可以从XXB主动拉取配置
|
||||
34123 喧喧增加禅道的checktable.php以便自动修复数据库
|
||||
@@ -107,6 +114,7 @@
|
||||
23200 多人任务串行,可以操作出负的消耗工时
|
||||
24357 多人任务填写日志后把日志删除对应的消耗工时仍然存在
|
||||
25185 内置报表里,执行状态的下拉框里都没有已完成
|
||||
25603 修复新版一键安装包中XXD服务可能安装失败的问题。
|
||||
|
||||
2022-07-13 17.3
|
||||
完成的需求
|
||||
|
||||
@@ -197,11 +197,12 @@ $lang->admin->menu->dev['menuOrder'][15] = 'editor';
|
||||
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
|
||||
|
||||
$lang->admin->menu->system['subMenu'] = new stdclass();
|
||||
$lang->admin->menu->system['subMenu']->data = array('link' => "{$lang->admin->data}|backup|index", 'subModule' => 'action');
|
||||
$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
|
||||
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
|
||||
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
|
||||
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
|
||||
$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
|
||||
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
|
||||
|
||||
if($config->visions == ',lite,' and $config->edition != 'open') $lang->admin->menu->system['subMenu']->license = array('link' => "授权信息|admin|license'", 'alias' => 'license');
|
||||
if($config->visions != ',lite,') unset($lang->admin->menu->system['subMenu']->buildIndex);
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div class='clearfix' id='mainMenu'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
foreach($lang->project->featureBar as $label => $labelName)
|
||||
foreach($lang->project->featureBar['browse'] as $label => $labelName)
|
||||
{
|
||||
$active = $status == $label ? 'btn-active-text' : '';
|
||||
echo html::a($this->createLink('project', 'execution', "status=$label&projectID=$projectID"), '<span class="text">' . $labelName . '</span> ' . ($status == $label ? "<span class='label label-light label-badge'>" . (int)count($kanbanList) . '</span>' : ''), '', "class='btn btn-link $active'");
|
||||
|
||||
@@ -336,6 +336,7 @@
|
||||
<?php js::set('storyPinYin', (empty($config->isINT) and class_exists('common')) ? common::convert2Pinyin($stories) : array());?>
|
||||
<?php js::set('testStoryIdList', $testStoryIdList);?>
|
||||
<?php js::set('executionID', $execution->id);?>
|
||||
<?php js::set('executionType', $execution->type);?>
|
||||
<?php if(isonlybody()):?>
|
||||
<style>
|
||||
.body-modal .main-header {padding-right: 0px; z-index: 1000;}
|
||||
|
||||
@@ -253,10 +253,15 @@ class baseModel
|
||||
{
|
||||
if(empty($extensionName)) return false;
|
||||
|
||||
/* 设置扩展的名字和相应的文件。Set extenson name and extension file. */
|
||||
$moduleName = $moduleName ? $moduleName : $this->getModuleName();
|
||||
$moduleName = strtolower($moduleName);
|
||||
$extensionName = strtolower($extensionName);
|
||||
|
||||
/* 设置扩展类的名字。Set the extension class name. */
|
||||
$extensionClass = $extensionName . ucfirst($moduleName);
|
||||
if(isset($this->$extensionClass)) return $this->$extensionClass;
|
||||
|
||||
/* 设置扩展的名字和相应的文件。Set extenson name and extension file. */
|
||||
$moduleExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'model');
|
||||
if(!empty($moduleExtPath['site'])) $extensionFile = $moduleExtPath['site'] . 'class/' . $extensionName . '.class.php';
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['custom'] . 'class/' . $extensionName . '.class.php';
|
||||
@@ -265,10 +270,6 @@ class baseModel
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['xuan'] . 'class/' . $extensionName . '.class.php';
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['common'] . 'class/' . $extensionName . '.class.php';
|
||||
|
||||
/* 设置扩展类的名字。Set the extension class name. */
|
||||
$extensionClass = $extensionName . ucfirst($moduleName);
|
||||
if(isset($this->$extensionClass)) return $this->$extensionClass;
|
||||
|
||||
/* 载入父类。Try to import parent model file auto and then import the extension file. */
|
||||
if(!class_exists($moduleName . 'Model')) helper::import($this->app->getModulePath($this->appName, $moduleName) . 'model.php');
|
||||
if(!helper::import($extensionFile)) return false;
|
||||
|
||||
@@ -996,14 +996,7 @@ class baseRouter
|
||||
if($writable)
|
||||
{
|
||||
$ztSessionHandler = new ztSessionHandler($_GET['tid']);
|
||||
session_set_save_handler(
|
||||
array($ztSessionHandler, "open"),
|
||||
array($ztSessionHandler, "close"),
|
||||
array($ztSessionHandler, "read"),
|
||||
array($ztSessionHandler, "write"),
|
||||
array($ztSessionHandler, "destroy"),
|
||||
array($ztSessionHandler, "gc")
|
||||
);
|
||||
session_set_save_handler($ztSessionHandler, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1532,8 +1525,14 @@ class baseRouter
|
||||
public function checkModuleName($var, $exit = true)
|
||||
{
|
||||
global $filter;
|
||||
$rule = $filter->default->moduleName;
|
||||
if(validater::checkByRule($var, $rule)) return true;
|
||||
static $checkedModule = array();
|
||||
if(!isset($checkedModule[$var]))
|
||||
{
|
||||
$rule = $filter->default->moduleName;
|
||||
$result = validater::checkByRule($var, $rule);
|
||||
$checkedModule[$var] = $result;
|
||||
}
|
||||
if($checkedModule[$var]) return true;
|
||||
if(!$exit) return false;
|
||||
$this->triggerError("'$var' illegal. ", __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
@@ -3107,7 +3106,7 @@ class EndResponseException extends \Exception
|
||||
*
|
||||
* @package framework
|
||||
*/
|
||||
class ztSessionHandler
|
||||
class ztSessionHandler implements SessionHandlerInterface
|
||||
{
|
||||
public $sessSavePath;
|
||||
public $tagID;
|
||||
|
||||
@@ -389,27 +389,21 @@ class control extends baseControl
|
||||
* inForm=0|1 The fields displayed in a form or not. The default is 1.
|
||||
* inCell=0|1 The fields displayed in a div with class cell or not. The default is 0.
|
||||
* @param bool $print
|
||||
* @param string $moduleName
|
||||
* @param string $methodName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printExtendFields($object, $type, $extras = '', $print = true)
|
||||
public function printExtendFields($object, $type, $extras = '', $print = true, $moduleName = '', $methodName = '')
|
||||
{
|
||||
if(!isset($this->config->bizVersion)) return false;
|
||||
|
||||
$moduleName = $this->app->getModuleName();
|
||||
$methodName = $this->app->getMethodName();
|
||||
$moduleName = $moduleName ? $moduleName : $this->app->getModuleName();
|
||||
$methodName = $methodName ? $methodName : $this->app->getMethodName();
|
||||
$fields = $this->loadModel('flow')->printFields($moduleName, $methodName, $object, $type, $extras);
|
||||
if(!$print) return $fields;
|
||||
|
||||
$picker = '';
|
||||
//$jsRoot = $this->config->webRoot . "js/";
|
||||
//$picker = file_get_contents($this->app->getBasePath() . 'app/sys/common/view/picker.html.php');
|
||||
//$picker = substr($picker, strpos($picker, '<style>'));
|
||||
|
||||
//js::import($jsRoot . 'picker/min.js');
|
||||
//css::import($jsRoot . 'picker/min.css');
|
||||
|
||||
echo $picker . $fields;
|
||||
echo $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -157,6 +157,20 @@ class model extends baseModel
|
||||
}
|
||||
if(empty($relations)) $relations = $this->dao->select('next, actions')->from(TABLE_WORKFLOWRELATION)->where('prev')->eq($moduleName)->fetchPairs();
|
||||
|
||||
$this->loadModel('flow');
|
||||
|
||||
$approvalProgressMenu = '';
|
||||
if($type == 'view' && !empty($this->config->openedApproval) && commonModel::hasPriv('approval', 'progress'))
|
||||
{
|
||||
$flow = $this->loadModel('workflow', 'flow')->getByModule($moduleName);
|
||||
if($flow->approval == 'enabled' && !empty($data->approval))
|
||||
{
|
||||
$extraClass = strpos(',testsuite,build,release,productplan,', ",{$moduleName},") !== false ? 'btn-link' : '';
|
||||
$approvalProgressMenu .= "<div class='divider'></div>";
|
||||
$approvalProgressMenu .= baseHTML::a(helper::createLink('approval', 'progress', "approvalID={$data->approval}", '', true), $this->lang->flow->approvalProgress, "class='btn {$extraClass} iframe'");
|
||||
}
|
||||
}
|
||||
|
||||
$menu = '';
|
||||
if($show)
|
||||
{
|
||||
@@ -164,8 +178,10 @@ class model extends baseModel
|
||||
{
|
||||
if(strpos($action->position, $type) === false || $action->show != $show) continue;
|
||||
|
||||
$menu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
$menu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
}
|
||||
|
||||
if($approvalProgressMenu) $menu .= $approvalProgressMenu;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -174,10 +190,12 @@ class model extends baseModel
|
||||
{
|
||||
if(strpos($action->position, $type) === false) continue;
|
||||
|
||||
if($type == 'view' || $action->show == 'direct') $menu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
if($type == 'browse' && $action->show == 'dropdownlist') $dropdownMenu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
if($type == 'view' || $action->show == 'direct') $menu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
if($type == 'browse' && $action->show == 'dropdownlist') $dropdownMenu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
}
|
||||
|
||||
if($approvalProgressMenu) $menu .= $approvalProgressMenu;
|
||||
|
||||
if($type == 'browse' && $dropdownMenu)
|
||||
{
|
||||
$menu .= "<div class='dropdown'><a href='javascript:;' data-toggle='dropdown'>{$this->lang->more}<span class='caret'> </span></a>";
|
||||
|
||||
@@ -280,16 +280,6 @@ class basePager
|
||||
if(strtolower($key) == 'recperpage') $this->params[$key] = $this->recPerPage;
|
||||
if(strtolower($key) == 'pageid') $this->params[$key] = $this->pageID;
|
||||
}
|
||||
|
||||
parse_str(strip_tags(urldecode($_SERVER['QUERY_STRING'])), $query);
|
||||
if(!empty($query['m']) && !empty($query['f']) && $query['m'] == $this->moduleName && $query['f'] == $this->methodName)
|
||||
{
|
||||
unset($query['m']);
|
||||
unset($query['f']);
|
||||
unset($query['t']);
|
||||
|
||||
$this->params = array_merge($this->params, $query);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -243,10 +243,13 @@ $lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> hat ein
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> hate eine Fallverknüpfung aufgelöst <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations link story and bug to productplan. */
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, 由 <strong>$actor</strong> 从计划移除需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, 由 <strong>$actor</strong> 从计划移除BUG <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
/* Used to describe the historical operation records of gantt. */
|
||||
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
|
||||
@@ -243,10 +243,13 @@ $lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> linked
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> unlinked a case <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations link story and bug to productplan. */
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, 由 <strong>$actor</strong> 从计划移除需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, 由 <strong>$actor</strong> 从计划移除BUG <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
/* Used to describe the historical operation records of gantt. */
|
||||
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
|
||||
@@ -243,10 +243,13 @@ $lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> a fait
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> a délié le CasTest <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations link story and bug to productplan. */
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, 由 <strong>$actor</strong> 从计划移除需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, 由 <strong>$actor</strong> 从计划移除BUG <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, <strong>$actor</strong> link stories <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, <strong>$actor</strong> link bugs <strong>$extra</strong>.' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, <strong>$actor</strong> remove stories <strong>$extra</strong> from plan.' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, <strong>$actor</strong> remove bugs <strong>$extra</strong> from plan.' . "\n";
|
||||
|
||||
/* Used to describe the historical operation records of gantt. */
|
||||
$lang->action->desc->ganttmove = '$date, <strong>$actor</strong> tasks sorted <strong>$extra</strong>.' . "\n";
|
||||
|
||||
/* Used to display dynamic information. */
|
||||
$lang->action->label = new stdclass();
|
||||
|
||||
@@ -243,11 +243,15 @@ $lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 关
|
||||
$lang->action->desc->unlinkrelatedcase = '$date, 由 <strong>$actor</strong> 移除相关用例 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 用来描述计划关联和移除需求、bug时的历史操作记录。*/
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong> 到计划。' . "\n";
|
||||
$lang->action->desc->linkstory = '$date, 由 <strong>$actor</strong> 关联需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->linkbug = '$date, 由 <strong>$actor</strong> 关联BUG <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkstory = '$date, 由 <strong>$actor</strong> 从计划移除需求 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->unlinkbug = '$date, 由 <strong>$actor</strong> 从计划移除BUG <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 用来描述gantt chat相关操作记录。 */
|
||||
$lang->action->desc->ganttdrag = '$date, 由 <strong>$actor</strong> 拖动了任务 <strong>$extra</strong>。' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, 由 <strong>$actor</strong> 排序了任务 <strong>$extra</strong>。' . "\n";
|
||||
|
||||
/* 用来显示动态信息。*/
|
||||
$lang->action->label = new stdclass();
|
||||
$lang->action->label->install = '安装';
|
||||
@@ -385,6 +389,8 @@ $lang->action->label->unlinkstory = '移除需求从';
|
||||
$lang->action->label->unlinkbug = '移除BUG从';
|
||||
$lang->action->label->tolib = '导入了';
|
||||
$lang->action->label->updatetolib = '更新了';
|
||||
$lang->action->label->ganttdrag = '拖动了';
|
||||
$lang->action->label->ganttmove = '排序了';
|
||||
|
||||
/* 动态信息按照对象分组 */
|
||||
$lang->action->dynamicAction = new stdclass();
|
||||
|
||||
@@ -787,7 +787,7 @@ class actionModel extends model
|
||||
*/
|
||||
public function getHistory($actionID)
|
||||
{
|
||||
return $this->dao->select()->from(TABLE_HISTORY)->where('action')->in($actionID)->orderBy('id')->fetchGroup('action');
|
||||
return $this->dao->select()->from(TABLE_HISTORY)->where('action')->in($actionID)->fetchGroup('action');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -858,7 +858,7 @@ class actionModel extends model
|
||||
$this->app->loadLang('mr');
|
||||
$desc = sprintf($this->lang->mr->createAction, $mrCreatedDate, $mrActor, $mrLink);
|
||||
}
|
||||
elseif($this->config->edition == 'max' and strpos($this->config->action->assetType, $action->objectType) !== false and $action->action == 'approved')
|
||||
elseif($this->config->edition == 'max' and strpos($this->config->action->assetType, ",{$action->objectType},") !== false and $action->action == 'approved')
|
||||
{
|
||||
$desc = empty($this->lang->action->approve->{$action->extra}) ? '' : $this->lang->action->approve->{$action->extra};
|
||||
}
|
||||
@@ -1469,7 +1469,7 @@ class actionModel extends model
|
||||
}
|
||||
|
||||
if($this->config->edition == 'max'
|
||||
and strpos($this->config->action->assetType, $action->objectType) !== false
|
||||
and strpos($this->config->action->assetType, ",{$action->objectType},") !== false
|
||||
and empty($action->project) and empty($action->product) and empty($action->execution))
|
||||
{
|
||||
if($action->objectType == 'doc')
|
||||
|
||||
@@ -69,7 +69,7 @@ $lang->admin->safe->modeList[0] = 'N/A';
|
||||
$lang->admin->safe->modeList[1] = 'Medium';
|
||||
$lang->admin->safe->modeList[2] = 'Stark';
|
||||
|
||||
$lang->admin->safe->modeRuleList[1] = 'Beinhaltet Groß und Kleinbuchstaben sowie Ziffern. Länge >= 6';
|
||||
$lang->admin->safe->modeRuleList[1] = 'Beinhaltet Groß und Kleinbuchstaben sowie Ziffern. Länge >= 6.';
|
||||
$lang->admin->safe->modeRuleList[2] = 'Beinhaltet Groß und Kleinbuchstaben, Ziffern sowie Sonderzeichen. Länge >= 10.';
|
||||
|
||||
$lang->admin->safe->reasonList['weak'] = 'Bekannte Schwache Passwörter';
|
||||
@@ -87,5 +87,6 @@ $lang->admin->safe->loginCaptchaList[0] = 'Nein';
|
||||
$lang->admin->safe->resetPWDList[1] = 'ON';
|
||||
$lang->admin->safe->resetPWDList[0] = 'Off';
|
||||
|
||||
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
|
||||
$lang->admin->safe->noticeStrong = '';
|
||||
$lang->admin->safe->noticeMode = 'The password will be checked when creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
|
||||
|
||||
@@ -69,7 +69,7 @@ $lang->admin->safe->modeList[0] = 'I don\'t care.';
|
||||
$lang->admin->safe->modeList[1] = 'Medium';
|
||||
$lang->admin->safe->modeList[2] = 'Strong';
|
||||
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 upper and lower case, and numbers';
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 upper and lower case, and numbers.';
|
||||
$lang->admin->safe->modeRuleList[2] = ' >= 10 upper and lower case, numbers and special characters.';
|
||||
|
||||
$lang->admin->safe->reasonList['weak'] = 'Common Weak Password';
|
||||
@@ -87,5 +87,6 @@ $lang->admin->safe->loginCaptchaList[0] = 'No';
|
||||
$lang->admin->safe->resetPWDList[1] = 'ON';
|
||||
$lang->admin->safe->resetPWDList[0] = 'Off';
|
||||
|
||||
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
|
||||
$lang->admin->safe->noticeStrong = '';
|
||||
$lang->admin->safe->noticeMode = 'The password will be checked when creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
|
||||
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
|
||||
|
||||
@@ -69,8 +69,8 @@ $lang->admin->safe->modeList[0] = "Contrôle Modéré";
|
||||
$lang->admin->safe->modeList[1] = 'Contrôle Moyen';
|
||||
$lang->admin->safe->modeList[2] = 'Contrôle Fort';
|
||||
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 Majuscules, minuscules et chiffres';
|
||||
$lang->admin->safe->modeRuleList[2] = ' >= 10 Majuscules, minuscules, chiffres et caractères spéciaux';
|
||||
$lang->admin->safe->modeRuleList[1] = ' >= 6 Majuscules, minuscules et chiffres.';
|
||||
$lang->admin->safe->modeRuleList[2] = ' >= 10 Majuscules, minuscules, chiffres et caractères spéciaux.';
|
||||
|
||||
$lang->admin->safe->reasonList['weak'] = 'Mots de passe faibles courants';
|
||||
$lang->admin->safe->reasonList['account'] = 'Identique au compte';
|
||||
@@ -87,5 +87,6 @@ $lang->admin->safe->loginCaptchaList[0] = 'Non';
|
||||
$lang->admin->safe->resetPWDList[1] = 'ON';
|
||||
$lang->admin->safe->resetPWDList[0] = 'Off';
|
||||
|
||||
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié quand un utilisateur se connectera ou qu'un utilisateur sera créé ou modifier.";
|
||||
$lang->admin->safe->noticeStrong = '';
|
||||
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié lors de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
|
||||
$lang->admin->safe->noticeWeakMode = "Le mot de passe sera vérifié lors de la connexion au système, de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
|
||||
$lang->admin->safe->noticeStrong = "Le mot de passe est d'autant plus sécurisé qu'il est long, qu'il contient plus de lettres, de chiffres ou de caractères spéciaux, et que les lettres du mot de passe sont peu répétitives !";
|
||||
|
||||
@@ -87,5 +87,6 @@ $lang->admin->safe->loginCaptchaList[0] = '否';
|
||||
$lang->admin->safe->resetPWDList[1] = '开启';
|
||||
$lang->admin->safe->resetPWDList[0] = '关闭';
|
||||
|
||||
$lang->admin->safe->noticeMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
|
||||
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
|
||||
$lang->admin->safe->noticeMode = '系统会在创建和修改用户、修改密码的时候检查用户口令。';
|
||||
$lang->admin->safe->noticeWeakMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
|
||||
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
<tr>
|
||||
<th class='thWidth'><?php echo $lang->admin->safe->password?></th>
|
||||
<td class='w-250px'><?php echo html::radio('mode', $lang->admin->safe->modeList, isset($config->safe->mode) ? $config->safe->mode : 0, "onclick=showModeRule(this.value)")?></td>
|
||||
<td class='notice'><?php echo $lang->admin->safe->noticeMode?></td>
|
||||
<td class='notice'><?php echo !empty($config->safe->changeWeak) ? $lang->admin->safe->noticeWeakMode : $lang->admin->safe->noticeMode;?></td>
|
||||
</tr>
|
||||
<tr id='mode1Rule' class='hidden'>
|
||||
<th></th>
|
||||
|
||||
+33
-13
@@ -599,7 +599,7 @@ class block extends control
|
||||
{
|
||||
$limit = ($this->viewType == 'json' or !isset($this->params->count)) ? 0 : (int)$this->params->count;
|
||||
$todos = $this->loadModel('todo')->getList('all', $this->app->user->account, 'wait, doing', $limit, $pager = null, $orderBy = 'date, begin');
|
||||
$uri = $this->app->getURI(true);
|
||||
$uri = $this->createLink('my', 'index');
|
||||
|
||||
$this->session->set('todoList', $uri, 'my');
|
||||
$this->session->set('bugList', $uri, 'qa');
|
||||
@@ -629,7 +629,7 @@ class block extends control
|
||||
*/
|
||||
public function printTaskBlock()
|
||||
{
|
||||
$this->session->set('taskList', $this->app->getURI(true), 'execution');
|
||||
$this->session->set('taskList', $this->createLink('my', 'index'), 'execution');
|
||||
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) return;
|
||||
|
||||
$account = $this->app->user->account;
|
||||
@@ -647,7 +647,7 @@ class block extends control
|
||||
*/
|
||||
public function printBugBlock()
|
||||
{
|
||||
$this->session->set('bugList', $this->app->getURI(true), 'qa');
|
||||
$this->session->set('bugList', $this->createLink('my', 'index'), 'qa');
|
||||
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) return;
|
||||
|
||||
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->project : 0;
|
||||
@@ -663,7 +663,7 @@ class block extends control
|
||||
*/
|
||||
public function printCaseBlock()
|
||||
{
|
||||
$this->session->set('caseList', $this->app->getURI(true), 'qa');
|
||||
$this->session->set('caseList', $this->createLink('my', 'index'), 'qa');
|
||||
$this->app->loadLang('testcase');
|
||||
$this->app->loadLang('testtask');
|
||||
|
||||
@@ -708,9 +708,10 @@ class block extends control
|
||||
{
|
||||
$this->app->loadLang('testtask');
|
||||
|
||||
$this->session->set('productList', $this->app->getURI(true), 'product');
|
||||
$this->session->set('testtaskList', $this->app->getURI(true), 'qa');
|
||||
$this->session->set('buildList', $this->app->getURI(true), 'execution');
|
||||
$uri = $this->createLink('my', 'index');
|
||||
$this->session->set('productList', $uri, 'product');
|
||||
$this->session->set('testtaskList', $uri, 'qa');
|
||||
$this->session->set('buildList', $uri, 'execution');
|
||||
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) return;
|
||||
|
||||
$this->view->testtasks = $this->dao->select('distinct t1.*,t2.name as productName,t3.name as buildName,t4.name as projectName')->from(TABLE_TESTTASK)->alias('t1')
|
||||
@@ -736,7 +737,7 @@ class block extends control
|
||||
*/
|
||||
public function printStoryBlock()
|
||||
{
|
||||
$this->session->set('storyList', $this->app->getURI(true), 'product');
|
||||
$this->session->set('storyList', $this->createLink('my', 'index'), 'product');
|
||||
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) return;
|
||||
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -1686,17 +1687,30 @@ class block extends control
|
||||
*/
|
||||
public function printExecutionBlock()
|
||||
{
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) return;
|
||||
|
||||
$count = isset($this->params->count) ? (int)$this->params->count : 0;
|
||||
$status = isset($this->params->type) ? $this->params->type : 'all';
|
||||
$pager = pager::init(0, $count, 1);
|
||||
|
||||
$this->app->loadLang('execution');
|
||||
$this->app->loadClass('pager', true);
|
||||
$pager = pager::init(0, $count, 1);
|
||||
|
||||
$projectPairs = array();
|
||||
if($this->config->systemMode == 'new') $projectPairs = $this->dao->select('id,name')->from(TABLE_PROJECT)->where('type')->eq('project')->fetchPairs('id', 'name');
|
||||
|
||||
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
|
||||
$this->view->executionStats = $this->loadModel('project')->getStats($projectID, $status, 0, 0, 30, 'id_asc', $pager);
|
||||
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
|
||||
$executions = $this->loadModel('project')->getStats($projectID, $status, 0, 0, 30, 'id_asc', $pager);
|
||||
|
||||
foreach($executions as $index => $execution)
|
||||
{
|
||||
if(empty($execution->children)) continue;
|
||||
|
||||
foreach($execution->children as $child) $executions[] = $child;
|
||||
unset($executions[$index]);
|
||||
}
|
||||
|
||||
$this->view->executionStats = $executions;
|
||||
$this->view->projectPairs = $projectPairs;
|
||||
}
|
||||
|
||||
@@ -1790,7 +1804,13 @@ class block extends control
|
||||
$this->app->loadLang('task');
|
||||
$this->app->loadLang('execution');
|
||||
|
||||
$objects = $this->loadModel('task')->getUserTasks($this->app->user->account, 'assignedTo', $limitCount);
|
||||
$objects = $this->loadModel('task')->getUserTasks($this->app->user->account, 'assignedTo');
|
||||
|
||||
foreach($objects as $k => $task)
|
||||
{
|
||||
if(in_array($task->status, array('closed', 'cancel', 'pause'))) unset($objects[$k]);
|
||||
}
|
||||
if($limitCount > 0) $objects = array_slice($objects, 0, $limitCount);
|
||||
}
|
||||
|
||||
if($objectType == 'bug') $this->app->loadLang('bug');
|
||||
|
||||
@@ -171,12 +171,14 @@ class blockModel extends model
|
||||
$tasks = $this->dao->select("count(t1.id) as tasks, count(if(t1.status = 'done', 1, null)) as doneTasks")->from(TABLE_TASK)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on("t1.project = t2.id")
|
||||
->leftJoin(TABLE_EXECUTION)->alias('t3')->on("t1.execution = t3.id")
|
||||
->where('t1.assignedTo')->eq($this->app->user->account)
|
||||
->leftJoin(TABLE_TEAM)->alias('t4')->on("t4.root = t1.id and t4.type = 'task' and t4.account = '{$this->app->user->account}'")
|
||||
->where("(t1.assignedTo = '{$this->app->user->account}' or (t1.mode = 'multi' and t4.`account` = '{$this->app->user->account}') )")
|
||||
->andWhere('(t2.status')->ne('suspended')
|
||||
->orWhere('t3.status')->ne('suspended')
|
||||
->markRight(1)
|
||||
->andWhere('t1.deleted')->eq('0')
|
||||
->andWhere('t3.deleted')->eq('0')
|
||||
->andWhere('t1.status')->notin('closed,cancel,pause')
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t1.execution')->in($this->app->user->view->sprints)->fi()
|
||||
->beginIF($this->config->vision)->andWhere('t1.vision')->eq($this->config->vision)->fi()
|
||||
->beginIF($this->config->vision)->andWhere('t3.vision')->eq($this->config->vision)->fi()
|
||||
@@ -484,7 +486,7 @@ class blockModel extends model
|
||||
$this->app->loadLang('project');
|
||||
$params = new stdclass();
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->project->featureBar;
|
||||
$params->type['options'] = $this->lang->project->featureBar['browse'];
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
$params->orderBy['name'] = $this->lang->block->orderBy;
|
||||
|
||||
@@ -59,7 +59,7 @@ $useGuest = $this->app->user->account == 'guest';
|
||||
<?php if($hasHeading):?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php echo $this->fetch('block', 'printBlock', "id=$block->id&module=$module")?>
|
||||
<div class='panel-body scrollbar-hover'></div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
@@ -94,7 +94,7 @@ $useGuest = $this->app->user->account == 'guest';
|
||||
<?php if($hasHeading):?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php echo $this->fetch('block', 'printBlock', "id=$block->id&module=$module")?>
|
||||
<div class='panel-body scrollbar-hover'></div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
</div>
|
||||
@@ -136,6 +136,11 @@ $(function()
|
||||
});
|
||||
}
|
||||
setTimeout(checkRemind, 1000);
|
||||
|
||||
$('#dashboard .row .panel').each(function()
|
||||
{
|
||||
refreshBlock($(this));
|
||||
})
|
||||
});
|
||||
</script>
|
||||
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
|
||||
|
||||
@@ -41,11 +41,9 @@
|
||||
<?php $id = 0; ?>
|
||||
<?php foreach($executionStats as $execution):?>
|
||||
<?php
|
||||
if(!empty($execution->children)) continue;
|
||||
|
||||
$appid = isset($_GET['entry']) ? "class='app-btn text-center' data-id='{$this->get->entry}'" : "class='text-center'";
|
||||
$viewLink = $this->createLink('execution', 'task', 'executionID=' . $execution->id);
|
||||
if($config->systemMode == 'new') $execution->name = zget($projectPairs, $execution->project, '') . ' / ' . $execution->name;
|
||||
if($config->systemMode == 'new' and isset($projectPairs[$execution->project])) $execution->name = zget($projectPairs, $execution->project, '') . ' / ' . $execution->name;
|
||||
?>
|
||||
<tr <?php echo $appid?>>
|
||||
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($viewLink, $execution->name, '', "title='$execution->name'");?></nobr></td>
|
||||
|
||||
+54
-26
@@ -26,7 +26,7 @@ $config->bug->list->allFields = 'id, module, execution, story, task,
|
||||
|
||||
$config->bug->list->defaultFields = 'id,severity,pri,title,openedBy,assignedTo,resolvedBy,resolution';
|
||||
|
||||
$config->bug->list->exportFields = 'id, product, branch, module, project, execution, story, task,
|
||||
$config->bug->exportFields = 'id, product, branch, module, project, execution, story, task,
|
||||
title, keywords, severity, pri, type, os, browser,
|
||||
steps, status, deadline, activatedCount, confirmed, mailto,
|
||||
openedBy, openedDate, openedBuild,
|
||||
@@ -37,7 +37,8 @@ $config->bug->list->exportFields = 'id, product, branch, module, project, execut
|
||||
case,
|
||||
lastEditedBy,
|
||||
lastEditedDate, files ,feedbackBy, notifyEmail';
|
||||
if($config->systemMode == 'classic') $config->bug->list->exportFields = str_replace(' project,', '', $config->bug->list->exportFields);
|
||||
|
||||
if($config->systemMode == 'classic') $config->bug->exportFields = str_replace(' project,', '', $config->bug->exportFields);
|
||||
|
||||
$config->bug->list->customCreateFields = 'execution,noticefeedbackBy,story,task,pri,severity,os,browser,deadline,mailto,keywords';
|
||||
$config->bug->list->customBatchEditFields = 'type,severity,pri,productplan,assignedTo,deadline,resolvedBy,resolution,os,browser,keywords';
|
||||
@@ -170,6 +171,14 @@ $config->bug->datatable->fieldList['id']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['id']['width'] = '70';
|
||||
$config->bug->datatable->fieldList['id']['required'] = 'yes';
|
||||
|
||||
$config->bug->datatable->fieldList['product']['title'] = 'product';
|
||||
$config->bug->datatable->fieldList['product']['control'] = 'hidden';
|
||||
$config->bug->datatable->fieldList['product']['dataSource'] = array('module' => 'product', 'method' => 'getPairs');
|
||||
|
||||
$config->bug->datatable->fieldList['module']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['module']['title'] = 'module';
|
||||
$config->bug->datatable->fieldList['module']['dataSource'] = array('module' => 'tree', 'method' => 'getOptionMenu', 'params' => '$productID&bug');
|
||||
|
||||
$config->bug->datatable->fieldList['severity']['title'] = 'severityAB';
|
||||
$config->bug->datatable->fieldList['severity']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['severity']['width'] = '50';
|
||||
@@ -193,10 +202,12 @@ $config->bug->datatable->fieldList['title']['width'] = 'auto';
|
||||
$config->bug->datatable->fieldList['title']['required'] = 'yes';
|
||||
$config->bug->datatable->fieldList['title']['minWidth'] = '200';
|
||||
|
||||
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
|
||||
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['branch']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['branch']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
|
||||
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['branch']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['branch']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['branch']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['branch']['dataSource'] = array('module' => 'bug', 'method' => 'getRelatedObjects', 'params' => 'branch&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['type']['title'] = 'type';
|
||||
$config->bug->datatable->fieldList['type']['fixed'] = 'no';
|
||||
@@ -205,16 +216,19 @@ $config->bug->datatable->fieldList['type']['required'] = 'no';
|
||||
|
||||
if($config->systemMode == 'new')
|
||||
{
|
||||
$config->bug->datatable->fieldList['project']['title'] = 'project';
|
||||
$config->bug->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['project']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['title'] = 'project';
|
||||
$config->bug->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['project']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['control'] = 'hidden';
|
||||
$config->bug->datatable->fieldList['project']['dataSource'] = array('module' => 'product', 'method' => 'getProjectPairsByProduct', 'params' => '$productID');
|
||||
}
|
||||
|
||||
$config->bug->datatable->fieldList['execution']['title'] = 'execution';
|
||||
$config->bug->datatable->fieldList['execution']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['execution']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['title'] = 'execution';
|
||||
$config->bug->datatable->fieldList['execution']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['execution']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['execution']['dataSource'] = array('module' => 'product', 'method' =>'getAllExecutionPairsByProduct', 'params' => '$productID&$branch');
|
||||
|
||||
$config->bug->datatable->fieldList['plan']['title'] = 'plan';
|
||||
$config->bug->datatable->fieldList['plan']['fixed'] = 'no';
|
||||
@@ -236,15 +250,18 @@ $config->bug->datatable->fieldList['activatedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['activatedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['activatedDate']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['story']['title'] = 'story';
|
||||
$config->bug->datatable->fieldList['story']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['story']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['title'] = 'story';
|
||||
$config->bug->datatable->fieldList['story']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['story']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['story']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['story']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'story&id,title');
|
||||
|
||||
$config->bug->datatable->fieldList['task']['title'] = 'task';
|
||||
$config->bug->datatable->fieldList['task']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['task']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['title'] = 'task';
|
||||
$config->bug->datatable->fieldList['task']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['task']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['task']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'task&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['toTask']['title'] = 'toTask';
|
||||
$config->bug->datatable->fieldList['toTask']['fixed'] = 'no';
|
||||
@@ -281,10 +298,12 @@ $config->bug->datatable->fieldList['openedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['openedDate']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
|
||||
$config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
|
||||
$config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['openedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBuild']['control'] = 'multiple';
|
||||
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'openedBuild&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
|
||||
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
|
||||
@@ -300,6 +319,7 @@ $config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
|
||||
$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['deadline']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['deadline']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['deadline']['control'] = 'date';
|
||||
|
||||
$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedByAB';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
|
||||
@@ -320,6 +340,8 @@ $config->bug->datatable->fieldList['resolvedBuild']['title'] = 'resolvedBuild
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['control'] = 'select';
|
||||
$config->bug->datatable->fieldList['resolvedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'resolvedBuild&id,name');
|
||||
|
||||
$config->bug->datatable->fieldList['closedBy']['title'] = 'closedBy';
|
||||
$config->bug->datatable->fieldList['closedBy']['fixed'] = 'no';
|
||||
@@ -346,6 +368,12 @@ $config->bug->datatable->fieldList['actions']['fixed'] = 'right';
|
||||
$config->bug->datatable->fieldList['actions']['width'] = '150';
|
||||
$config->bug->datatable->fieldList['actions']['required'] = 'yes';
|
||||
|
||||
$config->bug->datatable->fieldList['steps']['title'] = 'steps';
|
||||
$config->bug->datatable->fieldList['steps']['control'] = 'textarea';
|
||||
|
||||
$config->bug->datatable->fieldList['case']['title'] = 'case';
|
||||
$config->bug->datatable->fieldList['case']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'case&id,title');
|
||||
|
||||
$config->bug->colorList = new stdclass();
|
||||
$config->bug->colorList->pri[0] = '#c0c0c0';
|
||||
$config->bug->colorList->pri[1] = '#d50000';
|
||||
|
||||
+6
-179
@@ -2090,7 +2090,7 @@ class bug extends control
|
||||
if(!$this->post->bugIDList) return print(js::locate($this->session->bugList, 'parent'));
|
||||
|
||||
$bugIDList = array_unique($this->post->bugIDList);
|
||||
$bugs = $this->dao->select('id, title, status, resolvedBy, openedBuild')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
|
||||
$this->qa->setMenu($this->products, $productID, $branch);
|
||||
|
||||
@@ -2292,183 +2292,10 @@ class bug extends control
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$this->loadModel('file');
|
||||
$this->loadModel('branch');
|
||||
$bugLang = $this->lang->bug;
|
||||
$bugConfig = $this->config->bug;
|
||||
|
||||
/* Create field lists. */
|
||||
$fields = $this->post->exportFields ? $this->post->exportFields : explode(',', $bugConfig->list->exportFields);
|
||||
foreach($fields as $key => $fieldName)
|
||||
{
|
||||
$fieldName = trim($fieldName);
|
||||
$fields[$fieldName] = isset($bugLang->$fieldName) ? $bugLang->$fieldName : $fieldName;
|
||||
unset($fields[$key]);
|
||||
}
|
||||
|
||||
/* Get bugs. */
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where($this->session->bugQueryCondition)
|
||||
->beginIF($this->post->exportType == 'selected')->andWhere('id')->in($this->cookie->checkedItem)->fi()
|
||||
->orderBy($orderBy)->fetchAll('id');
|
||||
|
||||
/* Get users, products and executions. */
|
||||
$users = $this->loadModel('user')->getPairs('noletter');
|
||||
$products = $this->loadModel('product')->getPairs();
|
||||
$projects = $this->loadModel('project')->getPairsByProgram();
|
||||
$executions = $this->loadModel('execution')->getPairs($this->projectID, 'all', 'all');
|
||||
|
||||
/* Get related objects id lists. */
|
||||
$relatedProductIdList = array();
|
||||
$relatedStoryIdList = array();
|
||||
$relatedTaskIdList = array();
|
||||
$relatedBugIdList = array();
|
||||
$relatedCaseIdList = array();
|
||||
$relatedBuildIdList = array();
|
||||
$relatedBranchIdList = array();
|
||||
|
||||
foreach($bugs as $bug)
|
||||
{
|
||||
$relatedProductIdList[$bug->product] = $bug->product;
|
||||
$relatedStoryIdList[$bug->story] = $bug->story;
|
||||
$relatedTaskIdList[$bug->task] = $bug->task;
|
||||
$relatedCaseIdList[$bug->case] = $bug->case;
|
||||
$relatedBugIdList[$bug->duplicateBug] = $bug->duplicateBug;
|
||||
$relatedBranchIdList[$bug->branch] = $bug->branch;
|
||||
|
||||
/* Process link bugs. */
|
||||
$linkBugs = explode(',', $bug->linkBug);
|
||||
foreach($linkBugs as $linkBugID)
|
||||
{
|
||||
if($linkBugID) $relatedBugIdList[$linkBugID] = trim($linkBugID);
|
||||
}
|
||||
|
||||
/* Process builds. */
|
||||
$builds = $bug->openedBuild . ',' . $bug->resolvedBuild;
|
||||
$builds = explode(',', $builds);
|
||||
foreach($builds as $buildID)
|
||||
{
|
||||
if($buildID) $relatedBuildIdList[$buildID] = trim($buildID);
|
||||
}
|
||||
}
|
||||
|
||||
/* Get related objects title or names. */
|
||||
$productsType = $this->dao->select('id, type')->from(TABLE_PRODUCT)->where('id')->in($relatedProductIdList)->fetchPairs();
|
||||
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
|
||||
$relatedTasks = $this->dao->select('id, name')->from(TABLE_TASK)->where('id')->in($relatedTaskIdList)->fetchPairs();
|
||||
$relatedBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('id')->in($relatedBugIdList)->fetchPairs();
|
||||
$relatedCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('id')->in($relatedCaseIdList)->fetchPairs();
|
||||
$relatedBranch = array('0' => $this->lang->branch->main) + $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($relatedBranchIdList)->fetchPairs();
|
||||
$relatedBuilds = array('trunk' => $this->lang->trunk) + $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
|
||||
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('bug')->andWhere('objectID')->in(@array_keys($bugs))->andWhere('extra')->ne('editor')->fetchGroup('objectID');
|
||||
$relatedModules = $this->loadModel('tree')->getAllModulePairs('bug');
|
||||
if($this->config->edition == 'max') $reviews = $this->loadModel('review')->getPairs(0, $productID);
|
||||
|
||||
foreach($bugs as $bug)
|
||||
{
|
||||
if($this->post->fileType == 'csv')
|
||||
{
|
||||
$bug->steps = str_replace("<br />", "\n", $bug->steps);
|
||||
$bug->steps = str_replace('"', '""', $bug->steps);
|
||||
$bug->steps = str_replace(' ', ' ', $bug->steps);
|
||||
}
|
||||
|
||||
$bug->openedDate = !helper::isZeroDate($bug->openedDate) ? $bug->openedDate : '';
|
||||
$bug->assignedDate = !helper::isZeroDate($bug->assignedDate) ? $bug->assignedDate : '';
|
||||
$bug->resolvedDate = !helper::isZeroDate($bug->resolvedDate) ? $bug->resolvedDate : '';
|
||||
$bug->closedDate = !helper::isZeroDate($bug->closedDate) ? $bug->closedDate : '';
|
||||
$bug->lastEditedDate = !helper::isZeroDate($bug->lastEditedDate) ? $bug->lastEditedDate : '';
|
||||
$bug->deadline = !helper::isZeroDate($bug->deadline) ? $bug->deadline : '';
|
||||
|
||||
/* fill some field with useful value. */
|
||||
$bug->product = !isset($products[$bug->product]) ? '' : $products[$bug->product] . "(#$bug->product)";
|
||||
$bug->project = !isset($projects[$bug->project]) ? '' : $projects[$bug->project] . "(#$bug->project)";
|
||||
$bug->execution = !isset($executions[$bug->execution]) ? '' : $executions[$bug->execution] . "(#$bug->execution)";
|
||||
$bug->story = !isset($relatedStories[$bug->story]) ? '' : $relatedStories[$bug->story] . "(#$bug->story)";
|
||||
$bug->task = !isset($relatedTasks[$bug->task]) ? '' : $relatedTasks[$bug->task] . "($bug->task)";
|
||||
$bug->case = !isset($relatedCases[$bug->case]) ? '' : $relatedCases[$bug->case] . "($bug->case)";
|
||||
if($this->config->edition == 'max' and isset($reviews)) $bug->identify = !isset($reviews[$bug->identify]) ? '' : $reviews[$bug->identify] . "(#$bug->identify)";
|
||||
|
||||
if(isset($relatedModules[$bug->module])) $bug->module = $relatedModules[$bug->module] . "(#$bug->module)";
|
||||
if(isset($relatedBugs[$bug->duplicateBug])) $bug->duplicateBug = $relatedBugs[$bug->duplicateBug] . "($bug->duplicateBug)";
|
||||
if(isset($relatedBuilds[$bug->resolvedBuild])) $bug->resolvedBuild = $relatedBuilds[$bug->resolvedBuild] . "(#$bug->resolvedBuild)";
|
||||
if(isset($relatedBranch[$bug->branch])) $bug->branch = $relatedBranch[$bug->branch] . "(#$bug->branch)";
|
||||
|
||||
if(isset($bugLang->priList[$bug->pri])) $bug->pri = $bugLang->priList[$bug->pri];
|
||||
if(isset($bugLang->typeList[$bug->type])) $bug->type = $bugLang->typeList[$bug->type];
|
||||
if(isset($bugLang->severityList[$bug->severity])) $bug->severity = $bugLang->severityList[$bug->severity];
|
||||
if(isset($bugLang->osList[$bug->os])) $bug->os = $bugLang->osList[$bug->os];
|
||||
if(isset($bugLang->browserList[$bug->browser])) $bug->browser = $bugLang->browserList[$bug->browser];
|
||||
if(isset($bugLang->statusList[$bug->status])) $bug->status = $this->processStatus('bug', $bug);
|
||||
if(isset($bugLang->confirmedList[$bug->confirmed])) $bug->confirmed = $bugLang->confirmedList[$bug->confirmed];
|
||||
if(isset($bugLang->resolutionList[$bug->resolution])) $bug->resolution = $bugLang->resolutionList[$bug->resolution];
|
||||
|
||||
if(isset($users[$bug->openedBy])) $bug->openedBy = $users[$bug->openedBy];
|
||||
if(isset($users[$bug->assignedTo])) $bug->assignedTo = $users[$bug->assignedTo] . "(#$bug->assignedTo)";
|
||||
if(isset($users[$bug->resolvedBy])) $bug->resolvedBy = $users[$bug->resolvedBy];
|
||||
if(isset($users[$bug->lastEditedBy])) $bug->lastEditedBy = $users[$bug->lastEditedBy];
|
||||
if(isset($users[$bug->closedBy])) $bug->closedBy = $users[$bug->closedBy];
|
||||
|
||||
$bug->title = htmlspecialchars_decode($bug->title,ENT_QUOTES);
|
||||
|
||||
if($bug->linkBug)
|
||||
{
|
||||
$tmpLinkBugs = array();
|
||||
$linkBugIdList = explode(',', $bug->linkBug);
|
||||
foreach($linkBugIdList as $linkBugID)
|
||||
{
|
||||
$linkBugID = trim($linkBugID);
|
||||
$tmpLinkBugs[] = isset($relatedBugs[$linkBugID]) ? $relatedBugs[$linkBugID] : $linkBugID;
|
||||
}
|
||||
$bug->linkBug = join("; \n", $tmpLinkBugs);
|
||||
}
|
||||
|
||||
if($bug->openedBuild)
|
||||
{
|
||||
$tmpOpenedBuilds = array();
|
||||
$tmpResolvedBuilds = array();
|
||||
$buildIdList = explode(',', $bug->openedBuild);
|
||||
foreach($buildIdList as $buildID)
|
||||
{
|
||||
$buildID = trim($buildID);
|
||||
$tmpOpenedBuilds[] = isset($relatedBuilds[$buildID]) ? $relatedBuilds[$buildID] . "(#$buildID)" : $buildID;
|
||||
}
|
||||
$bug->openedBuild = join("\n", $tmpOpenedBuilds);
|
||||
if($this->post->fileType == 'html') $bug->openedBuild = nl2br($bug->openedBuild);
|
||||
}
|
||||
|
||||
/* Set related files. */
|
||||
$bug->files = '';
|
||||
if(isset($relatedFiles[$bug->id]))
|
||||
{
|
||||
foreach($relatedFiles[$bug->id] as $file)
|
||||
{
|
||||
$fileURL = common::getSysURL() . $this->file->webPath . $this->file->getRealPathName($file->pathname);
|
||||
$bug->files .= html::a($fileURL, $file->title, '_blank') . '<br />';
|
||||
}
|
||||
}
|
||||
|
||||
$bug->mailto = trim(trim($bug->mailto), ',');
|
||||
$mailtos = explode(',', $bug->mailto);
|
||||
$bug->mailto = '';
|
||||
foreach($mailtos as $mailto)
|
||||
{
|
||||
$mailto = trim($mailto);
|
||||
if(isset($users[$mailto])) $bug->mailto .= $users[$mailto] . ',';
|
||||
}
|
||||
$bug->mailto = rtrim($bug->mailto, ',');
|
||||
|
||||
unset($bug->caseVersion);
|
||||
unset($bug->result);
|
||||
unset($bug->deleted);
|
||||
}
|
||||
|
||||
if(!(in_array('platform', $productsType) or in_array('branch', $productsType))) unset($fields['branch']);// If products's type are normal, unset branch field.
|
||||
if($this->config->edition != 'open') list($fields, $bugs) = $this->loadModel('workflowfield')->appendDataFromFlow($fields, $bugs);
|
||||
|
||||
$this->post->set('fields', $fields);
|
||||
$this->post->set('rows', $bugs);
|
||||
$this->post->set('kind', 'bug');
|
||||
$this->fetch('file', 'export2' . $this->post->fileType, $_POST);
|
||||
$this->loadModel('port');
|
||||
$this->session->set('bugPortParams', array('productID' => $productID, 'executionID' => $executionID, 'branch' => 'all'));
|
||||
$this->port->export('bug');
|
||||
$this->fetch('file', 'export2' . $_POST['fileType'], $_POST);
|
||||
}
|
||||
|
||||
$fileName = $this->lang->bug->common;
|
||||
@@ -2486,7 +2313,7 @@ class bug extends control
|
||||
}
|
||||
|
||||
$this->view->fileName = $fileName;
|
||||
$this->view->allExportFields = $this->config->bug->list->exportFields;
|
||||
$this->view->allExportFields = $this->config->bug->exportFields;
|
||||
$this->view->customExport = true;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
+137
-18
@@ -401,6 +401,7 @@ class bugModel extends model
|
||||
elseif($browseType == 'bysearch') $bugs = $this->getBySearch($productIDList, $branch, $queryID, $sort, '', $pager, $projectID);
|
||||
elseif($browseType == 'overduebugs') $bugs = $this->getOverdueBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
|
||||
elseif($browseType == 'assignedbyme') $bugs = $this->getByAssignedbyme($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
|
||||
elseif($browseType == 'review') $bugs = $this->getReviewBugs($productIDList, $branch, $modules, $executions, $sort, $pager, $projectID);
|
||||
|
||||
return $this->checkDelayedBugs($bugs);
|
||||
}
|
||||
@@ -740,6 +741,13 @@ class bugModel extends model
|
||||
$this->linkBugToBuild($bugID, $bug->resolvedBuild);
|
||||
}
|
||||
|
||||
if($bug->plan != $oldBug->plan)
|
||||
{
|
||||
$this->loadModel('action');
|
||||
if(!empty($oldBug->plan)) $this->action->create('productplan', $oldBug->plan, 'unlinkbug', '', $bugID);
|
||||
if(!empty($bug->plan)) $this->action->create('productplan', $bug->plan, 'linkbug', '', $bugID);
|
||||
}
|
||||
|
||||
$linkBugs = explode(',', $bug->linkBug);
|
||||
$oldLinkBugs = explode(',', $oldBug->linkBug);
|
||||
$addBugs = array_diff($linkBugs, $oldLinkBugs);
|
||||
@@ -777,11 +785,13 @@ class bugModel extends model
|
||||
*/
|
||||
public function batchUpdate()
|
||||
{
|
||||
$bugs = array();
|
||||
$allChanges = array();
|
||||
$now = helper::now();
|
||||
$data = fixer::input('post')->get();
|
||||
$bugIDList = $this->post->bugIDList ? $this->post->bugIDList : array();
|
||||
$bugs = array();
|
||||
$allChanges = array();
|
||||
$now = helper::now();
|
||||
$data = fixer::input('post')->get();
|
||||
$bugIDList = $this->post->bugIDList ? $this->post->bugIDList : array();
|
||||
$unlinkPlans = array();
|
||||
$link2Plans = array();
|
||||
|
||||
if(!empty($bugIDList))
|
||||
{
|
||||
@@ -861,6 +871,12 @@ class bugModel extends model
|
||||
$bug->{$extendField->field} = htmlSpecialString($bug->{$extendField->field});
|
||||
}
|
||||
|
||||
if($bug->plan != $oldBug->plan)
|
||||
{
|
||||
if($bug->plan != $oldBug->plan and !empty($oldBug->plan)) $unlinkPlans[$oldBug->plan] = empty($unlinkPlans[$oldBug->plan]) ? $bugID : "{$unlinkPlans[$oldBug->plan]},$bugID";
|
||||
if($bug->plan != $oldBug->plan and !empty($bug->plan)) $link2Plans[$bug->plan] = empty($link2Plans[$bug->plan]) ? $bugID : "{$link2Plans[$bug->plan]},$bugID";
|
||||
}
|
||||
|
||||
$bugs[$bugID] = $bug;
|
||||
unset($bug);
|
||||
}
|
||||
@@ -902,7 +918,14 @@ class bugModel extends model
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchEdit');
|
||||
if(!dao::isError())
|
||||
{
|
||||
$this->loadModel('score')->create('ajax', 'batchEdit');
|
||||
|
||||
$this->loadModel('action');
|
||||
foreach($unlinkPlans as $planID => $bugs) $this->action->create('productplan', $planID, 'unlinkbug', '', $bugs);
|
||||
foreach($link2Plans as $planID => $bugs) $this->action->create('productplan', $planID, 'linkbug', '', $bugs);
|
||||
}
|
||||
return $allChanges;
|
||||
}
|
||||
|
||||
@@ -922,6 +945,7 @@ class bugModel extends model
|
||||
|
||||
if(empty($bugIDList)) return $activateBugs;
|
||||
|
||||
$extendFields = $this->getFlowExtendFields();
|
||||
foreach($bugIDList as $bugID)
|
||||
{
|
||||
if($data->statusList[$bugID] == 'active') continue;
|
||||
@@ -944,6 +968,15 @@ class bugModel extends model
|
||||
$activateBugs[$bugID]['toStory'] = 0;
|
||||
$activateBugs[$bugID]['lastEditedBy'] = $this->app->user->account;
|
||||
$activateBugs[$bugID]['lastEditedDate'] = $now;
|
||||
|
||||
foreach($extendFields as $extendField)
|
||||
{
|
||||
$postFieldData = $this->post->{$extendField->field};
|
||||
|
||||
if(is_array($postFieldData[$bugID])) $postFieldData[$bugID] = join(',', $postFieldData[$bugID]);
|
||||
|
||||
$activateBugs[$bugID][$extendField->field] = htmlSpecialString($postFieldData[$bugID]);
|
||||
}
|
||||
}
|
||||
|
||||
/* Update bugs. */
|
||||
@@ -953,6 +986,8 @@ class bugModel extends model
|
||||
if(dao::isError()) return print(js::error('bug#' . $bugID . dao::getError(true)));
|
||||
|
||||
$this->dao->update(TABLE_BUG)->set('activatedCount = activatedCount + 1')->where('id')->eq((int)$bugID)->exec();
|
||||
|
||||
$this->executeHooks($bugID);
|
||||
}
|
||||
|
||||
return $activateBugs;
|
||||
@@ -1123,13 +1158,15 @@ class bugModel extends model
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$buildData = new stdclass();
|
||||
$buildData->product = (int)$oldBug->product;
|
||||
$buildData->branch = (int)$oldBug->branch;
|
||||
$buildData->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->buildExecution)->fetch('project');
|
||||
$buildData->execution = $bug->buildExecution;
|
||||
$buildData->name = $bug->buildName;
|
||||
$buildData->date = date('Y-m-d');
|
||||
$buildData->builder = $this->app->user->account;
|
||||
$buildData->product = (int)$oldBug->product;
|
||||
$buildData->branch = (int)$oldBug->branch;
|
||||
$buildData->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->buildExecution)->fetch('project');
|
||||
$buildData->execution = $bug->buildExecution;
|
||||
$buildData->name = $bug->buildName;
|
||||
$buildData->date = date('Y-m-d');
|
||||
$buildData->builder = $this->app->user->account;
|
||||
$buildData->createdBy = $this->app->user->account;
|
||||
$buildData->createdDate = helper::now();
|
||||
$this->dao->insert(TABLE_BUILD)->data($buildData)->autoCheck()
|
||||
->check('name', 'unique', "product = {$buildData->product} AND branch = {$buildData->branch} AND deleted = '0'")
|
||||
->exec();
|
||||
@@ -1242,13 +1279,17 @@ class bugModel extends model
|
||||
*/
|
||||
public function batchChangePlan($bugIDList, $planID)
|
||||
{
|
||||
$now = helper::now();
|
||||
$allChanges = array();
|
||||
$oldBugs = $this->getByList($bugIDList);
|
||||
$now = helper::now();
|
||||
$allChanges = array();
|
||||
$oldBugs = $this->getByList($bugIDList);
|
||||
$unlinkPlans = array();
|
||||
$link2Plans = array();
|
||||
foreach($bugIDList as $bugID)
|
||||
{
|
||||
$oldBug = $oldBugs[$bugID];
|
||||
if($planID == $oldBug->plan) continue;
|
||||
$unlinkPlans[$oldBug->plan] = empty($unlinkPlans[$oldBug->plan]) ? $bugID : "{$unlinkPlans[$oldBug->plan]},$bugID";
|
||||
$link2Plans[$planID] = empty($link2Plans[$planID]) ? $bugID : "{$link2Plans[$planID]},$bugID";
|
||||
|
||||
$bug = new stdclass();
|
||||
$bug->lastEditedBy = $this->app->user->account;
|
||||
@@ -1258,6 +1299,12 @@ class bugModel extends model
|
||||
$this->dao->update(TABLE_BUG)->data($bug)->autoCheck()->where('id')->eq((int)$bugID)->exec();
|
||||
if(!dao::isError()) $allChanges[$bugID] = common::createChanges($oldBug, $bug);
|
||||
}
|
||||
if(!dao::isError())
|
||||
{
|
||||
$this->loadModel('action');
|
||||
foreach($unlinkPlans as $planID => $bugs) $this->action->create('productplan', $planID, 'unlinkbug', '', $bugs);
|
||||
foreach($link2Plans as $planID => $bugs) $this->action->create('productplan', $planID, 'linkbug', '', $bugs);
|
||||
}
|
||||
return $allChanges;
|
||||
}
|
||||
|
||||
@@ -1663,7 +1710,7 @@ class bugModel extends model
|
||||
$bugIDList = array();
|
||||
if($moduleName == 'contributeBug')
|
||||
{
|
||||
$bugsAssignedByMe = $this->loadModel('my')->getAssignedByMe($account, 0, $pager, $orderBy, 0, 'bug');
|
||||
$bugsAssignedByMe = $this->loadModel('my')->getAssignedByMe($account, 0, '', $orderBy, 'bug');
|
||||
foreach($bugsAssignedByMe as $bugID => $bug) $bugIDList[$bugID] = $bugID;
|
||||
}
|
||||
|
||||
@@ -1697,8 +1744,8 @@ class bugModel extends model
|
||||
->beginIF($type != 'closedBy' and $this->app->moduleName == 'block')->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF($type != 'all' and $type != 'bySearch')->andWhere("t1.`$type`")->eq($account)->fi()
|
||||
->beginIF($type == 'bySearch' and $moduleName == 'workBug')->andWhere("t1.assignedTo")->eq($account)->fi()
|
||||
->beginIF($type == 'bySearch' and $moduleName == 'contributeBug')
|
||||
->beginIF($type == 'assignedTo' and $moduleName == 'workBug')->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF($type == 'bySearch' and $moduleName == 'contributeBug')
|
||||
->andWhere('t1.openedBy', 1)->eq($account)
|
||||
->orWhere('t1.closedBy')->eq($account)
|
||||
->orWhere('t1.resolvedBy')->eq($account)
|
||||
@@ -2880,6 +2927,38 @@ class bugModel extends model
|
||||
return $bugs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bugs to review.
|
||||
*
|
||||
* @param array $productIDList
|
||||
* @param int|string $branch
|
||||
* @param array $modules
|
||||
* @param array $executions
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @param int $projectID
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getReviewBugs($productIDList, $branch, $modules, $executions, $orderBy, $pager = null, $projectID = 0)
|
||||
{
|
||||
$bugs = $this->dao->select('t1.*, t2.title as planTitle')->from(TABLE_BUG)->alias('t1')
|
||||
->leftJoin(TABLE_PRODUCTPLAN)->alias('t2')->on('t1.plan = t2.id')
|
||||
->where('t1.product')->in($productIDList)
|
||||
->andWhere('t1.execution')->in(array_keys($executions))
|
||||
->beginIF($branch !== 'all')->andWhere('t1.branch')->eq($branch)->fi()
|
||||
->beginIF($modules)->andWhere('t1.module')->in($modules)->fi()
|
||||
->beginIF($projectID)->andWhere('t1.project')->eq($projectID)->fi()
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->andWhere("FIND_IN_SET('{$this->app->user->account}', t1.reviewers)")
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t1.project')->in('0,' . $this->app->user->view->projects)->fi()
|
||||
->orderBy($orderBy)->page($pager)->fetchAll();
|
||||
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'bug');
|
||||
|
||||
return $bugs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bug query.
|
||||
*
|
||||
@@ -3124,9 +3203,19 @@ class bugModel extends model
|
||||
$class .= ' c-user';
|
||||
$title = "title='" . zget($users, $bug->resolvedBy) . "'";
|
||||
break;
|
||||
case 'openedBy':
|
||||
$class .= ' c-user';
|
||||
$title = "title='" . zget($users, $bug->openedBy) . "'";
|
||||
break;
|
||||
case 'project':
|
||||
$title = "title='" . zget($projectPairs, $bug->project, '') . "'";
|
||||
break;
|
||||
case 'plan':
|
||||
$title = "title='" . zget($plans, $bug->plan) . "'";
|
||||
break;
|
||||
case 'execution':
|
||||
$title = "title='" . zget($executions, $bug->execution) . "'";
|
||||
break;
|
||||
case 'resolvedBuild':
|
||||
$class .= ' text-ellipsis';
|
||||
$title = "title='" . $bug->resolvedBuild . "'";
|
||||
@@ -3460,4 +3549,34 @@ class bugModel extends model
|
||||
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get related objects id lists.
|
||||
*
|
||||
* @param int $object
|
||||
* @param string $pairs
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getRelatedObjects($object, $pairs = '')
|
||||
{
|
||||
/* Get bugs. */
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where($this->session->bugQueryCondition)->fetchAll('id');
|
||||
|
||||
/* Get related objects id lists. */
|
||||
$relatedObjectIdList = array();
|
||||
$relatedObjects = array();
|
||||
|
||||
foreach($bugs as $bug) $relatedObjectIdList[$bug->$object] = $bug->$object;
|
||||
|
||||
if($object == 'openedBuild' or $object == 'resolvedBuild') $object = 'build';
|
||||
|
||||
/* Get related objects title or names. */
|
||||
$table = $this->config->objectTables[$object];
|
||||
if($table) $relatedObjects = $this->dao->select($pairs)->from($table)->where('id')->in($relatedObjectIdList)->fetchPairs();
|
||||
|
||||
if(in_array($object, array('build','resolvedBuild'))) $relatedObjects= array('trunk' => $this->lang->trunk) + $relatedObjects;
|
||||
|
||||
return $relatedObjects;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,16 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
|
||||
<?php
|
||||
if($this->config->edition == 'biz' || $this->config->edition == 'max')
|
||||
{
|
||||
$action = $this->loadModel('workflowaction')->getByModuleAndAction('bug', 'batchactivate');
|
||||
if($action->js) echo "<script>{$action->js}</script>";
|
||||
if($action->css) echo "<style>{$action->css}</style>";
|
||||
}
|
||||
?>
|
||||
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->bug->common . $lang->colon . $lang->bug->batchActivate;?></h2>
|
||||
@@ -24,6 +34,14 @@
|
||||
<th class='c-assigned'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<th class='c-build'><?php echo $lang->bug->openedBuild;?></th>
|
||||
<th><?php echo $lang->bug->legendComment;?></th>
|
||||
<?php
|
||||
$extendFields = $this->bug->getFlowExtendFields();
|
||||
foreach($extendFields as $extendField)
|
||||
{
|
||||
$required = strpos(",$extendField->rules,", ',1,') !== false ? 'required' : '';
|
||||
echo "<th class='c-extend $required'>{$extendField->name}</th>";
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='text-left'>
|
||||
@@ -34,11 +52,15 @@
|
||||
<td style='overflow:visible'><?php echo html::select("assignedToList[$bug->id]", $users, $bug->resolvedBy, "class='form-control chosen'");?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("openedBuildList[$bug->id]", $builds, $bug->openedBuild, 'size=4 multiple=multiple class="form-control chosen"');?></td>
|
||||
<td><?php echo html::input("commentList[$bug->id]", '', "class='form-control'");?></td>
|
||||
<?php
|
||||
$this->loadModel('flow');
|
||||
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, $bug, $extendField->field . "[$bug->id]") . "</td>";
|
||||
?>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan='5' class='text-center'><?php echo html::submitButton();?></td></tr>
|
||||
<tr><td colspan="<?php echo count($extendFields) + 5;?>" class='text-center'><?php echo html::submitButton();?></td></tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
@@ -37,6 +37,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
|
||||
</div>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
common::sortFeatureMenu();
|
||||
$menus = customModel::getFeatureMenu($this->moduleName, $this->methodName);
|
||||
foreach($menus as $menuItem)
|
||||
{
|
||||
|
||||
@@ -1,2 +1 @@
|
||||
#branch_chosen .chosen-single {border-left: 0px;}
|
||||
#noProduct {display: inline-block; width: 110%;}
|
||||
|
||||
@@ -68,3 +68,5 @@ $lang->build->action = new stdclass();
|
||||
$lang->build->action->buildopened = '$date, erstellt von <strong>$actor</strong>, Build <strong>$extra</strong>.' . "\n";
|
||||
|
||||
$lang->backhome = 'zurück';
|
||||
|
||||
$lang->build->featureBar['browse']['all'] = 'Build List';
|
||||
|
||||
@@ -68,3 +68,5 @@ $lang->build->action = new stdclass();
|
||||
$lang->build->action->buildopened = '$date, created by <strong>$actor</strong>, Build <strong>$extra</strong>.' . "\n";
|
||||
|
||||
$lang->backhome = 'back';
|
||||
|
||||
$lang->build->featureBar['browse']['all'] = 'Build List';
|
||||
|
||||
@@ -68,3 +68,5 @@ $lang->build->action = new stdclass();
|
||||
$lang->build->action->buildopened = '$date, Build <strong>$extra</strong> créé par <strong>$actor</strong>.' . "\n";
|
||||
|
||||
$lang->backhome = 'Retour';
|
||||
|
||||
$lang->build->featureBar['browse']['all'] = 'Build List';
|
||||
|
||||
@@ -64,3 +64,5 @@ $lang->build->action = new stdclass();
|
||||
$lang->build->action->buildopened = '$date, được tạo bởi <strong>$actor</strong>, Bản dựng <strong>$extra</strong>.' . "\n";
|
||||
|
||||
$lang->backhome = 'Trở lại';
|
||||
|
||||
$lang->build->featureBar['browse']['all'] = 'Build List';
|
||||
|
||||
@@ -72,6 +72,7 @@ class buildModel extends model
|
||||
->beginIF($projectID)->andWhere('t1.project')->eq((int)$projectID)->fi()
|
||||
->beginIF($type == 'product' and $param)->andWhere('t1.product')->eq($param)->fi()
|
||||
->beginIF($type == 'bysearch')->andWhere($param)->fi()
|
||||
->beginIF($type == 'review')->andWhere("FIND_IN_SET('{$this->app->user->account}', t1.reviewers)")->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
@@ -136,6 +137,7 @@ class buildModel extends model
|
||||
->beginIF($executionID)->andWhere('t1.execution')->eq((int)$executionID)->fi()
|
||||
->beginIF($type == 'product' and $param)->andWhere('t1.product')->eq($param)->fi()
|
||||
->beginIF($type == 'bysearch')->andWhere($param)->fi()
|
||||
->beginIF($type == 'review')->andWhere("FIND_IN_SET('{$this->app->user->account}', t1.reviewers)")->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
@@ -311,6 +313,8 @@ class buildModel extends model
|
||||
->setDefault('branch', 0)
|
||||
->cleanInt('product,branch')
|
||||
->add('execution', (int)$executionID)
|
||||
->add('createdBy', $this->app->user->account)
|
||||
->add('createdDate', helper::now())
|
||||
->stripTags($this->config->build->editor->create['id'], $this->config->allowedTags)
|
||||
->remove('resolvedBy,allchecker,files,labels,uid')
|
||||
->get();
|
||||
|
||||
@@ -442,7 +442,7 @@ class caselib extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function exportTemplet($libID)
|
||||
public function exportTemplate($libID)
|
||||
{
|
||||
$this->loadModel('testcase');
|
||||
if($_POST)
|
||||
|
||||
+22
-19
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = 'Case Library';
|
||||
$lang->caselib->all = 'All Case Libraries';
|
||||
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplet = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplate = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
|
||||
$lang->caselib->id = 'ID';
|
||||
$lang->caselib->name = 'Name';
|
||||
@@ -44,3 +44,6 @@ $lang->caselib->legendDesc = 'Description';
|
||||
|
||||
$lang->caselib->libraryDelete = 'Do you want to delete this library?';
|
||||
$lang->caselib->noModule = '<div>You have no modules.</div><div>Manage it now.</div>';
|
||||
|
||||
$lang->caselib->featureBar['browse']['all'] = 'All';
|
||||
$lang->caselib->featureBar['browse']['wait'] = 'Waiting';
|
||||
|
||||
+22
-19
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = 'Case Library';
|
||||
$lang->caselib->all = 'All Case Libraries';
|
||||
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplet = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->index = "Library Home";
|
||||
$lang->caselib->create = "Create Case Library";
|
||||
$lang->caselib->edit = 'Edit Case Library';
|
||||
$lang->caselib->browse = 'View Cases in Library';
|
||||
$lang->caselib->view = 'Library Detail';
|
||||
$lang->caselib->createCase = 'Create Case';
|
||||
$lang->caselib->delete = "Delete Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Deleted';
|
||||
$lang->caselib->exportTemplate = 'Export Template';
|
||||
$lang->caselib->batchCreateCase = 'Batch Create';
|
||||
$lang->caselib->import = 'Import';
|
||||
$lang->caselib->showImport = 'Imported Data';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Import Case';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
|
||||
$lang->caselib->id = 'ID';
|
||||
$lang->caselib->name = 'Name';
|
||||
@@ -44,3 +44,6 @@ $lang->caselib->legendDesc = 'Description';
|
||||
|
||||
$lang->caselib->libraryDelete = 'Do you want to delete this library?';
|
||||
$lang->caselib->noModule = '<div>You have no modules.</div><div>Manage it now.</div>';
|
||||
|
||||
$lang->caselib->featureBar['browse']['all'] = 'All';
|
||||
$lang->caselib->featureBar['browse']['wait'] = 'Waiting';
|
||||
|
||||
+22
-19
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = 'Case Library';
|
||||
$lang->caselib->all = 'All Case Libraries';
|
||||
|
||||
$lang->caselib->index = "Accueil Library";
|
||||
$lang->caselib->create = "Créer une Library";
|
||||
$lang->caselib->edit = 'Editer Library';
|
||||
$lang->caselib->browse = 'Voir CasTests dans Library';
|
||||
$lang->caselib->view = 'Détail Library';
|
||||
$lang->caselib->createCase = 'Créer CasTest';
|
||||
$lang->caselib->delete = "Supprimer Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Supprimé';
|
||||
$lang->caselib->exportTemplet = 'Exporter Modèle';
|
||||
$lang->caselib->batchCreateCase = 'Créer par lot';
|
||||
$lang->caselib->import = 'Importer';
|
||||
$lang->caselib->showImport = 'Données Importées';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Importer CasTest';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->index = "Accueil Library";
|
||||
$lang->caselib->create = "Créer une Library";
|
||||
$lang->caselib->edit = 'Editer Library';
|
||||
$lang->caselib->browse = 'Voir CasTests dans Library';
|
||||
$lang->caselib->view = 'Détail Library';
|
||||
$lang->caselib->createCase = 'Créer CasTest';
|
||||
$lang->caselib->delete = "Supprimer Suite";
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
$lang->caselib->deleted = 'Supprimé';
|
||||
$lang->caselib->exportTemplate = 'Exporter Modèle';
|
||||
$lang->caselib->batchCreateCase = 'Créer par lot';
|
||||
$lang->caselib->import = 'Importer';
|
||||
$lang->caselib->showImport = 'Données Importées';
|
||||
$lang->caselib->type = 'Type';
|
||||
$lang->caselib->product = $lang->productCommon;
|
||||
$lang->caselib->browseAction = 'Caselib List';
|
||||
$lang->caselib->deleteAction = "Delete Caselib";
|
||||
$lang->caselib->importAction = 'Importer CasTest';
|
||||
$lang->caselib->linkVersion = "Version";
|
||||
|
||||
$lang->caselib->id = 'ID';
|
||||
$lang->caselib->name = 'Nom';
|
||||
@@ -44,3 +44,6 @@ $lang->caselib->legendDesc = 'Description';
|
||||
|
||||
$lang->caselib->libraryDelete = 'Voulez vous supprimer cette library ?';
|
||||
$lang->caselib->noModule = "<div>Vous n'avez aucun modules.</div><div>Gérer les modules maintenant.</div>";
|
||||
|
||||
$lang->caselib->featureBar['browse']['all'] = 'All';
|
||||
$lang->caselib->featureBar['browse']['wait'] = 'Waiting';
|
||||
|
||||
@@ -21,7 +21,7 @@ $lang->caselib->createCase = 'Tạo tình huống';
|
||||
$lang->caselib->delete = "Xóa Suite";
|
||||
$lang->caselib->linkVersion = "Phiên bản";
|
||||
$lang->caselib->deleted = 'Đã xóa';
|
||||
$lang->caselib->exportTemplet = 'Xuất mẫu';
|
||||
$lang->caselib->exportTemplate = 'Xuất mẫu';
|
||||
$lang->caselib->batchCreateCase = 'Tạo hàng loạt';
|
||||
$lang->caselib->import = 'Nhập';
|
||||
$lang->caselib->importAction = 'Nhập tình huống';
|
||||
@@ -39,3 +39,6 @@ $lang->caselib->legendDesc = 'Mô tả';
|
||||
|
||||
$lang->caselib->libraryDelete = 'Bạn có muốn xóa thư viện này?';
|
||||
$lang->caselib->noModule = '<div>Chưa có Module.</div><div>Quản lý ngay.</div>';
|
||||
|
||||
$lang->caselib->featureBar['browse']['all'] = 'All';
|
||||
$lang->caselib->featureBar['browse']['wait'] = 'Waiting';
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
$lang->caselib->common = '用例库';
|
||||
$lang->caselib->all = '所有用例库';
|
||||
|
||||
$lang->caselib->index = "用例库首页";
|
||||
$lang->caselib->create = "创建用例库";
|
||||
$lang->caselib->edit = '编辑用例库';
|
||||
$lang->caselib->browse = '浏览用例库';
|
||||
$lang->caselib->view = '查看库概况';
|
||||
$lang->caselib->createCase = '创建用例';
|
||||
$lang->caselib->delete = "删除";
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->deleted = '已删除';
|
||||
$lang->caselib->exportTemplet = '导出模板';
|
||||
$lang->caselib->batchCreateCase = '批量创建用例';
|
||||
$lang->caselib->import = '导入';
|
||||
$lang->caselib->showImport = '显示导入数据';
|
||||
$lang->caselib->type = '类型';
|
||||
$lang->caselib->product = '所属' . $lang->productCommon;
|
||||
$lang->caselib->browseAction = '用例库列表';
|
||||
$lang->caselib->deleteAction = "删除用例库";
|
||||
$lang->caselib->importAction = '导入用例';
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->index = "用例库首页";
|
||||
$lang->caselib->create = "创建用例库";
|
||||
$lang->caselib->edit = '编辑用例库';
|
||||
$lang->caselib->browse = '浏览用例库';
|
||||
$lang->caselib->view = '查看库概况';
|
||||
$lang->caselib->createCase = '创建用例';
|
||||
$lang->caselib->delete = "删除";
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->deleted = '已删除';
|
||||
$lang->caselib->exportTemplate = '导出模板';
|
||||
$lang->caselib->batchCreateCase = '批量创建用例';
|
||||
$lang->caselib->import = '导入';
|
||||
$lang->caselib->showImport = '显示导入数据';
|
||||
$lang->caselib->type = '类型';
|
||||
$lang->caselib->product = '所属' . $lang->productCommon;
|
||||
$lang->caselib->browseAction = '用例库列表';
|
||||
$lang->caselib->deleteAction = "删除用例库";
|
||||
$lang->caselib->importAction = '导入用例';
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
|
||||
$lang->caselib->id = '编号';
|
||||
$lang->caselib->name = '名称';
|
||||
@@ -44,3 +44,6 @@ $lang->caselib->legendDesc = '描述';
|
||||
|
||||
$lang->caselib->libraryDelete = '您确认要删除该用例库吗?';
|
||||
$lang->caselib->noModule = '<div>您现在还没有模块信息</div><div>请维护用例库模块</div>';
|
||||
|
||||
$lang->caselib->featureBar['browse']['all'] = '所有';
|
||||
$lang->caselib->featureBar['browse']['wait'] = '待评审';
|
||||
|
||||
@@ -21,7 +21,7 @@ $lang->caselib->createCase = '創建用例';
|
||||
$lang->caselib->delete = "刪除";
|
||||
$lang->caselib->linkVersion = "版本";
|
||||
$lang->caselib->deleted = '已刪除';
|
||||
$lang->caselib->exportTemplet = '導出模板';
|
||||
$lang->caselib->exportTemplate = '導出模板';
|
||||
$lang->caselib->batchCreateCase = '批量創建用例';
|
||||
$lang->caselib->import = '導入';
|
||||
$lang->caselib->showImport = '顯示導入數據';
|
||||
|
||||
@@ -152,17 +152,19 @@ class caselibModel extends model
|
||||
/**
|
||||
* Get library list.
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getList($orderBy = 'id_desc', $pager = null)
|
||||
public function getList($type = 'all', $orderBy = 'id_desc', $pager = null)
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_TESTSUITE)
|
||||
->where('product')->eq(0)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->andWhere('type')->eq('library')
|
||||
->beginIF($type == 'review')->andWhere("FIND_IN_SET('{$this->app->user->account}', `reviewers`)")->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
@@ -220,13 +222,14 @@ class caselibModel extends model
|
||||
$browseType = ($browseType == 'bymodule' and $this->session->libBrowseType and $this->session->libBrowseType != 'bysearch') ? $this->session->libBrowseType : $browseType;
|
||||
|
||||
$cases = array();
|
||||
if($browseType == 'bymodule' or $browseType == 'all' or $browseType == 'wait')
|
||||
if($browseType == 'bymodule' or $browseType == 'all' or $browseType == 'wait' or $browseType == 'review')
|
||||
{
|
||||
$cases = $this->dao->select('*')->from(TABLE_CASE)
|
||||
->where('lib')->eq((int)$libID)
|
||||
->andWhere('product')->eq(0)
|
||||
->beginIF($moduleIdList)->andWhere('module')->in($moduleIdList)->fi()
|
||||
->beginIF($browseType == 'wait')->andWhere('status')->eq($browseType)->fi()
|
||||
->beginIF($browseType == 'review')->andWhere("FIND_IN_SET('{$this->app->user->account}', `reviewers`)")->fi()
|
||||
->andWhere('deleted')->eq('0')
|
||||
->orderBy($sort)->page($pager)->fetchAll('id');
|
||||
}
|
||||
|
||||
@@ -40,10 +40,12 @@ js::set('flow', $config->global->flow);
|
||||
</div>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
if(common::hasPriv('caselib', 'browse'))
|
||||
common::sortFeatureMenu();
|
||||
if(!$config->testcase->needReview && empty($config->testcase->forceReview)) unset($lang->caselib->featureBar['browse']['wait']);
|
||||
foreach($lang->caselib->featureBar['browse'] as $featureType => $label)
|
||||
{
|
||||
echo html::a($this->inlink('browse', "libID=$libID&browseType=all"), "<span class='text'>{$lang->testcase->allCases}</span>", '', "id='allTab' class='btn btn-link'");
|
||||
if($config->testcase->needReview or !empty($config->testcase->forceReview)) echo html::a($this->inlink('browse', "libID=$libID&browseType=wait"), "<span class='text'>" . $lang->testcase->statusList['wait'] . "</span>", '', "id='waitTab' class='btn btn-link'");
|
||||
$activeClass = $browseType == $featureType ? 'btn-active-text' : '';
|
||||
echo html::a(inlink('browse', "libID=$libID&browseType=$featureType"), "<span class='text'>$label</span>", '',"class='btn btn-link $activeClass' data-app={$app->tab} id=" . $featureType .'Tab');
|
||||
}
|
||||
?>
|
||||
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->testcase->bySearch;?></a>
|
||||
@@ -57,7 +59,7 @@ js::set('flow', $config->global->flow);
|
||||
}
|
||||
?>
|
||||
<div class='btn-group'>
|
||||
<?php common::printLink('caselib', 'exportTemplet', "libID=$libID", "<i class='icon icon-export muted'> </i> " . $lang->caselib->exportTemplet, '', "class='btn btn-link export' data-width='40%'");?>
|
||||
<?php common::printLink('caselib', 'exportTemplate', "libID=$libID", "<i class='icon icon-export muted'> </i> " . $lang->caselib->exportTemplate, '', "class='btn btn-link export' data-width='40%'");?>
|
||||
<?php common::printLink('caselib', 'import', "libID=$libID", "<i class='icon muted icon-import'> </i> " . $lang->testcase->fileImport, '', "class='btn btn-link export'");?>
|
||||
</div>
|
||||
<?php echo html::a($this->createLink('caselib', 'create'), "<i class='icon icon-plus'> </i> " . $lang->caselib->create, '', 'class="btn btn-secondary"');?>
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ function closeWindow()
|
||||
<div class="container">
|
||||
<div id="mainContent" class='main-content'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->testcase->exportTemplet;?></h2>
|
||||
<h2><?php echo $lang->testcase->exportTemplate;?></h2>
|
||||
</div>
|
||||
<form method='post' target='hiddenwin' onsubmit='setDownloading();' style='padding: 40px 5%'>
|
||||
<table class='table table-form'>
|
||||
@@ -1,10 +1,31 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php if(isset($suhosinInfo)):?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
|
||||
<?php
|
||||
$requiredFields = $datas->requiredFields;
|
||||
$allCount = $datas->allCount;
|
||||
$allPager = $datas->allPager;
|
||||
$pagerID = $datas->pagerID;
|
||||
$isEndPage = $datas->isEndPage;
|
||||
$maxImport = $datas->maxImport;
|
||||
$dataInsert = $datas->dataInsert;
|
||||
$fields = $datas->fields;
|
||||
$suhosinInfo = $datas->suhosinInfo;
|
||||
$model = $datas->model;
|
||||
$datas = $datas->datas;
|
||||
?>
|
||||
<style>
|
||||
form{overflow-x: scroll}
|
||||
.c-pri, .c-estStarted, .c-deadline{width:100px;}
|
||||
.c-estimate {width:150px;}
|
||||
.c-story{width:150px;}
|
||||
.c-team {width:100px; padding:0px 0px 8px 0px !important;}
|
||||
.c-estimate-1 {width:50px;padding:0px 0px 8px 8px !important;}
|
||||
</style>
|
||||
<?php if(!empty($suhosinInfo)):?>
|
||||
<div class='alert alert-info'><?php echo $suhosinInfo?></div>
|
||||
<?php elseif(empty($maxImport) and $allCount > $this->config->file->maxImport):?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class="main-header">
|
||||
<h2><?php echo $lang->caselib->import;?></h2>
|
||||
<h2><?php echo $lang->port->import;?></h2>
|
||||
</div>
|
||||
<p><?php echo sprintf($lang->file->importSummary, $allCount, html::input('maxImport', $config->file->maxImport, "style='width:50px'"), ceil($allCount / $config->file->maxImport));?></p>
|
||||
<p><?php echo html::commonButton($lang->import, "id='import'", 'btn btn-primary');?></p>
|
||||
@@ -23,118 +44,186 @@ $(function()
|
||||
<?php js::set('requiredFields', $requiredFields);?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class="main-header clearfix">
|
||||
<h2><?php echo $lang->caselib->import;?></h2>
|
||||
<h2><?php echo $lang->port->import;?></h2>
|
||||
</div>
|
||||
<form target='hiddenwin' method='post'>
|
||||
<form class='main-form' target='hiddenwin' method='post'>
|
||||
<table class='table table-form' id='showData'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-number'><?php echo $lang->testcase->id?></th>
|
||||
<th class='c-title' id='title'> <?php echo $lang->testcase->title?></th>
|
||||
<th class='c-module' id='module'> <?php echo $lang->testcase->module?></th>
|
||||
<th class='c-pri' id='pri'> <?php echo $lang->testcase->pri?></th>
|
||||
<th class='c-type' id='type'> <?php echo $lang->testcase->type?></th>
|
||||
<th class='c-stage' id='stage'> <?php echo $lang->testcase->stage?></th>
|
||||
<th class='c-text' id='keywords'> <?php echo $lang->testcase->keywords?></th>
|
||||
<th class='c-precondition' id='precondition'><?php echo $lang->testcase->precondition?></th>
|
||||
<th class='c-case-step col-content'>
|
||||
<th class='w-70px'> <?php echo $lang->port->id?></th>
|
||||
|
||||
<?php foreach($fields as $key => $value):?>
|
||||
|
||||
<?php if($key == 'stepDesc' or $key == 'stepExpect'):?>
|
||||
<?php if($key == 'stepExpect') continue;?>
|
||||
<th class='c-step'>
|
||||
<table class='w-p100 table-borderless'>
|
||||
<tr>
|
||||
<th><?php echo $lang->testcase->stepDesc?></th>
|
||||
<th><?php echo $lang->testcase->stepExpect?></th>
|
||||
<th class="no-padding"><?php echo $fields['stepDesc']['title']?></th>
|
||||
<th class="no-padding"><?php echo $fields['stepExpect']['title']?></th>
|
||||
</tr>
|
||||
</table>
|
||||
</th>
|
||||
|
||||
<?php elseif($value['control'] != 'hidden'):?>
|
||||
<th class='c-<?php echo $key?>' id='<?php echo $key;?>'> <?php echo $value['title'];?></th>
|
||||
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
<?php
|
||||
if(!empty($appendFields))
|
||||
{
|
||||
foreach($appendFields as $field)
|
||||
{
|
||||
if(!$field->show) continue;
|
||||
|
||||
$width = ($field->width && $field->width != 'auto' ? $field->width . 'px' : 'auto');
|
||||
$required = strpos(",$field->rules,", ",$notEmptyRule->id,") !== false ? 'required' : '';
|
||||
echo "<th class='$required' style='width: $width'>$field->name</th>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
$insert = true;
|
||||
$hideContentCol = true;
|
||||
?>
|
||||
<?php foreach($caseData as $key => $case):?>
|
||||
<?php if(empty($case->title)) continue;?>
|
||||
<?php if(!empty($case->id) and !isset($cases[$case->id])) $case->id = 0;?>
|
||||
<tr class='text-left' valign='top'>
|
||||
<td>
|
||||
<?php
|
||||
if(!empty($case->id))
|
||||
{
|
||||
echo $case->id . html::hidden("id[$key]", $case->id);
|
||||
$insert = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $key . " <sup class='text-green small'>{$lang->testcase->new}</sup>";
|
||||
}
|
||||
echo html::hidden("lib[$key]", $libID);
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo html::input("title[$key]", $case->title, "class='form-control' style='margin-top:2px'")?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("module[$key]", $modules, isset($case->module) ? $case->module : (!empty($case->id) ? $cases[$case->id]->module : ''), "class='form-control chosen'")?></td>
|
||||
<td><?php echo html::select("pri[$key]", $lang->testcase->priList, isset($case->pri) ? $case->pri : (!empty($case->id) ? $cases[$case->id]->pri : ''), "class='form-control chosen'")?></td>
|
||||
<td><?php echo html::select("type[$key]", $lang->testcase->typeList, isset($case->type) ? $case->type : (!empty($case->id) ? $cases[$case->id]->type : ''), "class='form-control chosen'")?></td>
|
||||
<td style='overflow:visible'><?php echo html::select("stage[$key][]", $lang->testcase->stageList, !empty($case->stage) ? $case->stage : (!empty($case->id) ? $cases[$case->id]->stage : ''), "multiple='multiple' class='form-control chosen'")?></td>
|
||||
<td><?php echo html::input("keywords[$key]", isset($case->keywords) ? $case->keywords : "", "class='form-control'")?></td>
|
||||
<td><?php echo html::textarea("precondition[$key]", isset($case->precondition) ? htmlSpecialString($case->precondition) : "", "class='form-control'")?></td>
|
||||
<td class='col-content'>
|
||||
<?php if(isset($stepData[$key]['desc'])):?>
|
||||
<table class='w-p100 bd-0'>
|
||||
<?php foreach($stepData[$key]['desc'] as $id => $desc):?>
|
||||
<?php
|
||||
if(empty($desc['content'])) continue;
|
||||
$hideContentCol = false;
|
||||
?>
|
||||
<tr class='step'>
|
||||
<td><?php echo $id . html::hidden("stepType[$key][$id]", $desc['type'])?></td>
|
||||
<td><?php echo html::textarea("desc[$key][$id]", htmlSpecialString($desc['content']), "class='form-control'")?></td>
|
||||
<td><?php if($desc['type'] != 'group') echo html::textarea("expect[$key][$id]", isset($stepData[$key]['expect'][$id]['content']) ? htmlSpecialString($stepData[$key]['expect'][$id]['content']) : '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='9' class='text-center form-actions'>
|
||||
<?php
|
||||
$insert = true;
|
||||
$addID = 1;
|
||||
$hasMultiple = false;
|
||||
?>
|
||||
<?php foreach($datas as $key => $object):?>
|
||||
<tr class='text-top'>
|
||||
<td>
|
||||
<?php
|
||||
$submitText = $isEndPage ? $this->lang->save : $this->lang->file->saveAndNext;
|
||||
if(!$insert and $dataInsert === '')
|
||||
if(!empty($object->id))
|
||||
{
|
||||
echo "<button type='button' data-toggle='modal' data-target='#importNoticeModal' class='btn btn-primary btn-wide'>{$submitText}</button>";
|
||||
echo $object->id . html::hidden("id[$key]", $object->id);
|
||||
$insert = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::submitButton($submitText);
|
||||
if($dataInsert !== '') echo html::hidden('insert', $dataInsert);
|
||||
$sub = (strpos($object->title, '>') === 0) ? " <sub style='vertical-align:sub;color:red'>{$lang->port->children}</sub>" : " <sub style='vertical-align:sub;color:gray'>{$lang->port->new}</sub>";
|
||||
echo $addID++ . $sub;
|
||||
}
|
||||
echo html::hidden("lib[$key]", $libID);
|
||||
?>
|
||||
</td>
|
||||
<?php foreach($fields as $field => $value):?>
|
||||
|
||||
<?php if($value['control'] == 'select'):?>
|
||||
<td><?php echo html::select("{$field}[$key]", $value['values'], !empty($object->$field) ? $object->$field : '', "class='form-control chosen'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'multiple'):?>
|
||||
<?php if(!isset($value['values'][''])) $value['values'][''] = '';?>
|
||||
<td><?php echo html::select("{$field}[$key][]", $value['values'], !empty($object->$field) ? $object->$field : '', "multiple class='form-control chosen'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'date'):?>
|
||||
<?php $dateMatch = $this->config->port->dateMatch;?>
|
||||
<?php if(!preg_match($dateMatch, $object->$field)) $object->$field = ''; ?>
|
||||
<td><?php echo html::input("{$field}[$key]", !empty($object->$field) ? $object->$field : '', "class='form-control form-date autocomplete='off'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'datetime'):?>
|
||||
<td><?php echo html::input("{$field}[$key]", !empty($object->$field) ? $object->$field : '', "class='form-control form-datetime autocomplete='off'")?></td>
|
||||
|
||||
<?php elseif($value['control'] == 'hidden'):?>
|
||||
<?php echo html::hidden("{$field}[$key]", $object->$field)?>
|
||||
|
||||
<?php elseif($value['control'] == 'textarea'):?>
|
||||
<td><?php echo html::textarea("{$field}[$key]", $object->$field, "class='form-control' cols='50' rows='1'")?></td>
|
||||
|
||||
<?php elseif($field == 'stepDesc' or $field == 'stepExpect'):?>
|
||||
<?php if($field == 'stepExpect') continue;?>
|
||||
<td>
|
||||
<?php if(isset($stepData[$key]['desc'])):?>
|
||||
<table class='w-p100 bd-0'>
|
||||
<?php $hasStep = false;?>
|
||||
<?php foreach($stepData[$key]['desc'] as $id => $desc):?>
|
||||
<?php if(empty($desc['content'])) continue;?>
|
||||
<tr class='step'>
|
||||
<?php $hasStep = true;?>
|
||||
<td><?php echo $id . html::hidden("stepType[$key][$id]", $desc['type'])?></td>
|
||||
<td><?php echo html::textarea("desc[$key][$id]", htmlSpecialString($desc['content']), "class='form-control'")?></td>
|
||||
<td><?php if($desc['type'] != 'group') echo html::textarea("expect[$key][$id]", isset($stepData[$key]['expect'][$id]['content']) ? htmlSpecialString($stepData[$key]['expect'][$id]['content']) : '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<?php if(!$hasStep):?>
|
||||
<tr class='step'>
|
||||
<td><?php echo '1' . html::hidden("stepType[$key][1]", 'step')?></td>
|
||||
<td><?php echo html::textarea("desc[$key][1]", '', "class='form-control'")?></td>
|
||||
<td><?php echo html::textarea("expect[$key][1]", '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
<?php else:?>
|
||||
<table class='w-p100 bd-0'>
|
||||
<tr class='step'>
|
||||
<td><?php echo '1' . html::hidden("stepType[$key][1]", 'step')?></td>
|
||||
<td><?php echo html::textarea("desc[$key][1]", '', "class='form-control'")?></td>
|
||||
<td><?php echo html::textarea("expect[$key][1]", '', "class='form-control'")?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
|
||||
<?php else:?>
|
||||
<td><?php echo html::input("{$field}[$key]", !empty($object->$field) ? $object->$field : '', "class='form-control autocomplete='off'")?></td>
|
||||
<?php endif;?>
|
||||
|
||||
<?php endforeach;?>
|
||||
<?php
|
||||
if(!empty($appendFields))
|
||||
{
|
||||
$this->loadModel('flow');
|
||||
foreach($appendFields as $field)
|
||||
{
|
||||
if(!$field->show) continue;
|
||||
$value = $field->defaultValue ? $field->defaultValue : zget($datas, $field->field, '');
|
||||
echo '<td>' . $this->flow->buildControl($field, $value, "$field->field[$key]", true) . '</td>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='10' class='text-center form-actions'>
|
||||
<?php
|
||||
$submitText = $isEndPage ? $this->lang->save : $this->lang->file->saveAndNext;
|
||||
$isStartPage = $pagerID == 1 ? true : false;
|
||||
if(!$insert and $dataInsert === '')
|
||||
{
|
||||
echo "<button type='button' data-toggle='modal' data-target='#importNoticeModal' class='btn btn-primary btn-wide'>{$submitText}</button>";
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::submitButton($submitText);
|
||||
if($dataInsert !== '') echo html::hidden('insert', $dataInsert);
|
||||
}
|
||||
echo html::hidden('isEndPage', $isEndPage ? 1 : 0);
|
||||
echo html::hidden('pagerID', $pagerID);
|
||||
echo ' ' . html::a($this->createLink('caselib', 'browse', "libID=$libID"), $lang->goback, '', 'class="btn btn-wide"');
|
||||
echo ' ' . html::a("javascript:history.back(-1)", $lang->goback, '', "class='btn btn-back btn-wide'");
|
||||
echo ' ' . sprintf($lang->file->importPager, $allCount, $pagerID, $allPager);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
<?php if(!$insert and $dataInsert === '') include '../../common/view/noticeimport.html.php';?>
|
||||
<?php if(!$insert and $dataInsert === '') include $app->getModuleRoot() . 'common/view/noticeimport.html.php';?>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php if(isset($hideContentCol) and $hideContentCol):?>
|
||||
<style>#mainContent .col-content{display: none;}</style>
|
||||
<?php endif;?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$.fixedTableHead('#showData');
|
||||
<?php if($hasMultiple):?>
|
||||
$('th.estimate').addClass('text-center w-250px');
|
||||
<?php endif;?>
|
||||
$("#showData th").each(function()
|
||||
{
|
||||
if(requiredFields.indexOf(this.id) !== -1) $("#" + this.id).addClass('required');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
|
||||
|
||||
+12
-10
@@ -149,16 +149,18 @@ class ci extends control
|
||||
->fetch();
|
||||
|
||||
$testtask = new stdclass();
|
||||
$testtask->product = $productID;
|
||||
$testtask->name = !empty($post->name) ? $post->name : sprintf($this->lang->testtask->titleOfAuto, date('Y-m-d H:i:s'));
|
||||
$testtask->owner = $this->app->user->account;
|
||||
$testtask->project = $lastProject->project;
|
||||
$testtask->execution = $lastProject->id;
|
||||
$testtask->build = 'trunk';
|
||||
$testtask->auto = strtolower($testType);
|
||||
$testtask->begin = date('Y-m-d');
|
||||
$testtask->end = date('Y-m-d', time() + 24 * 3600);
|
||||
$testtask->status = 'done';
|
||||
$testtask->product = $productID;
|
||||
$testtask->name = !empty($post->name) ? $post->name : sprintf($this->lang->testtask->titleOfAuto, date('Y-m-d H:i:s'));
|
||||
$testtask->owner = $this->app->user->account;
|
||||
$testtask->project = $lastProject->project;
|
||||
$testtask->execution = $lastProject->id;
|
||||
$testtask->build = 'trunk';
|
||||
$testtask->auto = strtolower($testType);
|
||||
$testtask->begin = date('Y-m-d');
|
||||
$testtask->end = date('Y-m-d', time() + 24 * 3600);
|
||||
$testtask->status = 'done';
|
||||
$testtask->createdBy = $this->app->user->account;
|
||||
$testtask->createdDate = helper::now();
|
||||
|
||||
$this->dao->insert(TABLE_TESTTASK)->data($testtask)->exec();
|
||||
$taskID = $this->dao->lastInsertId();
|
||||
|
||||
@@ -431,6 +431,7 @@ $lang->colorPicker->errorTip = 'Not a valid color value';
|
||||
$lang->downNotify = "Download Desktop Notification";
|
||||
$lang->clientName = "Desktop";
|
||||
$lang->downloadClient = "Download ZenTao Desktop";
|
||||
$lang->downloadMobile = "Download Mobile Terminal";
|
||||
$lang->clientHelp = "Client Help";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-im-integration-206.html";
|
||||
$lang->website = "http://www.zentao.net";
|
||||
|
||||
@@ -431,6 +431,7 @@ $lang->colorPicker->errorTip = 'Not a valid color value';
|
||||
$lang->downNotify = "Download Desktop Notification";
|
||||
$lang->clientName = "Desktop";
|
||||
$lang->downloadClient = "Download ZenTao Desktop";
|
||||
$lang->downloadMobile = "Download Mobile Terminal";
|
||||
$lang->clientHelp = "Client Help";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-im-integration-206.html";
|
||||
$lang->website = "https://www.zentao.pm";
|
||||
|
||||
@@ -431,6 +431,7 @@ $lang->colorPicker->errorTip = "Ce n'est pas une valeur de couleur valide";
|
||||
$lang->downNotify = "Télécharger la notification sur le bureau";
|
||||
$lang->clientName = "Desktop";
|
||||
$lang->downloadClient = "Télécharger ZenTao Desktop";
|
||||
$lang->downloadMobile = "Download Mobile Terminal";
|
||||
$lang->clientHelp = "Aide Client";
|
||||
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-im-integration-206.html";
|
||||
$lang->website = "https://www.zentao.pm";
|
||||
|
||||
@@ -320,7 +320,7 @@ $lang->execution->menu->task = array('link' => "{$lang->task->common}|execut
|
||||
$lang->execution->menu->kanban = array('link' => "$lang->executionKanban|execution|taskkanban|executionID=%s");
|
||||
$lang->execution->menu->burn = array('link' => "$lang->burn|execution|burn|executionID=%s");
|
||||
$lang->execution->menu->view = array('link' => "$lang->view|execution|grouptask|executionID=%s", 'alias' => 'grouptask,tree,taskeffort,gantt,calendar,relation,maintainrelation');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'batchcreate,linkstory,storykanban');
|
||||
$lang->execution->menu->story = array('link' => "$lang->SRCommon|execution|story|executionID=%s", 'subModule' => 'story', 'alias' => 'batchcreate,linkstory,storykanban,batchtotask');
|
||||
$lang->execution->menu->qa = array('link' => "{$lang->qa->common}|execution|bug|executionID=%s", 'subModule' => 'bug,testcase,testtask,testreport', 'alias' => 'qa,bug,testcase,testtask,testreport');
|
||||
$lang->execution->menu->devops = array('link' => "{$lang->repo->common}|repo|browse|repoID=0&branchID=&objectID=%s", 'subModule' => 'repo');
|
||||
$lang->execution->menu->doc = array('link' => "{$lang->doc->common}|doc|tableContents|type=execution&objectID=%s", 'subModule' => 'doc');
|
||||
|
||||
@@ -431,6 +431,7 @@ $lang->colorPicker->errorTip = '不是有效的颜色值';
|
||||
$lang->downNotify = "下载桌面提醒";
|
||||
$lang->clientName = "客户端";
|
||||
$lang->downloadClient = "下载客户端";
|
||||
$lang->downloadMobile = "下载移动端";
|
||||
$lang->clientHelp = "客户端使用说明";
|
||||
$lang->clientHelpLink = "http://www.zentao.net/book/zentaopmshelp/302.html#2";
|
||||
$lang->website = "https://www.zentao.net";
|
||||
|
||||
+48
-5
@@ -1232,8 +1232,7 @@ class commonModel extends model
|
||||
/**
|
||||
* Print the module menu.
|
||||
*
|
||||
* @param string $actveMenu
|
||||
* @param string $methodName
|
||||
* @param string $activeMenu
|
||||
* @static
|
||||
* @access public
|
||||
* @return void
|
||||
@@ -1423,6 +1422,9 @@ class commonModel extends model
|
||||
echo "<li class='dropdown-submenu'>";
|
||||
echo "<a href='javascript:;'>" . "<i class='icon icon-download'></i> " . $lang->clientName . "</a><ul class='dropdown-menu pull-left'>";
|
||||
echo '<li>' . html::a(helper::createLink('misc', 'downloadClient', '', '', true), $lang->downloadClient, '', "title='$lang->downloadClient' class='iframe text-ellipsis' data-width='600'") . '</li>';
|
||||
echo "<li class='dropdown-submenu' id='downloadMobile'><a href='javascript:;'>" . $lang->downloadMobile . "</a><ul class='dropdown-menu pull-left''>";
|
||||
echo "<li><div class='mobile-qrcode'><img src='{$config->webRoot}theme/default/images/main/mobile_qrcode.png' /><div class='mobile-version'><span>v1.2</span></div></div></li>";
|
||||
echo "</ul></li>";
|
||||
echo '<li>' . html::a($lang->clientHelpLink, $lang->clientHelp, '', "title='$lang->clientHelp' target='_blank'") . '</li>';
|
||||
echo '</ul></li>';
|
||||
}
|
||||
@@ -1521,10 +1523,12 @@ class commonModel extends model
|
||||
public static function printLink($module, $method, $vars = '', $label = '', $target = '', $misc = '', $newline = true, $onlyBody = false, $object = null)
|
||||
{
|
||||
/* Add data-app attribute. */
|
||||
global $app;
|
||||
global $app, $config;
|
||||
$currentModule = strtolower($module);
|
||||
$currentMethod = strtolower($method);
|
||||
if(strpos($misc, 'data-app') === false) $misc .= ' data-app="' . $app->tab . '"';
|
||||
|
||||
if(!commonModel::hasPriv($module, $method, $object)) return false;
|
||||
if(!commonModel::hasPriv($module, $method, $object) and !in_array("$currentModule.$currentMethod", $config->openMethods)) return false;
|
||||
echo html::a(helper::createLink($module, $method, $vars, '', $onlyBody), $label, $target, $misc, $newline);
|
||||
return true;
|
||||
}
|
||||
@@ -1966,7 +1970,7 @@ EOD;
|
||||
}
|
||||
}
|
||||
|
||||
$changes = array();
|
||||
$changes = array();
|
||||
foreach($new as $key => $value)
|
||||
{
|
||||
if(is_object($value) or is_array($value)) continue;
|
||||
@@ -3373,6 +3377,45 @@ EOD;
|
||||
|
||||
return $Parsedown->text($markdown);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort featureBar.
|
||||
*
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @static
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public static function sortFeatureMenu($module = '', $method = '')
|
||||
{
|
||||
global $lang, $config, $app;
|
||||
|
||||
$module = $module ? $module : $app->rawModule;
|
||||
$method = $method ? $method : $app->rawMethod;
|
||||
|
||||
/* It will be sorted according to the workflow in the future */
|
||||
if(!empty($config->featureBarSort[$module][$method]))
|
||||
{
|
||||
$featureBar = array();
|
||||
if(empty($lang->$module->featureBar[$method])) return false;
|
||||
foreach($lang->$module->featureBar[$method] as $key => $label)
|
||||
{
|
||||
foreach($config->featureBarSort[$module][$method] as $currentKey => $afterKey)
|
||||
{
|
||||
if($key == $currentKey) continue;
|
||||
$featureBar[$method][$key] = $label;
|
||||
if($key == $afterKey && !empty($lang->$module->featureBar[$method][$currentKey]))
|
||||
{
|
||||
$featureBar[$method][$currentKey] = $lang->$module->featureBar[$method][$currentKey];
|
||||
}
|
||||
}
|
||||
}
|
||||
$lang->$module->featureBar = $featureBar;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class common extends commonModel
|
||||
|
||||
@@ -11,14 +11,19 @@
|
||||
*/
|
||||
css::import($jsRoot . 'dhtmlxgantt/min.css');
|
||||
js::import($jsRoot . 'dhtmlxgantt/min.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_critical_path.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_fullscreen.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_smart_rendering.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_marker.js');
|
||||
js::import($jsRoot . 'dhtmlxgantt/ext/dhtmlxgantt_tooltip.js');
|
||||
$currentLang = $app->getClientLang();
|
||||
if($currentLang != 'en') js::import($jsRoot . 'dhtmlxgantt/lang/' . $currentLang . '.js');
|
||||
?>
|
||||
<style>
|
||||
.gantt_message_area{display:none;}
|
||||
#ganttPris:hover{background:unset;color:unset;cursor: unset;}
|
||||
</style>
|
||||
<script>
|
||||
gantt.plugins({
|
||||
marker: true,
|
||||
critical_path: true,
|
||||
fullscreen: true,
|
||||
tooltip: true,
|
||||
click_drag: true
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -385,7 +385,9 @@ class redmine11ConvertModel extends redmineConvertModel
|
||||
/* Insert into zentao */
|
||||
foreach($productPlans as $id => $productPlan)
|
||||
{
|
||||
$productPlan->product = $this->map['products'][$productPlan->execution_id];
|
||||
$productPlan->product = $this->map['products'][$productPlan->execution_id];
|
||||
$productPlan->createdBy = $this->app->user->account;
|
||||
$productPlan->createdDate = helper::now();
|
||||
unset($productPlan->id);
|
||||
unset($productPlan->execution_id);
|
||||
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCTPLAN)->data($productPlan)->exec();
|
||||
@@ -395,7 +397,9 @@ class redmine11ConvertModel extends redmineConvertModel
|
||||
foreach($this->map['products'] as $productID)
|
||||
{
|
||||
$productPlan = $this->dao->dbh($this->dbh)->select("name as title, createdDate as begin")->from(TABLE_PRODUCT)->where('id')->eq($productID)->fetch();
|
||||
$productPlan->product = $productID;
|
||||
$productPlan->product = $productID;
|
||||
$productPlan->createdBy = $this->app->user->account;
|
||||
$productPlan->createdDate = helper::now();
|
||||
$this->dao->dbh($this->dbh)->insert(TABLE_PRODUCTPLAN)->data($productPlan)->exec();
|
||||
$this->map['planOfProduct'][$productID] = $this->dao->lastinsertID();
|
||||
}
|
||||
|
||||
+15
-11
@@ -947,11 +947,13 @@ class convertModel extends model
|
||||
$productID = $projectProduct[$projectID];
|
||||
|
||||
$build = new stdclass();
|
||||
$build->product = $productID;
|
||||
$build->project = $projectID;
|
||||
$build->name = $data->vname;
|
||||
$build->date = substr($data->RELEASEDATE, 0, 10);
|
||||
$build->builder = $this->app->user->account;
|
||||
$build->product = $productID;
|
||||
$build->project = $projectID;
|
||||
$build->name = $data->vname;
|
||||
$build->date = substr($data->RELEASEDATE, 0, 10);
|
||||
$build->builder = $this->app->user->account;
|
||||
$build->createdBy = $this->app->user->account;
|
||||
$build->createdDate = helper::now();
|
||||
|
||||
$this->dao->dbh($this->dbh)->insert(TABLE_BUILD)->data($build)->exec();
|
||||
$buildID = $this->dao->dbh($this->dbh)->lastInsertID();
|
||||
@@ -989,12 +991,14 @@ class convertModel extends model
|
||||
if(empty($data->RELEASEDATE)) continue;
|
||||
|
||||
$release = new stdclass();
|
||||
$release->product = $build->product;
|
||||
$release->build = $buildID;
|
||||
$release->name = $build->name;
|
||||
$release->date = $build->date;
|
||||
$release->desc = $data->DESCRIPTION;
|
||||
$release->status = 'normal';
|
||||
$release->product = $build->product;
|
||||
$release->build = $buildID;
|
||||
$release->name = $build->name;
|
||||
$release->date = $build->date;
|
||||
$release->desc = $data->DESCRIPTION;
|
||||
$release->status = 'normal';
|
||||
$release->createdBy = $this->app->user->account;
|
||||
$release->createdDate = helper::now();
|
||||
|
||||
$this->dao->dbh($this->dbh)->insert(TABLE_RELEASE)->data($release)->exec();
|
||||
$releaseID = $this->dao->dbh($this->dbh)->lastInsertID();
|
||||
|
||||
@@ -609,7 +609,7 @@ class custom extends control
|
||||
if($this->config->edition != 'max') $this->loadModel('setting')->setItem('system.custom.hourPoint', $this->post->hourPoint);
|
||||
|
||||
$this->app->loadLang('common');
|
||||
$locate = $this->config->systemMode == 'new' ? 'parent' : 'top';
|
||||
$locate = $this->config->systemMode == 'new' ? inlink('flow') : 'top';
|
||||
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
|
||||
}
|
||||
|
||||
+41
-14
@@ -319,19 +319,8 @@ class doc extends control
|
||||
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $docID));
|
||||
$objectID = zget($lib, $lib->type, 0);
|
||||
$params = "type={$lib->type}&objectID=$objectID&libID={$lib->id}&docID=" . $docResult['id'];
|
||||
$link = isonlybody() ? 'parent' : $this->createLink('doc', 'objectLibs', $params, 'html') . '#app=' . $this->app->tab;
|
||||
$response = array('result' => 'success', 'message' => $this->lang->saveSuccess);
|
||||
|
||||
if(isonlybody() and $docResult['docType'] == 'text')
|
||||
{
|
||||
$link = helper::createLink('doc', 'edit', "docID=$docID&comment=false&objectType=$objectType&objectID=$objectID&libID={$docResult['libID']}");
|
||||
|
||||
$response['callback'] = "redirect2Edit($docID, \"$objectType\", $objectID, {$docResult['libID']})";
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['locate'] = "$link";
|
||||
}
|
||||
$link = isonlybody() ? 'parent' : $this->createLink('doc', 'objectLibs', $params) . '#app=' . $this->app->tab;
|
||||
$response = array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $link);
|
||||
|
||||
return $this->send($response);
|
||||
}
|
||||
@@ -394,6 +383,45 @@ class doc extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create basic info for doc of text type.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param int $objectID
|
||||
* @param int|string $libID
|
||||
* @param int $moduleID
|
||||
* @param string $docType
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function createBasicInfo($objectType, $objectID, $libID, $moduleID = 0, $docType = '')
|
||||
{
|
||||
/* Get libs and the default lib id. */
|
||||
$unclosed = strpos($this->config->doc->custom->showLibs, 'unclosed') !== false ? 'unclosedProject' : '';
|
||||
$libs = $this->doc->getLibs($objectType, $extra = "withObject,$unclosed", $libID, $objectID);
|
||||
if(!$libID and !empty($libs)) $libID = key($libs);
|
||||
|
||||
$lib = $this->doc->getLibByID($libID);
|
||||
$type = isset($lib->type) ? $lib->type : 'product';
|
||||
$libName = isset($lib->name) ? $lib->name . $this->lang->colon : '';
|
||||
|
||||
$this->view->title = $libName . $this->lang->doc->create;
|
||||
|
||||
$this->view->objectType = $objectType;
|
||||
$this->view->objectID = zget($lib, $lib->type, 0);
|
||||
$this->view->libID = $libID;
|
||||
$this->view->lib = $lib;
|
||||
$this->view->libs = $libs;
|
||||
$this->view->libName = $this->dao->findByID($libID)->from(TABLE_DOCLIB)->fetch('name');
|
||||
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0);
|
||||
$this->view->moduleID = $moduleID ? (int)$moduleID : (int)$this->cookie->lastDocModule;
|
||||
$this->view->docType = $docType;
|
||||
$this->view->groups = $this->loadModel('group')->getPairs();
|
||||
$this->view->users = $this->user->getPairs('nocode|noclosed|nodeleted');
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a doc.
|
||||
*
|
||||
@@ -983,7 +1011,6 @@ class doc extends control
|
||||
|
||||
$this->lang->TRActions = $this->doc->buildCollectButton4Doc();
|
||||
$this->lang->TRActions .= $this->doc->buildBrowseSwitch($type, $objectID, $viewType, $orderBy, $recTotal, $recPerPage, $pageID, $searchTitle);
|
||||
if($this->app->tab == 'doc') $this->app->rawMethod = $type;
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#whiteListBox .input-group:last-child {margin-top: 10px;}
|
||||
@@ -61,6 +61,68 @@ $(function()
|
||||
});
|
||||
|
||||
if($(".createCustomLib").length == 1) $(".createCustomLib").click(); // Fix bug #15139.
|
||||
|
||||
if(!fromGlobal && textType.indexOf(docType) != -1)
|
||||
{
|
||||
var basicInfo = JSON.parse(sessionStorage.getItem('docBasicInfo'));
|
||||
|
||||
var libID = 0;
|
||||
var moduleID = 0;
|
||||
var title = '';
|
||||
var keywords = '';
|
||||
var type = '';
|
||||
var acl = '';
|
||||
var contentType = '';
|
||||
var fileNames = [];
|
||||
var mailto = [];
|
||||
var groups = [];
|
||||
var users = [];
|
||||
|
||||
$.each(basicInfo, function(index, value)
|
||||
{
|
||||
switch(value.name)
|
||||
{
|
||||
case 'lib':
|
||||
libID = value.value;
|
||||
break;
|
||||
case 'module':
|
||||
moduleID = value.value;
|
||||
break;
|
||||
case 'title':
|
||||
title = value.value;
|
||||
break;
|
||||
case 'keywords':
|
||||
keywords = value.value;
|
||||
break;
|
||||
case 'type':
|
||||
type = value.value;
|
||||
break;
|
||||
case 'acl':
|
||||
acl = value.value;
|
||||
break;
|
||||
case 'contentType':
|
||||
contentType = value.value;
|
||||
break;
|
||||
case 'mailto[]':
|
||||
mailto.push(value.value);
|
||||
break;
|
||||
case 'groups[]':
|
||||
groups.push(value.value);
|
||||
break;
|
||||
case 'users[]':
|
||||
users.push(value.value);
|
||||
break;
|
||||
}
|
||||
})
|
||||
|
||||
$('#title').val(title);
|
||||
$('#modalBasicInfo #keywords').val(keywords);
|
||||
$('#modalBasicInfo #mailto').data('zui.picker').setValue(mailto);
|
||||
$('#modalBasicInfo input:radio[value='+ acl +']').attr('checked', 'checked');
|
||||
toggleAcl($('input[name="acl"]:checked').val(), 'doc');
|
||||
setTimeout(function(){$('#modalBasicInfo #groups').data('zui.picker').setValue(groups)}, 1000);
|
||||
setTimeout(function(){$('#modalBasicInfo #users').data('zui.picker').setValue(users)}, 1000);
|
||||
}
|
||||
})
|
||||
|
||||
function toggleEditor(type)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
$(function()
|
||||
{
|
||||
config.onlybody = 'no';
|
||||
|
||||
toggleAcl($('input[name="acl"]:checked').val(), 'doc');
|
||||
|
||||
if($(".createCustomLib").length == 1) $(".createCustomLib").click(); // Fix bug #15139.
|
||||
|
||||
$('#saveBtn').click(function()
|
||||
{
|
||||
var params = $('#dataform').serializeArray();
|
||||
|
||||
sessionStorage.setItem('docBasicInfo', JSON.stringify(params));
|
||||
|
||||
var libID = $('#lib').val();
|
||||
var moduleID = $('#module').val();
|
||||
var link = createLink('doc', 'create', 'objectType=' + objectType + '&objectID=' + objectID + '&libID=' + libID + '&moduleID=' + moduleID + '&docType=' + docType);
|
||||
|
||||
parent.location.href = link;
|
||||
})
|
||||
})
|
||||
|
||||
/**
|
||||
* Load whitelist by libID.
|
||||
*
|
||||
* @param int $libID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadWhitelist(libID)
|
||||
{
|
||||
var groupLink = createLink('doc', 'ajaxGetWhitelist', 'libID=' + libID + '&acl=&control=group');
|
||||
var userLink = createLink('doc', 'ajaxGetWhitelist', 'libID=' + libID + '&acl=&control=user');
|
||||
$.post(groupLink, function(groups)
|
||||
{
|
||||
if(groups != 'private')
|
||||
{
|
||||
$('#groups').replaceWith(groups);
|
||||
$('#groups').next('.picker').remove();
|
||||
$('#groups').picker();
|
||||
}
|
||||
});
|
||||
|
||||
$.post(userLink, function(users)
|
||||
{
|
||||
if(users == 'private')
|
||||
{
|
||||
$('#aclopen').parent('.radio-inline').addClass('hidden');
|
||||
$('#aclcustom').parent('.radio-inline').addClass('hidden');
|
||||
$('#whiteListBox').addClass('hidden');
|
||||
$('#aclprivate').prop('checked', true);
|
||||
}
|
||||
else if(users == 'project')
|
||||
{
|
||||
$('#aclprivate').parent('.radio-inline').addClass('hidden');
|
||||
$('#aclcustom').parent('.radio-inline').addClass('hidden');
|
||||
$('#whiteListBox').addClass('hidden');
|
||||
$('#aclopen').prop('checked', true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#aclopen').parent('.radio-inline').removeClass('hidden');
|
||||
$('#aclcustom').parent('.radio-inline').removeClass('hidden');
|
||||
|
||||
$('#users').replaceWith(users);
|
||||
$('#users').next('.picker').remove();
|
||||
$('#users').picker();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1,3 +1,8 @@
|
||||
$(function()
|
||||
{
|
||||
loadDocLibs('product');
|
||||
})
|
||||
|
||||
/**
|
||||
* Redirect the parent window.
|
||||
*
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = 'Main Document Library';
|
||||
$lang->doc->order = 'Order';
|
||||
$lang->doc->doc = 'Document';
|
||||
$lang->doc->updateOrder = 'Update Order';
|
||||
$lang->doc->nextStep = 'Next';
|
||||
|
||||
$lang->doc->moduleDoc = 'Nach Modulen';
|
||||
$lang->doc->searchDoc = 'Suche';
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = 'Main Document Library';
|
||||
$lang->doc->order = 'Order';
|
||||
$lang->doc->doc = 'Document';
|
||||
$lang->doc->updateOrder = 'Update Order';
|
||||
$lang->doc->nextStep = 'Next';
|
||||
|
||||
$lang->doc->moduleDoc = 'By Module';
|
||||
$lang->doc->searchDoc = 'Search';
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = 'Main Document Library';
|
||||
$lang->doc->order = 'Order';
|
||||
$lang->doc->doc = 'Document';
|
||||
$lang->doc->updateOrder = 'Update Order';
|
||||
$lang->doc->nextStep = 'Next';
|
||||
|
||||
$lang->doc->moduleDoc = 'Par Module';
|
||||
$lang->doc->searchDoc = 'Rechercher';
|
||||
|
||||
@@ -94,6 +94,7 @@ $lang->doc->main = '文档主库';
|
||||
$lang->doc->order = '排序';
|
||||
$lang->doc->doc = '文档';
|
||||
$lang->doc->updateOrder = '更新排序';
|
||||
$lang->doc->nextStep = '下一步';
|
||||
|
||||
$lang->doc->moduleDoc = '按模块浏览';
|
||||
$lang->doc->searchDoc = '搜索';
|
||||
|
||||
+16
-10
@@ -1649,7 +1649,7 @@ class docModel extends model
|
||||
if(!$this->checkPrivDoc($doc)) unset($docs[$id]);
|
||||
}
|
||||
|
||||
$bugIdList = $testReportIdList = $caseIdList = $storyIdList = $planIdList = $releaseIdList = $executionIdList = $taskIdList = $buildIdList = $issueIdList = $meetingIdList = $designIdList = 0;
|
||||
$bugIdList = $testReportIdList = $caseIdList = $storyIdList = $planIdList = $releaseIdList = $executionIdList = $taskIdList = $buildIdList = $issueIdList = $meetingIdList = $designIdList = $reviewIdList = 0;
|
||||
|
||||
$userView = $this->app->user->view->products;
|
||||
if($type == 'project') $userView = $this->app->user->view->projects;
|
||||
@@ -1685,9 +1685,10 @@ class docModel extends model
|
||||
{
|
||||
$issueIdList = $this->dao->select('id')->from(TABLE_ISSUE)->where('project')->eq($objectID)->andWhere('deleted')->eq('0')->andWhere('project')->in($this->app->user->view->projects)->get();
|
||||
$meetingIdList = $this->dao->select('id')->from(TABLE_MEETING)->where('project')->eq($objectID)->andWhere('deleted')->eq('0')->andWhere('project')->in($this->app->user->view->projects)->get();
|
||||
$reviewIdList = $this->dao->select('id')->from(TABLE_REVIEW)->where('project')->eq($objectID)->andWhere('deleted')->eq('0')->andWhere('project')->in($this->app->user->view->projects)->get();
|
||||
}
|
||||
|
||||
$designIdList = $this->dao->select('id')->from(TABLE_DESIGN)->where('project')->eq($objectID)->andWhere('deleted')->eq('0')->andWhere('project')->in($this->app->user->view->projects)->get();
|
||||
$designIdList = $this->dao->select('id')->from(TABLE_DESIGN)->where('project')->eq($objectID)->andWhere('deleted')->eq('0')->andWhere('project')->in($this->app->user->view->projects)->get();
|
||||
$executionIdList = $this->loadModel('execution')->getIdList($objectID);
|
||||
$taskPairs = $this->dao->select('id')->from(TABLE_TASK)->where('execution')->in($executionIdList)->andWhere('deleted')->eq('0')->andWhere('execution')->in($this->app->user->view->sprints)->fetchPairs('id');
|
||||
if(!empty($taskPairs)) $taskIdList = implode(',', $taskPairs);
|
||||
@@ -1720,6 +1721,7 @@ class docModel extends model
|
||||
->beginIF($type == 'project')
|
||||
->orWhere("(objectType = 'execution' and objectID in ('$executionIdList'))")
|
||||
->orWhere("(objectType = 'issue' and objectID in ($issueIdList))")
|
||||
->orWhere("(objectType = 'review' and objectID in ($reviewIdList))")
|
||||
->orWhere("(objectType = 'meeting' and objectID in ($meetingIdList))")
|
||||
->orWhere("(objectType = 'design' and objectID in ($designIdList))")
|
||||
->fi()
|
||||
@@ -1761,11 +1763,14 @@ class docModel extends model
|
||||
$sourceList[$file->objectType][$file->objectID] = $file->objectID;
|
||||
}
|
||||
|
||||
$this->app->loadConfig('action');
|
||||
foreach($sourceList as $type => $idList)
|
||||
{
|
||||
$table = $this->config->objectTables[$type];
|
||||
$title = in_array($type, array('story', 'bug', 'issue', 'case', 'testcase', 'testreport', 'doc', 'requirement')) ? 'title' : 'name';
|
||||
$name = $this->dao->select('id,' . $title)->from($table)->where('id')->in($idList)->fetchPairs('id');
|
||||
$table = zget($this->config->objectTables, $type, '');
|
||||
$field = zget($this->config->action->objectNameFields, $type, '');
|
||||
if(empty($table) or empty($field)) continue;
|
||||
|
||||
$name = $this->dao->select('id,' . $field)->from($table)->where('id')->in($idList)->fetchPairs('id', $field);
|
||||
$sourcePairs[$type] = $name;
|
||||
}
|
||||
|
||||
@@ -2126,11 +2131,12 @@ class docModel extends model
|
||||
{
|
||||
foreach($this->lang->doc->typeList as $typeKey => $typeName)
|
||||
{
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', 'create', "objectType=$objectType&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon icon'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$method = strpos($this->config->doc->textTypes, $typeKey) !== false ? 'createBasicInfo' : 'create';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', $method, "objectType=$objectType&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon icon'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
if($typeKey == 'url') $html .= '<li class="divider"></li>';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php if($docType == 'text' and $fromGlobal):?>
|
||||
<?php if(strpos($config->doc->textTypes, $docType) !== false and $from == 'doc'):?>
|
||||
<?php include 'createtexttype.html.php';?>
|
||||
<?php else:?>
|
||||
<?php if($docType != '' and strpos($config->doc->officeTypes, $docType) !== false):?>
|
||||
@@ -72,8 +72,7 @@ $("a[href^='###']").click(function()
|
||||
<th><?php echo $lang->doc->keywords;?></th>
|
||||
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control' placeholder='{$lang->doc->keywordsTips}'");?></td>
|
||||
</tr>
|
||||
<?php $docContentHidden = strpos($this->config->doc->textTypes, $docType) !== false ? 'hidden' : '';?>
|
||||
<tr id='contentBox' class="<?php echo $docContentHidden;?>">
|
||||
<tr id='contentBox'>
|
||||
<th><?php echo $lang->doc->content;?></th>
|
||||
<td colspan='2'>
|
||||
<div class='contenthtml'><?php echo html::textarea('content', '', "style='width:100%;height:200px'");?></div>
|
||||
@@ -144,7 +143,9 @@ $("a[href^='###']").click(function()
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('textType', $config->doc->textTypes);?>
|
||||
<?php js::set('docType', $docType);?>
|
||||
<?php js::set('fromGlobal', $fromGlobal);?>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
/**
|
||||
* The create basic info view of doc module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Fangzhou Hu <hufangzhou@easycorp.ltd>
|
||||
* @package doc
|
||||
* @version $Id: createbasicinfo.html.php 2022-08-02 13:49:25Z $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php js::set('holders', $lang->doc->placeholder);?>
|
||||
<?php js::set('type', 'doc');?>
|
||||
<div id="mainContent" class="main-content">
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->doc->create;?></h2>
|
||||
</div>
|
||||
<?php if($objectType == 'custom' and empty($libs)):?>
|
||||
<?php echo html::a(helper::createLink('doc', 'createLib', "type=custom&objectID=$objectID"), '<i class="icon icon-plus"></i> ' . $lang->doc->createLib, '', 'class="iframe hidden createCustomLib"');?>
|
||||
<?php endif;?>
|
||||
<form class="load-indicator main-form form-ajax" id="dataform" method='post' enctype='multipart/form-data'>
|
||||
<table class='table table-form'>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class='w-110px'><?php echo $lang->doc->lib;?></th>
|
||||
<td> <?php echo html::select('lib', $libs, $libID, "class='form-control chosen' onchange=loadDocModule(this.value)");?> </td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->module;?></th>
|
||||
<td>
|
||||
<span id='moduleBox'><?php echo html::select('module', $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></span>
|
||||
</td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->title;?></th>
|
||||
<td colspan='2'><?php echo html::input('title', '', "class='form-control'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->keywords;?></th>
|
||||
<td colspan='2'><?php echo html::input('keywords', '', "class='form-control' placeholder='{$lang->doc->keywordsTips}'");?></td>
|
||||
</tr>
|
||||
<tr class='hidden'>
|
||||
<th><?php echo $lang->doc->type;?></th>
|
||||
<?php
|
||||
$typeKeyList = array();
|
||||
foreach($lang->doc->types as $typeKey => $typeName) $typeKeyList[$typeKey] = $typeKey;
|
||||
?>
|
||||
<td><?php echo html::radio('type', $lang->doc->types, zget($typeKeyList, $docType, 'text'));?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doc->mailto;?></th>
|
||||
<td colspan="2">
|
||||
<div class="input-group">
|
||||
<?php
|
||||
echo html::select('mailto[]', $users, '', "multiple class='form-control picker-select' data-drop-direction='top'");
|
||||
echo $this->fetch('my', 'buildContactLists');
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->doclib->control;?></th>
|
||||
<td colspan='2'>
|
||||
<?php $acl = $lib->acl == 'default' ? 'open' : $lib->acl;?>
|
||||
<?php $acl = ($lib->type == 'project' and $acl == 'private') ? 'open' : $acl;?>
|
||||
<?php echo html::radio('acl', $lang->doc->aclList, $acl, "onchange='toggleAcl(this.value, \"doc\")'");?>
|
||||
<span class='text-info' id='noticeAcl'><?php echo $lang->doc->noticeAcl['doc'][$acl];?></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id='whiteListBox' class='hidden'>
|
||||
<th><?php echo $lang->doc->whiteList;?></th>
|
||||
<td colspan='2'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon groups-addon'><?php echo $lang->doclib->group?></span>
|
||||
<?php echo html::select('groups[]', $groups, '', "class='form-control picker-select' multiple data-drop-direction='top'")?>
|
||||
</div>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->doclib->user?></span>
|
||||
<?php echo html::select('users[]', $users, '', "class='form-control picker-select' multiple data-drop-direction='top'")?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'>
|
||||
<?php echo html::hidden('contentType', 'html');?>
|
||||
<?php echo html::commonButton($lang->doc->nextStep, "id='saveBtn'", "btn btn-wide btn-primary");?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('objectType', $objectType);?>
|
||||
<?php js::set('objectID', $objectID);?>
|
||||
<?php js::set('docType', $docType);?>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -35,10 +35,9 @@
|
||||
.ke-toolbar {padding-left: 20px; width: 100%; height: 30px;}
|
||||
.ke-edit {border-top: 1px solid rgb(220, 220, 220)}
|
||||
.ke-edit, .CodeMirror {margin: 8px 200px 0 200px; background: #fff;}
|
||||
.kindeditor-ph {padding-left: 20px !important;}
|
||||
.kindeditor-ph {padding: 20px 20px 0 20px !important;}
|
||||
.editor-toolbar {background: #fff; padding-left: 20px; border-right: unset; border-top: unset; height: 30px;}
|
||||
.hide-sidebar .ke-edit {padding-right: 20px;}
|
||||
.hide-sidebar .CodeMirror {padding-right: 50px;}
|
||||
.CodeMirror {padding: 20px 20px 0 20px;}
|
||||
.CodeMirror.CodeMirror-wrap {border-left: 0; border-right: 0; border-bottom: 0;}
|
||||
.ke-statusbar {display: none;}
|
||||
.contentmarkdown {background: #efefef;}
|
||||
@@ -55,7 +54,6 @@
|
||||
#backBtn i {font-size: 20px;}
|
||||
|
||||
.modal-title {font-size: 14px !important; font-weight: 700 !important;}
|
||||
#modalBasicInfo .modal-dialog {width: 720px;}
|
||||
</style>
|
||||
<?php if($objectType == 'custom' and empty($libs)):?>
|
||||
<?php echo html::a(helper::createLink('doc', 'createLib', "type=custom&objectID=$objectID"), '<i class="icon icon-plus"></i> ' . $lang->doc->createLib, '', 'class="iframe hidden createCustomLib"');?>
|
||||
@@ -97,9 +95,6 @@
|
||||
<div class='modal-dialog'>
|
||||
<div class='modal-content with-padding'>
|
||||
<div class='modal-header'>
|
||||
<button type='button' class='close' data-dismiss='modal'>
|
||||
<i class="icon icon-close"></i>
|
||||
</button>
|
||||
<h2 class='modal-title'><?php echo $lang->doc->basicInfo;?></h2>
|
||||
</div>
|
||||
<div class='modal-body'>
|
||||
@@ -159,7 +154,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->save, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->close, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -176,20 +171,13 @@ $(function()
|
||||
setTimeout(function(){$('.ke-edit-iframe, .ke-edit').height(contentHeight);}, 100);
|
||||
setTimeout(function(){$('.CodeMirror').height(contentHeight);}, 100);
|
||||
|
||||
//basicInfoContent = '';
|
||||
//$('#basicInfoLink').click(function()
|
||||
//{
|
||||
// basicInfoContent = $('#basicInfoBox').html();
|
||||
//});
|
||||
|
||||
//$('#modalBasicInfo .modal-header .close').click(function()
|
||||
//{
|
||||
// $('#basicInfoBox').html(basicInfoContent);
|
||||
//});
|
||||
|
||||
$(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');});
|
||||
|
||||
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
|
||||
})
|
||||
</script>
|
||||
<?php js::set('textType', $config->doc->textTypes);?>
|
||||
<?php js::set('docType', $docType);?>
|
||||
<?php js::set('fromGlobal', $fromGlobal);?>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -39,10 +39,9 @@
|
||||
.ke-toolbar {padding-left: 20px; width: 100%; height: 30px;}
|
||||
.ke-edit {border-top: 1px solid rgb(220, 220, 220)}
|
||||
.ke-edit, .CodeMirror {margin: 8px 200px 0 200px; background: #fff;}
|
||||
.kindeditor-ph {padding-left: 20px !important;}
|
||||
.kindeditor-ph {padding: 20px 20px 0 20px !important;}
|
||||
.editor-toolbar {background: #fff; padding-left: 20px; border-right: unset; border-top: unset; height: 30px;}
|
||||
.hide-sidebar .ke-edit {padding-right: 20px;}
|
||||
.hide-sidebar .CodeMirror {padding-right: 50px;}
|
||||
.CodeMirror {padding: 20px 20px 0 20px;}
|
||||
.CodeMirror.CodeMirror-wrap {border-left: 0; border-right: 0; border-bottom: 0;}
|
||||
.ke-statusbar {display: none;}
|
||||
|
||||
@@ -58,7 +57,6 @@
|
||||
#backBtn i {font-size: 20px;}
|
||||
|
||||
.modal-title {font-size: 14px !important; font-weight: 700 !important;}
|
||||
#modalBasicInfo .modal-dialog {width: 720px;}
|
||||
</style>
|
||||
<?php $backLink = $this->createLink('doc', 'objectlibs', "type=$type&objectID=$objectID&libID={$lib->id}&docID={$doc->id}");?>
|
||||
<div id="mainContent" class="main-content">
|
||||
@@ -101,9 +99,6 @@
|
||||
<div class='modal-dialog'>
|
||||
<div class='modal-content with-padding'>
|
||||
<div class='modal-header'>
|
||||
<button type='button' class='close' data-dismiss='modal'>
|
||||
<i class="icon icon-close"></i>
|
||||
</button>
|
||||
<h2 class='modal-title'><?php echo $lang->doc->basicInfo;?></h2>
|
||||
</div>
|
||||
<div class='modal-body'>
|
||||
@@ -160,7 +155,7 @@
|
||||
</tr>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->save, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->close, '', "class='btn btn-primary btn-wide'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -177,18 +172,9 @@ $(function()
|
||||
setTimeout(function(){$('.ke-edit-iframe, .ke-edit').height(contentHeight);}, 100);
|
||||
setTimeout(function(){$('.CodeMirror').height(contentHeight);}, 100);
|
||||
|
||||
//basicInfoContent = '';
|
||||
//$('#basicInfoLink').click(function()
|
||||
//{
|
||||
// basicInfoContent = $('#basicInfoBox').html();
|
||||
//});
|
||||
|
||||
//$('#modalBasicInfo .modal-header .close').click(function()
|
||||
//{
|
||||
// $('#basicInfoBox').html(basicInfoContent);
|
||||
//});
|
||||
|
||||
$(document).on('click', '#modalBasicInfo tfoot .btn', function() {$('#modalBasicInfo').modal('hide');});
|
||||
|
||||
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
|
||||
})
|
||||
</script>
|
||||
<?php js::set('noticeAcl', $lang->doc->noticeAcl['doc']);?>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<td><?php echo html::radio('type', $lang->doc->types, 'text');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'><?php echo html::submitButton($lang->confirm);?></td>
|
||||
<td colspan='3' class='text-center form-actions'><?php echo html::submitButton($lang->doc->nextStep);?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
@@ -45,9 +45,20 @@
|
||||
<?php echo str_replace('.' . $file->extension, '', $file->title);?>
|
||||
</td>
|
||||
<td class='c-name'>
|
||||
<?php echo ($file->objectType == 'requirement' ? $lang->URCommon : $lang->{$file->objectType}->common) . ' : ';?>
|
||||
<a title='<?php echo $sourcePairs[$file->objectType][$file->objectID];?>' href='<?php echo $this->createLink(($file->objectType == 'requirement' ? 'story' : $file->objectType), 'view', "objectID=$file->objectID", '', true);?>' class='iframe' data-width='90%'>
|
||||
<?php echo $sourcePairs[$file->objectType][$file->objectID];?>
|
||||
<?php
|
||||
if($file->objectType == 'requirement')
|
||||
{
|
||||
$commonTitle = $lang->URCommon . ' : ';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!isset($lang->{$file->objectType}->common)) $app->loadLang($file->objectType);
|
||||
$commonTitle = $lang->{$file->objectType}->common . ' : ';
|
||||
}
|
||||
echo $commonTitle;
|
||||
?>
|
||||
<a title='<?php if(isset($sourcePairs[$file->objectType][$file->objectID])) echo $sourcePairs[$file->objectType][$file->objectID];?>' href='<?php echo $this->createLink(($file->objectType == 'requirement' ? 'story' : $file->objectType), 'view', "objectID=$file->objectID", '', true);?>' class='iframe' data-width='90%'>
|
||||
<?php if(isset($sourcePairs[$file->objectType][$file->objectID])) echo $sourcePairs[$file->objectType][$file->objectID];?>
|
||||
</a>
|
||||
</td>
|
||||
<td><?php echo $file->extension;?></td>
|
||||
@@ -101,9 +112,20 @@
|
||||
</a>
|
||||
<div class='file-name' title='<?php echo $file->title;?>'><?php echo $file->title;?></a></div>
|
||||
<div class='file-name text-muted'>
|
||||
<?php echo ($file->objectType == 'requirement' ? $lang->URCommon : $lang->{$file->objectType}->common) . ' : ';?>
|
||||
<a href='<?php echo $this->createLink(($file->objectType == 'requirement' ? 'story' : $file->objectType), 'view', "objectID=$file->objectID", '', true);?>' title='<?php echo $sourcePairs[$file->objectType][$file->objectID];?>' class='iframe' data-width='90%'>
|
||||
<?php echo $sourcePairs[$file->objectType][$file->objectID];?>
|
||||
<?php
|
||||
if($file->objectType == 'requirement')
|
||||
{
|
||||
$commonTitle = $lang->URCommon . ' : ';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!isset($lang->{$file->objectType}->common)) $app->loadLang($file->objectType);
|
||||
$commonTitle = $lang->{$file->objectType}->common . ' : ';
|
||||
}
|
||||
echo $commonTitle;
|
||||
?>
|
||||
<a href='<?php echo $this->createLink(($file->objectType == 'requirement' ? 'story' : $file->objectType), 'view', "objectID=$file->objectID", '', true);?>' title='<?php if(isset($sourcePairs[$file->objectType][$file->objectID])) echo $sourcePairs[$file->objectType][$file->objectID];?>' class='iframe' data-width='90%'>
|
||||
<?php if(isset($sourcePairs[$file->objectType][$file->objectID])) echo $sourcePairs[$file->objectType][$file->objectID];?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -93,11 +93,12 @@ if(empty($type)) $type = 'product';
|
||||
$html .= "<ul class='dropdown-menu' style='left:0px'>";
|
||||
foreach($this->lang->doc->typeList as $typeKey => $typeName)
|
||||
{
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', 'create', "objectType=$type&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon text-muted'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$method = strpos($this->config->doc->textTypes, $typeKey) !== false ? 'createBasicInfo' : 'create';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', $method, "objectType=$type&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon text-muted'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
if($typeKey == 'url') $html .= '<li class="divider"></li>';
|
||||
}
|
||||
$html .= "</ul></div>";
|
||||
|
||||
@@ -119,6 +119,39 @@ $config->execution->search['params']['canceledDate'] = array('operator' => '='
|
||||
$config->execution->search['params']['lastEditedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->search['params']['activatedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
|
||||
$app->loadLang('execution');
|
||||
$config->execution->all = new stdclass();
|
||||
$config->execution->all->search['module'] = 'execution';
|
||||
$config->execution->all->search['fields']['name'] = $lang->execution->execName;
|
||||
$config->execution->all->search['fields']['id'] = $lang->execution->execId;
|
||||
$config->execution->all->search['fields']['status'] = $lang->execution->execStatus;
|
||||
if($config->systemMode == 'new') $config->execution->all->search['fields']['project'] = $lang->execution->project;
|
||||
$config->execution->all->search['fields']['PM'] = $lang->execution->owner;
|
||||
$config->execution->all->search['fields']['openedBy'] = $lang->execution->openedBy;
|
||||
$config->execution->all->search['fields']['openedDate'] = $lang->execution->openedDate;
|
||||
$config->execution->all->search['fields']['begin'] = $lang->execution->begin;
|
||||
$config->execution->all->search['fields']['end'] = $lang->execution->end;
|
||||
$config->execution->all->search['fields']['realBegan'] = $lang->execution->realBegan;
|
||||
$config->execution->all->search['fields']['realEnd'] = $lang->execution->realEnd;
|
||||
$config->execution->all->search['fields']['closedBy'] = $lang->execution->closedBy;
|
||||
$config->execution->all->search['fields']['lastEditedDate'] = $lang->execution->lastEditedDate;
|
||||
$config->execution->all->search['fields']['closedDate'] = $lang->execution->closedDate;
|
||||
|
||||
$config->execution->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->execution->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
$config->execution->all->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => array('') + $lang->execution->statusList);
|
||||
if($config->systemMode == 'new') $config->execution->all->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => '');
|
||||
$config->execution->all->search['params']['PM'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
$config->execution->all->search['params']['openedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
$config->execution->all->search['params']['openedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->all->search['params']['begin'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->all->search['params']['end'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->all->search['params']['realBegan'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->all->search['params']['realEnd'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->all->search['params']['closedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
|
||||
$config->execution->all->search['params']['lastEditedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->execution->all->search['params']['closedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
|
||||
$config->printKanban = new stdClass();
|
||||
$config->printKanban->col['story'] = 1;
|
||||
$config->printKanban->col['wait'] = 2;
|
||||
@@ -155,14 +188,14 @@ $config->execution->datatable->fieldList['id']['fixed'] = 'left';
|
||||
$config->execution->datatable->fieldList['id']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['id']['required'] = 'yes';
|
||||
|
||||
$config->execution->datatable->fieldList['name']['title'] = 'name';
|
||||
$config->execution->datatable->fieldList['name']['title'] = 'execName';
|
||||
$config->execution->datatable->fieldList['name']['fixed'] = 'left';
|
||||
$config->execution->datatable->fieldList['name']['width'] = 'auto';
|
||||
$config->execution->datatable->fieldList['name']['required'] = 'yes';
|
||||
|
||||
if(!isset($config->setCode) or $config->setCode == 1)
|
||||
{
|
||||
$config->execution->datatable->fieldList['code']['title'] = 'code';
|
||||
$config->execution->datatable->fieldList['code']['title'] = 'execCode';
|
||||
$config->execution->datatable->fieldList['code']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['code']['width'] = '95';
|
||||
$config->execution->datatable->fieldList['code']['required'] = 'no';
|
||||
@@ -178,7 +211,7 @@ $config->execution->datatable->fieldList['PM']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['PM']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['PM']['required'] = 'no';
|
||||
|
||||
$config->execution->datatable->fieldList['status']['title'] = 'status';
|
||||
$config->execution->datatable->fieldList['status']['title'] = 'execStatus';
|
||||
$config->execution->datatable->fieldList['status']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['status']['width'] = '100';
|
||||
$config->execution->datatable->fieldList['status']['required'] = 'no';
|
||||
|
||||
@@ -241,7 +241,7 @@ class execution extends control
|
||||
$this->view->moduleID = $moduleID;
|
||||
$this->view->moduleTree = $this->tree->getTaskTreeMenu($executionID, $productID, $startModuleID = 0, array('treeModel', 'createTaskLink'), $extra);
|
||||
$this->view->memberPairs = $memberPairs;
|
||||
$this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($products), 'noempty');
|
||||
$this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($products));
|
||||
$this->view->setModule = true;
|
||||
$this->view->canBeChanged = common::canModify('execution', $execution); // Determines whether an object is editable.
|
||||
$this->view->showBranch = $showBranch;
|
||||
@@ -943,6 +943,7 @@ class execution extends control
|
||||
|
||||
/* Save session. */
|
||||
$this->session->set('bugList', $this->app->getURI(true), 'execution');
|
||||
$this->session->set('buildList', $this->app->getURI(true), 'execution');
|
||||
|
||||
$type = strtolower($type);
|
||||
$queryID = ($type == 'bysearch') ? (int)$param : 0;
|
||||
@@ -1057,7 +1058,7 @@ class execution extends control
|
||||
$this->view->builds = $this->build->getBuildPairs($productID);
|
||||
$this->view->branchOption = $branchOption;
|
||||
$this->view->branchTagOption = $branchTagOption;
|
||||
$this->view->plans = $this->loadModel('productplan')->getPairs($productID);
|
||||
$this->view->plans = $this->loadModel('productplan')->getPairs($productID ? $productID : array_keys($products));
|
||||
$this->view->stories = $storyList;
|
||||
$this->view->tasks = $taskList;
|
||||
$this->view->projectPairs = $this->loadModel('project')->getPairsByProgram();
|
||||
@@ -1383,6 +1384,9 @@ class execution extends control
|
||||
$this->loadModel('kanban');
|
||||
$this->app->loadClass('date');
|
||||
|
||||
$minDate = !helper::isZeroDate($execution->openedDate) ? $execution->openedDate : $execution->begin;
|
||||
$maxDate = !helper::isZeroDate($execution->closedDate) ? $execution->closedDate : helper::today();
|
||||
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$begin = htmlspecialchars($this->post->begin, ENT_QUOTES);
|
||||
@@ -1423,6 +1427,8 @@ class execution extends control
|
||||
$this->view->chartData = $chartData;
|
||||
$this->view->begin = $begin;
|
||||
$this->view->end = $end;
|
||||
$this->view->minDate = $minDate;
|
||||
$this->view->maxDate = $maxDate;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -2289,9 +2295,7 @@ class execution extends control
|
||||
{
|
||||
$this->app->loadClass('date');
|
||||
|
||||
$begin = date('Y-m-d', strtotime('-13 days'));
|
||||
$begin = (helper::isZeroDate($execution->begin) or helper::diffDate($begin, $execution->begin) > 0) ? $begin : $execution->begin;
|
||||
$end = helper::today();
|
||||
list($begin, $end) = $this->execution->getBeginEnd4CFD($execution);
|
||||
$dateList = date::getDateList($begin, $end, 'Y-m-d', 'noweekend');
|
||||
$chartData = $this->execution->buildCFDData($executionID, $dateList, 'task');
|
||||
if(isset($chartData['line'])) $chartData['line'] = array_reverse($chartData['line']);
|
||||
@@ -2473,7 +2477,7 @@ class execution extends control
|
||||
unset($this->lang->kanban->type['all']);
|
||||
}
|
||||
|
||||
if($groupBy == 'story' and $browseType == 'task' and !isset($this->lang->kanban->orderList[$orderBy])) $orderBy = 'pri_asc';
|
||||
if($groupBy == 'story' and $browseType == 'task' and !isset($this->lang->kanban->orderList[$orderBy])) $orderBy = 'id_asc';
|
||||
$kanbanGroup = $this->kanban->getExecutionKanban($executionID, $browseType, $groupBy, '', $orderBy);
|
||||
if(empty($kanbanGroup))
|
||||
{
|
||||
@@ -3675,16 +3679,16 @@ class execution extends control
|
||||
* All execution.
|
||||
*
|
||||
* @param string $status
|
||||
* @param int $projectID
|
||||
* @param string $orderBy
|
||||
* @param int $productID
|
||||
* @param string $param
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function all($status = 'undone', $projectID = 0, $orderBy = 'order_asc', $productID = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
public function all($status = 'undone', $orderBy = 'order_asc', $productID = 0, $param = '', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
$this->app->loadLang('my');
|
||||
$this->app->loadLang('product');
|
||||
@@ -3697,27 +3701,22 @@ class execution extends control
|
||||
|
||||
if($this->app->viewType == 'mhtml')
|
||||
{
|
||||
if($this->app->rawModule == 'project' and $this->app->rawMethod == 'execution')
|
||||
{
|
||||
$projects = $this->project->getPairsByProgram();
|
||||
$projectID = $this->project->saveState($projectID, $projects);
|
||||
$this->project->setMenu($projectID);
|
||||
}
|
||||
else
|
||||
{
|
||||
$executionID = $this->execution->saveState(0, $this->executions);
|
||||
$this->execution->setMenu($executionID);
|
||||
}
|
||||
$executionID = $this->execution->saveState(0, $this->executions);
|
||||
$this->execution->setMenu($executionID);
|
||||
}
|
||||
|
||||
/* Load pager and get tasks. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$queryID = ($status == 'bySearch') ? (int)$param : 0;
|
||||
$actionURL = $this->createLink('execution', 'all', "status=bySearch&orderBy=$orderBy&productID=$productID¶m=myQueryID");
|
||||
$this->execution->buildSearchFrom($queryID, $actionURL);
|
||||
|
||||
$this->view->title = $this->lang->execution->allExecutions;
|
||||
$this->view->position[] = $this->lang->execution->allExecutions;
|
||||
|
||||
$executionStats = $this->project->getStats($projectID, $status, $productID, 0, 30, $orderBy, $pager);
|
||||
$executionStats = $this->project->getStats(0, $status, $productID, 0, 30, $orderBy, $pager, false, $queryID);
|
||||
|
||||
$parentIdList = array();
|
||||
foreach($executionStats as $execution)
|
||||
@@ -3728,20 +3727,19 @@ class execution extends control
|
||||
$parents = array();
|
||||
if($parentIdList) $parents = $this->execution->getByIdList($parentIdList);
|
||||
|
||||
$allExecutionsNum = $this->project->getStats($projectID, 'all');
|
||||
$allExecutionsNum = $this->project->getStats(0, 'all');
|
||||
$this->view->allExecutionsNum = count($allExecutionsNum);
|
||||
|
||||
$this->view->executionStats = $executionStats;
|
||||
$this->view->productList = $this->loadModel('product')->getProductPairsByProject($projectID);
|
||||
$this->view->productList = $this->loadModel('product')->getProductPairsByProject(0);
|
||||
$this->view->productID = $productID;
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->parents = $parents;
|
||||
$this->view->projects = array('') + $this->project->getPairsByProgram();
|
||||
$this->view->pager = $pager;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->status = $status;
|
||||
$this->view->from = $from;
|
||||
$this->view->param = $param;
|
||||
$this->view->isStage = (isset($project->model) and $project->model == 'waterfall') ? true : false;
|
||||
|
||||
$this->display();
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
body {margin-bottom: 25px;}
|
||||
.main-table tbody>tr>td {border-bottom: 0px solid #eee;}
|
||||
.table-responsive {overflow-y: hidden !important;}
|
||||
#product_chosen .chosen-single {width: 180px;}
|
||||
|
||||
.table-children {border-left: 2px solid #cbd0db; border-right: 2px solid #cbd0db;}
|
||||
.table tbody > tr.table-children.table-child-top {border-top: 2px solid #cbd0db;}
|
||||
.table tbody > tr.table-children.table-child-bottom {border-bottom: 2px solid #cbd0db;}
|
||||
.table td.has-child > a:not(.plan-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.table td.has-child > .plan-toggle {color: #838a9d; position: relative; top: 1px;overflow: initial !important;}
|
||||
.table td.has-child > .plan-toggle:hover {color: #006af1; cursor: pointer;}
|
||||
@@ -14,7 +13,7 @@ body {margin-bottom: 25px;}
|
||||
.table th.hours {padding-right: 8px !important;}
|
||||
.main-table tbody > tr.table-children > td:first-child::before {width: 3px;}
|
||||
td.hours {text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
td.flex {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center; margin-bottom: -1px;}
|
||||
td.flex {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center; margin-bottom: 0px;}
|
||||
td.datatable-cell.flex {margin-bottom: -2px;}
|
||||
td.flex span.label-badge {margin-left: 5px; min-width: 50px;}
|
||||
td.flex span.label-badge.label-light {min-width: 22px;}
|
||||
@@ -29,9 +28,13 @@ td.flex span.project-type-label {min-width: 40px;}
|
||||
.has-child > span {margin-right: 5px;}
|
||||
.c-name > .text-ellipsis {text-overflow: clip;}
|
||||
.c-code, .c-project {overflow: hidden; white-space: nowrap;}
|
||||
th.c-status, .c-begin, .c-end, .c-realBegan, .c-realEnd {text-align: center;}
|
||||
|
||||
.c-project{text-overflow: unset !important;}
|
||||
canvas {height: 28px;}
|
||||
.parent.has-child.c-name.flex, .table-child-bottom > .c-name.flex {border-bottom: 1px solid #cbd0db !important;}
|
||||
.parent.has-child.c-name.flex {margin-bottom: -2px !important;}
|
||||
.parent.has-child.c-name.flex, .table-child-bottom > .c-name.flex {border-bottom: 0px solid #cbd0db !important;}
|
||||
#tableCustomBtn {padding-bottom: 5px;}
|
||||
#datatable-executionList .table-child-bottom > .c-name.flex {border-bottom: 1px solid #cbd0db !important;}
|
||||
#datatable-executionList .table-child-bottom.table-child-top > .c-name.flex {border-bottom: 2px solid #cbd0db !important;}
|
||||
#datatable-executionList .parent.has-child.c-name.flex {border-bottom: 1px solid #cbd0db !important;}
|
||||
#datatable-executionList tr:last-child .c-name.flex {margin-top: 1px !important;}
|
||||
|
||||
@@ -36,7 +36,9 @@
|
||||
.region .kanban-header-col > .title {max-width: 80% !important;}
|
||||
.region .kanban-header-col > .title {margin: 0}
|
||||
.region .kanban-header-col > .title > span {display: inline-block; overflow: hidden; padding-right:2px; position: initial; max-width: 85px !important;}
|
||||
.region .kanban-header-col > .title > span.storyColumn {max-width: 100% !important;}
|
||||
.region .kanban-header-col > .title > .storyColumn {margin-right: 30px;}
|
||||
.region .kanban-header-col > .title > .storyColumn .text {font-weight: 700; color:rgb(51, 51, 51);}
|
||||
.region .kanban-header-col > .title > .storyColumn + .dropdown-menu {top: 45px; left: auto;}
|
||||
.region .kanban-header-col > .title > .text-grey {opacity: .5; font-weight: bold; color: #8b91a2;}
|
||||
.region .kanban-header-col > .title > .count {opacity: .5; font-weight: bold; color: #8b91a2;}
|
||||
.region .kanban-header-col > .title > .error {color: #333333; padding-left: 2px; font-size: 10px; padding-top: 1px; padding-right: 2px;}
|
||||
@@ -115,3 +117,7 @@
|
||||
#rdKanbanSearchInput {width: 150px;}
|
||||
#rdSearchBox {display: none; width: 150px;}
|
||||
.btn-link.querybox-toggle {background-color: rgba(0,0,0,0);}
|
||||
|
||||
#kanban .kanban-affixed .kanban-header-col .title.action-dbc {pointer-events: none;}
|
||||
#kanban .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .text {color: #fff;}
|
||||
#kanban .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .caret {display: none;}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
td.delayed {background: #e84e0f !important; color: white;}
|
||||
#int-dropdown {margin-left: -8px; border-radius: 4px; border: 1px solid #0c64eb;}
|
||||
#projectTaskForm table tbody tr td {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
th.c-deadline {text-align: center;}
|
||||
.table td.c-estimate, .table td.c-consumed, .table td.c-left {padding-right: 12px;}
|
||||
.c-estimate {text-align: right;}
|
||||
.c-consumed {text-align: right;}
|
||||
.c-deadline {text-align: center;}
|
||||
.c-left {text-align: right;}
|
||||
.table-footer {z-index: 1;}
|
||||
.btn-toolbar > .btn {margin-right: 5px !important;}
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
.kanban-affixed .kanban-header-col > .title > .text,
|
||||
.kanban-affixed .kanban-header-col > .title > .count {color: #fff!important;}
|
||||
.kanban-header-col > .title > .text {max-width: 110px !important;}
|
||||
.kanban-header-col > .title > .storyColumn.text {max-width: 100% !important;}
|
||||
.kanban-header-col > .title > .storyColumn .text {font-weight: 700; color:rgb(51, 51, 51);}
|
||||
.kanban-header-col > .title > .storyColumn + .dropdown-menu {top: 45px; left: auto;}
|
||||
|
||||
#kanbanContainer {margin: 0;}
|
||||
#kanbanContainer > .panel-body {overflow: auto;}
|
||||
@@ -68,3 +69,7 @@
|
||||
#teskKanbanSearchInput {width: 150px;}
|
||||
#searchBox {display: none; width: 150px;}
|
||||
.btn-link.querybox-toggle {background-color: rgba(0,0,0,0);}
|
||||
|
||||
#kanbans .kanban-affixed .kanban-header-col .title.action-dbc {pointer-events: none;}
|
||||
#kanbans .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .text {color: #fff;}
|
||||
#kanbans .kanban-affixed .kanban-header-col .title.action-dbc .storyColumn .caret {display: none;}
|
||||
|
||||
@@ -11,7 +11,7 @@ $(function()
|
||||
if(isCNLang && nameWidth < 150 && !useDatatable) $('#executionsForm thead th.c-name').css('width', '150px');
|
||||
if(!isCNLang && nameWidth < 200 && !useDatatable) $('#executionsForm thead th.c-name').css('width', '200px');
|
||||
|
||||
toggleFold('#executionsForm', unfoldExecutions, projectID, 'execution');
|
||||
toggleFold('#executionsForm', unfoldExecutions, 0, 'execution');
|
||||
|
||||
$('.table td.has-child > .plan-toggle').each(function()
|
||||
{
|
||||
|
||||
@@ -137,7 +137,7 @@ $(function()
|
||||
location.href = createLink('execution', 'cfd', 'executionID=' + executionID + '&type=' + type + '&withWeekend=' + withWeekend + '&begin=' + begin + '&end=' + end);
|
||||
});
|
||||
|
||||
$("#end, #begin").datetimepicker('setEndDate', today);
|
||||
$("#end, #begin").datetimepicker('setStartDate', executionBegin);
|
||||
$("#end, #begin").datetimepicker('setEndDate', maxDate);
|
||||
$("#end, #begin").datetimepicker('setStartDate', minDate);
|
||||
$('.datetimepicker-days table tfoot').append('<tr><th colspan="7">' + dateRangeTip + '</th></tr>');
|
||||
});
|
||||
|
||||
@@ -361,6 +361,7 @@ function hideKanbanAction()
|
||||
$('.contextmenu').removeClass('contextmenu-show');
|
||||
$('.contextmenu .contextmenu-menu').removeClass('open').removeClass('in');
|
||||
$('#moreTasks, #moreColumns').animate({right: -400}, 500);
|
||||
$('.storyColumn').parent().removeClass('open');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -760,8 +761,15 @@ function renderCount($count, count, column)
|
||||
{
|
||||
if(groupBy == 'story' && column.type == 'story')
|
||||
{
|
||||
$count.prev().addClass('storyColumn');
|
||||
$count.prev().parent().append('<span class="caret changeOrderBy"></span>');
|
||||
var orderButton = '<a class="btn btn-link action storyColumn ' + (changeOrder ? 'text-primary' : '') + '" type="button" data-toggle="dropdown">'
|
||||
+ "<i class='icon icon-swap'></i>"
|
||||
+ '</a>'
|
||||
+ '<ul class="dropdown-menu">';
|
||||
for(var order in kanbanLang.orderList) orderButton += '<li class="' + (order == orderBy ? 'active' : '') + '"><a href="###" onclick="searchCards(rdSearchValue, \'' + order + '\')">' + kanbanLang.orderList[order] + '</a></li>';
|
||||
orderButton += '</ul>';
|
||||
|
||||
$count.parent().next().html(orderButton);
|
||||
$count.parent().next().addClass('createButton');
|
||||
$count.remove();
|
||||
return;
|
||||
}
|
||||
@@ -1477,6 +1485,8 @@ $(function()
|
||||
|
||||
if($.cookie('isFullScreen') == 1) $.cookie('isFullScreen', 0);
|
||||
|
||||
changeOrder = false;
|
||||
|
||||
window.kanbanScaleSize = +$.zui.store.get('executionKanbanScaleSize', 1);
|
||||
$('#kanbanScaleSize').text(window.kanbanScaleSize);
|
||||
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null);
|
||||
@@ -1590,11 +1600,10 @@ $(function()
|
||||
$('.color0 .cardcolor').css('border', '1px solid #fff');
|
||||
});
|
||||
|
||||
$(document).on('click', '#kanban span.caret.changeOrderBy', function(event)
|
||||
document.addEventListener('scroll', function()
|
||||
{
|
||||
orderBy = orderBy == 'pri_desc' ? 'pri_asc' : 'pri_desc';
|
||||
searchCards(rdSearchValue);
|
||||
})
|
||||
hideKanbanAction();
|
||||
}, true);
|
||||
|
||||
/* Init sortable */
|
||||
var sortType = '';
|
||||
@@ -1823,12 +1832,16 @@ function toggleRDSearchBox()
|
||||
* Search all cards.
|
||||
*
|
||||
* @param string $value
|
||||
* @param string order
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function searchCards(value)
|
||||
function searchCards(value, order = '')
|
||||
{
|
||||
rdSearchValue = value;
|
||||
orderBy = order == '' ? orderBy : order;
|
||||
if(order != '') changeOrder = true;
|
||||
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=0&browseType=" + browseType + "&groupBy=" + groupBy + '&from=RD&searchValue=' + rdSearchValue + '&orderBy=' + orderBy), function(data)
|
||||
{
|
||||
lastUpdateData = data;
|
||||
@@ -1848,7 +1861,7 @@ function searchCards(value)
|
||||
|
||||
if(hideAll && rdSearchValue != '')
|
||||
{
|
||||
if($('.table-empty-tip').length == 0) $('#kanban').append('<div class="table-empty-tip"><p><span class="text-muted">' + kanbanLang.empty + '</span></p></div>');
|
||||
if($('.table-empty-tip').length == 0) $('#kanban').append('<div class="table-empty-tip"><p><span class="text-muted">' + kanbancardLang.empty + '</span></p></div>');
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -32,7 +32,7 @@ $(function()
|
||||
})
|
||||
|
||||
/* Get checked stories. */
|
||||
$('#batchToTaskButton').on('click', function()
|
||||
$(document).on('click', '#batchToTaskButton', function()
|
||||
{
|
||||
storyIdList = '';
|
||||
linedTaskIdList = '';
|
||||
@@ -53,6 +53,26 @@ $(function()
|
||||
|
||||
$('#submit').click(function()
|
||||
{
|
||||
var taskType = $('#type').val();
|
||||
var hourPoint = $('#hourPointValue').val();
|
||||
if(taskType.length == 0)
|
||||
{
|
||||
alert(typeNotEmpty);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(hourPoint == 0)
|
||||
{
|
||||
alert(hourPointNotEmpty);
|
||||
return false;
|
||||
}
|
||||
else if(typeof(hourPoint) != 'undefined' && (isNaN(hourPoint) || hourPoint < 0))
|
||||
{
|
||||
alert(hourPointNotError);
|
||||
return false;
|
||||
}
|
||||
hourPoint = typeof(hourPoint) == 'undefined' ? 0 : hourPoint;
|
||||
|
||||
if(linedTaskIdList)
|
||||
{
|
||||
confirmStoryToTask = confirmStoryToTask.replace('%s', linedTaskIdList);
|
||||
|
||||
@@ -341,9 +341,16 @@ function renderColumnCount($count, count, col)
|
||||
{
|
||||
if(groupBy == 'story' && col.type == 'story')
|
||||
{
|
||||
$count.prev().addClass('storyColumn');
|
||||
$count.prev().parent().append('<span class="caret changeOrderBy"></span>');
|
||||
$count.remove();
|
||||
var orderButton = '<a class="btn btn-link action storyColumn ' + (changeOrder ? 'text-primary' : '') + '" type="button" data-toggle="dropdown">'
|
||||
+ "<i class='icon icon-swap'></i>"
|
||||
+ '</a>'
|
||||
+ '<ul class="dropdown-menu">';
|
||||
for(var order in kanbanLang.orderList) orderButton += '<li class="' + (order == orderBy ? 'active' : '') + '"><a href="###" onclick="searchCards(searchValue, \'' + order + '\')">' + kanbanLang.orderList[order] + '</a></li>';
|
||||
orderButton += '</ul>';
|
||||
|
||||
$count.parent().next().html(orderButton);
|
||||
$count.parent().next().addClass('createButton');
|
||||
$count.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1220,6 +1227,7 @@ $(function()
|
||||
$('#kanbanScaleControl .btn[data-type="+"]').attr('disabled', window.kanbanScaleSize >= 4 ? 'disabled' : null);
|
||||
$('#kanbanScaleControl .btn[data-type="-"]').attr('disabled', window.kanbanScaleSize <= 1 ? 'disabled' : null);
|
||||
|
||||
changeOrder = false;
|
||||
/* Common options */
|
||||
var commonOptions =
|
||||
{
|
||||
@@ -1274,12 +1282,6 @@ $(function()
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
$(document).on('click', '#kanbans span.caret.changeOrderBy', function(event)
|
||||
{
|
||||
orderBy = orderBy == 'pri_desc' ? 'pri_asc' : 'pri_desc';
|
||||
searchCards(searchValue);
|
||||
})
|
||||
|
||||
/* Init contextmenu */
|
||||
$('#kanbans').on('click', '[data-contextmenu]', function(event)
|
||||
{
|
||||
@@ -1332,6 +1334,11 @@ $(function()
|
||||
}
|
||||
});
|
||||
|
||||
document.addEventListener('scroll', function()
|
||||
{
|
||||
$('.storyColumn').parent().removeClass('open');
|
||||
}, true);
|
||||
|
||||
$('#type_chosen .chosen-single span').prepend('<i class="icon-kanban"></i>');
|
||||
$('#group_chosen .chosen-single span').prepend(kanbanLang.laneGroup + ': ');
|
||||
|
||||
@@ -1339,7 +1346,7 @@ $(function()
|
||||
lastUpdateData = '';
|
||||
setInterval(function()
|
||||
{
|
||||
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=" + entertime + "&browseType=" + browseType + "&groupBy=" + groupBy + '&from=execution&searchValue=' + searchValue + '&orderBy' + orderBy), function(data)
|
||||
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=" + entertime + "&browseType=" + browseType + "&groupBy=" + groupBy + '&from=execution&searchValue=' + searchValue + '&orderBy=' + orderBy), function(data)
|
||||
{
|
||||
if(lastUpdateData == '') lastUpdateData = data;
|
||||
if(data && lastUpdateData !== data)
|
||||
@@ -1469,12 +1476,16 @@ function toggleSearchBox()
|
||||
* Search kanban cards.
|
||||
*
|
||||
* @param string value
|
||||
* @param string order
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function searchCards(value)
|
||||
function searchCards(value, order = '')
|
||||
{
|
||||
searchValue = value;
|
||||
orderBy = order == '' ? orderBy : order;
|
||||
if(order != '') changeOrder = true;
|
||||
$.get(createLink('execution', 'ajaxUpdateKanban', "executionID=" + executionID + "&entertime=0&browseType=" + browseType + "&groupBy=" + groupBy + '&from=execution&searchValue=' + value + '&orderBy=' + orderBy), function(data)
|
||||
{
|
||||
lastUpdateData = data;
|
||||
|
||||
@@ -137,6 +137,7 @@ $lang->execution->batchCreateTask = 'Batch create task';
|
||||
$lang->execution->kanbanNoLinkProduct = "Kanban not linked {$lang->productCommon}";
|
||||
$lang->execution->myTask = "My Task";
|
||||
$lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->execution->allProject = 'All';
|
||||
|
||||
/* Fields of zt_team. */
|
||||
$lang->execution->root = 'Root';
|
||||
@@ -153,6 +154,7 @@ $lang->execution->putoff = 'Zurückstellen';
|
||||
$lang->execution->suspend = 'Aussetzen';
|
||||
$lang->execution->close = 'Schließen';
|
||||
$lang->execution->export = 'Export';
|
||||
$lang->execution->next = "Next";
|
||||
|
||||
$lang->execution->endList[7] = '1 Woche';
|
||||
$lang->execution->endList[14] = '2 Wochen';
|
||||
@@ -172,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "View By bug";
|
||||
|
||||
$lang->team->account = 'Konto';
|
||||
$lang->team->role = 'Rolle';
|
||||
$lang->team->roleAB = 'Meine Rolle';
|
||||
$lang->team->join = 'Beigetreten';
|
||||
$lang->team->hours = 'Stunde/Tag';
|
||||
$lang->team->days = 'Arbeitstage';
|
||||
@@ -412,6 +415,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is still
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
$lang->execution->checkedExecutions = 'Seleted %s items';
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -512,6 +516,11 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Ich bin beteiligt.';
|
||||
$lang->execution->doingProject = 'Laufende Projekte';
|
||||
|
||||
@@ -539,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = 'Export as Image';
|
||||
$lang->execution->gantt->exportPDF = 'Export as PDF';
|
||||
|
||||
@@ -137,11 +137,12 @@ $lang->execution->batchCreateTask = 'Batch create task';
|
||||
$lang->execution->kanbanNoLinkProduct = "Kanban not linked {$lang->productCommon}";
|
||||
$lang->execution->myTask = "My Task";
|
||||
$lang->execution->list = 'List';
|
||||
$lang->execution->allProject = 'All';
|
||||
|
||||
/* Fields of zt_team. */
|
||||
$lang->execution->root = 'Root';
|
||||
$lang->execution->estimate = 'estimate';
|
||||
$lang->execution->consumed = 'consumed';
|
||||
$lang->execution->estimate = 'Estimate';
|
||||
$lang->execution->consumed = 'Consumed';
|
||||
$lang->execution->left = 'Left';
|
||||
|
||||
if($this->config->systemMode == 'new') $lang->execution->copyTeamTip = "copy Project/{$lang->execution->common} team members";
|
||||
@@ -153,6 +154,7 @@ $lang->execution->putoff = 'Delay';
|
||||
$lang->execution->suspend = 'Suspend';
|
||||
$lang->execution->close = 'Close';
|
||||
$lang->execution->export = 'Export';
|
||||
$lang->execution->next = "Next";
|
||||
|
||||
$lang->execution->endList[7] = '1 Week';
|
||||
$lang->execution->endList[14] = '2 Weeks';
|
||||
@@ -172,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "View By bug";
|
||||
|
||||
$lang->team->account = 'User';
|
||||
$lang->team->role = 'Role';
|
||||
$lang->team->roleAB = 'My Role';
|
||||
$lang->team->join = 'Joined';
|
||||
$lang->team->hours = 'Hours/day';
|
||||
$lang->team->days = 'Day';
|
||||
@@ -412,6 +415,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is still
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
$lang->execution->checkedExecutions = 'Seleted %s items';
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -512,6 +516,11 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Mine';
|
||||
$lang->execution->doingProject = 'Ongoing Projects';
|
||||
|
||||
@@ -539,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = 'Export as Image';
|
||||
$lang->execution->gantt->exportPDF = 'Export as PDF';
|
||||
|
||||
@@ -137,6 +137,7 @@ $lang->execution->batchCreateTask = 'Batch create task';
|
||||
$lang->execution->kanbanNoLinkProduct = "Kanban not linked {$lang->productCommon}";
|
||||
$lang->execution->myTask = "My Task";
|
||||
$lang->execution->list = "{$lang->executionCommon} List";
|
||||
$lang->execution->allProject = 'Tous';
|
||||
|
||||
/* Fields of zt_team. */
|
||||
$lang->execution->root = 'Root';
|
||||
@@ -153,6 +154,7 @@ $lang->execution->putoff = 'Ajourner';
|
||||
$lang->execution->suspend = 'Suspendre';
|
||||
$lang->execution->close = 'Fermer';
|
||||
$lang->execution->export = 'Exporter';
|
||||
$lang->execution->next = "Suivant";
|
||||
|
||||
$lang->execution->endList[7] = '1 Semaine';
|
||||
$lang->execution->endList[14] = '2 Semaines';
|
||||
@@ -172,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "View By bug";
|
||||
|
||||
$lang->team->account = 'Utilisateur';
|
||||
$lang->team->role = 'Rôle';
|
||||
$lang->team->roleAB = 'Mon Rôle';
|
||||
$lang->team->join = 'Ajouté';
|
||||
$lang->team->hours = 'Heure/jour';
|
||||
$lang->team->days = 'Jour';
|
||||
@@ -412,6 +415,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is still
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
$lang->execution->checkedExecutions = "Pour s électionner l'élément%s";
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -512,6 +516,11 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = "J'étais impliqué";
|
||||
$lang->execution->doingProject = 'Projets en cours';
|
||||
|
||||
@@ -539,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = 'Export as Image';
|
||||
$lang->execution->gantt->exportPDF = 'Export as PDF';
|
||||
|
||||
@@ -127,6 +127,7 @@ $lang->execution->lifeTimeList['ops'] = "DevOps";
|
||||
$lang->team = new stdclass();
|
||||
$lang->team->account = 'Người dùng';
|
||||
$lang->team->role = 'Vai trò';
|
||||
$lang->team->roleAB = 'Vai trò của tôi';
|
||||
$lang->team->join = 'Đã tham gia';
|
||||
$lang->team->hours = 'Giờ/ngày';
|
||||
$lang->team->days = 'Ngày';
|
||||
@@ -418,6 +419,11 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = 'All';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = 'Active';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = 'Build List';
|
||||
|
||||
$lang->execution->myExecutions = 'Tôi tham gia';
|
||||
$lang->execution->doingProject = 'Hiện trường';
|
||||
|
||||
|
||||
@@ -137,6 +137,7 @@ $lang->execution->batchCreateTask = '批量建任务';
|
||||
$lang->execution->kanbanNoLinkProduct = "看板没有关联{$lang->productCommon}";
|
||||
$lang->execution->myTask = "我的任务";
|
||||
$lang->execution->list = '列表';
|
||||
$lang->execution->allProject = '全部项目';
|
||||
|
||||
/* Fields of zt_team. */
|
||||
$lang->execution->root = '源ID';
|
||||
@@ -153,6 +154,7 @@ $lang->execution->putoff = "延期";
|
||||
$lang->execution->suspend = "挂起";
|
||||
$lang->execution->close = "关闭";
|
||||
$lang->execution->export = "导出";
|
||||
$lang->execution->next = "下一步";
|
||||
|
||||
$lang->execution->endList[7] = '一星期';
|
||||
$lang->execution->endList[14] = '两星期';
|
||||
@@ -172,6 +174,7 @@ $lang->execution->cfdTypeList['bug'] = "按Bug查看";
|
||||
|
||||
$lang->team->account = '用户';
|
||||
$lang->team->role = '角色';
|
||||
$lang->team->roleAB = '我的角色';
|
||||
$lang->team->join = '加盟日';
|
||||
$lang->team->hours = '可用工时/天';
|
||||
$lang->team->days = '可用工日';
|
||||
@@ -412,6 +415,7 @@ $lang->execution->storyDragError = "该{$lang->SRCommon}还是草
|
||||
$lang->execution->countTip = '(%s人)';
|
||||
$lang->execution->pleaseInput = "请输入";
|
||||
$lang->execution->week = '周';
|
||||
$lang->execution->checkedExecutions = '已选择%s项';
|
||||
|
||||
/* 统计。*/
|
||||
$lang->execution->charts = new stdclass();
|
||||
@@ -512,6 +516,11 @@ $lang->execution->featureBar['all']['doing'] = $lang->execution->statusList[
|
||||
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
|
||||
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
|
||||
|
||||
$lang->execution->featureBar['bug']['all'] = '所有';
|
||||
$lang->execution->featureBar['bug']['unresolved'] = '未解决';
|
||||
|
||||
$lang->execution->featureBar['build']['all'] = '所有版本';
|
||||
|
||||
$lang->execution->myExecutions = '我参与的';
|
||||
$lang->execution->doingProject = '进行中的项目';
|
||||
|
||||
@@ -539,11 +548,37 @@ $lang->execution->statusColorList['suspended'] = '#fdc137';
|
||||
$lang->execution->statusColorList['closed'] = '#838A9D';
|
||||
|
||||
if(!isset($lang->execution->gantt)) $lang->execution->gantt = new stdclass();
|
||||
$lang->execution->gantt->color[0] = 'bbb';
|
||||
$lang->execution->gantt->color[1] = 'ff5d5d';
|
||||
$lang->execution->gantt->color[2] = 'ff9800';
|
||||
$lang->execution->gantt->color[3] = '16a8f8';
|
||||
$lang->execution->gantt->color[4] = '00da88';
|
||||
$lang->execution->gantt->progressColor[0] = '#B7B7B7';
|
||||
$lang->execution->gantt->progressColor[1] = '#FF8287';
|
||||
$lang->execution->gantt->progressColor[2] = '#FFC73A';
|
||||
$lang->execution->gantt->progressColor[3] = '#6BD5F5';
|
||||
$lang->execution->gantt->progressColor[4] = '#9DE88A';
|
||||
$lang->execution->gantt->progressColor[5] = '#9BA8FF';
|
||||
|
||||
$lang->execution->gantt->color[0] = '#E7E7E7';
|
||||
$lang->execution->gantt->color[1] = '#FFDADB';
|
||||
$lang->execution->gantt->color[2] = '#FCECC1';
|
||||
$lang->execution->gantt->color[3] = '#D3F3FD';
|
||||
$lang->execution->gantt->color[4] = '#DFF5D9';
|
||||
$lang->execution->gantt->color[5] = '#EBDCF9';
|
||||
|
||||
$lang->execution->gantt->textColor[0] = '#2D2D2D';
|
||||
$lang->execution->gantt->textColor[1] = '#8D0308';
|
||||
$lang->execution->gantt->textColor[2] = '#9D4200';
|
||||
$lang->execution->gantt->textColor[3] = '#006D8E';
|
||||
$lang->execution->gantt->textColor[4] = '#1A8100';
|
||||
$lang->execution->gantt->textColor[5] = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->stage = new stdclass();
|
||||
$lang->execution->gantt->stage->progressColor = '#70B8FE';
|
||||
$lang->execution->gantt->stage->color = '#D2E7FC';
|
||||
$lang->execution->gantt->stage->textColor = '#0050A7';
|
||||
|
||||
$lang->execution->gantt->defaultColor = '#EBDCF9';
|
||||
$lang->execution->gantt->defaultProgressColor = '#9BA8FF';
|
||||
$lang->execution->gantt->defaultTextColor = '#660ABC';
|
||||
|
||||
$lang->execution->gantt->bar_height = '24';
|
||||
|
||||
$lang->execution->gantt->exportImg = '导出图片';
|
||||
$lang->execution->gantt->exportPDF = '导出 PDF';
|
||||
|
||||
+60
-28
@@ -100,7 +100,7 @@ class executionModel extends model
|
||||
include $this->app->getModulePath('', 'execution') . 'lang/' . $this->app->getClientLang() . '.php';
|
||||
}
|
||||
|
||||
if($execution->acl != 'private') unset($this->lang->execution->menu->settings['subMenu']->whitelist);
|
||||
if(isset($execution->cal) and $execution->acl != 'private') unset($this->lang->execution->menu->settings['subMenu']->whitelist);
|
||||
|
||||
if($execution and $execution->lifetime == 'ops')
|
||||
{
|
||||
@@ -420,6 +420,8 @@ class executionModel extends model
|
||||
/* Update the path. */
|
||||
if($this->config->systemMode == 'new') $this->setTreePath($executionID);
|
||||
|
||||
$this->updateProducts($executionID);
|
||||
|
||||
/* Set team of execution. */
|
||||
$members = isset($_POST['teamMembers']) ? $_POST['teamMembers'] : array();
|
||||
array_push($members, $sprint->PO, $sprint->QD, $sprint->PM, $sprint->RD, $sprint->openedBy);
|
||||
@@ -499,8 +501,8 @@ class executionModel extends model
|
||||
->setIF(helper::isZeroDate($this->post->begin), 'begin', '')
|
||||
->setIF(helper::isZeroDate($this->post->end), 'end', '')
|
||||
->setIF(!isset($_POST['whitelist']), 'whitelist', '')
|
||||
->setIF($this->post->status == 'closed', 'closedDate', helper::now())
|
||||
->setIF($this->post->status == 'suspended', 'suspendedDate', helper::today())
|
||||
->setIF($this->post->status == 'closed' and $oldExecution->status != 'closed', 'closedDate', helper::now())
|
||||
->setIF($this->post->status == 'suspended' and $oldExecution->status != 'suspended', 'suspendedDate', helper::today())
|
||||
->setIF($oldExecution->type == 'stage', 'project', $oldExecution->project)
|
||||
->setDefault('team', $this->post->name)
|
||||
->join('whitelist', ',')
|
||||
@@ -670,6 +672,7 @@ class executionModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
$this->lang->error->unique = $this->lang->error->repeat;
|
||||
$extendFields = $this->getFlowExtendFields();
|
||||
foreach($data->executionIDList as $executionID)
|
||||
{
|
||||
@@ -697,8 +700,8 @@ class executionModel extends model
|
||||
if(isset($data->codes)) $executions[$executionID]->code = $executionCode;
|
||||
if(isset($data->projects)) $executions[$executionID]->project = zget($data->projects, $executionID, 0);
|
||||
if(isset($data->attributes)) $executions[$executionID]->attribute = zget($data->attributes, $executionID, '');
|
||||
if($executions[$executionID]->status == 'closed') $executions[$executionID]->closedDate = helper::now();
|
||||
if($executions[$executionID]->status == 'suspended') $executions[$executionID]->suspendedDate = helper::today();
|
||||
if($executions[$executionID]->status == 'closed' and $oldExecutions[$executionID]->status != 'closed') $executions[$executionID]->closedDate = helper::now();
|
||||
if($executions[$executionID]->status == 'suspended' and $oldExecutions[$executionID]->status != 'suspended') $executions[$executionID]->suspendedDate = helper::today();
|
||||
|
||||
/* Check unique code for edited executions. */
|
||||
if($projectModel == 'scrum' and isset($executionCode) and empty($executionCode))
|
||||
@@ -788,8 +791,8 @@ class executionModel extends model
|
||||
->checkIF($execution->begin != '', 'begin', 'date')
|
||||
->checkIF($execution->end != '', 'end', 'date')
|
||||
->checkIF($execution->end != '', 'end', 'ge', $execution->begin)
|
||||
->checkIF((!empty($execution->name) and $this->config->systemMode == 'new'), 'name', 'unique', "id != $executionID and type in ('sprint','stage') and `project` = $projectID")
|
||||
->checkIF(!empty($execution->code), 'code', 'unique', "id != $executionID and type in ('sprint','stage')")
|
||||
->checkIF((!empty($execution->name) and $this->config->systemMode == 'new'), 'name', 'unique', "id != $executionID and type in ('sprint','stage','kanban') and `project` = $projectID and `deleted` = '0'")
|
||||
->checkIF(!empty($execution->code), 'code', 'unique', "id != $executionID and type in ('sprint','stage','kanban') and `deleted` = '0'")
|
||||
->checkFlow()
|
||||
->where('id')->eq($executionID)
|
||||
->limit(1)
|
||||
@@ -948,6 +951,8 @@ class executionModel extends model
|
||||
->setDefault('status', 'doing')
|
||||
->setDefault('lastEditedBy', $this->app->user->account)
|
||||
->setDefault('lastEditedDate', $now)
|
||||
->setDefault('closedBy', '')
|
||||
->setDefault('closedDate', '')
|
||||
->stripTags($this->config->execution->editor->activate['id'], $this->config->allowedTags)
|
||||
->remove('comment,readjustTime,readjustTask')
|
||||
->get();
|
||||
@@ -3176,24 +3181,8 @@ class executionModel extends model
|
||||
*/
|
||||
public function getBeginEnd4CFD($execution)
|
||||
{
|
||||
$begin = $execution->begin;
|
||||
$end = $execution->end;
|
||||
if(helper::today() < $execution->begin)
|
||||
{
|
||||
$begin = helper::today();
|
||||
$end = helper::today();
|
||||
}
|
||||
elseif((helper::today() >= $execution->begin) and (helper::today() <= $execution->end))
|
||||
{
|
||||
$begin = (date('Y-m-d', strtotime('-13 days')) < $execution->begin) ? $execution->begin : date('Y-m-d', strtotime('-13 days'));
|
||||
$end = helper::today();
|
||||
}
|
||||
elseif((helper::today() > $execution->end))
|
||||
{
|
||||
$begin = date('Y-m-d', strtotime('-13 days', strtotime($execution->end))) > $execution->begin ? date('Y-m-d', strtotime('-13 days', strtotime($execution->end))) : $execution->begin;
|
||||
$end = $execution->end;
|
||||
}
|
||||
|
||||
$end = (!helper::isZeroDate($execution->closedDate) and date('Y-m-d', strtotime($execution->closedDate)) < helper::today()) ? date('Y-m-d', strtotime($execution->closedDate)) : helper::today();
|
||||
$begin = (!helper::isZeroDate($execution->openedDate) and date('Y-m-d', strtotime($execution->openedDate)) > date('Y-m-d', strtotime('-13 days', strtotime($end)))) ? date('Y-m-d', strtotime($execution->openedDate)) : date('Y-m-d', strtotime('-13 days', strtotime($end)));
|
||||
return array($begin, $end);
|
||||
}
|
||||
|
||||
@@ -4358,6 +4347,8 @@ class executionModel extends model
|
||||
$this->loadModel('execution');
|
||||
$this->loadModel('programplan');
|
||||
|
||||
$today = helper::today();
|
||||
|
||||
if(!$isChild)
|
||||
{
|
||||
$trClass = 'is-top-level table-nest-child-hide';
|
||||
@@ -4379,11 +4370,33 @@ class executionModel extends model
|
||||
echo "<span class='project-type-label label label-outline $spanClass'>{$this->lang->execution->typeList[$execution->type]}</span> ";
|
||||
}
|
||||
echo empty($execution->children) ? html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name) : $execution->name;
|
||||
if(empty($execution->children))
|
||||
{
|
||||
echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name);
|
||||
if(!helper::isZeroDate($execution->end))
|
||||
{
|
||||
if($execution->status != 'closed')
|
||||
{
|
||||
echo strtotime($today) > strtotime($execution->end) ? '<span class="label label-danger label-badge">' . $this->lang->execution->delayed . '</span>' : '';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $execution->name;
|
||||
if(!helper::isZeroDate($execution->end))
|
||||
{
|
||||
if($execution->status != 'closed')
|
||||
{
|
||||
echo strtotime($today) > strtotime($execution->end) ? '<span class="label label-danger label-badge">' . $this->lang->execution->delayed . '</span>' : '';
|
||||
}
|
||||
}
|
||||
}
|
||||
echo '<td>' . zget($users, $execution->PM) . '</td>';
|
||||
echo "<td class='status-{$execution->status}'>" . zget($this->lang->project->statusList, $execution->status) . '</td>';
|
||||
echo "<td class='status-{$execution->status} text-center'>" . zget($this->lang->project->statusList, $execution->status) . '</td>';
|
||||
echo '<td>' . html::ring($execution->hours->progress) . '</td>';
|
||||
echo '<td>' . $execution->begin . '</td>';
|
||||
echo '<td>' . $execution->end . '</td>';
|
||||
echo helper::isZeroDate($execution->begin) ? '<td class="c-date"></td>' : '<td class="c-date">' . $execution->begin . '</td>';
|
||||
echo helper::isZeroDate($execution->end) ? '<td class="c-date"></td>' : '<td class="c-date">' . $execution->end . '</td>';
|
||||
echo "<td class='hours' title='{$execution->hours->totalEstimate}{$this->lang->execution->workHour}'>" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo "<td class='hours' title='{$execution->hours->totalConsumed}{$this->lang->execution->workHour}'>" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo "<td class='hours' title='{$execution->hours->totalLeft}{$this->lang->execution->workHour}'>" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . '</td>';
|
||||
@@ -4721,4 +4734,23 @@ class executionModel extends model
|
||||
echo '</td>';
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Build search form
|
||||
*
|
||||
* @param int $queryID
|
||||
* @param string $actionURL
|
||||
* @return void
|
||||
* */
|
||||
public function buildSearchFrom($queryID, $actionURL)
|
||||
{
|
||||
$this->config->execution->all->search['queryID'] = $queryID;
|
||||
$this->config->execution->all->search['actionURL'] = $actionURL;
|
||||
|
||||
$projectPairs = array(0 => '');
|
||||
$projectPairs += $this->loadModel('project')->getPairsByProgram();
|
||||
$this->config->execution->all->search['params']['project']['values'] = $projectPairs + array('all' => $this->lang->execution->allProject);
|
||||
|
||||
$this->loadModel('search')->setSearchParams($this->config->execution->all->search);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,14 +16,11 @@
|
||||
$datatableId = $this->moduleName . ucfirst($this->methodName);
|
||||
$useDatatable = (isset($config->datatable->$datatableId->mode) and $config->datatable->$datatableId->mode == 'datatable');
|
||||
?>
|
||||
<?php js::set('unfoldExecutions', array());?>
|
||||
<?php js::set('useDatatable', $useDatatable);?>
|
||||
<?php js::set('from', $from);?>
|
||||
<?php js::set('projectID', $projectID);?>
|
||||
<?php
|
||||
/* Set unfold parent executionID. */
|
||||
$unfoldExecutions = isset($config->execution->all->unfoldExecutions) ? json_decode($config->execution->all->unfoldExecutions, true) : array();
|
||||
$unfoldExecutions = zget($unfoldExecutions, $projectID, array());
|
||||
js::set('unfoldExecutions', $unfoldExecutions);
|
||||
js::set('unfoldAll', $lang->execution->treeLevel['all']);
|
||||
js::set('foldAll', $lang->execution->treeLevel['root']);
|
||||
js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
@@ -38,48 +35,38 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<?php
|
||||
$class = '';
|
||||
if($productID == 0) $class = 'class="active"';
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&projectID=$projectID&orderby=$orderBy"), $lang->product->allProduct) . "</li>";
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&orderby=$orderBy"), $lang->product->allProduct) . "</li>";
|
||||
foreach($productList as $key => $product)
|
||||
{
|
||||
$class = $productID == $key ? 'class="active"' : '';
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&projectID=$projectID&orderby=$orderBy&productID=$key"), $product) . "</li>";
|
||||
echo "<li $class>" . html::a($this->createLink('project', 'execution', "status=$status&orderby=$orderBy&productID=$key"), $product) . "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php common::sortFeatureMenu();?>
|
||||
<?php foreach($lang->execution->featureBar['all'] as $key => $label):?>
|
||||
<?php $label = "<span class='text'>$label</span>";?>
|
||||
<?php if($status == $key) $label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";?>
|
||||
<?php echo html::a($this->createLink($this->app->rawModule, $this->app->rawMethod, "status=$key&projectID=$projectID&orderBy=$orderBy&productID=$productID"), $label, '', "class='btn btn-link' id='{$key}Tab' data-app='$from'");?>
|
||||
<?php echo html::a($this->createLink($this->app->rawModule, $this->app->rawMethod, "status=$key&orderBy=$orderBy&productID=$productID"), $label, '', "class='btn btn-link' id='{$key}Tab' data-app='$from'");?>
|
||||
<?php endforeach;?>
|
||||
<?php if($from == 'execution' and $this->config->systemMode == 'new'):?>
|
||||
<div class='input-control w-180px'>
|
||||
<?php echo html::select('project', $projects, $projectID, "class='form-control chosen' data-placeholder='{$lang->execution->selectProject}'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->execution->byQuery;?></a>
|
||||
</div>
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<?php common::printLink('execution', 'export', "status=$status&productID=$productID&orderBy=$orderBy&from=$from", "<i class='icon-export muted'> </i> " . $lang->export, '', "class='btn btn-link export'")?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-primary'");?>
|
||||
<?php else: ?>
|
||||
<?php if(common::hasPriv('execution', 'create')) echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-sm icon-plus'></i> " . ((($from == 'execution') and ($config->systemMode == 'new')) ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-primary create-execution-btn' data-app='execution' onclick='$(this).removeAttr(\"data-toggle\")'");?>
|
||||
<?php endif;?>
|
||||
<?php if(common::hasPriv('execution', 'create')) echo html::a($this->createLink('execution', 'create'), "<i class='icon icon-sm icon-plus'></i> " . ((($from == 'execution') and ($config->systemMode == 'new')) ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-primary create-execution-btn' data-app='execution' onclick='$(this).removeAttr(\"data-toggle\")'");?>
|
||||
</div>
|
||||
</div>
|
||||
<div id='mainContent' class="main-row fade">
|
||||
<div class="cell<?php if($status == 'bySearch') echo ' show';?>" id="queryBox" data-module='execution'></div>
|
||||
<?php if(empty($executionStats)):?>
|
||||
<div class="table-empty-tip">
|
||||
<p>
|
||||
<span class="text-muted"><?php echo $from == 'execution' ? $lang->execution->noExecutions : $lang->execution->noExecution;?></span>
|
||||
<?php if(empty($allExecutionsNum)):?>
|
||||
<?php if(common::hasPriv('programplan', 'create') and $isStage):?>
|
||||
<?php echo html::a($this->createLink('programplan', 'create', "projectID=$projectID&productID=$productID"), "<i class='icon icon-plus'></i> " . $lang->programplan->create, '', "class='btn btn-info'");?>
|
||||
<?php else: ?>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . (($from == 'execution' and $config->systemMode == 'new') ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-info' data-app='execution'");?>
|
||||
<?php endif;?>
|
||||
<?php if(common::hasPriv('execution', 'create')):?>
|
||||
<?php echo html::a($this->createLink('execution', 'create'), "<i class='icon icon-plus'></i> " . (($from == 'execution' and $config->systemMode == 'new') ? $lang->execution->createExec : $lang->execution->create), '', "class='btn btn-info' data-app='execution'");?>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</p>
|
||||
@@ -91,7 +78,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<nav class="btn-toolbar pull-right setting"></nav>
|
||||
</div>
|
||||
<?php
|
||||
$vars = "status=$status&projectID=$projectID&orderBy=%s&productID=$productID&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";
|
||||
$vars = "status=$status&orderBy=%s&productID=$productID¶m=$param&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";
|
||||
if($useDatatable) include '../../common/view/datatable.html.php';
|
||||
else include '../../common/view/tablesorter.html.php';
|
||||
|
||||
@@ -164,12 +151,6 @@ $(document).on('click', '.plan-toggle', function(e)
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$('#project').change(function()
|
||||
{
|
||||
var projectID = $('#project').val();
|
||||
location.href = createLink('execution', 'all', 'status=' + status + '&projectID=' + projectID);
|
||||
});
|
||||
</script>
|
||||
<?php js::set('orderBy', $orderBy)?>
|
||||
<?php js::set('status', $status)?>
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<tr>
|
||||
<th class='c-id'><?php echo $lang->idAB;?></th>
|
||||
<?php if($config->systemMode == 'new' and isset($project) and $project->model == 'scrum'):?>
|
||||
<th class='c-project required' style="width:100%"><?php echo $lang->execution->projectName;?></th>
|
||||
<th class='c-project required <?php echo $minWidth?>' style="width:100%"><?php echo $lang->execution->projectName;?></th>
|
||||
<?php endif;?>
|
||||
<th class='required <?php echo $minWidth?>' style="width:100%"><?php echo $lang->execution->$name;?></th>
|
||||
<?php if(!isset($config->setCode) or $config->setCode == 1):?>
|
||||
|
||||
@@ -31,12 +31,17 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
$buildName = $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';
|
||||
$module = $type != 'bysearch' ? "¶m=$param" : '';
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=all$module"), "<span class='text'>{$lang->bug->allBugs}</span>" . ($type == 'all' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='allTab' class='btn btn-link" . ('all' == $type ? ' btn-active-text' : '') . "'");
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=unresolved$module"), "<span class='text'>{$lang->bug->unResolved}</span>" . ($type == 'unresolved' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='unresolvedTab' class='btn btn-link" . ('unresolved' == $type ? ' btn-active-text' : '') . "'");
|
||||
?>
|
||||
<?php common::sortFeatureMenu();?>
|
||||
<?php foreach($lang->execution->featureBar['bug'] as $featureType => $label):?>
|
||||
<?php $active = $type == $featureType ? 'btn-active-text' : '';?>
|
||||
<?php $label = "<span class='text'>$label</span>";?>
|
||||
<?php if($type == $featureType):?>
|
||||
<?php $label .= " <span class='label label-light label-badge'>{$pager->recTotal}</span>";?>
|
||||
<?php $label .= $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';?>
|
||||
<?php endif;?>
|
||||
<?php $module = $type != 'bysearch' ? "¶m=$param" : '';?>
|
||||
<?php echo html::a(inlink('bug', "executionID=$execution->id&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type={$featureType}$module"), $label, '', "class='btn btn-link $active' id='{$featureType}Tab'");?>
|
||||
<?php endforeach;?>
|
||||
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->bug->search;?></a>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
|
||||
@@ -16,14 +16,14 @@
|
||||
<div id="mainMenu" class="clearfix table-row">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
$label = "<span class='text'>{$lang->execution->build}</span>";
|
||||
$active = '';
|
||||
if($type == 'all')
|
||||
common::sortFeatureMenu();
|
||||
foreach($lang->execution->featureBar['build'] as $featureType => $label)
|
||||
{
|
||||
$active = 'btn-active-text';
|
||||
$label .= " <span class='label label-light label-badge'>{$buildsTotal}</span>";
|
||||
$label = "<span class='text'>$label</span>";
|
||||
$activeClass = $type == $featureType ? 'btn-active-text' : '';
|
||||
if($type == $featureType) $label .= " <span class='label label-light label-badge'>{$buildsTotal}</span>";
|
||||
echo html::a(inlink('build', "executionID=$executionID&type=$featureType"), $label, '',"class='btn btn-link $activeClass' data-app={$app->tab} id='$featureType'");
|
||||
}
|
||||
echo html::a(inlink('build', "executionID={$executionID}&type=all"), $label, '', "class='btn btn-link $active' id='all'")
|
||||
?>
|
||||
<div class="input-control space w-150px"><?php echo html::select('product', $products, $product, "onchange='changeProduct(this.value)' class='form-control chosen' data-placeholder='{$lang->productCommon}'");?></div>
|
||||
</div>
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
<?php js::set('YUnit', $lang->execution->count); ?>
|
||||
<?php js::set('XUnit', $lang->execution->burnXUnit); ?>
|
||||
<?php js::set('dateRangeTip', $lang->execution->charts->cfd->dateRangeTip); ?>
|
||||
<?php js::set('today', date(DT_DATE1)); ?>
|
||||
<?php js::set('executionBegin', $execution->begin); ?>
|
||||
<?php js::set('minDate', $minDate); ?>
|
||||
<?php js::set('maxDate', $maxDate); ?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user