Merge branch 'feature-pagination-for-errors'
This commit is contained in:
commit
83a57159c8
|
@ -55,12 +55,17 @@ var SummaryPlugin = ActiveBuild.UiPlugin.extend({
|
|||
|
||||
for (var stage in summary) {
|
||||
for (var plugin in summary[stage]) {
|
||||
var data = summary[stage][plugin],
|
||||
var data = summary[stage][plugin],
|
||||
duration = data.started ? ((data.ended || Math.floor(Date.now() / 1000)) - data.started) : '-';
|
||||
|
||||
var pluginName = Lang.get(plugin);
|
||||
if ('test' === stage && 2 < data.status) {
|
||||
pluginName = '<a href="' + window.APP_URL + 'build/view/' + ActiveBuild.buildId + '?plugin=' + plugin + '#errors">' + Lang.get(plugin) + '</a>';
|
||||
}
|
||||
tbody.append(
|
||||
'<tr>' +
|
||||
'<td>' + Lang.get('stage_' + stage) + '</td>' +
|
||||
'<td>' + Lang.get(plugin) + '</td>' +
|
||||
'<td>' + pluginName + '</td>' +
|
||||
'<td><span class="label label-' + this.statusClasses[data.status] + '">' +
|
||||
this.statusLabels[data.status] +
|
||||
'</span></td>' +
|
||||
|
|
|
@ -22,7 +22,7 @@ var Build = Class.extend({
|
|||
|
||||
self.buildData = data.queryData;
|
||||
|
||||
// If the build has finished, stop updating every 10 seconds:
|
||||
// If the build has finished, stop updating every 5 seconds:
|
||||
if (self.buildData && self.buildData.status > 1) {
|
||||
self.cancelQuery('build-updated');
|
||||
$(window).trigger({type: 'build-complete'});
|
||||
|
@ -34,13 +34,10 @@ var Build = Class.extend({
|
|||
$('.build-finished').html(self.buildData.finish_date ? self.buildData.finish_date : '');
|
||||
$('#log pre').html(self.buildData.log);
|
||||
$('.errors-table tbody').html(self.buildData.error_html);
|
||||
$('#paginator').html(self.buildData.paginator);
|
||||
|
||||
if (self.buildData.errors == 0) {
|
||||
$('.errors-label').hide();
|
||||
} else {
|
||||
$('.errors-label').text(self.buildData.errors);
|
||||
$('.errors-label').show();
|
||||
}
|
||||
$('.errors-label').text(self.buildData.errors_total);
|
||||
$('.errors-label').show();
|
||||
|
||||
switch (self.buildData.status) {
|
||||
case 0:
|
||||
|
@ -77,7 +74,7 @@ var Build = Class.extend({
|
|||
var fullUri = window.APP_URL + uri;
|
||||
|
||||
if (name == 'build-updated') {
|
||||
fullUri = window.APP_URL + 'build/ajax-data/' + self.buildId;
|
||||
fullUri = window.APP_URL + 'build/ajax-data/' + self.buildId + '?per_page=' + PER_PAGE + '&page=' + PAGE + '&plugin=' + BUILD_PLUGIN + '&severity=' + BUI;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
|
|
|
@ -5,11 +5,13 @@ namespace PHPCensor\Controller;
|
|||
use b8;
|
||||
use b8\Exception\HttpException\NotFoundException;
|
||||
use b8\Http\Response\JsonResponse;
|
||||
use JasonGrimes\Paginator;
|
||||
use PHPCensor\BuildFactory;
|
||||
use PHPCensor\Helper\AnsiConverter;
|
||||
use PHPCensor\Helper\Lang;
|
||||
use PHPCensor\Model\Build;
|
||||
use PHPCensor\Model\Project;
|
||||
use PHPCensor\Model\User;
|
||||
use PHPCensor\Service\BuildService;
|
||||
use PHPCensor\Controller;
|
||||
|
||||
|
@ -40,10 +42,24 @@ class BuildController extends Controller
|
|||
}
|
||||
|
||||
/**
|
||||
* View a specific build.
|
||||
*/
|
||||
* View a specific build.
|
||||
*
|
||||
* @param integer $buildId
|
||||
*
|
||||
* @throws NotFoundException
|
||||
*/
|
||||
public function view($buildId)
|
||||
{
|
||||
$page = (integer)$this->getParam('page', 1);
|
||||
$plugin = $this->getParam('plugin', '');
|
||||
|
||||
$severity = $this->getParam('severity', null);
|
||||
if (null !== $severity && '' !== $severity) {
|
||||
$severity = (integer)$severity;
|
||||
} else {
|
||||
$severity = null;
|
||||
}
|
||||
|
||||
try {
|
||||
$build = BuildFactory::getBuildById($buildId);
|
||||
} catch (\Exception $ex) {
|
||||
|
@ -54,9 +70,33 @@ class BuildController extends Controller
|
|||
throw new NotFoundException(Lang::get('build_x_not_found', $buildId));
|
||||
}
|
||||
|
||||
$this->view->plugins = $this->getUiPlugins();
|
||||
$this->view->build = $build;
|
||||
$this->view->data = $this->getBuildData($build);
|
||||
/** @var User $user */
|
||||
$user = $_SESSION['php-censor-user'];
|
||||
$perPage = $user->getFinalPerPage();
|
||||
$data = $this->getBuildData($build, $plugin, $severity, (($page - 1) * $perPage), $perPage);
|
||||
$pages = ($data['errors'] === 0)
|
||||
? 1
|
||||
: (integer)ceil($data['errors'] / $perPage);
|
||||
|
||||
if ($page > $pages) {
|
||||
$page = $pages;
|
||||
}
|
||||
|
||||
/** @var \PHPCensor\Store\BuildErrorStore $errorStore */
|
||||
$errorStore = b8\Store\Factory::getStore('BuildError');
|
||||
|
||||
$this->view->uiPlugins = $this->getUiPlugins();
|
||||
$this->view->build = $build;
|
||||
$this->view->data = $data;
|
||||
|
||||
$this->view->plugin = urldecode($plugin);
|
||||
$this->view->plugins = $errorStore->getKnownPlugins($buildId);
|
||||
$this->view->severity = urldecode(null !== $severity ? $severity : '');
|
||||
$this->view->severities = $errorStore->getKnownSeverities($buildId, $plugin);
|
||||
|
||||
$this->view->page = $page;
|
||||
$this->view->perPage = $perPage;
|
||||
$this->view->paginator = $this->getPaginatorHtml($buildId, $plugin, $severity, $data['errors'], $perPage, $page);
|
||||
|
||||
$this->layout->title = Lang::get('build_n', $buildId);
|
||||
$this->layout->subtitle = $build->getProjectTitle();
|
||||
|
@ -121,9 +161,17 @@ class BuildController extends Controller
|
|||
}
|
||||
|
||||
/**
|
||||
* Get build data from database and json encode it:
|
||||
*/
|
||||
protected function getBuildData(Build $build)
|
||||
* Get build data from database and json encode it.
|
||||
*
|
||||
* @param Build $build
|
||||
* @param string $plugin
|
||||
* @param integer $severity
|
||||
* @param integer $start
|
||||
* @param integer $perPage
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getBuildData(Build $build, $plugin, $severity, $start = 0, $perPage = 10)
|
||||
{
|
||||
$data = [];
|
||||
$data['status'] = (int)$build->getStatus();
|
||||
|
@ -135,19 +183,51 @@ class BuildController extends Controller
|
|||
|
||||
/** @var \PHPCensor\Store\BuildErrorStore $errorStore */
|
||||
$errorStore = b8\Store\Factory::getStore('BuildError');
|
||||
$errors = $errorStore->getErrorsForBuild($build->getId());
|
||||
$errors = $errorStore->getByBuildId($build->getId(), $perPage, $start, $plugin, $severity);
|
||||
|
||||
$errorView = new b8\View('Build/errors');
|
||||
$errorView->build = $build;
|
||||
$errorView->errors = $errors;
|
||||
$errorView->errors = $errors['items'];
|
||||
|
||||
$data['errors'] = $errorStore->getErrorTotalForBuild($build->getId());
|
||||
$data['error_html'] = $errorView->render();
|
||||
$data['since'] = (new \DateTime())->format('Y-m-d H:i:s');
|
||||
$data['errors'] = (integer)$errorStore->getErrorTotalForBuild($build->getId(), $plugin, $severity);
|
||||
$data['errors_total'] = (integer)$errorStore->getErrorTotalForBuild($build->getId());
|
||||
$data['error_html'] = $errorView->render();
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $buildId
|
||||
* @param string $plugin
|
||||
* @param integer $severity
|
||||
* @param integer $total
|
||||
* @param integer $perPage
|
||||
* @param integer $page
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPaginatorHtml($buildId, $plugin, $severity, $total, $perPage, $page)
|
||||
{
|
||||
$view = new b8\View('pagination');
|
||||
|
||||
$urlPattern = APP_URL . 'build/view/' . $buildId;
|
||||
$params = [];
|
||||
if (!empty($plugin)) {
|
||||
$params['plugin'] = $plugin;
|
||||
}
|
||||
|
||||
if (null !== $severity) {
|
||||
$params['severity'] = $severity;
|
||||
}
|
||||
|
||||
$urlPattern = $urlPattern . '?' . str_replace('%28%3Anum%29', '(:num)', http_build_query(array_merge($params, ['page' => '(:num)']))) . '#errors';
|
||||
$paginator = new Paginator($total, $perPage, $page, $urlPattern);
|
||||
|
||||
$view->paginator = $paginator;
|
||||
|
||||
return $view->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a build using an existing build as a template:
|
||||
*/
|
||||
|
@ -230,6 +310,17 @@ class BuildController extends Controller
|
|||
|
||||
public function ajaxData($buildId)
|
||||
{
|
||||
$page = (integer)$this->getParam('page', 1);
|
||||
$perPage = (integer)$this->getParam('per_page', 10);
|
||||
$plugin = $this->getParam('plugin', '');
|
||||
|
||||
$severity = $this->getParam('severity', null);
|
||||
if (null !== $severity && '' !== $severity) {
|
||||
$severity = (integer)$severity;
|
||||
} else {
|
||||
$severity = null;
|
||||
}
|
||||
|
||||
$response = new JsonResponse();
|
||||
$build = BuildFactory::getBuildById($buildId);
|
||||
|
||||
|
@ -240,7 +331,10 @@ class BuildController extends Controller
|
|||
return $response;
|
||||
}
|
||||
|
||||
$response->setContent($this->getBuildData($build));
|
||||
$data = $this->getBuildData($build, $plugin, $severity, (($page - 1) * $perPage), $perPage);
|
||||
$data['paginator'] = $this->getPaginatorHtml($buildId, $plugin, $severity, $data['errors'], $perPage, $page);
|
||||
|
||||
$response->setContent($data);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@ class ProjectController extends PHPCensor\Controller
|
|||
$environment = $this->getParam('environment', '');
|
||||
$page = (integer)$this->getParam('page', 1);
|
||||
$perPage = (integer)$this->getParam('per_page', 10);
|
||||
$builds = $this->getLatestBuildsHtml($projectId, $environment, $branch, (($page - 1) * $perPage), $perPage);
|
||||
$builds = $this->getLatestBuildsHtml($projectId, $branch, $environment, (($page - 1) * $perPage), $perPage);
|
||||
|
||||
$this->response->disableLayout();
|
||||
$this->response->setContent($builds[0]);
|
||||
|
@ -94,30 +94,18 @@ class ProjectController extends PHPCensor\Controller
|
|||
throw new NotFoundException(Lang::get('project_x_not_found', $projectId));
|
||||
}
|
||||
|
||||
$perPage = $_SESSION['php-censor-user']->getFinalPerPage();
|
||||
$builds = $this->getLatestBuildsHtml($projectId, $environment, $branch, (($page - 1) * $perPage), $perPage);
|
||||
$pages = $builds[1] == 0 ? 1 : (integer)ceil($builds[1] / $perPage);
|
||||
/** @var PHPCensor\Model\User $user */
|
||||
$user = $_SESSION['php-censor-user'];
|
||||
$perPage = $user->getFinalPerPage();
|
||||
$builds = $this->getLatestBuildsHtml($projectId, $branch, $environment, (($page - 1) * $perPage), $perPage);
|
||||
$pages = ($builds[1] === 0)
|
||||
? 1
|
||||
: (integer)ceil($builds[1] / $perPage);
|
||||
|
||||
if ($page > $pages) {
|
||||
$response = new RedirectResponse();
|
||||
$response->setHeader('Location', APP_URL . 'project/view/' . $projectId);
|
||||
|
||||
return $response;
|
||||
$page = $pages;
|
||||
}
|
||||
|
||||
$urlPattern = APP_URL . 'project/view/' . $project->getId();
|
||||
$params = [];
|
||||
if (!empty($branch)) {
|
||||
$params['branch'] = $branch;
|
||||
}
|
||||
|
||||
if (!empty($environment)) {
|
||||
$params['environment'] = $environment;
|
||||
}
|
||||
|
||||
$urlPattern = $urlPattern . '?' . str_replace('%28%3Anum%29', '(:num)', http_build_query(array_merge($params, ['page' => '(:num)'])));
|
||||
$paginator = new Paginator($builds[1], $perPage, $page, $urlPattern);
|
||||
|
||||
$this->view->builds = $builds[0];
|
||||
$this->view->total = $builds[1];
|
||||
$this->view->project = $project;
|
||||
|
@ -127,7 +115,7 @@ class ProjectController extends PHPCensor\Controller
|
|||
$this->view->environments = $project->getEnvironmentsNames();
|
||||
$this->view->page = $page;
|
||||
$this->view->perPage = $perPage;
|
||||
$this->view->paginator = $paginator;
|
||||
$this->view->paginator = $this->getPaginatorHtml($projectId, $branch, $environment, $builds[1], $perPage, $page);
|
||||
|
||||
$this->layout->title = $project->getTitle();
|
||||
$this->layout->subtitle = '';
|
||||
|
@ -141,6 +129,38 @@ class ProjectController extends PHPCensor\Controller
|
|||
return $this->view->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $projectId
|
||||
* @param string $branch
|
||||
* @param string $environment
|
||||
* @param integer $total
|
||||
* @param integer $perPage
|
||||
* @param integer $page
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPaginatorHtml($projectId, $branch, $environment, $total, $perPage, $page)
|
||||
{
|
||||
$view = new b8\View('pagination');
|
||||
|
||||
$urlPattern = APP_URL . 'project/view/' . $projectId;
|
||||
$params = [];
|
||||
if (!empty($branch)) {
|
||||
$params['branch'] = $branch;
|
||||
}
|
||||
|
||||
if (!empty($environment)) {
|
||||
$params['environment'] = $environment;
|
||||
}
|
||||
|
||||
$urlPattern = $urlPattern . '?' . str_replace('%28%3Anum%29', '(:num)', http_build_query(array_merge($params, ['page' => '(:num)'])));
|
||||
$paginator = new Paginator($total, $perPage, $page, $urlPattern);
|
||||
|
||||
$view->paginator = $paginator;
|
||||
|
||||
return $view->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new pending build for a project.
|
||||
*
|
||||
|
@ -232,14 +252,14 @@ class ProjectController extends PHPCensor\Controller
|
|||
* Render latest builds for project as HTML table.
|
||||
*
|
||||
* @param int $projectId
|
||||
* @param string $environment A urldecoded environment name.
|
||||
* @param string $branch A urldecoded branch name.
|
||||
* @param string $branch A urldecoded branch name.
|
||||
* @param string $environment A urldecoded environment name.
|
||||
* @param int $start
|
||||
* @param int $perPage
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getLatestBuildsHtml($projectId, $environment = '', $branch = '', $start = 0, $perPage = 10)
|
||||
protected function getLatestBuildsHtml($projectId, $branch = '', $environment = '', $start = 0, $perPage = 10)
|
||||
{
|
||||
$criteria = ['project_id' => $projectId];
|
||||
|
||||
|
@ -259,9 +279,12 @@ class ProjectController extends PHPCensor\Controller
|
|||
$build = BuildFactory::getBuild($build);
|
||||
}
|
||||
|
||||
$view->builds = $builds['items'];
|
||||
$view->builds = $builds['items'];
|
||||
|
||||
return [$view->render(), $builds['count']];
|
||||
return [
|
||||
$view->render(),
|
||||
(integer)$builds['count']
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -337,6 +337,11 @@ PHP Censor',
|
|||
'stage_broken' => 'Broken',
|
||||
'stage_fixed' => 'Fixed',
|
||||
'severity' => 'Severity',
|
||||
|
||||
'all_plugins' => 'All plugins',
|
||||
'all_severities' => 'All severities',
|
||||
'filters' => 'Filters',
|
||||
'errors_selected' => 'Errors selected',
|
||||
|
||||
'build_details' => 'Build Details',
|
||||
'commit_details' => 'Commit Details',
|
||||
|
|
|
@ -325,7 +325,12 @@ PHP Censor',
|
|||
'stage_failure' => 'Провал',
|
||||
'stage_broken' => 'Поломка',
|
||||
'stage_fixed' => 'Исправление',
|
||||
'severity' => 'Важность',
|
||||
'severity' => 'Уровень',
|
||||
|
||||
'all_plugins' => 'Все плагины',
|
||||
'all_severities' => 'Все уровни',
|
||||
'filters' => 'Фильтры',
|
||||
'errors_selected' => 'Ошибок выбрано',
|
||||
|
||||
'build_details' => 'Информация о сборке',
|
||||
'commit_details' => 'Информация о коммитe',
|
||||
|
|
|
@ -401,6 +401,30 @@ class BuildError extends Model
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the language string key for this error's severity level.
|
||||
*
|
||||
* @param integer $severity
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getSeverityName($severity)
|
||||
{
|
||||
switch ($severity) {
|
||||
case self::SEVERITY_CRITICAL:
|
||||
return 'critical';
|
||||
|
||||
case self::SEVERITY_HIGH:
|
||||
return 'high';
|
||||
|
||||
case self::SEVERITY_NORMAL:
|
||||
return 'normal';
|
||||
|
||||
case self::SEVERITY_LOW:
|
||||
return 'low';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class to apply to HTML elements representing this error.
|
||||
*
|
||||
|
|
|
@ -60,23 +60,48 @@ class BuildErrorStore extends Store
|
|||
*
|
||||
* @param integer $buildId
|
||||
* @param integer $limit
|
||||
* @param string $useConnection
|
||||
* @param integer $offset
|
||||
* @param string $plugin
|
||||
* @param integer $severity
|
||||
*
|
||||
* @return array
|
||||
*
|
||||
* @throws HttpException
|
||||
*/
|
||||
public function getByBuildId($buildId, $limit = 1000, $useConnection = 'read')
|
||||
public function getByBuildId($buildId, $limit = null, $offset = 0, $plugin = null, $severity = null)
|
||||
{
|
||||
if (is_null($buildId)) {
|
||||
throw new HttpException('Value passed to ' . __FUNCTION__ . ' cannot be null.');
|
||||
}
|
||||
|
||||
|
||||
$query = 'SELECT * FROM {{build_error}} WHERE {{build_id}} = :build_id LIMIT :limit';
|
||||
$stmt = Database::getConnection($useConnection)->prepareCommon($query);
|
||||
$query = 'SELECT * FROM {{build_error}} WHERE {{build_id}} = :build_id';
|
||||
if ($plugin) {
|
||||
$query .= ' AND {{plugin}} = :plugin';
|
||||
}
|
||||
if (null !== $severity) {
|
||||
$query .= ' AND {{severity}} = :severity';
|
||||
}
|
||||
$query .= ' ORDER BY plugin, severity';
|
||||
if (null !== $limit) {
|
||||
$query .= ' LIMIT :limit';
|
||||
}
|
||||
if ($offset) {
|
||||
$query .= ' OFFSET :offset';
|
||||
}
|
||||
$stmt = Database::getConnection()->prepareCommon($query);
|
||||
$stmt->bindValue(':build_id', $buildId);
|
||||
$stmt->bindValue(':limit', (int)$limit, \PDO::PARAM_INT);
|
||||
if ($plugin) {
|
||||
$stmt->bindValue(':plugin', $plugin, \PDO::PARAM_STR);
|
||||
}
|
||||
if (null !== $severity) {
|
||||
$stmt->bindValue(':severity', (integer)$severity, \PDO::PARAM_INT);
|
||||
}
|
||||
if (null !== $limit) {
|
||||
$stmt->bindValue(':limit', (integer)$limit, \PDO::PARAM_INT);
|
||||
}
|
||||
if ($offset) {
|
||||
$stmt->bindValue(':offset', (integer)$offset, \PDO::PARAM_INT);
|
||||
}
|
||||
|
||||
if ($stmt->execute()) {
|
||||
$res = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
@ -95,36 +120,59 @@ class BuildErrorStore extends Store
|
|||
}
|
||||
|
||||
/**
|
||||
* Get a list of errors for a given build, since a given time.
|
||||
* Gets the total number of errors for a given build.
|
||||
*
|
||||
* @param integer $buildId
|
||||
* @param string $since date string
|
||||
* @param string $plugin
|
||||
* @param integer $severity
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getErrorsForBuild($buildId, $since = null)
|
||||
public function getErrorTotalForBuild($buildId, $plugin = null, $severity = null)
|
||||
{
|
||||
$query = 'SELECT * FROM {{build_error}} WHERE {{build_id}} = :build';
|
||||
|
||||
if (!is_null($since)) {
|
||||
$query .= ' AND created_date > :since';
|
||||
$query = 'SELECT COUNT(*) AS {{total}} FROM {{build_error}}
|
||||
WHERE {{build_id}} = :build';
|
||||
if ($plugin) {
|
||||
$query .= ' AND {{plugin}} = :plugin';
|
||||
}
|
||||
if (null !== $severity) {
|
||||
$query .= ' AND {{severity}} = :severity';
|
||||
}
|
||||
|
||||
$query .= ' LIMIT 15000';
|
||||
|
||||
$stmt = Database::getConnection('read')->prepareCommon($query);
|
||||
|
||||
$stmt->bindValue(':build', $buildId, \PDO::PARAM_INT);
|
||||
|
||||
if (!is_null($since)) {
|
||||
$stmt->bindValue(':since', $since);
|
||||
if ($plugin) {
|
||||
$stmt->bindValue(':plugin', $plugin, \PDO::PARAM_STR);
|
||||
}
|
||||
if (null !== $severity) {
|
||||
$stmt->bindValue(':severity', (integer)$severity, \PDO::PARAM_INT);
|
||||
}
|
||||
|
||||
if ($stmt->execute()) {
|
||||
$res = $stmt->fetch(\PDO::FETCH_ASSOC);
|
||||
return $res['total'];
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param integer $buildId
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getKnownPlugins($buildId)
|
||||
{
|
||||
$query = 'SELECT DISTINCT {{plugin}} from {{build_error}} WHERE {{build_id}} = :build';
|
||||
$stmt = Database::getConnection('read')->prepareCommon($query);
|
||||
$stmt->bindValue(':build', $buildId);
|
||||
|
||||
if ($stmt->execute()) {
|
||||
$res = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
||||
$map = function ($item) {
|
||||
return new BuildError($item);
|
||||
return $item['plugin'];
|
||||
};
|
||||
$rtn = array_map($map, $res);
|
||||
|
||||
|
@ -135,24 +183,33 @@ class BuildErrorStore extends Store
|
|||
}
|
||||
|
||||
/**
|
||||
* Gets the total number of errors for a given build.
|
||||
*
|
||||
* @param integer $buildId
|
||||
* @param string $plugin
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getErrorTotalForBuild($buildId)
|
||||
public function getKnownSeverities($buildId, $plugin = '')
|
||||
{
|
||||
$query = 'SELECT COUNT(*) AS {{total}} FROM {{build_error}}
|
||||
WHERE {{build_id}} = :build';
|
||||
$query = 'SELECT DISTINCT {{severity}} from {{build_error}} WHERE {{build_id}} = :build';
|
||||
if ($plugin) {
|
||||
$query .= ' AND {{plugin}} = :plugin';
|
||||
}
|
||||
|
||||
$stmt = Database::getConnection('read')->prepareCommon($query);
|
||||
|
||||
$stmt->bindValue(':build', $buildId, \PDO::PARAM_INT);
|
||||
$stmt->bindValue(':build', $buildId);
|
||||
if ($plugin) {
|
||||
$stmt->bindValue(':plugin', $plugin);
|
||||
}
|
||||
|
||||
if ($stmt->execute()) {
|
||||
$res = $stmt->fetch(\PDO::FETCH_ASSOC);
|
||||
return $res['total'];
|
||||
$res = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
||||
$map = function ($item) {
|
||||
return (integer)$item['severity'];
|
||||
};
|
||||
$rtn = array_map($map, $res);
|
||||
|
||||
return $rtn;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
use PHPCensor\Helper\Lang;
|
||||
use PHPCensor\Model\Build;
|
||||
use PHPCensor\Model\BuildError;
|
||||
|
||||
/**
|
||||
* @var Build $build
|
||||
|
@ -172,10 +173,10 @@ use PHPCensor\Model\Build;
|
|||
<li class="">
|
||||
<a href="#errors" data-toggle="tab">
|
||||
<i class="fa fa-exclamation-triangle"></i> <?php print Lang::get('errors'); ?>
|
||||
<?php if ($data['errors'] == 0): ?>
|
||||
<?php if ($data['errors_total'] == 0): ?>
|
||||
<span class="errors-label label label-danger" style="display: none">0</span>
|
||||
<?php else: ?>
|
||||
<span class="errors-label label label-danger"><?php print $data['errors']; ?></span>
|
||||
<span class="errors-label label label-danger"><?php print $data['errors_total']; ?></span>
|
||||
<?php endif; ?>
|
||||
</a>
|
||||
</li>
|
||||
|
@ -190,6 +191,65 @@ use PHPCensor\Model\Build;
|
|||
</div>
|
||||
|
||||
<div class="tab-pane" id="errors">
|
||||
<?php if ($build->getStatus() > Build::STATUS_RUNNING): ?>
|
||||
<div class="box">
|
||||
<div class="box-header">
|
||||
<h3 class="box-title"><?= Lang::get('filters'); ?></h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<?php if ($data['errors'] < $data['errors_total']): ?>
|
||||
<p><?= Lang::get('errors_selected'); ?>: <?= $data['errors']; ?> / <?= $data['errors_total']; ?></p>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<?php if (!empty($plugin)) {
|
||||
echo Lang::get('plugin') . ': ' . Lang::get($plugin);
|
||||
} else {
|
||||
echo Lang::get('all_plugins');
|
||||
} ?> <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="<?= APP_URL; ?>build/view/<?= $build->getId(); ?>?severity=<?= urlencode($severity); ?>#errors"><?= Lang::get('all_plugins'); ?></a></li>
|
||||
<li class="divider"></li>
|
||||
|
||||
<?php if(!empty($plugins)): ?>
|
||||
<?php foreach ($plugins as $currentPlugin) : ?>
|
||||
<li <?= ($currentPlugin === $plugin) ? 'class="active"' : ''; ?>>
|
||||
<a href="<?= APP_URL; ?>build/view/<?= $build->getId(); ?>?plugin=<?= urlencode($currentPlugin); ?>&severity=<?= urlencode($severity); ?>#errors">
|
||||
<?= Lang::get($currentPlugin); ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||
<?php if ('' !== $severity) {
|
||||
echo Lang::get('severity') . ': ' . Lang::get(BuildError::getSeverityName($severity));
|
||||
} else {
|
||||
echo Lang::get('all_severities');
|
||||
} ?> <span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="<?= APP_URL; ?>build/view/<?= $build->getId(); ?>?plugin=<?= urlencode($plugin); ?>#errors"><?= Lang::get('all_severities'); ?></a></li>
|
||||
<li class="divider"></li>
|
||||
|
||||
<?php if(!empty($severities)): ?>
|
||||
<?php foreach ($severities as $currentSeverity) : ?>
|
||||
<li <?= ($currentSeverity === $severity) ? 'class="active"' : ''; ?>>
|
||||
<a href="<?= APP_URL; ?>build/view/<?= $build->getId(); ?>?plugin=<?= urlencode($plugin); ?>&severity=<?= urlencode($currentSeverity); ?>#errors">
|
||||
<?= Lang::get(BuildError::getSeverityName($currentSeverity)); ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<table class="errors-table table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -204,6 +264,9 @@ use PHPCensor\Model\Build;
|
|||
<?php print $data['error_html']; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<div id="paginator">
|
||||
<?= $paginator; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab-pane" id="information">
|
||||
|
@ -214,15 +277,28 @@ use PHPCensor\Model\Build;
|
|||
|
||||
<script src="<?php print APP_URL; ?>assets/js/build.js"></script>
|
||||
<script>
|
||||
var PER_PAGE = <?= $perPage; ?>;
|
||||
var PAGE = <?= $page; ?>;
|
||||
var BUILD_PLUGIN = '<?= $plugin; ?>';
|
||||
var BUILD_SEVERITY = '<?= $severity; ?>';
|
||||
|
||||
var ActiveBuild = new Build(<?php print $build->getId() ?>);
|
||||
ActiveBuild.setupBuild(<?php print json_encode($data); ?>, <?php print json_encode($build->getFileLinkTemplate()); ?>);
|
||||
var ActiveBuild = new Build(<?= $build->getId(); ?>);
|
||||
ActiveBuild.setupBuild(<?= json_encode($data); ?>, <?= json_encode($build->getFileLinkTemplate()); ?>);
|
||||
|
||||
var url = document.location.toString();
|
||||
if (url.match('#')) {
|
||||
$('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
|
||||
}
|
||||
|
||||
$('.nav-tabs a').on('shown.bs.tab', function (e) {
|
||||
window.location.hash = e.target.hash;
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<?php
|
||||
foreach ($plugins as $plugin) {
|
||||
print '<script src="' . APP_URL . 'assets/js/build-plugins/' . $plugin . '"></script>' . PHP_EOL;
|
||||
foreach ($uiPlugins as $uiPlugin) {
|
||||
print '<script src="' . APP_URL . 'assets/js/build-plugins/' . $uiPlugin . '"></script>' . PHP_EOL;
|
||||
}
|
||||
?>
|
||||
|
||||
|
|
|
@ -124,26 +124,8 @@ use PHPCensor\Helper\Lang;
|
|||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="pagination">
|
||||
<?php if ($paginator->getPrevUrl()): ?>
|
||||
<li><a href="<?php echo $paginator->getPrevUrl(); ?>"><?= Lang::get('prev_link'); ?></a></li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php foreach ($paginator->getPages() as $pageArray): ?>
|
||||
<?php if ($pageArray['url']): ?>
|
||||
<li <?php echo $pageArray['isCurrent'] ? 'class="active"' : ''; ?>>
|
||||
<a href="<?php echo $pageArray['url']; ?>"><?php echo $pageArray['num']; ?></a>
|
||||
</li>
|
||||
<?php else: ?>
|
||||
<li class="disabled"><span><?php echo $pageArray['num']; ?></span></li>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php if ($paginator->getNextUrl()): ?>
|
||||
<li><a href="<?php echo $paginator->getNextUrl(); ?>"><?= Lang::get('prev_link'); ?></a></li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
<div id="paginator">
|
||||
<?= $paginator; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -14,6 +14,19 @@
|
|||
<link href="<?php print APP_URL; ?>assets/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
|
||||
<link href="<?php print APP_URL; ?>assets/vendor/ion-icons/css/ionicons.min.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<script src="<?php print APP_URL; ?>assets/js/class.js"></script>
|
||||
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/plugins/jQuery/jquery-2.2.3.min.js"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/plugins/jQueryUI/jquery-ui.min.js" type="text/javascript"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
|
||||
<link href="<?php print APP_URL; ?>assets/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/plugins/chartjs/Chart.min.js" type="text/javascript"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/dist/js/app.min.js" type="text/javascript"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/sprintf-js/dist/sprintf.min.js"></script>
|
||||
|
||||
<script src="<?php print APP_URL; ?>assets/js/app.js" type="text/javascript"></script>
|
||||
|
||||
<script>
|
||||
var APP_URL = '<?= APP_URL; ?>';
|
||||
var LANGUAGE = '<?= Lang::getLanguage(); ?>';
|
||||
|
@ -25,11 +38,6 @@
|
|||
<?php endif; ?>
|
||||
</script>
|
||||
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/plugins/jQuery/jquery-2.2.3.min.js"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/js/class.js"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/sprintf-js/dist/sprintf.min.js"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/js/app.js" type="text/javascript"></script>
|
||||
|
||||
</head>
|
||||
<body class="app-layout <?php print !empty($skin) ? 'skin-' . $skin : 'skin-black'; ?>">
|
||||
<div class="wrapper row-offcanvas row-offcanvas-left">
|
||||
|
@ -245,14 +253,5 @@
|
|||
</section><!-- /.content -->
|
||||
</aside><!-- /.content-wrapper -->
|
||||
</div><!-- ./wrapper -->
|
||||
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/plugins/jQueryUI/jquery-ui.min.js" type="text/javascript"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
|
||||
<link href="<?php print APP_URL; ?>assets/vendor/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
|
||||
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/plugins/chartjs/Chart.min.js" type="text/javascript"></script>
|
||||
<script src="<?php print APP_URL; ?>assets/vendor/admin-lte/dist/js/app.min.js" type="text/javascript"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
28
src/PHPCensor/View/pagination.phtml
Normal file
28
src/PHPCensor/View/pagination.phtml
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
use PHPCensor\Helper\Lang;
|
||||
|
||||
/**
|
||||
* @var \JasonGrimes\Paginator $paginator
|
||||
*/
|
||||
|
||||
?>
|
||||
<ul class="pagination">
|
||||
<?php if ($paginator->getPrevUrl()): ?>
|
||||
<li><a href="<?php echo $paginator->getPrevUrl(); ?>"><?= Lang::get('prev_link'); ?></a></li>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php foreach ($paginator->getPages() as $pageArray): ?>
|
||||
<?php if ($pageArray['url']): ?>
|
||||
<li <?php echo $pageArray['isCurrent'] ? 'class="active"' : ''; ?>>
|
||||
<a href="<?php echo $pageArray['url']; ?>"><?php echo $pageArray['num']; ?></a>
|
||||
</li>
|
||||
<?php else: ?>
|
||||
<li class="disabled"><span><?php echo $pageArray['num']; ?></span></li>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<?php if ($paginator->getNextUrl()): ?>
|
||||
<li><a href="<?php echo $paginator->getNextUrl(); ?>"><?= Lang::get('prev_link'); ?></a></li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
Loading…
Reference in a new issue