diff --git a/public/assets/js/build.js b/public/assets/js/build.js index c08f0201..f0f1f479 100644 --- a/public/assets/js/build.js +++ b/public/assets/js/build.js @@ -74,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 + '?per_page=' + PER_PAGE + '&page=' + PAGE + '&plugin=' + BUILD_PLUGIN + '&severity=' + BUI; + fullUri = window.APP_URL + 'build/ajax-data/' + self.buildId + '?per_page=' + PER_PAGE + '&page=' + PAGE + '&plugin=' + BUILD_PLUGIN + '&severity=' + BUILD_SEVERITY + '&is_new=' + BUILD_IS_NEW; } $.ajax({ diff --git a/src/PHPCensor/Controller/BuildController.php b/src/PHPCensor/Controller/BuildController.php index fc2350c9..a3652d3b 100644 --- a/src/PHPCensor/Controller/BuildController.php +++ b/src/PHPCensor/Controller/BuildController.php @@ -17,7 +17,7 @@ use PHPCensor\Controller; /** * Build Controller - Allows users to run and view builds. - * + * * @author Dan Cryer */ class BuildController extends Controller @@ -52,6 +52,7 @@ class BuildController extends Controller { $page = (integer)$this->getParam('page', 1); $plugin = $this->getParam('plugin', ''); + $isNew = $this->getParam('is_new', ''); $severity = $this->getParam('severity', null); if (null !== $severity && '' !== $severity) { @@ -73,7 +74,7 @@ class BuildController extends Controller /** @var User $user */ $user = $_SESSION['php-censor-user']; $perPage = $user->getFinalPerPage(); - $data = $this->getBuildData($build, $plugin, $severity, (($page - 1) * $perPage), $perPage); + $data = $this->getBuildData($build, $plugin, $severity, $isNew, (($page - 1) * $perPage), $perPage); $pages = ($data['errors'] === 0) ? 1 : (integer)ceil($data['errors'] / $perPage); @@ -90,13 +91,15 @@ class BuildController extends Controller $this->view->data = $data; $this->view->plugin = urldecode($plugin); - $this->view->plugins = $errorStore->getKnownPlugins($buildId); + $this->view->plugins = $errorStore->getKnownPlugins($buildId, $severity, $isNew); $this->view->severity = urldecode(null !== $severity ? $severity : ''); - $this->view->severities = $errorStore->getKnownSeverities($buildId, $plugin); + $this->view->severities = $errorStore->getKnownSeverities($buildId, $plugin, $isNew); + $this->view->isNew = urldecode($isNew); + $this->view->isNews = ['only_new', 'only_old']; $this->view->page = $page; $this->view->perPage = $perPage; - $this->view->paginator = $this->getPaginatorHtml($buildId, $plugin, $severity, $data['errors'], $perPage, $page); + $this->view->paginator = $this->getPaginatorHtml($buildId, $plugin, $severity, $isNew, $data['errors'], $perPage, $page); $this->layout->title = Lang::get('build_n', $buildId); $this->layout->subtitle = $build->getProjectTitle(); @@ -124,7 +127,7 @@ class BuildController extends Controller $delete = Lang::get('delete_build'); $deleteLink = APP_URL . 'build/delete/' . $build->getId(); - + $project = b8\Store\Factory::getStore('Project')->getByPrimaryKey($build->getProjectId()); $actions = ''; @@ -166,12 +169,13 @@ class BuildController extends Controller * @param Build $build * @param string $plugin * @param integer $severity + * @param string $isNew * @param integer $start * @param integer $perPage * * @return array */ - protected function getBuildData(Build $build, $plugin, $severity, $start = 0, $perPage = 10) + protected function getBuildData(Build $build, $plugin, $severity, $isNew, $start = 0, $perPage = 10) { $data = []; $data['status'] = (int)$build->getStatus(); @@ -183,13 +187,13 @@ class BuildController extends Controller /** @var \PHPCensor\Store\BuildErrorStore $errorStore */ $errorStore = b8\Store\Factory::getStore('BuildError'); - $errors = $errorStore->getByBuildId($build->getId(), $perPage, $start, $plugin, $severity); + $errors = $errorStore->getByBuildId($build->getId(), $perPage, $start, $plugin, $severity, $isNew); $errorView = new b8\View('Build/errors'); $errorView->build = $build; $errorView->errors = $errors['items']; - $data['errors'] = $errorStore->getErrorTotalForBuild($build->getId(), $plugin, $severity); + $data['errors'] = $errorStore->getErrorTotalForBuild($build->getId(), $plugin, $severity, $isNew); $data['errors_total'] = $errorStore->getErrorTotalForBuild($build->getId()); $data['error_html'] = $errorView->render(); @@ -200,13 +204,14 @@ class BuildController extends Controller * @param integer $buildId * @param string $plugin * @param integer $severity + * @param string $isNew * @param integer $total * @param integer $perPage * @param integer $page * * @return string */ - protected function getPaginatorHtml($buildId, $plugin, $severity, $total, $perPage, $page) + protected function getPaginatorHtml($buildId, $plugin, $severity, $isNew, $total, $perPage, $page) { $view = new b8\View('pagination'); @@ -220,6 +225,10 @@ class BuildController extends Controller $params['severity'] = $severity; } + if (!empty($isNew)) { + $params['is_new'] = $isNew; + } + $urlPattern = $urlPattern . '?' . str_replace('%28%3Anum%29', '(:num)', http_build_query(array_merge($params, ['page' => '(:num)']))) . '#errors'; $paginator = new Paginator($total, $perPage, $page, $urlPattern); @@ -313,6 +322,7 @@ class BuildController extends Controller $page = (integer)$this->getParam('page', 1); $perPage = (integer)$this->getParam('per_page', 10); $plugin = $this->getParam('plugin', ''); + $isNew = $this->getParam('is_new', ''); $severity = $this->getParam('severity', null); if (null !== $severity && '' !== $severity) { @@ -327,12 +337,12 @@ class BuildController extends Controller if (!$build) { $response->setResponseCode(404); $response->setContent([]); - + return $response; } - $data = $this->getBuildData($build, $plugin, $severity, (($page - 1) * $perPage), $perPage); - $data['paginator'] = $this->getPaginatorHtml($buildId, $plugin, $severity, $data['errors'], $perPage, $page); + $data = $this->getBuildData($build, $plugin, $severity, $isNew, (($page - 1) * $perPage), $perPage); + $data['paginator'] = $this->getPaginatorHtml($buildId, $plugin, $severity, $isNew, $data['errors'], $perPage, $page); $response->setContent($data); diff --git a/src/PHPCensor/Languages/lang.en.php b/src/PHPCensor/Languages/lang.en.php index dac686f5..7d889a21 100644 --- a/src/PHPCensor/Languages/lang.en.php +++ b/src/PHPCensor/Languages/lang.en.php @@ -188,6 +188,9 @@ PHP Censor', 'build_n' => 'Build %d', 'rebuild_now' => 'Rebuild Now', + 'all_errors' => 'All errors', + 'only_new' => 'Only new errors', + 'only_old' => 'Only old errors', 'committed_by_x' => 'Committed by %s', 'commit_id_x' => 'Commit: %s', diff --git a/src/PHPCensor/Languages/lang.ru.php b/src/PHPCensor/Languages/lang.ru.php index 22ca05a8..8bf3fbb0 100644 --- a/src/PHPCensor/Languages/lang.ru.php +++ b/src/PHPCensor/Languages/lang.ru.php @@ -181,6 +181,10 @@ PHP Censor', 'build_n' => 'Сборка %d', 'rebuild_now' => 'Пересобрать сейчас', + 'all_errors' => 'Все ошибки', + 'only_new' => 'Только новые', + 'only_old' => 'Только старые', + 'committed_by_x' => 'Отправил %s', 'commit_id_x' => 'Коммит: %s', diff --git a/src/PHPCensor/Store/BuildErrorStore.php b/src/PHPCensor/Store/BuildErrorStore.php index 7ccedb7d..2a62a81c 100644 --- a/src/PHPCensor/Store/BuildErrorStore.php +++ b/src/PHPCensor/Store/BuildErrorStore.php @@ -79,7 +79,7 @@ class BuildErrorStore extends Store * * @throws HttpException */ - public function getByBuildId($buildId, $limit = null, $offset = 0, $plugin = null, $severity = null) + public function getByBuildId($buildId, $limit = null, $offset = 0, $plugin = null, $severity = null, $isNew = null) { if (is_null($buildId)) { throw new HttpException('Value passed to ' . __FUNCTION__ . ' cannot be null.'); @@ -92,7 +92,14 @@ class BuildErrorStore extends Store if (null !== $severity) { $query .= ' AND {{severity}} = :severity'; } - $query .= ' ORDER BY plugin, severity'; + + if ('only_new' === $isNew) { + $query .= ' AND {{is_new}} = true'; + } elseif ('only_old' === $isNew) { + $query .= ' AND {{is_new}} = false'; + } + + $query .= ' ORDER BY is_new, severity, plugin'; if (null !== $limit) { $query .= ' LIMIT :limit'; } @@ -139,22 +146,32 @@ class BuildErrorStore extends Store * * @return integer */ - public function getErrorTotalForBuild($buildId, $plugin = null, $severity = null) + public function getErrorTotalForBuild($buildId, $plugin = null, $severity = null, $isNew = null) { $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'; } + if ('only_new' === $isNew) { + $query .= ' AND {{is_new}} = true'; + } elseif ('only_old' === $isNew) { + $query .= ' AND {{is_new}} = false'; + } + $stmt = Database::getConnection('read')->prepareCommon($query); $stmt->bindValue(':build', $buildId, \PDO::PARAM_INT); + if ($plugin) { $stmt->bindValue(':plugin', $plugin, \PDO::PARAM_STR); } + if (null !== $severity) { $stmt->bindValue(':severity', (integer)$severity, \PDO::PARAM_INT); } @@ -170,14 +187,30 @@ class BuildErrorStore extends Store /** * @param integer $buildId + * @param integer $severity + * @param string $isNew * * @return array */ - public function getKnownPlugins($buildId) + public function getKnownPlugins($buildId, $severity = null, $isNew = '') { $query = 'SELECT DISTINCT {{plugin}} from {{build_error}} WHERE {{build_id}} = :build'; + + if (null !== $severity) { + $query .= ' AND {{severity}} = :severity'; + } + + if ('only_new' === $isNew) { + $query .= ' AND {{is_new}} = true'; + } elseif ('only_old' === $isNew) { + $query .= ' AND {{is_new}} = false'; + } + $stmt = Database::getConnection('read')->prepareCommon($query); $stmt->bindValue(':build', $buildId); + if (null !== $severity) { + $stmt->bindValue(':severity', (integer)$severity, \PDO::PARAM_INT); + } if ($stmt->execute()) { $res = $stmt->fetchAll(\PDO::FETCH_ASSOC); @@ -196,16 +229,24 @@ class BuildErrorStore extends Store /** * @param integer $buildId * @param string $plugin + * @param string $isNew * * @return array */ - public function getKnownSeverities($buildId, $plugin = '') + public function getKnownSeverities($buildId, $plugin = '', $isNew = '') { $query = 'SELECT DISTINCT {{severity}} FROM {{build_error}} WHERE {{build_id}} = :build'; + if ($plugin) { $query .= ' AND {{plugin}} = :plugin'; } + if ('only_new' === $isNew) { + $query .= ' AND {{is_new}} = true'; + } elseif ('only_old' === $isNew) { + $query .= ' AND {{is_new}} = false'; + } + $stmt = Database::getConnection('read')->prepareCommon($query); $stmt->bindValue(':build', $buildId); if ($plugin) { diff --git a/src/PHPCensor/View/Build/view.phtml b/src/PHPCensor/View/Build/view.phtml index 71cbab06..0707c253 100644 --- a/src/PHPCensor/View/Build/view.phtml +++ b/src/PHPCensor/View/Build/view.phtml @@ -201,6 +201,31 @@ use PHPCensor\Model\BuildError;

: /

+
+ + +