From 002dc083f21eff53c99e2ef2f30b19fad54c1c3b Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Tue, 10 Mar 2015 17:22:46 -0700 Subject: [PATCH] Get the main repo page design working --- data/model/legacy.py | 20 +++++ endpoints/api/repository.py | 13 +++- static/css/core-ui.css | 2 +- .../directives/repo-view/repo-panel-info.css | 63 +++++++++++++++ static/css/directives/ui/build-info-bar.css | 4 + .../css/directives/ui/build-mini-status.css | 53 +++++++++++++ static/directives/build-info-bar.html | 2 +- static/directives/build-mini-status.html | 18 +++++ static/directives/build-status.html | 1 + static/directives/cor-title-action.html | 2 +- static/directives/markdown-input.html | 2 +- .../directives/repo-view/repo-panel-info.html | 77 +++++++++++++++++-- .../directives/repo-view/repo-panel-info.js | 3 +- static/js/directives/ui/build-info-bar.js | 3 +- static/js/directives/ui/build-mini-status.js | 22 ++++++ static/js/directives/ui/build-status.js | 2 +- static/js/pages/repo-view.js | 24 +++++- static/partials/repo-view.html | 6 +- 18 files changed, 299 insertions(+), 18 deletions(-) create mode 100644 static/css/directives/repo-view/repo-panel-info.css create mode 100644 static/css/directives/ui/build-mini-status.css create mode 100644 static/directives/build-mini-status.html create mode 100644 static/js/directives/ui/build-mini-status.js diff --git a/data/model/legacy.py b/data/model/legacy.py index e24a2675e..058d65248 100644 --- a/data/model/legacy.py +++ b/data/model/legacy.py @@ -2537,6 +2537,26 @@ def cancel_repository_build(build, work_queue): build.delete_instance() return True +def get_repository_pushes(repository, time_delta): + since = date.today() - time_delta + push_repo = LogEntryKind.get(name = 'push_repo') + return (LogEntry.select() + .where(LogEntry.repository == repository) + .where(LogEntry.kind == push_repo) + .where(LogEntry.datetime >= since) + .count()) + +def get_repository_pulls(repository, time_delta): + since = date.today() - time_delta + repo_pull = LogEntryKind.get(name = 'pull_repo') + repo_verb = LogEntryKind.get(name = 'repo_verb') + return (LogEntry.select() + .where(LogEntry.repository == repository) + .where((LogEntry.kind == repo_pull) | (LogEntry.kind == repo_verb)) + .where(LogEntry.datetime >= since) + .count()) + + def get_repository_usage(): one_month_ago = date.today() - timedelta(weeks=4) repo_pull = LogEntryKind.get(name = 'pull_repo') diff --git a/endpoints/api/repository.py b/endpoints/api/repository.py index 49369e61f..84d07bec3 100644 --- a/endpoints/api/repository.py +++ b/endpoints/api/repository.py @@ -1,6 +1,7 @@ import logging import json import datetime +from datetime import timedelta from flask import request @@ -213,7 +214,17 @@ class Repository(RepositoryParamResource): 'is_building': len(list(active_builds)) > 0, 'is_organization': bool(organization), 'is_starred': is_starred, - 'status_token': repo.badge_token if not is_public else '' + 'status_token': repo.badge_token if not is_public else '', + 'stats': { + 'pulls': { + 'today': model.get_repository_pulls(repo, timedelta(days=1)), + 'thirty_day': model.get_repository_pulls(repo, timedelta(days=30)) + }, + 'pushes': { + 'today': model.get_repository_pushes(repo, timedelta(days=1)), + 'thirty_day': model.get_repository_pushes(repo, timedelta(days=30)) + } + } } raise NotFound() diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 6d029372a..4aea13371 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -86,7 +86,7 @@ width: 100%; display: table-cell; float: none; - padding: 20px; + padding: 30px; } .co-tabs li { diff --git a/static/css/directives/repo-view/repo-panel-info.css b/static/css/directives/repo-view/repo-panel-info.css new file mode 100644 index 000000000..0fa8a7e48 --- /dev/null +++ b/static/css/directives/repo-view/repo-panel-info.css @@ -0,0 +1,63 @@ +.repo-panel-info-element .stat-col { + border-right: 2px solid #eee; +} + +.repo-panel-info-element .stat-title { + text-align: center; + display: block; + font-size: 20px; + margin-bottom: 10px; +} + +.repo-panel-info-element .stat { + text-align: center; + margin-bottom: 20px; +} + +.repo-panel-info-element .stat .stat-value { + font-size: 46px; +} + +.repo-panel-info-element .stat .stat-subtitle { + font-size: 12px; + color: #ccc; + text-transform: uppercase; +} + +.repo-panel-info-element .description-container { + margin-top: 30px; + border-top: 2px solid #eee; + padding-top: 18px; +} + +.repo-panel-info-element .description { + padding-bottom: 0px; + position: relative; +} + +.repo-panel-info-element .description p { + font-size: 16px !important; +} + +.repo-panel-info-element .description-container h4:before { + content: "\f02d"; + color: #black; + font-size: 20px; + font-family: FontAwesome; + margin-right: 6px; +} + +.repo-panel-info-element .description .fa-edit { + display: none; +} + +.repo-panel-info-element .build-mini-status { + margin-top: 10px; + margin-bottom: 10px; +} + +.repo-panel-info-element .view-all { + display: block; + padding: 10px; + text-align: center; +} \ No newline at end of file diff --git a/static/css/directives/ui/build-info-bar.css b/static/css/directives/ui/build-info-bar.css index 2421b89a9..fc4c807d7 100644 --- a/static/css/directives/ui/build-info-bar.css +++ b/static/css/directives/ui/build-info-bar.css @@ -31,4 +31,8 @@ .build-info-bar-element .build-side-info .timing { text-align: right; +} + +.build-info-bar-element .source-commit-link { + margin-left: 4px; } \ No newline at end of file diff --git a/static/css/directives/ui/build-mini-status.css b/static/css/directives/ui/build-mini-status.css new file mode 100644 index 000000000..f4e82a977 --- /dev/null +++ b/static/css/directives/ui/build-mini-status.css @@ -0,0 +1,53 @@ +.build-mini-status { + display: block; + padding: 4px; + position: relative; + border: 1px solid #eee; +} + +.build-mini-status-element { + color: black; + text-decoration: none !important; +} + +.build-mini-status .build-status-icon { + width: 42px; + padding: 4px; + text-align: center; + display: inline-block; + font-size: 18px; +} + +.build-mini-status .timing { + display: inline-block; + margin-left: 30px; + margin-right: 20px; +} + +.build-mini-status .timing .fa { + display: inline-block; + margin-right: 4px; +} + +.build-mini-status .build-description { + position: absolute; + top: 4px; + right: 4px; + left: 250px; + bottom: 4px; + line-height: 33px; + overflow: hidden; + text-overflow: ellipsis; +} + +.build-mini-status .build-status-icon.error { + color: red; +} + +.build-mini-status .build-status-icon.internalerror { + color: #DFFF00; +} + +.build-mini-status .build-status-icon.complete { + color: #2fcc66; +} \ No newline at end of file diff --git a/static/directives/build-info-bar.html b/static/directives/build-info-bar.html index 4a970d727..45b17d47c 100644 --- a/static/directives/build-info-bar.html +++ b/static/directives/build-info-bar.html @@ -5,7 +5,7 @@
-
{{ build.id }}
+
{{ build.id }}
diff --git a/static/directives/build-mini-status.html b/static/directives/build-mini-status.html new file mode 100644 index 000000000..f06c2785e --- /dev/null +++ b/static/directives/build-mini-status.html @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + + +
+
Manually Started Build
+
+
\ No newline at end of file diff --git a/static/directives/build-status.html b/static/directives/build-status.html index cf5ded997..1ae92d29f 100644 --- a/static/directives/build-status.html +++ b/static/directives/build-status.html @@ -1,3 +1,4 @@ +
diff --git a/static/directives/cor-title-action.html b/static/directives/cor-title-action.html index bdfa44387..f06f9b78d 100644 --- a/static/directives/cor-title-action.html +++ b/static/directives/cor-title-action.html @@ -1,3 +1,3 @@ -
+
\ No newline at end of file diff --git a/static/directives/markdown-input.html b/static/directives/markdown-input.html index b989b83b3..d3fd5cbec 100644 --- a/static/directives/markdown-input.html +++ b/static/directives/markdown-input.html @@ -1,7 +1,7 @@

- (Click to set {{ fieldTitle }}) + Click to set {{ fieldTitle }}

diff --git a/static/directives/repo-view/repo-panel-info.html b/static/directives/repo-view/repo-panel-info.html index c9e415043..06f45acf4 100644 --- a/static/directives/repo-view/repo-panel-info.html +++ b/static/directives/repo-view/repo-panel-info.html @@ -1,9 +1,72 @@
- -
-
+ +
+ +
+
Repo Pulls
+ +
+
{{ repository.stats.pulls.today }}
+
Last 24 hours
+
+ +
+
{{ repository.stats.pulls.thirty_day }}
+
Last 30 days
+
+
+ + +
+
Repo Pushes
+ +
+
{{ repository.stats.pushes.today }}
+
Last 24 hours
+
+ +
+
{{ repository.stats.pushes.thirty_day }}
+
Last 30 days
+
+
+ + +
+
Recent Repo Builds
+ + +
+ + +
+
No builds have been run for this repository.
+
+ Click on the Builds tab to start a new build. +
+
+ + +
+
+
+ + + + View Build History + +
+
+ + +
+

Description

+
+
+
\ No newline at end of file diff --git a/static/js/directives/repo-view/repo-panel-info.js b/static/js/directives/repo-view/repo-panel-info.js index b72a59862..5946bac73 100644 --- a/static/js/directives/repo-view/repo-panel-info.js +++ b/static/js/directives/repo-view/repo-panel-info.js @@ -9,7 +9,8 @@ angular.module('quay').directive('repoPanelInfo', function () { transclude: false, restrict: 'C', scope: { - 'repository': '=repository' + 'repository': '=repository', + 'builds': '=builds' }, controller: function($scope, $element, ApiService) { $scope.updateDescription = function(content) { diff --git a/static/js/directives/ui/build-info-bar.js b/static/js/directives/ui/build-info-bar.js index 32850ef6f..57753f8c5 100644 --- a/static/js/directives/ui/build-info-bar.js +++ b/static/js/directives/ui/build-info-bar.js @@ -10,7 +10,8 @@ angular.module('quay').directive('buildInfoBar', function () { restrict: 'C', scope: { 'build': '=build', - 'showTime': '=showTime' + 'showTime': '=showTime', + 'hideId': '=hideId' }, controller: function($scope, $element) { } diff --git a/static/js/directives/ui/build-mini-status.js b/static/js/directives/ui/build-mini-status.js new file mode 100644 index 000000000..70c026e8b --- /dev/null +++ b/static/js/directives/ui/build-mini-status.js @@ -0,0 +1,22 @@ +/** + * An element which displays the status of a build as a mini-bar. + */ +angular.module('quay').directive('buildMiniStatus', function () { + var directiveDefinitionObject = { + priority: 0, + templateUrl: '/static/directives/build-mini-status.html', + replace: false, + transclude: false, + restrict: 'C', + scope: { + 'build': '=build' + }, + controller: function($scope, $element) { + $scope.isBuilding = function(build) { + if (!build) { return true; } + return build.phase != 'complete' && build.phase != 'error'; + }; + } + }; + return directiveDefinitionObject; +}); \ No newline at end of file diff --git a/static/js/directives/ui/build-status.js b/static/js/directives/ui/build-status.js index a15af1546..0808a0aab 100644 --- a/static/js/directives/ui/build-status.js +++ b/static/js/directives/ui/build-status.js @@ -1,5 +1,5 @@ /** - * An element which displays the status of a build. + * DEPRECATED: An element which displays the status of a build. */ angular.module('quay').directive('buildStatus', function () { var directiveDefinitionObject = { diff --git a/static/js/pages/repo-view.js b/static/js/pages/repo-view.js index 19ce0cd97..40327291e 100644 --- a/static/js/pages/repo-view.js +++ b/static/js/pages/repo-view.js @@ -13,12 +13,14 @@ }, ['old-layout']); }]); - function RepoViewCtrl($scope, $routeParams, ApiService, UserService) { + function RepoViewCtrl($scope, $routeParams, ApiService, UserService, AngularPollChannel) { $scope.namespace = $routeParams.namespace; $scope.name = $routeParams.name; $scope.logsShown = 0; + var buildPollChannel = null; + // Make sure we track the current user. UserService.updateUserIn($scope); @@ -30,12 +32,32 @@ $scope.repositoryResource = ApiService.getRepoAsResource(params).get(function(repo) { $scope.repository = repo; $scope.setTag($routeParams.tag); + + // Track builds. + buildPollChannel = AngularPollChannel.create($scope, loadRepositoryBuilds, 5000 /* 5s */); + buildPollChannel.start(); }); }; + var loadRepositoryBuilds = function(callback) { + var params = { + 'repository': $scope.namespace + '/' + $scope.name + }; + + var errorHandler = function() { + callback(false); + }; + + $scope.repositoryBuildsResource = ApiService.getRepoBuildsAsResource(params, /* background */true).get(function(resp) { + $scope.builds = resp.builds; + callback(false); + }, errorHandler); + }; + // Load the repository. loadRepository(); + $scope.setTag = function(tagName) { window.console.log('set tag') }; diff --git a/static/partials/repo-view.html b/static/partials/repo-view.html index b61ee10b5..e86fb19bb 100644 --- a/static/partials/repo-view.html +++ b/static/partials/repo-view.html @@ -1,4 +1,6 @@ -
+
@@ -42,7 +44,7 @@
-
+