Commit f7ebe278 authored by D’jalmar Gutierrez Titirico's avatar D’jalmar Gutierrez Titirico 🚲

Se añadio la vista de edicion del postulante( la seccion de tipo de dato)

Se añadieron modales para la edicion de ciertos campos
Se cambio la precision de decimales de Sass, ya que se tenia un problema con Bootstrap
	modified:   Gruntfile.js
Se añadio la libreria ng-tags y se sobreescribio su main
	modified:   bower.json
	modified:   client/app/app.js
parent 0394d9fd
......@@ -570,7 +570,8 @@ module.exports = function (grunt) {
sass: {
server: {
options: {
compass: false
compass: false,
precision:8
},
files: {
'.tmp/app/app.css' : '<%= yeoman.client %>/app/app.scss'
......
......@@ -15,9 +15,19 @@
"lodash": "~2.4.1",
"angular-ui-router": "~0.2.18",
"angular-validation-match": "~1.5.2",
"angular-animate": "^1.5.3"
"angular-animate": "^1.5.3",
"ng-tags-input": "^3.0.0"
},
"devDependencies": {
"angular-mocks": "~1.4.0"
},
"overrides": {
"ng-tags-input": {
"main": [
"ng-tags-input.min.js",
"ng-tags-input.min.css",
"ng-tags-input.bootstrap.min.css"
]
}
}
}
......@@ -6,6 +6,7 @@ angular.module('moduloPersonalApp', [
'ngCookies',
'ngResource',
'ngSanitize',
'ngTagsInput',
'ngAnimate',
'ui.router',
'ui.bootstrap',
......
......@@ -22,6 +22,11 @@
getDatoPostulante(id) {
return this.resource.get({id: id});
}
eliminarDato(id){
return this.resource.remove({id:id}).$promise;
}
}
angular.module('moduloPersonalApp')
......
/**
* Created by adsib on 11-04-16.
*/
'use strict';
(()=> {
class PostulanteDetalleController {
constructor($stateParams, postulanteService) {
postulanteService.getPostulante($stateParams.postulanteId).then(postulante=> {
console.log(postulante);
this.postulante = postulante;
});
}
}
angular.module('moduloPersonalApp')
.controller('PostulantesDetalleCtrl', PostulanteDetalleController);
})();
<div class="row">
<h4><a ui-sref="postulantes.lista"><span class="fa fa-arrow-left"></span></a> {{vm.postulante.nombres}} {{vm.postulante.apellidos}}
</h4>
<hr>
<div class="row">
<label class="col-sm-3">CI :</label>
<label class="col-sm-7 control-label usr-light">{{vm.postulante.ci}}</label>
</div>
<div class="row" ng-repeat="dato in vm.postulante.Datos">
<label class="col-sm-3">{{dato.nombre}} :</label>
<label class="col-sm-7 control-label usr-light">{{dato.DatoPostulante.valor}}</label>
</div>
<hr>
<div class="row">
<div class="col-lg-12">
<button type="button" class="btn btn-info" ui-sref="postulantes.editar">Editar</button>
<button type="button" class="btn btn-danger" >Eliminar</button>
</div>
</div>
<!--TODO añadir tags, postulaciones y comentarios ?-->
<hr>
</div>
<div class="container" ui-view></div>
'use strict';
(()=> {
class PostulanteController {
constructor($stateParams, postulanteService, datoPostulanteService,tipoDatoService, Modal) {
this.errores = {}; // lista de errores
this.postulanteEnviado = false; // se refiere a si se intento enviar el formulario del postulante
this.tagsEnviado = false;
this.datosEnviado = false;
this.postulacionesEnviado = false;
this.service = postulanteService;
this.datoPostulanteService = datoPostulanteService;
this.tipoDatoService = tipoDatoService;
this.id = $stateParams.postulanteId;
this.service.getPostulante(this.id).then(postulante=> {
console.log(postulante);
this.postulante = postulante;
this.tags = [];
this.postulante.Tags.forEach(tag=> {
this.tags.push({text: tag.nombre})
})
});
this.eliminarDatoModal = Modal.confirm.eliminar(dato => {
this.datoPostulanteService.eliminarDato(dato.DatoPostulante._id)
.then(()=> {
this.postulante.Datos.splice(this.postulante.Datos.indexOf(dato), 1);
})
});
this.editarDatoModal = Modal.confirm.editar(dato=> {
console.log(dato);
})
}
eliminarDato(dato){
this.eliminarDatoModal(dato.nombre, dato);
}
editarDato(dato){
this.tipoDatoService.getTiposDato().then(tiposDato=>{
dato.tiposDato = tiposDato;
console.log(tiposDato);
this.editarDatoModal('app/tiposDato/tiposDato.modal.editar.html',dato);
});
}
guardarPostulante(form, campo) {
this.enviado = true;
if (form.$valid) {
this.service.editarPostulante(this.id, {[campo]: form[campo].$modelValue})
.then(postulante=> {
form[campo].$dirty = false;
this.enviado = false;
this.postulante[campo] = postulante[campo];
})
.catch(err => {
this.errores.other = err.message;
});
}
}
}
angular.module('moduloPersonalApp')
.controller('PostulantesEditarCtrl', PostulanteController);
})();
<div ng-controller="PostulantesEditarCtrl">
<div class="page-header">
<h4 class="header">Editar Postulante</h4>
</div>
<div>
<uib-accordion close-others="oneAtATime">
<uib-accordion-group heading="Postulante" class="panel-primary" is-open="true">
<div class="col-sm-12">
<form class="form" name="form" novalidate>
<div class="row">
<div class="col-md-10">
<label>Nombres</label>
<p class="input-group">
<input type="text" name="nombres" class="form-control" ng-model="vm.postulante.nombres" required>
<span class="input-group-btn">
<button type="button" class="btn btn-primary" ng-click="vm.guardarPostulante(form,'nombres')"
ng-disabled="!form.nombres.$dirty"><i class="fa fa-save"></i></button>
</span>
</p>
</div>
</div>
<div class="row">
<div class="col-md-10">
<label>Apellidos</label>
<p class="input-group">
<input type="text" name="apellidos" class="form-control" ng-model="vm.postulante.apellidos" required>
<span class="input-group-btn">
<button type="button" class="btn btn-primary" ng-click="vm.guardarPostulante(form,'apellidos')"
ng-disabled="!form.apellidos.$dirty"><i class="fa fa-save"></i></button>
</span>
</p>
</div>
</div>
<div class="row">
<div class="col-md-10">
<label>Cedula de Identidad</label>
<p class="input-group">
<input type="text" name="ci" class="form-control" ng-model="vm.postulante.ci" required>
<span class="input-group-btn">
<button type="button" class="btn btn-primary" ng-click="vm.guardarPostulante(form,'ci')"
ng-disabled="!form.ci.$dirty"><i class="fa fa-save"></i></button>
</span>
</p>
</div>
</div>
<div class="form-group has-error">
<p class="help-block"
ng-show="(form.ci.$error.required ||form.nombres.$error.required || form.apellidos.$error.required) && vm.enviado">
Debe llenar todos los campos
</p>
<p class="help-block">{{ vm.erroresPostulante.other }}</p>
</div>
</form>
</div>
</uib-accordion-group>
<uib-accordion-group heading="Datos Personales" class="panel-primary" is-open="true">
<div class="col-md-12">
<div class="row" ng-repeat="dato in vm.postulante.Datos">
<div class="col-md-10">
<label>{{dato.nombre}}</label>
<p class="input-group">
<input ng-readonly="true" type="text" name="nombres" class="form-control"
ng-model="dato.DatoPostulante.valor" required>
<span class="input-group-btn">
<button type="button" class="btn btn-info" ng-click="vm.editarDato(dato)"><i
class="fa fa-edit"></i></button>
</span>
<span class="input-group-btn">
<button type="button" class="btn btn-danger" ng-click="vm.eliminarDato(dato)"><i
class="fa fa-trash"></i></button>
</span>
</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-10">
<div class="pull-right">
<button class="btn btn-success" type="button"><i class="fa fa-plus"></i> Añadir dato</button>
</div>
</div>
</div>
<div class="form-group has-error">
<p class="help-block"
ng-show="(form.ci.$error.required || form.sexo.$error.required ||form.nombres.$error.required || form.apellidos.$error.required) && vm.enviado">
Debe llenar todos los campos
</p>
<p class="help-block">{{ vm.errores.other }}</p>
</div>
</div>
</uib-accordion-group>
<uib-accordion-group heading="Tags" class="panel-primary" is-open="true">
<div class="col-md-10">
<form class="form" name="form" ng-submit="vm.editar(form)" novalidate>
<tags-input ng-model="vm.tags">
<!--<auto-complete source="vm.loadTags($query)"></auto-complete>-->
</tags-input>
<br>
<div class="pull-right">
<button class="btn btn-primary" type="submit">
Guardar
</button>
</div>
</form>
</div>
</uib-accordion-group>
<uib-accordion-group heading="Postulaciones" class="panel-primary" is-open="true">
<!--<uib-accordion-heading>
Postulaciones <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': status.open, 'glyphicon-chevron-right': !status.open}"></i>
</uib-accordion-heading>-->
</uib-accordion-group>
</uib-accordion>
</div>
</div>
......@@ -18,10 +18,9 @@
//modal para la elminacion de registros
}
//TODO catch error
detalle(id) {
this.postulante = this.postulantes.find(x=>x._id == id);
this.$state.go('postulantes.detalle', {postulanteId: this.postulante._id});
this.$state.go('postulantes.detalle', {postulanteId: id});
}
postulaciones(id) {
......@@ -55,26 +54,8 @@
}
}
editar(form, id) {
if (!form) {
this.postulante = this.postulantes.find(x=>x._id == id);
this.$state.go('postulantes.editar');
}
else {
this.enviado = true;
if (form.$valid) {
console.log(this.postulante);
this.service.editarPostulante(this.postulante._id, this.postulante)
.then(postulante=> {
this.postulante = postulante;
this.cambiarPagina();
this.$state.go('postulantes.detalle', {postulanteId: this.postulante._id})
})
.catch(err => {
this.errores.other = err.message;
});
}
}
editar(id) {
this.$state.go('postulantes.editar', {postulanteId: id});
}
eliminar(id) {
this.service.eliminarPostulante(id).then(()=> {
......
<div class="row">
<h4>{{vm.postulante.nombres}} {{vm.postulante.apellidos}} {{vm.postulante._id}}
</h4>
<div>
<!--<button class="btn btn-primary">Editar</button>-->
<!--<button class="btn btn-danger">Eliminar</button>-->
</div>
<hr>
<div>
<label class="col-sm-2 control-label">CI :</label>
<label class="col-sm-8 control-label">{{vm.postulante.ci}}</label>
</div>
<div class="input-group">
<button class="btn btn-link" ng-click="vm.postulaciones(vm.postulante._id)">Ver postulaciones</button>
<button class="btn btn-link" ui-sref="postulantes.lista">Regresar</button>
</div>
</div>
<div ui-view></div>
<div class="container">
<div class="row">
<div class="col-sm-12">
<h1>Editar postulante</h1>
</div>
<div class="col-sm-12">
<form class="form" name="form" ng-submit="vm.editar(form)" novalidate>
<div class="form-group">
<label>Nombres</label>
<input type="text" name="nombres" class="form-control" ng-model="vm.postulante.nombres" required>
</div>
<div class="form-group">
<label>Apellidos</label>
<input type="text" name="apellidos" class="form-control" ng-model="vm.postulante.apellidos" required>
</div>
<div class="form-group">
<label>CI</label>
<input type="text" name="ci" class="form-control" ng-model="vm.postulante.ci" required>
</div>
<div class="form-group has-error">
<p class="help-block" ng-show="(form.ci.$error.required ||form.nombres.$error.required || form.apellidos.$error.required) && vm.enviado">
Debe llenar todos los campos
</p>
<p class="help-block">{{ vm.errores.other }}</p>
</div>
<div>
<button class="btn btn-inverse btn-lg btn-login" type="submit">
Guardar
</button>
</div>
</form>
</div>
</div>
<hr>
</div>
......@@ -14,17 +14,21 @@ angular.module('moduloPersonalApp')
url: '',
templateUrl: 'app/postulantes/postulantes.lista.html'
})
.state('postulantes.detalle', {
url: '/:postulanteId',
templateUrl: 'app/postulantes/postulantes.detalle.html'
})
.state('postulantes.crear',{
url:'crear',
url:'/crear',
templateUrl:'app/postulantes/postulantes.crear.html'
})
.state('postulantes.detalle', {
url: '/:postulanteId',
templateUrl: 'app/postulantes/detalle/postulantes.detalle.html',
controller:'PostulantesDetalleCtrl',
controllerAs:'vm'
})
.state('postulantes.editar',{
url:'/:postulanteId/editar',
templateUrl:'app/postulantes/postulantes.editar.html'
templateUrl:'app/postulantes/editar/postulantes.editar.html',
controller:'PostulantesEditarCtrl',
controllerAs:'vm'
})
.state('postulantes.detalle.postulaciones', {
url:'/postulaciones',
......
......@@ -15,7 +15,7 @@
<td>{{postulante.nombres}}</td>
<td>{{postulante.apellidos}}</td>
<td><a ng-click="vm.detalle(postulante._id)">Detalles</a></td>
<td><a ng-click="vm.editar(undefined, postulante._id)">Editar</a></td>
<td><a ng-click="vm.editar(postulante._id)">Editar</a></td>
<!--Mostrar un dialogo de eliminar-->
<td><a ng-click="vm.eliminar(postulante._id)">Eliminar</a></td>
</tr>
......
......@@ -14,7 +14,7 @@
}
getPostulante(id) {
return this.resource.get({id: id});
return this.resource.get({id: id, incluye: ['Datos','Postulaciones','Tags']}).$promise;
}
crearPostulante(postulante) {
......@@ -24,8 +24,9 @@
editarPostulante(id, postulante) {
return this.resource.update({id: id}, postulante).$promise;
}
eliminarPostulante(id){
return this.resource.remove({id:id}).$promise;
eliminarPostulante(id) {
return this.resource.remove({id: id}).$promise;
}
}
......
<div class="modal-header">
<button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>
<h4 ng-if="modal.title" ng-bind="modal.title" class="modal-title"></h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-10">
<select class="form-control" ng-model="modal.modelo.propiedad">
<option ng-selected="tiposDato.propiedad == modal.modelo.propiedad" value="{{tiposDato.propiedad}}" ng-repeat="tiposDato in modal.modelo.tiposDato.rows">{{tiposDato.nombre}}
</option>
</select>
<p class="input-group">
<input type="text" name="valor" class="form-control" ng-model="modal.modelo.DatoPostulante.valor" required>
</p>
</div>
</div>
</div>
<div class="modal-footer">
<button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)"
ng-bind="button.text" class="btn"></button>
</div>
'use strict';
angular.module('moduloPersonalApp')
.factory('Modal', function($rootScope, $modal) {
.factory('Modal', function($rootScope, $uibModal) {
/**
* Opens a modal
* @param {Object} scope - an object to be merged with modal's scope
......@@ -13,8 +13,8 @@ angular.module('moduloPersonalApp')
angular.extend(modalScope, scope);
return $modal.open({
templateUrl: 'components/modal/modal.html',
return $uibModal.open({
templateUrl: scope.modal.templateUrl,
windowClass: modalClass,
scope: modalScope
});
......@@ -31,39 +31,68 @@ angular.module('moduloPersonalApp')
* @param {Function} del - callback, ran when delete is confirmed
* @return {Function} - the function to open the modal (ex. myModalFn)
*/
delete(del = angular.noop) {
/**
* Open a delete confirmation modal
* @param {String} name - name or info to show on modal
* @param {All} - any additional args are passed straight to del callback
*/
eliminar(del = angular.noop) {
return function() {
var args = Array.prototype.slice.call(arguments),
name = args.shift(),
deleteModal;
eliminarModal;
deleteModal = openModal({
eliminarModal = openModal({
modal: {
templateUrl : 'components/modal/modal.html',
dismissable: true,
title: 'Confirm Delete',
html: '<p>Are you sure you want to delete <strong>' + name + '</strong> ?</p>',
title: 'Confirmar eliminación',
html: '<p>Esta seguro que quiere eliminar <strong>' + name + '</strong> ?</p>',
buttons: [{
classes: 'btn-danger',
text: 'Delete',
text: 'Eliminar',
click: function(e) {
deleteModal.close(e);
eliminarModal.close(e);
}
}, {
classes: 'btn-default',
text: 'Cancel',
text: 'Cancelar',
click: function(e) {
deleteModal.dismiss(e);
eliminarModal.dismiss(e);
}
}]
}
}, 'modal-danger');
deleteModal.result.then(function(event) {
eliminarModal.result.then(function(event) {
del.apply(event, args);
});
};
},
editar(del = angular.noop) {
return function() {
var args = Array.prototype.slice.call(arguments),
name = args.shift(),
editarModal;
console.log("modelooo "+JSON.stringify(args[0]));
editarModal = openModal({
modal: {
templateUrl : name,
dismissable: true,
title: 'Edición',
modelo: args[0],
buttons: [{
classes: 'btn-success',
text: 'Guardarrrr',
click: function(e) {
editarModal.close(e);
}
}, {
classes: 'btn-default',
text: 'Cancelar',
click: function(e) {
editarModal.dismiss(e);
}
}]
}
}, 'modal-primary');
editarModal.result.then(function(event) {
del.apply(event, args);
});
};
......
......@@ -13,6 +13,8 @@
<!-- Place favicon.ico and apple-touch-icon.png in the root directory -->
<!-- build:css(client) app/vendor.css -->
<!-- bower:css -->
<link rel="stylesheet" href="bower_components/ng-tags-input/ng-tags-input.min.css" />
<link rel="stylesheet" href="bower_components/ng-tags-input/ng-tags-input.bootstrap.min.css" />
<!-- endbower -->
<!-- endbuild -->
<!-- build:css({.tmp,client}) app/app.css -->
......@@ -68,6 +70,7 @@
<script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
<script src="bower_components/angular-validation-match/dist/angular-validation-match.min.js"></script>
<script src="bower_components/angular-animate/angular-animate.js"></script>
<script src="bower_components/ng-tags-input/ng-tags-input.min.js"></script>
<!-- endbower -->
<!-- endbuild -->
<!-- build:js(.tmp) app/app.js -->
......@@ -76,7 +79,7 @@
<script src="components/autenticacion/autenticacion.module.js"></script>
<script src="components/modal/modal.module.js"></script>
<script src="components/util/util.module.js"></script>
<script src="app/tags/tags.controller.js"></script>
<script src="app/postulantes/postulantes.service.js"></script>
<script src="app/comentarios/comentarios.controller.js"></script>
<script src="app/comentarios/comentarios.js"></script>
<script src="app/comentarios/comentarios.service.js"></script>
......@@ -90,10 +93,12 @@
<script src="app/postulaciones/postulaciones.controller.js"></script>
<script src="app/postulaciones/postulaciones.js"></script>
<script src="app/postulaciones/postulaciones.service.js"></script>
<script src="app/postulantes/detalle/postulantes.detalle.controller.js"></script>
<script src="app/postulantes/editar/postulantes.editar.controller.js"></script>
<script src="app/postulantes/postulantes.controller.js"></script>
<script src="app/postulantes/postulantes.js"></script>
<script src="app/postulantes/postulantes.service.js"></script>
<script src="app/cargos/cargos.controller.js"></script>
<script src="app/tags/tags.controller.js"></script>
<script src="app/tags/tags.js"></script>
<script src="app/tags/tags.service.js"></script>
<script src="app/tagsPostulantes/tagsPostulantes.controller.js"></script>
......
......@@ -28,6 +28,7 @@ module.exports = function(config) {
'client/bower_components/angular-ui-router/release/angular-ui-router.js',
'client/bower_components/angular-validation-match/dist/angular-validation-match.min.js',
'client/bower_components/angular-animate/angular-animate.js',
'client/bower_components/ng-tags-input/ng-tags-input.min.js',
'client/bower_components/angular-mocks/angular-mocks.js',
// endbower
'client/app/app.js',
......
......@@ -10,7 +10,7 @@ import config from '../../config/environment';
var rolAdministrador = config.userRoles[2];
router.get('/', autenticacion.estaAutenticado(),formatearRuta, controller.index);
router.get('/:id', autenticacion.estaAutenticado(), controller.show);
router.get('/:id', autenticacion.estaAutenticado(),formatearRuta, controller.show);
router.post('/', autenticacion.tieneRol(rolAdministrador), controller.create);
router.put('/:id', autenticacion.tieneRol(rolAdministrador), controller.update);
router.patch('/:id', autenticacion.tieneRol(rolAdministrador), controller.update);
......
......@@ -22,11 +22,11 @@ export function index(req, res) {
// Gets a single Postulante from the DB
export function show(req, res) {
Postulante.find({
where: {
_id: req.params.id
}
})
req.parametros.where = {
_id: req.params.id
};
Postulante.find(
req.parametros)
.then(errorMan.handleEntityNotFound(res))
.then(errorMan.respondWithResult(res))
.catch(errorMan.handleError(res));
......
......@@ -2,7 +2,7 @@ import validator from 'node-validator';
import * as db from '../../sqldb'
export function formatearRuta(req,res,next) {
var parametros ={}
var parametros ={};
console.log(req.query);
if(req.query.elementos) {
parametros.limit = numeroElementos(req.query);
......@@ -41,14 +41,20 @@ function obtenerDependencia(nombreDependencia) {
return {model: db.DatoPostulante, as: nombreDependencia}
case 'Postulacion':
return {model: db.Postulacion, as: nombreDependencia}
case 'Postulaciones':
return {model: db.Cargo, as: nombreDependencia}
case 'Postulante':
return {model: db.Postulante, as: nombreDependencia}
case 'Tag':
return {model: db.Tag, as: nombreDependencia}
case 'Tags':
return {model: db.Tag, as: nombreDependencia}
case 'TagPostulante':
return {model: db.tagPostulante, as: 'Cargo'}
case 'TipoDato':
return {model: db.TipoDato, as: nombreDependencia}
case 'Datos':
return {model: db.TipoDato, as: nombreDependencia}
default:
return null;
}
......
......@@ -10,10 +10,10 @@ module.exports = {
uri: 'postgresql://usuarioPersonal:admin@localhost/moduloPersonalDb',
options: {}
},
seedDB:true,
//seedDB:true,
//configuracion migracion moodle
usuarioMoodle:'root',
passwordMoodle:'adminoyq',
passwordMoodle:'admin',
hostMoodle:'localhost',
baseDatosMoodle:'moodle',
queryMoodle: 'SELECT \
......