diff --git a/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java b/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java index 09b8834c7b71d5176e012bcd6076d36eb275bb29..802a0098c6ecbaeb361458d8520536edab30fa8d 100644 --- a/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java +++ b/src/main/java/es/uvigo/esei/daa/rest/PeopleResource.java @@ -16,7 +16,9 @@ import javax.ws.rs.core.Response; import es.uvigo.esei.daa.dao.DAOException; import es.uvigo.esei.daa.dao.PeopleDAO; +import es.uvigo.esei.daa.dao.PetsDAO; import es.uvigo.esei.daa.entities.Person; +import es.uvigo.esei.daa.entities.Pet; /** * REST resource for managing people. @@ -28,7 +30,7 @@ import es.uvigo.esei.daa.entities.Person; public class PeopleResource { private final static Logger LOG = Logger.getLogger(PeopleResource.class.getName()); - private final PeopleDAO dao; + private final PeopleDAO personDAO; /** * Constructs a new instance of {@link PeopleResource}. @@ -38,8 +40,8 @@ public class PeopleResource { } // Needed for testing purposes - PeopleResource(PeopleDAO dao) { - this.dao = dao; + PeopleResource(PeopleDAO personDAO) { + this.personDAO = personDAO; } /** @@ -58,7 +60,7 @@ public class PeopleResource { @PathParam("id") int id ) { try { - final Person person = this.dao.get(id); + final Person person = this.personDAO.get(id); return Response.ok(person).build(); } catch (IllegalArgumentException iae) { @@ -75,6 +77,7 @@ public class PeopleResource { .build(); } } + /** * Returns the complete list of people stored in the system. @@ -86,7 +89,7 @@ public class PeopleResource { @GET public Response list() { try { - return Response.ok(this.dao.list()).build(); + return Response.ok(this.personDAO.list()).build(); } catch (DAOException e) { LOG.log(Level.SEVERE, "Error listing people", e); return Response.serverError().entity(e.getMessage()).build(); @@ -105,12 +108,9 @@ public class PeopleResource { * returned. */ @POST - public Response add( - @FormParam("name") String name, - @FormParam("surname") String surname - ) { + public Response add(@FormParam("name") String name, @FormParam("surname") String surname) { try { - final Person newPerson = this.dao.add(name, surname); + final Person newPerson = this.personDAO.add(name, surname); return Response.ok(newPerson).build(); } catch (IllegalArgumentException iae) { @@ -127,6 +127,8 @@ public class PeopleResource { .build(); } } + + /** * Modifies the data of a person. @@ -149,7 +151,7 @@ public class PeopleResource { ) { try { final Person modifiedPerson = new Person(id, name, surname); - this.dao.modify(modifiedPerson); + this.personDAO.modify(modifiedPerson); return Response.ok(modifiedPerson).build(); } catch (NullPointerException npe) { @@ -174,6 +176,7 @@ public class PeopleResource { .build(); } } + /** * Deletes a person from the system. @@ -191,7 +194,7 @@ public class PeopleResource { @PathParam("id") int id ) { try { - this.dao.delete(id); + this.personDAO.delete(id); return Response.ok(id).build(); } catch (IllegalArgumentException iae) { diff --git a/src/main/webapp/js/dao/people.js b/src/main/webapp/js/dao/people.js index 29618ee5eafbab06acb34bd0320c8c9e5604ac40..d70c7b142b352e7475d2c6f1620774bbddbdd02c 100644 --- a/src/main/webapp/js/dao/people.js +++ b/src/main/webapp/js/dao/people.js @@ -30,6 +30,7 @@ var PeopleDAO = (function() { data : person }, done, fail, always); }; + this.modifyPerson = function(person, done, fail, always) { requestByAjax({ @@ -38,6 +39,7 @@ var PeopleDAO = (function() { data : person }, done, fail, always); }; + this.deletePerson = function(id, done, fail, always) { requestByAjax({ diff --git a/src/main/webapp/js/dao/pets.js b/src/main/webapp/js/dao/pets.js new file mode 100644 index 0000000000000000000000000000000000000000..b27027d2b05b9a4cdeeff7ad606a2e28167d0b89 --- /dev/null +++ b/src/main/webapp/js/dao/pets.js @@ -0,0 +1,54 @@ +var PetsDAO = (function() { + var resourcePath = "rest/people/"; + var requestByAjax = function(data, done, fail, always) { + done = typeof done !== 'undefined' ? done : function() {}; + fail = typeof fail !== 'undefined' ? fail : function() {}; + always = typeof always !== 'undefined' ? always : function() {}; + + let authToken = localStorage.getItem('authorization-token'); + if (authToken !== null) { + data.beforeSend = function(xhr) { + xhr.setRequestHeader('Authorization', 'Basic ' + authToken); + }; + } + + $.ajax(data).done(done).fail(fail).always(always); + }; + + function PetsDAO() { + + this.listPets = function(person, done, fail, always) { + requestByAjax({ + url : resourcePath + person.id + "/pets", + type : 'GET' + }, done, fail, always); + }; + + this.addPet = function(pet, done, fail, always) { + requestByAjax({ + url : resourcePath + pet.owner + "/pets", + type : 'POST', + data : pet + }, done, fail, always); + }; + + this.modifyPet = function(pet, done, fail, always) { + requestByAjax({ + url : resourcePath + pet.owner + "/pets/" + pet.id, + type : 'PUT', + data : pet + }, done, fail, always); + }; + + + this.deletePet = function(pet, done, fail, always) { + requestByAjax({ + url : resourcePath + pet.owner + "/pets/" + pet.id, + type : 'DELETE', + }, done, fail, always); + }; + + } + + return PetsDAO; +})(); \ No newline at end of file diff --git a/src/main/webapp/js/view/people.js b/src/main/webapp/js/view/people.js index 802d6b228a27a98d921ff39604f82e616f79a735..e32b4baef34d465a20df3609ef03e30bb150d8e3 100644 --- a/src/main/webapp/js/view/people.js +++ b/src/main/webapp/js/view/people.js @@ -1,16 +1,20 @@ var PeopleView = (function() { var dao; + var petsDAO; // Referencia a this que permite acceder a las funciones públicas desde las funciones de jQuery. var self; var formId = 'people-form'; + var petForm = 'pets-form'; var listId = 'people-list'; + var petFormQuery = '#' + petForm; var formQuery = '#' + formId; var listQuery = '#' + listId; - function PeopleView(peopleDao, formContainerId, listContainerId) { + function PeopleView(peopleDao, petsDao, formContainerId, listContainerId) { dao = peopleDao; + petsDAO = petsDao; self = this; insertPeopleForm($('#' + formContainerId)); @@ -168,6 +172,7 @@ var PeopleView = (function() { \ Editar\ Eliminar\ + Mascotas\ \ '; }; @@ -184,6 +189,25 @@ var PeopleView = (function() { $('#person-' + person.id + ' a.delete').click(function() { self.deletePerson(person.id); }); + + $('#person-' + person.id + ' a.pets').click(function() { + + $('.modal .close').click( function() { + $('.modal').hide() + } ); + + $(".modal-title").empty(); + + $(".modal-title").append('Mascotas de '+person.name); + + listPetsOfPerson(person); + + initAdd(person.id); + + $('.modal').show(); + + }); + }; var appendToTable = function(person) { @@ -192,5 +216,146 @@ var PeopleView = (function() { addRowListeners(person); }; + + var initAdd = function(idOwner){ + + $('.modal-footer').empty(); + + insertPet('.modal-footer'); + + $(petFormQuery).submit(function(event) { + var pet = getPetInForm(idOwner); + + if (isEditingPet()) { + petsDAO.modifyPet(pet, + function(petReturn) { + $('#pet-' + petReturn.id + ' td.name').text(petReturn.name); + resetFormPet(); + }, + showErrorMessage, + enableFormPet + ); + } else { + petsDAO.addPet(pet, + function(petReturn) { + appendToTablePet(petReturn); + resetFormPet(); + }, + showErrorMessage, + enableFormPet + ); + } + + return false; + + }); + }; + + var isEditingPet = function() { + return $(petFormQuery + ' input[name="id"]').val() != ""; + }; + + var getPetInForm = function(idOwner) { + var form = $(petFormQuery); + return { + 'id': form.find('input[name="id"]').val(), + 'name': form.find('input[name="name"]').val(), + 'owner': idOwner + }; + }; + + var resetFormPet = function() { + $(petFormQuery)[0].reset(); + $(petFormQuery + ' input[name="id"]').val(''); + $('#btnSubmitPet').val('Crear'); + }; + + var enableFormPet = function() { + $(petFormQuery + ' input').prop('disabled', false); + }; + + + var insertPet = function(parent) { + $(parent).append( + '
\ + \ +
\ +
\ + \ +
\ +
\ + \ + \ +
\ +
\ +
' + ); + }; + + var createPetRow = function(pet) { + return '\ + ' + pet.name + '\ + \ + Editar\ + Eliminar\ + \ + '; + }; + + var addRowListenersPet = function(pet) { + $('#pet-' + pet.id + ' a.delete').click(function() { + deletePet(pet); + }); + + $('#pet-' + pet.id + ' a.edit').click(function() { + editPet(pet); + }); + + }; + + var deletePet = function(pet) { + if (confirm('Está a punto de eliminar a una mascota. ¿Está seguro de que desea continuar?')) { + petsDAO.deletePet(pet, + function() { + $('tr#pet-' + pet.id).remove(); + }, + showErrorMessage + ); + } + }; + + var editPet = function(pet) { + var row = $('#pet-' + pet.id); + + if (row !== undefined) { + var form = $(petFormQuery); + + form.find('input[name="id"]').val(pet.id); + form.find('input[name="name"]').val(row.find('td.name').text()); + + $('input#btnSubmitPet').val('Modificar'); + } + }; + + var appendToTablePet = function(pet) { + $('.modal-body').append(createPetRow(pet)); + addRowListenersPet(pet); + }; + + + var listPetsOfPerson = function(person) { + + $('.modal-body').empty(); + + petsDAO.listPets(person, function(pets) { + $.each(pets, function(key, pet) { + appendToTablePet(pet); + }); + }, function() { + alert('No has sido posible acceder al listado de mascotas.'); + }); + + }; + return PeopleView; })(); diff --git a/src/main/webapp/main.html b/src/main/webapp/main.html index c2e28f18e86ede920b9b3bdb675f343473452886..dd9391cff719f4d27150f5d86ebcb37192ab9cf8 100644 --- a/src/main/webapp/main.html +++ b/src/main/webapp/main.html @@ -25,10 +25,31 @@

Personas

- + + + +