grim/port-authority

38068d2157b1
Parents 2bdacaa8e7c1
Children 405facbf0f21
tags are working now, presentation sucks
  • +90 -21
    js/app.js
  • +2 -22
    window.html
  • --- a/js/app.js Wed Apr 13 17:35:50 2016 -0500
    +++ b/js/app.js Thu Apr 14 13:35:34 2016 -0500
    @@ -1,5 +1,80 @@
    +function get_registry_url() {
    + var url = "http://" + settings.registry;
    +
    + for(registry in settings.registries) {
    + if(registry.hostname === settings.registry) {
    + console.log("found registry");
    + console.log(registry);
    + url = registry.scheme + "://" + registry.hostname;
    + }
    + }
    +
    + return url;
    +}
    +
    +function tag_display() {
    + var container = $("#tags");
    +
    + container.empty();
    +
    + var url = get_registry_url() + "/v1/repositories/" + settings.repository + "/tags";
    +
    + $.ajax(url)
    + .done(function(data) {
    + /* the docker registry returns a list of objects like
    + * [{"layer", "deadb33f", "name": "latest"}]
    + * and the private registry returns a dictionary of tag
    + * names to images. Like:
    + * {"latest", "deadb33f"}
    + * This function will normalize them into a sorted list like
    + * [
    + * ["foo", "latest"]
    + * ["latest"],
    + * ]
    + * Image IDs are thrown away because we don't care about them.
    + */
    +
    + var tags = [];
    + if(data.constructor === Array) {
    + // create dtags which is a dictionary of layers with a value that
    + // is a list of tags
    + var dtags = {};
    + $.each(data, function(idx, tag) {
    + dtags[tag.layer] = dtags[tag.layer] || [];
    + dtags[tag.layer].push(tag.name);
    + });
    +
    + $.each(dtags, function(layer, layer_tags) {
    + tags.push(layer_tags);
    + });
    + } else {
    + var dtags = {};
    + $.each(data, function(tag, layer) {
    + dtags[layer] = dtags[layer] || [];
    + dtags[layer].push(tag);
    + });
    +
    + $.each(dtags, function(idx, layer_tags) {
    + tags.push(layer_tags);
    + });
    + }
    +
    + $.each(tags, function(idx, layer_tags) {
    + var html = "<div class=\"ui card\"><div class=\"content\">";
    + html += "<div class=\"meta\">";
    + html += "<span class=\"category\">" + layer_tags.length + " tags</span>";
    + html += "</div><div class=\"description\">";
    + $.each(layer_tags, function(idx, tag) {
    + html += "<div class=\"ui label\">" + tag + "</div>";
    + });
    + html += "</div></div></div>";
    +
    + container.append(html);
    + });
    + });
    +}
    +
    function repository_selected(result, response) {
    - console.log(result);
    $("#repository-header").text(result.name || "Unknown");
    $("#repository-description").text(result.description || "(no description)");
    @@ -15,42 +90,36 @@
    }
    storage.set({"repository": result.name});
    +
    + tag_display();
    }
    function repository_results(response) {
    - // shove the repositories into a dictionary and clean it up
    - var repos = {};
    + var library_prefix = "library/";
    $.each(response.results, function(idx, repo) {
    - var library_prefix = "library/";
    if(repo.name.indexOf(library_prefix) === 0) {
    repo.name = repo.name.substring(library_prefix.length, repo.name.length);
    }
    -
    - repos[repo.name] = repo;
    + if(!(repo.description))
    + repo.description = "(no description)";
    })
    - repositories = repos;
    + return response;
    }
    function repository_config() {
    - var url = "http://" + settings.registry;
    -
    - for(registry in settings.registries) {
    - if(registry.hostname === settings.registry) {
    - url = registry.scheme + "://" + registry.hostname;
    - }
    - }
    + var url = get_registry_url();
    $("#repository-search")
    .search({
    apiSettings: {
    - url: url + "/v1/search?q={query}"
    + url: url + "/v1/search?q={query}",
    + onResponse: repository_results
    },
    fields: {
    results: "results",
    title: "name"
    },
    - onResults: repository_results,
    onSelect: repository_selected,
    minCharacters: 2
    });
    @@ -86,25 +155,25 @@
    });
    }
    -function registry_initialize() {
    -}
    -
    function initialize() {
    // setup our repository
    $("#repository").val(settings.repository);
    repository_config();
    // setup our registry
    - $("registry").val(settings.registry);
    + $("#registry").val(settings.registry);
    registry_config();
    // add our handler for settings changes
    chrome.storage.onChanged.addListener(function(changes, namespace) {
    for(key in changes) {
    + // update our copy of the settings
    + settings[key] = changes[key].newValue;
    +
    if(key === 'registry') {
    repository_config();
    } else if(key === 'repository') {
    - repository_display();
    + repository_selected();
    }
    }
    });
    --- a/window.html Wed Apr 13 17:35:50 2016 -0500
    +++ b/window.html Thu Apr 14 13:35:34 2016 -0500
    @@ -47,28 +47,8 @@
    </div>
    </div>
    </div>
    -
    - <div class="ui page grid">
    - <div class="row">
    - <div class="column">
    - <div class="ui icon message yellow">
    - <div class="content">
    - <i class="icon copy"></i>
    - <span class="clipboard" ng-click="set_clipboard()">{{clipboard}}</span>
    - </div>
    - </div>
    - </div>
    - </div>
    - <div class="row">
    - <div class="column sixteen wide" data-ng-if="repo">
    - <div class="ui segment" data-ng-class="refreshing_repo ? 'loading': ''">
    - <div class="ui divided list">
    - <div class="item" data-ng-repeat="(layer, tags) in tags">
    - <span data-ng-repeat="tag in tags"><a data-ng-click="copy_tag(tag)">{{tag}}</a>{{$last ? '' : ', '}}</span>
    - </div>
    - </div>
    - </div>
    - </div>
    + <div class="ui segment basic">
    + <div id="tags" class="ui stackable cards">
    </div>
    </div>
    </body>