Merge branch 'master' of git@github.com:easysoft/zentaopms
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `zt_project` DROP `goal`;
|
||||
ALTER TABLE `zt_build` ADD `packageType` varchar(10) COLLATE 'utf8_general_ci' NOT NULL DEFAULT 'path' AFTER `scmPath`;
|
||||
@@ -408,7 +408,7 @@ class router
|
||||
{
|
||||
$this->appRoot = realpath($appRoot) . $this->pathFix;
|
||||
}
|
||||
if(!is_dir($this->appRoot)) $this->triggerError("The app you call not noud in {$this->appRoot}", __FILE__, __LINE__, $exit = true);
|
||||
if(!is_dir($this->appRoot)) $this->triggerError("The app you call not found in {$this->appRoot}", __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1588,6 +1588,9 @@ class router
|
||||
*/
|
||||
public function saveError($level, $message, $file, $line)
|
||||
{
|
||||
/* Skip the error: Redefining already defined constructor. */
|
||||
if(strpos($message, 'Redefining') !== false) return true;
|
||||
|
||||
/* Set the error info. */
|
||||
$errorLog = "\n" . date('H:i:s') . " $message in <strong>$file</strong> on line <strong>$line</strong> ";
|
||||
$errorLog .= "when visiting <strong>" . $this->getURI() . "</strong>\n";
|
||||
@@ -1603,6 +1606,18 @@ class router
|
||||
$fh = @fopen($errorFile, 'a');
|
||||
if($fh) fwrite($fh, strip_tags($errorLog)) && fclose($fh);
|
||||
|
||||
/* If the debug > 1, show warning, notice error. */
|
||||
if($level == E_NOTICE or $level == E_WARNING or $level == E_STRICT or $level == 8192) // 8192: E_DEPRECATED
|
||||
{
|
||||
if(!empty($this->config->debug) and $this->config->debug > 1)
|
||||
{
|
||||
$cmd = "vim +$line $file";
|
||||
$size = strlen($cmd);
|
||||
echo "<pre class='alert alert-danger'>$message: ";
|
||||
echo "<input type='text' value='$cmd' size='$size' style='border:none; background:none;' onclick='this.select();' /></pre>";
|
||||
}
|
||||
}
|
||||
|
||||
/* If error level is serious, die. */
|
||||
if($level == E_ERROR or $level == E_PARSE or $level == E_CORE_ERROR or $level == E_COMPILE_ERROR or $level == E_USER_ERROR)
|
||||
{
|
||||
|
||||
+15
-22
@@ -582,7 +582,8 @@ class bug extends control
|
||||
$this->lang->set('menugroup.bug', 'my');
|
||||
$this->lang->bug->menuOrder = $this->lang->my->menuOrder;
|
||||
$this->loadModel('my')->setMenu();
|
||||
$this->view->title = "BUG" . $this->lang->bug->batchEdit;
|
||||
$this->view->position[] = html::a($this->createLink('my', 'bug'), $this->lang->my->bug);
|
||||
$this->view->title = "BUG" . $this->lang->bug->batchEdit;
|
||||
}
|
||||
/* Initialize vars.*/
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
@@ -1033,6 +1034,7 @@ class bug extends control
|
||||
$this->view->bug = $bug;
|
||||
$this->view->action = $action;
|
||||
$this->view->users = $this->user->getPairs('noletter');
|
||||
$this->clear();
|
||||
$mailContent = $this->parse($this->moduleName, 'sendmail');
|
||||
|
||||
/* Send it. */
|
||||
@@ -1112,7 +1114,7 @@ class bug extends control
|
||||
$relatedTasks = $this->dao->select('id, name')->from(TABLE_TASK)->where('id')->in($relatedTaskIdList)->fetchPairs();
|
||||
$relatedBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('id')->in($relatedBugIdList)->fetchPairs();
|
||||
$relatedCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('id')->in($relatedCaseIdList)->fetchPairs();
|
||||
$relatedBuilds = $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
|
||||
$relatedBuilds = array('trunk' => 'Trunk') + $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
|
||||
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('bug')->andWhere('objectID')->in(@array_keys($bugs))->fetchGroup('objectID');
|
||||
|
||||
foreach($bugs as $bug)
|
||||
@@ -1127,13 +1129,14 @@ class bug extends control
|
||||
}
|
||||
|
||||
/* fill some field with useful value. */
|
||||
if(isset($products[$bug->product])) $bug->product = $products[$bug->product];
|
||||
if(isset($projects[$bug->project])) $bug->project = $projects[$bug->project];
|
||||
if(isset($relatedModules[$bug->module])) $bug->module = $relatedModules[$bug->module];
|
||||
if(isset($relatedStories[$bug->story])) $bug->story = $relatedStories[$bug->story];
|
||||
if(isset($relatedTasks[$bug->task])) $bug->task = $relatedTasks[$bug->task];
|
||||
if(isset($relatedBugs[$bug->duplicateBug])) $bug->duplicateBug = $relatedBugs[$bug->duplicateBug];
|
||||
if(isset($relatedCases[$bug->case])) $bug->case = $relatedCases[$bug->case];
|
||||
if(isset($products[$bug->product])) $bug->product = $products[$bug->product] . "(#$bug->product)";
|
||||
if(isset($projects[$bug->project])) $bug->project = $projects[$bug->project] . "(#$bug->project)";
|
||||
if(isset($relatedModules[$bug->module])) $bug->module = $relatedModules[$bug->module] . "(#$bug->module)";
|
||||
if(isset($relatedStories[$bug->story])) $bug->story = $relatedStories[$bug->story] . "(#$bug->story)";
|
||||
if(isset($relatedTasks[$bug->task])) $bug->task = $relatedTasks[$bug->task] . "($bug->task)";
|
||||
if(isset($relatedBugs[$bug->duplicateBug])) $bug->duplicateBug = $relatedBugs[$bug->duplicateBug] . "($bug->duplicateBug)";
|
||||
if(isset($relatedCases[$bug->case])) $bug->case = $relatedCases[$bug->case] . "($bug->case)";
|
||||
if(isset($relatedBuilds[$bug->resolvedBuild])) $bug->resolvedBuild = $relatedBuilds[$bug->resolvedBuild] . "(#$bug->resolvedBuild)";
|
||||
|
||||
if(isset($bugLang->priList[$bug->pri])) $bug->pri = $bugLang->priList[$bug->pri];
|
||||
if(isset($bugLang->typeList[$bug->type])) $bug->type = $bugLang->typeList[$bug->type];
|
||||
@@ -1173,20 +1176,10 @@ class bug extends control
|
||||
foreach($buildIdList as $buildID)
|
||||
{
|
||||
$buildID = trim($buildID);
|
||||
$tmpOpenedBuilds[] = isset($relatedBuilds[$buildID]) ? $relatedBuilds[$buildID] : $buildID;
|
||||
$tmpOpenedBuilds[] = isset($relatedBuilds[$buildID]) ? $relatedBuilds[$buildID] . "(#$buildID)" : $buildID;
|
||||
}
|
||||
$bug->openedBuild = join("; \n", $tmpOpenedBuilds);
|
||||
}
|
||||
|
||||
if($bug->resolvedBuild)
|
||||
{
|
||||
$buildIdList = explode(',', $bug->resolvedBuild);
|
||||
foreach($buildIdList as $buildID)
|
||||
{
|
||||
$buildID = trim($buildID);
|
||||
$tmpResolvedBuilds[] = isset($relatedBuilds[$buildID]) ? $relatedBuilds[$buildID] : $buildID;
|
||||
}
|
||||
$bug->resolvedBuild = join("; \n", $tmpResolvedBuilds);
|
||||
$bug->openedBuild = join("\n", $tmpOpenedBuilds);
|
||||
if($this->post->fileType == 'html') $bug->openedBuild = nl2br($bug->openedBuild);
|
||||
}
|
||||
|
||||
/* Set related files. */
|
||||
|
||||
+14
-11
@@ -176,16 +176,17 @@ $lang->bug->priList[4] = '4';
|
||||
$lang->bug->osList[''] = '';
|
||||
$lang->bug->osList['all'] = 'All';
|
||||
$lang->bug->osList['windows'] = 'Windows';
|
||||
$lang->bug->osList['winxp'] = 'Windows XP';
|
||||
$lang->bug->osList['win8'] = 'Windows 8';
|
||||
$lang->bug->osList['win7'] = 'Windows 7';
|
||||
$lang->bug->osList['vista'] = 'Windows Vista';
|
||||
$lang->bug->osList['win2000'] = 'Windows 2000';
|
||||
$lang->bug->osList['win2003'] = 'Windows 2003';
|
||||
$lang->bug->osList['winxp'] = 'Windows XP';
|
||||
$lang->bug->osList['win2012'] = 'Windows 2012';
|
||||
$lang->bug->osList['win2008'] = 'Windows 2008';
|
||||
$lang->bug->osList['winnt'] = 'Windows NT';
|
||||
$lang->bug->osList['win98'] = 'Windows 98';
|
||||
$lang->bug->osList['win2003'] = 'Windows 2003';
|
||||
$lang->bug->osList['win2000'] = 'Windows 2000';
|
||||
$lang->bug->osList['andriod'] = 'Andriod';
|
||||
$lang->bug->osList['ios'] = 'IOS';
|
||||
$lang->bug->osList['wp8'] = 'WP8';
|
||||
$lang->bug->osList['wp7'] = 'WP7';
|
||||
$lang->bug->osList['symbian'] = 'Symbian';
|
||||
$lang->bug->osList['linux'] = 'Linux';
|
||||
@@ -197,19 +198,21 @@ $lang->bug->osList['others'] = 'Others';
|
||||
$lang->bug->browserList[''] = '';
|
||||
$lang->bug->browserList['all'] = 'All';
|
||||
$lang->bug->browserList['ie'] = 'IE';
|
||||
$lang->bug->browserList['ie8'] = 'IE8';
|
||||
$lang->bug->browserList['ie11'] = 'IE11';
|
||||
$lang->bug->browserList['ie10'] = 'IE10';
|
||||
$lang->bug->browserList['ie9'] = 'IE9';
|
||||
$lang->bug->browserList['ie6'] = 'IE6';
|
||||
$lang->bug->browserList['ie8'] = 'IE8';
|
||||
$lang->bug->browserList['ie7'] = 'IE7';
|
||||
$lang->bug->browserList['ie6'] = 'IE6';
|
||||
$lang->bug->browserList['chrome'] = 'chrome';
|
||||
$lang->bug->browserList['firefox'] = 'Firefox';
|
||||
$lang->bug->browserList['firefox2'] = 'Firefox2';
|
||||
$lang->bug->browserList['firefox3'] = 'Firefox3';
|
||||
$lang->bug->browserList['firefox4'] = 'Firefox4';
|
||||
$lang->bug->browserList['firefox3'] = 'Firefox3';
|
||||
$lang->bug->browserList['firefox2'] = 'Firefox2';
|
||||
$lang->bug->browserList['opera'] = 'opera';
|
||||
$lang->bug->browserList['opera9'] = 'opera9';
|
||||
$lang->bug->browserList['oprea10'] = 'opera10';
|
||||
$lang->bug->browserList['oprea11'] = 'opera11';
|
||||
$lang->bug->browserList['oprea10'] = 'opera10';
|
||||
$lang->bug->browserList['opera9'] = 'opera9';
|
||||
$lang->bug->browserList['safari'] = 'safari';
|
||||
$lang->bug->browserList['maxthon'] = '傲游';
|
||||
$lang->bug->browserList['uc'] = 'UC';
|
||||
|
||||
+14
-11
@@ -176,16 +176,17 @@ $lang->bug->priList[4] = '4';
|
||||
$lang->bug->osList[''] = '';
|
||||
$lang->bug->osList['all'] = '全部';
|
||||
$lang->bug->osList['windows'] = 'Windows';
|
||||
$lang->bug->osList['winxp'] = 'Windows XP';
|
||||
$lang->bug->osList['win8'] = 'Windows 8';
|
||||
$lang->bug->osList['win7'] = 'Windows 7';
|
||||
$lang->bug->osList['vista'] = 'Windows Vista';
|
||||
$lang->bug->osList['win2000'] = 'Windows 2000';
|
||||
$lang->bug->osList['win2003'] = 'Windows 2003';
|
||||
$lang->bug->osList['winxp'] = 'Windows XP';
|
||||
$lang->bug->osList['win2012'] = 'Windows 2012';
|
||||
$lang->bug->osList['win2008'] = 'Windows 2008';
|
||||
$lang->bug->osList['winnt'] = 'Windows NT';
|
||||
$lang->bug->osList['win98'] = 'Windows 98';
|
||||
$lang->bug->osList['win2003'] = 'Windows 2003';
|
||||
$lang->bug->osList['win2000'] = 'Windows 2000';
|
||||
$lang->bug->osList['andriod'] = 'Andriod';
|
||||
$lang->bug->osList['ios'] = 'IOS';
|
||||
$lang->bug->osList['wp8'] = 'WP8';
|
||||
$lang->bug->osList['wp7'] = 'WP7';
|
||||
$lang->bug->osList['symbian'] = 'Symbian';
|
||||
$lang->bug->osList['linux'] = 'Linux';
|
||||
@@ -197,19 +198,21 @@ $lang->bug->osList['others'] = '其他';
|
||||
$lang->bug->browserList[''] = '';
|
||||
$lang->bug->browserList['all'] = '全部';
|
||||
$lang->bug->browserList['ie'] = 'IE系列';
|
||||
$lang->bug->browserList['ie8'] = 'IE8';
|
||||
$lang->bug->browserList['ie11'] = 'IE11';
|
||||
$lang->bug->browserList['ie10'] = 'IE10';
|
||||
$lang->bug->browserList['ie9'] = 'IE9';
|
||||
$lang->bug->browserList['ie6'] = 'IE6';
|
||||
$lang->bug->browserList['ie8'] = 'IE8';
|
||||
$lang->bug->browserList['ie7'] = 'IE7';
|
||||
$lang->bug->browserList['ie6'] = 'IE6';
|
||||
$lang->bug->browserList['chrome'] = 'chrome';
|
||||
$lang->bug->browserList['firefox'] = 'firefox系列';
|
||||
$lang->bug->browserList['firefox2'] = 'firefox2';
|
||||
$lang->bug->browserList['firefox3'] = 'firefox3';
|
||||
$lang->bug->browserList['firefox4'] = 'firefox4';
|
||||
$lang->bug->browserList['firefox3'] = 'firefox3';
|
||||
$lang->bug->browserList['firefox2'] = 'firefox2';
|
||||
$lang->bug->browserList['opera'] = 'opera系列';
|
||||
$lang->bug->browserList['opera9'] = 'opera9';
|
||||
$lang->bug->browserList['oprea10'] = 'opera10';
|
||||
$lang->bug->browserList['oprea11'] = 'opera11';
|
||||
$lang->bug->browserList['oprea10'] = 'opera10';
|
||||
$lang->bug->browserList['opera9'] = 'opera9';
|
||||
$lang->bug->browserList['safari'] = 'safari';
|
||||
$lang->bug->browserList['maxthon'] = '傲游';
|
||||
$lang->bug->browserList['uc'] = 'UC';
|
||||
|
||||
+12
-1
@@ -77,6 +77,11 @@ class bugModel extends model
|
||||
$now = helper::now();
|
||||
$data = fixer::input('post')->get();
|
||||
$actions = array();
|
||||
|
||||
$stmt = $this->dbh->query($this->loadModel('tree')->buildMenuQuery($productID, 'bug', $startModuleID = 0));
|
||||
$moduleOwners = array();
|
||||
while($module = $stmt->fetch()) $moduleOwners[$module->id] = $module->owner;
|
||||
|
||||
for($i = 0; $i < $this->config->bug->batchCreate; $i++)
|
||||
{
|
||||
if(empty($data->titles[$i])) continue;
|
||||
@@ -88,12 +93,18 @@ class bugModel extends model
|
||||
$bug->project = $data->projects[$i] ? $data->projects[$i] : 0;
|
||||
$bug->openedBuild = implode(',', $data->openedBuilds[$i]);
|
||||
$bug->title = $data->titles[$i];
|
||||
$bug->steps = $data->stepses[$i];
|
||||
$bug->steps = str_replace(array("\r\n", "\n"), '<br />', htmlspecialchars($data->stepses[$i]));
|
||||
$bug->type = $data->types[$i];
|
||||
$bug->severity = $data->severities[$i];
|
||||
$bug->os = $data->oses[$i];
|
||||
$bug->browser = $data->browsers[$i];
|
||||
|
||||
if(!empty($moduleOwners[$bug->module]))
|
||||
{
|
||||
$bug->assignedTo = $moduleOwners[$bug->module];
|
||||
$bug->assignedDate = $now;
|
||||
}
|
||||
|
||||
$this->dao->insert(TABLE_BUG)->data($bug)->autoCheck()->batchCheck($this->config->bug->create->requiredFields, 'notempty')->exec();
|
||||
$bugID = $this->dao->lastInsertID();
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ js::set('page', 'assignedto');
|
||||
<caption><?php echo $bug->title;?></caption>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='text-3'");?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='text-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->bug->mailto;?></td>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<td><?php echo $i+1;?></td>
|
||||
<td class='a-left' style='overflow:visible'><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='select-1'");?></td>
|
||||
<td><?php echo html::select("projects[$i]", $projects, $projectID, "class='select-1' onchange='loadProjectBuilds($productID, this.value, $i)'");?></td>
|
||||
<td class='a-left chosenBox' style='overflow:visible' id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='select-1' multiple data-placeholder=' '");?></td>
|
||||
<td class='a-left' style='overflow:visible' id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='select-1 chosen' multiple data-placeholder=' '");?></td>
|
||||
<td><?php echo html::input("titles[$i]", '', 'class=select-1');?></td>
|
||||
<td><?php echo html::textarea("stepses[$i]", '', "rows='1' class=text-1");?></td>
|
||||
<td><?php echo html::select("types[$i]", $lang->bug->typeList, '');?></td>
|
||||
|
||||
@@ -40,7 +40,7 @@ js::set('customed', $customed);
|
||||
<?php
|
||||
|
||||
echo '<span class="link-button dropButton">';
|
||||
echo html::a("#", "<i class='icon-upload-alt'></i> " . $lang->export, '', "id='exportAction' onclick=toggleSubMenu(this.id,'bottom',0) title='{$lang->export}'");
|
||||
echo html::a("#", "<i class='icon-upload-alt'></i> " . $lang->export, '', "id='exportAction' onclick=\"toggleSubMenu(this.id,'bottom',0)\" title='{$lang->export}'");
|
||||
echo '</span>';
|
||||
|
||||
common::printIcon('bug', 'report', "productID=$productID&browseType=$browseType&moduleID=$moduleID");
|
||||
@@ -189,7 +189,7 @@ if($customed)
|
||||
echo "</div>";
|
||||
|
||||
$actionLink = $this->createLink('bug', 'batchEdit', "productID=$productID");
|
||||
$misc = common::hasPriv('bug', 'batchEdit') ? "onclick=setFormAction('$actionLink')" : "disabled='disabled'";
|
||||
$misc = common::hasPriv('bug', 'batchEdit') ? "onclick=\"setFormAction('$actionLink')\"" : "disabled='disabled'";
|
||||
echo "<div class='groupButton dropButton'>";
|
||||
echo html::commonButton($lang->edit, $misc);
|
||||
echo "<button id='moreAction' type='button' onclick=\"toggleSubMenu(this.id, 'top', 0)\"><span class='caret'></span></button>";
|
||||
@@ -213,7 +213,7 @@ if($customed)
|
||||
$class = "class='disabled'";
|
||||
|
||||
$actionLink = $this->createLink('bug', 'batchConfirm');
|
||||
$misc = common::hasPriv('bug', 'batchConfirm') ? "onclick=setFormAction('$actionLink','hiddenwin')" : "class='disabled'";
|
||||
$misc = common::hasPriv('bug', 'batchConfirm') ? "onclick=\"setFormAction('$actionLink','hiddenwin')\"" : "class='disabled'";
|
||||
echo "<li>" . html::a('#', $lang->bug->confirmBug, '', $misc) . "</li>";
|
||||
|
||||
$misc = common::hasPriv('bug', 'batchResolve') ? "onmouseover='toggleSubMenu(this.id)' onmouseout='toggleSubMenu(this.id)' id='resolveItem'" : $class;
|
||||
@@ -233,7 +233,7 @@ if($customed)
|
||||
echo "<li>";
|
||||
if($key == 'fixed')
|
||||
{
|
||||
echo html::a('#', $resolution, '', "onmouseover=toggleSubMenu(this.id,'right',2) id='fixedItem'");
|
||||
echo html::a('#', $resolution, '', "onmouseover=\"toggleSubMenu(this.id,'right',2)\" id='fixedItem'");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<table class='table-1'>
|
||||
<caption><?php echo $bug->title;?></caption>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->comment;?></td>
|
||||
<td class='rowhead v-middle'><?php echo $lang->comment;?></td>
|
||||
<td><?php echo html::textarea('comment', '', "rows='6' class='w-p98'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -22,7 +22,7 @@ js::set('page', 'confirmbug');
|
||||
<caption><?php echo $bug->title;?></caption>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='select-2'");?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='select-2 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->pri;?></th>
|
||||
|
||||
@@ -56,7 +56,7 @@ js::set('refresh', $lang->refresh);
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><nobr><?php echo $lang->bug->lblAssignedTo;?></nobr></th>
|
||||
<td><span id='assignedToBox'><?php echo html::select('assignedTo', $users, $assignedTo, 'class=select-3');?></span></td>
|
||||
<td><span id='assignedToBox'><?php echo html::select('assignedTo', $users, $assignedTo, "class='select-3 chosen'");?></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->bug->title;?></th>
|
||||
|
||||
@@ -108,7 +108,7 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild);
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->bug->assignedTo;?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, 'class=select-3');?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->bug->os;?></td>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->bug->assignedTo;?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->openedBy, 'class=select-3');?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->openedBy, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->comment;?></td>
|
||||
|
||||
@@ -85,10 +85,14 @@ class build extends control
|
||||
{
|
||||
$changes = $this->build->update($buildID);
|
||||
if(dao::isError()) die(js::error(dao::getError()));
|
||||
if($changes)
|
||||
$files = $this->loadModel('file')->saveUpload('build', $buildID);
|
||||
|
||||
if($changes or $files)
|
||||
{
|
||||
$actionID = $this->loadModel('action')->create('build', $buildID, 'edited');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$fileAction = '';
|
||||
if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
|
||||
$actionID = $this->loadModel('action')->create('build', $buildID, 'Edited', $fileAction);
|
||||
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
die(js::locate(inlink('view', "buildID=$buildID"), 'parent'));
|
||||
}
|
||||
|
||||
@@ -1,4 +1,22 @@
|
||||
$(document).ready(function()
|
||||
{
|
||||
$("a.preview").colorbox({width:1000, height:550, iframe:true, transition:'none', scrolling:true});
|
||||
if(typeof(packageType) != 'undefined')
|
||||
{
|
||||
var hiddenDom = packageType == 'filePath' ? 'fileform' : 'filePath';
|
||||
$('#' + hiddenDom).parents('tr').addClass('hidden');
|
||||
}
|
||||
$("input[name='packageType']").bind('click', function()
|
||||
{
|
||||
if($(this).val() == 'path')
|
||||
{
|
||||
$('#filePath').parents('tr').removeClass('hidden');
|
||||
$('#fileform').parents('tr').addClass('hidden');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#filePath').parents('tr').addClass('hidden');
|
||||
$('#fileform').parents('tr').removeClass('hidden');
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -30,12 +30,17 @@ $lang->build->builder = 'Builder';
|
||||
$lang->build->scmPath = 'Source code path';
|
||||
$lang->build->filePath = 'Package file path';
|
||||
$lang->build->desc = 'Desc';
|
||||
$lang->build->files = 'Upload package';
|
||||
$lang->build->last = 'Last build';
|
||||
$lang->build->linkStoriesAndBugs = 'stories and bugs';
|
||||
$lang->build->linkStories = 'Stories';
|
||||
$lang->build->linkBugs = 'Bugs';
|
||||
$lang->build->stories = 'Linked stories';
|
||||
$lang->build->bugs = 'Linked bugs';
|
||||
$lang->build->packageType = 'Package type';
|
||||
|
||||
$lang->build->finishStories = 'The total demand for a complete %s';
|
||||
$lang->build->resolvedBugs = 'The total solution of bug%s';
|
||||
|
||||
$lang->build->packageTypeList['path'] = 'Shared file';
|
||||
$lang->build->packageTypeList['file'] = 'Upload file';
|
||||
|
||||
@@ -30,12 +30,17 @@ $lang->build->builder = '构建者';
|
||||
$lang->build->scmPath = '源代码地址';
|
||||
$lang->build->filePath = '存储地址';
|
||||
$lang->build->desc = '描述';
|
||||
$lang->build->files = '上传发行包';
|
||||
$lang->build->last = '上个版本';
|
||||
$lang->build->linkStoriesAndBugs = '关联需求和Bug';
|
||||
$lang->build->linkStories = '相关需求';
|
||||
$lang->build->linkBugs = '相关Bug';
|
||||
$lang->build->stories = '已关联需求';
|
||||
$lang->build->bugs = '已关联Bug';
|
||||
$lang->build->packageType = '发行包方式';
|
||||
|
||||
$lang->build->finishStories = '本次共完成需求%s个';
|
||||
$lang->build->resolvedBugs = '本次共解决Bug%s个';
|
||||
|
||||
$lang->build->packageTypeList['path'] = '文件共享';
|
||||
$lang->build->packageTypeList['file'] = '上传附件';
|
||||
|
||||
+14
-3
@@ -30,7 +30,9 @@ class buildModel extends model
|
||||
->where('t1.id')->eq((int)$buildID)
|
||||
->fetch();
|
||||
if(!$build) return false;
|
||||
if($setImgSize) $build->desc = $this->loadModel('file')->setImgSize($build->desc);
|
||||
|
||||
$build->files = $this->loadModel('file')->getByObject('build', $buildID);
|
||||
if($setImgSize) $build->desc = $this->file->setImgSize($build->desc);
|
||||
return $build;
|
||||
}
|
||||
|
||||
@@ -154,11 +156,17 @@ class buildModel extends model
|
||||
->setDefault('product', 0)
|
||||
->join('stories', ',')
|
||||
->join('bugs', ',')
|
||||
->add('project', (int)$projectID)->remove('resolvedBy,allchecker')->get();
|
||||
->add('project', (int)$projectID)
|
||||
->remove('resolvedBy,allchecker,files,labels')
|
||||
->get();
|
||||
|
||||
if($build->packageType == 'path') unset($_FILES);
|
||||
|
||||
$this->dao->insert(TABLE_BUILD)->data($build)->autoCheck()->batchCheck($this->config->build->create->requiredFields, 'notempty')->check('name', 'unique', "product = {$build->product}")->exec();
|
||||
if(!dao::isError())
|
||||
{
|
||||
$buildID = $this->dao->lastInsertID();
|
||||
$this->loadModel('file')->saveUpload('build', $buildID);
|
||||
$this->updateLinkedBug($build);
|
||||
return $buildID;
|
||||
}
|
||||
@@ -180,8 +188,11 @@ class buildModel extends model
|
||||
->setDefault('bugs', '')
|
||||
->join('stories', ',')
|
||||
->join('bugs', ',')
|
||||
->remove('allchecker,resolvedBy')
|
||||
->remove('allchecker,resolvedBy,files,labels')
|
||||
->get();
|
||||
|
||||
if($build->packageType == 'path') unset($_FILES);
|
||||
|
||||
$this->dao->update(TABLE_BUILD)->data($build)
|
||||
->autoCheck()
|
||||
->batchCheck($this->config->build->edit->requiredFields, 'notempty')
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<form method='post' target='hiddenwin' id='dataform'>
|
||||
<form method='post' target='hiddenwin' id='dataform' enctype='multipart/form-data'>
|
||||
<table class='table-1 fixed'>
|
||||
<caption><?php echo $lang->build->create;?></caption>
|
||||
<tr>
|
||||
@@ -39,10 +39,18 @@
|
||||
<th class='rowhead'><?php echo $lang->build->scmPath;?></th>
|
||||
<td><?php echo html::input('scmPath', '', "class='text-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->packageType;?></th>
|
||||
<td><?php echo html::radio('packageType', $lang->build->packageTypeList, 'path');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->filePath;?></th>
|
||||
<td><?php echo html::input('filePath', '', "class='text-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->files;?></th>
|
||||
<td><?php echo $this->fetch('file', 'buildForm', array('fileCount' => 1));?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->linkStoriesAndBugs;?></th>
|
||||
<td>
|
||||
@@ -110,4 +118,5 @@
|
||||
<tr><td colspan='2' class='a-center'><?php echo html::submitButton() . html::backButton();?></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php js::set('packageType', 'filePath')?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<form method='post' target='hiddenwin' id='dataform'>
|
||||
<form method='post' target='hiddenwin' id='dataform' enctype='multipart/form-data'>
|
||||
<table class='table-1'>
|
||||
<caption><?php echo $lang->build->edit;?></caption>
|
||||
<tr>
|
||||
@@ -36,10 +36,18 @@
|
||||
<th class='rowhead'><?php echo $lang->build->scmPath;?></th>
|
||||
<td><?php echo html::input('scmPath', $build->scmPath, "class='text-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->packageType;?></th>
|
||||
<td><?php echo html::radio('packageType', $lang->build->packageTypeList, $build->packageType);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->filePath;?></th>
|
||||
<td><?php echo html::input('filePath', $build->filePath, "class='text-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->files;?></th>
|
||||
<td><?php echo $this->fetch('file', 'buildForm', array('fileCount' => 1));?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->linkStoriesAndBugs;?></th>
|
||||
<td>
|
||||
@@ -121,9 +129,10 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->build->desc;?></th>
|
||||
<td><?php echo html::textarea('desc', $build->desc, "rows='15' class='area-1'");?></td>
|
||||
<td><?php echo html::textarea('desc', $build->desc, "rows='10' class='area-1'");?></td>
|
||||
</tr>
|
||||
<tr><td colspan='2' class='a-center'><?php echo html::submitButton() . html::backButton() .html::hidden('project', $build->project);?></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php js::set('packageType', $build->packageType == 'file' ? 'fileform' : 'filePath')?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
<legend><?php echo $lang->build->desc;?></legend>
|
||||
<div class='content'><?php echo $build->desc;?></div>
|
||||
</fieldset>
|
||||
<?php echo $this->fetch('file', 'printFiles', array('files' => $build->files, 'fieldset' => 'true'));?>
|
||||
<?php include '../../common/view/action.html.php';?>
|
||||
<div class='a-center f-16px strong mb-10px'>
|
||||
<?php
|
||||
|
||||
@@ -57,6 +57,7 @@ $lang->switchDisplay= 'Toggle Show';
|
||||
$lang->switchHelp = 'Toggle Help';
|
||||
$lang->addFiles = 'Add Files';
|
||||
$lang->files = 'Files ';
|
||||
$lang->timeout = 'Timed out, please check the network, or retry!';
|
||||
$lang->unfold = '+';
|
||||
$lang->fold = '-';
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ $lang->switchDisplay= '切换显示';
|
||||
$lang->switchHelp = '切换帮助';
|
||||
$lang->addFiles = '上传了附件 ';
|
||||
$lang->files = '附件 ';
|
||||
$lang->timeout = '连接超时,请检查网络环境,或重试!';
|
||||
$lang->unfold = '+';
|
||||
$lang->fold = '-';
|
||||
|
||||
|
||||
@@ -386,7 +386,7 @@ class commonModel extends model
|
||||
|
||||
echo "<li id='searchbox'>";
|
||||
echo html::select('searchType', $lang->searchObjects, $searchObject);
|
||||
echo html::input('searchQuery', $lang->searchTips, "onclick=this.value='' onkeydown='if(event.keyCode==13) shortcut()' class='w-80px'");
|
||||
echo html::input('searchQuery', $lang->searchTips, "onclick='this.value=\"\"' onkeydown='if(event.keyCode==13) shortcut()' class='w-80px'");
|
||||
echo "<a href='javascript:shortcut();return false;' id='objectSwitcher' class='icon-circle-arrow-right'></a>";
|
||||
echo "</li>";
|
||||
echo "</ul>\n";
|
||||
@@ -406,6 +406,9 @@ class commonModel extends model
|
||||
|
||||
if(!isset($lang->$moduleName->menu)) {echo "<ul></ul>"; return;}
|
||||
|
||||
/* Unset clearData menu when the data of pms is demo. */
|
||||
if(!isset($app->config->global->showDemoUsers) or !$app->config->global->showDemoUsers) unset($lang->admin->menu->clearData);
|
||||
|
||||
/* Get the sub menus of the module, and get current module and method. */
|
||||
$submenus = $lang->$moduleName->menu;
|
||||
$currentModule = $app->getModuleName();
|
||||
|
||||
@@ -17,5 +17,6 @@ $(document).ready(function()
|
||||
$("#mailto").attr('data-placeholder', chooseUsersToMail);
|
||||
$("#productID").chosen({no_results_text: noResultsMatch});
|
||||
$("#projectID").chosen({no_results_text: noResultsMatch});
|
||||
$(".chosen").chosen({no_results_text: noResultsMatch, allow_single_deselect: true});
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
</div>
|
||||
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
|
||||
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no' class='<?php $config->debug ? print("debugwin") : print('hidden')?>'></iframe>
|
||||
<script laguage='Javascript'>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
|
||||
<?php js::set('timeout', $this->lang->timeout)?>
|
||||
<?php
|
||||
js::import($jsRoot . 'jquery/form/min.js');
|
||||
js::import($jsRoot . 'jquery/form/zentao.js');
|
||||
|
||||
@@ -7,8 +7,8 @@ $defaultTheme = $webRoot . 'theme/default/';
|
||||
$langTheme = $themeRoot . 'lang/' . $app->getClientLang() . '.css';
|
||||
$clientTheme = $this->app->getClientTheme();
|
||||
?>
|
||||
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dli'>
|
||||
<html xmlns='http://www.w3.org/1999/xhtml'>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
|
||||
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
|
||||
|
||||
@@ -10,6 +10,10 @@ $extHookFiles = glob($extHookRule);
|
||||
if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
|
||||
?>
|
||||
<?php if($this->server->HTTP_X_PJAX == false):?>
|
||||
<script>
|
||||
/* May be fix bug #576. */
|
||||
$(function(){$("#main").css('padding-top', $("div[data-role='header']").height() + 'px')})
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -52,9 +52,9 @@ class custom extends control
|
||||
die(js::reload('parent'));
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->custom->common . $this->lang->colon . $this->lang->custom->story;
|
||||
$this->view->title = $this->lang->custom->common . $this->lang->colon . $this->lang->$module->common;
|
||||
$this->view->position[] = $this->lang->custom->common;
|
||||
$this->view->position[] = $this->lang->custom->$module;
|
||||
$this->view->position[] = $this->lang->$module->common;
|
||||
$this->view->fieldList = $fieldList;
|
||||
$this->view->dbFields = $this->custom->getItems("lang=$currentLang,all&module=$module§ion=$field");
|
||||
$this->view->field = $field;
|
||||
|
||||
@@ -370,6 +370,10 @@ class installModel extends model
|
||||
{
|
||||
$table = str_replace('--', '', $table);
|
||||
}
|
||||
|
||||
/* Skip sql that is note. */
|
||||
if(strpos($table, '--') === 0) continue;
|
||||
|
||||
$table = str_replace('`zt_', $this->config->db->name . '.`zt_', $table);
|
||||
$table = str_replace('zt_', $this->config->db->prefix, $table);
|
||||
if(!$this->dbh->query($table)) return false;
|
||||
|
||||
@@ -45,7 +45,7 @@ class my extends control
|
||||
|
||||
$this->view->projectStats = $projectStats;
|
||||
$this->view->productStats = $productStats;
|
||||
$this->view->actions = $this->loadModel('action')->getDynamic('all', 'latest3days', 'date_desc', $pager);
|
||||
$this->view->actions = $this->loadModel('action')->getDynamic('all', 'all', 'date_desc', $pager);
|
||||
$this->view->todos = $this->loadModel('todo')->getList('all', $account, 'wait, doing', $this->config->my->todoCounts);
|
||||
$this->view->tasks = $this->loadModel('task')->getUserTasks($account, 'assignedTo', $this->config->my->taskCounts);
|
||||
$this->view->bugs = $this->loadModel('bug')->getUserBugPairs($account, false, $this->config->my->bugCounts);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<?php
|
||||
foreach($tasks as $task)
|
||||
{
|
||||
echo "<tr><td class='nobr'>" . "#$task->id " . html::a($this->createLink('task', 'view', "id=$task->id"), $task->name, '', "title=$task->name") . "</td><td width='5'</td></tr>";
|
||||
echo "<tr><td class='nobr'>" . "#$task->id " . html::a($this->createLink('task', 'view', "id=$task->id"), $task->name, '', "title=$task->name") . "</td><td width='5'></td></tr>";
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
|
||||
@@ -38,6 +38,5 @@
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
</table>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
</div>
|
||||
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -52,12 +52,12 @@
|
||||
<?php echo html::a($this->createLink('task', 'view', "taskID=$task->id"), sprintf('%03d', $task->id));?>
|
||||
</td>
|
||||
<td><span class='<?php echo 'pri' . $lang->task->priList[$task->pri];?>'><?php echo isset($lang->task->priList[$task->pri]) ? $lang->task->priList[$task->pri] : $task->pri;?></span></td>
|
||||
<td class='nobr a-left'><?php echo html::a($this->createLink('project', 'browse', "projectid=$task->projectID"), $task->projectName);?></th>
|
||||
<td class='nobr a-left'><?php echo html::a($this->createLink('project', 'browse', "projectid=$task->projectID"), $task->projectName);?></td>
|
||||
<td class='a-left nobr'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id"), $task->name);?></td>
|
||||
<td><?php echo $task->estimate;?></td>
|
||||
<td><?php echo $task->consumed;?></td>
|
||||
<td><?php echo $task->left;?></td>
|
||||
<td class=<?php if(isset($task->delay)) echo 'delayed';?>><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
|
||||
<td class='<?php if(isset($task->delay)) echo 'delayed';?>'><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
|
||||
<td class='<?php echo $task->status;?>'><?php echo $lang->task->statusList[$task->status];?></td>
|
||||
<td><?php echo $users[$task->openedBy];?></td>
|
||||
<td class='a-right'>
|
||||
|
||||
@@ -30,7 +30,7 @@ class product extends control
|
||||
$this->loadModel('user');
|
||||
|
||||
/* Get all products, if no, goto the create page. */
|
||||
$this->products = $this->product->getPairs();
|
||||
$this->products = $this->product->getPairs('nocode');
|
||||
if(empty($this->products) and strpos('create', $this->methodName) === false and $this->app->getViewType() != 'mhtml') $this->locate($this->createLink('product', 'create'));
|
||||
$this->view->products = $this->products;
|
||||
}
|
||||
@@ -299,6 +299,7 @@ class product extends control
|
||||
$this->view->title = $this->view->product->name . $this->lang->colon .$this->lang->close;
|
||||
$this->view->position[] = $this->lang->close;
|
||||
$this->view->actions = $actions;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -373,7 +373,8 @@ class productModel extends model
|
||||
ksort($roadmap);
|
||||
|
||||
/* Get last 5 roadmap. */
|
||||
$lastKeys = array_slice(array_keys($roadmap), -5);
|
||||
$lastKeys = array_slice(array_keys($roadmap), -5);
|
||||
$lastRoadmap = array();
|
||||
foreach($lastKeys as $key) $lastRoadmap[$key] = $roadmap[$key];
|
||||
|
||||
return $lastRoadmap;
|
||||
|
||||
@@ -4,55 +4,57 @@
|
||||
<?php js::set('extra', $extra);?>
|
||||
<input type='text' class='gray' id='search' value='' onkeyup='searchItems(this.value, "product", productID, module, method, extra)' placeholder='<?php echo $this->app->loadLang('search')->search->common;?>' />
|
||||
|
||||
<div id='searchResult'>
|
||||
<div id='defaultMenu' class='f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
$iCharges = 0;
|
||||
$others = 0;
|
||||
$closeds = 0;
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'normal' and $product->PO == $this->app->user->account) $iCharges++;
|
||||
if($product->status == 'normal' and !($product->PO == $this->app->user->account)) $others++;
|
||||
if($product->status == 'closed') $closeds++;
|
||||
}
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->product->mine}</span>";
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'normal' and $product->PO == $this->app->user->account)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), $product->name, '', "class='mine'"). "</li>";
|
||||
}
|
||||
}
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->product->other}</span>";
|
||||
$class = ($iCharges and $others) ? "class='other'" : '';
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'normal' and !($product->PO == $this->app->user->account))
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), $product->name, '', "$class"). "</li>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
<?php if($closeds):?>
|
||||
<div class='a-right'><a class='gray' id='more' onClick='switchMore()'><?php echo $lang->product->closed;?></a></div>
|
||||
<?php endif;?>
|
||||
|
||||
</div>
|
||||
|
||||
<div id='moreMenu' class='hidden f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
<div id='resultList'>
|
||||
<div id='searchResult'>
|
||||
<div id='defaultMenu' class='f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
$iCharges = 0;
|
||||
$others = 0;
|
||||
$closeds = 0;
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'closed') echo "<li>" . html::a(sprintf($link, $product->id), $product->name, '', "class='closed'"). "</li>";
|
||||
if($product->status == 'normal' and $product->PO == $this->app->user->account) $iCharges++;
|
||||
if($product->status == 'normal' and !($product->PO == $this->app->user->account)) $others++;
|
||||
if($product->status == 'closed') $closeds++;
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->product->mine}</span>";
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'normal' and $product->PO == $this->app->user->account)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), $product->name, '', "class='mine'"). "</li>";
|
||||
}
|
||||
}
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->product->other}</span>";
|
||||
$class = ($iCharges and $others) ? "class='other'" : '';
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'normal' and !($product->PO == $this->app->user->account))
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), $product->name, '', "$class"). "</li>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
<?php if($closeds):?>
|
||||
<div class='a-right'><a class='gray' id='more' onClick='switchMore()'><?php echo $lang->product->closed;?></a></div>
|
||||
<?php endif;?>
|
||||
|
||||
</div>
|
||||
|
||||
<div id='moreMenu' class='hidden f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'closed') echo "<li>" . html::a(sprintf($link, $product->id), $product->name, '', "class='closed'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<div class='f-right'>
|
||||
<?php
|
||||
echo '<span class="link-button dropButton">';
|
||||
echo html::a("#", "<i class='icon-upload-alt'></i> " . $lang->export, '', "id='exportAction' onclick=toggleSubMenu(this.id,'bottom',0) title='{$lang->export}'");
|
||||
echo html::a("#", "<i class='icon-upload-alt'></i> " . $lang->export, '', "id='exportAction' onclick='toggleSubMenu(this.id,\"bottom\",0)' title='{$lang->export}'");
|
||||
echo '</span>';
|
||||
|
||||
common::printIcon('story', 'report', "productID=$productID&browseType=$browseType&moduleID=$moduleID");
|
||||
@@ -154,7 +154,7 @@
|
||||
|
||||
$canBatchClose = common::hasPriv('story', 'batchClose') && strtolower($browseType) != 'closedbyme' && strtolower($browseType) != 'closedstory';
|
||||
$actionLink = $this->createLink('story', 'batchClose', "productID=$productID&projectID=0");
|
||||
$misc = $canBatchClose ? "onclick=setFormAction('$actionLink')" : $class;
|
||||
$misc = $canBatchClose ? "onclick=\"setFormAction('$actionLink')\"" : $class;
|
||||
echo "<li>" . html::a('#', $lang->close, '', $misc) . "</li>";
|
||||
|
||||
$misc = common::hasPriv('story', 'batchReview') ? "onmouseover='toggleSubMenu(this.id)' onmouseout='toggleSubMenu(this.id)' id='reviewItem'" : $class;
|
||||
|
||||
@@ -25,15 +25,15 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->PO;?></th>
|
||||
<td><?php echo html::select('PO', $poUsers, $this->app->user->account, "class='select-3'");?></td>
|
||||
<td><?php echo html::select('PO', $poUsers, $this->app->user->account, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->QD;?></th>
|
||||
<td><?php echo html::select('QD', $qdUsers, '', "class='select-3'");?></td>
|
||||
<td><?php echo html::select('QD', $qdUsers, '', "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->RD;?></th>
|
||||
<td><?php echo html::select('RD', $rdUsers, '', "class='select-3'");?></td>
|
||||
<td><?php echo html::select('RD', $rdUsers, '', "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->desc;?></th>
|
||||
|
||||
@@ -25,15 +25,15 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->PO;?></th>
|
||||
<td><?php echo html::select('PO', $poUsers, $product->PO, "class='select-3'");?></td>
|
||||
<td><?php echo html::select('PO', $poUsers, $product->PO, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->QD;?></th>
|
||||
<td><?php echo html::select('QD', $qdUsers, $product->QD, "class='select-3'");?></td>
|
||||
<td><?php echo html::select('QD', $qdUsers, $product->QD, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->RD;?></th>
|
||||
<td><?php echo html::select('RD', $rdUsers, $product->RD, "class='select-3'");?></td>
|
||||
<td><?php echo html::select('RD', $rdUsers, $product->RD, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->product->status;?></th>
|
||||
|
||||
@@ -65,8 +65,8 @@ class productplanModel extends model
|
||||
/**
|
||||
* Get plan pairs.
|
||||
*
|
||||
* @param int $product
|
||||
* @param string $expired
|
||||
* @param array|int $product
|
||||
* @param string $expired
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
@@ -74,7 +74,7 @@ class productplanModel extends model
|
||||
{
|
||||
$date = date('Y-m-d');
|
||||
return array('' => '') + $this->dao->select('id,title')->from(TABLE_PRODUCTPLAN)
|
||||
->where('product')->eq((int)$product)
|
||||
->where('product')->in($product)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->beginIF($expired == 'unexpired')
|
||||
->andWhere('end')->gt($date)
|
||||
|
||||
@@ -23,7 +23,7 @@ class project extends control
|
||||
parent::__construct();
|
||||
if($this->methodName != 'computeburn')
|
||||
{
|
||||
$this->projects = $this->project->getPairs();
|
||||
$this->projects = $this->project->getPairs('nocode');
|
||||
if(!$this->projects and $this->methodName != 'create' and $this->app->getViewType() != 'mhtml') $this->locate($this->createLink('project', 'create'));
|
||||
}
|
||||
}
|
||||
@@ -49,6 +49,7 @@ class project extends control
|
||||
$this->view->position[] = $this->lang->project->allProject;
|
||||
$this->view->projectStats = $this->project->getProjectStats($status);
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
|
||||
$this->display();
|
||||
}
|
||||
@@ -452,6 +453,7 @@ class project extends control
|
||||
$this->config->bug->search['params']['product']['values'] = array(''=>'');
|
||||
}
|
||||
$this->config->bug->search['params']['project']['values'] = array(''=>'') + $projects + array('all'=>$this->lang->project->aboveAllProject);
|
||||
$this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairs(array_keys($products));
|
||||
$this->config->bug->search['module'] = 'importBug';
|
||||
$this->config->bug->search['params']['confirmed']['values'] = array('' => '') + $this->lang->bug->confirmedList;
|
||||
$this->config->bug->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($projectID, $viewType = 'bug', $startModuleID = 0);
|
||||
@@ -1003,6 +1005,7 @@ class project extends control
|
||||
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->project->start;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $this->view->project->name);
|
||||
$this->view->position[] = $this->lang->project->start;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1034,6 +1037,7 @@ class project extends control
|
||||
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->project->putoff;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $this->view->project->name);
|
||||
$this->view->position[] = $this->lang->project->putoff;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1065,6 +1069,7 @@ class project extends control
|
||||
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->project->suspend;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $this->view->project->name);
|
||||
$this->view->position[] = $this->lang->project->suspend;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1096,6 +1101,7 @@ class project extends control
|
||||
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->project->activate;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $this->view->project->name);
|
||||
$this->view->position[] = $this->lang->project->activate;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1127,6 +1133,7 @@ class project extends control
|
||||
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->project->close;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'browse', "projectID=$projectID"), $this->view->project->name);
|
||||
$this->view->position[] = $this->lang->project->close;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,6 @@ function computeEndDate(delta)
|
||||
/* Auto compute the work days. */
|
||||
$(function()
|
||||
{
|
||||
$(".chosenBox select").chosen({no_results_text: noResultsMatch});
|
||||
if(typeof(replaceID) != 'undefined') setModal4List('iframe', replaceID);
|
||||
$(".date").bind('dateSelected', function()
|
||||
{
|
||||
|
||||
@@ -179,7 +179,7 @@ $lang->project->whyNoStories = "There no active stories to added to this proj
|
||||
$lang->project->doneProjects = 'Done';
|
||||
$lang->project->unDoneProjects = 'Undone';
|
||||
$lang->project->copyTeam = 'Copy a team';
|
||||
$lang->product->noMatched = 'No matched project including "%s"';
|
||||
$lang->project->noMatched = 'No matched project including "%s"';
|
||||
|
||||
/* Confirm. */
|
||||
$lang->project->confirmDelete = 'Are you sure to delete project [%s]?';
|
||||
|
||||
@@ -179,7 +179,7 @@ $lang->project->whyNoStories = "看起来没有需求可以关联。请检查
|
||||
$lang->project->doneProjects = '已结束';
|
||||
$lang->project->unDoneProjects = '未结束';
|
||||
$lang->project->copyTeam = '复制团队';
|
||||
$lang->product->noMatched = '找不到包含"%s"的项目';
|
||||
$lang->project->noMatched = '找不到包含"%s"的项目';
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->project->confirmDelete = '您确定删除项目[%s]吗?';
|
||||
|
||||
@@ -4,55 +4,57 @@
|
||||
<?php js::set('extra', $extra);?>
|
||||
<input type='text' class='gray' id='search' value='' onkeyup='searchItems(this.value, "project", projectID, module, method, extra)' placeholder='<?php echo $this->app->loadLang('search')->search->common;?>' />
|
||||
|
||||
<div id='searchResult'>
|
||||
<div id='defaultMenu' class='f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
$iCharges = 0;
|
||||
$others = 0;
|
||||
$dones = 0;
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status != 'done' and $project->PM == $this->app->user->account) $iCharges++;
|
||||
if($project->status != 'done' and !($project->PM == $this->app->user->account)) $others++;
|
||||
if($project->status == 'done') $dones++;
|
||||
}
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->project->mine}</span>";
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status != 'done' and $project->PM == $this->app->user->account)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), $project->name). "</li>";
|
||||
}
|
||||
}
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->project->other}</span>";
|
||||
$class = ($iCharges and $others) ? "class='other'" : '';
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status != 'done' and !($project->PM == $this->app->user->account))
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), $project->name, '', "$class"). "</li>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
<?php if($dones):?>
|
||||
<div class='a-right'><a id='more' onClick='switchMore()'><?php echo $lang->project->doneProjects . '»';?></a></div>
|
||||
<?php endif;?>
|
||||
|
||||
</div>
|
||||
|
||||
<div id='moreMenu' class='hidden f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
<div id='resultList'>
|
||||
<div id='searchResult'>
|
||||
<div id='defaultMenu' class='f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
$iCharges = 0;
|
||||
$others = 0;
|
||||
$dones = 0;
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status == 'done') echo "<li>" . html::a(sprintf($link, $project->id), $project->name, '', "class='done'"). "</li>";
|
||||
if($project->status != 'done' and $project->PM == $this->app->user->account) $iCharges++;
|
||||
if($project->status != 'done' and !($project->PM == $this->app->user->account)) $others++;
|
||||
if($project->status == 'done') $dones++;
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->project->mine}</span>";
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status != 'done' and $project->PM == $this->app->user->account)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), $project->name). "</li>";
|
||||
}
|
||||
}
|
||||
|
||||
if($iCharges and $others) echo "<span class='black'>{$lang->project->other}</span>";
|
||||
$class = ($iCharges and $others) ? "class='other'" : '';
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status != 'done' and !($project->PM == $this->app->user->account))
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), $project->name, '', "$class"). "</li>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
<?php if($dones):?>
|
||||
<div class='a-right'><a id='more' onClick='switchMore()'><?php echo $lang->project->doneProjects . '»';?></a></div>
|
||||
<?php endif;?>
|
||||
|
||||
</div>
|
||||
|
||||
<div id='moreMenu' class='hidden f-left'>
|
||||
<ul>
|
||||
<?php
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status == 'done') echo "<li>" . html::a(sprintf($link, $project->id), $project->name, '', "class='done'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?php if(!$projects) echo sprintf($lang->product->noMatched, $keywords);?>
|
||||
<?php if(!$projects) echo sprintf($lang->project->noMatched, $keywords);?>
|
||||
<ul>
|
||||
<?php
|
||||
foreach($projects as $project)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
<tfoot><tr><td colspan='9'><?php $pager->show();?></td></tr></table>
|
||||
<tfoot><tr><td colspan='9'><?php $pager->show();?></td></tr></tfoot>
|
||||
</table>
|
||||
<?php js::set('replaceID', 'bugList')?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -77,12 +77,8 @@ $(document).ready(function()
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->manageProducts;?></th>
|
||||
<td class='a-left chosenBox' id='productsBox'><?php echo html::select("products[]", $allProducts, $products, "class='select-1' data-placeholder='{$lang->project->linkProduct}' multiple");?></td>
|
||||
<td class='a-left' id='productsBox'><?php echo html::select("products[]", $allProducts, $products, "class='select-1 chosen' data-placeholder='{$lang->project->linkProduct}' multiple");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->goal;?></th>
|
||||
<td><?php echo html::textarea('goal', '', "rows='6' class='area-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->desc;?></th>
|
||||
<td><?php echo html::textarea('desc', '', "rows='6' class='area-1'");?></td>
|
||||
|
||||
@@ -51,28 +51,24 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->PO;?></th>
|
||||
<td><?php echo html::select('PO', $poUsers, $project->PO, 'class=text-3');?></td>
|
||||
<td><?php echo html::select('PO', $poUsers, $project->PO, "class='text-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->PM;?></th>
|
||||
<td><?php echo html::select('PM', $pmUsers, $project->PM, 'class=text-3');?></td>
|
||||
<td><?php echo html::select('PM', $pmUsers, $project->PM, "class='text-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->QD;?></th>
|
||||
<td><?php echo html::select('QD', $qdUsers, $project->QD, 'class=text-3');?></td>
|
||||
<td><?php echo html::select('QD', $qdUsers, $project->QD, "class='text-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->RD;?></th>
|
||||
<td><?php echo html::select('RD', $rdUsers, $project->RD, 'class=text-3');?></td>
|
||||
<td><?php echo html::select('RD', $rdUsers, $project->RD, "class='text-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->manageProducts;?></th>
|
||||
<td class='a-left chosenBox' id='productsBox'><?php echo html::select("products[]", $allProducts, $linkedProducts, "class='select-1' data-placeholder='{$lang->project->linkProduct}' multiple");?></td>
|
||||
<td class='a-left' id='productsBox'><?php echo html::select("products[]", $allProducts, $linkedProducts, "class='select-1 chosen' data-placeholder='{$lang->project->linkProduct}' multiple");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->goal;?></th>
|
||||
<td><?php echo html::textarea('goal', $project->goal, "rows='6' class='area-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->project->desc;?></th>
|
||||
<td><?php echo html::textarea('desc', $project->desc, "rows='6' class='area-1'");?></td>
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
<th class='w-id'> <?php echo $lang->idAB;?></th>
|
||||
<th class='w-150px'><?php echo $lang->project->name;?></th>
|
||||
<th><?php echo $lang->project->code;?></th>
|
||||
<th><?php echo $lang->project->PM;?></th>
|
||||
<th><?php echo $lang->project->end;?></th>
|
||||
<th><?php echo $lang->project->status;?></th>
|
||||
<th><?php echo $lang->project->totalEstimate;?></th>
|
||||
@@ -43,7 +44,8 @@
|
||||
<?php echo html::a($this->createLink('project', 'view', 'project=' . $project->id), sprintf('%03d', $project->id));?>
|
||||
</td>
|
||||
<td class='a-left'><?php echo html::a($this->createLink('project', 'view', 'project=' . $project->id), $project->name);?></td>
|
||||
<td><?php echo $project->code;?></td>
|
||||
<td class='a-left'><?php echo $project->code;?></td>
|
||||
<td><?php echo $users[$project->PM];?></td>
|
||||
<td><?php echo $project->end;?></td>
|
||||
<td><?php echo $lang->project->statusList[$project->status];?></td>
|
||||
<td><?php echo $project->hours->totalEstimate;?></td>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<th><?php echo $lang->team->days;?></th>
|
||||
<th><?php echo $lang->team->hours;?></th>
|
||||
</tr>
|
||||
<?php $i = 1;?>
|
||||
<?php $i = 1; $memberCount = 0;?>
|
||||
<?php foreach($currentMembers as $member):?>
|
||||
<?php if(!isset($users[$member->account])) continue; $realname = substr($users[$member->account], 2);?>
|
||||
<?php unset($users[$member->account]);?>
|
||||
@@ -39,12 +39,12 @@
|
||||
<input type='hidden' name='accounts[]' value='<?php echo $member->account;?>' />
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i ++;?>
|
||||
<?php $i ++; $memberCount ++;?>
|
||||
<?php endforeach;?>
|
||||
|
||||
<?php foreach($members2Import as $member2Import):?>
|
||||
<tr>
|
||||
<td><?php echo html::select('accounts[]', $users, $member2Import->account, "class='select-2' onchange='setRole(this.value, $i)'");?></td>
|
||||
<td><?php echo html::select("accounts[$memberCount]", $users, $member2Import->account, "class='select-2 chosen' onchange='setRole(this.value, $i)'");?></td>
|
||||
<td><input type='text' name='roles[]' id='role<?php echo $i;?>' class='text-2' value='<?php echo $member2Import->role;?>' /></td>
|
||||
<td><input type='text' name='days[]' id='days<?php echo $i;?>' class='text-2' value='<?php echo $project->days?>'/></td>
|
||||
<td>
|
||||
@@ -52,7 +52,7 @@
|
||||
<input type='hidden' name='modes[]' value='create' />
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i ++;?>
|
||||
<?php $i ++; $memberCount ++;?>
|
||||
<?php endforeach;?>
|
||||
|
||||
<?php
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
<?php for($j = 0; $j < $count; $j ++):?>
|
||||
<tr>
|
||||
<td><?php echo html::select('accounts[]', $users, '', "class='select-2' onchange='setRole(this.value, $i)'");?></td>
|
||||
<td><?php echo html::select("accounts[$memberCount]", $users, '', "class='select-2 chosen' onchange='setRole(this.value, $i)'");?></td>
|
||||
<td><input type='text' name='roles[]' id='role<?php echo ($i);?>' class='text-2' /></td>
|
||||
<td><input type='text' name='days[]' id='days<?php echo ($i);?>' class='text-2' value='<?php echo $project->days?>'/></td>
|
||||
<td>
|
||||
@@ -70,7 +70,7 @@
|
||||
<input type='hidden' name='modes[]' value='create' />
|
||||
</td>
|
||||
</tr>
|
||||
<?php $i ++;?>
|
||||
<?php $i ++; $memberCount ++;?>
|
||||
<?php endfor;?>
|
||||
<tr>
|
||||
<td colspan='4'>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<?php include '../../common/view/tablesorter.html.php';?>
|
||||
<?php js::set('confirmUnlinkStory', $lang->project->confirmUnlinkStory)?>
|
||||
<div id='featurebar'>
|
||||
<div class='f-left'><?php echo $lang->project->story;?></div>
|
||||
<div class='f-left strong'><?php echo $lang->project->story;?></div>
|
||||
<div class='f-right'>
|
||||
<?php
|
||||
common::printIcon('story', 'export', "productID=$productID&orderBy=id_desc");
|
||||
|
||||
@@ -82,23 +82,23 @@ var browseType = '<?php echo $browseType;?>';
|
||||
if($task->fromBug) echo html::a($this->createLink('bug', 'view', "id=$task->fromBug"), "[BUG#$task->fromBug]", '_blank', "class='bug'");
|
||||
?>
|
||||
</td>
|
||||
<td class=<?php echo $task->status;?> >
|
||||
<td class="<?php echo $task->status;?>">
|
||||
<?php
|
||||
$storyChanged = ($task->storyStatus == 'active' and $task->latestStoryVersion > $task->storyVersion);
|
||||
$storyChanged ? print("<span class='warning'>{$lang->story->changed}</span> ") : print($lang->task->statusList[$task->status]);
|
||||
?>
|
||||
</td>
|
||||
<td class=<?php if(isset($task->delay)) echo 'delayed';?>><?php if(substr($task->deadline, 0, 4) > 0) echo substr($task->deadline, 5, 6);?></td>
|
||||
<td class="<?php if(isset($task->delay)) echo 'delayed';?>"><?php if(substr($task->deadline, 0, 4) > 0) echo substr($task->deadline, 5, 6);?></td>
|
||||
|
||||
<?php if($this->cookie->windowWidth > $this->config->wideSize):?>
|
||||
<td><?php echo substr($task->openedDate, 5, 6);?></th>
|
||||
<td><?php echo substr($task->openedDate, 5, 6);?></td>
|
||||
<?php endif;?>
|
||||
|
||||
<td <?php echo $class;?>><?php echo $task->assignedTo == 'closed' ? 'Closed' : $task->assignedToRealName;?></td>
|
||||
<td><?php echo $users[$task->finishedBy];?></td>
|
||||
|
||||
<?php if($this->cookie->windowWidth > $this->config->wideSize):?>
|
||||
<td><?php echo substr($task->finishedDate, 5, 6);?></th>
|
||||
<td><?php echo substr($task->finishedDate, 5, 6);?></td>
|
||||
<?php endif;?>
|
||||
|
||||
<td><?php echo $task->estimate;?></td>
|
||||
@@ -107,7 +107,7 @@ var browseType = '<?php echo $browseType;?>';
|
||||
<?php
|
||||
if($project->type == 'sprint')
|
||||
{
|
||||
echo '<td class="a-left" title="' . $task->storyTitle . '"';
|
||||
echo '<td class="a-left" title="' . $task->storyTitle . '">';
|
||||
if($task->storyID)
|
||||
{
|
||||
if(!common::printLink('story', 'view', "storyid=$task->storyID", $task->storyTitle)) print $task->storyTitle;
|
||||
@@ -149,7 +149,7 @@ var browseType = '<?php echo $browseType;?>';
|
||||
echo "</div>";
|
||||
|
||||
$actionLink = $this->createLink('task', 'batchEdit', "projectID=$projectID");
|
||||
$misc = $canBatchEdit ? "onclick=setFormAction('$actionLink')" : "disabled='disabled'";
|
||||
$misc = $canBatchEdit ? "onclick=\"setFormAction('$actionLink')\"" : "disabled='disabled'";
|
||||
echo "<div class='groupButton dropButton'>";
|
||||
echo html::commonButton($lang->edit, $misc);
|
||||
echo "<button id='moreAction' type='button' onclick=\"toggleSubMenu(this.id, 'top', 0)\"><span class='caret'></span></button>";
|
||||
@@ -172,7 +172,7 @@ var browseType = '<?php echo $browseType;?>';
|
||||
<ul>
|
||||
<?php
|
||||
$actionLink = $this->createLink('task', 'batchClose');
|
||||
$misc = $canBatchClose ? "onclick=setFormAction('$actionLink','hiddenwin')" : "class='disabled'";
|
||||
$misc = $canBatchClose ? "onclick=\"setFormAction('$actionLink','hiddenwin')\"" : "class='disabled'";
|
||||
echo "<li>" . html::a('#', $lang->close, '', $misc) . "</li>";
|
||||
?>
|
||||
</ul>
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
common::printIcon('task', 'report', "project=$projectID&browseType=$browseType");
|
||||
|
||||
echo '<span class="link-button dropButton">';
|
||||
echo html::a("#", "<i class='icon-upload-alt'></i> " . $lang->export, '', "id='exportAction' onclick=toggleSubMenu(this.id,'bottom',0) title='{$lang->export}'");
|
||||
echo html::a("#", "<i class='icon-upload-alt'></i> " . $lang->export, '', "id='exportAction' onclick=\"toggleSubMenu(this.id,'bottom',0)\" title='{$lang->export}'");
|
||||
echo '</span>';
|
||||
|
||||
echo '<span class="link-button dropButton">';
|
||||
echo html::a("#", "<i class='icon-download-alt'></i> " . $lang->import, '', "id='importAction' onclick=toggleSubMenu(this.id,'bottom',0) title='{$lang->import}'");
|
||||
echo html::a("#", "<i class='icon-download-alt'></i> " . $lang->import, '', "id='importAction' onclick=\"toggleSubMenu(this.id,'bottom',0)\" title='{$lang->import}'");
|
||||
echo '</span>';
|
||||
|
||||
common::printIcon('task', 'batchCreate', "projectID=$projectID");
|
||||
|
||||
@@ -88,10 +88,13 @@ class release extends control
|
||||
{
|
||||
$changes = $this->release->update($releaseID);
|
||||
if(dao::isError()) die(js::error(dao::getError()));
|
||||
if($changes)
|
||||
$files = $this->loadModel('file')->saveUpload('release', $releaseID);
|
||||
if($changes or $files)
|
||||
{
|
||||
$actionID = $this->loadModel('action')->create('release', $releaseID, 'edited');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$fileAction = '';
|
||||
if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
|
||||
$actionID = $this->loadModel('action')->create('release', $releaseID, 'Edited', $fileAction);
|
||||
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
die(js::locate(inlink('view', "releaseID=$releaseID"), 'parent'));
|
||||
}
|
||||
|
||||
@@ -36,3 +36,6 @@ $lang->release->ajaxGetStoriesAndBugs = 'API: Get storeis and bugs';
|
||||
$lang->release->finishStories = 'The total demand for a complete %s';
|
||||
$lang->release->resolvedBugs = 'The total solution of bug%s';
|
||||
$lang->release->export = 'Export as HTML';
|
||||
|
||||
$lang->release->filePath = 'Download : ';
|
||||
$lang->release->scmPath = 'SCM Path : ';
|
||||
|
||||
@@ -36,3 +36,6 @@ $lang->release->ajaxGetStoriesAndBugs = '接口:获得需求和Bug';
|
||||
$lang->release->finishStories = '本次共完成需求%s个';
|
||||
$lang->release->resolvedBugs = '本次共解决Bug%s个';
|
||||
$lang->release->export = '导出HTML';
|
||||
|
||||
$lang->release->filePath = '下载地址:';
|
||||
$lang->release->scmPath = '版本库地址:';
|
||||
|
||||
+28
-15
@@ -23,14 +23,18 @@ class releaseModel extends model
|
||||
*/
|
||||
public function getByID($releaseID, $setImgSize = false)
|
||||
{
|
||||
$release = $this->dao->select('t1.*, t2.name as buildName, t3.name as productName')
|
||||
$release = $this->dao->select('t1.*, t2.id as buildID, t2.packageType, t2.filePath, t2.scmPath, t2.name as buildName, t3.name as productName')
|
||||
->from(TABLE_RELEASE)->alias('t1')
|
||||
->leftJoin(TABLE_BUILD)->alias('t2')->on('t1.build = t2.id')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t3')->on('t1.product = t3.id')
|
||||
->where('t1.id')->eq((int)$releaseID)
|
||||
->orderBy('t1.id DESC')
|
||||
->fetch();
|
||||
if($setImgSize) $release->desc = $this->loadModel('file')->setImgSize($release->desc);
|
||||
if(!$release) return false;
|
||||
|
||||
$release->files = $this->loadModel('file')->getByObject('release', $releaseID);
|
||||
if($release->packageType == 'file' and empty($release->files)) $release->files = $this->loadModel('file')->getByObject('build', $release->buildID);
|
||||
if($setImgSize) $release->desc = $this->file->setImgSize($release->desc);
|
||||
return $release;
|
||||
}
|
||||
|
||||
@@ -91,31 +95,39 @@ class releaseModel extends model
|
||||
*/
|
||||
public function create($productID)
|
||||
{
|
||||
if($this->post->build == false)
|
||||
if($this->post->build == false)
|
||||
{
|
||||
$build = fixer::input('post')
|
||||
->stripTags('name')
|
||||
->add('product', (int)$productID)
|
||||
->add('builder', $this->app->user->account)
|
||||
->remove('build')
|
||||
->remove('build,files,labels')
|
||||
->get();
|
||||
$this->dao->insert(TABLE_BUILD)->data($build)->autoCheck()->check('name','unique')->exec();
|
||||
$buildID = $this->dao->lastInsertID();
|
||||
}
|
||||
|
||||
$release = fixer::input('post')
|
||||
->stripTags('name')
|
||||
->add('product', (int)$productID)
|
||||
->join('stories', ',')
|
||||
->join('bugs', ',')
|
||||
->setIF($this->post->build == false, 'build', $buildID)
|
||||
->remove('allchecker')
|
||||
->get();
|
||||
$release = fixer::input('post')
|
||||
->stripTags('name')
|
||||
->add('product', (int)$productID)
|
||||
->setDefault('stories', '')
|
||||
->join('stories', ',')
|
||||
->join('bugs', ',')
|
||||
->setIF($this->post->build == false, 'build', $buildID)
|
||||
->remove('allchecker,files,labels')
|
||||
->get();
|
||||
|
||||
$this->dao->insert(TABLE_RELEASE)->data($release)->autoCheck()->batchCheck($this->config->release->create->requiredFields, 'notempty')->check('name','unique')->exec();
|
||||
$releaseID = $this->dao->lastInsertID();
|
||||
if($release->stories) $this->dao->update(TABLE_STORY)->set('stage')->eq('released')->where('id')->in($release->stories)->exec();
|
||||
if(!dao::isError()) return $releaseID;
|
||||
|
||||
if(!dao::isError())
|
||||
{
|
||||
$releaseID = $this->dao->lastInsertID();
|
||||
$this->loadModel('file')->saveUpload('release', $releaseID);
|
||||
if($release->stories) $this->dao->update(TABLE_STORY)->set('stage')->eq('released')->where('id')->in($release->stories)->exec();
|
||||
if(!dao::isError()) return $releaseID;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -134,6 +146,7 @@ class releaseModel extends model
|
||||
->setDefault('bugs', '')
|
||||
->join('stories', ',')
|
||||
->join('bugs', ',')
|
||||
->remove('files,labels')
|
||||
->get();
|
||||
$this->dao->update(TABLE_RELEASE)->data($release)
|
||||
->autoCheck()
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<form method='post' target='hiddenwin' id='dataform'>
|
||||
<form method='post' target='hiddenwin' id='dataform' enctype='multipart/form-data'>
|
||||
<table class='table-1'>
|
||||
<caption><?php echo $lang->release->create;?></caption>
|
||||
<tr>
|
||||
@@ -42,6 +42,10 @@
|
||||
<th class='rowhead'><?php echo $lang->release->desc;?></th>
|
||||
<td><?php echo html::textarea('desc', '', "rows='10' class='area-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->files;?></th>
|
||||
<td class='a-left'><?php echo $this->fetch('file', 'buildform', array('fileCount' => 1));?></td>
|
||||
</tr>
|
||||
<tr><td colspan='2' class='a-center'><?php echo html::submitButton() . html::backButton();?></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<form method='post' target='hiddenwin' id='dataform'>
|
||||
<form method='post' target='hiddenwin' id='dataform' enctype='multipart/form-data'>
|
||||
<table class='table-1'>
|
||||
<caption><?php echo $lang->release->edit;?></caption>
|
||||
<tr>
|
||||
@@ -106,7 +106,11 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->release->desc;?></th>
|
||||
<td><?php echo html::textarea('desc', $release->desc, "rows='20' class='area-1'");?></td>
|
||||
<td><?php echo html::textarea('desc', $release->desc, "rows=10 class='area-1'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->files;?></th>
|
||||
<td class='a-left'><?php echo $this->fetch('file', 'buildform', array('fileCount' => 1));?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='2' class='a-center'><?php echo html::submitButton() . html::backButton() . html::hidden('product', $release->product);?></td>
|
||||
|
||||
@@ -19,6 +19,16 @@
|
||||
<legend><?php echo $lang->release->desc;?></legend>
|
||||
<div class='content'><?php echo $release->desc;?></div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->files?></legend>
|
||||
<?php if($release->files):?>
|
||||
<?php echo $this->fetch('file', 'printFiles', array('files' => $release->files, 'fieldset' => 'false'));?>
|
||||
<?php elseif($release->filePath):?>
|
||||
<?php echo $lang->release->filePath . html::a($release->filePath, $release->filePath, '_blank')?>
|
||||
<?php elseif($release->scmPath):?>
|
||||
<?php echo $lang->release->scmPath . html::a($release->scmPath, $release->scmPath, '_blank')?>
|
||||
<?php endif;?>
|
||||
</fieldset>
|
||||
<?php include '../../common/view/action.html.php';?>
|
||||
<div class='a-center f-16px pb-10px'>
|
||||
<?php
|
||||
|
||||
@@ -179,7 +179,7 @@ class searchModel extends model
|
||||
if($params[$fieldName]['values'] == 'projects') $hasProject = true;
|
||||
}
|
||||
|
||||
if($hasUser)
|
||||
if($hasUser)
|
||||
{
|
||||
$users = $this->loadModel('user')->getPairs();
|
||||
$users['$@me'] = $this->lang->search->me;
|
||||
|
||||
+27
-23
@@ -57,7 +57,7 @@ class story extends control
|
||||
{
|
||||
$actionID = $this->action->create('story', $storyID, 'Frombug', '', $bugID);
|
||||
}
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
if($this->post->newStory)
|
||||
{
|
||||
$response['message'] = $this->lang->story->successSaved . $this->lang->story->newStory;
|
||||
@@ -184,7 +184,7 @@ class story extends control
|
||||
|
||||
foreach($mails as $mail)
|
||||
{
|
||||
$this->sendMail($mail->storyID, $mail->actionID);
|
||||
$this->sendmail($mail->storyID, $mail->actionID);
|
||||
}
|
||||
die(js::locate($this->createLink('product', 'browse', "productID=$productID"), 'parent'));
|
||||
}
|
||||
@@ -273,7 +273,7 @@ class story extends control
|
||||
$action = !empty($changes) ? 'Edited' : 'Commented';
|
||||
$actionID = $this->action->create('story', $storyID, $action, $this->post->comment);
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
}
|
||||
die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent'));
|
||||
}
|
||||
@@ -309,7 +309,7 @@ class story extends control
|
||||
{
|
||||
$actionID = $this->action->create('story', $storyID, 'Edited');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
}
|
||||
}
|
||||
die(js::locate($this->session->storyList, 'parent'));
|
||||
@@ -326,7 +326,8 @@ class story extends control
|
||||
{
|
||||
$this->product->setMenu($this->product->getPairs('nodeleted'), $productID);
|
||||
$product = $this->product->getByID($productID);
|
||||
$this->view->title = $product->name . $this->lang->colon . $this->lang->story->batchEdit;
|
||||
$this->view->position[] = html::a($this->createLink('product', 'browse', "product=$product->id"), $product->name);
|
||||
$this->view->title = $product->name . $this->lang->colon . $this->lang->story->batchEdit;
|
||||
|
||||
}
|
||||
/* The stories of a project. */
|
||||
@@ -337,7 +338,8 @@ class story extends control
|
||||
$this->lang->set('menugroup.story', 'project');
|
||||
$this->lang->story->menuOrder = $this->lang->project->menuOrder;
|
||||
$project = $this->project->getByID($projectID);
|
||||
$this->view->title = $project->name . $this->lang->colon . $this->lang->story->batchEdit;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'story', "project=$project->id"), $project->name);
|
||||
$this->view->title = $project->name . $this->lang->colon . $this->lang->story->batchEdit;
|
||||
}
|
||||
/* The stories of my. */
|
||||
else
|
||||
@@ -346,7 +348,8 @@ class story extends control
|
||||
$this->lang->set('menugroup.story', 'my');
|
||||
$this->lang->story->menuOrder = $this->lang->my->menuOrder;
|
||||
$this->loadModel('my')->setMenu();
|
||||
$this->view->title = $this->lang->story->batchEdit;
|
||||
$this->view->position[] = html::a($this->createLink('my', 'story'), $this->lang->my->story);
|
||||
$this->view->title = $this->lang->story->batchEdit;
|
||||
}
|
||||
|
||||
/* Get the module and productplan of edited stories. */
|
||||
@@ -365,7 +368,6 @@ class story extends control
|
||||
$this->app->session->set('showSuhosinInfo', $showSuhosinInfo);
|
||||
if($showSuhosinInfo) $this->view->suhosinInfo = $this->lang->suhosinInfo;
|
||||
|
||||
$this->view->position[] = html::a($this->createLink('product', 'browse', "product=$product->id"), $product->name);
|
||||
$this->view->position[] = $this->lang->story->common;
|
||||
$this->view->position[] = $this->lang->story->batchEdit;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('nodeleted');
|
||||
@@ -399,7 +401,7 @@ class story extends control
|
||||
if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
|
||||
$actionID = $this->action->create('story', $storyID, $action, $fileAction . $this->post->comment);
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
}
|
||||
die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent'));
|
||||
}
|
||||
@@ -432,8 +434,7 @@ class story extends control
|
||||
$this->story->activate($storyID);
|
||||
if(dao::isError()) die(js::error(dao::getError()));
|
||||
$actionID = $this->action->create('story', $storyID, 'Activated', $this->post->comment);
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
|
||||
if(isonlybody()) die(js::closeColorbox('parent.parent'));
|
||||
die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent'));
|
||||
@@ -535,7 +536,7 @@ class story extends control
|
||||
if($this->post->closedReason != '' and strpos('done,postponed,subdivided', $this->post->closedReason) !== false) $result = 'pass';
|
||||
$actionID = $this->action->create('story', $storyID, 'Reviewed', $this->post->comment, ucfirst($result));
|
||||
$this->action->logHistory($actionID, array());
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
if($this->post->result == 'reject')
|
||||
{
|
||||
$this->action->create('story', $storyID, 'Closed', '', ucfirst($this->post->closedReason));
|
||||
@@ -588,7 +589,7 @@ class story extends control
|
||||
$actions = $this->story->batchReview($storyIDList, $result, $reason);
|
||||
|
||||
if(dao::isError()) die(js::error(dao::getError()));
|
||||
foreach($actions as $storyID => $actionID) $this->sendMail($storyID, $actionID);
|
||||
foreach($actions as $storyID => $actionID) $this->sendmail($storyID, $actionID);
|
||||
die(js::locate($this->session->storyList, 'parent'));
|
||||
}
|
||||
|
||||
@@ -607,7 +608,7 @@ class story extends control
|
||||
if(dao::isError()) die(js::error(dao::getError()));
|
||||
$actionID = $this->action->create('story', $storyID, 'Closed', $this->post->comment, ucfirst($this->post->closedReason));
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
if(isonlybody()) die(js::closeColorbox('parent.parent'));
|
||||
die(js::locate(inlink('view', "storyID=$storyID"), 'parent'));
|
||||
}
|
||||
@@ -653,8 +654,8 @@ class story extends control
|
||||
foreach($allChanges as $storyID => $changes)
|
||||
{
|
||||
$actionID = $this->action->create('story', $storyID, 'Closed', htmlspecialchars($this->post->comments[$storyID]), ucfirst($this->post->closedReasons[$storyID]));
|
||||
$this->action->logHistory($actionID);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
}
|
||||
}
|
||||
die(js::locate($this->session->storyList, 'parent'));
|
||||
@@ -681,7 +682,8 @@ class story extends control
|
||||
$this->project->setMenu($this->project->getPairs('nodeleted'), $projectID);
|
||||
$this->lang->set('menugroup.story', 'project');
|
||||
$project = $this->project->getByID($projectID);
|
||||
$this->view->title = $project->name . $this->lang->colon . $this->lang->story->batchClose;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'story', "project=$project->id"), $project->name);
|
||||
$this->view->title = $project->name . $this->lang->colon . $this->lang->story->batchClose;
|
||||
}
|
||||
/* The stories of my. */
|
||||
else
|
||||
@@ -690,7 +692,8 @@ class story extends control
|
||||
$this->lang->set('menugroup.story', 'my');
|
||||
$this->lang->story->menuOrder = $this->lang->my->menuOrder;
|
||||
$this->loadModel('my')->setMenu();
|
||||
$this->view->title = $this->lang->story->batchEdit;
|
||||
$this->view->position[] = html::a($this->createLink('my', 'story'), $this->lang->my->story);
|
||||
$this->view->title = $this->lang->story->batchEdit;
|
||||
}
|
||||
|
||||
/* Judge whether the editedStories is too large and set session. */
|
||||
@@ -726,7 +729,7 @@ class story extends control
|
||||
{
|
||||
$actionID = $this->action->create('story', $storyID, 'Edited');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
}
|
||||
die(js::locate($this->session->storyList, 'parent'));
|
||||
}
|
||||
@@ -747,7 +750,7 @@ class story extends control
|
||||
{
|
||||
$actionID = $this->action->create('story', $storyID, 'Edited');
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->sendMail($storyID, $actionID);
|
||||
$this->sendmail($storyID, $actionID);
|
||||
}
|
||||
die(js::locate($this->session->storyList, 'parent'));
|
||||
}
|
||||
@@ -885,6 +888,7 @@ class story extends control
|
||||
$this->view->story = $story;
|
||||
$this->view->action = $action;
|
||||
$this->view->users = $this->user->getPairs('noletter');
|
||||
$this->clear();
|
||||
$mailContent = $this->parse($this->moduleName, 'sendmail');
|
||||
|
||||
/* Send it. */
|
||||
@@ -1026,9 +1030,9 @@ class story extends control
|
||||
$story->verify = str_replace('"', '""', $story->verify);
|
||||
}
|
||||
/* fill some field with useful value. */
|
||||
if(isset($products[$story->product])) $story->product = $products[$story->product];
|
||||
if(isset($relatedModules[$story->module])) $story->module = $relatedModules[$story->module];
|
||||
if(isset($relatedPlans[$story->plan])) $story->plan = $relatedPlans[$story->plan];
|
||||
if(isset($products[$story->product])) $story->product = $products[$story->product] . "(#$story->product)";
|
||||
if(isset($relatedModules[$story->module])) $story->module = $relatedModules[$story->module] . "(#$story->module)";
|
||||
if(isset($relatedPlans[$story->plan])) $story->plan = $relatedPlans[$story->plan] . "(#$story->plan)";
|
||||
if(isset($relatedStories[$story->duplicateStory])) $story->duplicateStory = $relatedStories[$story->duplicateStory];
|
||||
|
||||
if(isset($storyLang->priList[$story->pri])) $story->pri = $storyLang->priList[$story->pri];
|
||||
|
||||
+20
-5
@@ -148,6 +148,7 @@ class storyModel extends model
|
||||
|
||||
if($bugID > 0)
|
||||
{
|
||||
$bug = new stdclass();
|
||||
$bug->toStory = $storyID;
|
||||
$bug->status = 'closed';
|
||||
$bug->resolution = 'tostory';
|
||||
@@ -226,7 +227,7 @@ class storyModel extends model
|
||||
$specData[$i]->story = $storyID;
|
||||
$specData[$i]->version = 1;
|
||||
$specData[$i]->title = htmlspecialchars($stories->title[$i]);
|
||||
if($stories->spec[$i] != '') $specData[$i]->spec = htmlspecialchars($stories->spec[$i]);
|
||||
if($stories->spec[$i] != '') $specData[$i]->spec = str_replace(array("\r\n", "\n"), '<br />', htmlspecialchars($stories->spec[$i]));
|
||||
$this->dao->insert(TABLE_STORYSPEC)->data($specData[$i])->exec();
|
||||
|
||||
$this->loadModel('action');
|
||||
@@ -595,6 +596,7 @@ class storyModel extends model
|
||||
$oldStory = $this->getById($storyID);
|
||||
if($oldStory->status == 'closed') continue;
|
||||
|
||||
$story = new stdclass();
|
||||
$story->lastEditedBy = $this->app->user->account;
|
||||
$story->lastEditedDate = $now;
|
||||
$story->closedBy = $this->app->user->account;
|
||||
@@ -1071,10 +1073,11 @@ class storyModel extends model
|
||||
* @param int $projectID
|
||||
* @param int $productID
|
||||
* @param array|string $moduleIds
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getProjectStoryPairs($projectID = 0, $productID = 0, $moduleIds = 0)
|
||||
public function getProjectStoryPairs($projectID = 0, $productID = 0, $moduleIds = 0, $type = 'full')
|
||||
{
|
||||
$stories = $this->dao->select('t2.id, t2.title, t2.module, t2.pri, t2.estimate, t3.name AS product')
|
||||
->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
@@ -1088,7 +1091,7 @@ class storyModel extends model
|
||||
->beginIF($moduleIds)->andWhere('t2.module')->in($moduleIds)->fi()
|
||||
->fetchAll();
|
||||
if(!$stories) return array();
|
||||
return $this->formatStories($stories);
|
||||
return $this->formatStories($stories, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1228,10 +1231,11 @@ class storyModel extends model
|
||||
* Format stories
|
||||
*
|
||||
* @param array $stories
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function formatStories($stories)
|
||||
public function formatStories($stories, $type = 'full')
|
||||
{
|
||||
/* Get module names of stories. */
|
||||
/*$modules = array();
|
||||
@@ -1240,7 +1244,18 @@ class storyModel extends model
|
||||
|
||||
/* Format these stories. */
|
||||
$storyPairs = array('' => ' ');
|
||||
foreach($stories as $story) $storyPairs[$story->id] = $story->id . ':' . $story->title . "({$this->lang->story->pri}:$story->pri, {$this->lang->story->estimate}: $story->estimate)";
|
||||
foreach($stories as $story)
|
||||
{
|
||||
if($type == 'short')
|
||||
{
|
||||
$property = '[p' . $story->pri . ', ' . $story->estimate . 'h]';
|
||||
}
|
||||
else
|
||||
{
|
||||
$property = '(' . $this->lang->story->pri . ':' . $story->pri . ',' . $this->lang->story->estimate . ':' . $story->estimate . ')';
|
||||
}
|
||||
$storyPairs[$story->id] = $story->id . ':' . $story->title . $property;
|
||||
}
|
||||
return $storyPairs;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/colorize.html.php';?>
|
||||
<form method='post' target='hiddenwin' action="<?php echo inLink('batchClose', "from=storyBatchClose")?>">
|
||||
<table class='table-1 fixed colored'>
|
||||
<table class='table-1 fixed'>
|
||||
<caption><?php echo $lang->story->common . $lang->colon . $lang->story->batchClose;?></caption>
|
||||
<tr>
|
||||
<th class='w-30px'> <?php echo $lang->idAB;?></th>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<caption><?php echo $lang->story->change;?></caption>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->story->reviewedBy;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, $story->assignedTo, 'class="select-3"') . html::checkbox('needNotReview', $lang->story->needNotReview, '', "id='needNotReview'");?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $story->assignedTo, 'class="select-3 chosen"') . html::checkbox('needNotReview', $lang->story->needNotReview, '', "id='needNotReview'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->story->title;?></th>
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->story->reviewedBy;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, '', 'class=select-3') . html::checkbox('needNotReview', $lang->story->needNotReview, '', "id='needNotReview'");?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, '', "class='select-3 chosen'") . html::checkbox('needNotReview', $lang->story->needNotReview, '', "id='needNotReview'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><nobr><?php echo $lang->story->mailto;?></nobr></th>
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->story->assignedTo;?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $story->assignedTo, 'class="select-3"');?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $story->assignedTo, 'class="select-3 chosen"');?></td>
|
||||
</tr>
|
||||
<?php if($story->reviewedBy):?>
|
||||
<tr>
|
||||
|
||||
+11
-9
@@ -161,8 +161,9 @@ class task extends control
|
||||
die(js::locate($storyLink, 'parent'));
|
||||
}
|
||||
|
||||
$stories = $this->story->getProjectStoryPairs($projectID);
|
||||
$stories = $this->story->getProjectStoryPairs($projectID, 0, 0, 'short');
|
||||
$members = $this->project->getTeamMemberPairs($projectID, 'nodeleted');
|
||||
$modules = $this->loadModel('tree')->getTaskOptionMenu($projectID);
|
||||
$title = $project->name . $this->lang->colon . $this->lang->task->batchCreate;
|
||||
$position[] = html::a($taskLink, $project->name);
|
||||
$position[] = $this->lang->task->common;
|
||||
@@ -172,6 +173,7 @@ class task extends control
|
||||
$this->view->position = $position;
|
||||
$this->view->project = $project;
|
||||
$this->view->stories = $stories;
|
||||
$this->view->modules = $modules;
|
||||
$this->view->storyID = $storyID;
|
||||
$this->view->members = $members;
|
||||
$this->display();
|
||||
@@ -226,7 +228,7 @@ class task extends control
|
||||
$fileAction = '';
|
||||
if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
|
||||
$actionID = $this->action->create('task', $taskID, $action, $fileAction . $this->post->comment);
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
|
||||
$this->sendmail($taskID, $actionID);
|
||||
}
|
||||
|
||||
@@ -313,7 +315,7 @@ class task extends control
|
||||
$this->view->title = $project->name . $this->lang->colon . $this->lang->task->batchEdit;
|
||||
$this->view->position[] = html::a($this->createLink('project', 'browse', "project=$project->id"), $project->name);
|
||||
$this->view->project = $project;
|
||||
$this->view->modules = $this->tree->getOptionMenu($projectID, $viewType = 'task');
|
||||
$this->view->modules = $this->tree->getTaskOptionMenu($projectID);
|
||||
$this->view->members = $members;
|
||||
}
|
||||
/* The tasks of my. */
|
||||
@@ -323,8 +325,9 @@ class task extends control
|
||||
$this->lang->set('menugroup.task', 'my');
|
||||
$this->lang->task->menuOrder = $this->lang->my->menuOrder;
|
||||
$this->loadModel('my')->setMenu();
|
||||
$this->view->title = $this->lang->task->batchEdit;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->position[] = html::a($this->createLink('my', 'task'), $this->lang->my->task);
|
||||
$this->view->title = $this->lang->task->batchEdit;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
}
|
||||
|
||||
/* Get edited tasks. */
|
||||
@@ -586,7 +589,6 @@ class task extends control
|
||||
|
||||
$this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->finish;
|
||||
$this->view->position[] = $this->lang->task->finish;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('nodeleted|noletter', $this->view->task->openedBy);
|
||||
$this->view->date = strftime("%Y-%m-%d %X", strtotime('now'));
|
||||
|
||||
$this->display();
|
||||
@@ -947,14 +949,14 @@ class task extends control
|
||||
}
|
||||
|
||||
/* fill some field with useful value. */
|
||||
$task->story = isset($relatedStories[$task->story]) ? $relatedStories[$task->story] : '';
|
||||
$task->story = isset($relatedStories[$task->story]) ? $relatedStories[$task->story] . "(#$task->story)" : '';
|
||||
|
||||
if(isset($projects[$task->project])) $task->project = $projects[$task->project];
|
||||
if(isset($projects[$task->project])) $task->project = $projects[$task->project] . "(#$task->project)";
|
||||
if(isset($taskLang->typeList[$task->type])) $task->type = $taskLang->typeList[$task->type];
|
||||
if(isset($taskLang->priList[$task->pri])) $task->pri = $taskLang->priList[$task->pri];
|
||||
if(isset($taskLang->statusList[$task->status])) $task->status = $taskLang->statusList[$task->status];
|
||||
if(isset($taskLang->reasonList[$task->closedReason])) $task->closedReason = $taskLang->reasonList[$task->closedReason];
|
||||
if(isset($relatedModules[$task->module])) $task->module = $relatedModules[$task->module];
|
||||
if(isset($relatedModules[$task->module])) $task->module = $relatedModules[$task->module] . "(#$task->module)";
|
||||
|
||||
if(isset($users[$task->openedBy])) $task->openedBy = $users[$task->openedBy];
|
||||
if(isset($users[$task->assignedTo])) $task->assignedTo = $users[$task->assignedTo];
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
textarea {height:16px}
|
||||
.icon-green-same:before {content: "\f105";}
|
||||
.sameAsStory{float:right;}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.button-c {padding:2px}
|
||||
#mailto {width:90.5%}
|
||||
#preview{display: inline-block; line-height: 24px;position: relative;top: -10px;+top:0;}
|
||||
#preview{line-height: 24px;position: relative;top: -10px;+top:0;}
|
||||
caption .f-right a{color:red}
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
$(function() {
|
||||
for(i=0; i<batchCreateNum; i++) $("#story" + i).chosen({no_results_text: noResultsMatch});
|
||||
})
|
||||
|
||||
/* Copy story title as task title. */
|
||||
function copyStoryTitle(num)
|
||||
{
|
||||
var storyTitle = $('#story' + num).find('option:selected').text();
|
||||
startPosition = storyTitle.indexOf(':') + 1;
|
||||
endPosition = storyTitle.lastIndexOf('[');
|
||||
storyTitle = storyTitle.substr(startPosition, endPosition - startPosition);
|
||||
$('#story' + num).parent().next().find('input:first').val(storyTitle);
|
||||
}
|
||||
|
||||
@@ -89,9 +89,10 @@ function setStories(moduleID, projectID)
|
||||
$.get(link, function(stories)
|
||||
{
|
||||
var storyID = $('#story').val();
|
||||
if(!stories) stories = '<select id="story" name="story"></select>';
|
||||
if(!stories) stories = '<select id="story" name="story" class="select-1"></select>';
|
||||
$('#story').replaceWith(stories);
|
||||
$('#story').val(storyID);
|
||||
setPreview();
|
||||
$('#story_chzn').remove();
|
||||
$("#story").chosen({no_results_text: ''});
|
||||
});
|
||||
|
||||
@@ -66,31 +66,5 @@ function loadProjectMembers(projectID)
|
||||
$('#assignedToIdBox').load(link);
|
||||
}
|
||||
|
||||
/**
|
||||
* load stories of module.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadModuleRelated()
|
||||
{
|
||||
moduleID = $('#module').val();
|
||||
projectID = $('#project').val();
|
||||
setStories(moduleID, projectID);
|
||||
}
|
||||
|
||||
/* Get select of stories.*/
|
||||
function setStories(moduleID, projectID)
|
||||
{
|
||||
link = createLink('story', 'ajaxGetProjectStories', 'projectID=' + projectID + '&productID=0&moduleID=' + moduleID);
|
||||
$.get(link, function(stories)
|
||||
{
|
||||
if(!stories) stories = '<select id="story" name="story"></select>';
|
||||
$('#story').replaceWith(stories);
|
||||
$('#story_chzn').remove();
|
||||
$("#story").chosen({no_results_text: ''});
|
||||
});
|
||||
}
|
||||
|
||||
/* empty function. */
|
||||
function setPreview(){}
|
||||
|
||||
@@ -107,11 +107,12 @@ class taskModel extends model
|
||||
if(empty($tasks->name[$i])) continue;
|
||||
|
||||
$data[$i] = new stdclass();
|
||||
$data[$i]->story = $tasks->story[$i] == 'ditto' ? (isset($data[$i-1]) ? $data[$i-1]->story : 0) : ($tasks->story[$i] ? $tasks->story[$i] : 0);
|
||||
$data[$i]->type = $tasks->type[$i] == 'ditto' ? (isset($data[$i-1]) ? $data[$i-1]->type : 0) : $tasks->type[$i];
|
||||
$data[$i]->story = $tasks->story[$i] == 'ditto' ? (isset($data[$i-1]) ? $data[$i-1]->story : 0) : ($tasks->story[$i] ? $tasks->story[$i] : 0);
|
||||
$data[$i]->type = $tasks->type[$i] == 'ditto' ? (isset($data[$i-1]) ? $data[$i-1]->type : 0) : $tasks->type[$i];
|
||||
$data[$i]->module = $tasks->module[$i] == 'ditto' ? (isset($data[$i-1]) ? $data[$i-1]->module : 0) : $tasks->module[$i];
|
||||
$data[$i]->assignedTo = $tasks->assignedTo[$i] == 'ditto' ? (isset($data[$i-1]) ? $data[$i-1]->assignedTo : 0) : $tasks->assignedTo[$i];
|
||||
$data[$i]->name = htmlspecialchars($tasks->name[$i]);
|
||||
$data[$i]->desc = htmlspecialchars($tasks->desc[$i]);
|
||||
$data[$i]->desc = str_replace(array("\r\n", "\n"), '<br />', htmlspecialchars($tasks->desc[$i]));
|
||||
$data[$i]->pri = $tasks->pri[$i];
|
||||
$data[$i]->estimate = $tasks->estimate[$i];
|
||||
$data[$i]->left = $tasks->estimate[$i];
|
||||
@@ -943,6 +944,7 @@ class taskModel extends model
|
||||
{
|
||||
$data->finishedBy = $this->app->user->account;
|
||||
$data->finishedDate = $now;
|
||||
$data->assignedTo = $task->openedBy;
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_TASK)->data($data)->where('id')->eq($task->id)->exec();
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<caption><?php echo $task->name;?></caption>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, '', "class='text-3'");?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, '', "class='text-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->left;?></th>
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<th><?php echo $lang->task->story;?></th>
|
||||
<th class='red'><?php echo $lang->task->name;?></th>
|
||||
<th class='w-60px red'><?php echo $lang->typeAB;?></th>
|
||||
<th class='w-80px'><?php echo $lang->task->module?></th>
|
||||
<th class='w-80px'><?php echo $lang->task->assignedTo;?></th>
|
||||
<th class='w-50px'><?php echo $lang->task->estimateAB;?></th>
|
||||
<th class='w-200px'><?php echo $lang->task->desc;?></th>
|
||||
@@ -31,6 +32,7 @@
|
||||
$stories['ditto'] = $this->lang->task->ditto;
|
||||
$lang->task->typeList['ditto'] = $lang->task->ditto;
|
||||
$members['ditto'] = $lang->task->ditto;
|
||||
$modules['ditto'] = $lang->task->ditto;
|
||||
?>
|
||||
<?php for($i = 0; $i < $config->task->batchCreate; $i++):?>
|
||||
<?php
|
||||
@@ -39,18 +41,25 @@
|
||||
$story = $storyID;
|
||||
$type = '';
|
||||
$member = '';
|
||||
$module = '';
|
||||
}
|
||||
else
|
||||
{
|
||||
$story = $type = $member = 'ditto';
|
||||
$story = $type = $member = $module = 'ditto';
|
||||
}
|
||||
?>
|
||||
<?php $pri = 3;?>
|
||||
<tr class='a-center'>
|
||||
<td><?php echo $i+1;?></td>
|
||||
<td class='a-left' style='overflow:visible'><?php echo html::select("story[$i]", $stories, $story, "class='select-1'");?></td>
|
||||
<td class='a-left' style='overflow:visible'>
|
||||
<?php
|
||||
echo html::select("story[$i]", $stories, $story, "class='select-1'");
|
||||
echo html::a("javascript:copyStoryTitle($i)", "<i class='icon-green-same'></i>", '', "class='sameAsStory' title='{$lang->task->copyStoryTitle}'");
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo html::input("name[$i]", '', 'class=text-1');?></td>
|
||||
<td><?php echo html::select("type[$i]", $lang->task->typeList, $type, 'class=select-1');?></td>
|
||||
<td><?php echo html::select("module[$i]", $modules, $module, 'class=select-1')?></td>
|
||||
<td><?php echo html::select("assignedTo[$i]", $members, $member, 'class=select-1');?></td>
|
||||
<td><?php echo html::input("estimate[$i]", '', 'class=text-1');?></td>
|
||||
<td><?php echo html::textarea("desc[$i]", '', "rows='1' class=text-1");?></td>
|
||||
|
||||
@@ -17,13 +17,12 @@
|
||||
<tr>
|
||||
<th class='w-30px'><?php echo $lang->idAB;?></th>
|
||||
<th class='red'> <?php echo $lang->task->name?></th>
|
||||
<th class='w-80px'><?php echo $lang->task->module?></th>
|
||||
<th class='w-150px'><?php echo $lang->task->module?></th>
|
||||
<th class='w-80px'><?php echo $lang->task->assignedTo;?></th>
|
||||
<th class='w-60px red'><?php echo $lang->typeAB;?></th>
|
||||
<th class='w-70px'><?php echo $lang->task->status;?></th>
|
||||
<th class='w-50px'><?php echo $lang->task->pri;?></th>
|
||||
<th class='w-30px red'><?php echo $lang->task->estimateAB;?></th>
|
||||
<th class='w-70px'><?php echo $lang->task->consumed;?></th>
|
||||
<th class='w-60px red'><?php echo $lang->task->consumedThisTime?></th>
|
||||
<th class='w-30px red'><?php echo $lang->task->leftAB?></th>
|
||||
<th class='w-80px'><?php echo $lang->task->finishedBy;?></th>
|
||||
@@ -41,13 +40,12 @@
|
||||
<tr class='a-center'>
|
||||
<td><?php echo $taskID . html::hidden("taskIDList[$taskID]", $taskID);?></td>
|
||||
<td><?php echo html::input("names[$taskID]", $tasks[$taskID]->name, 'class=text-1');?></td>
|
||||
<td><?php echo html::select("modules[$taskID]", $modules, $tasks[$taskID]->module, 'class=select-1')?></td>
|
||||
<td><?php echo html::select("modules[$taskID]", $modules, $tasks[$taskID]->module, 'class=select-1')?></td>
|
||||
<td><?php echo html::select("assignedTos[$taskID]", $members, $tasks[$taskID]->assignedTo, 'class=select-1');?></td>
|
||||
<td><?php echo html::select("types[$taskID]", $lang->task->typeList, $tasks[$taskID]->type, 'class=select-1');?></td>
|
||||
<td><?php echo html::select("statuses[$taskID]", $lang->task->statusList, $tasks[$taskID]->status, 'class=select-1');?></td>
|
||||
<td><?php echo html::select("pris[$taskID]", (array)$lang->task->priList, $tasks[$taskID]->pri, 'class=select-1');?></td>
|
||||
<td><?php echo html::input("estimates[$taskID]", $tasks[$taskID]->estimate, "class='text-1 a-center'");?></td>
|
||||
<td><?php echo html::input("", $tasks[$taskID]->consumed, "class='text-1 a-center' disabled");?></td>
|
||||
<td><?php echo html::input("consumeds[$taskID]", '', "class='text-1 a-center'");?></td>
|
||||
<td><?php echo html::input("lefts[$taskID]", $tasks[$taskID]->left, "class='text-1 a-center'");?></td>
|
||||
<td><?php echo html::select("finishedBys[$taskID]", $members, $tasks[$taskID]->finishedBy, 'class=select-1');?></td>
|
||||
@@ -57,13 +55,12 @@
|
||||
<?php endforeach;?>
|
||||
|
||||
<?php if(isset($suhosinInfo)):?>
|
||||
<tr><td colspan='<?php echo $this->config->task->batchEdit->columns + 1;?>'>
|
||||
<tr><td colspan='<?php echo $this->config->task->batchEdit->columns;?>'>
|
||||
<div class='f-left blue'><?php echo $suhosinInfo;?></div>
|
||||
</td></tr>
|
||||
<?php endif;?>
|
||||
|
||||
<?php $colspan = (!isset($project) or (isset($project) and $project->type != 'sprint')) ? $this->config->task->batchEdit->columns + 1 : $this->config->task->batchEdit->columns;?>
|
||||
<tr><td colspan='<?php echo $colspan;?>' class='a-center'>
|
||||
<tr><td colspan='<?php echo $this->config->task->batchEdit->columns;?>' class='a-center'>
|
||||
<?php echo html::submitButton();?>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo[]', $members, $task->assignedTo, 'class=select-3');?></td>
|
||||
<td><?php echo html::select('assignedTo[]', $members, $task->assignedTo, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->type;?></th>
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead w-p20'><?php echo $lang->task->module;?></th>
|
||||
<td><span id="moduleIdBox"><?php echo html::select('module', $modules, $task->module, 'class="select-1" onchange="loadModuleRelated()"');?></span></td>
|
||||
<td><span id="moduleIdBox"><?php echo html::select('module', $modules, $task->module, 'class="select-1"');?></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->story;?></th>
|
||||
@@ -64,7 +64,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->assignedTo;?></th>
|
||||
<td><span id="assignedToIdBox"><?php echo html::select('assignedTo', $members, $task->assignedTo, 'class=select-1');?></span></td>
|
||||
<td><span id="assignedToIdBox"><?php echo html::select('assignedTo', $members, $task->assignedTo, "class='select-1 chosen'");?></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->task->type;?></th>
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->task->assignedTo;?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $task->openedBy, "class='select-3'");?></td>
|
||||
<td><?php echo html::select('assignedTo', $members, $task->openedBy, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='rowhead'><?php echo $lang->task->finishedDate;?></td>
|
||||
|
||||
@@ -467,7 +467,8 @@ class testcase extends control
|
||||
$this->lang->set('menugroup.testcase', 'my');
|
||||
$this->lang->testcase->menuOrder = $this->lang->my->menuOrder;
|
||||
$this->loadModel('my')->setMenu();
|
||||
$this->view->title = $this->lang->testcase->batchEdit;
|
||||
$this->view->position[] = html::a($this->server->http_referer, $this->lang->my->testCase);
|
||||
$this->view->title = $this->lang->testcase->batchEdit;
|
||||
}
|
||||
|
||||
/* Judge whether the editedTasks is too large and set session. */
|
||||
@@ -662,9 +663,9 @@ class testcase extends control
|
||||
}
|
||||
|
||||
/* fill some field with useful value. */
|
||||
if(isset($products[$case->product])) $case->product = $products[$case->product];
|
||||
if(isset($relatedModules[$case->module])) $case->module = $relatedModules[$case->module];
|
||||
if(isset($relatedStories[$case->story])) $case->story = $relatedStories[$case->story];
|
||||
if(isset($products[$case->product])) $case->product = $products[$case->product] . "(#$case->product)";
|
||||
if(isset($relatedModules[$case->module])) $case->module = $relatedModules[$case->module] . "(#$case->module)";
|
||||
if(isset($relatedStories[$case->story])) $case->story = $relatedStories[$case->story] . "(#$case->story)";
|
||||
|
||||
if(isset($caseLang->priList[$case->pri])) $case->pri = $caseLang->priList[$case->pri];
|
||||
if(isset($caseLang->typeList[$case->type])) $case->type = $caseLang->typeList[$case->type];
|
||||
@@ -687,7 +688,7 @@ class testcase extends control
|
||||
foreach($linkCaseIdList as $linkCaseID)
|
||||
{
|
||||
$linkCaseID = trim($linkCaseID);
|
||||
$tmpLinkCases[] = isset($relatedCases[$linkCaseID]) ? $relatedCases[$linkCaseID] : $linkCaseID;
|
||||
$tmpLinkCases[] = isset($relatedCases[$linkCaseID]) ? $relatedCases[$linkCaseID] . "(#$linkCaseID)" : $linkCaseID;
|
||||
}
|
||||
$case->linkCase = join("; \n", $tmpLinkCases);
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ $lang->testcase->confirmStoryChange = '确认需求变动';
|
||||
|
||||
$lang->testcase->new = '新增';
|
||||
|
||||
$lang->testcase->num = '导入用例个数:';
|
||||
$lang->testcase->num = '用例记录数:';
|
||||
|
||||
$lang->testcase->deleteStep = '删除';
|
||||
$lang->testcase->insertBefore = '之前添加';
|
||||
|
||||
@@ -148,3 +148,4 @@ $lang->testcase->buttonEdit = '編輯';
|
||||
$lang->testcase->buttonToList = '返回';
|
||||
|
||||
$lang->testcase->errorEncode = '無數據,請選擇正確的編碼重新上傳!';
|
||||
$lang->testcase->noFunction = '不存在iconv和mb_convert_encoding轉碼方法,不能將數據轉成想要的編碼!';
|
||||
|
||||
@@ -34,7 +34,7 @@ js::set('confirmDelete', $lang->testcase->confirmDelete);
|
||||
common::printIcon('testcase', 'import', "productID=$productID", '', 'button', '', '', 'export cboxElement');
|
||||
|
||||
echo '<span class="link-button dropButton">';
|
||||
echo html::a("#", "<i class='icon-green-common-export'></i>" . $lang->export, '', "id='exportAction' onclick=toggleSubMenu(this.id,'bottom',0) title='{$lang->export}'");
|
||||
echo html::a("#", "<i class='icon-green-common-export'></i>" . $lang->export, '', "id='exportAction' onclick=\"toggleSubMenu(this.id,'bottom',0)\" title='{$lang->export}'");
|
||||
echo '</span>';
|
||||
|
||||
common::printIcon('testcase', 'batchCreate', "productID=$productID&moduleID=$moduleID");
|
||||
@@ -142,7 +142,7 @@ js::set('confirmDelete', $lang->testcase->confirmDelete);
|
||||
echo "<div class='groupButton'>" . html::selectAll() . html::selectReverse() . "</div>";
|
||||
|
||||
$actionLink = $this->createLink('testcase', 'batchEdit', "productID=$productID");
|
||||
$misc = common::hasPriv('testcase', 'batchEdit') ? "onclick=setFormAction('$actionLink')" : "disabled='disabled'";
|
||||
$misc = common::hasPriv('testcase', 'batchEdit') ? "onclick=\"setFormAction('$actionLink')\"" : "disabled='disabled'";
|
||||
echo "<div class='groupButton dropButton'>";
|
||||
echo html::commonButton($lang->edit, $misc);
|
||||
echo "<button id='moreAction' type='button' onclick=\"toggleSubMenu(this.id, 'top', 0)\"><span class='caret'></span></button>";
|
||||
@@ -164,7 +164,7 @@ js::set('confirmDelete', $lang->testcase->confirmDelete);
|
||||
<ul>
|
||||
<?php
|
||||
$actionLink = $this->createLink('testtask', 'batchRun', "productID=$productID&orderBy=$orderBy");
|
||||
$misc = common::hasPriv('testtask', 'batchRun') ? "onclick=setFormAction('$actionLink')" : "class='disabled'";
|
||||
$misc = common::hasPriv('testtask', 'batchRun') ? "onclick=\"setFormAction('$actionLink')\"" : "class='disabled'";
|
||||
echo "<li>" . html::a('#', $lang->testtask->runCase, '', $misc) . "</li>";
|
||||
?>
|
||||
</ul>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<tr valign='top' align='center'>
|
||||
<td>
|
||||
<?php
|
||||
if(isset($case->id))
|
||||
if(!empty($case->id))
|
||||
{
|
||||
echo $case->id . html::hidden("id[$key]", $case->id);
|
||||
}
|
||||
@@ -40,9 +40,9 @@
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo html::input("title[$key]", $case->title, "class='text-1' style='margin-top:2px'")?></td>
|
||||
<td><?php echo html::select("module[$key]", $modules, isset($case->module) ? $case->module : (isset($case->id) ? $cases[$case->id]->module : ''), "class='select-2'")?></td>
|
||||
<td><?php echo html::select("story[$key]", $stories, isset($case->story) ? $case->story : (isset($case->id) ? $cases[$case->id]->story : ''), "class='select-2'")?></td>
|
||||
<td><?php echo html::select("pri[$key]", $lang->testcase->priList, isset($case->pri) ? $case->pri : (isset($case->id) ? $cases[$case->id]->pri : ''))?></td>
|
||||
<td><?php echo html::select("module[$key]", $modules, isset($case->module) ? $case->module : (!empty($case->id) ? $cases[$case->id]->module : ''), "class='select-2'")?></td>
|
||||
<td><?php echo html::select("story[$key]", $stories, isset($case->story) ? $case->story : (!empty($case->id) ? $cases[$case->id]->story : ''), "class='select-2'")?></td>
|
||||
<td><?php echo html::select("pri[$key]", $lang->testcase->priList, isset($case->pri) ? $case->pri : (!empty($case->id) ? $cases[$case->id]->pri : ''))?></td>
|
||||
<td><?php echo html::select("type[$key]", $lang->testcase->typeList, $case->type)?></td>
|
||||
<td><?php echo html::select("status[$key]", $lang->testcase->statusList, isset($case->status) ? $case->status : '')?></td>
|
||||
<td><?php echo html::input("frequency[$key]", isset($case->frequency) ? $case->frequency : 1, "size='2'")?></td>
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
<td>
|
||||
<fieldset>
|
||||
<legend><?php echo $lang->testcase->precondition;?></legend>
|
||||
<?php echo $case->precondition;?>
|
||||
<?php echo nl2br($case->precondition);?>
|
||||
</fieldset>
|
||||
<table class='table-1 colored'>
|
||||
<tr class='colhead'>
|
||||
|
||||
@@ -773,6 +773,7 @@ class testtask extends control
|
||||
$this->view->testtask = $testtask;
|
||||
$this->view->action = $action;
|
||||
$this->view->users = $users;
|
||||
$this->clear();
|
||||
|
||||
$mailContent = $this->parse($this->moduleName, 'sendmail');
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class testtaskModel extends model
|
||||
->batchcheck($this->config->testtask->create->requiredFields, 'notempty')
|
||||
->checkIF($task->begin != '', 'begin', 'date')
|
||||
->checkIF($task->end != '', 'end', 'date')
|
||||
->checkIF($task->end != '', 'end', 'gt', $task->begin)
|
||||
->checkIF($task->end != '', 'end', 'ge', $task->begin)
|
||||
->exec();
|
||||
if(!dao::isError()) return $this->dao->lastInsertID();
|
||||
}
|
||||
@@ -213,6 +213,7 @@ class testtaskModel extends model
|
||||
if($this->post->cases == false) return;
|
||||
foreach($this->post->cases as $caseID)
|
||||
{
|
||||
$row = new stdclass();
|
||||
$row->task = $taskID;
|
||||
$row->case = $caseID;
|
||||
$row->version = $this->post->versions[$caseID];
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->testtask->owner;?></th>
|
||||
<td><?php echo html::select('owner', $users, '', 'class=select-3');?></td>
|
||||
<td><?php echo html::select('owner', $users, '', "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->testtask->pri;?></th>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->testtask->owner;?></th>
|
||||
<td><?php echo html::select('owner', $users, $task->owner, 'class=select-3');?></td>
|
||||
<td><?php echo html::select('owner', $users, $task->owner, "class='select-3 chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class='rowhead'><?php echo $lang->testtask->pri;?></th>
|
||||
|
||||
@@ -190,6 +190,7 @@ class todo extends control
|
||||
|
||||
/* Assign. */
|
||||
$title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->batchEdit;
|
||||
$position[] = html::a($this->createLink('my', 'todo'), $this->lang->my->todo);
|
||||
$position[] = $this->lang->todo->common;
|
||||
$position[] = $this->lang->todo->batchEdit;
|
||||
|
||||
@@ -393,8 +394,8 @@ class todo extends control
|
||||
if(isset($users[$todo->account])) $todo->account = $users[$todo->account];
|
||||
if(isset($times[$todo->begin])) $todo->begin = $times[$todo->begin];
|
||||
if(isset($times[$todo->end])) $todo->end = $times[$todo->end];
|
||||
if($todo->type == 'bug') $todo->name = isset($bugs[$todo->idvalue]) ? $bugs[$todo->idvalue] : '';
|
||||
if($todo->type == 'task') $todo->name = isset($tasks[$todo->idvalue]) ? $tasks[$todo->idvalue] : '';
|
||||
if($todo->type == 'bug') $todo->name = isset($bugs[$todo->idvalue]) ? $bugs[$todo->idvalue] . "(#$todo->idvalue)" : '';
|
||||
if($todo->type == 'task') $todo->name = isset($tasks[$todo->idvalue]) ? $tasks[$todo->idvalue] . "(#$todo->idvalue)" : '';
|
||||
if(isset($todoLang->typeList[$todo->type])) $todo->type = $todoLang->typeList[$todo->type];
|
||||
if(isset($todoLang->priList[$todo->pri])) $todo->pri = $todoLang->priList[$todo->pri];
|
||||
if(isset($todoLang->statusList[$todo->status])) $todo->status = $todoLang->statusList[$todo->status];
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
.parentModule {width:10%; vertical-align:middle;}
|
||||
.copy {display:block; margin-bottom:5px;}
|
||||
@@ -32,8 +32,7 @@ $lang->tree->manageBugChild = 'Manage bug child';
|
||||
$lang->tree->manageCaseChild = 'Manage case child';
|
||||
$lang->tree->manageTaskChild = 'Manage project child';
|
||||
$lang->tree->manageWebappChild = 'Manage webapp child';
|
||||
$lang->tree->syncFromProduct = 'Copy from product module';
|
||||
$lang->tree->syncFromProject = 'Copy from project module';
|
||||
$lang->tree->syncFromProduct = 'Copy';
|
||||
$lang->tree->ajaxGetOptionMenu = 'API: Get select menu';
|
||||
$lang->tree->ajaxGetSonModules = 'API: Get son modules';
|
||||
|
||||
|
||||
@@ -32,8 +32,7 @@ $lang->tree->manageBugChild = '维护Bug子模块';
|
||||
$lang->tree->manageCaseChild = '维护用例子模块';
|
||||
$lang->tree->manageTaskChild = '维护项目子模块';
|
||||
$lang->tree->manageWebappChild = '维护WEB应用子模块';
|
||||
$lang->tree->syncFromProduct = '复制产品视图模块';
|
||||
$lang->tree->syncFromProject = '复制项目视图模块';
|
||||
$lang->tree->syncFromProduct = '复制';
|
||||
$lang->tree->ajaxGetOptionMenu = '接口:获取下拉列表';
|
||||
$lang->tree->ajaxGetSonModules = '接口:获得子菜单列表';
|
||||
|
||||
|
||||
+23
-12
@@ -171,7 +171,7 @@ class treeModel extends model
|
||||
}
|
||||
$treeMenu = array();
|
||||
$lastMenu[] = '/';
|
||||
$projectModules = $this->getTaskTreeModules($rootID);
|
||||
$projectModules = $this->getTaskTreeModules($rootID, false, false);
|
||||
foreach($products as $id => $product)
|
||||
{
|
||||
$modules = $this->dao->select('*')->from(TABLE_MODULE)
|
||||
@@ -376,21 +376,33 @@ class treeModel extends model
|
||||
*
|
||||
* @param int $projectID
|
||||
* @param bool $parent
|
||||
* @param bool $linkStory
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getTaskTreeModules($projectID, $parent = false)
|
||||
public function getTaskTreeModules($projectID, $parent = false, $linkStory = true)
|
||||
{
|
||||
$projectModules = array();
|
||||
$field = $parent ? 'path' : 'id';
|
||||
|
||||
/* Get story paths of this project. */
|
||||
$paths = $this->dao->select('t3.' . $field)
|
||||
->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
|
||||
->leftJoin(TABLE_MODULE)->alias('t3')->on('t2.module = t3.id')
|
||||
->where('t1.project')->eq($projectID)
|
||||
->fetchPairs();
|
||||
if($linkStory)
|
||||
{
|
||||
/* Get story paths of this project. */
|
||||
$paths = $this->dao->select('t3.' . $field)
|
||||
->from(TABLE_PROJECTSTORY)->alias('t1')
|
||||
->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id')
|
||||
->leftJoin(TABLE_MODULE)->alias('t3')->on('t2.module = t3.id')
|
||||
->where('t1.project')->eq($projectID)
|
||||
->fetchPairs();
|
||||
}
|
||||
else
|
||||
{
|
||||
$products = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($projectID)->fetchPairs();
|
||||
$paths = $this->dao->select('id')->from(TABLE_MODULE)
|
||||
->where('root')->in($products)
|
||||
->andWhere('type')->eq('story')
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
/* Add task paths of this project.*/
|
||||
$paths += $this->dao->select($field)->from(TABLE_MODULE)
|
||||
@@ -447,12 +459,11 @@ class treeModel extends model
|
||||
}
|
||||
$menu .= '</ul></li>';
|
||||
}
|
||||
|
||||
$menu .= '</ul>';
|
||||
}
|
||||
$menu .='</li>';
|
||||
}
|
||||
|
||||
$menu .= '</li>';
|
||||
$menu .= '</ul>';
|
||||
return $menu;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<?php $manageChild = 'manage' . ucfirst($viewType) . 'Child';?>
|
||||
<caption><?php echo strpos($viewType, 'doc') !== false ? $lang->doc->manageType : $lang->tree->$manageChild;?></caption>
|
||||
<tr>
|
||||
<td width='10%'>
|
||||
<td class='parentModule'>
|
||||
<nobr>
|
||||
<?php
|
||||
echo html::a($this->createLink('tree', 'browse', "root={$root->id}&viewType=$viewType"), $root->name);
|
||||
@@ -55,21 +55,23 @@
|
||||
{
|
||||
if($allProject)
|
||||
{
|
||||
echo html::select('allProject', $allProject, '', 'onchange=syncProductOrProject(this,"project")');
|
||||
echo "<span class='copy'>";
|
||||
echo html::select('allProject', $allProject, '', "onchange=\"syncProductOrProject(this,'project')\"");
|
||||
echo html::select('projectModule', $projectModules, '');
|
||||
echo html::commonButton($lang->tree->syncFromProject, "id='copyModule' onclick='syncModule($currentProject, \"task\")'");
|
||||
echo '</span>';
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
else if($viewType == 'story')
|
||||
{
|
||||
if($allProduct)
|
||||
{
|
||||
echo html::select('allProduct', $allProduct, '', 'onchange=syncProductOrProject(this,"product")');
|
||||
echo "<span class='copy'>";
|
||||
echo html::select('allProduct', $allProduct, '', "onchange=\"syncProductOrProject(this,'product')\"");
|
||||
echo html::select('productModule', $productModules, '');
|
||||
echo html::commonButton($lang->tree->syncFromProduct, "id='copyModule' onclick='syncModule($currentProduct, \"story\")'");
|
||||
echo '</span>';
|
||||
}
|
||||
echo '<br />';
|
||||
}
|
||||
$maxOrder = 0;
|
||||
echo '<div id="sonModule">';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user