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

Merge branch 'iss32-editar-postulantes-cargo' into desarrollo

Conflicts:
	client/app/postulantes/postulantes.controller.js
	server/components/middleware/parametrosRuta.validator.js
	server/config/environment/development.js
parents 1c62490b f3e5fefd
......@@ -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',
......
......@@ -25,7 +25,9 @@ $masculino-color: #57b6ff;
.male{
color:$masculino-color;
}
.input-group {
margin-bottom: 10px;
}
// Component styles are injected through grunt
// injector
......
<div class="row">
<h2 class="sub-header">Cargos</h2>
<button class="btn btn-default" ng-click="vm.crear()">Crear Cargo</button>
<div class="table-responsive">
<table class="table table-striped">
<thead>
......
tags-input .tags .tag-item {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
display: inline-block;
white-space: nowrap;
margin: -1px 5px 5px 0;
height: 22px;
vertical-align: top;
cursor: default;
color: #767676;
background-color: #fff;
border-color: #ccc;
}
<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-4">
<select class="form-control" ng-model="modal.modelo.propiedad" name="combo">
<option value="{{tiposDato.propiedad}}"
ng-repeat="tiposDato in modal.modelo.tiposDato.rows">{{tiposDato.nombre}}
</option>
</select>
</div>
<div class="col-md-8">
<input type="text" name="valor" class="form-control" ng-model="modal.modelo.valor" required
placeholder="{{modal.modelo.placeholder}}">
</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>
<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-4">
<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>
</div>
<div class="col-md-8">
<input type="text" name="valor" class="form-control" ng-model="modal.modelo.valor" required >
</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';
class DatoPostulanteService {
......@@ -22,9 +22,21 @@
getDatoPostulante(id) {
return this.resource.get({id: id});
}
eliminarDato(id) {
return this.resource.remove({id: id}).$promise;
}
nuevoDatoPostulante(datoPostulante){
return this.resource.save(datoPostulante).$promise;
}
editarDatoPostulante(id, datoPostulante) {
return this.resource.update({id: id}, datoPostulante).$promise;
}
}
angular.module('moduloPersonalApp')
.service('datoPostulanteService',DatoPostulanteService);
.service('datoPostulanteService', DatoPostulanteService);
})();
'use strict';
(()=> {
class PostulanteCrearModalController {
constructor($uibModalInstance, postulante, cargoService, postulacionService) {
this.enviado = false;
this.modal = $uibModalInstance;
this.postulante = postulante;
this.postulacion = {fk_postulante: this.postulante._id};
this.service = postulacionService;
cargoService.getCargos().then(cargos => {
this.cargos = cargos;
this.cargoSeleccionado = {};
})
}
guardar(form) {
this.enviado = true;
if (form.$valid) {
this.postulacion.fk_cargo = this.cargoSeleccionado._id;
this.service.crearPostulacion(this.postulacion)
.then(postulacion=> {
this.modal.close(postulacion)
})
.catch(err => {
this.errores.otros = err.message;
});
}
}
}
angular.module('moduloPersonalApp')
.controller('PostulantesCrearModalCtrl', PostulanteCrearModalController);
})();
'use strict';
(()=> {
class PostulanteEditarModalController {
constructor($uibModalInstance, parametro, cargoService, postulacionService) {
this.errores = {};
this.modal = $uibModalInstance;
this.postulacion = Object.assign({}, parametro.cargo.Postulacion);
this.service = postulacionService;
cargoService.getCargos().then(cargos => {
this.cargos = cargos;
this.cargoSeleccionado = cargos.rows.find(x=>x._id === this.postulacion.fk_cargo);
})
}
guardar(form) {
this.enviado = true;
if (form.$valid) {
this.service.editarPostulacion(this.postulacion._id, {
fk_cargo: this.cargoSeleccionado._id,
presentacion: this.postulacion.presentacion
})
.then(postulacion=> {
console.log(postulacion);
this.modal.close(postulacion)
})
.catch(err => {
this.errores.otros = err.data.message; // TODO mejorar el manejo de errores en el server
});
}
}
}
angular.module('moduloPersonalApp')
.controller('PostulantesEditarModalCtrl', PostulanteEditarModalController);
})();
<form class="form" name="form" ng-submit="vm.guardar(form)" novalidate>
<div class="modal-header">
<button type="button" ng-click="vm.modal.dismiss()" class="close">&times;</button>
<h4 class="modal-title">Postulacion</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-sm-10">
<label>Cargos</label>
<div class="input-group">
<select class="form-control" name="cargos" ng-model="vm.cargoSeleccionado"
ng-options="crg as crg.nombre for crg in vm.cargos.rows" required>
</select>
<p class="help-block" ng-show="form.cargos.$error.required && vm.enviado">
Seleccione un cargo al cual postular
</p>
</div>
</div>
<div class="col-md-12">
<label>Presentación</label>
<div class="input-group">
<textarea type="text" name="presentacion" class="form-control " ng-model="vm.postulacion.presentacion"
required></textarea>
<p class="help-block" ng-show="form.presentacion.$error.required && vm.enviado">
Ingrese una presentacion para postular al cargo
</p>
</div>
</div>
</div>
<div class="form-group has-error">
<p class="help-block">{{ vm.errores.otros}}</p>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary" type="submit" ng-disabled="!(form.cargos.$dirty ||form.presentacion.$dirty)">
Guardar
</button>
<button class="btn btn-default" type="button" ng-click="vm.modal.dismiss()">Cancelar</button>
</div>
</form>
......@@ -2,16 +2,16 @@
'use strict';
class PostulacionService {
constructor($resource) {
this.resource = $resource('/api/postulaciones/:id', {id: '@_id',postulanteId:'@_id',cargoId:'@_id'}, {
this.resource = $resource('/api/postulaciones/:id', {id: '@_id', postulanteId: '@_id', cargoId: '@_id'}, {
update: {method: 'PUT'},
query: {isArray: false},
postulacionesPostulante:{
method:'GET',
url:'/api/postulaciones/postulante/:postulanteId'
postulacionesPostulante: {
method: 'GET',
url: '/api/postulaciones/postulante/:postulanteId'
},
postulacionesCargo:{
method:'GET',
url:'/api/postulaciones/cargo/:cargoId'
postulacionesCargo: {
method: 'GET',
url: '/api/postulaciones/cargo/:cargoId'
}
})
}
......@@ -22,7 +22,7 @@
elementos: elementos,
ordenarPor: ordenarPor,
orden: orden,
incluye: ['Postulante','Cargo']
incluye: ['Postulante', 'Cargo']
}).$promise;
}
......@@ -31,11 +31,19 @@
}
getPostulacionesPostulante(idPostulante) {
return this.resource.postulacionesPostulante({postulanteId:idPostulante}).$promise;
return this.resource.postulacionesPostulante({postulanteId: idPostulante}).$promise;
}
getPostulacionesCargo(idCargo) {
return this.resource.postulacionesCargo({cargoId:idCargo}).$promise;
return this.resource.postulacionesCargo({cargoId: idCargo}).$promise;
}
crearPostulacion(postulacion) {
return this.resource.save(postulacion).$promise;
}
editarPostulacion(id, postulacion) {
return this.resource.update({id: id}, postulacion).$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 PostulanteEditarController {
constructor($stateParams, postulanteService, datoPostulanteService, tipoDatoService, $uibModal, Modal, tagService, tagPostulanteService) {
this.errores = {}; // lista de errores
this.postulanteEnviado = false; // se refiere a si se intento enviar el formulario del postulante
this.Modal = Modal;
this.modal = $uibModal;
this.service = postulanteService;
this.datoPostulanteService = datoPostulanteService;
this.tipoDatoService = tipoDatoService;
this.tagService = tagService;
this.tagPostulanteService = tagPostulanteService;
this.id = $stateParams.postulanteId;
this.tags = [];
this.service.getPostulante(this.id).then(postulante=> {
this.postulante = postulante;
console.log(postulante);
});
}
eliminarDato(dato) {
this.Modal.confirm.eliminar(dato => {
this.datoPostulanteService.eliminarDato(dato.DatoPostulante._id)
.then(()=> {
this.postulante.Datos.splice(this.postulante.Datos.indexOf(dato), 1);
})
})(dato.nombre, dato);
}
editarDato(dato) {
this.tipoDatoService.getTiposDato().then(tiposDato=> {
dato.tiposDato = tiposDato;
console.log(tiposDato);
dato.valor = dato.DatoPostulante.valor;
this.Modal.confirm.editar(dato=> {
this.datoPostulanteService.editarDatoPostulante(dato.DatoPostulante._id, {
propiedad: dato.propiedad,
valor: dato.valor
})
.then(datoPostulante=> {
var tipoDato = dato.tiposDato.rows.find(x=>x.propiedad === datoPostulante.propiedad);
tipoDato.DatoPostulante = datoPostulante;
var index = this.postulante.Datos.findIndex(x=>x.DatoPostulante._id === tipoDato.DatoPostulante._id);
this.postulante.Datos[index] = tipoDato;
})
.catch(err=> {
console.log(err);
this.errores.other = err.data.message; // TODO mejorar manejo de errores en la api
})
})('app/datosPostulantes/datosPostulantes.modal.editar.html', dato);
});
}
crearDato() {
this.tipoDatoService.getTiposDato().then(tiposDato=> {
var dato = {};
dato.tiposDato = tiposDato;
console.log(tiposDato);
this.Modal.confirm.crear(dato=> {
this.datoPostulanteService.nuevoDatoPostulante({
fk_postulante: this.postulante._id,
propiedad: dato.propiedad,
valor: dato.valor
})
.then(datoPostulante=> {
var tipoDato = dato.tiposDato.rows.find(x=>x.propiedad === datoPostulante.propiedad);
tipoDato.DatoPostulante = datoPostulante;
this.postulante.Datos.push(tipoDato);
})
.catch(err=> {
console.log(err);
this.errores.other = err.data.message; // TODO mejorar manejo de errores en la api
})
})('app/datosPostulantes/datosPostulantes.modal.crear.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;
});
}
}
editarPostulacion(cargo) {
this.modal.open({
templateUrl: 'app/postulaciones/modals/postulaciones.editar.modal.html',
controller: 'PostulantesEditarModalCtrl',
controllerAs: 'vm',
resolve: {
parametro: {postulante: this.postulante, cargo: cargo}
}
})
}
crearPostulacion() {
this.modal.open({
templateUrl: 'app/postulaciones/modals/postulaciones.editar.modal.html',
controller: 'PostulantesCrearModalCtrl',
controllerAs: 'vm',
resolve: {
postulante: this.postulante
}
})
}
autoCompletarTags(query) {
console.log(this.tags)
if (this.tags.length == 0) {
this.tagService.getTags(1, 100).then(tags=> {
this.tags = tags;
return this.tags.rows.filter(x=>x.includes(query));
})
}
else return this.tags.rows.filter(x=>x.nombre.includes(query));
}
adicionarTag(tag) {
if (tag._id) {
this.tagPostulanteService.crearTagPostulante({fk_tag: tag._id, fk_postulante: this.id});
}
else {
this.tagService.crearTag(tag).then(tag=> {
this.tagPostulanteService.crearTagPostulante({fk_tag: tag._id, fk_postulante: this.id});
})
}
}
quitarTag(tag) {
this.tagPostulanteService.eliminarTagPostulante(tag.TagPostulante._id);
}
}
angular.module('moduloPersonalApp')
.controller('PostulantesEditarCtrl', PostulanteEditarController);
})();
<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>
<div 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>
</div>
</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>
<div 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>
</div>
</div>
</div>
<br>
<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 class="row">
<div class="col-md-10">
<div class="pull-right">
<button class="btn btn-success" ng-click="vm.crearDato()" type="button"><i class="fa fa-plus"></i>
Añadir dato
</button>
</div>
</div>
</div>
</div>
</uib-accordion-group>
<uib-accordion-group heading="Tags" class="panel-primary" is-open="true">
<div class="col-md-10">
<tags-input ng-model="vm.postulante.Tags" name="tags" placeholder="Adicionar Tags" display-property="nombre"
min-length="2" on-tag-added="vm.adicionarTag($tag)" on-tag-removed="vm.quitarTag($tag)">
<auto-complete source="vm.autoCompletarTags($query)" min-length="2"></auto-complete>
</tags-input>
</div>
</uib-accordion-group>
<uib-accordion-group heading="Postulaciones" class="panel-primary" is-open="true">
<div class="col-md-12">
<div class="row" ng-repeat="cargo in vm.postulante.Postulaciones">
<div class="col-md-10">
<label>{{cargo.nombre}}</label>
<div class="input-group margin-bottom">
<input type="text" name="nombres" class="form-control"
ng-model="cargo.Postulacion.presentacion" ng-disabled="true">
<div class="input-group-btn">
<button type="button" class="btn btn-info" ng-click="vm.editarPostulacion(cargo)"><i
class="fa fa-edit"></i></button>
<button type="button" class="btn btn-danger" ng-click="vm.eliminarPostulacion(cargo)"><i
class="fa fa-trash"></i></button>
</div>
</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 class="row">
<div class="col-md-10">
<div class="pull-right">
<button class="btn btn-success" type="button" ng-click="vm.crearPostulacion()">
<i class="fa fa-plus"></i>
Nueva Postulacion
</button>
</div>
</div>
</div>
</div>
</uib-accordion-group>
</uib-accordion>
</div>
</div>
......@@ -17,10 +17,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) {
......@@ -53,25 +52,9 @@
}
}
editar(form, id) {
if (!form) {
this.postulante = this.postulantes.find(x=>x._id == id);
this.$state.go('postulantes.editar');
}
else {
this.enviado = true