diff --git a/components/clubs-page.jsx b/components/clubs-page.jsx index 8aa99165e..59d917686 100644 --- a/components/clubs-page.jsx +++ b/components/clubs-page.jsx @@ -240,9 +240,21 @@ var ClubsPage = React.createClass({ showLearnMoreModal: function() { this.showModal(ModalLearnMore); }, - handleClubDelete: function(url) { - console.log(url); - window.alert("Sorry, club deletion has not yet been implemented."); + handleClubDelete: function(url, clubName) { + var confirmed = window.confirm( + "Are you sure you want to delete the club \"" + clubName + "\"? " + + "This action cannot be undone!" + ); + if (!confirmed) { + return; + } + this.getTeachAPI().deleteClub(url, function(err) { + if (err) { + console.log(err); + window.alert("An error occurred! Please try again later."); + } + window.alert("Your club has been removed."); + }); }, handleClubEdit: function(url) { console.log(url); diff --git a/components/map.jsx b/components/map.jsx index 359c45d11..524a96f75 100644 --- a/components/map.jsx +++ b/components/map.jsx @@ -45,7 +45,8 @@ var MarkerPopup = React.createClass({   @@ -145,7 +146,7 @@ var Map = React.createClass({ } if (action == 'delete') { - this.props.onDelete(url); + this.props.onDelete(url, targetEl.getAttribute('data-club-name')); } else if (action == 'edit') { this.props.onEdit(url); } else { diff --git a/lib/teach-api.js b/lib/teach-api.js index f373fbf70..b7c2dc98d 100644 --- a/lib/teach-api.js +++ b/lib/teach-api.js @@ -1,5 +1,6 @@ var EventEmitter = require('events').EventEmitter; var util = require('util'); +var urlResolve = require('url').resolve; var _ = require('underscore'); var request = require('superagent'); @@ -82,7 +83,7 @@ _.extend(TeachAPI.prototype, { }, request: function(method, path) { var info = this.getLoginInfo(); - var req = request(method, this.baseURL + path); + var req = request(method, urlResolve(this.baseURL, path)); if (info && info.token) { req.set('Authorization', 'Token ' + info.token); @@ -118,6 +119,18 @@ _.extend(TeachAPI.prototype, { this.updateClubs(); callback(null, res.body); }.bind(this)); + }, + deleteClub: function(url, callback) { + callback = callback || function () {}; + return this.request('delete', url) + .accept('json') + .end(function(err, res) { + if (err) { + return callback(err); + } + this.updateClubs(); + callback(null); + }.bind(this)); } }); diff --git a/test/browser/teach-api.test.js b/test/browser/teach-api.test.js index c56d0408d..5e20dc3ac 100644 --- a/test/browser/teach-api.test.js +++ b/test/browser/teach-api.test.js @@ -206,6 +206,39 @@ describe('TeachAPI', function() { }); }); + describe('deleteClub()', function() { + var api; + + beforeEach(function() { + api = new TeachAPI({storage: storage}); + }); + + it('accesses the given URL', function() { + api.deleteClub('http://myserver/clubs/1'); + requests.length.should.equal(1); + requests[0].method.should.eql('delete'); + requests[0].url.should.eql('http://myserver/clubs/1'); + }); + + it('returns no error on success', function(done) { + api.updateClubs = sinon.spy(); + api.deleteClub('http://foo', function(err) { + should(err).equal(null); + done(); + }); + requests[0].respond(204); + api.updateClubs.callCount.should.equal(1); + }); + + it('returns an error on failure', function(done) { + api.deleteClub('http://foo', function(err, data) { + err.message.should.eql("Internal Server Error"); + done(); + }); + requests[0].respond(500); + }); + }); + describe('startLogin()', function() { var personaCb;