--- a/css/style.css Mon Jan 19 21:50:01 2015 -0600
+++ b/css/style.css Sun Jan 25 04:35:39 2015 -0600
@@ -18,8 +18,8 @@
@@ -29,8 +29,22 @@
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
--- a/html/window.html Mon Jan 19 21:50:01 2015 -0600
+++ b/html/window.html Sun Jan 25 04:35:39 2015 -0600
@@ -17,38 +17,56 @@
<div class="input-group">
<span class="input-group-addon">Registry</span>
- <input class="form-control" data-ng-model="registry" placeholder="enter the url of your registry">
+ <input class="form-control" data-ng-model="registry" placeholder="enter the url of your registry" data-ng-disabled="refreshing"> <div class="input-group">
<span class="input-group-addon">Query</span>
- <input class="form-control" data-ng-model="query" placeholder="Search Query">
+ <input class="form-control" data-ng-model="query" placeholder="Search Query" ng-disabled="refreshing"> - <button type="button" class="btn btn-primary" data-ng-click="refresh()">Refresh</button>
+ <button type="button" class="btn btn-primary" data-ng-click="refresh()" data-ng-disabled="refreshing">Refresh</button> - <div>Clipboard: {{clipboard}}</div>
- <div class="list-group repo-list col-xs-4">
- <a class="list-group-item" data-ng-repeat="r in repos" data-ng-click="select_repo(r)" ng-class="(r == repo) ? 'active': ''" href="#">{{r.name}}</a>
+ <div class="col-xs-12">Clipboard: {{clipboard}}</div> + <div class="row" data-ng-show="debug"> + <div class="col-xs-3"><label><input type="checkbox" data-ng-model="refreshing">refreshing</label></div> + <div class="col-xs-3"><label><input type="checkbox" data-ng-model="refreshing_repo">refreshing_repo</label></div> + <div class="row height-90"> + <div class="col-xs-4 full-height"> + <div class="list-group repo-list" data-ng-hide="refreshing"> + <a class="list-group-item" data-ng-repeat="r in repos" data-ng-click="select_repo(r)" data-ng-class="(r == repo) ? 'active': ''" href>{{r.name}}</a> + <div class="loading" data-ng-show="refreshing"> + <i class="fa fa-spin fa-5x fa-cog"></i><br><span>Loading...</span> - <div class="repo-info col-xs-8" data-ng-show="repo">
- <div><h1>{{repo.name}}</h1></div>
- <div>{{repo.description||""}}</div>
- <span data-ng-show="repo.is_official" class="label label-primary">Official</span>
- <span data-ng-show="repo.is_trusted" class="label label-success">Trusted</span>
- <span data-ng-show="repo.is_automated" class="label label-info">Automated</span>
- <span class="label label-warning" data-ng-show="repo.star_count > 0">{{repo.star_count}}<span class="fa fa-star"></span></span>
+ <div class="repo-info col-xs-8" data-ng-show="repo"> + <div><h1>{{repo.name}}</h1></div> + <div>{{repo.description||"(no description)"}}</div> + <span data-ng-show="repo.is_official" class="label label-primary">Official</span> + <span data-ng-show="repo.is_trusted" class="label label-success">Trusted</span> + <span data-ng-show="repo.is_automated" class="label label-info">Automated</span> + <span class="label label-warning" data-ng-show="repo.star_count > 0">{{repo.star_count}}<span class="fa fa-star"></span></span> + <div data-ng-hide="refreshing_repo"> + <li data-ng-repeat="(layer, tags) in tags"> + <span data-ng-repeat="tag in tags"><code>{{tag}}</code><span data-ng-click="copy_tag(tag)" class="fa fa-clipboard"></span>{{$last ? '' : ', '}}</span> + <div class="loading" data-ng-show="refreshing_repo"> + <i class="fa fa-spin fa-5x fa-cog"></i><br>Loading...
- <li data-ng-repeat="(layer, tags) in tags">
- <span data-ng-repeat="tag in tags"><code>{{tag}}</code><span data-ng-click="copy_tag(tag)" class="fa fa-clipboard"></span>{{$last ? '' : ', '}}</span>
--- a/js/app.js Mon Jan 19 21:50:01 2015 -0600
+++ b/js/app.js Sun Jan 25 04:35:39 2015 -0600
@@ -38,8 +38,11 @@
function ManifestController($scope, manifestREST) {
+ $scope.refreshing = false; + $scope.refreshing_repo = false; $scope.registry = "registry.hub.docker.com";
- $scope.query = "busybox";
@@ -58,6 +61,8 @@
+ $scope.refreshing = true; if($scope.registry.indexOf("http://") !== 0 && $scope.registry.indexOf("https://") !== 0) {
$scope.registry = "http://" + $scope.registry;
@@ -73,8 +78,15 @@
$scope.ga_tracker.sendTiming("refresh", "load time", timer_end - timer_start, "refresh success timing");
$scope.repos = data.results.map(function(repo) {
+ var library_prefix = "library/" + if(repo.name.indexOf(library_prefix) == 0) { + repo.name = repo.name.substring(library_prefix.length, repo.name.length); + $scope.refreshing = false; @@ -84,6 +96,8 @@
$scope.ga_tracker.sendEvent("refresh", "status", "refresh failed");
$scope.ga_tracker.sendTiming("refresh", "load time", timer_end - timer_start, "refresh failed timing");
+ $scope.refreshing = false; console.log("Failed to get the registry list: " + status);
@@ -98,6 +112,8 @@
+ $scope.refreshing_repo = true; manifestREST.tags($scope.registry, repo.name)
.success(function(data, status, headers, config) {
/* the docker registry returns a list of objects like
@@ -105,34 +121,59 @@
* and the private registry returns a dictionary of tag
- * This function will normalize them into an object like
- * {"deadb33f", ["latest"]}
+ * This function will normalize them into a sorted list like + * Image IDs are thrown away because we don't care about them. $scope.ga_tracker.sendEvent("repo", "get tags", "success");
if(data.constructor === Array) { /* registry.hub.docker.com */
- $scope.tags[tag.layer] = $scope.tags[tag.layer] || [];
+ dtags[tag.layer] = dtags[tag.layer] || []; + dtags[tag.layer].push(tag.name); - $scope.tags[tag.layer].push(tag.name);
+ for(var tag in dtags) { + tags.push(dtags[tag].sort()); + $scope.tags = tags.sort(function(a, b) { return a[0] - b[0]}); } else if(data !== null && typeof data === 'object') { /* private registries */
- $scope.tags[layer] = $scope.tags[layer] || [];
- $scope.tags[layer].push(tag);
+ dtags[layer] = dtags[layer] || []; + dtags[layer].push(tag); + for(var tag in dtags) { + tags.push(dtags[tag].sort()); + $scope.tags = tags.sort(function(a, b) { return a[0] - b[0]}); + $scope.refreshing_repo = false; .error(function(data, status, headers, config) {
$scope.ga_tracker.sendEvent("repo", "get tags", "failed");
console.log("Failed to get the tag list: " + status);
+ $scope.refreshing_repo = false; --- a/manifest.json Mon Jan 19 21:50:01 2015 -0600
+++ b/manifest.json Sun Jan 25 04:35:39 2015 -0600
@@ -1,6 +1,6 @@
"name": "Port Authority",
"description": "Chrome application for interacting with a Docker registry",