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

Se añadio la funcionalidad de filtrar postulantes por algun tag determinado

En este archivo se define el metodo que realiza el filtro
	new file:   server/components/errors/busqueda.filter.js
Se consume el metodo que filtra los postulantes
	modified:   server/components/errors/errorManager.js
Se modifico el formateo de parametros enviados por la ruta
	modified:   server/components/middleware/parametrosRuta.validator.js
parent 07df7508
......@@ -19,12 +19,6 @@ $masculino-color: #57b6ff;
padding-bottom: 10px;
border-bottom: 1px solid #eee;
}
.female{
color:$femenino-color;
}
.male{
color:$masculino-color;
}
.input-group {
margin-bottom: 10px;
}
......
<div class="row container">
<div ui-view class="container"></div>
<div class="row">
<div class="container">
<div ui-view class="container"></div>
</div>
</div>
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;
}
......@@ -9,7 +9,7 @@
this.modal = $uibModal;
this.Modal = Modal;
this.cargoService = cargoService;
this.cargoService.getCargo(this.id, {incluye: ['Postulantes']})
this.cargoService.getCargo(this.id, {incluye: [{entidad: 'Postulantes'}]})
.then(cargo=> {
this.cargo = cargo;
});
......
......@@ -4,7 +4,7 @@
class PostulanteEditarController {
constructor($stateParams, postulanteService, datoPostulanteService, tipoDatoService, $uibModal, Modal, tagService, tagPostulanteService, postulacionService, comentarioService) {
this.errores = {}; // lista de errores
this.enviado= false; // se refiere a si se intento enviar el formulario del postulante
this.enviado = false; // se refiere a si se intento enviar el formulario del postulante
this.Modal = Modal;
this.modal = $uibModal;
this.service = postulanteService;
......@@ -16,7 +16,14 @@
this.comentarioService = comentarioService;
this.id = $stateParams.postulanteId;
this.tags = [];
this.service.getPostulante(this.id, {incluye: ['Tags', 'Postulaciones', 'Comentarios', 'Datos']}).then(postulante=> {
this.service.getPostulante(this.id, {
incluye: [
{entidad: 'Tags'},
{entidad: 'Postulaciones'},
{entidad: 'Comentarios'},
{entidad: 'Datos'}
]
}).then(postulante=> {
this.postulante = postulante;
console.log(postulante);
});
......
......@@ -2,16 +2,21 @@
(()=> {
class PostulanteController {
constructor($state, postulanteService, postulacionService, $uibModal, Modal) {
constructor($state, postulanteService, postulacionService, $uibModal, Modal, tagService) {
this.$state = $state;
this.postulantes = [];
this.postulante = {};
this.alertas = [];
this.ordenarPor = "nombres";
this.ordenDescendente = false;
this.modal = $uibModal;
this.Modal = Modal;
this.service = postulanteService;
this.postulacionService = postulacionService;
this.tagService = tagService;
this.paginaActual = 1;
this.tags = [];
this.tagsSeleccionados = [];
this.cambiarPagina();
}
......@@ -43,13 +48,62 @@
}
cambiarPagina() {
this.service.getPostulantes({pagina: this.paginaActual, elementos: 15, ordenarPor: 'nombres'})
if (this.tagsSeleccionados.length > 0)
this.buscarTag();
else {
this.service.getPostulantes({
pagina: this.paginaActual,
elementos: 15,
ordenarPor: this.ordenarPor,
orden: this.ordenDescendente
})
.then(respuesta=> {
console.log(respuesta);
this.postulantes = respuesta.rows;
this.totalElementos = respuesta.count;
})
}
}
ordenar(campo) {
this.ordenDescendente = campo != this.ordenarPor ? false : this.ordenDescendente;
this.ordenarPor = campo;
this.cambiarPagina();
this.ordenDescendente = !this.ordenDescendente;
}
//region busqueda y filtros
autoCompletarTags(query) {
if (this.tags.length == 0) {
this.tagService.getTags()
.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));
}
buscarTag() {
var palabras = [];
this.tagsSeleccionados.forEach(tag=> {
palabras.push({palabra: tag.nombre, en: 'nombre'})
});
this.service.getPostulantes({
pagina: this.paginaActual,
elementos: 15,
ordenarPor: this.ordenarPor,
orden: this.ordenDescendente,
incluye: [{entidad: 'Tags', buscar: palabras}]
})
.then(respuesta=> {
console.log(respuesta);
this.postulantes = respuesta.rows;
this.totalElementos = respuesta.count;
})
}
//endregion
}
angular.module('moduloPersonalApp')
.controller('PostulantesCtrl', PostulanteController);
......
<div class="row container">
<div ui-view class="container"></div>
<div class="row">
<div class="container">
<div ui-view class="container"></div>
</div>
</div>
<div class="container">
<div class="row">
<div class="row">
<div class="container">
<h2 class="sub-header">Postulantes
</h2>
<uib-alert ng-repeat="alerta in vm.alertas" type="{{alerta.tipo}}" close="vm.alertas.splice($index,1)"
dismiss-on-timeout="3000">{{alerta.mensaje}}
</uib-alert>
<div class="pull-right">
<button class="btn btn-success" ng-click="vm.crear()"><i
class="fa fa-plus"></i> Crear Postulante
</button>
<div class="container">
<div class="pull-right">
<button class="btn btn-success" ng-click="vm.crear()"><i
class="fa fa-plus"></i> Crear Postulante
</button>
</div>
</div>
<hr>
<div class="form-group">
<div class="">
<div class="input-group">
<span class="input-group-addon" id="basic-addon1"><i class="fa fa-search" aria-hidden="true"></i></span>
<tags-input ng-model="vm.tagsSeleccionados" name="tags" placeholder="Buscar por tag" display-property="nombre"
min-length="2" on-tag-added="vm.buscarTag()" on-tag-removed="vm.buscarTag()"
add-from-autocomplete-only="true">
<auto-complete source="vm.autoCompletarTags($query)" min-length="2"></auto-complete>
</tags-input>
</div>
</div>
</div>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Nombres</th>
<th>Apellidos</th>
<th><a href="" ng-click="vm.ordenar('nombres')">Nombres</a></th>
<th><a href="" ng-click="vm.ordenar('apellidos')">Apellidos</a></th>
<th colspan="2">Opciones</th>
</tr>
</thead>
......
......@@ -8,7 +8,7 @@
query: {isArray: false}
});
}
getPostulantes(parametros) {
return this.resource.query(parametros).$promise;
}
......
<div class="navbar navbar-inverse navbar-static-top" ng-controller="NavbarController">
<div class="navbar navbar-default navbar-static-top" ng-controller="NavbarController">
<div class="container">
<div class="navbar-header">
<button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#navbar-main" ng-click="nav.isCollapsed = !nav.isCollapsed">
......
'use strict';
export function filtrar(registros, inclusionesBusqueda) {
console.log(inclusionesBusqueda);
var resultado = [];
inclusionesBusqueda.forEach(inclusion=> {
console.log(inclusion);
resultado = registros.filter(registro=>
registro[inclusion.entidad].filter(entidadInterna=>
inclusion.buscar.filter(filtro=>filtro.palabra === entidadInterna[filtro.en]).length >= 1).length == inclusion.buscar.length);
});
return resultado;
}
/**
* Created by adsib on 15-03-16.
*/
import * as filtro from '../errors/busqueda.filter';
export function respondWithResult(res, statusCode) {
statusCode = statusCode || 200;
return function(entity) {
return function (entity) {
if (entity) {
if(!res.busquedaInterna)
if (!res.busquedaInterna)
res.status(statusCode).json(entity);
else{
console.log(res.offset+" "+res.limit);
entity.rows = entity.rows.slice(res.offset, res.limit);
else {
entity.rows = res.inclusiones.length > 0 ? filtro.filtrar(entity.rows, res.inclusiones) : entity.rows;
entity.count = entity.rows.length;
console.log(res.offset);
console.log(res.limit);
entity.rows = entity.rows.slice(res.offset, res.offset + res.limit);
res.status(statusCode).json(entity);
}
}
......@@ -18,7 +22,7 @@ export function respondWithResult(res, statusCode) {
}
export function saveUpdates(updates) {
return function(entity) {
return function (entity) {
return entity.updateAttributes(updates)
.then(updated => {
return updated;
......@@ -27,7 +31,7 @@ export function saveUpdates(updates) {
}
export function removeEntity(res) {
return function(entity) {
return function (entity) {
if (entity) {
return entity.destroy()
.then(() => {
......@@ -50,14 +54,14 @@ export function handleEntityNotFound(res) {
export function handleError(res, statusCode) {
statusCode = statusCode || 500;
return function(err) {
if(err.name === 'SequelizeValidationError') {
return function (err) {
if (err.name === 'SequelizeValidationError') {
statusCode = 400;
//TODO formatear el error de la validadcion, remover objetos inecesarios
}else if(err.name === 'SequelizeUniqueConstraintError') {
} else if (err.name === 'SequelizeUniqueConstraintError') {
statusCode = 409;
//err.message = 'El objeto ya existe';
}else if( err.name === 'SequelizeDatabaseError') {
} else if (err.name === 'SequelizeDatabaseError') {
statusCode = 400;
}
res.status(statusCode).send(err);
......
import * as db from '../../sqldb'
import sequelize from 'sequelize';
import * as db from '../../sqldb'
export function formatearRuta(req,res,next) {
export function formatearRuta(req, res, next) {
var parametros = {};
console.log(req.query);
......@@ -16,12 +14,12 @@ export function formatearRuta(req,res,next) {
var resultado = obtenerDependencias(req.query.incluye);
parametros.include = resultado.include;
res.busquedaInterna = resultado.busquedaInterna;
res.inclusiones = resultado.inclusiones;
}
//ordenacion
//parametros.order = orden(req.query);
parametros.order = [['nombres']];
if (req.query.ordenarPor)
parametros.order = orden(req.query);
if (!res.busquedaInterna) {
//parametros de la paginacion
......@@ -38,10 +36,10 @@ export function formatearRuta(req,res,next) {
res.offset = numeroPagina(req.query.pagina, res.limit);
}
}
// parametros.subQuery=false;
//parametros.subQuery=false;
req.parametros = parametros;
console.log(parametros);
next();
}
//TODO se debe añadir la paginacion a los hijos
......@@ -56,48 +54,45 @@ function obtenerDependencias(inclusiones) {
var busquedaInterna = false;
inclusiones = objetoArray(inclusiones);
var dependencias = [];
var busquedas = [];
inclusiones.forEach(x=> {
var incluye = JSON.parse(x);
console.log(incluye);
if (incluye.entidad) {
var dependencia = obtenerDependencia(incluye.entidad);
if (dependencia) {
if (incluye.palabras && incluye.en) {
dependencia.where = buscar(incluye.palabras, incluye.en, false);
// busquedaInterna = true;
if (incluye.buscar) {
busquedaInterna = true;
busquedas.push(incluye)
}
dependencia.required = true;
dependencias.push(dependencia);
}
}
});
return {include :dependencias, busquedaInterna: busquedaInterna};
return {include: dependencias, busquedaInterna: busquedaInterna, inclusiones: busquedas};
}
function numeroElementos(elementos) {
elementos = parseInt(elementos);
if(!isNaN(elementos))
return elementos;
elementos = parseInt(elementos);
if (!isNaN(elementos))
return elementos;
return 15; // TODO mover a una variable global, deberia compartirse con la aplicacion angular ?
}
function numeroPagina(pagina,numeroElementos) {
pagina = parseInt(pagina);
if (!isNaN(pagina) && pagina > 0)
return (pagina -1)* numeroElementos;
function numeroPagina(pagina, numeroElementos) {
pagina = parseInt(pagina);
if (!isNaN(pagina) && pagina > 0)
return (pagina - 1) * numeroElementos;
return 0;
}
function orden(query) {
var queryOrdenamiento = '';
if (query.ordenarPor) {
queryOrdenamiento += query.ordenarPor;
if (query.ordenarPor && query.orden === 'false') {
return [[query.ordenarPor]];
}
if (query.orden) {
if (query.orden == 'DESC') {
queryOrdenamiento += " "+query.orden;
}
if (query.orden === 'true') {
return [[query.ordenarPor, 'DESC']];
}
return queryOrdenamiento;
}
/**
......@@ -120,7 +115,7 @@ function buscar(palabras, propiedades, estricto) {
: ["CAST(" + propiedad + " AS TEXT) ILIKE '" + palabra + "'"])
})
});
console.log("QUERY: "+queryBusqueda);
console.log("QUERY: " + queryBusqueda);
return {$or: queryBusqueda};
}
......@@ -146,7 +141,7 @@ function obtenerDependencia(nombreDependencia) {
case 'Comentario':
return {model: db.Comentario, as: nombreDependencia}
case 'Comentarios':
return {model: db.Comentario, as: nombreDependencia}
return {model: db.Usuario, as: nombreDependencia}
case 'DatoPostulante':
return {model: db.DatoPostulante, as: nombreDependencia}
case 'Postulacion':
......
......@@ -10,7 +10,7 @@ module.exports = {
uri: 'postgresql://usuarioPersonal:admin@localhost/moduloPersonalDb',
options: {}
},
// seedDB:true,
seedDB:true,
//configuracion migracion moodle
usuarioMoodle:'root',
passwordMoodle:'admin',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment