refactor aspect-edit.js in prep for jasmine testing

This commit is contained in:
Sarah Mei 2010-11-02 13:37:27 -07:00
parent e282abd526
commit fad9c09212
3 changed files with 157 additions and 144 deletions

View file

@ -1,160 +1,169 @@
/* Copyright (c) 2010, Diaspora Inc. This file is /* Copyright (c) 2010, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See * licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file. * the COPYRIGHT file.
*/ */
function decrementRequestsCounter() { var AspectEdit = {
var $new_requests = $(".new_requests");
var request_html = $new_requests.html();
var old_request_count = request_html.match(/\d+/);
if( old_request_count == 1 ) { initialize: function() {
$new_requests.html( $("ul .person").draggable({
request_html.replace(/ \(\d+\)/,'') revert: true,
); start: AspectEdit.startDrag,
} else { drag: AspectEdit.duringDrag,
$new_requests.html( stop: AspectEdit.stopDrag
request_html.replace(/\d+/,old_request_count-1) });
);
}
}
// Dragging person between aspects $(".aspect ul.dropzone").droppable({
$(function() { hoverClass: 'active',
$("ul .person").draggable({ drop: AspectEdit.onDropMove
revert: true, });
start: function(event,ui){
$(this).children("img").animate({'height':80, 'width':80, 'opacity':0.8},200) $(".aspect_remove ul").droppable({
.tipsy("hide"); hoverClass: 'active',
$(".draggable_info").fadeIn(100); drop: AspectEdit.onDropDelete
}, });
drag: function(event,ui){
$(this).children("img").tipsy("hide"); //ensure this is hidden $(".delete").live("click", AspectEdit.deletePerson);
}, $(".aspect h3").live('focus', AspectEdit.changeName);
stop: function(event,ui){ },
$(this).children("img").animate({'height':70, 'width':70, 'opacity':1},200);
$(".draggable_info").fadeOut(100); startDrag: function(event, ui) {
$(this).children("img").animate({'height':80, 'width':80, 'opacity':0.8}, 200)
.tipsy("hide");
$(".draggable_info").fadeIn(100);
},
duringDrag: function(event, ui) {
$(this).children("img").tipsy("hide"); //ensure this is hidden
},
stopDrag: function(event, ui) {
$(this).children("img").animate({'height':70, 'width':70, 'opacity':1}, 200);
$(".draggable_info").fadeOut(100);
},
onDropMove: function(event, ui) {
var dropzone = $(this);
var person = ui.draggable;
if (person.hasClass('request')) {
$.ajax({
type: "DELETE",
url: "/requests/" + person.attr('data-guid'),
data: {"accept" : true, "aspect_id" : dropzone.attr('data-aspect_id') },
success: function(data) {
AspectEdit.decrementRequestsCounter();
}
});
} }
});
$(".aspect ul.dropzone").droppable({ if (dropzone.attr('data-aspect_id') != person.attr('data-aspect_id')) {
hoverClass: 'active', $.ajax({
drop: function(event, ui) { url: "/aspects/move_friend/",
data: {"friend_id" : person.attr('data-guid'),
"from" : person.attr('data-aspect_id'),
"to" : { "to" : dropzone.attr('data-aspect_id') }},
success: function(data) {
person.attr('data-aspect_id', dropzone.attr('data-aspect_id'));
}});
}
var dropzone = $(this); dropzone.closest("ul").append(person);
var person = ui.draggable; },
onDropDelete: function(event, ui) {
var person = ui.draggable;
if (person.attr('data-guid').length == 1) {
alert("You can not remove the person from the last aspect");
} else {
if (!person.hasClass('request')) {
$.ajax({
type: "POST",
url: "/aspects/remove_from_aspect",
data:{
'friend_id' : person.attr('data-guid'),
'aspect_id' : person.attr('data-aspect_id') }
});
}
person.fadeOut(400, function() {
person.remove();
});
}
},
changeName: function() {
var $this = $(this);
var id = $this.closest("li.aspect").attr("data-guid");
var link = "/aspects/" + id;
$this.keypress(function(e) {
if (e.which == 13) {
e.preventDefault();
$this.blur();
//save changes
$.ajax({
type: "PUT",
url: link,
data: {"aspect" : {"name" : $this.text() }}
});
}
//update all other aspect links
$this.keyup(function(e) {
$("#aspect_nav a[href='" + link + "']").text($this.text());
});
});
},
deletePerson: function() {
var person = $(this).closest("li.person");
if (person.hasClass('request')) {
if (confirm("Ignore request?")) {
var request_id = person.attr("data-guid");
if( person.hasClass('request') ){
$.ajax({ $.ajax({
type: "DELETE", type: "DELETE",
url: "/requests/" + person.attr('data-guid'), url: "/requests/" + request_id,
data: {"accept" : true, "aspect_id" : dropzone.attr('data-aspect_id') }, success: function () {
success: function(data){ AspectEdit.decrementRequestsCounter();
decrementRequestsCounter();
} }
}); });
}; }
} else {
if (confirm("Remove this person from all aspects?")) {
var person_id = $(this).closest("li.person").attr('data-guid');
if( dropzone.attr('data-aspect_id') != person.attr('data-aspect_id' )){
$.ajax({ $.ajax({
url: "/aspects/move_friend/", type: "DELETE",
data: {"friend_id" : person.attr('data-guid'), url: "/people/" + person_id,
"from" : person.attr('data-aspect_id'), success: function() {
"to" : { "to" : dropzone.attr('data-aspect_id') }}, person.fadeOut(200);
success: function(data){ }
person.attr('data-aspect_id', dropzone.attr('data-aspect_id')); });
}});
}
dropzone.closest("ul").append(person);
}
});
$(".aspect_remove ul").droppable({
hoverClass: 'active',
drop: function(event, ui) {
var person = ui.draggable;
if ( person.attr('data-guid').length == 1 ) {
alert("You can not remove the person from the last aspect");
} else {
if( !person.hasClass('request') ){
$.ajax({
type: "POST",
url: "/aspects/remove_from_aspect",
data:{
'friend_id' : person.attr('data-guid'),
'aspect_id' : person.attr('data-aspect_id') }
});
}
person.fadeOut(400, function(){person.remove();});
} }
} }
}); },
});
decrementRequestsCounter: function() {
var $new_requests = $(".new_requests");
var request_html = $new_requests.html();
var old_request_count = request_html.match(/\d+/);
// Person deletion if (old_request_count == 1) {
$(".delete").live("click", function() { $new_requests.html(
request_html.replace(/ \(\d+\)/, '')
var person = $(this).closest("li.person"); );
} else {
if (person.hasClass('request')){ $new_requests.html(
if( confirm("Ignore request?") ){ request_html.replace(/\d+/, old_request_count - 1)
var request_id = person.attr("data-guid"); );
$.ajax({
type: "DELETE",
url: "/requests/" + request_id,
success: function () {
decrementRequestsCounter();
}
});
}
} else {
if( confirm("Remove this person from all aspects?") ){
var person_id = $(this).closest("li.person").attr('data-guid');
$.ajax({
type: "DELETE",
url: "/people/" + person_id,
success: function() {
person.fadeOut(200);
}
});
} }
} }
}); };
$(document).ready(AspectEdit.initialize);
// Editing aspect name
$(".aspect h3").live('focus', function() {
var $this = $(this);
var id = $this.closest("li.aspect").attr("data-guid");
var link = "/aspects/"+ id;
$this.keypress(function(e) {
if (e.which == 13) {
e.preventDefault();
$this.blur();
//save changes
$.ajax({
type: "PUT",
url: link,
data: {"aspect" : {"name" : $this.text() }}
});
}
//update all other aspect links
$this.keyup(function(e) {
$("#aspect_nav a[href='"+link+"']").text($this.text());
});
});
});

View file

@ -1,27 +1,30 @@
describe("editing aspects", function() { describe("AspectEdit", function() {
// describe("initialize", function() {
//
// });
describe("decrementRequestsCounter", function() { describe("decrementRequestsCounter", function() {
describe("when there is one request", function() { describe("when there is one request", function() {
it("removes the counter from the new requests div", function() { it("removes the counter from the new requests div", function() {
$('#jasmine_content').html("<div class='new_requests'>Requests (1)</div>"); $('#jasmine_content').html("<div class='new_requests'>Requests (1)</div>");
decrementRequestsCounter(); AspectEdit.decrementRequestsCounter();
expect($('.new_requests').first().html()).toEqual("Requests"); expect($('.new_requests').first().html()).toEqual("Requests");
}); });
}); });
describe("when there is more than one request", function() { describe("when there is more than one request", function() {
it("decrements the request counter", function() { it("decrements the request counter", function() {
$('#jasmine_content').html("<div class='new_requests'>Requests (67)</div>"); $('#jasmine_content').html("<div class='new_requests'>Requests (67)</div>");
decrementRequestsCounter(); AspectEdit.decrementRequestsCounter();
expect($('.new_requests').first().html()).toEqual("Requests (66)"); expect($('.new_requests').first().html()).toEqual("Requests (66)");
}); });
}); });
describe("error cases", function() { describe("error cases", function() {
it("fails silently if there are no requests", function() { it("fails silently if there are no requests", function() {
$('#jasmine_content').html("<div class='new_requests'>Requests</div>"); $('#jasmine_content').html("<div class='new_requests'>Requests</div>");
decrementRequestsCounter(); AspectEdit.decrementRequestsCounter();
expect($('.new_requests').first().html()).toEqual("Requests"); expect($('.new_requests').first().html()).toEqual("Requests");
}); });
}); });
}); });
}); });

View file

@ -12,6 +12,7 @@
# #
src_files: src_files:
- public/javascripts/jquery142.js - public/javascripts/jquery142.js
- public/javascripts/jquery-ui-1.8.4.custom.min.js
- public/javascripts/aspect-edit.js - public/javascripts/aspect-edit.js
# stylesheets # stylesheets