Merge branch 'master' of github.com:easysoft/zentaopms

This commit is contained in:
wangyidong
2016-12-23 09:45:10 +08:00
41 changed files with 323 additions and 225 deletions
+2 -2
View File
@@ -18,7 +18,7 @@ Z PUBLIC LICENSE 由青岛易软天创网络科技有限公司(www.cnezsoft.co
电话: 4006-8899-23
Email: co@cnezsoft.com
QQ: 1492153927
地址: 青岛开发区井冈山路东方银座 C座 1106
地址: 青岛开发区武夷山路167号千禧龙花园 9-1-101室
约定:
@@ -121,7 +121,7 @@ Contact: Mr. Xu
Phone: 4006-8899-23
Email: co@cnezsoft.com
QQ: 1492153927
Address: Qingdao Development Zone, the Oriental Kenzo C 1106
Address: 9-1-101, 167 Wuyishan Lu, Kai Fa Qu, Qingdao
We agree:
+4 -4
View File
@@ -68,8 +68,8 @@ $lang->action->desc->common = '$date, <strong>$action</strong> by <stron
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->action->desc->created = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, modified by <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, Edited by <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, changed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, edited by <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> assigned to <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, closed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->deleted = '$date, deleted by <strong>$actor</strong> .' . "\n";
@@ -97,8 +97,8 @@ $lang->action->desc->svncommited = '$date, submitted by <strong>$actor</stron
$lang->action->desc->gitcommited = '$date, submitted by <strong>$actor</strong> and the version is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, finished by <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, paused by <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> has been modified. Its value was "%s" and the new value is "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> has been modified. The difference is ' . "\n" . "<blockquote>%s</blockquote>" . "\n<div class='hidden'>%s</div>";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> has been changed. Its value was "%s" and the new value is "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> has been changed. The difference is ' . "\n" . "<blockquote>%s</blockquote>" . "\n<div class='hidden'>%s</div>";
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
/* 关联用例和移除用例时的历史操作记录。*/
+3 -2
View File
@@ -151,11 +151,12 @@ class bug extends control
*
* @param int $productID
* @param string $browseType
* @param int $branchID
* @param int $moduleID
* @access public
* @return void
*/
public function report($productID, $browseType, $moduleID)
public function report($productID, $browseType, $branchID, $moduleID)
{
$this->loadModel('report');
$this->view->charts = array();
@@ -174,7 +175,7 @@ class bug extends control
}
}
$this->bug->setMenu($this->products, $productID);
$this->bug->setMenu($this->products, $productID, $branchID);
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->common . $this->lang->colon . $this->lang->bug->reportChart;
$this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID"), $this->products[$productID]);
$this->view->position[] = $this->lang->bug->reportChart;
+36 -36
View File
@@ -29,27 +29,27 @@ $lang->bug->browser = 'Browser';
$lang->bug->steps = 'Repro Steps';
$lang->bug->status = 'Status';
$lang->bug->statusAB = 'Status';
$lang->bug->activatedCount = 'Activated Count';
$lang->bug->activatedCountAB = 'Activated Count';
$lang->bug->activatedCount = 'Active';
$lang->bug->activatedCountAB = 'Active';
$lang->bug->confirmed = 'Confirmed';
$lang->bug->toTask = 'Convert to Task';
$lang->bug->toStory = 'Convert to Story';
$lang->bug->mailto = 'Mail To';
$lang->bug->openedBy = 'Opened By';
$lang->bug->openedDate = 'Open Date';
$lang->bug->openedDateAB = 'Open Date';
$lang->bug->openedBy = 'Open By';
$lang->bug->openedDate = 'Open On';
$lang->bug->openedDateAB = 'Open On';
$lang->bug->openedBuild = 'Open Build';
$lang->bug->assignedTo = 'Assigned To';
$lang->bug->assignedDate = 'Assigned Date';
$lang->bug->resolvedBy = 'Solved By';
$lang->bug->resolvedByAB = 'Solved';
$lang->bug->assignedDate = 'Assigned On';
$lang->bug->resolvedBy = 'Resolved By';
$lang->bug->resolvedByAB = 'Resolved';
$lang->bug->resolution = 'Solution';
$lang->bug->resolutionAB = 'Solution';
$lang->bug->resolvedBuild = 'Solved Build';
$lang->bug->resolvedDate = 'Solved Date';
$lang->bug->resolvedDateAB = 'Solved On';
$lang->bug->resolvedBuild = 'Resolved Build';
$lang->bug->resolvedDate = 'Resolved On';
$lang->bug->resolvedDateAB = 'Resolved On';
$lang->bug->closedBy = 'Closed By';
$lang->bug->closedDate = 'Closed Date';
$lang->bug->closedDate = 'Closed On';
$lang->bug->duplicateBug = 'Duplicate';
$lang->bug->lastEditedBy = 'Last Edited By';
$lang->bug->linkBug = 'Related';
@@ -59,8 +59,8 @@ $lang->bug->case = 'Case';
$lang->bug->files = 'File';
$lang->bug->keywords = 'Keywords';
$lang->bug->lastEditedByAB = 'Edited By';
$lang->bug->lastEditedDateAB = 'Edit Date';
$lang->bug->lastEditedDate = 'Edit Date';
$lang->bug->lastEditedDateAB = 'Edit On';
$lang->bug->lastEditedDate = 'Edit On';
$lang->bug->fromCase = 'From a Case';
$lang->bug->toCase = 'To a Case';
$lang->bug->colorTag = 'Color Tag';
@@ -79,7 +79,7 @@ $lang->bug->assignTo = 'Assign';
$lang->bug->batchAssignTo = 'Batch Assign';
$lang->bug->browse = 'Bug List';
$lang->bug->view = 'Bug Details';
$lang->bug->resolve = 'Solve';
$lang->bug->resolve = 'Resolve';
$lang->bug->batchResolve = 'Batch Resolve';
$lang->bug->close = 'Close';
$lang->bug->activate = 'Activate';
@@ -99,7 +99,7 @@ $lang->bug->openedByMe = 'Created by Me';
$lang->bug->resolvedByMe = 'Resolved by Me';
$lang->bug->closedByMe = 'Closed by Me';
$lang->bug->assignToNull = 'Unassigned';
$lang->bug->unResolved = 'Unsolve';
$lang->bug->unResolved = 'Unresolve';
$lang->bug->toClosed = 'To Be Closed';
$lang->bug->unclosed = 'Open';
$lang->bug->longLifeBugs = 'Pending';
@@ -116,7 +116,7 @@ $lang->bug->dittoNotice = 'This bug does not affiliate to the same product as th
$lang->bug->lblAssignedTo = 'Assignee';
$lang->bug->lblMailto = 'Mail To';
$lang->bug->lblLastEdited = 'Last Edited';
$lang->bug->lblResolved = 'Solved By';
$lang->bug->lblResolved = 'Resolved By';
$lang->bug->allUsers = 'All User';
$lang->bug->allBuilds = 'All';
@@ -128,7 +128,7 @@ $lang->bug->lblTypeAndSeverity = 'Type/Priority Level';
$lang->bug->lblSystemBrowserAndHardware = 'System/Browser';
$lang->bug->legendSteps = 'Repro Steps';
$lang->bug->legendComment = 'Note';
$lang->bug->legendLife = 'Bug Lifecycle';
$lang->bug->legendLife = 'Lifecycle';
$lang->bug->legendMisc = 'Miscellaneous';
/* 功能按钮。*/
@@ -139,7 +139,7 @@ $lang->bug->confirmChangeProduct = "Modification on {$lang->productCommon} will
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
$lang->bug->setTemplateTitle = 'Please enter the title of template.';
$lang->bug->remindTask = 'This Bug has been converted to Task. Do you want to update Status of Task(ID %s)?';
$lang->bug->skipClose = 'Bug %s is not solved. You cannot close it.';
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
$lang->bug->applyTemplate = 'Apply Template';
/* 模板。*/
@@ -220,8 +220,8 @@ $lang->bug->typeList['trackthings'] = 'Issue Tracking';
$lang->bug->typeList['others'] = 'Other';
$lang->bug->statusList[''] = '';
$lang->bug->statusList['active'] = 'Activate';
$lang->bug->statusList['resolved'] = 'Solved';
$lang->bug->statusList['active'] = 'Active';
$lang->bug->statusList['resolved'] = 'Reolved';
$lang->bug->statusList['closed'] = 'Closed';
$lang->bug->confirmedList[1] = 'Confirmed';
@@ -229,12 +229,12 @@ $lang->bug->confirmedList[0] = 'Not Confirmed';
$lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = 'Design Issue';
$lang->bug->resolutionList['duplicate'] = 'Duplicate Bug';
$lang->bug->resolutionList['external'] = 'External Reasons';
$lang->bug->resolutionList['fixed'] = 'Solved';
$lang->bug->resolutionList['duplicate'] = 'Duplicated';
$lang->bug->resolutionList['external'] = 'External';
$lang->bug->resolutionList['fixed'] = 'Resolved';
$lang->bug->resolutionList['notrepro'] = 'Irreproducible';
$lang->bug->resolutionList['postponed'] = 'Postponed';
$lang->bug->resolutionList['willnotfix'] = "Not to Solve";
$lang->bug->resolutionList['willnotfix'] = "Not to Resolve";
$lang->bug->resolutionList['tostory'] = 'Transfer to Story';
/* 统计报表。*/
@@ -243,21 +243,21 @@ $lang->bug->report->common = 'Report';
$lang->bug->report->select = 'Select Report Type ';
$lang->bug->report->create = 'Generate a Report';
$lang->bug->report->charts['bugsPerProject'] = $lang->projectCommon . 'Bug Count';
$lang->bug->report->charts['bugsPerBuild'] = 'Bug Count Per Build';
$lang->bug->report->charts['bugsPerModule'] = 'Bug Count Per Module';
$lang->bug->report->charts['openedBugsPerDay'] = 'Bug Count Per Day';
$lang->bug->report->charts['resolvedBugsPerDay'] = 'Solved Bug Per Day';
$lang->bug->report->charts['closedBugsPerDay'] = 'Closed Bug Per Day';
$lang->bug->report->charts['openedBugsPerUser'] = 'Submitted Bug Per User';
$lang->bug->report->charts['resolvedBugsPerUser'] = 'Solved Bug Per User';
$lang->bug->report->charts['closedBugsPerUser'] = 'Closed Bug Per User';
$lang->bug->report->charts['bugsPerProject'] = $lang->projectCommon . 'Bugs';
$lang->bug->report->charts['bugsPerBuild'] = 'Bugs Per Build';
$lang->bug->report->charts['bugsPerModule'] = 'Bugs Per Module';
$lang->bug->report->charts['openedBugsPerDay'] = 'Reported Bugs Per Day';
$lang->bug->report->charts['resolvedBugsPerDay'] = 'Resolved Bugs Per Day';
$lang->bug->report->charts['closedBugsPerDay'] = 'Closed Bugs Per Day';
$lang->bug->report->charts['openedBugsPerUser'] = 'Reported Bugs Per User';
$lang->bug->report->charts['resolvedBugsPerUser'] = 'Resolved Bugs Per User';
$lang->bug->report->charts['closedBugsPerUser'] = 'Closed Bugs Per User';
$lang->bug->report->charts['bugsPerSeverity'] = 'Bug Priority Report';
$lang->bug->report->charts['bugsPerResolution'] = 'Bug Solution Report';
$lang->bug->report->charts['bugsPerStatus'] = 'Bug Status Report';
$lang->bug->report->charts['bugsPerActivatedCount'] = 'Bug Activation Report';
$lang->bug->report->charts['bugsPerType'] = 'Bug Type Report';
$lang->bug->report->charts['bugsPerAssignedTo'] = 'Assignment Report';
$lang->bug->report->charts['bugsPerAssignedTo'] = 'Bug Assignment Report';
//$lang->bug->report->charts['bugLiveDays'] = 'Bug Handling Time Report';
//$lang->bug->report->charts['bugHistories'] = 'Bug Handling Steps Report';
@@ -331,7 +331,7 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Handling Steps';
/* 操作记录。*/
$lang->bug->action = new stdclass();
$lang->bug->action->resolved = array('main' => '$date, solved by <strong>$actor</strong> and the solution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
$lang->bug->action->resolved = array('main' => '$date, resolved by <strong>$actor</strong> and the solution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
$lang->bug->action->tostory = array('main' => '$date, transferred by <strong>$actor</strong> to <strong>Story</strong> with ID <strong>$extra</strong>.');
$lang->bug->action->totask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong> with ID <strong>$extra</strong>.');
$lang->bug->action->linked2plan = array('main' => '$date, related by <strong>$actor</strong> to Plan <strong>$extra</strong>.');
+1 -1
View File
@@ -58,7 +58,7 @@ js::set('bugBrowseType', ($browseType == 'bymodule' and $this->session->bugBrows
</ul>
</div>
<div class='btn-group'>
<?php common::printIcon('bug', 'report', "productID=$productID&browseType=$browseType&moduleID=$moduleID"); ?>
<?php common::printIcon('bug', 'report', "productID=$productID&browseType=$browseType&branchID=$branch&moduleID=$moduleID"); ?>
</div>
</div>
<div class='btn-group'>
+2 -2
View File
@@ -41,7 +41,7 @@ $lang->build->unlinkStory = 'Remove Story';
$lang->build->unlinkBug = 'Remove Bug';
$lang->build->stories = 'Finished Story';
$lang->build->bugs = 'Solved Bug';
$lang->build->generatedBugs = 'Generated Bug';
$lang->build->generatedBugs = 'Remained Bug';
$lang->build->noProduct = " <span style='color:red'>This {$lang->projectCommon} has not relateed to {$lang->productCommon}, so Build cannot be created. Please first <a href='%s'> relate {$lang->productCommon}</a></span>";
$lang->build->finishStories = ' %s Stories have been finished.';
@@ -50,7 +50,7 @@ $lang->build->createdBugs = ' %s Bugs have been created.';
$lang->build->placeholder = new stdclass();
$lang->build->placeholder->scmPath = ' Source code repository, e.g. Subversion/Git Library path';
$lang->build->placeholder->filePath = ' Path of this Build package for download.';
$lang->build->placeholder->filePath = ' Path of this Build package for downloading.';
$lang->build->action = new stdclass();
$lang->build->action->buildopened = '$date, created by <strong>$actor</strong>, Build <strong>$extra</strong>.' . "\n";
+10 -10
View File
@@ -54,7 +54,7 @@ $lang->comment = 'Note';
$lang->history = 'History';
$lang->attatch = 'Attachment';
$lang->reverse = 'Reverse';
$lang->switchDisplay = 'Toggle Show';
$lang->switchDisplay = 'Toggle';
$lang->addFiles = 'Add';
$lang->files = 'File ';
$lang->pasteText = 'Paste';
@@ -83,7 +83,7 @@ $lang->loading = 'Loading...';
$lang->notFound = 'Not found!';
$lang->showAll = '[[Show All]]';
$lang->future = 'Coming';
$lang->future = 'Pending';
$lang->year = 'Year';
$lang->workingHour = 'Man-Hour';
@@ -119,7 +119,7 @@ $lang->searchObjects['user'] = 'User';
$lang->searchObjects['build'] = 'Build';
$lang->searchObjects['release'] = 'Release';
$lang->searchObjects['productplan'] = $lang->productCommon . 'Plan';
$lang->searchObjects['testtask'] = 'Testing Build';
$lang->searchObjects['testtask'] = 'Test Task';
$lang->searchObjects['doc'] = 'Document';
$lang->searchTips = 'ID (ctrl+g)';
@@ -163,7 +163,7 @@ $lang->my->menu->index = 'Home|my|index';
$lang->my->menu->todo = array('link' => 'To-Do|my|todo|', 'subModule' => 'todo');
$lang->my->menu->task = array('link' => 'Task|my|task|', 'subModule' => 'task');
$lang->my->menu->bug = array('link' => 'Bug|my|bug|', 'subModule' => 'bug');
$lang->my->menu->testtask = array('link' => 'Testing|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase');
$lang->my->menu->testtask = array('link' => 'Test Task|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase');
$lang->my->menu->story = array('link' => 'Story|my|story|', 'subModule' => 'story');
$lang->my->menu->myProject = "{$lang->projectCommon}|my|project|";
$lang->my->menu->dynamic = 'Dynamic|my|dynamic|';
@@ -184,7 +184,7 @@ $lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->menu->plan = array('link' => 'Plan|productplan|browse|productID=%s', 'subModule' => 'productplan');
$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release');
$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->menu->doc = array('link' => 'Document|product|doc|productID=%s', 'subModule' => 'doc');
$lang->product->menu->doc = array('link' => 'Document|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->menu->branch = '@branch@|branch|manage|productID=%s';
$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story';
$lang->product->menu->view = array('link' => 'Overview|product|view|productID=%s', 'alias' => 'edit');
@@ -213,9 +213,9 @@ $lang->project->menu->story = array('link' => 'Story|project|story|projectID
$lang->project->menu->bug = 'Bug|project|bug|projectID=%s';
$lang->project->menu->dynamic = 'Dynamic|project|dynamic|projectID=%s';
$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build');
$lang->project->menu->testtask = 'Testing|project|testtask|projectID=%s';
$lang->project->menu->testtask = 'Test Task|project|testtask|projectID=%s';
$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers');
$lang->project->menu->doc = array('link' => 'Document|project|doc|porjectID=%s', 'subModule' => 'doc');
$lang->project->menu->doc = array('link' => 'Document|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s';
$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close');
$lang->project->menu->create = array('link' => "<i class='icon-plus'></i>&nbsp;Add{$lang->projectCommon}|project|create", 'float' => 'right');
@@ -310,7 +310,7 @@ $lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModul
$lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak');
$lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron');
$lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action');
$lang->admin->menu->dev = array('link' => 'Reproduct|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor');
$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor');
$lang->admin->menu->sso = 'RangerTeam|admin|sso';
$lang->convert = new stdclass();
@@ -384,7 +384,7 @@ $lang->error->passwordrule = "Password should meet requirements. It should be
$lang->error->accessDenied = 'Access is denied.';
$lang->error->pasteImg = 'Paste Image is not allowed in your browser!';
$lang->error->noData = 'No Data';
$lang->error->editedByOther = 'This record might have been modified. Please refresh and try to edit again!';
$lang->error->editedByOther = 'This record might have been changed. Please refresh and try to edit again!';
$lang->error->tutorialData = 'No data can be imported in tutorial mode. Please exit tutorial first!';
/* 分页信息。*/
@@ -407,7 +407,7 @@ $lang->noticeImport = "<p style='font-size:14px'>Imported data contains data th
$lang->noResultsMatch = "No results match!";
$lang->searchMore = "More results:";
$lang->chooseUsersToMail = "Choose users you want send Email to...";
$lang->chooseUsersToMail = "Choose users you want send notification to...";
$lang->browserNotice = 'Your current browser might not show the best effect. Please use Chrome, Firefox, IE9+, Opera or Safari.';
$lang->noticePasteImg = "Can parse image in editor.";
+1 -1
View File
@@ -585,7 +585,7 @@ class commonModel extends model
{
global $lang;
echo html::a('javascript:;', "<i class='icon-qrcode'></i>", '', "class='qrCode $color' id='qrcodeBtn' title='{$lang->user->mobileLogin}'");
echo "<div class='popover top' id='qrcodePopover'><div class='arrow'></div><h3 class='popover-title'>{$lang->user->mobileLogin}</h3><div class='popover-content'><img src=\"javascript:;\"></div></div>";
echo "<div class='popover top' id='qrcodePopover'><div class='arrow'></div><h3 class='popover-title'>{$lang->user->mobileLogin}</h3><div class='popover-content'><img src='data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'></div></div>";
echo '<script>$(function(){$("#qrcodeBtn").click(function(){$("#qrcodePopover").toggleClass("show");}); $("#wrap").click(function(){$("#qrcodePopover").removeClass("show");});});</script>';
echo '<script>$(function(){$("#qrcodeBtn").hover(function(){$(".popover-content img").attr("src", "' . helper::createLink('misc', 'qrCode') . '");});});</script>';
}
+1
View File
@@ -58,6 +58,7 @@ $(document).ready(function()
if(!this.multiKey && !$(e.target).closest('td[data-index="0"]').length) return false;
}
},
fixedHeader: true,
ready: function()
{
if(!this.$table) return;
+1 -1
View File
@@ -4,4 +4,4 @@
#featurebar ul.nav > li.active .chosen-container a.chosen-single{font-weight:bold}
#featurebar ul.nav > li .chosen-container .chosen-drop {min-width: 300px;!important}
#featurebar .nav > li > .chosen-container-single{top:-1px!important}
.chosen-container-single .chosen-single div{padding: 6px 22px!important}
#featurebar .nav > li > .chosen-container-single .chosen-single div{padding: 6px 22px!important}
+3 -1
View File
@@ -87,7 +87,9 @@ class custom extends control
{
$value = $_POST['values'][$index];
$system = $_POST['systems'][$index];
if(!$system and (!$value or !$key)) continue;
//Fix bug #951.
//if(!$system and (!$value or !$key)) continue;
/* the length of role is 20, check it when save. */
if($module == 'user' and $field == 'roleList' and strlen($key) > 20) die(js::alert($this->lang->custom->notice->userRole));
+3 -3
View File
@@ -14,7 +14,7 @@ $lang->datatable->required = 'Required';
$lang->datatable->branch = 'Branch';
$lang->datatable->platform = 'Platform';
$lang->datatable->showModule = 'Show module in title';
$lang->datatable->showModule = 'Show/Hide Module Name';
$lang->datatable->showModuleList[] = 'N/A';
$lang->datatable->showModuleList['base'] = 'Base node';
$lang->datatable->showModuleList['end'] = 'End node';
$lang->datatable->showModuleList['base'] = 'Base Node';
$lang->datatable->showModuleList['end'] = 'End Node';
+2 -2
View File
@@ -1,5 +1,5 @@
<?php
$lang->dev->common = 'Reproduct';
$lang->dev->common = 'Develop';
$lang->dev->api = 'API';
$lang->dev->db = 'Database';
$lang->dev->editor = 'Editor';
@@ -64,7 +64,7 @@ $lang->dev->tableList['api'] = 'API';
$lang->dev->tableList['backup'] = 'Backup';
$lang->dev->tableList['common'] = 'Common';
$lang->dev->tableList['convert'] = 'Convert';
$lang->dev->tableList['dev'] = 'Reproduct';
$lang->dev->tableList['dev'] = 'Develope';
$lang->dev->tableList['git'] = 'GIT';
$lang->dev->tableList['index'] = 'Home';
$lang->dev->tableList['install'] = 'Install';
+14 -14
View File
@@ -21,7 +21,7 @@ $lang->doc->digest = 'Summary';
$lang->doc->comment = 'Remark';
$lang->doc->type = 'Type';
$lang->doc->content = 'Text';
$lang->doc->keywords = 'Keyword';
$lang->doc->keywords = 'Keywords';
$lang->doc->url = 'URL';
$lang->doc->files = 'File';
$lang->doc->addedBy = 'Added By';
@@ -51,21 +51,21 @@ $lang->doc->delete = 'Delete';
$lang->doc->browse = 'List';
$lang->doc->view = 'Details';
$lang->doc->diff = 'Diff';
$lang->doc->manageType = 'Type';
$lang->doc->editType = 'Edit Type';
$lang->doc->deleteType = 'Delete Type';
$lang->doc->addType = 'Add Type';
$lang->doc->manageType = 'Manage Category';
$lang->doc->editType = 'Edit';
$lang->doc->deleteType = 'Delete';
$lang->doc->addType = 'Add';
$lang->doc->libName = 'Library Name';
$lang->doc->libType = 'Library Type';
$lang->doc->libName = 'Name';
$lang->doc->libType = 'Category';
$lang->doc->custom = 'Custom Library';
$lang->doc->customAB = 'Custom Library';
$lang->doc->createLib = 'Create Library';
$lang->doc->allLibs = 'Library List';
$lang->doc->allLibs = 'Libraries';
$lang->doc->objectLibs = "{$lang->productCommon}/{$lang->projectCommon} Library List";
$lang->doc->showFiles = 'Files Library';
$lang->doc->editLib = 'Edit Library';
$lang->doc->deleteLib = 'Delete Library';
$lang->doc->showFiles = 'File Library';
$lang->doc->editLib = 'Edit';
$lang->doc->deleteLib = 'Delete';
$lang->doc->fixedMenu = 'Fixed In Menu';
$lang->doc->removeMenu = 'Remove From Menu';
@@ -84,13 +84,13 @@ $lang->doc->aclList['open'] = 'Public';
$lang->doc->aclList['custom'] = 'Custom';
$lang->doc->aclList['private'] = 'Private';
$lang->doc->types['text'] = 'Html';
$lang->doc->types['url'] = 'Link';
$lang->doc->types['text'] = 'Text';
$lang->doc->types['url'] = 'URL';
$lang->doc->contentTypeList['html'] = 'HTML';
$lang->doc->contentTypeList['markdown'] = 'MarkDown';
$lang->doc->browseType = 'Browse Type';
$lang->doc->browseType = 'Categories';
$lang->doc->browseTypeList['list'] = 'List';
$lang->doc->browseTypeList['menu'] = 'Menu';
$lang->doc->browseTypeList['tree'] = 'Tree';
+2 -2
View File
@@ -67,9 +67,9 @@ $lang->install->dataRoot = 'Uploaded File Directory';
$lang->install->session = 'Session Save Path';
$lang->install->sessionFail = 'Edit the php.ini file to set session.save_path.';
$lang->install->mkdirWin = '<p>%s directory has to be created.<br /> Run <br /> mkdir %s</p> command line.';
$lang->install->chmodWin = ' "%s" privilege has to be modified.';
$lang->install->chmodWin = ' "%s" privilege has to be changed.';
$lang->install->mkdirLinux = '<p>%s directory has to be created.<br /> Run <br /> mkdir -p %s</p> command line.';
$lang->install->chmodLinux = ' "%s" privilege has to be modified.<br /> Run <br />chmod o=rwx -R %s command line.';
$lang->install->chmodLinux = ' "%s" privilege has to be changed.<br /> Run <br />chmod o=rwx -R %s command line.';
$lang->install->defaultLang = 'Default Lang';
$lang->install->dbHost = 'Database Host';
+7 -4
View File
@@ -307,10 +307,13 @@ class mail extends control
$log = '';
foreach($queueList as $queue)
{
$mailStatus = $this->dao->select('*')->from(TABLE_MAILQUEUE)->where('id')->eq($queue->id)->fetch('status');
if(empty($mailStatus) or $mailStatus != 'wait') continue;
if(!isset($queue->merge) or $queue->merge == false)
{
$mailStatus = $this->dao->select('*')->from(TABLE_MAILQUEUE)->where('id')->eq($queue->id)->fetch('status');
if(empty($mailStatus) or $mailStatus != 'wait') continue;
}
$this->dao->update(TABLE_MAILQUEUE)->set('status')->eq('sending')->where('id')->eq($queue->id)->exec();
$this->dao->update(TABLE_MAILQUEUE)->set('status')->eq('sending')->where('id')->in($queue->id)->exec();
$this->mail->send($queue->toList, $queue->subject, $queue->body, $queue->ccList);
$data = new stdclass();
@@ -321,7 +324,7 @@ class mail extends control
$data->status = 'fail';
$data->failReason = join("\n", $this->mail->getError());
}
$this->dao->update(TABLE_MAILQUEUE)->data($data)->where('id')->eq($queue->id)->exec();
$this->dao->update(TABLE_MAILQUEUE)->data($data)->where('id')->in($queue->id)->exec();
$log .= "Send #$queue->id result is $data->status\n";
if($data->status == 'fail') $log .= "reason is $data->failReason\n";
+2 -2
View File
@@ -28,8 +28,8 @@ $lang->mail->charset = 'Charset';
$lang->mail->accessKey = 'Access Key';
$lang->mail->secretKey = 'Secret Key';
$lang->mail->selectMTA = 'Email MTA';
$lang->mail->smtp = 'SMTP Email';
$lang->mail->selectMTA = 'Select MTA';
$lang->mail->smtp = 'SMTP';
$lang->mail->syncedUser = 'Synchronized';
$lang->mail->unsyncUser = 'Not Synchronized';
+78 -2
View File
@@ -516,12 +516,88 @@ class mailModel extends model
*/
public function getQueue($status = '', $orderBy = 'id_desc', $pager = null)
{
return $this->dao->select('*')->from(TABLE_MAILQUEUE)
$mails = $this->dao->select('*')->from(TABLE_MAILQUEUE)
->where('1=1')
->beginIF($status)->andWhere('status')->eq($status)->fi()
->orderBy($orderBy)
->page($pager)
->fetchAll();
->fetchAll('id');
if($this->app->methodName == 'browse' or $this->config->mail->mta == 'sendcloud') return $mails;
/* Group mails by toList and ccList. */
$groupMails = array();
foreach($mails as $mail)
{
$users = $mail->toList . ',' . $mail->ccList;
$groupMails[$users][] = $mail;
}
/* Merge the mails if a group has more than one mail. */
$queue = array();
foreach($groupMails as $groupMail)
{
if(count($groupMail) == 1) $queue[] = reset($groupMail);
if(count($groupMail) > 1) $queue[] = $this->mergeMails($groupMail);
}
return $queue;
}
/**
* Merge mails.
*
* @param array $mails
* @access public
* @return object
*/
public function mergeMails($mails = array())
{
$mail = new stdClass();
$mail->id = '';
$mail->status = 'wait';
$mail->merge = true;
/* Get first and last mail. */
$firstMail = array_shift($mails);
$lastMail = array_pop($mails);
$mail->id = $firstMail->id;
$mail->toList = $firstMail->toList;
$mail->ccList = $firstMail->ccList;
$mail->subject = $firstMail->subject;
/* Remove html tail for first mail. */
$endPos = strripos($firstMail->body, '</td>');
$mail->body = trim(substr($firstMail->body, 0, $endPos));
/* Merge middle mails. */
if($mails)
{
foreach($mails as $middleMail)
{
$mail->id .= ',' . $middleMail->id;
$mail->subject .= '|' . $middleMail->subject;
/* Remove html head and tail for middle mails. */
$beginPos = strpos($middleMail->body, '</table>');
$mailBody = trim(substr($middleMail->body, $beginPos));
$endPos = strripos($mailBody, '</td>');
$mailBody = trim(substr($mailBody, 0, $endPos));
$mail->body .= ltrim($mailBody, '</table>');
}
}
$mail->id .= ',' . $lastMail->id;
$mail->subject .= '|' . $lastMail->subject;
/* Remove html head for last mail. */
$beginPos = strpos($lastMail->body, '</table>');
$mailBody = substr($lastMail->body, $beginPos);
$mail->body .= trim(ltrim($mailBody, '</table>'));
return $mail;
}
/**
+1 -1
View File
@@ -20,7 +20,7 @@ $lang->product->create = "Create {$lang->productCommon}";
$lang->product->delete = "Delete {$lang->productCommon}";
$lang->product->deleted = "Deleted";
$lang->product->close = "Close";
$lang->product->select = "Please select {$lang->productCommon}";
$lang->product->select = " Select {$lang->productCommon}";
$lang->product->mine = 'My responsibility:';
$lang->product->other = 'Other:';
$lang->product->closed = 'Closed';
+2 -2
View File
@@ -53,7 +53,7 @@
?>
</ul>
</div>
<?php common::printIcon('story', 'report', "productID=$productID&browseType=$browseType&moduleID=$moduleID", '', 'button', 'bar-chart'); ?>
<?php common::printIcon('story', 'report', "productID=$productID&browseType=$browseType&branchID=$branch&moduleID=$moduleID", '', 'button', 'bar-chart'); ?>
</div>
<div class="btn-group" id='createActionMenu'>
<?php
@@ -109,7 +109,7 @@
?>
<tfoot>
<tr>
<td colspan='14'>
<td colspan='13'>
<div class='table-actions clearfix'>
<?php if(count($stories)):?>
<?php echo html::selectButton();?>
+1 -3
View File
@@ -17,8 +17,7 @@
<th class='w-id {sorter:false}'> <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
<th class='w-pri {sorter:false}'> <?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
<th class='w-p30 {sorter:false}'> <?php common::printOrderLink('title', $orderBy, $vars, $lang->story->title);?></th>
<th class='w-70px {sorter:false}'><?php common::printOrderLink('plan', $orderBy, $vars, $lang->story->planAB);?></th>
<th class='w-70px {sorter:false}'><?php common::printOrderLink('source', $orderBy, $vars, $lang->story->source);?></th>
<th class='w-90px {sorter:false}'><?php common::printOrderLink('plan', $orderBy, $vars, $lang->story->planAB);?></th>
<th class='w-user {sorter:false}'><?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
<th class='w-user {sorter:false}'><?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->assignedToAB);?></th>
<th class='w-hour {sorter:false}'><?php common::printOrderLink('estimate', $orderBy, $vars, $lang->story->estimateAB);?></th>
@@ -49,7 +48,6 @@
<?php echo html::a($viewLink, $story->title, null, "style='color: $story->color'");?>
</nobr></td>
<td title="<?php echo $story->planTitle?>"><?php echo $story->planTitle;?></td>
<td><?php echo $lang->story->sourceList[$story->source];?></td>
<td><?php echo zget($users, $story->openedBy, $story->openedBy);?></td>
<td><?php echo zget($users, $story->assignedTo, $story->assignedTo);?></td>
<td><?php echo $story->estimate;?></td>
+5
View File
@@ -220,6 +220,11 @@ class productplan extends control
if(!$plan) die(js::error($this->lang->notFound) . js::locate('back'));
$this->commonAction($plan->product, $plan->branch);
$products = $this->product->getPairs();
$this->loadModel('datatable');
$showModule = !empty($this->config->datatable->productBrowse->showModule) ? $this->config->datatable->productBrowse->showModule : '';
$this->view->modulePairs = $showModule ? $this->loadModel('tree')->getModulePairs($plan->product, 'story', $showModule) : array();
$this->view->title = "PLAN #$plan->id $plan->title/" . $products[$plan->product];
$this->view->position[] = $this->lang->productplan->view;
$this->view->planStories = $this->loadModel('story')->getPlanStories($planID, 'all', $type == 'story' ? $sort : 'id_desc');
+3
View File
@@ -22,3 +22,6 @@ input[type=checkbox].ml-10px{margin-left:10px;}
.dropdown-list > li > a:focus {color: #1a4f85;text-decoration: none;background-color: #ddd;}
.table-actions {padding-left: 5px;}
#planInfo {border-top: 1px solid #ddd;}
#planInfo > div {padding-top: 15px;}
-20
View File
@@ -42,23 +42,3 @@ $(function()
});
});
})
$(document).ready(function()
{
$('.side-handle-btn').click(function()
{
if($(this).parents('.row-table').hasClass('hide-side'))
{
$('.row-table').removeClass('hide-side');
$('.side-handle-btn i').removeClass('icon-collapse-full');
$('.side-handle-btn i').addClass('icon-expand-full');
$.cookie('productPlanSide', 'show', {path: config.webRoot});
}
else
{
$('.side-handle-btn i').removeClass('icon-expand-full');
$('.side-handle-btn i').addClass('icon-collapse-full');
$('.row-table').addClass('hide-side');
$.cookie('productPlanSide', 'hide', {path: config.webRoot});
}
});
});
+5 -5
View File
@@ -21,15 +21,15 @@ $lang->productplan->basicInfo = 'Basic Info';
$lang->productplan->batchEdit = 'Batch Edit';
$lang->productplan->batchUnlink = "Batch Remove";
$lang->productplan->linkStory = "Relate Story";
$lang->productplan->linkStory = "Related Story";
$lang->productplan->unlinkStory = "Remove Story";
$lang->productplan->batchUnlinkStory = "Batch Remove Story";
$lang->productplan->linkedStories = 'Related Story';
$lang->productplan->batchUnlinkStory = "Batch Remove";
$lang->productplan->linkedStories = 'Relate Story';
$lang->productplan->unlinkedStories = 'Unrelated';
$lang->productplan->linkBug = "Relate Bug";
$lang->productplan->unlinkBug = "Remove Bug";
$lang->productplan->batchUnlinkBug = "Batch Remove Bug";
$lang->productplan->batchUnlinkBug = "Batch Remove";
$lang->productplan->linkedBugs = 'Related Bug';
$lang->productplan->unlinkedBugs = 'Unrelated';
@@ -57,6 +57,6 @@ $lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.';
$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.';
$lang->productplan->beginGeEnd = 'ID %s begin time value should not be greater than t.';
$lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired';
$lang->productplan->featureBar['browse']['unexpired'] = 'On Time';
$lang->productplan->featureBar['browse']['all'] = 'All';
$lang->productplan->featureBar['browse']['overdue'] = 'Overdue';
+38 -44
View File
@@ -51,16 +51,13 @@
<ul class='nav nav-tabs'>
<li class='<?php if($type == 'story') echo 'active'?>'><a href='#stories' data-toggle='tab'><?php echo html::icon($lang->icons['story']) . ' ' . $lang->productplan->linkedStories;?></a></li>
<li class='<?php if($type == 'bug') echo 'active'?>'><a href='#bugs' data-toggle='tab'><?php echo html::icon($lang->icons['bug']) . ' ' . $lang->productplan->linkedBugs;?></a></li>
<li><a href='#planInfo' data-toggle='tab'><?php echo html::icon($lang->icons['plan']) . ' ' . $lang->productplan->view;?></a></li>
</ul>
<div class='tab-content'>
<div id='stories' class='tab-pane <?php if($type == 'story') echo 'active'?>'>
<?php if(common::hasPriv('productplan', 'linkStory')):?>
<div class='action'>
<?php echo html::a("javascript:showLink($plan->id, \"story\")", '<i class="icon-link"></i> ' . $lang->productplan->linkStory, '', "class='btn btn-sm btn-primary'");?>
<span class='side-handle-btn'>
<?php $class = $this->cookie->productPlanSide == 'hide' ? 'icon-collapse-full' : 'icon-expand-full'?>
<?php echo html::a('###', "<i class='$class'></i>", '', "class='btn btn-sm'")?>
</span>
</div>
<div class='linkBox'></div>
<?php endif;?>
@@ -71,7 +68,6 @@
<tr>
<th class='w-id {sorter:false}' > <?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?></th>
<th class='w-pri {sorter:false}'> <?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
<th class='w-80px {sorter:false}'> <?php common::printOrderLink('module', $orderBy, $vars, $lang->story->module);?></th>
<th class='{sorter:false}'> <?php common::printOrderLink('title', $orderBy, $vars, $lang->story->title);?></th>
<th class='w-user {sorter:false}'> <?php common::printOrderLink('openedBy', $orderBy, $vars, $lang->openedByAB);?></th>
<th class='w-user {sorter:false}'> <?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->assignedToAB);?></th>
@@ -100,8 +96,10 @@
<?php echo html::a($viewLink, sprintf("%03d", $story->id));?>
</td>
<td><span class='<?php echo 'pri' . zget($lang->story->priList, $story->pri, $story->pri)?>'><?php echo zget($lang->story->priList, $story->pri, $story->pri);?></span></td>
<td class='text-left' title='<?php echo $modules[$story->module]?>'><?php echo $modules[$story->module];?></td>
<td class='text-left nobr' title='<?php echo $story->title?>'><?php echo html::a($viewLink , $story->title);?></td>
<td class='text-left nobr' title='<?php echo $story->title?>'>
<?php if($modulePairs and $story->module) echo "<span title='{$lang->story->module}' class='label label-info label-badge'>{$modulePairs[$story->module]}</span> "?>
<?php echo html::a($viewLink , $story->title);?>
</td>
<td><?php echo zget($users, $story->openedBy);?></td>
<td><?php echo zget($users, $story->assignedTo);?></td>
<td><?php echo $story->estimate;?></td>
@@ -121,7 +119,7 @@
</tbody>
<tfoot>
<tr>
<td colspan='10'>
<td colspan='9'>
<div class='table-actions clearfix'>
<?php if(count($planStories)):?>
<?php echo html::selectButton();?>
@@ -299,10 +297,6 @@
<?php if(common::hasPriv('productplan', 'linkBug')):?>
<div class='action'>
<?php echo html::a("javascript:showLink($plan->id, \"bug\")", '<i class="icon-bug"></i> ' . $lang->productplan->linkBug, '', "class='btn btn-sm btn-primary'");?>
<span class='side-handle-btn'>
<?php $class = $this->cookie->productPlanSide == 'hide' ? 'icon-collapse-full' : 'icon-expand-full'?>
<?php echo html::a('###', "<i class='$class'></i>", '', "class='btn btn-sm'")?>
</span>
</div>
<div class='linkBox'></div>
<?php endif;?>
@@ -366,42 +360,42 @@
</table>
</form>
</div>
<div id='planInfo' class='tab-pane'>
<div>
<fieldset>
<legend><?php echo $lang->productplan->basicInfo?></legend>
<table class='table table-data table-condensed table-borderless'>
<tr>
<th class='w-80px strong'><?php echo $lang->productplan->title;?></th>
<td><?php echo $plan->title;?></td>
</tr>
<?php if($product->type != 'normal'):?>
<tr>
<th><?php echo $lang->product->branch;?></th>
<td><?php echo $branches[$plan->branch];?></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->productplan->begin;?></th>
<td><?php echo $plan->begin;?></td>
</tr>
<tr>
<th><?php echo $lang->productplan->end;?></th>
<td><?php echo $plan->end;?></td>
</tr>
</table>
</fieldset>
<fieldset>
<legend><?php echo $lang->productplan->desc;?></legend>
<div class='article-content'><?php echo $plan->desc;?></div>
</fieldset>
<?php include '../../common/view/action.html.php';?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class='col-side'>
<div class='main main-side'>
<fieldset>
<legend><?php echo $lang->productplan->desc;?></legend>
<div class='article-content'><?php echo $plan->desc;?></div>
</fieldset>
<fieldset>
<legend><?php echo $lang->productplan->basicInfo?></legend>
<table class='table table-data table-condensed table-borderless'>
<tr>
<th class='w-80px strong'><?php echo $lang->productplan->title;?></th>
<td><?php echo $plan->title;?></td>
</tr>
<?php if($product->type != 'normal'):?>
<tr>
<th><?php echo $lang->product->branch;?></th>
<td><?php echo $branches[$plan->branch];?></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->productplan->begin;?></th>
<td><?php echo $plan->begin;?></td>
</tr>
<tr>
<th><?php echo $lang->productplan->end;?></th>
<td><?php echo $plan->end;?></td>
</tr>
</table>
</fieldset>
<?php include '../../common/view/action.html.php';?>
</div>
</div>
</div>
<?php js::set('param', helper::safe64Decode($param))?>
<?php js::set('link', $link)?>
+1 -1
View File
@@ -387,7 +387,7 @@ class project extends control
foreach($mails as $mail) $this->task->sendmail($mail->taskID, $mail->actionID);
/* Locate the browser. */
die(js::locate($this->createLink('project', 'importBug', "projectID=$projectID"), 'parent'));
die(js::locate($this->createLink('project', 'task', "projectID=$projectID"), 'parent'));
}
/* Set browseType, productID, moduleID and queryID. */
+2 -2
View File
@@ -223,7 +223,7 @@ $lang->project->charts->burn->graph->showValues = 0;
$lang->project->placeholder = new stdclass();
$lang->project->placeholder->code = "{$lang->projectCommon} Code";
$lang->project->placeholder->totalLeft = 'Total man-hour remain when start Project';
$lang->project->placeholder->totalLeft = 'Total man-hour remained when start Project';
$lang->project->selectGroup = new stdclass();
$lang->project->selectGroup->done = '(Done)';
@@ -237,7 +237,7 @@ $lang->project->orderList['stage_desc'] = "Stage Desc";
$lang->project->kanban = "Kanban";
$lang->project->printKanban = "Print Kanban";
$lang->project->bugList = "Bug List";
$lang->project->bugList = "Bugs";
$lang->printKanban = new stdclass();
$lang->printKanban->common = 'Print Kanban';
+1 -1
View File
@@ -49,7 +49,7 @@ var browseType = '<?php echo $browseType;?>';
<td class='text-left nobr'><?php common::printLink('bug', 'view', "bugID=$bug->id", $bug->title, '', "class='preview'", true, true);?></td>
<td class='bug-<?php echo $bug->status?>'><?php echo $lang->bug->statusList[$bug->status];?></td>
<td class='td-has-control'><?php echo html::select("pri[$bug->id]", $lang->task->priList, 3, "class='input-sm form-control'");?></td>
<td class='td-has-control' class='text-left' style='overflow:visible'><?php echo html::select("assignedTo[$bug->id]", $users, zget($users, $bug->assignedTo, '', $bug->assignedTo), "class='input-sm form-control chosen'");?></td>
<td class='td-has-control text-left' style='overflow:visible'><?php echo html::select("assignedTo[$bug->id]", $users, zget($users, $bug->assignedTo, '', $bug->assignedTo), "class='input-sm form-control chosen'");?></td>
<td class='td-has-control'><?php echo html::input("estimate[$bug->id]", '', 'size=4 class="input-sm form-control"');?></td>
</tr>
<?php endforeach;?>
+2 -2
View File
@@ -17,7 +17,7 @@ $lang->release->linkBug = "Relate Bug";
$lang->release->delete = "Delete";
$lang->release->deleted = 'Deleted';
$lang->release->view = "Info";
$lang->release->browse = "Browse";
$lang->release->browse = "Releases";
$lang->release->changeStatus = "Change Status";
$lang->release->batchUnlink = "Batch Unrelate";
$lang->release->batchUnlinkStory = "Batch Unrelate";
@@ -41,7 +41,7 @@ $lang->release->unlinkStory = 'Remove Story';
$lang->release->unlinkBug = 'Remove Bug';
$lang->release->stories = 'Finished Story';
$lang->release->bugs = 'Solved Bug';
$lang->release->generatedBugs = 'Generated Bug';
$lang->release->generatedBugs = 'Remained Bug';
$lang->release->finishStories = 'Finished %s Story';
$lang->release->resolvedBugs = 'Solved %s Bug';
$lang->release->createdBugs = 'Generated %s Bug';
+1 -1
View File
@@ -47,7 +47,7 @@ $config->story->custom->batchCreateFields = 'module,plan,spec,pri,estimate,revie
$config->story->custom->batchEditFields = 'module,plan,estimate,pri,source,stage,closedBy,closedReason';
$config->story->datatable = new stdclass();
$config->story->datatable->defaultField = array('id', 'pri', 'title', 'plan', 'source', 'openedBy', 'assignedTo', 'estimate', 'status', 'stage', 'actions');
$config->story->datatable->defaultField = array('id', 'pri', 'title', 'plan', 'source', 'openedBy', 'assignedTo', 'estimate', 'status', 'stage', 'taskCount', 'bugCount', 'caseCount', 'actions');
$config->story->datatable->fieldList['id']['title'] = 'idAB';
$config->story->datatable->fieldList['id']['fixed'] = 'left';
+3 -2
View File
@@ -1240,11 +1240,12 @@ class story extends control
*
* @param int $productID
* @param string $browseType
* @param int $branchID
* @param int $moduleID
* @access public
* @return void
*/
public function report($productID, $browseType, $moduleID)
public function report($productID, $browseType, $branchID, $moduleID)
{
$this->loadModel('report');
$this->view->charts = array();
@@ -1264,7 +1265,7 @@ class story extends control
}
}
$this->products = $this->product->getPairs();
$this->product->setMenu($this->products, $productID);
$this->product->setMenu($this->products, $productID, $branchID);
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->story->reportChart;
$this->view->position[] = $this->products[$productID];
+17 -17
View File
@@ -12,7 +12,7 @@
$lang->story->create = "Create";
$lang->story->batchCreate = "Batch Create";
$lang->story->change = "Change";
$lang->story->changed = 'Changed Story';
$lang->story->changed = 'Change';
$lang->story->review = 'Review';
$lang->story->batchReview = 'Batch Review';
$lang->story->edit = "Edit";
@@ -32,7 +32,7 @@ $lang->story->caseCount = 'Test Cases';
$lang->story->taskCountAB = 'T';
$lang->story->bugCountAB = 'B';
$lang->story->caseCountAB = 'C';
$lang->story->linkStory = 'Related Story';
$lang->story->linkStory = 'Relate Story';
$lang->story->unlinkStory = 'Unrelated';
$lang->story->export = "Export Data";
$lang->story->zeroCase = "Zero Case";
@@ -102,7 +102,7 @@ $lang->story->statusList['closed'] = 'Closed';
$lang->story->statusList['changed'] = 'Changed';
$lang->story->stageList[''] = '';
$lang->story->stageList['wait'] = 'Pending';
$lang->story->stageList['wait'] = 'Wait';
$lang->story->stageList['planned'] = 'Planned';
$lang->story->stageList['projected'] = 'Projected';
$lang->story->stageList['developing'] = 'Developing';
@@ -172,7 +172,7 @@ $lang->story->lblReview = 'Review';
$lang->story->lblActivate = 'Activate';
$lang->story->lblClose = 'Close';
$lang->story->checkAffection = 'Check Impact';
$lang->story->checkAffection = 'Impact';
$lang->story->affectedProjects = 'Affected' . $lang->projectCommon;
$lang->story->affectedBugs = 'Affected Bug';
$lang->story->affectedCases = 'Affected Case';
@@ -210,22 +210,22 @@ $lang->story->action->unlinkchildstory = array('main' => '$date, removed by <
/* 统计报表。*/
$lang->story->report = new stdclass();
$lang->story->report->common = 'Report';
$lang->story->report->select = 'Please select the type of Report';
$lang->story->report->select = 'Select the type of Story Report';
$lang->story->report->create = 'Generate';
$lang->story->report->value = 'Story Count';
$lang->story->report->charts['storysPerProduct'] = $lang->productCommon . 'Story Count';
$lang->story->report->charts['storysPerModule'] = 'Story per Module';
$lang->story->report->charts['storysPerSource'] = 'Story per Source';
$lang->story->report->charts['storysPerPlan'] = 'Story per Plan';
$lang->story->report->charts['storysPerStatus'] = 'Story per Status';
$lang->story->report->charts['storysPerStage'] = 'Story per Stage';
$lang->story->report->charts['storysPerPri'] = 'Story per Priority';
$lang->story->report->charts['storysPerEstimate'] = 'Story per Estimated Man-Hour';
$lang->story->report->charts['storysPerOpenedBy'] = 'Story per CreatedBy';
$lang->story->report->charts['storysPerAssignedTo'] = 'Story per AssignedTo';
$lang->story->report->charts['storysPerClosedReason'] = 'Story per Closed Reason';
$lang->story->report->charts['storysPerChange'] = 'Story per Change';
$lang->story->report->charts['storysPerProduct'] = 'per ' . $lang->productCommon;
$lang->story->report->charts['storysPerModule'] = 'per Module';
$lang->story->report->charts['storysPerSource'] = 'per Source';
$lang->story->report->charts['storysPerPlan'] = 'per Plan';
$lang->story->report->charts['storysPerStatus'] = 'per Status';
$lang->story->report->charts['storysPerStage'] = 'per Stage';
$lang->story->report->charts['storysPerPri'] = 'per Priority';
$lang->story->report->charts['storysPerEstimate'] = 'per Estimated Man-Hour';
$lang->story->report->charts['storysPerOpenedBy'] = 'per CreatedBy';
$lang->story->report->charts['storysPerAssignedTo'] = 'per AssignedTo';
$lang->story->report->charts['storysPerClosedReason'] = 'per Closed Reason';
$lang->story->report->charts['storysPerChange'] = 'per Change';
$lang->story->report->options = new stdclass();
$lang->story->report->options->graph = new stdclass();
+7 -2
View File
@@ -1,4 +1,7 @@
<?php include '../../common/view/header.lite.html.php';?>
<?php
include '../../common/view/header.lite.html.php';
include '../../common/view/chart.html.php';
?>
<div id='titlebar'>
<div class='heading'>
<span><?php echo html::icon($lang->icons['report']);?></span>
@@ -10,7 +13,7 @@
<table class='table table-fixed'>
<thead>
<tr class='text-center'>
<th class='w-20px'> <?php echo $lang->idAB;?></th>
<th class='w-40px'> <?php echo $lang->idAB;?></th>
<th class='w-p30'> <?php echo $lang->task->name;?></th>
<th class='w-pri'> <?php echo $lang->priAB;?></th>
<th class='w-status'><?php echo $lang->statusAB;?></th>
@@ -18,6 +21,7 @@
<th class='w-40px'> <?php echo $lang->task->estimateAB;?></th>
<th class='w-40px'> <?php echo $lang->task->consumedAB;?></th>
<th class='w-40px'> <?php echo $lang->task->leftAB;?></th>
<th class='w-40px'> <?php echo $lang->task->progess;?></th>
</tr>
</thead>
<tbody>
@@ -31,6 +35,7 @@
<td><?php echo $task->estimate;?></td>
<td><?php echo $task->consumed;?></td>
<td><?php echo $task->left;?></td>
<td><div class='progress-pie' title="<?php echo $task->progess?>%" data-value='<?php echo $task->progess;?>'></div></td>
</tr>
<?php endforeach;?>
</tbody>
+14 -14
View File
@@ -165,23 +165,23 @@ $lang->task->error->consumed = 'Task: %s man-hour must be more than 0. I
/* 统计报表。*/
$lang->task->report = new stdclass();
$lang->task->report->common = 'Report';
$lang->task->report->select = 'Please select the type of the Task';
$lang->task->report->select = 'Select the type of Task Report';
$lang->task->report->create = 'Create';
$lang->task->report->value = 'Task Count';
$lang->task->report->charts['tasksPerProject'] = $lang->projectCommon . ' Tasks';
$lang->task->report->charts['tasksPerModule'] = 'Modules';
$lang->task->report->charts['tasksPerAssignedTo'] = 'Assigned To';
$lang->task->report->charts['tasksPerType'] = 'Type';
$lang->task->report->charts['tasksPerPri'] = 'Priority';
$lang->task->report->charts['tasksPerStatus'] = 'Status';
$lang->task->report->charts['tasksPerDeadline'] = 'Deadline';
$lang->task->report->charts['tasksPerEstimate'] = 'Estimation';
$lang->task->report->charts['tasksPerLeft'] = 'Remained';
$lang->task->report->charts['tasksPerConsumed'] = 'onsumed';
$lang->task->report->charts['tasksPerFinishedBy'] = 'Finished By';
$lang->task->report->charts['tasksPerClosedReason'] = 'Close Reason';
$lang->task->report->charts['finishedTasksPerDay'] = 'Finished per Day';
$lang->task->report->charts['tasksPerProject'] = 'per ' . $lang->projectCommon;
$lang->task->report->charts['tasksPerModule'] = 'per Module';
$lang->task->report->charts['tasksPerAssignedTo'] = 'per AssignedTo';
$lang->task->report->charts['tasksPerType'] = 'per Category';
$lang->task->report->charts['tasksPerPri'] = 'per Priority';
$lang->task->report->charts['tasksPerStatus'] = 'per Status';
$lang->task->report->charts['tasksPerDeadline'] = 'per Deadline';
$lang->task->report->charts['tasksPerEstimate'] = 'per Estimated Man-Hour';
$lang->task->report->charts['tasksPerLeft'] = 'per Remained Man-Hour';
$lang->task->report->charts['tasksPerConsumed'] = 'per Consumed Man-Hour';
$lang->task->report->charts['tasksPerFinishedBy'] = 'per FinishedBy';
$lang->task->report->charts['tasksPerClosedReason'] = 'per Close Reason';
$lang->task->report->charts['finishedTasksPerDay'] = 'per Finished/Day';
$lang->task->report->options = new stdclass();
$lang->task->report->options->graph = new stdclass();
+20 -1
View File
@@ -989,12 +989,31 @@ class taskModel extends model
*/
public function getStoryTasks($storyID, $projectID = 0)
{
return $this->dao->select('id, name, assignedTo, pri, status, estimate, consumed, `left`')
$tasks = $this->dao->select('id, name, assignedTo, pri, status, estimate, consumed, `left`')
->from(TABLE_TASK)
->where('story')->eq((int)$storyID)
->andWhere('deleted')->eq(0)
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
->fetchAll('id');
foreach($tasks as $task)
{
/* Compute task progess. */
if($task->consumed == 0 and $task->left == 0)
{
$task->progess = 0;
}
elseif($task->consumed != 0 and $task->left == 0)
{
$task->progess = 100;
}
else
{
$task->progess = round($task->consumed / ($task->consumed + $task->left), 2) * 100;
}
}
return $tasks;
}
/**
+3
View File
@@ -281,6 +281,7 @@ class testtaskModel extends model
->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id')
->leftJoin(TABLE_STORY)->alias('t3')->on('t2.story = t3.id')
->where('t1.task')->eq((int)$taskID)
->andWhere('t2.deleted')->eq(0)
->beginIF($moduleID)->andWhere('t2.module')->in($moduleID)->fi()
->orderBy($orderBy)
->page($pager)
@@ -304,6 +305,7 @@ class testtaskModel extends model
->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id')
->where('t1.task')->eq((int)$taskID)
->andWhere('t1.assignedTo')->eq($user)
->andWhere('t2.deleted')->eq(0)
->beginIF($modules)->andWhere('t2.module')->in($modules)->fi()
->orderBy($orderBy)
->page($pager)
@@ -367,6 +369,7 @@ class testtaskModel extends model
->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id')
->where($caseQuery)
->andWhere('t1.task')->eq($task->id)
->andWhere('t2.deleted')->eq(0)
->beginIF($queryProductID != 'all')->andWhere('t2.product')->eq($queryProductID)->fi()
->beginIF($task->branch)->andWhere('t2.branch')->in("0,{$task->branch}")->fi()
->orderBy(strpos($sort, 'assignedTo') !== false ? ('t1.' . $sort) : ('t2.' . $sort))
+9 -9
View File
@@ -15,13 +15,13 @@ $lang->tree->edit = 'Edit';
$lang->tree->delete = 'Delete';
$lang->tree->browse = 'General Module';
$lang->tree->browseTask = 'Task Module';
$lang->tree->manage = 'Module';
$lang->tree->manage = 'Manage Module';
$lang->tree->fix = 'Fix';
$lang->tree->manageProduct = "Manage {$lang->productCommon} Module";
$lang->tree->manageProject = "Manage {$lang->projectCommon} Project";
$lang->tree->manageBug = 'Manage Bug Module';
$lang->tree->manageCase = 'Manage Case Module';
$lang->tree->manageCustomDoc = 'Manage DocLib Type';
$lang->tree->manageProduct = "Manage {$lang->productCommon}";
$lang->tree->manageProject = "Manage {$lang->projectCommon}";
$lang->tree->manageBug = 'Manage Bug';
$lang->tree->manageCase = 'Manage Case';
$lang->tree->manageCustomDoc = 'Manage DocLib';
$lang->tree->updateOrder = 'Update Order';
$lang->tree->manageChild = 'Manage Child Module';
$lang->tree->manageStoryChild = 'Manage Child Story';
@@ -30,8 +30,8 @@ $lang->tree->manageCaseChild = 'Manage Child Case';
$lang->tree->manageTaskChild = "Manage Child {$lang->projectCommon}";
$lang->tree->syncFromProduct = 'Copy';
$lang->tree->dragAndSort = "Drag and Sort";
$lang->tree->sort = "Ranking";
$lang->tree->addChild = "Add Child Module";
$lang->tree->sort = "Sort";
$lang->tree->addChild = "Add Child";
$lang->tree->confirmDelete = 'Do you want to delete this Module and its Children?';
$lang->tree->confirmRoot = "Changes on {$lang->productCommon} will change the Story, Bug, Case of {$lang->productCommon} it belongs to, as well as the realtion of {$lang->projectCommon} and {$lang->productCommon}, which is dangerous, please be aware of it. Do you want to change?";
@@ -44,7 +44,7 @@ $lang->tree->parent = 'Parent';
$lang->tree->child = 'Child';
$lang->tree->owner = 'Owner';
$lang->tree->order = 'Order';
$lang->tree->short = 'Short';
$lang->tree->short = 'Sort';
$lang->tree->all = 'All Modules';
$lang->tree->projectDoc = "{$lang->projectCommon} Doc";
$lang->tree->product = $lang->productCommon;
+2 -2
View File
@@ -34,8 +34,8 @@
</a>
</div>
<div class='col-md-4'>
<a class="card ad" href="http://www.yidouio.com" target="_blank">
<div class="img-wrapper" style="background-image:url(<?php echo $defaultTheme . 'images/main/yidou.png'?>)"><img src="<?php echo $defaultTheme . 'images/main/yidou.png'?>" alt=""></div>
<a class="card ad" href="http://www.zdoo.com" target="_blank">
<div class="img-wrapper" style="background-image:url(<?php echo $defaultTheme . 'images/main/zdoo.png'?>)"><img src="<?php echo $defaultTheme . 'images/main/zdoo.png'?>" alt=""></div>
</a>
</div>
</div>
+11 -5
View File
@@ -1434,12 +1434,18 @@ function checkOnlybodyPage()
*/
function fixedTfootAction(formID)
{
if($(formID).size() == 0) return false;
if($(formID).find('table:last').find('tfoot').size() == 0) return false;
var $form = $(formID);
if(!$form.length) return false;
var $table = $form.find('table:last');
var $tfoot = $table.find('tfoot');
if($table.hasClass('table-datatable'))
{
$table = $form.find('.datatable-rows');
$tfoot = $form.find('.datatable-footer tfoot');
}
if(!$tfoot.length) return false;
var $table = $(formID).find('table:last'),
$tfoot = $table.find('tfoot'),
$tbody = $table.find('tbody'),
var $tbody = $table.find('tbody'),
$inputGroup = $tfoot.find('.table-actions').children('.input-group'),
pageFooterHeight = $('#footer').height(),
tableWidth,
+3 -2
View File
@@ -117,7 +117,7 @@ hr.small {margin: 10px 0}
.table caption {padding: 8px 20px; border: 1px solid #DDD; border-bottom: 0; background: #fafafa;}
.table.table-condensed caption {padding: 6px 15px;}
.table td.td-has-control {padding: 2px 4px;}
.table td.td-has-control {padding: 2px 4px; background-color: white!important}
/* Datepicker */
.datepicker-wrapper {position: relative; cursor: pointer;}
@@ -453,7 +453,8 @@ body {color:#141414; padding-bottom: 40px;}
#footer {position: relative; width:100%;position:fixed; bottom:0; left:0; margin:0; border-top: 1px solid #ddd; background:#eef4fe;height:40px; line-height:40px;-webkit-box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05); z-index: 10}
#crumbs a i.icon-home{display: none;}
#crumbs {float: left;margin-left: 20px;}
#crumbs .icon-angle-right{margin-right: 6px;}
#crumbs > a {display: inline-block; margin-right: -4px;}
#crumbs .icon-angle-right {margin: 0; position: relative; top: 1px;}
#footer #poweredby {float: right; margin-right: 20px;}
#qrcodePopover.show {display: block; position: fixed; right: 5px; bottom: 40px; left: inherit; top: inherit; max-width: 300px}
#qrcodePopover.popover.top .arrow {left: inherit; right: 10px}