Merge branch 'master' into zenops_46
This commit is contained in:
@@ -57,7 +57,7 @@ class executionsEntry extends entry
|
||||
{
|
||||
foreach($execution->hours as $field => $value) $execution->$field = $value;
|
||||
|
||||
$execution = $this->filterFields($execution, 'id,name,project,code,type,parent,begin,end,status,openedBy,openedDate,delay,progress,' . $appendFields);
|
||||
$execution = $this->filterFields($execution, 'id,name,project,code,type,parent,begin,end,status,openedBy,openedDate,delay,progress,children,' . $appendFields);
|
||||
$result[] = $this->format($execution, 'openedBy:user,openedDate:time,lastEditedBy:user,lastEditedDate:time,closedBy:user,closedDate:time,canceledBy:user,canceledDate:time,PM:user,PO:user,RD:user,QD:user,whitelist:userList,begin:date,end:date,realBegan:date,realEnd:date,deleted:bool');
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ class productProjectsEntry extends entry
|
||||
$appendFields = $this->param('fields', '');
|
||||
|
||||
$control = $this->loadController('product', 'project');
|
||||
$control->project($this->param('status', 'all'), $productID, $this->param('branch', 0), $this->param('involved', 0), $this->param('order', 'order_desc'));
|
||||
$control->project($this->param('status', 'all'), $productID, $this->param('branch', 0), $this->param('involved', 0), $this->param('order', 'order_desc'), 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
$data = $this->getData();
|
||||
|
||||
if(isset($data->status) and $data->status == 'success')
|
||||
|
||||
@@ -23,8 +23,10 @@ class projectReleasesEntry extends entry
|
||||
if(empty($projectID)) $projectID = $this->param('project');
|
||||
if(empty($projectID)) return $this->sendError(400, 'Need project id.');
|
||||
|
||||
$page = intval($this->param('page', 1));
|
||||
$limit = intval($this->param('limit', 20));
|
||||
$control = $this->loadController('projectrelease', 'browse');
|
||||
$control->browse($projectID, $this->param('execution', 0), $this->param('status', 'all'), $this->param('order', 't1.date_desc'));
|
||||
$control->browse($projectID, $this->param('execution', 0), $this->param('status', 'all'), $this->param('order', 't1.date_desc'), 0, $limit, $page);
|
||||
|
||||
/* Response */
|
||||
$data = $this->getData();
|
||||
|
||||
@@ -36,7 +36,7 @@ class taskRecordEstimateEntry extends Entry
|
||||
if(!$data) return $this->error('error');
|
||||
if(isset($data->status) and $data->status == 'fail') return $this->sendError(zget($data, 'code', 400), $data->message);
|
||||
|
||||
$effort = array();
|
||||
$effort = new stdclass();
|
||||
if($issetEffort and $data->data->efforts) $effort = $data->data->efforts;
|
||||
if(!$issetEffort and $data->data->estimates) $effort = $data->data->estimates;
|
||||
$this->send(200, array('effort' => $effort));
|
||||
|
||||
@@ -66,4 +66,43 @@ class testtasksEntry extends entry
|
||||
|
||||
return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'testtasks' => $result));
|
||||
}
|
||||
|
||||
/**
|
||||
* POST method.
|
||||
*
|
||||
* @access public
|
||||
* @param int $projectID
|
||||
* @return void
|
||||
*/
|
||||
public function post($projectID = 0)
|
||||
{
|
||||
if(!$projectID) $projectID = $this->param('project', 0);
|
||||
$productID = $this->request('product', 0);
|
||||
$executionID = $this->request('execution', 0);
|
||||
$buildID = $this->request('build', 0);
|
||||
if(empty($projectID)) return $this->sendError(400, 'need project id!');
|
||||
if(empty($productID)) return $this->sendError(400, 'need product id!');
|
||||
if(empty($executionID)) return $this->sendError(400, 'need execution id!');
|
||||
if(empty($buildID)) return $this->sendError(400, 'need build id!');
|
||||
|
||||
/* Check whether executionID and buildID is valid. */
|
||||
$executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, '', 'id_desc', $projectID);
|
||||
$builds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'notrunk');
|
||||
if(!isset($executions[$executionID])) return $this->sendError(400, 'error execution id!');
|
||||
if(!isset($builds[$buildID])) return $this->sendError(400, 'error build id!');
|
||||
|
||||
$fields = 'product,execution,build,name,begin,end,owner,type,pri,status,desc';
|
||||
$this->batchSetPost($fields);
|
||||
|
||||
$control = $this->loadController('testtask', 'create');
|
||||
$this->requireFields('name,begin,end');
|
||||
$control->create($productID, $executionID, $build, $projectID);
|
||||
|
||||
$data = $this->getData();
|
||||
if(!isset($data->id)) return $this->sendError(400, $data->message);
|
||||
|
||||
$testtask = $this->loadModel('testtask')->getByID($data->id);
|
||||
|
||||
$this->send(201, $testtask);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ class userEntry extends Entry
|
||||
$info->profile->role = array('code' => $info->profile->role, 'name' => $this->lang->user->roleList[$info->profile->role]);
|
||||
$info->profile->admin = strpos($this->app->company->admins, ",{$profile->account},") !== false;
|
||||
$info->profile->superReviewer = isset($this->config->story) ? strpos(',' . trim(zget($this->config->story, 'superReviewers', ''), ',') . ',', ',' . $this->app->user->account . ',') : false;
|
||||
$info->profile->view = $this->app->user->view;
|
||||
|
||||
if(!$fields) return $this->send(200, $info);
|
||||
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
|
||||
if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* 基本设置。Basic settings. */
|
||||
$config->version = '17.6.2'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->version = '17.7'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite.
|
||||
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
|
||||
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
|
||||
|
||||
+10
-8
@@ -172,6 +172,7 @@ $filter->tree->browse = new stdclass();
|
||||
$filter->productplan->browse = new stdclass();
|
||||
$filter->kanban->space = new stdclass();
|
||||
$filter->execution->kanban = new stdclass();
|
||||
$filter->execution->all = new stdclass();
|
||||
|
||||
$filter->index->index->get['open'] = 'reg::base64';
|
||||
|
||||
@@ -300,14 +301,15 @@ $filter->productplan->browse->cookie['viewType'] = 'code';
|
||||
$filter->task->create->cookie['lastTaskModule'] = 'int';
|
||||
$filter->task->export->cookie['checkedItem'] = 'reg::checked';
|
||||
|
||||
$filter->execution->default->cookie['kanbanview'] = 'code';
|
||||
$filter->execution->story->cookie['storyPreExecutionID'] = 'int';
|
||||
$filter->execution->story->cookie['storyModuleParam'] = 'int';
|
||||
$filter->execution->story->cookie['storyProductParam'] = 'int';
|
||||
$filter->execution->story->cookie['storyBranchParam'] = 'int';
|
||||
$filter->execution->story->cookie['executionStoryOrder'] = 'code';
|
||||
$filter->execution->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
|
||||
$filter->execution->default->cookie['kanbanview'] = 'code';
|
||||
$filter->execution->story->cookie['storyPreExecutionID'] = 'int';
|
||||
$filter->execution->story->cookie['storyModuleParam'] = 'int';
|
||||
$filter->execution->story->cookie['storyProductParam'] = 'int';
|
||||
$filter->execution->story->cookie['storyBranchParam'] = 'int';
|
||||
$filter->execution->story->cookie['executionStoryOrder'] = 'code';
|
||||
$filter->execution->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
|
||||
$filter->execution->all->cookie['showExecutionBatchEdit'] = 'int';
|
||||
|
||||
$filter->testcase->browse->cookie['caseModule'] = 'int';
|
||||
$filter->testcase->browse->cookie['caseSuite'] = 'int';
|
||||
|
||||
@@ -216,6 +216,7 @@ $config->openMethods[] = 'kanban.importplan';
|
||||
$config->openMethods[] = 'kanban.importrelease';
|
||||
$config->openMethods[] = 'kanban.importexecution';
|
||||
$config->openMethods[] = 'kanban.importbuild';
|
||||
$config->openMethods[] = 'kanban.importticket';
|
||||
$config->openMethods[] = 'kanban.activatecard';
|
||||
$config->openMethods[] = 'kanban.finishcard';
|
||||
$config->openMethods[] = 'kanban.deleteobjectcard';
|
||||
@@ -225,6 +226,7 @@ $config->openMethods[] = 'tree.viewhistory';
|
||||
$config->openMethods[] = 'doc.createbasicinfo';
|
||||
$config->openMethods[] = 'project.createguide';
|
||||
$config->openMethods[] = 'task.editteam';
|
||||
$config->openMethods[] = 'feedback.mergeproductmodule';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
@@ -409,4 +411,4 @@ $config->waterfallModules = array('workestimation', 'durationestimation', 'budge
|
||||
$config->showMainMenu = true;
|
||||
$config->maxPriValue = '256';
|
||||
|
||||
$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback');
|
||||
$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket');
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,75 @@
|
||||
CREATE TABLE IF NOT EXISTS `zt_ticket` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`product` mediumint(8) unsigned NOT NULL,
|
||||
`module` mediumint(8) unsigned NOT NULL,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`type` varchar(30) NOT NULL,
|
||||
`desc` text NOT NULL,
|
||||
`openedBuild` varchar(255) NOT NULL,
|
||||
`feedback` mediumint(8) NOT NULL,
|
||||
`assignedTo` varchar(255) NOT NULL,
|
||||
`assignedDate` datetime NOT NULL,
|
||||
`realStarted` datetime NOT NULL,
|
||||
`startedBy` varchar(255) NOT NULL,
|
||||
`startedDate` datetime NOT NULL,
|
||||
`deadline` date NOT NULL,
|
||||
`pri` tinyint unsigned NOT NULL DEFAULT '0',
|
||||
`estimate` float unsigned NOT NULL,
|
||||
`consumed` float unsigned NOT NULL,
|
||||
`left` float unsigned NOT NULL,
|
||||
`status` varchar(30) NOT NULL,
|
||||
`openedBy` varchar(30) NOT NULL,
|
||||
`openedDate` datetime NOT NULL,
|
||||
`activatedCount` int(10) NOT NULL,
|
||||
`activatedBy` varchar(30) NOT NULL,
|
||||
`activatedDate` datetime NOT NULL,
|
||||
`closedBy` varchar(30) NOT NULL,
|
||||
`closedDate` datetime NOT NULL,
|
||||
`closedReason` varchar(30) NOT NULL,
|
||||
`finishedBy` varchar(30) NOT NULL,
|
||||
`finishedDate` datetime NOT NULL,
|
||||
`resolvedBy` varchar(30) NOT NULL,
|
||||
`resolvedDate` datetime NOT NULL,
|
||||
`resolution` varchar(1000) NOT NULL,
|
||||
`editedBy` varchar(30) NOT NULL,
|
||||
`editedDate` datetime NOT NULL,
|
||||
`keywords` varchar(255) NOT NULL,
|
||||
`repeatTicket` mediumint(8) NOT NULL DEFAULT '0',
|
||||
`mailto` varchar(255) NOT NULL,
|
||||
`deleted` enum('0','1') NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
key `product` (`product`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `zt_ticketsource` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`ticketId` mediumint(8) unsigned NOT NULL,
|
||||
`customer` varchar(100) NOT NULL,
|
||||
`contact` varchar(100) NOT NULL,
|
||||
`notifyEmail` varchar(100) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
key `ticketId` (`ticketId`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE `zt_ticketrelation` (
|
||||
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`ticketId` mediumint unsigned NOT NULL,
|
||||
`objectId` mediumint NOT NULL,
|
||||
`objectType` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `ticketId` (`ticketId`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
ALTER TABLE `zt_product` ADD `ticket` varchar(30) NOT NULL AFTER `feedback`;
|
||||
ALTER TABLE `zt_kanban` ADD `colWidth` smallint(4) NOT NULL DEFAULT '264' AFTER `fluidBoard`;
|
||||
ALTER TABLE `zt_kanban` ADD `minColWidth` smallint(4) NOT NULL DEFAULT '180' AFTER `colWidth`;
|
||||
ALTER TABLE `zt_kanban` ADD `maxColWidth` smallint(4) NOT NULL DEFAULT '384' AFTER `minColWidth`;
|
||||
ALTER TABLE `zt_project` ADD `colWidth` smallint(4) NOT NULL DEFAULT '264' AFTER `fluidBoard`;
|
||||
ALTER TABLE `zt_project` ADD `minColWidth` smallint(4) NOT NULL DEFAULT '180' AFTER `colWidth`;
|
||||
ALTER TABLE `zt_project` ADD `maxColWidth` smallint(4) NOT NULL DEFAULT '384' AFTER `minColWidth`;
|
||||
|
||||
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', 'global', 'syncProduct', '{"feedback":{},"ticket":{}}');
|
||||
|
||||
ALTER TABLE `zt_feedback` ADD `pri` tinyint unsigned NOT NULL DEFAULT 2 AFTER `desc`;
|
||||
ALTER TABLE `zt_feedback` ADD `source` varchar(255) NOT NULL AFTER `notifyEmail`;
|
||||
|
||||
+74
-6
@@ -835,9 +835,9 @@ CREATE TABLE IF NOT EXISTS `zt_kanban` (
|
||||
`displayCards` smallint(6) NOT NULL default '0',
|
||||
`showWIP` enum('0','1') NOT NULL DEFAULT '1',
|
||||
`fluidBoard` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`colWidth` tinyint(3) NOT NULL DEFAULT '0',
|
||||
`minColWidth` tinyint(3) NOT NULL DEFAULT '0',
|
||||
`maxColWidth` tinyint(3) NOT NULL DEFAULT '0',
|
||||
`colWidth` smallint(4) NOT NULL DEFAULT '264',
|
||||
`minColWidth` smallint(4) NOT NULL DEFAULT '180',
|
||||
`maxColWidth` smallint(4) NOT NULL DEFAULT '384',
|
||||
`object` varchar(255) NOT NULL,
|
||||
`alignment` varchar(10) NOT NULL default 'center',
|
||||
`createdBy` char(30) NOT NULL,
|
||||
@@ -1196,9 +1196,9 @@ CREATE TABLE IF NOT EXISTS `zt_project` (
|
||||
`vision` varchar(10) NOT NULL DEFAULT 'rnd',
|
||||
`displayCards` smallint(6) NOT NULL default '0',
|
||||
`fluidBoard` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`colWidth` tinyint(3) NOT NULL DEFAULT '0',
|
||||
`minColWidth` tinyint(3) NOT NULL DEFAULT '0',
|
||||
`maxColWidth` tinyint(3) NOT NULL DEFAULT '0',
|
||||
`colWidth` smallint(4) NOT NULL DEFAULT '264',
|
||||
`minColWidth` smallint(4) NOT NULL DEFAULT '180',
|
||||
`maxColWidth` smallint(4) NOT NULL DEFAULT '384',
|
||||
`deleted` enum('0','1') NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `parent` (`parent`),
|
||||
@@ -6309,6 +6309,7 @@ INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'project', '', 'unitList', 'CNY,USD');
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'project', '', 'defaultCurrency', 'CNY');
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'story', '', 'reviewRules', 'allpass');
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', 'global', 'syncProduct', '{"feedback":{},"ticket":{}}');
|
||||
-- DROP TABLE IF EXISTS `zt_im_chat`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_im_chat` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
@@ -7092,11 +7093,13 @@ CREATE TABLE IF NOT EXISTS `zt_feedback` (
|
||||
`type` char(30) NOT NULL,
|
||||
`solution` char(30) NOT NULL,
|
||||
`desc` text NOT NULL,
|
||||
`pri` tinyint unsigned NOT NULL DEFAULT 2,
|
||||
`status` varchar(30) NOT NULL,
|
||||
`subStatus` varchar(30) NOT NULL default '',
|
||||
`public` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`notify` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`notifyEmail` varchar(100) NOT NULL,
|
||||
`source` varchar(255) NOT NULL,
|
||||
`likes` text NOT NULL,
|
||||
`result` mediumint(8) unsigned NOT NULL,
|
||||
`faq` mediumint(8) unsigned NOT NULL,
|
||||
@@ -7120,6 +7123,70 @@ CREATE TABLE IF NOT EXISTS `zt_feedback` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
-- DROP TABLE IF EXISTS `zt_ticket`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_ticket` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`product` mediumint(8) unsigned NOT NULL,
|
||||
`module` mediumint(8) unsigned NOT NULL,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`type` varchar(30) NOT NULL,
|
||||
`desc` text NOT NULL,
|
||||
`openedBuild` varchar(255) NOT NULL,
|
||||
`feedback` mediumint(8) NOT NULL,
|
||||
`assignedTo` varchar(255) NOT NULL,
|
||||
`assignedDate` datetime NOT NULL,
|
||||
`realStarted` datetime NOT NULL,
|
||||
`startedBy` varchar(255) NOT NULL,
|
||||
`startedDate` datetime NOT NULL,
|
||||
`deadline` date NOT NULL,
|
||||
`pri` tinyint unsigned NOT NULL DEFAULT '0',
|
||||
`estimate` float unsigned NOT NULL,
|
||||
`consumed` float unsigned NOT NULL,
|
||||
`left` float unsigned NOT NULL,
|
||||
`status` varchar(30) NOT NULL,
|
||||
`openedBy` varchar(30) NOT NULL,
|
||||
`openedDate` datetime NOT NULL,
|
||||
`activatedCount` int(10) NOT NULL,
|
||||
`activatedBy` varchar(30) NOT NULL,
|
||||
`activatedDate` datetime NOT NULL,
|
||||
`closedBy` varchar(30) NOT NULL,
|
||||
`closedDate` datetime NOT NULL,
|
||||
`closedReason` varchar(30) NOT NULL,
|
||||
`finishedBy` varchar(30) NOT NULL,
|
||||
`finishedDate` datetime NOT NULL,
|
||||
`resolvedBy` varchar(30) NOT NULL,
|
||||
`resolvedDate` datetime NOT NULL,
|
||||
`resolution` varchar(1000) NOT NULL,
|
||||
`editedBy` varchar(30) NOT NULL,
|
||||
`editedDate` datetime NOT NULL,
|
||||
`keywords` varchar(255) NOT NULL,
|
||||
`repeatTicket` mediumint(8) NOT NULL DEFAULT '0',
|
||||
`mailto` varchar(255) NOT NULL,
|
||||
`deleted` enum('0','1') NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
key `product` (`product`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `zt_ticketsource` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`ticketId` mediumint(8) unsigned NOT NULL,
|
||||
`customer` varchar(100) NOT NULL,
|
||||
`contact` varchar(100) NOT NULL,
|
||||
`notifyEmail` varchar(100) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
key `ticketId` (`ticketId`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE `zt_ticketrelation` (
|
||||
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`ticketId` mediumint unsigned NOT NULL,
|
||||
`objectId` mediumint NOT NULL,
|
||||
`objectType` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `ticketId` (`ticketId`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
ALTER TABLE `zt_bug` ADD `feedback` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `caseVersion`;
|
||||
ALTER TABLE `zt_story` ADD `feedback` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `fromBug`;
|
||||
ALTER TABLE `zt_user` ADD `feedback` enum('0', '1') NOT NULL DEFAULT '0' AFTER `locked`;
|
||||
@@ -7638,6 +7705,7 @@ ADD `grade` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `path`,
|
||||
ADD `order` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `grade`;
|
||||
|
||||
ALTER TABLE `zt_product` ADD `feedback` varchar(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `RD`;
|
||||
ALTER TABLE `zt_product` ADD `ticket` varchar(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `feedback`;
|
||||
|
||||
ALTER TABLE `zt_leave` ADD `level` tinyint(3) NOT NULL;
|
||||
ALTER TABLE `zt_leave` ADD `assignedTo` varchar(30) NOT NULL;
|
||||
|
||||
+190
@@ -1,3 +1,193 @@
|
||||
2022-10-19 17.7
|
||||
完成的需求
|
||||
开源版
|
||||
32322 Bug批量导入页面中先校验必填字段再校验重复数据
|
||||
37245 研发需求列表增加一键展开、收起功能
|
||||
37259 列表左侧模块导航样式优化
|
||||
37261 修改研发需求列表中字段的排列顺序
|
||||
37266 研发需求列表中的操作按钮增加分组显示
|
||||
37277 研发需求列表中层级关系的样式优化
|
||||
37283 删除列表中的斑马纹背景
|
||||
37513 研发需求列表替换ZUI3组件
|
||||
37810 有父子层级的列表增加一键展开、收起功能
|
||||
37811 列表中指派给字段的交互优化
|
||||
37812 列表中负责人字段的样式优化
|
||||
37813 列表中优先级颜色调整
|
||||
37814 列表中父子层级的样式优化
|
||||
37815 列表中级别颜色调整
|
||||
37816 列表检索标签选中样式优化
|
||||
37833 叶兰绿主题风格更新
|
||||
37835 列表删除斑马纹背景
|
||||
37841 研发需求列表中,操作列增加分组显示
|
||||
37842 禅道蓝主题风格更新
|
||||
37849 任务列表操作列增加分组显示
|
||||
37854 bug列表确认字段的内容颜色调整
|
||||
37857 bug列表的字段顺序调整
|
||||
37858 用例检索标签增加分组显示
|
||||
37861 用例列表操作列交换开始和结果按钮的位置
|
||||
37862 项目集列表删除“显示已关闭”的勾选按钮
|
||||
37863 项目集列表层级关系的展示
|
||||
37864 项目集列表中延期标签位置调整
|
||||
37865 项目集列表中预算字段增加超出提示
|
||||
37866 项目集列表中项目集的内容样式优化
|
||||
37868 项目集列表操作列的更多按钮调整
|
||||
37869 删除项目集列表中项目的图标
|
||||
37975 项目列表字段顺序调整
|
||||
37976 项目列表操作列更多按钮样式优化
|
||||
37977 项目列表批量编辑项目功能增加打开按钮
|
||||
37978 产品列表的批量编辑功能增加打开按钮
|
||||
37979 产品列表层级关系的样式优化
|
||||
37980 产品列表新增负责人字段
|
||||
37982 产品列表删除用户需求字段
|
||||
37983 产品列表删除bug关闭字段
|
||||
37984 产品列表下方增加统计信息
|
||||
37985 产品列表页面中,修改产品线的按钮样式优化
|
||||
37986 产品列表的字段顺序调整
|
||||
37989 计划列表操作列增加分组显示
|
||||
37990 计划列表下方增加数据的统计信息
|
||||
37992 创建多人任务时,工时填写不大于0时增加提示语
|
||||
37993 工时记录页,日期、工作内容、消耗、剩余增加必填项校验
|
||||
37994 工时记录页,日期的icon点击后也展开日期框
|
||||
37997 多人串行任务,用户打开工时填写页,默认打开我的日志页
|
||||
37998 多人串行任务中工时记录页,日志默认按照工序排列
|
||||
37999 工时记录页,日期列和工序列增加排序按钮
|
||||
38001 工时记录页样式优化
|
||||
38002 多人串行任务中,团队日志页去掉操作区域
|
||||
38006 多人串行任务开始任务的弹窗,总计消耗改名为我的总消耗
|
||||
38008 列表中名称字段样式优化
|
||||
38010 产品列表名称字段内容样式优化
|
||||
38011 团队的填写工时页面ui优化
|
||||
38167 计划列表执行字段展示信息优化
|
||||
38186 项目列表删除类型标签,鼠标悬停显示
|
||||
38227 产品列表删除产品名称前的图标
|
||||
38240 项目集列表中,鼠标悬停到项目名称时支持显示项目类型
|
||||
38241 项目和执行列表中延期标签位置调整
|
||||
38280 产品计划列表中对父子计划展开和收起的状态做记录
|
||||
38282 看板全屏时,颜色调整
|
||||
38283 执行列表中字段顺序调整
|
||||
38285 执行列表下方增加统计信息
|
||||
38286 执行列表默认显示字段删除执行代号
|
||||
38288 执行列表中预计、消耗、剩余字段表头和内容居右对齐
|
||||
38290 地盘项目列表字段顺序调整
|
||||
38291 修改地盘执行中“未结束”的检索标签为“未完成”
|
||||
38292 地盘执行列表字段顺序调整
|
||||
38293 地盘执行列表中工时/天居右显示
|
||||
38297 地盘待处理的用例列表中,调整优先级字段的位置
|
||||
38299 测试单列表中字段调整
|
||||
38300 执行列表中批量编辑增加开关
|
||||
38302 地盘待处理的测试单列表字段顺序调整
|
||||
38303 测试单列表下方增加统计信息
|
||||
38305 地盘待办列表字段顺序调整
|
||||
38306 地盘待办列表增加统计信息
|
||||
38307 发布列表中字段顺序调整
|
||||
38308 发布列表下方增加统计信息
|
||||
38311 用例列表字段顺序调整
|
||||
38313 地盘测试单列表字段顺序调整
|
||||
38315 地盘贡献中的文档列表增加最后更新者字段
|
||||
38316 瀑布项目的设计列表字段调整
|
||||
38348 项目集的可访问人员列表中字段顺序调整
|
||||
38354 执行任务列表字段顺序调整
|
||||
38355 列表中父子层级关系的样式优化
|
||||
38375 看板列宽设置的功能优化
|
||||
38385 测试套件列表下方增加统计信息
|
||||
38393 地盘中的任务列表字段顺序调整
|
||||
38395 地盘贡献的任务列表字段顺序调整
|
||||
38396 地盘待处理的研发需求列表字段调整
|
||||
38397 地盘待处理的用户需求列表字段调整
|
||||
38398 地盘待处理的bug列表的字段顺序调整
|
||||
38423 调整计划需求列表勾选后的统计内容
|
||||
38428 列表中数据延期的样式调整
|
||||
38430 项目列表下方增加统计信息
|
||||
38431 产品项目列表增加分页栏的显示
|
||||
38493 编辑任务时,团队维护的弹窗风格调整
|
||||
38533 地盘执行列表中我的任务居中显示
|
||||
38545 会议创建表单中,参会人员的下拉菜单修改为批量选择的组件
|
||||
38629 项目发布列表增加分页功能
|
||||
38736 版本列表中字段顺序调整
|
||||
38778 创建项目时,访问控制默认勾选公开
|
||||
企业版:
|
||||
37608 反馈模块增加1.5级产品导航
|
||||
38764 无产品瀑布项目设计功能去掉产品相关信息
|
||||
38644 反馈的优先级自定义
|
||||
37605 反馈创建增加来源公司和优先级字段
|
||||
37601 反馈分类支持同步单个产品的所属产品模块
|
||||
37597 反馈模块同步产品模块后,可以创建反馈自己的模块
|
||||
37478 实现工单列表的产品模块功能
|
||||
37473 在反馈视图的二级菜单里打印工单菜单
|
||||
37474 实现工单的添加功能
|
||||
37475 实现工单的编辑功能
|
||||
37476 实现工单的详情查看功能
|
||||
37477 实现工单的列表页面
|
||||
37480 实现工单的所有检索标签
|
||||
37481 实现工单的待关闭检索标签
|
||||
37482 实现工单的指派给的标签
|
||||
37483 实现工单的由我解决的检索标签
|
||||
37484 实现工单的由我创建的检索标签
|
||||
37485 在工单的列表页面打印操作菜单
|
||||
37486 在工单的详情页面打印操作按钮
|
||||
37487 实现工单的指派功能
|
||||
37488 实现工单的完成功能
|
||||
37489 实现工单的激活功能
|
||||
37490 实现工单的关闭功能
|
||||
37491 实现工单的开始操作
|
||||
37494 提交工单中影响版本的取值逻辑
|
||||
37495 实现从工单提需求的功能
|
||||
37498 实现从反馈创建工单的功能
|
||||
37554 实现反馈工单默认指派给的逻辑
|
||||
37555 实现反馈类型与工单类型的自定义
|
||||
37558 工单的优先级自定义
|
||||
37568 实现工单的权限
|
||||
37609 地盘待处理与待处理区块的反馈后增加工单数据
|
||||
37610 日志中增加工单日志
|
||||
37650 通用看板支持导入工单
|
||||
37823 实现工单的批量编辑功能
|
||||
37824 列表增加批量完成
|
||||
37825 列表增加批量激活
|
||||
37826 列表增加批量指派
|
||||
37995 实现工单列表搜索功能
|
||||
37996 实现工单的等待与处理中检索标签
|
||||
38198 实现工单的删除功能
|
||||
38199 实现工单的日志功能
|
||||
38487 实现工单相关动态的查看权限的设置
|
||||
38789 所属产品删除对工单的影响
|
||||
旗舰版:
|
||||
38673 地盘问题列表的字段顺序调整
|
||||
38676 指派给我检索标签下的问题列表中,指派给字段修改为由谁指派
|
||||
38680 地盘待处理的问题列表中删除指派给字段
|
||||
38687 地盘日志列表字段顺序调整
|
||||
38692 风险列表中字段顺序调整
|
||||
38694 风险列表中操作列按钮增加分组显示
|
||||
38695 问题列表中操作列按钮增加分组显示
|
||||
38728 QA不符合项列表的字段顺序调整
|
||||
38729 地盘QA列表中字段顺序调整
|
||||
38730 会议列表字段顺序调整
|
||||
38738 需求库中的需求列表字段顺序调整
|
||||
38739 用例库中的用例列表字段顺序调整
|
||||
38741 问题库中的问题列表字段顺序调整
|
||||
38743 风险库中的风险列表字段顺序调整
|
||||
38745 机会库中的机会列表字段顺序调整
|
||||
38746 资产库中的审批字段居左对齐
|
||||
禅道客户端:
|
||||
36365 提供修改讨论组图标功能,支持设置图标的背景颜色及填充文字。
|
||||
36366 支持上传讨论组图标,提供图标裁剪、预览功能。
|
||||
36622 提升首次登录喧喧历史消息的加载速度。
|
||||
22468 实现文件重传入口,未完成传输的文件可以一键重传。
|
||||
36879 实现搜索人员时可以显示其当前状态的功能。
|
||||
37105 实现管理员删除用户时同步从群组中移除该用户的功能。
|
||||
36928 优化会话中图片预览缩放功能。
|
||||
36931 优化启动喧喧时音视频初检频次。
|
||||
36932 优化忽略会议时会话列表中图标的干扰。
|
||||
修复的Bug
|
||||
26082 修复了初始化会议时,可能展示会议窗口或进行通知的问题。
|
||||
27458 修复了加入或转让讨论组时,未读消息数目不正确的问题。
|
||||
23066 修复安装xxb设置管理员保存后报错的问题。
|
||||
23067 修复安装xxb成功时页面报错的问题。
|
||||
27311 修复了客户端打开链接时会出错的问题。
|
||||
26801 修复消息输入框内的图片无法另存的问题。
|
||||
26805 修复了合并会话不生效的问题。
|
||||
26106 修复下载失败的图片没有重新下载的按钮的问题。
|
||||
26453 修复了回复通知类消息时,所引用的消息的发送者名称展示错误的问题。
|
||||
|
||||
2022-09-23 17.6.2
|
||||
完成的需求
|
||||
开源版:
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center'><?php echo html::a('javascript:void(0)', $lang->confirm, '', "class='btn btn-primary'");?></td>
|
||||
<td colspan='4' class='text-center'><?php echo html::a('javascript:void(0)', $lang->confirm, '', "class='btn btn-primary'");?></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
@@ -18,6 +18,8 @@ class entry extends baseEntry
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
if($this->app->action == 'options') return $this->send(204);
|
||||
|
||||
if(!isset($this->app->user) or $this->app->user->account == 'guest') $this->sendError(401, 'Unauthorized');
|
||||
|
||||
$this->dao = $this->loadModel('common')->dao;
|
||||
|
||||
@@ -1004,6 +1004,7 @@ class baseRouter
|
||||
array($ztSessionHandler, "destroy"),
|
||||
array($ztSessionHandler, "gc")
|
||||
);
|
||||
register_shutdown_function('session_write_close');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3167,7 +3168,6 @@ class ztSessionHandler
|
||||
{
|
||||
$this->tagID = $tagID;
|
||||
ini_set('session.save_handler', 'files');
|
||||
register_shutdown_function('session_write_close');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -504,8 +504,8 @@ class baseHTML
|
||||
/* If the link of the referer is not the link of the current page or the link of the index, the cookie and gobackLink will be updated. */
|
||||
if(!preg_match("/(m=|\/)(index|search|$currentModule)(&f=|-)(index|buildquery|$currentMethod)(&|-|\.)?/", strtolower($refererLink)))
|
||||
{
|
||||
$gobackList[$tab] = $referer;
|
||||
$gobackLink = $referer;
|
||||
$gobackList[$tab] = $referer . "#app=$tab";
|
||||
$gobackLink = $referer . "#app=$tab";
|
||||
setcookie('goback', json_encode($gobackList), $config->cookieLife, $config->webRoot, '', $config->cookieSecure, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -218,6 +218,7 @@ $lang->action->desc->importedproductplan = '$date, imported to <strong>$extra</
|
||||
$lang->action->desc->importedrelease = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedexecution = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedbuild = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedticket = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->fromsonarqube = '$date, created by <strong>$actor</strong> from <strong>SonarQube Issue</strong>.' . "\n";
|
||||
$lang->action->desc->tolib = '$date, imported by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->updatetolib = '$date, updated to ' . $lang->testcase->common . ' by <strong>$actor</strong>.' . "\n";
|
||||
@@ -746,6 +747,7 @@ $lang->action->label->mr = 'Merge Request|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab Server|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = 'Stage|stage|browse|';
|
||||
$lang->action->label->module = 'Module|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
$lang->action->label->ticket = 'Ticket|ticket|view|id=%s';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -218,6 +218,7 @@ $lang->action->desc->importedproductplan = '$date, imported to <strong>$extra</
|
||||
$lang->action->desc->importedrelease = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedexecution = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedbuild = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedticket = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->fromsonarqube = '$date, created by <strong>$actor</strong> from <strong>SonarQube Issue</strong>.' . "\n";
|
||||
$lang->action->desc->tolib = '$date, imported by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->updatetolib = '$date, updated to ' . $lang->testcase->common . ' by <strong>$actor</strong>.' . "\n";
|
||||
@@ -747,6 +748,7 @@ $lang->action->label->mr = 'Merge Request|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab Server|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = 'Stage|stage|browse|';
|
||||
$lang->action->label->module = 'Module|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
$lang->action->label->ticket = 'Ticket|ticket|view|id=%s';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -217,6 +217,7 @@ $lang->action->desc->importedproductplan = '$date, imported to <strong>$extra</
|
||||
$lang->action->desc->importedrelease = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedexecution = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedbuild = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->importedticket = '$date, imported to <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->fromsonarqube = '$date, created by <strong>$actor</strong> from <strong>SonarQube Issue</strong>.' . "\n";
|
||||
$lang->action->desc->tolib = '$date, Importé par <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->updatetolib = '$date, MàJ de ' . $lang->testcase->common . ' par <strong>$actor</strong>.' . "\n";
|
||||
@@ -745,6 +746,7 @@ $lang->action->label->mr = 'Merge Request|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab Server|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = 'Stage|stage|browse|';
|
||||
$lang->action->label->module = 'Module|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
$lang->action->label->ticket = 'Ticket|ticket|view|id=%s';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -218,6 +218,7 @@ $lang->action->desc->importedproductplan = '$date, 由 <strong>$actor</strong>
|
||||
$lang->action->desc->importedrelease = '$date, 由 <strong>$actor</strong> 从产品发布 <strong>$extra</strong> 导入。' . "\n";
|
||||
$lang->action->desc->importedexecution = '$date, 由 <strong>$actor</strong> 从项目执行 <strong>$extra</strong> 导入。' . "\n";
|
||||
$lang->action->desc->importedbuild = '$date, 由 <strong>$actor</strong> 从项目版本 <strong>$extra</strong> 导入。' . "\n";
|
||||
$lang->action->desc->importedticket = '$date, 由 <strong>$actor</strong> 从反馈工单 <strong>$extra</strong> 导入。' . "\n";
|
||||
$lang->action->desc->fromsonarqube = '$date, 由 <strong>$actor</strong> 从<strong>SonarQube问题</strong>转化而来。' . "\n";
|
||||
$lang->action->desc->tolib = '$date, 由 <strong>$actor</strong> 导入。' . "\n";
|
||||
$lang->action->desc->updatetolib = '$date, 由 <strong>$actor</strong> 从' . $lang->testcase->common . '更新。' . "\n";
|
||||
@@ -746,6 +747,7 @@ $lang->action->label->mr = '合并请求|mr|view|id=%s';
|
||||
$lang->action->label->gitlab = 'GitLab服务器|gitlab|view|id=%s';
|
||||
$lang->action->label->stage = '瀑布模型的阶段|stage|browse|';
|
||||
$lang->action->label->module = '模块|tree|browse|productid=%s&type=story¤tModuleID=0&branch=all';
|
||||
$lang->action->label->ticket = '工单|ticket|view|id=%s';
|
||||
|
||||
/* Object type. */
|
||||
$lang->action->search = new stdclass();
|
||||
|
||||
@@ -787,7 +787,9 @@ EOT;
|
||||
*/
|
||||
public function debug($filePath, $action)
|
||||
{
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
$fileDirPath = realpath(dirname($filePath));
|
||||
if(strpos($fileDirPath, $this->app->getModuleRoot()) !== 0 and strpos($fileDirPath, $this->app->getExtensionRoot()) !== 0) return;
|
||||
if($action == 'extendModel')
|
||||
{
|
||||
$method = $this->api->getMethod($filePath, 'Model');
|
||||
|
||||
@@ -488,7 +488,8 @@ class block extends control
|
||||
return true;
|
||||
}
|
||||
|
||||
$blocks = json_decode($blocks, true);
|
||||
$blocks = json_decode($blocks, true);
|
||||
if(empty($blocks)) $blocks = array();
|
||||
$blockPairs = array('' => '') + $blocks;
|
||||
|
||||
echo '<div class="form-group">';
|
||||
@@ -1734,10 +1735,11 @@ class block extends control
|
||||
if(common::hasPriv('bug', 'view') and $this->config->vision != 'lite') $hasViewPriv['bug'] = true;
|
||||
if($this->config->URAndSR and common::hasPriv('story', 'view') and $this->config->vision != 'lite') $hasViewPriv['requirement'] = true;
|
||||
if(common::hasPriv('story', 'view') and $this->config->vision != 'lite') $hasViewPriv['story'] = true;
|
||||
if(common::hasPriv('risk', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['risk'] = true;
|
||||
if(common::hasPriv('issue', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['issue'] = true;
|
||||
if(common::hasPriv('meeting', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['meeting'] = true;
|
||||
if(common::hasPriv('risk', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['risk'] = true;
|
||||
if(common::hasPriv('issue', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['issue'] = true;
|
||||
if(common::hasPriv('meeting', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['meeting'] = true;
|
||||
if(common::hasPriv('feedback', 'view') and in_array($this->config->edition, array('max', 'biz'))) $hasViewPriv['feedback'] = true;
|
||||
if(common::hasPriv('ticket', 'view') and in_array($this->config->edition, array('max', 'biz'))) $hasViewPriv['ticket'] = true;
|
||||
|
||||
$params = $this->get->param;
|
||||
$params = json_decode(base64_decode($params));
|
||||
@@ -1746,14 +1748,14 @@ class block extends control
|
||||
$objectCountList = array('todo' => 'todoCount', 'task' => 'taskCount', 'bug' => 'bugCount', 'story' => 'storyCount', 'requirement' => 'requirementCount');
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$objectList += array('risk' => 'risks', 'issue' => 'issues', 'feedback' => 'feedbacks');
|
||||
$objectCountList += array('risk' => 'riskCount', 'issue' => 'issueCount', 'feedback' => 'feedbackCount');
|
||||
$objectList += array('risk' => 'risks', 'issue' => 'issues', 'feedback' => 'feedbacks', 'ticket' => 'tickets');
|
||||
$objectCountList += array('risk' => 'riskCount', 'issue' => 'issueCount', 'feedback' => 'feedbackCount', 'ticket' => 'ticketCount');
|
||||
}
|
||||
|
||||
if($this->config->edition == 'biz')
|
||||
{
|
||||
$objectList += array('feedback' => 'feedbacks');
|
||||
$objectCountList += array('feedback' => 'feedbackCount');
|
||||
$objectList += array('feedback' => 'feedbacks', 'ticket' => 'tickets');
|
||||
$objectCountList += array('feedback' => 'feedbackCount', 'ticket' => 'ticketCount');
|
||||
}
|
||||
|
||||
$tasks = $this->loadModel('task')->getUserSuspendedTasks($this->app->user->account);
|
||||
@@ -1769,6 +1771,7 @@ class block extends control
|
||||
->beginIF($objectType == 'bug')->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')->fi()
|
||||
->beginIF($objectType == 'task')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.execution=t2.id')->fi()
|
||||
->beginIF($objectType == 'issue' or $objectType == 'risk')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')->fi()
|
||||
->beginIF($objectType == 'ticket')->leftJoin(TABLE_USER)->alias('t2')->on('t1.openedBy = t2.account')->fi()
|
||||
->where('t1.deleted')->eq(0)
|
||||
->andWhere('t1.assignedTo')->eq($this->app->user->account)->fi()
|
||||
->beginIF($objectType == 'story')->andWhere('t1.type')->eq('story')->andWhere('t2.deleted')->eq('0')->fi()
|
||||
@@ -1779,6 +1782,7 @@ class block extends control
|
||||
->beginIF($objectType != 'todo')->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF($objectType == 'feedback')->andWhere('t1.status')->in('wait, noreview')->fi()
|
||||
->beginIF($objectType == 'issue' or $objectType == 'risk')->andWhere('t2.deleted')->eq(0)->fi()
|
||||
->beginIF($objectType == 'ticket')->andWhere('t1.status')->in('wait,doing,done')->fi()
|
||||
->orderBy($orderBy)
|
||||
->beginIF($limitCount)->limit($limitCount)->fi()
|
||||
->fetchAll();
|
||||
@@ -1823,9 +1827,10 @@ class block extends control
|
||||
if($objectType == 'risk') $this->app->loadLang('risk');
|
||||
if($objectType == 'issue') $this->app->loadLang('issue');
|
||||
|
||||
if($objectType == 'feedback')
|
||||
if($objectType == 'feedback' or $objectType == 'ticket')
|
||||
{
|
||||
$this->app->loadLang('feedback');
|
||||
$this->app->loadLang('ticket');
|
||||
$this->view->users = $this->loadModel('user')->getPairs('all,noletter');
|
||||
$this->view->products = $this->dao->select('id, name')->from(TABLE_PRODUCT)->where('deleted')->eq('0')->fetchPairs('id', 'name');
|
||||
}
|
||||
|
||||
@@ -358,6 +358,7 @@ $lang->block->availableBlocks->risk = 'My Risks';
|
||||
$lang->block->availableBlocks->issue = 'My Issues';
|
||||
$lang->block->availableBlocks->meeting = 'My Meetings';
|
||||
$lang->block->availableBlocks->feedback = 'My Feedbacks';
|
||||
$lang->block->availableBlocks->ticket = 'Ticket';
|
||||
|
||||
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -478,6 +479,7 @@ $lang->block->issueCount = 'Issues';
|
||||
$lang->block->storyCount = 'Stories';
|
||||
$lang->block->meetingCount = 'Meetings';
|
||||
$lang->block->feedbackCount = 'Feedbacks';
|
||||
$lang->block->ticketCount = 'Tickets';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -358,6 +358,7 @@ $lang->block->availableBlocks->risk = 'Risks';
|
||||
$lang->block->availableBlocks->issue = 'Issues';
|
||||
$lang->block->availableBlocks->meeting = 'Meetings';
|
||||
$lang->block->availableBlocks->feedback = 'My Feedbacks';
|
||||
$lang->block->availableBlocks->ticket = 'Ticket';
|
||||
|
||||
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -478,6 +479,7 @@ $lang->block->issueCount = 'Issues';
|
||||
$lang->block->storyCount = 'Stories';
|
||||
$lang->block->meetingCount = 'Meetings';
|
||||
$lang->block->feedbackCount = 'Feedbacks';
|
||||
$lang->block->ticketCount = 'Tickets';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -358,6 +358,7 @@ $lang->block->availableBlocks->risk = 'My Risks';
|
||||
$lang->block->availableBlocks->issue = 'My Issues';
|
||||
$lang->block->availableBlocks->meeting = 'My Meetings';
|
||||
$lang->block->availableBlocks->feedback = 'My Feedbacks';
|
||||
$lang->block->availableBlocks->ticket = 'Ticket';
|
||||
|
||||
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -478,6 +479,7 @@ $lang->block->issueCount = 'Issues';
|
||||
$lang->block->storyCount = 'Stories';
|
||||
$lang->block->meetingCount = 'Meetings';
|
||||
$lang->block->feedbackCount = 'Feedbacks';
|
||||
$lang->block->ticketCount = 'Tickets';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -358,6 +358,7 @@ $lang->block->availableBlocks->risk = '风险';
|
||||
$lang->block->availableBlocks->issue = '问题';
|
||||
$lang->block->availableBlocks->meeting = '会议';
|
||||
$lang->block->availableBlocks->feedback = '反馈';
|
||||
$lang->block->availableBlocks->ticket = '工单';
|
||||
|
||||
if($config->systemMode == 'new') $lang->block->moduleList['project'] = '项目';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -478,6 +479,7 @@ $lang->block->issueCount = '问题数';
|
||||
$lang->block->storyCount = '需求数';
|
||||
$lang->block->meetingCount = '会议数';
|
||||
$lang->block->feedbackCount = '反馈数';
|
||||
$lang->block->ticketCount = '工单数';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id text-center'><?php echo $lang->idAB?></th>
|
||||
<th><?php echo $lang->build->name;?></th>
|
||||
<?php if($longBlock):?>
|
||||
<th><?php echo $lang->build->product;?></th>
|
||||
<?php endif;?>
|
||||
<th><?php echo $lang->build->name;?></th>
|
||||
<th class='c-date'><?php echo $lang->build->date;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -34,10 +34,10 @@
|
||||
?>
|
||||
<tr <?php echo $appid?>>
|
||||
<td class='text-center'><?php echo sprintf('%03d', $build->id);?></td>
|
||||
<td title='<?php echo $build->name?>'><?php echo html::a($buildViewLink, $build->name);?></td>
|
||||
<?php if($longBlock):?>
|
||||
<td title='<?php echo $build->productName?>'><?php echo html::a($productViewLink, $build->productName);?></td>
|
||||
<?php endif;?>
|
||||
<td title='<?php echo $build->name?>'><?php echo html::a($buildViewLink, $build->name);?></td>
|
||||
<td><?php echo $build->date?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
|
||||
@@ -102,11 +102,11 @@ $(function()
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
var $projectLi = $('#activeProject');
|
||||
if($projectLi.length)
|
||||
var $projectList = $('#activeProject');
|
||||
if($projectList.length)
|
||||
{
|
||||
var projectLi = $projectLi[0];
|
||||
$(".col ul.nav").animate({scrollTop: projectLi.offsetTop}, "slow");
|
||||
var projectList = $projectList[0];
|
||||
$(".col ul.nav").animate({scrollTop: projectList.offsetTop}, "slow");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -123,7 +123,7 @@ $(function()
|
||||
<?php $selected = key($projects);?>
|
||||
<?php foreach($projects as $project):?>
|
||||
<li <?php if($project->id == $selected) echo "class='active' id='activeProject'";?> projectID='<?php echo $project->id;?>'>
|
||||
<a href="###" title="<?php echo $project->name?>" data-target="#tab3Content<?php echo $project->id;?>" data-toggle="tab"><?php echo $project->name;?></a>
|
||||
<a href="###" title="<?php echo $project->name?>" data-target='<?php echo "#tab3{$blockNavId}Content{$project->id}";?>' data-toggle="tab"><?php echo $project->name;?></a>
|
||||
<?php echo html::a(helper::createLink('project', 'index', "projectID=$project->id"), "<i class='icon-arrow-right text-primary'></i>", '', "class='btn-view' title={$lang->project->index}");?>
|
||||
</li>
|
||||
<?php endforeach;?>
|
||||
@@ -132,7 +132,7 @@ $(function()
|
||||
</div>
|
||||
<div class="col tab-content">
|
||||
<?php foreach($projects as $project):?>
|
||||
<div class="tab-pane fade<?php if($project->id == $selected) echo ' active in';?>" id="tab3Content<?php echo $project->id;?>">
|
||||
<div class="tab-pane fade<?php if($project->id == $selected) echo ' active in';?>" id='<?php echo "tab3{$blockNavId}Content{$project->id}";?>'>
|
||||
<div class="table-row">
|
||||
<?php if($project->model == 'scrum' or $project->model == 'kanban'):?>
|
||||
<div class='table-row'>
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php if(empty($tickets)): ?>
|
||||
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
|
||||
<?php else:?>
|
||||
<style>
|
||||
.block-tickets .c-id {width: 50px;}
|
||||
</style>
|
||||
<div class='panel-body has-table scrollbar-hover'>
|
||||
<table class='table table-borderless table-fixed table-fixed-head table-hover tablesorter block-tickets <?php if(!$longBlock) echo 'block-sm'?>'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id'><?php echo $lang->idAB?></th>
|
||||
<th class='c-product'><?php echo $lang->ticket->product;?></th>
|
||||
<th class='c-title'><?php echo $lang->ticket->title?></th>
|
||||
<th class='c-type'><?php echo $lang->ticket->type;?></th>
|
||||
<th class='c-openedBy'><?php echo $lang->ticket->createdBy;?></th>
|
||||
<th class='c-openedDate'><?php echo $lang->ticket->createdDate;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($tickets as $ticket):?>
|
||||
<?php
|
||||
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
|
||||
?>
|
||||
<tr>
|
||||
<td><?php echo sprintf('%03d', $ticket->id);?></td>
|
||||
<td><?php echo zget($products, $ticket->product);?></td>
|
||||
<td class='c-title' title='<?php echo $ticket->title?>'><?php echo html::a($this->createLink('ticket', 'view', "ticketID=$ticket->id"), $ticket->title, '', "data-app='my'")?></td>
|
||||
<td><?php echo zget($lang->ticket->typeList, $ticket->type)?></td>
|
||||
<td><?php echo zget($users, $ticket->openedBy)?></td>
|
||||
<td><?php echo $ticket->openedDate;?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
+72
-72
@@ -24,7 +24,7 @@ $config->bug->list->allFields = 'id, module, execution, story, task,
|
||||
lastEditedBy,
|
||||
lastEditedDate';
|
||||
|
||||
$config->bug->list->defaultFields = 'id,severity,pri,title,openedBy,assignedTo,resolvedBy,resolution';
|
||||
$config->bug->list->defaultFields = 'id,title,severity,pri,openedBy,assignedTo,resolvedBy,resolution';
|
||||
|
||||
$config->bug->exportFields = 'id, product, branch, module, project, execution, story, task,
|
||||
title, keywords, severity, pri, type, os, browser,
|
||||
@@ -159,7 +159,7 @@ $config->bug->search['params']['deadline'] = array('operator' => '=',
|
||||
$config->bug->search['params']['activatedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
|
||||
$config->bug->datatable = new stdclass();
|
||||
$config->bug->datatable->defaultField = array('id', 'severity', 'pri', 'confirmed', 'title', 'status', 'openedBy', 'openedDate', 'assignedTo', 'resolution', 'actions');
|
||||
$config->bug->datatable->defaultField = array('id', 'title', 'severity', 'pri', 'status', 'openedBy', 'openedDate', 'confirmed', 'assignedTo', 'resolution', 'actions');
|
||||
|
||||
$config->bug->datatable->fieldList['id']['title'] = 'idAB';
|
||||
$config->bug->datatable->fieldList['id']['fixed'] = 'left';
|
||||
@@ -174,6 +174,12 @@ $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['title']['title'] = 'title';
|
||||
$config->bug->datatable->fieldList['title']['fixed'] = 'left';
|
||||
$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['severity']['title'] = 'severityAB';
|
||||
$config->bug->datatable->fieldList['severity']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['severity']['width'] = '50';
|
||||
@@ -186,16 +192,10 @@ $config->bug->datatable->fieldList['pri']['width'] = '50';
|
||||
$config->bug->datatable->fieldList['pri']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['pri']['name'] = $lang->bug->pri;
|
||||
|
||||
$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
|
||||
$config->bug->datatable->fieldList['confirmed']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['confirmed']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['title']['title'] = 'title';
|
||||
$config->bug->datatable->fieldList['title']['fixed'] = 'left';
|
||||
$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['status']['title'] = 'statusAB';
|
||||
$config->bug->datatable->fieldList['status']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['status']['width'] = '80';
|
||||
$config->bug->datatable->fieldList['status']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
|
||||
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
|
||||
@@ -230,10 +230,66 @@ $config->bug->datatable->fieldList['plan']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['plan']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['plan']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['status']['title'] = 'statusAB';
|
||||
$config->bug->datatable->fieldList['status']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['status']['width'] = '80';
|
||||
$config->bug->datatable->fieldList['status']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBy']['title'] = 'openedByAB';
|
||||
$config->bug->datatable->fieldList['openedBy']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBy']['width'] = '80';
|
||||
$config->bug->datatable->fieldList['openedBy']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['openedDate']['title'] = 'openedDateAB';
|
||||
$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']['control'] = 'multiple';
|
||||
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
|
||||
|
||||
$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
|
||||
$config->bug->datatable->fieldList['confirmed']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['confirmed']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
|
||||
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' =>'getPairs', 'params' => 'noclosed|noletter');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
|
||||
$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
|
||||
|
||||
$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'] = 'resolvedBy';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['resolution']['title'] = 'resolutionAB';
|
||||
$config->bug->datatable->fieldList['resolution']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolution']['width'] = '110';
|
||||
$config->bug->datatable->fieldList['resolution']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['resolvedDate']['title'] = 'resolvedDateAB';
|
||||
$config->bug->datatable->fieldList['resolvedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedDate']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['resolvedDate']['required'] = 'no';
|
||||
|
||||
$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['activatedCount']['title'] = 'activatedCountAB';
|
||||
$config->bug->datatable->fieldList['activatedCount']['fixed'] = 'no';
|
||||
@@ -283,62 +339,6 @@ $config->bug->datatable->fieldList['mailto']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['mailto']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['mailto']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['openedBy']['title'] = 'openedByAB';
|
||||
$config->bug->datatable->fieldList['openedBy']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['openedBy']['width'] = '80';
|
||||
$config->bug->datatable->fieldList['openedBy']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['openedDate']['title'] = 'openedDateAB';
|
||||
$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']['control'] = 'multiple';
|
||||
$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
|
||||
$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' =>'getPairs', 'params' => 'noclosed|noletter');
|
||||
|
||||
$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
|
||||
$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
|
||||
|
||||
$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';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['resolution']['title'] = 'resolutionAB';
|
||||
$config->bug->datatable->fieldList['resolution']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolution']['width'] = '110';
|
||||
$config->bug->datatable->fieldList['resolution']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['resolvedDate']['title'] = 'resolvedDateAB';
|
||||
$config->bug->datatable->fieldList['resolvedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedDate']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['resolvedDate']['required'] = 'no';
|
||||
|
||||
$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';
|
||||
$config->bug->datatable->fieldList['closedBy']['width'] = '80';
|
||||
|
||||
@@ -967,14 +967,8 @@ class bug extends control
|
||||
$changes = $this->bug->update($bugID);
|
||||
if(dao::isError())
|
||||
{
|
||||
if(defined('RUN_MODE') && RUN_MODE == 'api')
|
||||
{
|
||||
return $this->send(array('status' => 'error', 'message' => dao::getError()));
|
||||
}
|
||||
else
|
||||
{
|
||||
return print(js::error(dao::getError()));
|
||||
}
|
||||
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'error', 'message' => dao::getError()));
|
||||
return print(js::error(dao::getError()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1155,6 +1149,12 @@ class bug extends control
|
||||
$assignedToList = array_filter($assignedToList);
|
||||
if(empty($assignedToList)) $assignedToList = $this->user->getPairs('devfirst|noclosed');
|
||||
}
|
||||
if($bug->assignedTo and !isset($assignedToList[$bug->assignedTo]))
|
||||
{
|
||||
/* Fix bug #28378. */
|
||||
$assignedTo = $this->user->getById($bug->assignedTo);
|
||||
$assignedToList[$bug->assignedTo] = $assignedTo->realname;
|
||||
}
|
||||
if($bug->status == 'closed') $assignedToList['closed'] = 'Closed';
|
||||
|
||||
$branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : '';
|
||||
@@ -1826,7 +1826,7 @@ class bug extends control
|
||||
$this->view->users = $users;
|
||||
$this->view->assignedTo = $assignedTo;
|
||||
$this->view->productBugs = $productBugs;
|
||||
$this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID);
|
||||
$this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID, 'stagefilter');
|
||||
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'withbranch');
|
||||
$this->view->actions = $this->action->getList('bug', $bugID);
|
||||
$this->view->execution = isset($execution) ? $execution : '';
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
.closed, .closed a {color: gray; text-decoration:line-through;}
|
||||
.resolved, .resolved a {color: #8EC21F; text-decoration: none;}
|
||||
.tree .closed, .tree .closed a {color: #003366; text-decoration: none;}
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
#bugForm .setting {height: 25px;}
|
||||
|
||||
.datatable-wrapper .table-datatable .datatable-row td {height: 37px;}
|
||||
|
||||
@@ -78,7 +78,7 @@ class bugModel extends model
|
||||
->join('mailto', ',')
|
||||
->join('os', ',')
|
||||
->join('browser', ',')
|
||||
->remove('files,labels,uid,oldTaskID,contactListMenu,region,lane')
|
||||
->remove('files,labels,uid,oldTaskID,contactListMenu,region,lane,ticket')
|
||||
->get();
|
||||
|
||||
if($bug->execution != 0) $bug->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->execution)->fetch('project');
|
||||
@@ -754,7 +754,7 @@ class bugModel extends model
|
||||
/* Link bug to build and release. */
|
||||
if($bug->resolution == 'fixed' and !empty($bug->resolvedBuild) and $oldBug->resolvedBuild != $bug->resolvedBuild)
|
||||
{
|
||||
if(!empty($oldBug->resolvedBuild)) $this->loadModel('build')->unlinkBug((int)$oldBug->resolvedBuild, (int)$bugID);
|
||||
if(!empty($oldBug->resolvedBuild)) $this->loadModel('build')->unlinkBug($oldBug->resolvedBuild, (int)$bugID);
|
||||
$this->linkBugToBuild($bugID, $bug->resolvedBuild);
|
||||
}
|
||||
|
||||
@@ -2214,6 +2214,7 @@ class bugModel extends model
|
||||
if(!empty($run->task)) $testtask = $this->loadModel('testtask')->getById($run->task);
|
||||
$executionID = isset($testtask->execution) ? $testtask->execution : 0;
|
||||
|
||||
if(!$executionID and $caseID > 0) $executionID = isset($run->case->execution) ? $run->case->execution : 0; // Fix feedback #1043.
|
||||
if(!$executionID and $this->app->tab == 'execution') $executionID = $this->session->execution;
|
||||
|
||||
return array('title' => $title, 'steps' => $bugSteps, 'storyID' => $run->case->story, 'moduleID' => $run->case->module, 'version' => $run->case->version, 'executionID' => $executionID);
|
||||
@@ -3297,6 +3298,9 @@ class bugModel extends model
|
||||
$class .= ' text-ellipsis';
|
||||
$title = "title='" . $browser . "'";
|
||||
break;
|
||||
case 'deadline':
|
||||
$class .= ' text-center';
|
||||
break;
|
||||
}
|
||||
|
||||
if($id == 'deadline' && isset($bug->delay) && $bug->status == 'active') $class .= ' delayed';
|
||||
@@ -3440,7 +3444,7 @@ class bugModel extends model
|
||||
echo helper::isZeroDate($bug->assignedDate) ? '' : substr($bug->assignedDate, 5, 11);
|
||||
break;
|
||||
case 'deadline':
|
||||
echo helper::isZeroDate($bug->deadline) ? '' : substr($bug->deadline, 5, 11);
|
||||
echo helper::isZeroDate($bug->deadline) ? '' : '<span>' . substr($bug->deadline, 5, 11) . '</span>';
|
||||
break;
|
||||
case 'resolvedBy':
|
||||
echo zget($users, $bug->resolvedBy, $bug->resolvedBy);
|
||||
|
||||
@@ -160,11 +160,11 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
|
||||
<?php if($showNoticefeedbackBy):?>
|
||||
<tr>
|
||||
<th><nobr><?php echo $lang->bug->feedbackBy;?></nobr></th>
|
||||
<td><?php echo html::input('feedbackBy', $feedbackBy, "class='form-control'");?></td>
|
||||
<td><?php echo html::input('feedbackBy', isset($feedbackBy) ? $feedbackBy : '', "class='form-control'");?></td>
|
||||
<td id='notifyEmailTd'>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->bug->notifyEmail?></span>
|
||||
<span><?php echo html::input('notifyEmail', $notifyEmail, "class='form-control'");?></span>
|
||||
<span><?php echo html::input('notifyEmail', isset($notifyEmail) ? $notifyEmail : '', "class='form-control'");?></span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -126,11 +126,11 @@ js::set('flow', $config->global->flow);
|
||||
<?php endif;?>
|
||||
<?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?>
|
||||
</th>
|
||||
<th class='c-pri' title=<?php echo $lang->pri;?>><?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
|
||||
<th class='text-left'><?php common::printOrderLink('title', $orderBy, $vars, $lang->testcase->title);?></th>
|
||||
<th class='c-pri' title=<?php echo $lang->pri;?>><?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
|
||||
<th class='c-type'> <?php common::printOrderLink('type', $orderBy, $vars, $lang->typeAB);?></th>
|
||||
<th class='c-user'> <?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
|
||||
<th class='c-status'><?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
|
||||
<th class='c-user'> <?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
|
||||
<?php
|
||||
$extendFields = $this->caselib->getFlowExtendFields();
|
||||
foreach($extendFields as $extendField) echo "<th>{$extendField->name}</th>";
|
||||
@@ -148,15 +148,15 @@ js::set('flow', $config->global->flow);
|
||||
<?php echo sprintf('%03d', $case->id);?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $case->pri;?>' title='<?php echo zget($lang->testcase->priList, $case->pri, $case->pri);?>'><?php echo zget($lang->testcase->priList, $case->pri, $case->pri);?></span></td>
|
||||
<td class='text-left' title="<?php echo $case->title?>">
|
||||
<?php if($modulePairs and $case->module) echo "<span title='{$lang->testcase->module}' class='label label-info label-badge'>{$modulePairs[$case->module]}</span> ";?>
|
||||
<?php $viewLink = $this->createLink('testcase', 'view', "caseID=$case->id&version=$case->version");?>
|
||||
<?php echo html::a($viewLink, $case->title, null, "style='color: $case->color'");?>
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $case->pri;?>' title='<?php echo zget($lang->testcase->priList, $case->pri, $case->pri);?>'><?php echo zget($lang->testcase->priList, $case->pri, $case->pri);?></span></td>
|
||||
<td><?php echo $lang->testcase->typeList[$case->type];?></td>
|
||||
<td title="<?php echo zget($users, $case->openedBy);?>"><?php echo zget($users, $case->openedBy);?></td>
|
||||
<td class='<?php if(isset($run)) echo $run->status;?> testcase-<?php echo $case->status?>'> <?php echo $this->processStatus('testcase', $case);?></td>
|
||||
<td title="<?php echo zget($users, $case->openedBy);?>"><?php echo zget($users, $case->openedBy);?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td>" . $this->loadModel('flow')->getFieldValue($extendField, $case) . "</td>";?>
|
||||
<td class='c-actions'>
|
||||
<?php echo $this->caselib->buildOperateMenu($case, 'browse');?>
|
||||
|
||||
@@ -146,7 +146,7 @@ $lang->workingHour = '工时';
|
||||
$lang->idAB = 'ID';
|
||||
$lang->priAB = 'P';
|
||||
$lang->statusAB = '状态';
|
||||
$lang->openedByAB = '创建';
|
||||
$lang->openedByAB = '创建者';
|
||||
$lang->assignedToAB = '指派';
|
||||
$lang->typeAB = '类型';
|
||||
$lang->nameAB = '名称';
|
||||
|
||||
@@ -136,7 +136,7 @@ $lang->workingHour = '工時';
|
||||
$lang->idAB = 'ID';
|
||||
$lang->priAB = 'P';
|
||||
$lang->statusAB = '狀態';
|
||||
$lang->openedByAB = '創建';
|
||||
$lang->openedByAB = '創建者';
|
||||
$lang->assignedToAB = '指派';
|
||||
$lang->typeAB = '類型';
|
||||
$lang->nameAB = '名稱';
|
||||
|
||||
@@ -261,7 +261,7 @@ class custom extends control
|
||||
}
|
||||
}
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('custom', 'set', "module=$module&field=$field&lang=" . str_replace('-', '_', isset($this->config->langs[$lang]) ? $lang : 'all'))));
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('custom', 'set', "module=$module&field=$field&lang=" . ($lang == 'all' ? $lang : ''))));
|
||||
}
|
||||
|
||||
/* Check whether the current language has been customized. */
|
||||
|
||||
@@ -33,6 +33,7 @@ $lang->design->affectedStory = "{$lang->SRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
$lang->design->createdByAB = 'CreatedBy';
|
||||
$lang->design->createdDate = 'CreatedDate';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->noAssigned = 'Unassigned';
|
||||
|
||||
@@ -33,6 +33,7 @@ $lang->design->affectedStory = "{$lang->SRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
$lang->design->createdByAB = 'CreatedBy';
|
||||
$lang->design->createdDate = 'CreatedDate';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->noAssigned = 'Unassigned';
|
||||
|
||||
@@ -33,6 +33,7 @@ $lang->design->affectedStory = "{$lang->SRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
$lang->design->createdByAB = 'CreatedBy';
|
||||
$lang->design->createdDate = 'CreatedDate';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->noAssigned = 'Unassigned';
|
||||
|
||||
@@ -33,6 +33,7 @@ $lang->design->affectedStory = "影响{$lang->SRCommon}";
|
||||
$lang->design->affectedTasks = '影响任务';
|
||||
$lang->design->reviewObject = '评审对象';
|
||||
$lang->design->createdBy = '由谁创建';
|
||||
$lang->design->createdByAB = '创建者';
|
||||
$lang->design->createdDate = '创建时间';
|
||||
$lang->design->basicInfo = '基本信息';
|
||||
$lang->design->noAssigned = '未指派';
|
||||
|
||||
@@ -32,12 +32,12 @@
|
||||
<?php $vars = "projectID=$projectID&productID=$productID&type=$type¶m=$param&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}";?>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-left w-60px"> <?php common::printOrderLink('id', $orderBy, $vars, $lang->design->id);?></th>
|
||||
<th class="text-left w-100px"> <?php common::printOrderLink('type', $orderBy, $vars, $lang->design->type);?></th>
|
||||
<th class="text-left w-60px"> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
|
||||
<th class="text-left"> <?php common::printOrderLink('name', $orderBy, $vars, $lang->design->name);?></th>
|
||||
<th class="text-left w-120px"> <?php common::printOrderLink('createdBy', $orderBy, $vars, $lang->design->createdBy);?></th>
|
||||
<th class="text-left w-150px"> <?php common::printOrderLink('createdDate', $orderBy, $vars, $lang->design->createdDate);?></th>
|
||||
<th class="text-left w-100px"> <?php common::printOrderLink('type', $orderBy, $vars, $lang->design->type);?></th>
|
||||
<th class="c-assignedTo w-120px"><?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->design->assignedTo);?></th>
|
||||
<th class="text-left w-120px"> <?php common::printOrderLink('createdBy', $orderBy, $vars, $lang->design->createdByAB);?></th>
|
||||
<th class="text-left w-150px"> <?php common::printOrderLink('createdDate', $orderBy, $vars, $lang->design->createdDate);?></th>
|
||||
<th class="text-center w-100px"> <?php echo $lang->design->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -45,11 +45,11 @@
|
||||
<?php foreach($designs as $design):?>
|
||||
<tr>
|
||||
<td calss="c-id"> <?php printf('%03d', $design->id);?></td>
|
||||
<td class="c-type"> <?php echo zget($lang->design->typeList, $design->type);?></td>
|
||||
<td class="c-name" title="<?php echo $design->name;?>"><?php echo common::hasPriv('design', 'view') ? html::a($this->createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?></td>
|
||||
<td class="c-type"> <?php echo zget($lang->design->typeList, $design->type);?></td>
|
||||
<td class="c-assignedTo"> <?php echo $this->design->printAssignedHtml($design, $users);?></td>
|
||||
<td class="c-createdBy"> <?php echo zget($users, $design->createdBy);?></td>
|
||||
<td class="c-createdDate"><?php echo substr($design->createdDate, 0, 11);?></td>
|
||||
<td class="c-assignedTo"> <?php echo $this->design->printAssignedHtml($design, $users);?></td>
|
||||
<td class='c-actions text-center'>
|
||||
<?php
|
||||
$vars = "design={$design->id}";
|
||||
|
||||
@@ -69,7 +69,7 @@ class devModel extends model
|
||||
$type = substr($rawField->type, 0, $firstPOS > 0 ? $firstPOS : strlen($rawField->type));
|
||||
$type = str_replace(array('big', 'small', 'medium', 'tiny'), '', $type);
|
||||
$field = array();
|
||||
$field['name'] = isset($this->lang->$module->{$rawField->field}) ? sprintf($this->lang->$module->{$rawField->field}, $this->lang->dev->tableList[$module]) : '';
|
||||
$field['name'] = (isset($this->lang->$module->{$rawField->field}) and is_string($this->lang->$module->{$rawField->field})) ? sprintf($this->lang->$module->{$rawField->field}, $this->lang->dev->tableList[$module]) : '';
|
||||
if((empty($field['name']) or !is_string($field['name'])) and $aliasModule) $field['name'] = isset($this->lang->$aliasModule->{$rawField->field}) ? $this->lang->$aliasModule->{$rawField->field} : '';
|
||||
if($subLang) $field['name'] = isset($this->lang->$aliasModule->$subLang->{$rawField->field}) ? $this->lang->$aliasModule->$subLang->{$rawField->field} : $field['name'];
|
||||
if(!is_string($field['name'])) $field['name'] = '';
|
||||
|
||||
@@ -61,9 +61,11 @@ $lang->doc->keywords = 'Tags';
|
||||
$lang->doc->url = 'URL';
|
||||
$lang->doc->files = 'Datei';
|
||||
$lang->doc->addedBy = 'Angelegt von';
|
||||
$lang->doc->addedByAB = 'Added';
|
||||
$lang->doc->addedDate = 'Angelegt am';
|
||||
$lang->doc->editedBy = 'Bearbeitet von';
|
||||
$lang->doc->editedDate = 'Bearbeitet am';
|
||||
$lang->doc->lastEditedBy = 'Last Editor';
|
||||
$lang->doc->version = 'Version';
|
||||
$lang->doc->basicInfo = 'Basis Info';
|
||||
$lang->doc->deleted = 'Gelöscht';
|
||||
|
||||
@@ -61,9 +61,11 @@ $lang->doc->keywords = 'Tags';
|
||||
$lang->doc->url = 'URL';
|
||||
$lang->doc->files = 'Files';
|
||||
$lang->doc->addedBy = 'Author';
|
||||
$lang->doc->addedByAB = 'Added';
|
||||
$lang->doc->addedDate = 'Added';
|
||||
$lang->doc->editedBy = 'UpdatedBy';
|
||||
$lang->doc->editedDate = 'Updated';
|
||||
$lang->doc->lastEditedBy = 'Last Editor';
|
||||
$lang->doc->version = 'Version';
|
||||
$lang->doc->basicInfo = 'Basic Information';
|
||||
$lang->doc->deleted = 'Deleted';
|
||||
|
||||
@@ -61,9 +61,11 @@ $lang->doc->keywords = 'Tags';
|
||||
$lang->doc->url = 'URL';
|
||||
$lang->doc->files = 'Fichiers';
|
||||
$lang->doc->addedBy = 'Auteur';
|
||||
$lang->doc->addedByAB = 'Added';
|
||||
$lang->doc->addedDate = 'Ajouté le';
|
||||
$lang->doc->editedBy = 'Màj par';
|
||||
$lang->doc->editedDate = 'Màj le';
|
||||
$lang->doc->lastEditedBy = 'Last Editor';
|
||||
$lang->doc->version = 'Version';
|
||||
$lang->doc->basicInfo = 'Infos de Base';
|
||||
$lang->doc->deleted = 'Supprimé';
|
||||
|
||||
@@ -61,9 +61,11 @@ $lang->doc->keywords = '关键字';
|
||||
$lang->doc->url = '文档URL';
|
||||
$lang->doc->files = '附件';
|
||||
$lang->doc->addedBy = '由谁添加';
|
||||
$lang->doc->addedByAB = '创建者';
|
||||
$lang->doc->addedDate = '添加时间';
|
||||
$lang->doc->editedBy = '由谁更新';
|
||||
$lang->doc->editedDate = '更新时间';
|
||||
$lang->doc->lastEditedBy = '最后更新者';
|
||||
$lang->doc->version = '版本号';
|
||||
$lang->doc->basicInfo = '基本信息';
|
||||
$lang->doc->deleted = '已删除';
|
||||
|
||||
+25
-26
@@ -8,7 +8,7 @@ $config->execution->ownerFields = array('PO', 'PM', 'QD', 'RD');
|
||||
$config->execution->defaultBurnPeriod = 30;
|
||||
|
||||
$config->execution->list = new stdclass();
|
||||
$config->execution->list->exportFields = 'id,name,projectName,code,PM,begin,end,status,totalEstimate,totalConsumed,totalLeft,progress';
|
||||
$config->execution->list->exportFields = 'id,name,projectName,PM,begin,end,status,totalEstimate,totalConsumed,totalLeft,progress';
|
||||
|
||||
$config->execution->modelList['scrum'] = 'sprint';
|
||||
$config->execution->modelList['waterfall'] = 'stage';
|
||||
@@ -135,6 +135,7 @@ $config->execution->all->search['fields']['realEnd'] = $lang->execution->
|
||||
$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['fields']['teamCount'] = $lang->execution->teamCount;
|
||||
|
||||
$config->execution->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->execution->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
@@ -150,6 +151,7 @@ $config->execution->all->search['params']['realEnd'] = array('operator' =
|
||||
$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->execution->all->search['params']['teamCount'] = array('operator' => '=', 'control' => 'input', 'values' => '');
|
||||
|
||||
$config->printKanban = new stdClass();
|
||||
$config->printKanban->col['story'] = 1;
|
||||
@@ -173,17 +175,13 @@ $config->execution->gantt->linkType['end']['end'] = 2;
|
||||
$config->execution->gantt->linkType['begin']['end'] = 3;
|
||||
|
||||
$config->execution->datatable = new stdclass();
|
||||
if((!isset($config->setCode) or $config->setCode == 1) and $config->systemMode == 'new')
|
||||
if($config->systemMode == 'new')
|
||||
{
|
||||
$config->execution->datatable->defaultField = array('id', 'name', 'code', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
|
||||
}
|
||||
elseif($config->systemMode == 'new')
|
||||
{
|
||||
$config->execution->datatable->defaultField = array('id', 'name', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
|
||||
$config->execution->datatable->defaultField = array('id', 'name', 'project', 'status', 'PM', 'begin', 'end', 'estimate', 'consumed', 'left', 'progress', 'burn');
|
||||
}
|
||||
else
|
||||
{
|
||||
$config->execution->datatable->defaultField = array('id', 'name', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
|
||||
$config->execution->datatable->defaultField = array('id', 'name', 'status', 'PM', 'begin', 'end', 'estimate', 'consumed', 'left', 'progress', 'burn');
|
||||
}
|
||||
|
||||
$config->execution->datatable->fieldList['id']['title'] = 'idAB';
|
||||
@@ -196,6 +194,15 @@ $config->execution->datatable->fieldList['name']['fixed'] = 'left';
|
||||
$config->execution->datatable->fieldList['name']['width'] = 'auto';
|
||||
$config->execution->datatable->fieldList['name']['required'] = 'yes';
|
||||
|
||||
|
||||
if($config->systemMode == 'new')
|
||||
{
|
||||
$config->execution->datatable->fieldList['project']['title'] = 'project';
|
||||
$config->execution->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['project']['width'] = '128';
|
||||
$config->execution->datatable->fieldList['project']['required'] = 'no';
|
||||
}
|
||||
|
||||
if(!isset($config->setCode) or $config->setCode == 1)
|
||||
{
|
||||
$config->execution->datatable->fieldList['code']['title'] = 'execCode';
|
||||
@@ -204,29 +211,15 @@ if(!isset($config->setCode) or $config->setCode == 1)
|
||||
$config->execution->datatable->fieldList['code']['required'] = 'no';
|
||||
}
|
||||
|
||||
if($config->systemMode == 'new')
|
||||
{
|
||||
$config->execution->datatable->fieldList['project']['title'] = 'project';
|
||||
$config->execution->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['project']['width'] = '100';
|
||||
$config->execution->datatable->fieldList['project']['required'] = 'no';
|
||||
}
|
||||
|
||||
$config->execution->datatable->fieldList['PM']['title'] = 'owner';
|
||||
$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'] = 'execStatus';
|
||||
$config->execution->datatable->fieldList['status']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['status']['width'] = '100';
|
||||
$config->execution->datatable->fieldList['status']['required'] = 'no';
|
||||
|
||||
$config->execution->datatable->fieldList['progress']['title'] = 'progress';
|
||||
$config->execution->datatable->fieldList['progress']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['progress']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['progress']['required'] = 'no';
|
||||
$config->execution->datatable->fieldList['progress']['sort'] = 'no';
|
||||
$config->execution->datatable->fieldList['PM']['title'] = 'owner';
|
||||
$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['openedDate']['title'] = 'openedDate';
|
||||
$config->execution->datatable->fieldList['openedDate']['fixed'] = 'no';
|
||||
@@ -273,6 +266,12 @@ $config->execution->datatable->fieldList['left']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['left']['required'] = 'no';
|
||||
$config->execution->datatable->fieldList['left']['sort'] = 'no';
|
||||
|
||||
$config->execution->datatable->fieldList['progress']['title'] = 'progress';
|
||||
$config->execution->datatable->fieldList['progress']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['progress']['width'] = '70';
|
||||
$config->execution->datatable->fieldList['progress']['required'] = 'no';
|
||||
$config->execution->datatable->fieldList['progress']['sort'] = 'no';
|
||||
|
||||
$config->execution->datatable->fieldList['burn']['title'] = 'burn';
|
||||
$config->execution->datatable->fieldList['burn']['fixed'] = 'no';
|
||||
$config->execution->datatable->fieldList['burn']['width'] = '80';
|
||||
|
||||
@@ -516,7 +516,10 @@ class execution extends control
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$recTotal = count($tasks2Imported);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$tasks2ImportedList = array_chunk($tasks2Imported, $pager->recPerPage, true);
|
||||
$tasks2ImportedList = empty($tasks2ImportedList) ? $tasks2ImportedList : $tasks2ImportedList[$pageID - 1];
|
||||
$tasks2ImportedList = $this->loadModel('task')->processTasks($tasks2ImportedList);
|
||||
|
||||
/* Save session. */
|
||||
$this->app->session->set('taskList', $this->app->getURI(true), 'execution');
|
||||
@@ -525,7 +528,7 @@ class execution extends control
|
||||
$this->view->pager = $pager;
|
||||
$this->view->position[] = html::a(inlink('browse', "executionID=$toExecution"), $execution->name);
|
||||
$this->view->position[] = $this->lang->execution->importTask;
|
||||
$this->view->tasks2Imported = empty($tasks2ImportedList) ? $tasks2ImportedList : $tasks2ImportedList[$pageID - 1];
|
||||
$this->view->tasks2Imported = $tasks2ImportedList;
|
||||
$this->view->executions = $executions;
|
||||
$this->view->executionID = $execution->id;
|
||||
$this->view->fromExecution = $fromExecution;
|
||||
@@ -3760,6 +3763,7 @@ class execution extends control
|
||||
$this->view->from = $from;
|
||||
$this->view->param = $param;
|
||||
$this->view->isStage = (isset($project->model) and $project->model == 'waterfall') ? true : false;
|
||||
$this->view->showBatchEdit = $this->cookie->showExecutionBatchEdit;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ td.flex span.project-type-label {min-width: 40px;}
|
||||
.c-name > a, .table-children .text-left > a {padding-left: 5px;}
|
||||
.has-child > span {margin-right: 5px;}
|
||||
.c-name > .text-ellipsis {text-overflow: clip;}
|
||||
.c-code, .c-project {overflow: hidden; white-space: nowrap;}
|
||||
.c-code, .c-project {overflow: hidden; white-space: nowrap; padding: 0 8px;}
|
||||
th.c-status, .c-begin, .c-end, .c-realBegan, .c-realEnd {text-align: center;}
|
||||
|
||||
.c-project{text-overflow: unset !important;}
|
||||
@@ -38,3 +38,7 @@ canvas {height: 28px;}
|
||||
#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;}
|
||||
|
||||
.table thead .c-estimate.text-right,
|
||||
.table thead .c-consumed.text-right,
|
||||
.table thead .c-left.text-right {padding-right: 8px;}
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
.dropdown-list > li > a {display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.53846154; color: #141414; white-space: nowrap;}
|
||||
.dropdown-list > li > a:hover,
|
||||
.dropdown-list > li > a:focus {color: #1a4f85; text-decoration: none; background-color: #ddd;}
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
|
||||
.c-severity {width: 80px;}
|
||||
.c-confirmed {overflow: hidden;}
|
||||
.c-deadline {text-align: center;}
|
||||
#main {padding-bottom: 40px;}
|
||||
|
||||
@@ -27,4 +27,3 @@
|
||||
.c-hours {white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: right;}
|
||||
.c-user, .c-type {width: 70px;}
|
||||
.c-progress {width: 60px;}
|
||||
.delayed {background: #e84e0f !important; color: white;}
|
||||
|
||||
@@ -4,6 +4,6 @@
|
||||
#productsBox .product.checked:hover {background: #E5FFE6; border: 1px solid #229F24;}
|
||||
#productsBox .product .checkbox-primary {padding: 9px; cursor: pointer;}
|
||||
#productsBox .product.has-branch {padding-right: 40%;}
|
||||
#productsBox .product.has-branch > .chosen-container {position: absolute; width: 40% !important; right: 3px; top: 3px;}
|
||||
#productsBox .product.has-branch > .chosen-container > .chosen-single {background: rgba(0,0,0,.05);}
|
||||
#productsBox .product.has-branch > .chosen-container > .chosen-single:hover {background: #fff;}
|
||||
#productsBox .product.has-branch > .picker {position: absolute; width: 40% !important; right: 3px; top: 3px; background-color: unset;}
|
||||
#productsBox .product.has-branch > .picker > .picker-selections {background: rgba(0,0,0,.05);}
|
||||
#productsBox .product.has-branch > .picker > .picker-selections:hover {background: #fff;}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
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;}
|
||||
.table td.c-estimate, .table td.c-consumed, .table td.c-left {padding-right: 12px;}
|
||||
@@ -11,4 +10,4 @@ td.delayed {background: #e84e0f !important; color: white;}
|
||||
#taskList .c-progress{padding-right: 8px; text-align: right;}
|
||||
#datatable-taskList .c-progress{padding-right: 8px; text-align: right;}
|
||||
.c-finishedBy, .c-lastEditedBy {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
#executionTaskForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #F4F5F7; margin: 0 4px 0 0;}
|
||||
#executionTaskForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #F4F5F7; margin: 0 4px 0 0;}
|
||||
@@ -1,5 +1,17 @@
|
||||
$(function()
|
||||
{
|
||||
$("#" + status + "Tab").addClass('btn-active-text');
|
||||
$(document).on('click', '.plan-toggle', function(e)
|
||||
{
|
||||
var id = $(this).data('id');
|
||||
var $toggle = $(this);
|
||||
var isCollapsed = $toggle.toggleClass('collapsed').hasClass('collapsed');
|
||||
$toggle.closest('#executionsForm').find('tr.parent-' + id).toggle(!isCollapsed);
|
||||
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$('#executionTableList').on('sort.sortable', function(e, data)
|
||||
{
|
||||
var list = '';
|
||||
@@ -60,6 +72,7 @@ $(function()
|
||||
}
|
||||
});
|
||||
|
||||
/* Update table summary text. */
|
||||
$('#executionsForm').table(
|
||||
{
|
||||
statisticCreator: function(table)
|
||||
@@ -67,21 +80,67 @@ $(function()
|
||||
var $table = table.getTable();
|
||||
var $checkedRows = $table.find(table.isDataTable ? '.datatable-row-left.checked' : 'tbody>tr.checked');
|
||||
var $originTable = table.isDataTable ? table.$.find('.datatable-origin') : null;
|
||||
var $rows = $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
|
||||
var checkedTotal = $checkedRows.length;
|
||||
var $rows = checkedTotal ? $checkedRows : $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
|
||||
|
||||
var taskIdList = [];
|
||||
var checkedWait = 0;
|
||||
var checkedDoing = 0;
|
||||
var executionIDList = [];
|
||||
$rows.each(function()
|
||||
{
|
||||
var $row = $(this);
|
||||
if($originTable) $row = $originTable.find('tbody>tr[data-id="' + $row.data('id') + '"]');
|
||||
|
||||
var data = $row.data();
|
||||
taskIdList.push(data.id);
|
||||
executionIDList.push(data.id);
|
||||
|
||||
if(data.status === 'wait') checkedWait++;
|
||||
if(data.status === 'doing') checkedDoing++;
|
||||
});
|
||||
|
||||
if(status != 'all') return (checkedTotal ? checkedExecutions : executionSummary).replace('%s', $rows.length);
|
||||
return (checkedTotal ? checkedSummary : pageSummary).replace('%total%', $rows.length).replace('%wait%', checkedWait).replace('%doing%', checkedDoing);
|
||||
}
|
||||
})
|
||||
|
||||
$('input[name^="showEdit"]').click(function()
|
||||
{
|
||||
$.cookie('showExecutionBatchEdit', $(this).is(':checked') ? 1 : 0, {expires: config.cookieLife, path: config.webRoot});
|
||||
setCheckbox();
|
||||
});
|
||||
setCheckbox();
|
||||
|
||||
$('#executionTableList tr').on('click', function(e)
|
||||
{
|
||||
if($.cookie('showExecutionBatchEdit') != 1) e.stopPropagation();
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Location to product list.
|
||||
*
|
||||
* @param int productID
|
||||
* @param int projectID
|
||||
* @param string status
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function byProduct(productID, projectID, status)
|
||||
{
|
||||
location.href = createLink('project', 'all', "status=" + status + "&project=" + projectID + "&orderBy=" + orderBy + '&productID=' + productID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set batch edit checkbox.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function setCheckbox()
|
||||
{
|
||||
$('#executionsForm .checkbox-primary').hide();
|
||||
$('.check-all, .sortable tr').removeClass('checked');
|
||||
$(":checkbox[name^='executionIDList']").prop('checked', false);
|
||||
$('#executionsForm').removeClass('has-row-checked');
|
||||
if($.cookie('showExecutionBatchEdit') == 1) $('#executionsForm .checkbox-primary').show();
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ $(function()
|
||||
|
||||
adjustTableFooter();
|
||||
$('body').on('click', '#toggleFold', adjustTableFooter);
|
||||
$('body').on('click', '.icon.icon-angle-double-right', adjustTableFooter);
|
||||
$('body').on('click', '.icon.icon-angle-right', adjustTableFooter);
|
||||
|
||||
/* The display of the adjusting sidebarHeader is synchronized with the sidebar. */
|
||||
$(".sidebar-toggle").click(function()
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
$(function()
|
||||
{
|
||||
$('#testtaskForm').table(
|
||||
{
|
||||
replaceId: 'taskIdList',
|
||||
statisticCreator: function(table)
|
||||
{
|
||||
var $table = table.getTable();
|
||||
var $checkedRows = $table.find('tbody>tr.checked');
|
||||
var checkedTotal = $checkedRows.length;
|
||||
var checkedWait = $checkedRows.filter("[data-status=wait]").length;
|
||||
var checkedTesting = $checkedRows.filter("[data-status=doing]").length;
|
||||
var checkedBlocked = $checkedRows.filter("[data-status=blocked]").length;
|
||||
var checkedDone = $checkedRows.filter("[data-status=done]").length;
|
||||
var checkedStatistics = checkedAllSummary.replace('%total%', checkedTotal)
|
||||
.replace('%wait%', checkedWait)
|
||||
.replace('%testing%', checkedTesting)
|
||||
.replace('%blocked%', checkedBlocked)
|
||||
.replace('%done%', checkedDone);
|
||||
|
||||
return checkedTotal ? checkedStatistics : pageSummary;
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -54,6 +54,7 @@ $lang->execution->end = 'Ende';
|
||||
$lang->execution->dateRange = 'Dauer';
|
||||
$lang->execution->realBeganAB = 'Actual Begin';
|
||||
$lang->execution->realEndAB = 'Actual End';
|
||||
$lang->execution->teamCount = 'Anzahl der Personen';
|
||||
$lang->execution->realBegan = 'Tatsächlicher Start';
|
||||
$lang->execution->realEnd = 'Tatsächliches Ende';
|
||||
$lang->execution->to = 'An';
|
||||
@@ -341,6 +342,9 @@ $lang->execution->stats = '<strong>%s</strong> Verfügbar, <stron
|
||||
$lang->execution->taskSummary = "Aufgaben auf dieser Seite: <strong>%s</strong> Total, <strong>%s</strong> Wartend, <strong>%s</strong> In Arbeit; Stunden : <strong>%s</strong> geplant., <strong>%s</strong> genutzt, <strong>%s</strong> Rest.";
|
||||
$lang->execution->pageSummary = "Aufgaben auf dieser Seite: <strong>%total%</strong>, <strong>%wait%</strong> Wartend, <strong>%doing%</strong> In Arbeit; Stunden: <strong>%estimate%</strong> geplant, <strong>%consumed%</strong> genutzt, <strong>%left%</strong> Rest.";
|
||||
$lang->execution->checkedSummary = " <strong>%total%</strong> Geprüft, <strong>%wait%</strong> Wartend, <strong>%doing%</strong> In Arbeit; Stunden: <strong>%estimate%</strong> geplant, <strong>%consumed%</strong> genutzt, <strong>%left%</strong> Rest.";
|
||||
$lang->execution->executionSummary = "Total executions: <strong>%s</strong>.";
|
||||
$lang->execution->pageExecSummary = "Total executions: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
|
||||
$lang->execution->checkedExecSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
|
||||
$lang->execution->memberHoursAB = "%s hat <strong>%s</strong> Stunden";
|
||||
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Arbeitsstunden</div><div class="segment-value">%s</div></div></div></div>';
|
||||
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Aufgaben</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">In Arbeit</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">Wait</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
|
||||
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
$lang->execution->checkedExecutions = 'Seleted %s items';
|
||||
$lang->execution->checkedExecutions = "Seleted %s {$lang->executionCommon}.";
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
|
||||
@@ -54,6 +54,7 @@ $lang->execution->end = 'Planned End';
|
||||
$lang->execution->dateRange = 'Plan Duration';
|
||||
$lang->execution->realBeganAB = 'Actual Begin';
|
||||
$lang->execution->realEndAB = 'Actual End';
|
||||
$lang->execution->teamCount = 'number of people';
|
||||
$lang->execution->realBegan = 'Actual Begin';
|
||||
$lang->execution->realEnd = 'Actual End';
|
||||
$lang->execution->to = 'To';
|
||||
@@ -341,6 +342,9 @@ $lang->execution->stats = 'Available: <strong>%s</strong>(h). Est
|
||||
$lang->execution->taskSummary = "Total tasks on this page:<strong>%s</strong>. Waiting: <strong>%s</strong>. Doing: <strong>%s</strong>. Estimates: <strong>%s</strong>(h). Cost: <strong>%s</strong>(h). Left: <strong>%s</strong>(h).";
|
||||
$lang->execution->pageSummary = "Total tasks: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>. Estimates: <strong>%estimate%</strong>(h). Cost: <strong>%consumed%</strong>(h). Left: <strong>%left%</strong>(h).";
|
||||
$lang->execution->checkedSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>. Estimates: <strong>%estimate%</strong>(h). Cost: <strong>%consumed%</strong>(h). Left: <strong>%left%</strong>(h).";
|
||||
$lang->execution->executionSummary = "Total {$lang->executionCommon}: <strong>%s</strong>.";
|
||||
$lang->execution->pageExecSummary = "Total {$lang->executionCommon}: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
|
||||
$lang->execution->checkedExecSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
|
||||
$lang->execution->memberHoursAB = "%s has <strong>%s</ strong> hours.";
|
||||
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Available Hours</div><div class="segment-value">%s</div></div></div></div>';
|
||||
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Tasks</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">Doing</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">Waiting</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
|
||||
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
$lang->execution->checkedExecutions = 'Seleted %s items';
|
||||
$lang->execution->checkedExecutions = "Seleted %s {$lang->executionCommon}.";
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
|
||||
@@ -54,6 +54,7 @@ $lang->execution->end = 'Fin';
|
||||
$lang->execution->dateRange = 'Durée';
|
||||
$lang->execution->realBeganAB = 'Actual Begin';
|
||||
$lang->execution->realEndAB = 'Actual End';
|
||||
$lang->execution->teamCount = 'nombre de personnes';
|
||||
$lang->execution->realBegan = 'Début effectif';
|
||||
$lang->execution->realEnd = 'Clôture effective';
|
||||
$lang->execution->to = 'à';
|
||||
@@ -341,6 +342,9 @@ $lang->execution->stats = 'Disponible: <strong>%s</strong>(h). Es
|
||||
$lang->execution->taskSummary = "Total des tâches de cette page :<strong>%s</strong>. A Faire: <strong>%s</strong>. En cours: <strong>%s</strong>. Estimé: <strong>%s</strong>(h). Coût: <strong>%s</strong>(h). Reste: <strong>%s</strong>(h).";
|
||||
$lang->execution->pageSummary = "Total des tâches de cette page: <strong>%total%</strong>. A Faire: <strong>%wait%</strong>. En cours: <strong>%doing%</strong>. Estimé: <strong>%estimate%</strong>(h). Coût: <strong>%consumed%</strong>(h). Reste: <strong>%left%</strong>(h).";
|
||||
$lang->execution->checkedSummary = "Sélectionné: <strong>%total%</strong>. A Faire: <strong>%wait%</strong>. En cours: <strong>%doing%</strong>. Estimé: <strong>%estimate%</strong>(h). Coût: <strong>%consumed%</strong>(h). Reste: <strong>%left%</strong>(h).";
|
||||
$lang->execution->executionSummary = "Total executions: <strong>%s</strong>.";
|
||||
$lang->execution->pageExecSummary = "Total executions: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
|
||||
$lang->execution->checkedExecSummary = "Selected: <strong>%total%</strong>. Waiting: <strong>%wait%</strong>. Doing: <strong>%doing%</strong>.";
|
||||
$lang->execution->memberHoursAB = "%s a <strong>%s</ strong> heures.";
|
||||
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Heures Disponibles</div><div class="segment-value">%s</div></div></div></div>';
|
||||
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Tâches</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">En Cours</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">A Faire</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
|
||||
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
|
||||
$lang->execution->countTip = ' (%s member)';
|
||||
$lang->execution->pleaseInput = "Enter";
|
||||
$lang->execution->week = 'week';
|
||||
$lang->execution->checkedExecutions = "Pour s électionner l'élément%s";
|
||||
$lang->execution->checkedExecutions = "Pour s électionner l'élément%s.";
|
||||
|
||||
/* Statistics. */
|
||||
$lang->execution->charts = new stdclass();
|
||||
|
||||
@@ -54,6 +54,7 @@ $lang->execution->RD = 'Quản lý phát hành';
|
||||
$lang->execution->release = 'Phát hành';
|
||||
$lang->execution->acl = 'Quyền truy cập';
|
||||
$lang->execution->teamname = 'Tên đội nhóm';
|
||||
$lang->execution->teamCount = 'số người';
|
||||
$lang->execution->order = "Đánh giá {$lang->executionCommon}";
|
||||
$lang->execution->orderAB = "Đánh giá";
|
||||
$lang->execution->products = "Liên kết {$lang->productCommon}";
|
||||
|
||||
@@ -54,6 +54,7 @@ $lang->execution->end = '计划完成';
|
||||
$lang->execution->dateRange = '计划起止日期';
|
||||
$lang->execution->realBeganAB = '实际开始';
|
||||
$lang->execution->realEndAB = '实际完成';
|
||||
$lang->execution->teamCount = '人数';
|
||||
$lang->execution->realBegan = '实际开始日期';
|
||||
$lang->execution->realEnd = '实际完成日期';
|
||||
$lang->execution->to = '至';
|
||||
@@ -341,6 +342,9 @@ $lang->execution->stats = '可用工时 <strong>%s</strong> 工
|
||||
$lang->execution->taskSummary = "本页共 <strong>%s</strong> 个任务,未开始 <strong>%s</strong>,进行中 <strong>%s</strong>,总预计 <strong>%s</strong> 工时,已消耗 <strong>%s</strong> 工时,剩余 <strong>%s</strong> 工时。";
|
||||
$lang->execution->pageSummary = "本页共 <strong>%total%</strong> 个任务,未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>,总预计 <strong>%estimate%</strong> 工时,已消耗 <strong>%consumed%</strong> 工时,剩余 <strong>%left%</strong> 工时。";
|
||||
$lang->execution->checkedSummary = "选中 <strong>%total%</strong> 个任务,未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>,总预计 <strong>%estimate%</strong> 工时,已消耗 <strong>%consumed%</strong> 工时,剩余 <strong>%left%</strong> 工时。";
|
||||
$lang->execution->executionSummary = "本页共 <strong>%s</strong> 个{$lang->executionCommon}。";
|
||||
$lang->execution->pageExecSummary = "本页共 <strong>%total%</strong> 个{$lang->executionCommon},未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>。";
|
||||
$lang->execution->checkedExecSummary = "选中 <strong>%total%</strong> 个{$lang->executionCommon},未开始 <strong>%wait%</strong>,进行中 <strong>%doing%</strong>。";
|
||||
$lang->execution->memberHoursAB = "<div>%s有 <strong>%s</strong> 工时</div>";
|
||||
$lang->execution->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s可用工时</div><div class="segment-value">%s</div></div></div></div>';
|
||||
$lang->execution->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">总任务</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">进行中</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">未开始</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
|
||||
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "该{$lang->SRCommon}不是激
|
||||
$lang->execution->countTip = '(%s人)';
|
||||
$lang->execution->pleaseInput = "请输入";
|
||||
$lang->execution->week = '周';
|
||||
$lang->execution->checkedExecutions = '已选择%s项';
|
||||
$lang->execution->checkedExecutions = "共选中%s个{$lang->executionCommon}。";
|
||||
|
||||
/* 统计。*/
|
||||
$lang->execution->charts = new stdclass();
|
||||
|
||||
@@ -54,6 +54,7 @@ $lang->execution->execPM = "{$lang->execution->common}負責人";
|
||||
$lang->execution->QD = '測試負責人';
|
||||
$lang->execution->RD = '發佈負責人';
|
||||
$lang->execution->release = '發佈';
|
||||
$lang->execution->teamCount = '人數';
|
||||
$lang->execution->acl = '訪問控制';
|
||||
$lang->execution->teamname = '團隊名稱';
|
||||
$lang->execution->updateOrder = '排序';
|
||||
|
||||
+43
-16
@@ -109,6 +109,13 @@ class executionModel extends model
|
||||
unset($this->lang->execution->menu->build);
|
||||
}
|
||||
|
||||
$stageFilter = array('request', 'design', 'review');
|
||||
if($this->config->edition == 'open' and in_array($execution->attribute, $stageFilter))
|
||||
{
|
||||
unset($this->lang->execution->menu->qa);
|
||||
unset($this->lang->execution->menu->build);
|
||||
}
|
||||
|
||||
if($executions and (!isset($executions[$executionID]) or !$this->checkPriv($executionID))) $this->accessDenied();
|
||||
|
||||
$moduleName = $this->app->getModuleName();
|
||||
@@ -362,7 +369,7 @@ class executionModel extends model
|
||||
}
|
||||
|
||||
/* Check the workload format and total. */
|
||||
if(!empty($sprint->percent)) $this->checkWorkload('create', $sprint->percent);
|
||||
if(!empty($sprint->percent)) $this->checkWorkload('create', $sprint->percent, $sprint->project);
|
||||
|
||||
/* Set planDuration and realDuration. */
|
||||
if($this->config->edition == 'max')
|
||||
@@ -1147,9 +1154,9 @@ class executionModel extends model
|
||||
/**
|
||||
* Check the workload format and total.
|
||||
*
|
||||
* @param string $type create|update
|
||||
* @param int $percent
|
||||
* @param object $oldExecution
|
||||
* @param string $type create|update
|
||||
* @param int $percent
|
||||
* @param object|int $oldExecution
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
@@ -1170,7 +1177,7 @@ class executionModel extends model
|
||||
->andWhere('t2.type')->eq('stage')
|
||||
->andWhere('t2.grade')->eq(1)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->andWhere('t2.parent')->eq($oldExecution->parent)
|
||||
->andWhere('t2.parent')->eq($oldExecution)
|
||||
->fetch('total');
|
||||
|
||||
if($type == 'create') $percentTotal = $percent + $oldPercentTotal;
|
||||
@@ -1531,6 +1538,15 @@ class executionModel extends model
|
||||
$hours = $this->loadModel('project')->computerProgress($executions);
|
||||
$burns = $this->getBurnData($executions);
|
||||
|
||||
/* Get the number of execution teams. */
|
||||
$teams = $this->dao->select('t1.root,count(t1.id) as teams')->from(TABLE_TEAM)->alias('t1')
|
||||
->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account')
|
||||
->where('t1.root')->in(array_keys($executions))
|
||||
->andWhere('t1.type')->ne('project')
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->groupBy('t1.root')
|
||||
->fetchAll('root');
|
||||
|
||||
if($withTasks) $executionTasks = $this->getTaskGroupByExecution(array_keys($executions));
|
||||
|
||||
/* Process executions. */
|
||||
@@ -1557,6 +1573,7 @@ class executionModel extends model
|
||||
|
||||
/* Process the hours. */
|
||||
$execution->hours = isset($hours[$execution->id]) ? $hours[$execution->id] : (object)$emptyHour;
|
||||
$execution->teamCount = isset($teams[$execution->id]) ? $teams[$execution->id]->teams : 0;
|
||||
|
||||
if(isset($executionTasks) and isset($executionTasks[$execution->id]))
|
||||
{
|
||||
@@ -4582,18 +4599,19 @@ class executionModel extends model
|
||||
if(!$isChild)
|
||||
{
|
||||
$trClass = 'is-top-level table-nest-child-hide';
|
||||
$trAttrs = "data-id='$execution->id' data-order='$execution->order' data-nested='true'";
|
||||
$trAttrs = "data-id='$execution->id' data-order='$execution->order' data-nested='true' data-status={$execution->status}";
|
||||
}
|
||||
else
|
||||
{
|
||||
$trClass = 'table-nest-hide';
|
||||
$trAttrs = "data-id={$execution->id} data-parent={$execution->parent}";
|
||||
$trAttrs = "data-id={$execution->id} data-parent={$execution->parent} data-status={$execution->status}";
|
||||
$trAttrs .= " data-nest-parent='$execution->parent' data-order='$execution->order' data-nest-path=',$execution->parent,$execution->id,'";
|
||||
}
|
||||
|
||||
$burns = join(',', $execution->burns);
|
||||
echo "<tr $trAttrs class='$trClass'>";
|
||||
echo "<td><span id=$execution->id class='table-nest-icon icon table-nest-toggle'></span>";
|
||||
echo "<td class='c-name text-left flex sort-handler'>";
|
||||
if(common::hasPriv('execution', 'batchEdit')) echo "<span id=$execution->id class='table-nest-icon icon table-nest-toggle'></span>";
|
||||
if($this->config->systemMode == 'new')
|
||||
{
|
||||
$spanClass = $execution->type == 'stage' ? 'label-warning' : 'label-info';
|
||||
@@ -4601,7 +4619,7 @@ class executionModel extends model
|
||||
}
|
||||
if(empty($execution->children))
|
||||
{
|
||||
echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name);
|
||||
echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name, '', 'class="text-ellipsis"');
|
||||
if(!helper::isZeroDate($execution->end))
|
||||
{
|
||||
if($execution->status != 'closed')
|
||||
@@ -4612,7 +4630,7 @@ class executionModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $execution->name;
|
||||
echo "<span class='text-ellipsis'>" . $execution->name . '</span>';
|
||||
if(!helper::isZeroDate($execution->end))
|
||||
{
|
||||
if($execution->status != 'closed')
|
||||
@@ -4621,14 +4639,14 @@ class executionModel extends model
|
||||
}
|
||||
}
|
||||
}
|
||||
echo '<td>' . zget($users, $execution->PM) . '</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>' . zget($users, $execution->PM) . '</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>';
|
||||
echo "<td class='hours text-right' title='{$execution->hours->totalEstimate}{$this->lang->execution->workHour}'>" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo "<td class='hours text-right' title='{$execution->hours->totalConsumed}{$this->lang->execution->workHour}'>" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo "<td class='hours text-right' title='{$execution->hours->totalLeft}{$this->lang->execution->workHour}'>" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . '</td>';
|
||||
echo '<td>' . html::ring($execution->hours->progress) . '</td>';
|
||||
echo "<td id='spark-{$execution->id}' class='sparkline text-left no-padding' values='$burns'></td>";
|
||||
echo '<td class="c-actions">';
|
||||
common::printIcon('execution', 'start', "executionID={$execution->id}", $execution, 'list', '', '', 'iframe', true);
|
||||
@@ -4841,6 +4859,12 @@ class executionModel extends model
|
||||
if(!empty($execution->children)) $class .= ' has-child';
|
||||
}
|
||||
|
||||
if($id == 'teamCount')
|
||||
{
|
||||
$title = " title='{$execution->teamCount}'";
|
||||
$class .= ' text-right';
|
||||
}
|
||||
|
||||
if($id == 'project') $title = " title='{$execution->projectName}'";
|
||||
if($id == 'code') $title = " title='{$execution->code}'";
|
||||
|
||||
@@ -4882,7 +4906,7 @@ class executionModel extends model
|
||||
if(isset($execution->delay)) echo "<span class='label label-danger label-badge'>{$this->lang->execution->delayed}</span> ";
|
||||
if(!empty($execution->children))
|
||||
{
|
||||
echo "<a class='plan-toggle' data-id='$execution->id'><i class='icon icon-angle-double-right'></i></a>";
|
||||
echo "<a class='plan-toggle' data-id='$execution->id'><i class='icon icon-angle-right'></i></a>";
|
||||
}
|
||||
break;
|
||||
case 'code':
|
||||
@@ -4909,6 +4933,9 @@ class executionModel extends model
|
||||
case 'begin':
|
||||
echo helper::isZeroDate($execution->begin) ? '' : $execution->begin;
|
||||
break;
|
||||
case 'teamCount':
|
||||
echo $execution->teamCount;
|
||||
break;
|
||||
case 'end':
|
||||
echo helper::isZeroDate($execution->end) ? '' : $execution->end;
|
||||
break;
|
||||
|
||||
@@ -16,17 +16,26 @@
|
||||
$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('unfoldExecutions', array());
|
||||
js::set('useDatatable', $useDatatable);
|
||||
js::set('from', $from);
|
||||
|
||||
/* Replace Iteration to Execution. */
|
||||
js::set('checkedSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->checkedExecSummary));
|
||||
js::set('pageSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->pageExecSummary));
|
||||
js::set('executionSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->executionSummary));
|
||||
js::set('checkedExecutions', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->checkedExecutions));
|
||||
?>
|
||||
<?php
|
||||
/* Set unfold parent executionID. */
|
||||
js::set('unfoldAll', $lang->execution->treeLevel['all']);
|
||||
js::set('foldAll', $lang->execution->treeLevel['root']);
|
||||
js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
?>
|
||||
<?php $canBatchEdit = common::hasPriv('execution', 'batchEdit');?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<div class='btn-toolBar pull-left'>
|
||||
<?php if($from == 'project'):?>
|
||||
<div class='btn-group'>
|
||||
<?php $viewName = $productID != 0 ? zget($productList,$productID) : $lang->product->allProduct;?>
|
||||
@@ -51,6 +60,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<?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&orderBy=$orderBy&productID=$productID"), $label, '', "class='btn btn-link' id='{$key}Tab' data-app='$from'");?>
|
||||
<?php endforeach;?>
|
||||
<?php if($canBatchEdit) echo html::checkbox('showEdit', array('1' => $lang->execution->editAction), $showBatchEdit);?>
|
||||
<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'>
|
||||
@@ -72,8 +82,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
</p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<?php $canBatchEdit = common::hasPriv('execution', 'batchEdit'); ?>
|
||||
<form class='main-table' id='executionsForm' method='post' action='<?php echo inLink('batchEdit');?>' <?php if(!$useDatatable) echo "data-ride='table'";?>>
|
||||
<form class='main-table' id='executionsForm' method='post' action='<?php echo inLink('batchEdit');?>'>
|
||||
<div class="table-header fixed-right">
|
||||
<nav class="btn-toolbar pull-right setting"></nav>
|
||||
</div>
|
||||
@@ -106,7 +115,7 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
</thead>
|
||||
<tbody class='sortable' id='executionTableList'>
|
||||
<?php foreach($executionStats as $execution):?>
|
||||
<tr data-id='<?php echo $execution->id ?>' data-order='<?php echo $execution->order ?>'>
|
||||
<tr data-id='<?php echo $execution->id ?>' data-order='<?php echo $execution->order ?>' data-status='<?php echo $execution->status?>'>
|
||||
<?php foreach($setting as $key => $value) $this->execution->printCell($value, $execution, $users, $useDatatable ? 'datatable' : 'table', $isStage, $productID);?>
|
||||
</tr>
|
||||
<?php if(!empty($execution->children)):?>
|
||||
@@ -130,28 +139,15 @@ js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
<div class="table-actions btn-toolbar">
|
||||
<?php echo html::submitButton($lang->execution->batchEdit, '', 'btn');?>
|
||||
<div class="table-statistic"></div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="table-statistic"></div>
|
||||
<?php $pager->show('right', 'pagerjs');?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</form>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<script>
|
||||
$("#<?php echo $status;?>Tab").addClass('btn-active-text');
|
||||
$(document).on('click', '.plan-toggle', function(e)
|
||||
{
|
||||
var $toggle = $(this);
|
||||
var id = $(this).data('id');
|
||||
var isCollapsed = $toggle.toggleClass('collapsed').hasClass('collapsed');
|
||||
$toggle.closest('[data-ride="table"]').find('tr.parent-' + id).toggle(!isCollapsed);
|
||||
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
});
|
||||
</script>
|
||||
<?php js::set('orderBy', $orderBy)?>
|
||||
<?php js::set('status', $status)?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -49,8 +49,8 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="c-id-sm"><?php echo $lang->build->id;?></th>
|
||||
<th class="c-name w-200px text-left"><?php echo $lang->build->product;?></th>
|
||||
<th class="c-name text-left"><?php echo $lang->build->name;?></th>
|
||||
<th class="c-name w-200px text-left"><?php echo $lang->build->product;?></th>
|
||||
<th class="c-url"><?php echo $lang->build->scmPath;?></th>
|
||||
<th class="c-url"><?php echo $lang->build->filePath;?></th>
|
||||
<th class="c-date"><?php echo $lang->build->date;?></th>
|
||||
@@ -63,11 +63,11 @@
|
||||
<?php foreach($builds as $index => $build):?>
|
||||
<tr data-id="<?php echo $productID;?>">
|
||||
<td class="c-id-sm text-muted"><?php echo html::a(helper::createLink('build', 'view', "buildID=$build->id"), sprintf('%03d', $build->id));?></td>
|
||||
<td class="c-name text-left" title='<?php echo $build->productName;?>'><?php echo $build->productName;?></td>
|
||||
<td class="c-name">
|
||||
<?php if($build->branchName) echo "<span class='label label-outline label-badge'>{$build->branchName}</span>"?>
|
||||
<?php echo html::a($this->createLink('build', 'view', "build=$build->id"), $build->name);?>
|
||||
</td>
|
||||
<td class="c-name text-left" title='<?php echo $build->productName;?>'><?php echo $build->productName;?></td>
|
||||
<td class="c-url" title="<?php echo $build->scmPath?>"><?php echo strpos($build->scmPath, 'http') === 0 ? html::a($build->scmPath) : $build->scmPath;?></td>
|
||||
<td class="c-url" title="<?php echo $build->filePath?>"><?php echo strpos($build->filePath, 'http') === 0 ? html::a($build->filePath) : $build->filePath;?></td>
|
||||
<td class="c-date"><?php echo $build->date?></td>
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
<th class="c-hours"><?php echo $lang->task->leftAB;?></th>
|
||||
<th class="c-progress" title='<?php echo $lang->task->progress;?>'><?php echo $lang->task->progressAB;?></th>
|
||||
<th class="c-type"><?php echo $lang->typeAB;?></th>
|
||||
<th class="c-date"><?php echo $lang->task->deadlineAB;?></th>
|
||||
<th class="c-date text-center"><?php echo $lang->task->deadlineAB;?></th>
|
||||
<th class="c-actions-3"><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -207,7 +207,7 @@
|
||||
<td class="c-hours em" title="<?php echo $task->left . ' ' . $lang->execution->workHour;?>"><?php echo $task->left . $lang->execution->workHourUnit;?></td>
|
||||
<td class="c-num em"><?php echo $task->progress . '%';?></td>
|
||||
<td class="c-type"><?php echo zget($lang->task->typeList, $task->type);?></td>
|
||||
<td class='c-date <?php if(isset($task->delay)) echo 'delayed';?>'><?php if(substr($task->deadline, 0, 4) > 0) echo substr($task->deadline, 5, 6);?></td>
|
||||
<td class='c-date text-center <?php if(isset($task->delay)) echo 'delayed';?>'><?php if(substr($task->deadline, 0, 4) > 0) echo '<span>' . substr($task->deadline, 5, 6) . '</span>';?></td>
|
||||
<td class="c-actions">
|
||||
<?php if(common::canModify('execution', $execution)):?>
|
||||
<?php common::printIcon('task', 'assignTo', "executionID=$task->execution&taskID=$task->id", $task, 'list', '', '', 'iframe', true);?>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<?php endif;?>
|
||||
<th class='c-user'><?php echo $lang->task->assignedTo;?></th>
|
||||
<th class='c-hour'><?php echo $lang->task->leftAB;?></th>
|
||||
<th class='c-date'><?php echo $lang->task->deadlineAB;?></th>
|
||||
<th class='c-date text-center'><?php echo $lang->task->deadlineAB;?></th>
|
||||
<th class='c-status'><?php echo $lang->statusAB;?></th>
|
||||
<th class='c-story'><?php echo $lang->task->story;?></th>
|
||||
</tr>
|
||||
@@ -63,7 +63,7 @@
|
||||
<td class='text-left nobr'><?php if(!common::printLink('task', 'view', "task=$task->id", $task->name, '', "class='preview iframe' data-width='90%'", true, true)) echo $task->name;?></td>
|
||||
<td <?php echo $class;?>><?php echo $task->assignedToRealName;?></td>
|
||||
<td title="<?php echo $task->left . ' ' . $lang->execution->workHour;?>"><?php echo $task->left . ' ' . $lang->execution->workHourUnit;?></td>
|
||||
<td class=<?php if(isset($task->delay)) echo 'delayed';?>><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
|
||||
<td class="text-center <?php if(isset($task->delay)) echo 'delayed';?>"><?php if(substr($task->deadline, 0, 4) > 0) echo '<span>' . $task->deadline . '</span>';?></td>
|
||||
<td><span class='status-task status-<?php echo $task->status;?>'><?php echo $this->processStatus('task', $task);?></span></td>
|
||||
<td class='text-left text-ellipsis' title="<?php echo $task->storyTitle;?>">
|
||||
<?php
|
||||
|
||||
@@ -157,7 +157,7 @@ js::set('priv',
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
$width = common::checkNotCN() ? '600px' : '470px';
|
||||
$width = common::checkNotCN() ? '600px' : '520px';
|
||||
echo html::a('javascript:toggleRDSearchBox()', "<i class='icon-search muted'></i> " . $lang->searchAB, '', "class='btn btn-link querybox-toggle'");
|
||||
echo html::a('javascript:fullScreen()', "<i class='icon-fullscreen muted'></i> " . $lang->kanban->fullScreen, '', "class='btn btn-link'");
|
||||
if(common::hasPriv('execution', 'setKanban')) echo html::a(helper::createLink('execution', 'setKanban', "executionID=$execution->id", '', true), '<i class="icon icon-cog-outline"></i> ' . $lang->settings, '', "class='iframe btn btn-link text-left' data-width='$width'");
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' $checked $attr id='products{$productID}'>";?>
|
||||
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>' title='<?php echo $productName;?>'><?php echo $productName;?></label>
|
||||
</div>
|
||||
<?php if(isset($allBranches[$productID][$branchID])) echo html::select("branch[$i]", $allBranches[$productID], $branchID, "class='form-control chosen' disabled='disabled'");?>
|
||||
<?php if(isset($allBranches[$productID][$branchID])) echo html::select("branch[$i]", $allBranches[$productID], $branchID, "class='form-control picker-select' disabled='disabled'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(!empty($attr)) echo html::hidden("products[$i]", $productID);?>
|
||||
@@ -64,7 +64,7 @@
|
||||
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' id='products{$productID}'>";?>
|
||||
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>'><?php echo $productName;?></label>
|
||||
</div>
|
||||
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control chosen'");?>
|
||||
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control picker-select'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php $i++;?>
|
||||
@@ -88,7 +88,7 @@
|
||||
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' id='products{$productID}'>";?>
|
||||
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>'><?php echo $productName;?></label>
|
||||
</div>
|
||||
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control chosen'");?>
|
||||
<?php if(isset($branchGroups[$productID])) echo html::select("branch[$i]", $branchGroups[$productID], '', "class='form-control picker-select'");?>
|
||||
</div>
|
||||
</div>
|
||||
<?php $i++;?>
|
||||
|
||||
@@ -403,7 +403,7 @@ body {margin-bottom: 25px;}
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
// Update table summary text
|
||||
/* Update table summary text. */
|
||||
var checkedSummary = '<?php echo $lang->execution->checkedSummary?>';
|
||||
var pageSummary = '<?php echo $lang->execution->pageSummary?>';
|
||||
$('#executionTaskForm').table(
|
||||
@@ -425,7 +425,7 @@ $(function()
|
||||
$rows.each(function()
|
||||
{
|
||||
var $row = $(this);
|
||||
if ($originTable)
|
||||
if($originTable)
|
||||
{
|
||||
$row = $originTable.find('tbody>tr[data-id="' + $row.data('id') + '"]');
|
||||
}
|
||||
|
||||
@@ -33,6 +33,12 @@
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
$waitCount = 0;
|
||||
$testingCount = 0;
|
||||
$blockedCount = 0;
|
||||
$doneCount = 0;
|
||||
?>
|
||||
<div id="mainContent">
|
||||
<?php if(empty($tasks)):?>
|
||||
<div class="table-empty-tip">
|
||||
@@ -44,7 +50,7 @@
|
||||
</p>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<form class="main-table table-testtask" data-ride="table" data-group="true" method="post" target='hiddenwin' id='testtaskForm'>
|
||||
<form class="main-table table-testtask" data-group="true" method="post" target='hiddenwin' id='testtaskForm'>
|
||||
<table class="table table-grouped has-sort-head" id='taskList'>
|
||||
<thead>
|
||||
<?php $vars = "executionID=$executionID&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?>
|
||||
@@ -61,10 +67,10 @@
|
||||
</th>
|
||||
<th><?php common::printOrderLink('name', $orderBy, $vars, $lang->testtask->name);?></th>
|
||||
<th><?php common::printOrderLink('build', $orderBy, $vars, $lang->testtask->build);?></th>
|
||||
<th class='c-status'><?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
|
||||
<th class='c-user'><?php common::printOrderLink('owner', $orderBy, $vars, $lang->testtask->owner);?></th>
|
||||
<th class='c-date'><?php common::printOrderLink('begin', $orderBy, $vars, $lang->testtask->begin);?></th>
|
||||
<th class='c-date'><?php common::printOrderLink('end', $orderBy, $vars, $lang->testtask->end);?></th>
|
||||
<th class='c-status'><?php common::printOrderLink('status', $orderBy, $vars, $lang->statusAB);?></th>
|
||||
<th class='c-actions-5 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -72,7 +78,11 @@
|
||||
<?php foreach($tasks as $product => $productTasks):?>
|
||||
<?php $productName = zget($products, $product, '');?>
|
||||
<?php foreach($productTasks as $task):?>
|
||||
<tr data-id='<?php echo $product;?>' <?php if($task == reset($productTasks)) echo "class='divider-top'";?>>
|
||||
<?php if($task->status == 'wait') $waitCount ++;?>
|
||||
<?php if($task->status == 'doing') $testingCount ++;?>
|
||||
<?php if($task->status == 'blocked') $blockedCount ++;?>
|
||||
<?php if($task->status == 'done') $doneCount ++;?>
|
||||
<tr data-id='<?php echo $product;?>' <?php if($task == reset($productTasks)) echo "class='divider-top'";?> data-status='<?php echo $task->status;?>'>
|
||||
<?php if($task == reset($productTasks)):?>
|
||||
<td rowspan='<?php echo count($productTasks);?>' class='c-side text-left group-toggle'>
|
||||
<a class='text-primary' title='<?php echo $productName;?>'><i class='icon icon-caret-down'></i> <?php echo $productName;?></a>
|
||||
@@ -88,13 +98,13 @@
|
||||
</td>
|
||||
<td class='text-left' title="<?php echo $task->name?>"><?php echo html::a($this->createLink('testtask', 'cases', "taskID=$task->id"), $task->name, '', "data-app='execution'");?></td>
|
||||
<td title="<?php echo $task->buildName?>"><?php echo ($task->build == 'trunk' || empty($task->buildName)) ? $lang->trunk : html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName);?></td>
|
||||
<td><?php echo zget($users, $task->owner);?></td>
|
||||
<td><?php echo $task->begin?></td>
|
||||
<td><?php echo $task->end?></td>
|
||||
<?php $status = $this->processStatus('testtask', $task);?>
|
||||
<td title='<?php echo $status;?>'>
|
||||
<span class='status-testtask status-<?php echo $task->status?>'><?php echo $status;?></span>
|
||||
</td>
|
||||
<td><?php echo zget($users, $task->owner);?></td>
|
||||
<td><?php echo $task->begin?></td>
|
||||
<td><?php echo $task->end?></td>
|
||||
<td class='c-actions'>
|
||||
<?php
|
||||
if($canBeChanged)
|
||||
@@ -136,9 +146,12 @@
|
||||
?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="table-statistic"><?php echo sprintf($lang->testtask->allSummary, $total, $waitCount, $testingCount, $blockedCount, $doneCount);?></div>
|
||||
<?php $pager->show('right', 'pagerjs');?>
|
||||
</div>
|
||||
</form>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php js::set('pageSummary', sprintf($lang->testtask->allSummary, $total, $waitCount, $testingCount, $blockedCount, $doneCount));?>
|
||||
<?php js::set('checkedAllSummary', $lang->testtask->checkedAllSummary);?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -1372,6 +1372,55 @@ class kanban extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Import ticket.
|
||||
*
|
||||
* @param int $kanbanID
|
||||
* @param int $regionID
|
||||
* @param int $groupID
|
||||
* @param int $columnID
|
||||
* @param int $selectedProductID
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function importTicket($kanbanID = 0, $regionID = 0, $groupID = 0, $columnID = 0, $selectedProductID = 0, $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
if($_POST)
|
||||
{
|
||||
$importedIDList = $this->kanban->importObject($kanbanID, $regionID, $groupID, $columnID, 'ticket');
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
foreach($importedIDList as $cardID => $ticketID)
|
||||
{
|
||||
$this->loadModel('action')->create('kanbancard', $cardID, 'importedTicket', '', $ticketID);
|
||||
}
|
||||
|
||||
return print(js::locate($this->createLink('kanban', 'view', "kanbanID=$kanbanID"), 'parent.parent'));
|
||||
}
|
||||
|
||||
$this->loadModel('feedback');
|
||||
$this->loadModel('ticket');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$this->view->products = array('all' => $this->lang->kanban->allProducts) + $this->feedback->getGrantProducts();
|
||||
$this->view->selectedProductID = $selectedProductID;
|
||||
$this->view->lanePairs = $this->kanban->getLanePairsByGroup($groupID);
|
||||
$this->view->tickets2Imported = $this->ticket->getTicketByProduct($selectedProductID, '', 'id_desc', $pager);
|
||||
$this->view->pager = $pager;
|
||||
$this->view->kanbanID = $kanbanID;
|
||||
$this->view->regionID = $regionID;
|
||||
$this->view->groupID = $groupID;
|
||||
$this->view->columnID = $columnID;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a card's color.
|
||||
*
|
||||
|
||||
@@ -343,6 +343,10 @@ function renderKanbanItem(item, $item)
|
||||
{
|
||||
renderProductplanItem(item, $item);
|
||||
}
|
||||
else if(item.fromType == 'ticket')
|
||||
{
|
||||
renderTicketItem(item, $item);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!$title.length)
|
||||
@@ -746,6 +750,88 @@ function renderBuildItem(item, $item)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render execution item.
|
||||
*
|
||||
* @param object item
|
||||
* @param object $item
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function renderTicketItem(item, $item)
|
||||
{
|
||||
/* Output header information. */
|
||||
var privs = item.actions;
|
||||
if(privs.includes('sortCard')) $item.parent().addClass('sort');
|
||||
|
||||
var $header = $item.children('.header');
|
||||
if(!$header.length) $header = $(
|
||||
[
|
||||
'<div class="header">',
|
||||
'</div>'
|
||||
].join('')).appendTo($item);
|
||||
|
||||
var $titleBox = $header.children('.ticketTitle');
|
||||
if(!$titleBox.length) $titleBox = $(
|
||||
[
|
||||
'<div class="ticketTitle">',
|
||||
'</div>'
|
||||
].join('')).appendTo($header);
|
||||
|
||||
/* Print ticket name. */
|
||||
var $title = $titleBox.children('.title');
|
||||
var name = item.title ? item.title : item.name;
|
||||
if(!$title.length)
|
||||
{
|
||||
var icon = 'file-text';
|
||||
if(privs.includes('viewTicket') && item.deleted == '0') $title = $('<a class="title"><i class="icon icon-' + icon + '"></i>' + name + '</a>').appendTo($titleBox).attr('href', createLink('ticket', 'view', 'ticketID=' + item.fromID));
|
||||
if(!privs.includes('viewTicket') || item.deleted == '1') $title = $('<div class="title"><i class="icon icon-' + icon + '"></i>' + name + '</div>').appendTo($titleBox);
|
||||
}
|
||||
$title.attr('title', name);
|
||||
$item.data('card', item);
|
||||
|
||||
var $info = $item.children('.info');
|
||||
if(!$info.length) $info = $(
|
||||
[
|
||||
'<div class="info">',
|
||||
'</div>'
|
||||
].join('')).appendTo($item);
|
||||
|
||||
var $statusBox = $info.children('.execStatus');
|
||||
if(!$statusBox.length)
|
||||
{
|
||||
if(item.deleted == '0')
|
||||
{
|
||||
$statusBox = $('<span class="execStatus label label-' + item.objectStatus + '">' + ticketLang.statusList[item.objectStatus] + '</span>').appendTo($info);
|
||||
}
|
||||
else
|
||||
{
|
||||
$statusBox = $('<span class="execStatus label label-deleted">' + ticketLang.deleted + '</span>').appendTo($info);
|
||||
}
|
||||
}
|
||||
|
||||
/* Display deadline of execution. */
|
||||
if(item.deadline != '0000-00-00')
|
||||
{
|
||||
var $date = $info.children('.date');
|
||||
var deadline = $.zui.createDate(item.deadline);
|
||||
var today = new Date();
|
||||
var labelType = deadline.toLocaleDateString() == today.toLocaleDateString() ? 'danger' : 'wait';
|
||||
if(!$date.length) $date = $('<span class="date label label-' + labelType + '"></span>').appendTo($info);
|
||||
|
||||
$date.text($.zui.formatDate(deadline, 'MM-dd') + ' ' + kanbancardLang.deadlineAB).attr('title', $.zui.formatDate(deadline, 'yyyy-MM-dd') + ' ' + kanbancardLang.deadlineAB).show();
|
||||
}
|
||||
|
||||
/* Display avatars of ticket assignedTo. */
|
||||
var $user = $info.children('.user');
|
||||
var user = [item.assignedTo];
|
||||
if(users[item.assignedTo])
|
||||
{
|
||||
if(!$user.length) $user = $('<div class="user"></div>').appendTo($info);
|
||||
$user.html(renderUsersAvatar(user, item.id)).attr('title', users[item.assignedTo]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show error message
|
||||
* @param {string|object} message Message
|
||||
@@ -1505,7 +1591,8 @@ $(function()
|
||||
var importReleaseLink = kanban.object.indexOf('releases') != -1 ? "<li><a class='iframe' data-toggle='modal'' href='" + createLink('kanban', 'importRelease', 'kanbanID=' + kanban.id + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importRelease + '</a></li>' : '';
|
||||
var importExecutionLink = kanban.object.indexOf('executions') != -1 ? "<li><a class='iframe' data-toggle='modal' href='" + createLink('kanban', 'importExecution', 'kanbanID=' + kanban.id + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importExecution + '</a></li>' : '';
|
||||
var importBuildLink = kanban.object.indexOf('builds') != -1 ? "<li><a class='iframe' data-toggle='modal' href='" + createLink('kanban', 'importBuild', 'kanbanID=' + kanban.id + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importBuild + '</a></li>' : '';
|
||||
var importSubmenu = '<ul class="dropdown-menu">' + importPlanLink + importReleaseLink + importExecutionLink + importBuildLink +'</ul>';
|
||||
var importTicketLink = kanban.object.indexOf('tickets') != -1 ? "<li><a class='iframe' data-toggle='modal' href='" + createLink('kanban', 'importTicket', 'kanbanID=' + kanban.id + '®ionID=' + regionID + '&groupID=' + groupID + '&columnID=' + columnID) + "'>" + kanbanLang.importTicket + '</a></li>' : '';
|
||||
var importSubmenu = '<ul class="dropdown-menu">' + importPlanLink + importReleaseLink + importExecutionLink + importBuildLink + importTicketLink + '</ul>';
|
||||
$('.import').parent().append(importSubmenu);
|
||||
|
||||
});
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->kanban->importPlan = 'Plan';
|
||||
$lang->kanban->importRelease = 'Release';
|
||||
$lang->kanban->importExecution = $lang->execution->common;
|
||||
$lang->kanban->importBuild = 'Build';
|
||||
$lang->kanban->importTicket = 'Ticket';
|
||||
$lang->kanban->allKanban = 'All Kanban';
|
||||
$lang->kanban->allProjects = 'All ' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : 'Projects');
|
||||
$lang->kanban->allProducts = 'All Products';
|
||||
@@ -236,6 +237,7 @@ $lang->kanban->importObjectList['plans'] = 'Product Plan';
|
||||
$lang->kanban->importObjectList['releases'] = 'Release';
|
||||
$lang->kanban->importObjectList['builds'] = 'Build';
|
||||
$lang->kanban->importObjectList['executions'] = 'Execution';
|
||||
if($this->config->edition != 'open') $lang->kanban->importObjectList['tickets'] = 'Ticket';
|
||||
$lang->kanban->importObjectList['cards'] = 'Other Kanban Cards';
|
||||
|
||||
$lang->kanban->showWIPList[1] = 'Show';
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->kanban->importPlan = 'Plan';
|
||||
$lang->kanban->importRelease = 'Release';
|
||||
$lang->kanban->importExecution = $lang->execution->common;
|
||||
$lang->kanban->importBuild = 'Build';
|
||||
$lang->kanban->importTicket = 'Ticket';
|
||||
$lang->kanban->allKanban = 'All Kanban';
|
||||
$lang->kanban->allProjects = 'All ' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : 'Projects');
|
||||
$lang->kanban->allProducts = 'All Products';
|
||||
@@ -236,6 +237,7 @@ $lang->kanban->importObjectList['plans'] = 'Product Plan';
|
||||
$lang->kanban->importObjectList['releases'] = 'Release';
|
||||
$lang->kanban->importObjectList['builds'] = 'Build';
|
||||
$lang->kanban->importObjectList['executions'] = 'Execution';
|
||||
if($this->config->edition != 'open') $lang->kanban->importObjectList['tickets'] = 'Ticket';
|
||||
$lang->kanban->importObjectList['cards'] = 'Other Kanban Cards';
|
||||
|
||||
$lang->kanban->showWIPList[1] = 'Show';
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->kanban->importPlan = 'Plan';
|
||||
$lang->kanban->importRelease = 'Release';
|
||||
$lang->kanban->importExecution = $lang->execution->common;
|
||||
$lang->kanban->importBuild = 'Build';
|
||||
$lang->kanban->importTicket = 'Ticket';
|
||||
$lang->kanban->allKanban = 'All Kanban';
|
||||
$lang->kanban->allProjects = 'All ' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : 'Projects');
|
||||
$lang->kanban->allProducts = 'All Products';
|
||||
@@ -236,6 +237,7 @@ $lang->kanban->importObjectList['plans'] = 'Product Plan';
|
||||
$lang->kanban->importObjectList['releases'] = 'Release';
|
||||
$lang->kanban->importObjectList['builds'] = 'Build';
|
||||
$lang->kanban->importObjectList['executions'] = 'Execution';
|
||||
if($this->config->edition != 'open') $lang->kanban->importObjectList['tickets'] = 'Ticket';
|
||||
$lang->kanban->importObjectList['cards'] = 'Other Kanban Cards';
|
||||
|
||||
$lang->kanban->showWIPList[1] = 'Show';
|
||||
|
||||
@@ -83,6 +83,7 @@ $lang->kanban->importPlan = '计划';
|
||||
$lang->kanban->importRelease = '发布';
|
||||
$lang->kanban->importExecution = $lang->execution->common;
|
||||
$lang->kanban->importBuild = '版本';
|
||||
$lang->kanban->importTicket = '工单';
|
||||
$lang->kanban->allKanban = '所有看板';
|
||||
$lang->kanban->allProjects = '所有' . ($this->config->systemMode == 'classic' ? $lang->executionCommon : '项目');
|
||||
$lang->kanban->allProducts = '所有产品';
|
||||
@@ -236,6 +237,7 @@ $lang->kanban->importObjectList['plans'] = '计划';
|
||||
$lang->kanban->importObjectList['releases'] = '发布';
|
||||
$lang->kanban->importObjectList['builds'] = '版本';
|
||||
$lang->kanban->importObjectList['executions'] = $lang->execution->common;
|
||||
if($this->config->edition != 'open') $lang->kanban->importObjectList['tickets'] = '工单';
|
||||
$lang->kanban->importObjectList['cards'] = '其他看板卡片';
|
||||
|
||||
$lang->kanban->showWIPList[1] = '显示';
|
||||
|
||||
@@ -1127,7 +1127,7 @@ class kanbanModel extends model
|
||||
->andWhere('type')->eq('common')
|
||||
->fetchAll();
|
||||
|
||||
$actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild');
|
||||
$actions = array('editCard', 'archiveCard', 'deleteCard', 'moveCard', 'setCardColor', 'viewCard', 'sortCard', 'viewExecution', 'viewPlan', 'viewRelease', 'viewBuild', 'viewTicket');
|
||||
$cardGroup = array();
|
||||
foreach($cellList as $cell)
|
||||
{
|
||||
@@ -1146,7 +1146,7 @@ class kanbanModel extends model
|
||||
$card->actions = array();
|
||||
foreach($actions as $action)
|
||||
{
|
||||
if(in_array($action, array('viewExecution', 'viewPlan', 'viewRelease', 'viewBuild')))
|
||||
if(in_array($action, array('viewExecution', 'viewPlan', 'viewRelease', 'viewBuild', 'viewTicket')))
|
||||
{
|
||||
if($card->fromType == 'execution')
|
||||
{
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* The import release view of kanban 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 Qiyu Xie<xieqiyu@cnezsoft.com>
|
||||
* @package kanban
|
||||
* @version $Id: importrelease.html.php 5090 2022-01-19 14:19:24Z xieqiyu@cnezsoft.com $
|
||||
* @link https://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.lite.html.php';?>
|
||||
<?php js::set('kanbanID', $kanbanID);?>
|
||||
<?php js::set('regionID', $regionID);?>
|
||||
<?php js::set('groupID', $groupID);?>
|
||||
<?php js::set('columnID', $columnID);?>
|
||||
<?php js::set('methodName', $this->app->rawMethod);?>
|
||||
<div id='mainContent' class='main-content importModal'>
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->kanban->importAB . $lang->kanban->importTicket;?></h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class='input-group space'>
|
||||
<span class='input-group-addon'><?php echo $lang->kanban->selectedProduct;?></span>
|
||||
<?php echo html::select('product', $products, $selectedProductID, "onchange='reloadObjectList(this.value)' class='form-control chosen' data-drop_direction='down'");?>
|
||||
<span class='input-group-addon'><?php echo $lang->kanban->selectedLane;?></span>
|
||||
<?php echo html::select('lane', $lanePairs, '', "onchange='setTargetLane(this.value)' class='form-control chosen' data-drop_direction='down'");?>
|
||||
</div>
|
||||
<?php if($tickets2Imported):?>
|
||||
<form class='main-table' method='post' data-ride='table' target='hiddenwin' id='importTicketForm'>
|
||||
<table class='table table-fixed' id='ticketList'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="c-id">
|
||||
<div class="checkbox-primary check-all" title="<?php echo $lang->selectAll?>">
|
||||
<label></label>
|
||||
</div>
|
||||
<?php echo $lang->idAB;?>
|
||||
</th>
|
||||
<th class='c-name'><?php echo $lang->ticket->title;?></th>
|
||||
<th class='c-pri'><?php echo $lang->ticket->priAB;?></th>
|
||||
<th class='c-status'><?php echo $lang->ticket->status;?></th>
|
||||
<th class='c-type'><?php echo $lang->ticket->type;?></th>
|
||||
<th><?php echo $lang->ticket->createdDate;?></th>
|
||||
<th class='c-name'><?php echo $lang->ticket->assignedTo;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($tickets2Imported as $ticket):?>
|
||||
<tr>
|
||||
<td class='c-id'>
|
||||
<div class="checkbox-primary">
|
||||
<input type='checkbox' name='tickets[]' value='<?php echo $ticket->id;?>'/>
|
||||
<label></label>
|
||||
</div>
|
||||
<?php printf('%03d', $ticket->id);?>
|
||||
</td>
|
||||
<?php if(common::hasPriv('ticket', 'view')):?>
|
||||
<td title='<?php echo $ticket->title;?>'>
|
||||
<a href='javascript:void(0);' onclick="locateView('ticket', <?php echo $ticket->id;?>)"><?php echo $ticket->title;?></a>
|
||||
</td>
|
||||
<?php else:?>
|
||||
<td title='<?php echo $ticket->title;?>'><?php echo $ticket->title;?></td>
|
||||
<?php endif;?>
|
||||
<td><span class='label-pri label-pri-<?php echo $ticket->pri;?>' title='<?php echo zget($this->lang->ticket->priList, $ticket->pri, $ticket->pri);?>'><?php echo zget($this->lang ->ticket->priList, $ticket->pri, $ticket->pri); ?></span></td>
|
||||
<td title='<?php echo zget($this->lang->ticket->statusList, $ticket->status, $ticket->status);?>'><?php echo zget($this->lang->ticket->statusList, $ticket->status, $ticket->status);?></td>
|
||||
<td title='<?php echo zget($this->lang->ticket->typeList, $ticket->type, $ticket->type);?>'><?php echo zget($this->lang->ticket->typeList, $ticket->type, $ticket->type);?></td>
|
||||
<td title='<?php echo $ticket->openedDate;?>'><?php echo $ticket->openedDate;?></td>
|
||||
<td title='<?php echo $ticket->assignedTo;?>'><?php echo $ticket->assignedTo;?></td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<tr><?php echo html::hidden('targetLane', key($lanePairs));?></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class='table-footer'>
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
<div class="table-actions btn-toolbar show-always"><?php echo html::submitButton($lang->kanban->importAB, '', 'btn btn-default');?></div>
|
||||
<?php $pager->show('right', 'pagerjs');?>
|
||||
</div>
|
||||
</form>
|
||||
<?php else:?>
|
||||
<div class='table-empty-tip'><?php echo $lang->noData;?></div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<style>#product_chosen {width: 45% !important}</style>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
+13
-1
@@ -754,6 +754,10 @@ class mailModel extends model
|
||||
{
|
||||
$sendUsers = array($object->auditedBy, '');
|
||||
}
|
||||
elseif($objectType == 'ticket')
|
||||
{
|
||||
$sendUsers = $this->{$objectType}->getToAndCcList($object, $action);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sendUsers = $this->{$objectType}->getToAndCcList($object);
|
||||
@@ -785,7 +789,15 @@ class mailModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->send($toList, $subject, $mailContent, $ccList);
|
||||
if($objectType == 'ticket')
|
||||
{
|
||||
$emails = $this->loadModel('ticket')->getContactEmails($objectID, $toList, $ccList, $action->action == 'closed');
|
||||
$this->send($toList, $subject, $mailContent, $ccList, false, $emails);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->send($toList, $subject, $mailContent, $ccList);
|
||||
}
|
||||
}
|
||||
if($this->isError()) error_log(join("\n", $this->getError()));
|
||||
}
|
||||
|
||||
@@ -256,6 +256,11 @@ class misc extends control
|
||||
$condition = "owner={$account}&module={$objectType}§ion=task&key=unfoldTasks";
|
||||
$settingPath = $account . ".{$objectType}.task.unfoldTasks";
|
||||
}
|
||||
elseif($objectType == 'productplan')
|
||||
{
|
||||
$condition = "owner={$account}&module={$objectType}§ion=browse&key=unfoldPlans";
|
||||
$settingPath = $account . ".{$objectType}.browse.unfoldPlans";
|
||||
}
|
||||
else
|
||||
{
|
||||
$condition = "owner={$account}&module=product§ion=browse&key=unfoldStories";
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
|
||||
$lang->misc->releaseDate['17.6'] = '2022-08-26';
|
||||
@@ -190,6 +191,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => "The table is optimized in the transition version. At the same time, we have added the new feature of Work Order and get the Feedback features improved as well. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
|
||||
$lang->misc->releaseDate['17.6'] = '2022-08-26';
|
||||
@@ -190,6 +191,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => "The table is optimized in the transition version. At the same time, we have added the new feature of Work Order and get the Feedback features improved as well. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = '<p>ZenTao 15.0+ a new "Youth Blue" theme
|
||||
$lang->misc->feature->visionsDesc = "<p>The concept of interface has been added since 16.5. Users can deal with R & D affairs in <span style='color: #0c60e1'>[R&D]</span> and daily office affairs in <span style='color: #0c60e1'>[Lite]</span>.</p><p>You can view the current interface on the avatar, and click the name of the interface to view and switch other interfaces.</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions_en.png';
|
||||
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
|
||||
$lang->misc->releaseDate['17.6'] = '2022-08-26';
|
||||
@@ -190,6 +191,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => "The table is optimized in the transition version. At the same time, we have added the new feature of Work Order and get the Feedback features improved as well. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => "3 themes in ZenTao including Green, ZenTao Blue, and Young Blue are updated. At the same time, the attachments could be uploaded in bulk in ZenTao. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.1'][] = array('title' => "Optimized the processing logic of multi-member tasks. Fix bugs.", 'desc' => '');
|
||||
$lang->misc->feature->all['17.6'][] = array('title' => "The processing logic of requirements is optimized, and the permissions of user requirements and soft requirements are split. Gantt chart supports manual drag and drop to manage task relationship. Fix bugs.", 'desc' => '');
|
||||
|
||||
@@ -103,6 +103,7 @@ $lang->misc->feature->themeDesc = "<p>禅道15系列上线了全新的“
|
||||
$lang->misc->feature->visionsDesc = "<p>从16.5开始增加了界面概念,用户可以在<span style='color:#0c60e1'>[研发综合界面]</span>中处理研发事务、在<span style='color:#0c60e1'>[迅捷界面]</span>处理日常办公事务。</p><p>在头像右侧即可查看当前所处界面,点击当前界面名称可查看和切换其他的界面。</p>";
|
||||
$lang->misc->feature->visionsImage = 'theme/default/images/main/visions.png';
|
||||
|
||||
$lang->misc->releaseDate['17.7'] = '2022-10-19';
|
||||
$lang->misc->releaseDate['17.6.2'] = '2022-09-23';
|
||||
$lang->misc->releaseDate['17.6.1'] = '2022-09-08';
|
||||
$lang->misc->releaseDate['17.6'] = '2022-08-26';
|
||||
@@ -190,6 +191,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
|
||||
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
|
||||
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
|
||||
|
||||
$lang->misc->feature->all['17.7'][] = array('title' => '过渡版本表格优化完成。新增工单功能,优化了反馈功能。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.2'][] = array('title' => '禅道更新叶兰绿、禅道蓝、青春蓝三大主题。实现附件批量上传功能。修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.6.1'][] = array('title' => '优化了多人任务的处理逻辑,修复Bug。', 'desc' => '');
|
||||
$lang->misc->feature->all['17.6'][] = array('title' => '优化了需求的处理逻辑,拆分了用需和软需的权限。甘特图支持手动拖拽维护任务关系。修复Bug。', 'desc' => '');
|
||||
|
||||
@@ -108,6 +108,7 @@ class my extends control
|
||||
$this->loadModel('bug');
|
||||
$this->loadModel('testcase');
|
||||
$this->loadModel('testtask');
|
||||
$this->loadModel('ticket');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -155,6 +156,7 @@ class my extends control
|
||||
$ncCount = 0;
|
||||
$qaCount = 0;
|
||||
$meetingCount = 0;
|
||||
$ticketCount = 0;
|
||||
$isMax = $this->config->edition == 'max' ? 1 : 0;
|
||||
|
||||
$feedbackCount = 0;
|
||||
@@ -198,6 +200,9 @@ class my extends control
|
||||
/* Get the number of meetings assigned to me. */
|
||||
$meetings = $this->meeting->getListByUser('futureMeeting', 'id_desc', 0, $pager);
|
||||
$meetingCount = $pager->recTotal;
|
||||
|
||||
$ticketList = $this->ticket->getList('assignedtome', 'id_desc', $pager);
|
||||
$ticketCount = $pager->recTotal;
|
||||
}
|
||||
|
||||
echo <<<EOF
|
||||
@@ -223,6 +228,7 @@ if(isMax !== 0)
|
||||
var reviewCount = $reviewCount;
|
||||
var qaCount = $qaCount;
|
||||
var meetingCount = $meetingCount;
|
||||
var ticketCount = $ticketCount;
|
||||
}
|
||||
</script>
|
||||
EOF;
|
||||
@@ -1113,6 +1119,9 @@ EOF;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('all,noletter');
|
||||
$this->view->queryID = $queryID;
|
||||
$this->view->mode = 'myMeeting';
|
||||
$this->view->projects = array(0 => '') + $this->loadModel('project')->getPairsByProgram('', 'all', true);
|
||||
$this->view->executions = array(0 => '') + $this->loadModel('execution')->getPairs(0, 'all', 'nocode');
|
||||
$this->view->rooms = array('' => '') + $this->loadModel('meetingroom')->getPairs();
|
||||
|
||||
$this->display();
|
||||
}
|
||||
@@ -1209,6 +1218,50 @@ EOF;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* My ticket.
|
||||
*
|
||||
* @param string $browseType
|
||||
* @param string $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ticket($browseType = 'assignedtome', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
|
||||
{
|
||||
$this->loadModel('ticket');
|
||||
$queryID = $browseType == 'bysearch' ? (int)$param : 0;
|
||||
|
||||
$this->session->set('ticketList', $this->app->getURI(true), 'feedback');
|
||||
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = pager::init($recTotal, $recPerPage, $pageID);
|
||||
|
||||
if($browseType != 'bysearch')
|
||||
{
|
||||
$tickets = $this->ticket->getList($browseType, $orderBy, $pager);
|
||||
}
|
||||
else
|
||||
{
|
||||
$tickets = $this->ticket->getBySearch($queryID, $orderBy, $pager);
|
||||
}
|
||||
|
||||
$actionURL = $this->createLink('my', 'work', "mode=ticket&type=bysearch¶m=myQueryID&orderBy={$orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}&pageID={$pageID}");
|
||||
$this->my->buildTicketSearchForm($queryID, $actionURL);
|
||||
|
||||
$this->view->title = $this->lang->ticket->browse;
|
||||
$this->view->products = $this->loadModel('feedback')->getGrantProducts();
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noletter');
|
||||
$this->view->tickets = $tickets;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
$this->view->browseType = $browseType;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* My team.
|
||||
*
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
.c-confirm {width:60px;}
|
||||
|
||||
[lang^=en] .c-assignedTo {width: 105px !important;}
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
.c-hours, .c-progress {width: 80px !important;}
|
||||
.c-status, .c-date {padding-right: 8px !important; text-align: center;}
|
||||
.align-right {text-align: right; padding-right: 8px !important;}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
.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(.story-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.table td.has-child > .story-toggle {color: #838a9d; position: relative; top: 1px;}
|
||||
.table td.has-child > .story-toggle {color: #838a9d; position: relative; top: 1px; left: 2px;}
|
||||
.table td.has-child > .story-toggle:hover {color: #006af1; cursor: pointer;}
|
||||
.table td.has-child > .story-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
|
||||
.table td.has-child > .story-toggle > .icon:before {text-align: left;}
|
||||
@@ -11,3 +11,4 @@
|
||||
.main-table tbody > tr.table-children > td:first-child::before {width: 3px;}
|
||||
@-moz-document url-prefix() {.main-table tbody > tr.table-children > td:first-child::before {width: 4px;};}
|
||||
.c-span {margin-left: 22px;}
|
||||
[lang^=de] .c-hours{width: 105px;}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
.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(.story-toggle) {max-width: 90%; max-width: calc(100% - 30px); display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
.table td.has-child > .story-toggle {color: #838a9d; position: relative; top: 1px;}
|
||||
.table td.has-child > .story-toggle {color: #838a9d; position: relative; top: 1px; left: 2px;}
|
||||
.table td.has-child > .story-toggle:hover {color: #006af1; cursor: pointer;}
|
||||
.table td.has-child > .story-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
|
||||
.table td.has-child > .story-toggle > .icon:before {text-align: left;}
|
||||
@@ -11,3 +11,4 @@
|
||||
.main-table tbody > tr.table-children > td:first-child::before {width: 3px;}
|
||||
@-moz-document url-prefix() {.main-table tbody > tr.table-children > td:first-child::before {width: 4px;};}
|
||||
.c-actions-6 {width: 185px;}
|
||||
[lang^=de] .c-hours {width: 105px;}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
td.delayed {background: #e84e0f !important; color: white;}
|
||||
|
||||
.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;}
|
||||
@@ -8,7 +6,7 @@ td.delayed {background: #e84e0f !important; color: white;}
|
||||
.table td.has-child > .task-toggle:hover {color: #006af1; cursor: pointer;}
|
||||
.table td.has-child > .task-toggle > .icon {font-size: 16px; display: inline-block; transition: transform .2s; -ms-transform: rotate(-90deg); -moz-transform: rotate(-90deg); -o-transform: rotate(-90deg); -webkit-transform: rotate(-90deg); transform: rotate(-90deg);}
|
||||
.table td.has-child > .task-toggle > .icon:before {text-align: left;}
|
||||
.table td.has-child > .task-toggle.collapsed {top: 2px;}
|
||||
.table td.has-child > .task-toggle.collapsed {top: 0;}
|
||||
.table td.has-child > .task-toggle.collapsed > .icon {-ms-transform: rotate(90deg); -moz-transform: rotate(90deg); -o-transform: rotate(90deg); -webkit-transform: rotate(90deg); transform: rotate(90deg);}
|
||||
.table td.c-hours {padding-right: 12px;}
|
||||
.main-table tbody > tr.table-children > td:first-child::before {width: 3px;}
|
||||
@@ -28,7 +26,7 @@ html[lang="en"] .c-user-short {width: 88px;}
|
||||
[lang^=de] #taskTable .c-date {width: 78px;}
|
||||
[lang^=de] #taskTable .assigned-title {width: 123px !important;}
|
||||
[lang^=de] #taskTable .c-user {width: 118px;}
|
||||
[lang^=de] #taskTable .c-hours {width: 86px;}
|
||||
[lang^=de] #taskTable .estimate, [lang^=de] #taskTable .consumed {width: 86px;}
|
||||
[lang^=de] #taskTable .c-user-short {width: 75px;}
|
||||
[lang^=fr] #taskTable .c-name {width: 120px;}
|
||||
[lang^=fr] #taskTable .c-project {width: 100px;}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
.c-pri {width: 75px;}
|
||||
.c-openedDate {width: 210px;}
|
||||
.c-assignedTo {width: 100px;}
|
||||
.no-wrap{text-overflow: ellipsis; white-space: nowrap; overflow: hidden;}
|
||||
|
||||
@@ -10,3 +10,4 @@
|
||||
.panel-actions .btn-icon {padding-left: 7px;}
|
||||
[lang^=de] .c-pri {width: 69px;}
|
||||
[lang^=fr] .c-pri {width: 82px;}
|
||||
[lang^=en] .c-user, [lang^=fr] .c-user {width: 100px !important;}
|
||||
|
||||
@@ -21,6 +21,7 @@ $(function()
|
||||
$("#subNavbar li[data-id='audit'] a").append('<span class="label label-light label-badge">' + reviewCount + '</span>');
|
||||
$("#subNavbar li[data-id='nc'] a").append('<span class="label label-light label-badge">' + qaCount + '</span>');
|
||||
$("#subNavbar li[data-id='myMeeting'] a").append('<span class="label label-light label-badge">' + meetingCount + '</span>');
|
||||
$("#subNavbar li[data-id='ticket'] a").append('<span class="label label-light label-badge">' + ticketCount + '</span>');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ $(function()
|
||||
if($td.find('.label').length > 0) labelWidth = $td.find('.label').width();
|
||||
$td.find('a').eq(0).css('max-width', $td.width() - labelWidth - 60);
|
||||
});
|
||||
toggleFold('#myStoryForm', [], 0, 'requirement');
|
||||
|
||||
$(document).on('click', '.story-toggle', function(e)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,7 @@ $(function()
|
||||
if($td.find('.label').length > 0) labelWidth = $td.find('.label').width();
|
||||
$td.find('a').eq(0).css('max-width', $td.width() - labelWidth - 60);
|
||||
});
|
||||
|
||||
toggleFold('#myStoryForm', [], 0, 'story');
|
||||
$(document).on('click', '.story-toggle', function(e)
|
||||
{
|
||||
var $toggle = $(this);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user