Skip to content

Commit

Permalink
Merge pull request #14 from drip/delete_repository
Browse files Browse the repository at this point in the history
Delete repository
  • Loading branch information
hojberg committed Sep 11, 2011
2 parents 98a37ba + 1ad5e6b commit e0b2b39
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 47 deletions.
3 changes: 2 additions & 1 deletion controllers/repositories.coffee
@@ -1,3 +1,4 @@
Redis = require('../config/redis').Connection
Repository = require('../models/repository').Repository
Build = require('../models/build').Build

Expand Down Expand Up @@ -62,7 +63,7 @@ exports.destroy = (request, response) ->

if repository && repository.builds
repository.builds.forEach (build) ->
redis.del("builds:" + build.id)
Redis.del("builds:" + build.id)

repository.remove()
response.end()
5 changes: 3 additions & 2 deletions controllers/repositories.js
@@ -1,5 +1,6 @@
(function() {
var Build, Repository, findOrCreateRepository, triggerRepositoryBuild;
var Build, Redis, Repository, findOrCreateRepository, triggerRepositoryBuild;
Redis = require('../config/redis').Connection;
Repository = require('../models/repository').Repository;
Build = require('../models/build').Build;
findOrCreateRepository = require('../lib/repositories').findOrCreateRepository;
Expand Down Expand Up @@ -70,7 +71,7 @@
}
if (repository && repository.builds) {
repository.builds.forEach(function(build) {
return redis.del("builds:" + build.id);
return Redis.del("builds:" + build.id);
});
}
repository.remove();
Expand Down
22 changes: 21 additions & 1 deletion public/css/core.less
Expand Up @@ -56,6 +56,20 @@ input[type="text"].error, input[type="password"].error, textarea.error { border-
.box-shadow(0 0 3px rgba(171, 41, 32, 0.25));
}

/* --- ipopover nav --- */
.popover_nav { position: absolute; padding: 6px;
background: rgba(0, 0, 0, 0.8);
.border-radius(5px);
.box-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
}
.popover_nav:after, .popover_nav:before { border: solid transparent; content: ' '; height: 0; bottom: 100%; position: absolute; width: 0; }

.popover_nav:after { border-width: 6px; left: 50%; margin-left: -6px;
border-bottom-color: rgba(0, 0, 0, 0.8);
}

.popover_nav ul { margin: 0; }

/* =LAYOUT
================================================== */
#main_logo { margin-left: 40px; background: url(/img/driplogo.png) no-repeat; width: 138px; height: 88px; margin-top: 20px; }
Expand Down Expand Up @@ -145,7 +159,6 @@ input[type="text"].error, input[type="password"].error, textarea.error { border-
opacity: 0.3;
}


.repository_list ul li.current { background: fadeout(@black, 80%); color: @white; border-top: 1px solid fadeout(@black, 80%); }

.repository_list ul li .build_result { float: right; width: 16px; height: 16px; margin-right: 10px; display: none; }
Expand All @@ -169,6 +182,13 @@ input[type="text"].error, input[type="password"].error, textarea.error { border-
.pane_header .build_result.running { background: url(/img/header_running.png); width: 104px; }
.pane_header .build_result.unknown { background: url(/img/header_unknown.png); width: 104px; }

.pane_header .title { float: left; }
.pane_header .wrench_icon { background: url(/img/wrench_icon.png); width: 16px; height: 16px; float: left; margin-left: 10px; margin-top: 3px; cursor: pointer;
opacity: 0.3;
}
.pane_header .wrench_icon:hover {
opacity: 1;
}
.pane .no_builds { text-align: center; padding: 40px; }

/* --- build list view --- */
Expand Down
5 changes: 4 additions & 1 deletion public/js/app/models/repository.js
Expand Up @@ -4,8 +4,11 @@ D.Repository = Backbone.Model.extend({
urlRoot: '/repositories',

initialize: function (attrs) {
if (attrs.name) { this.id = attrs.name; }
if (attrs.name) this.id = attrs.name;
if (attrs.builds) this.setupBuildList();
this.bind("change", this.setupBuildList, this);
this.bind("destroy", function () {
}, this);
},

setupBuildList: function () {
Expand Down
3 changes: 0 additions & 3 deletions public/js/app/models/repository_list.js
Expand Up @@ -21,10 +21,7 @@ D.RepositoryList = Backbone.Collection.extend({
}

});
},

addOrUpdateRepository: function () {
}


});
40 changes: 24 additions & 16 deletions public/js/app/routers/app_router.js
Expand Up @@ -24,7 +24,7 @@ D.AppRouter = Backbone.Router.extend({
selected: repo
});

repositoryList.fetch();
return repositoryList;
},

root: function () {
Expand All @@ -39,29 +39,37 @@ D.AppRouter = Backbone.Router.extend({
},

repositoriesList: function (ownerName) {
this.beforeFilter(ownerName);
var repositoryList = this.beforeFilter(ownerName);
repositoryList.fetch();
},

repositoriesShow: function (ownerName, name) {
this.beforeFilter(ownerName, name);
var repositoryList = this.beforeFilter(ownerName, name);

var repository = new D.Repository({ownerName: ownerName, name: name}),
repositoryView = new D.RepositoryView({model: repository});

repository.fetch();
repositoryList.bind("reset", function () {

var repository = repositoryList.find(function (r) {
return r.get("ownerName") === ownerName && r.get("name") === name;
});
new D.RepositoryView({model: repository}).render();
});

repositoryList.fetch();
},

buildShow: function (ownerName, name, id) {
this.beforeFilter(ownerName, name);

var repository = new D.Repository({ownerName: ownerName, name: name}),
repositoryView = new D.RepositoryView({model: repository, selectedBuild: id});

repository.fetch();
var repositoryList = this.beforeFilter(ownerName, name),
build = new D.Build({_id: id, repository: {ownerName: ownerName, name: name} }),
buildView = new D.BuildView({model: build});

var build = new D.Build({_id: id, repository: {ownerName: ownerName, name: name} }),
buildView = new D.BuildView({model: build});

repositoryList.bind("reset", function () {
var repository = repositoryList.find(function (r) {
return r.get("ownerName") === ownerName && r.get("name") === name;
});
new D.RepositoryView({model: repository, selectedBuild: id}).render();
});

repositoryList.fetch();
build.fetch();
}
});
30 changes: 21 additions & 9 deletions public/js/app/views/repository_list_view.js
Expand Up @@ -15,7 +15,7 @@ D.RepositoryListView = Backbone.View.extend({
});

_.each(groups, function (repositories, ownerName) {
innerNode.append("<li class='clearfix owner_name'><span class='user_icon'></span>" + ownerName + "</li>");
innerNode.append("<li class='clearfix owner_name' id='owner_" + ownerName + "'><span class='user_icon'></span>" + ownerName + "</li>");
_.each(repositories, function (repository) {
var listItem = new D.RepositoryListItemView({ model: repository });
innerNode.append(listItem.render().el);
Expand Down Expand Up @@ -46,9 +46,10 @@ D.RepositoryListItemView = Backbone.View.extend({
"click": "show"
},

intialize: function () {
initialize: function () {
_.bindAll(this);
this.model.bind("reset", this.render);
this.model.bind("destroy", this.remove);
},

render: function () {
Expand All @@ -58,20 +59,31 @@ D.RepositoryListItemView = Backbone.View.extend({
},

show: function () {
D.appRouter.navigate("/" + this.model.get("ownerName") + "/" + this.model.get("name"));
this.select();
var repo = this.model;

var repository = new D.Repository(this.model.attributes);
new D.RepositoryView({model: repository});
repository.fetch({success: function () {
repository.trigger("change");
}});
D.appRouter.navigate("/" + repo.get("ownerName") + "/" + repo.get("name"));
this.select();

new D.RepositoryView({model: repo}).render();
},

select: function () {
$(".repository_list_item").removeClass("current");
$(this.el).addClass("current");
},

remove: function () {
var model = this.model,
bySameOwner = this.model.collection.filter(function (r) {
return r.get("ownerName") === model.get("ownerName");
}), ownerNode;

if (bySameOwner.length < 2) {
ownerNode = $("#owner_" + this.model.get("ownerName"));
ownerNode.remove();
}

$(this.el).remove();
}

});
59 changes: 47 additions & 12 deletions public/js/app/views/repository_view.js
@@ -1,45 +1,80 @@
D.RepositoryView = Backbone.View.extend({

tagName: 'div',
className: 'pane',
className: 'pane main_pane',

events: {
'click #show_add_new_repo' : 'showAdd'
"click .wrench_icon": "showSettings"
},

initialize: function (options) {
_.bindAll(this);
this.model.bind("change", this.render);
this.model.bind("destroy", this.remove);
this.selectedBuild = options.selectedBuild;
},

render: function () {
var el = $(".pane"),
frag = $(_.template($("#repository_show_template").html(), {name: this.model.get("name")}));
var frag = $(_.template($("#repository_show_template").html(), {name: this.model.get("name")}));

frag.find(".build_result").addClass(this.model.status());

if (el.length === 0) {
el = this.el = $(this.el);
}
this.el = $(this.el);

el.html(frag);
this.el.html(frag);

if (this.model.get('buildList')) {
el.append(new D.BuildListView({
this.el.append(new D.BuildListView({
collection: this.model.get("buildList"),
selectedBuild: this.selectedBuild
}).render().el);
}
else {
el.append("<div class='no_builds'>This repository has no builds yet ☹</div>");
this.el.append("<div class='no_builds'>This repository has no builds yet ☹</div>");
}

$(".pane").replaceWith(this.el);

return this;
},

showAdd: function() {
D.appRouter.navigate("/repositories/new", true);
showSettings: function () {
var deleteButton = $("<a class='btn danger'>Delete repository</a>'"),
popoverNav = new D.PopoverNav({items: [deleteButton]}),
popoverEl = $(popoverNav.render().el),
that = this,
left;

// delete link handler
deleteButton.bind("click", function () {
popoverNav.hide();
that.deleteRepository();
});

// append to dom
$(this.el).find(".repository_name").append(popoverEl);

// find and set the correct position
left = ($(this.el).find(".wrench_icon").position().left - (parseInt(popoverEl.css("width")) / 2)) + 10;
$(popoverNav.el).css({"top": 40, "left": left});

// show
popoverNav.show();
},

deleteRepository: function () {
if (confirm("Are you sure you want to delete " + this.model.get("name"))) {
$(".main_pane").html("Deleting repository, please wait ..");
this.model.destroy();
}
},

remove: function () {
var pane = $('<div class="pane"></div>');
pane.html('<div class="select_repository">Please select a repository on the left</div>');
$(".main_pane").replaceWith(pane);

D.appRouter.navigate("/repositories");
}

});
38 changes: 38 additions & 0 deletions public/js/app/widgets/popover_nav_widget.js
@@ -0,0 +1,38 @@
D.PopoverNav = Backbone.View.extend({
tagName: 'div',
className: 'popover_nav',

events: {
"clickoutside": "hide"
},

initialize: function (options) {
this.items = options.items;
},

render: function () {
var ul = $("<ul class='unstyled'>");

_.each(this.items, function (item) {
var li = $("<li>");
li.html(item);
ul.append(li);
});

$(this.el).html(ul);
$(this.el).hide();

return this;
},

show: function () {
$(this.el).fadeIn(200);
},

hide: function () {
$(this.el).fadeOut(200, function () {
$(this).remove();
});
}

});
7 changes: 5 additions & 2 deletions views/layout.jade
Expand Up @@ -25,6 +25,7 @@ html(lang="en")
script(src="js/app/views/repository_view.js")
script(src="js/app/views/build_list_view.js")
script(src="js/app/views/build_view.js")
script(src="js/app/widgets/popover_nav_widget.js")

script(src="/socket.io/socket.io.js")
script
Expand Down Expand Up @@ -65,8 +66,10 @@ html(lang="en")
div(class="select_repository") Please select a repository on the left

script(type="text/template", id="repository_show_template")
div(class="pane_header")
<%= name %>
div(class="pane_header clearfix")
div(class="repository_name")
div(class="title") <%= name %>
div(class="wrench_icon")
div(class="build_result")

script(type="text/template", id="build_list_template")
Expand Down

0 comments on commit e0b2b39

Please sign in to comment.