Commit bf2489ad by willgonzz

mege con giuli

parents 28e676fb 5fe7f612
...@@ -92,6 +92,21 @@ ...@@ -92,6 +92,21 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -42,6 +42,7 @@ public class CurriculumsearchApplication { ...@@ -42,6 +42,7 @@ public class CurriculumsearchApplication {
guardarJson(convR,"/json/convocatoria.json",ConvocatoriaCargo.class); guardarJson(convR,"/json/convocatoria.json",ConvocatoriaCargo.class);
guardarJson(depR,"/json/Departamento.json",Departamento.class); guardarJson(depR,"/json/Departamento.json",Departamento.class);
guardarJson(ciudR,"/json/Ciudad.json",Ciudad.class); guardarJson(ciudR,"/json/Ciudad.json",Ciudad.class);
guardarJson(tecRepo,"/json/tecnologia.json",Tecnologia.class);
guardarJson(postRepo,"/json/postulante.json",Postulante.class); guardarJson(postRepo,"/json/postulante.json",Postulante.class);
String password = new BCryptPasswordEncoder().encode("test"); String password = new BCryptPasswordEncoder().encode("test");
......
...@@ -114,10 +114,7 @@ public class PostulanteController { ...@@ -114,10 +114,7 @@ public class PostulanteController {
DBFile cv = Helper.createFile(file); DBFile cv = Helper.createFile(file);
if(cv!=null) cv.setPostulante(postulante); if(cv!=null) cv.setPostulante(postulante);
postulante.setCvFile(cv); postulante.setCvFile(cv);
} }
postulante.getTecnologias().stream().filter(tec -> tec.getTecnologia().getId() != 0)
.forEach(tec -> tec.setTecnologia(tecRepo.getById(tec.getTecnologia().getId())));
for(Estudio estudio: postulante.getEstudios()){ for(Estudio estudio: postulante.getEstudios()){
String nombreIns = ""; String nombreIns = "";
nombreIns = estudio.getInstitucion().getNombre().toLowerCase(); nombreIns = estudio.getInstitucion().getNombre().toLowerCase();
......
package com.roshka.controller; package com.roshka.controller;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
...@@ -20,9 +26,11 @@ import com.roshka.repositorio.ExperienciaRepository; ...@@ -20,9 +26,11 @@ import com.roshka.repositorio.ExperienciaRepository;
import com.roshka.repositorio.InstitucionRepository; import com.roshka.repositorio.InstitucionRepository;
import com.roshka.repositorio.PostulanteRepository; import com.roshka.repositorio.PostulanteRepository;
import com.roshka.repositorio.TecnologiaRepository; import com.roshka.repositorio.TecnologiaRepository;
import com.roshka.service.PdfGenerator;
import com.roshka.utils.Helper; import com.roshka.utils.Helper;
import com.roshka.utils.PostulantesExcelExporter;
import org.hibernate.jpa.TypedParameterValue; import org.hibernate.jpa.TypedParameterValue;
import org.hibernate.type.StringType; import org.hibernate.type.StringType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -40,6 +48,8 @@ import org.springframework.http.HttpHeaders; ...@@ -40,6 +48,8 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller @Controller
...@@ -77,7 +87,7 @@ public class PostulanteRRHHController { ...@@ -77,7 +87,7 @@ public class PostulanteRRHHController {
} }
@RequestMapping("/postulantes") @RequestMapping("/postulantes")
public String postulantes(Model model, public String postulantes(HttpServletRequest request, Model model,
@RequestParam(required = false)Long tecId, @RequestParam(required = false)Long tecId,
@RequestParam(required = false)String nombre, @RequestParam(required = false)String nombre,
@RequestParam(required = false)EstadoPostulante estado, @RequestParam(required = false)EstadoPostulante estado,
...@@ -89,13 +99,14 @@ public class PostulanteRRHHController { ...@@ -89,13 +99,14 @@ public class PostulanteRRHHController {
@RequestParam(required = false)Long cargoId, @RequestParam(required = false)Long cargoId,
@RequestParam(required = false)Long convId, @RequestParam(required = false)Long convId,
@RequestParam(defaultValue = "0")Integer nroPagina @RequestParam(defaultValue = "0")Integer nroPagina
) { ) throws IOException {
final Integer CANTIDAD_POR_PAGINA = 10; final Integer CANTIDAD_POR_PAGINA = 5;
Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id")); Pageable page = PageRequest.of(nroPagina,CANTIDAD_POR_PAGINA,Sort.by("id"));
model.addAttribute("tecnologias", tecRepo.findAll()); model.addAttribute("tecnologias", tecRepo.findAll());
model.addAttribute("disponibilidades", Disponibilidad.values()); model.addAttribute("disponibilidades", Disponibilidad.values());
model.addAttribute("institucionesEducativas", institucionRepository.findAll()); model.addAttribute("institucionesEducativas", institucionRepository.findAll());
model.addAttribute("estadoP", EstadoPostulante.values()); model.addAttribute("estadoP", EstadoPostulante.values());
model.addAttribute("cargos", carRepo.findAll()); model.addAttribute("cargos", carRepo.findAll());
model.addAttribute("cargoRepo", cargoRepo); model.addAttribute("cargoRepo", cargoRepo);
//model.addAttribute("convocatoriaC", cargoRepo.findAll()); //model.addAttribute("convocatoriaC", cargoRepo.findAll());
...@@ -105,7 +116,12 @@ public class PostulanteRRHHController { ...@@ -105,7 +116,12 @@ public class PostulanteRRHHController {
// TODO Auto-generated catch block // TODO Auto-generated catch block
er.printStackTrace(); er.printStackTrace();
} }
Page<Postulante> postulantesPag = post.postulantesMultiFiltro(nombre == null || nombre.trim().isEmpty() ? new TypedParameterValue(StringType.INSTANCE,null) : new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"),dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId); Page<Postulante> postulantesPag = post.postulantesMultiFiltro(
nombre == null || nombre.trim().isEmpty() ?
new TypedParameterValue(StringType.INSTANCE,null) :
new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"),
dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId);
model.addAttribute("numeroOcurrencias", postulantesPag.getTotalElements());
List<Postulante> postulantes = postulantesPag.getContent(); List<Postulante> postulantes = postulantesPag.getContent();
List<PostulanteListaDTO> postulantesDTO = new ArrayList<>(); List<PostulanteListaDTO> postulantesDTO = new ArrayList<>();
...@@ -119,12 +135,73 @@ public class PostulanteRRHHController { ...@@ -119,12 +135,73 @@ public class PostulanteRRHHController {
if(expInMonths != null && expInMonths > expTotal) continue; if(expInMonths != null && expInMonths > expTotal) continue;
postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones())); postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones()));
} }
model.addAttribute("pages", postulantesPag.getTotalPages()); model.addAttribute("pages", postulantesPag.getTotalPages());
model.addAttribute("postulantes", postulantesDTO); model.addAttribute("postulantes", postulantesDTO);
String query = request.getQueryString();
model.addAttribute("query", query);
return "postulantes"; return "postulantes";
} }
@RequestMapping("/postulantesExcel")
public void exportPostulantesExcel(HttpServletResponse response, Model model,
@RequestParam(required = false)Long tecId,
@RequestParam(required = false)String nombre,
@RequestParam(required = false)EstadoPostulante estado,
@RequestParam(required = false)Disponibilidad dispo,
@RequestParam(required = false)Long lvlEng,
@RequestParam(required = false)Long lvlTec,
@RequestParam(required = false)Long instId,
@RequestParam(required = false)Long expInMonths,
@RequestParam(required = false)Long cargoId,
@RequestParam(required = false)Long convId,
@RequestParam(defaultValue = "0")Integer nroPagina
) throws IOException {
Pageable page = PageRequest.of(0,Integer.MAX_VALUE,Sort.by("id"));
Page<Postulante> postulantesPag = post.postulantesMultiFiltro(
nombre == null || nombre.trim().isEmpty() ?
new TypedParameterValue(StringType.INSTANCE,null) :
new TypedParameterValue(StringType.INSTANCE,"%"+nombre+"%"),
dispo, lvlEng, lvlTec, tecId, instId,cargoId,page,estado,convId);
List<Postulante> postulantes = postulantesPag.getContent();
List<PostulanteListaDTO> postulantesDTO = new ArrayList<>();
for (Postulante postulante : postulantes) {
long expTotal = 0;
//Sumamos el tiempo de experiencia total en meses de cada postulante
//expTotal = postulante.getExperiencias().stream().mapToLong(e -> Helper.getMonthsDifference(e.getFechaDesde(), e.getFechaHasta())).sum();
for (Experiencia experiencia : postulante.getExperiencias()) {
expTotal += Helper.getMonthsDifference(experiencia.getFechaDesde(), experiencia.getFechaHasta());
}
if(expInMonths != null && expInMonths > expTotal) continue;
postulantesDTO.add(new PostulanteListaDTO(postulante.getId(), postulante.getNombre(), postulante.getApellido(), postulante.getDisponibilidad(), postulante.getNivelIngles(), expTotal, postulante.getTecnologias(),postulante.getEstadoPostulante(),postulante.getPostulaciones()));
}
response.setContentType("application/octet-stream");
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String currentDateTime = dateFormatter.format(new Date());
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=postulantes_" + currentDateTime + ".xlsx";
response.setHeader(headerKey, headerValue);
HashMap<String, String> filtros = new HashMap<String, String>();
filtros.put("nombre", nombre.equals("") ? "-":nombre);
filtros.put("nivelIngles", lvlEng == null ? "-" : lvlEng.toString());
filtros.put("tecnologia", tecId == null ? "-" : tecRepo.findById(tecId).get().getNombre());
filtros.put("nivelTecnologia", lvlTec == null ? "-" : lvlTec.toString());
filtros.put("institucion", instId == null ? "-" : institucionRepository.findById(instId).get().getNombre());
filtros.put("estado", estado == null ? "-" : estado.getEstado());
filtros.put("experienciaEnMeses", expInMonths == null ? "-" : expInMonths.toString());
filtros.put("convocatoria", convId == null ? "-" : cargoRepo.findById(convId).get().getCargo().getNombre());
PostulantesExcelExporter excelExporter = new PostulantesExcelExporter(postulantesDTO, filtros);
excelExporter.export(response);
}
@GetMapping({"/postulantes/{postulanteId}"}) @GetMapping({"/postulantes/{postulanteId}"})
...@@ -136,6 +213,8 @@ public class PostulanteRRHHController { ...@@ -136,6 +213,8 @@ public class PostulanteRRHHController {
return "detallepostulante"; return "detallepostulante";
} }
@PostMapping({"/postulantes/{postulanteId}"}) @PostMapping({"/postulantes/{postulanteId}"})
public String setPostulanteEstado(@ModelAttribute Postulante postulante, BindingResult result, @PathVariable("postulanteId") Long postulanteId) { public String setPostulanteEstado(@ModelAttribute Postulante postulante, BindingResult result, @PathVariable("postulanteId") Long postulanteId) {
//post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId()); //post.setPostulanteEstadoAndComentario(postulante.getEstadoPostulante(),postulante.getComentarioRRHH(), postulante.getId());
...@@ -169,5 +248,26 @@ public class PostulanteRRHHController { ...@@ -169,5 +248,26 @@ public class PostulanteRRHHController {
} }
} }
@GetMapping("/postulantes/{id}/pdf")
public ResponseEntity<Resource> downloadPDF(@PathVariable Long id) {
// Load file from database
PdfGenerator pdf = new PdfGenerator();
try {
Postulante postulante = post.findById(id)
.orElseThrow(() -> new Exception("Postulante no encontrado"));
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("application/pdf"))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + postulante.getNroDocument() + ".pdf" + "\"")
.body(new ByteArrayResource(pdf.generatePdfReport(postulante)));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return ResponseEntity.notFound().build();
}
}
} }
\ No newline at end of file
...@@ -96,6 +96,9 @@ public class Postulante { ...@@ -96,6 +96,9 @@ public class Postulante {
@Column(name = "disponibilidad", length = 2) @Column(name = "disponibilidad", length = 2)
private Disponibilidad disponibilidad; private Disponibilidad disponibilidad;
@Column(name = "tecnologia_otros")
private String tecnologiaOtros;
@JsonManagedReference(value = "postulantetecnologia-postulante") @JsonManagedReference(value = "postulantetecnologia-postulante")
@OneToMany(mappedBy = "postulante",cascade = CascadeType.ALL) @OneToMany(mappedBy = "postulante",cascade = CascadeType.ALL)
private List<PostulanteTecnologia> tecnologias; private List<PostulanteTecnologia> tecnologias;
......
...@@ -31,7 +31,7 @@ public class PostulanteTecnologia { ...@@ -31,7 +31,7 @@ public class PostulanteTecnologia {
@Min(value = 1) @Min(value = 1)
@Max(value = 5) @Max(value = 5)
private Long nivel; private Long nivel;
@ManyToOne(cascade = {CascadeType.PERSIST},optional = false) @ManyToOne()
@JoinColumn @JoinColumn
private Tecnologia tecnologia; private Tecnologia tecnologia;
......
package com.roshka.service;
import java.io.ByteArrayOutputStream;
import java.util.Date;
import java.util.stream.Collectors;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import org.springframework.stereotype.Component;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import com.roshka.modelo.Estudio;
import com.roshka.modelo.Experiencia;
import com.roshka.modelo.Postulante;
import com.roshka.utils.Helper;
@Component("pdfGenerator")
public class PdfGenerator {
private static Font COURIER = new Font(Font.FontFamily.COURIER, 20, Font.BOLD);
private static Font COURIER_MEDIUM = new Font(Font.FontFamily.COURIER, 16, Font.BOLD);
private static Font COURIER_SMALL = new Font(Font.FontFamily.COURIER, 14, Font.UNDERLINE);
public byte[] generatePdfReport(Postulante postulante) {
Document document = new Document();
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PdfWriter.getInstance(document, byteArrayOutputStream);
document.open();
addDocTitle(document, postulante);
createTable(document,postulante);
document.close();
System.out.println("------------------Your PDF Report is ready!-------------------------");
return byteArrayOutputStream.toByteArray();
} catch ( DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
private void addDocTitle(Document document, Postulante postulante) throws DocumentException {
Paragraph p1 = new Paragraph();
leaveEmptyLine(p1, 1);
p1.add(new Paragraph("Detalles del postulante", COURIER));
p1.setAlignment(Element.ALIGN_CENTER);
document.add(p1);
}
private void agregarEncabezado(Document document, String titulo) throws DocumentException {
Paragraph p1 = new Paragraph();
p1.setAlignment(Element.ALIGN_CENTER);
p1.add(new Paragraph(titulo, COURIER_MEDIUM));
document.add(p1);
}
private void agregarSubEncabezado(Document document, String titulo) throws DocumentException {
Paragraph p1 = new Paragraph();
p1.setAlignment(Element.ALIGN_CENTER);
p1.add(new Paragraph(titulo, COURIER_SMALL));
document.add(p1);
}
private void agregarLabelTexto(Document document, String label, Object texto) throws DocumentException{
if(texto == null) return;
if(texto instanceof Date) texto = Helper.formatDate((Date)texto, "dd-MM-yyyy");
Paragraph paragraph = new Paragraph();
paragraph.add(label + ": ");
paragraph.add(texto.toString());
document.add(paragraph);
}
private void createTable(Document document, Postulante postulante) throws DocumentException {
Paragraph paragraph = new Paragraph();
leaveEmptyLine(paragraph, 3);
//paragraph.add();
agregarEncabezado(document, "Datos personales");
agregarLabelTexto(document, "Nombre", postulante.getNombre() + " " + postulante.getApellido());
agregarLabelTexto(document, "Nro de Documento", postulante.getNroDocument());
agregarLabelTexto(document, "Correo", postulante.getCorreo());
agregarLabelTexto(document, "Direccion", postulante.getDireccion());
agregarLabelTexto(document, "Ciudad", postulante.getCiudad().getNombre());
agregarLabelTexto(document, "Telefono", postulante.getTelefono());
agregarLabelTexto(document, "Edad", Helper.calculateAge(postulante.getFechaNacimiento()) );
agregarLabelTexto(document, "Nivel de Ingles", postulante.getNivelIngles());
agregarLabelTexto(document, "Nacionalidad", postulante.getNacionalidad().getDescripcion());
agregarEncabezado(document, "Experiencias");
for(Experiencia ex : postulante.getExperiencias()){
agregarSubEncabezado(document, ex.getInstitucion());
agregarLabelTexto(document, "Fecha Inicio", ex.getFechaDesde());
agregarLabelTexto(document, "Fecha Fin", ex.getFechaHasta());
agregarLabelTexto(document, "Cargo", ex.getCargo());
agregarLabelTexto(document, "Tipo Experiencia", ex.getTipoExperiencia());
agregarLabelTexto(document, "Descripcion", ex.getDescripcion());
agregarLabelTexto(document, "Nombre Referencia", ex.getNombreReferencia());
agregarLabelTexto(document, "Telefono Referencia", ex.getTelefonoReferencia());
agregarLabelTexto(document, "Motivo Salida", ex.getMotivoSalida());
}
agregarEncabezado(document, "Estudios");
for(Estudio ex : postulante.getEstudios()){
agregarSubEncabezado(document, ex.getInstitucion().getNombre());
agregarLabelTexto(document, "Fecha Inicio", ex.getFechaDesde());
agregarLabelTexto(document, "Fecha Fin", ex.getFechaHasta());
agregarLabelTexto(document, "Tema de Estudio", ex.getTemaDeEstudio());
agregarLabelTexto(document, "Tipo de Estudio", ex.getTipoDeEstudio());
agregarLabelTexto(document, "Descripcion", ex.getEstado().toString());
}
agregarEncabezado(document, "Cargo al cual postula");
agregarList(postulante.getPostulaciones().stream()
.map(cc -> cc.getCargo().getNombre())
.collect(Collectors.toList()), document);
agregarEncabezado(document, "Tecnologias");
agregarList(postulante.getTecnologias().stream()
.map(cc -> cc.getTecnologia().getNombre())
.collect(Collectors.toList()),
document);
agregarEncabezado(document, "Referencias Personales");
agregarList(postulante.getReferencias().stream()
.map(cc -> "Nombre: " + cc.getNombre() + ". Relacion: " + cc.getRelacion() + ". Telefono: " + cc.getTelefono() )
.collect(Collectors.toList()),
document);
}
private void agregarList(java.util.List<String> items, Document document) throws DocumentException{
List list = new List(false);
for(String item : items){
list.add(new ListItem(item));
}
document.add(list);
}
private static void leaveEmptyLine(Paragraph paragraph, int number) {
for (int i = 0; i < number; i++) {
paragraph.add(new Paragraph(" "));
}
}
}
...@@ -3,9 +3,9 @@ package com.roshka.utils; ...@@ -3,9 +3,9 @@ package com.roshka.utils;
import java.io.IOException; import java.io.IOException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.YearMonth; import java.time.LocalDate;
import java.time.ZoneOffset; import java.time.Period;
import java.time.temporal.ChronoUnit; import java.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -46,6 +46,31 @@ public class Helper { ...@@ -46,6 +46,31 @@ public class Helper {
return Math.round(diff/30.d) ; return Math.round(diff/30.d) ;
} }
public static LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}
public static int calculateAge(LocalDate birthDate, LocalDate currentDate) {
if ((birthDate != null) && (currentDate != null)) {
return Period.between(birthDate, currentDate).getYears();
} else {
return 0;
}
}
public static int calculateAge(Date birthDate) {
LocalDate currentDate = LocalDate.now();
return calculateAge(convertToLocalDateViaSqlDate(birthDate),currentDate);
}
public static String formatDate(LocalDate fecha, String format){
if(fecha == null || format == null) return null;
return fecha.format(DateTimeFormatter.ofPattern(format));
}
public static String formatDate(Date fecha, String format){
return formatDate(convertToLocalDateViaSqlDate(fecha), format);
}
public static DBFile createFile(MultipartFile file) { public static DBFile createFile(MultipartFile file) {
// Normalize file name // Normalize file name
String fileName = StringUtils.cleanPath(file.getOriginalFilename()); String fileName = StringUtils.cleanPath(file.getOriginalFilename());
......
package com.roshka.utils;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import com.roshka.DTO.PostulanteListaDTO;
import com.roshka.modelo.PostulanteTecnologia;
import com.roshka.modelo.Tecnologia;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class PostulantesExcelExporter {
private XSSFWorkbook workbook;
private XSSFSheet sheet;
private List<PostulanteListaDTO> listUsers;
private HashMap<String, String> filtros;
public PostulantesExcelExporter(List<PostulanteListaDTO> listUsers, HashMap<String, String> filtros) {
this.listUsers = listUsers;
workbook = new XSSFWorkbook();
this.filtros = filtros;
}
private void writeHeaderLine() {
sheet = workbook.createSheet("Postulantes");
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String currentDateTime = dateFormatter.format(new Date());
Row row = sheet.createRow(0);
CellStyle style = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setBold(true);
font.setFontHeight(14);
style.setFont(font);
createCell(row, 0, "Postulantes "+currentDateTime, style);
row = sheet.createRow(2);
createCell(row, 0, "Filtros", style);
row = sheet.createRow(3);
createCell(row, 0, "Nombre", style);
createCell(row, 1, "Nivel de Ingles", style);
createCell(row, 2, "Experiencia (Meses)", style);
createCell(row, 3, "Tecnologias", style);
createCell(row, 4, "Nivel Tecnologia", style);
createCell(row, 5, "Institucion", style);
createCell(row, 6, "Estado", style);
createCell(row, 7, "Convocatoria", style);
row = sheet.createRow(6);
style = workbook.createCellStyle();
font = workbook.createFont();
font.setBold(true);
font.setFontHeight(14);
style.setFont(font);
createCell(row, 0, "Nombre", style);
createCell(row, 1, "Nivel de Ingles", style);
createCell(row, 2, "Experiencia", style);
createCell(row, 3, "Tecnologias", style);
createCell(row, 4, "Estado", style);
row = sheet.createRow(4);
font.setBold(false);
font.setFontHeight(12);
style.setFont(font);
createCell(row, 0, filtros.get("nombre"), style);
createCell(row, 1, filtros.get("nivelIngles"), style);
createCell(row, 2, filtros.get("experienciaEnMeses"), style);
createCell(row, 3, filtros.get("tecnologia"), style);
createCell(row, 4, filtros.get("nivelTecnologia"), style);
createCell(row, 5, filtros.get("institucion"), style);
createCell(row, 6, filtros.get("estado"), style);
createCell(row, 7, filtros.get("convocatoria"), style);
}
private void createCell(Row row, int columnCount, Object value, CellStyle style) {
sheet.autoSizeColumn(columnCount);
Cell cell = row.createCell(columnCount);
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Boolean) {
cell.setCellValue((Boolean) value);
}else {
cell.setCellValue((String) value);
}
cell.setCellStyle(style);
}
private void writeDataLines() {
int rowCount = 7;
CellStyle style = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setFontHeight(12);
style.setFont(font);
for (PostulanteListaDTO user : listUsers) {
Row row = sheet.createRow(rowCount++);
int columnCount = 0;
StringBuilder tecno = new StringBuilder();
for(PostulanteTecnologia tecnologia: user.getTecnologias()){
tecno.append(tecnologia.getTecnologia().getNombre()).append(" ");
}
createCell(row, columnCount++, user.getNombre() + " " + user.getApellido(), style);
createCell(row, columnCount++, user.getNivelIngles().intValue(), style);
createCell(row, columnCount++, user.getExperienciaMeses().intValue(), style);
createCell(row, columnCount++, tecno.toString(), style);
createCell(row, columnCount++, user.getEstado().getEstado(), style);
tecno.delete(0, tecno.length()-1);
}
}
public void export(HttpServletResponse response) throws IOException {
writeHeaderLine();
writeDataLines();
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
workbook.close();
outputStream.close();
}
}
\ No newline at end of file
...@@ -40,19 +40,19 @@ ...@@ -40,19 +40,19 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "JAVA" "id": 1
}, },
"nivel": 5 "nivel": 5
}, },
{ {
"tecnologia": { "tecnologia": {
"nombre": "Python" "id": 2
}, },
"nivel": 4 "nivel": 4
}, },
{ {
"tecnologia": { "tecnologia": {
"nombre": "C" "id": 3
}, },
"nivel": 5 "nivel": 5
} }
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Spring" "id": 4
}, },
"nivel": 2 "nivel": 2
} }
...@@ -146,7 +146,7 @@ ...@@ -146,7 +146,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Django" "id": 5
}, },
"nivel": 3 "nivel": 3
} }
...@@ -193,7 +193,7 @@ ...@@ -193,7 +193,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Flutter" "id": 6
}, },
"nivel": 2 "nivel": 2
} }
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Switf" "id": 3
}, },
"nivel": 5 "nivel": 5
} }
...@@ -287,7 +287,7 @@ ...@@ -287,7 +287,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "SL" "id": 2
}, },
"nivel": 4 "nivel": 4
} }
...@@ -334,7 +334,7 @@ ...@@ -334,7 +334,7 @@
"tecnologias": [ "tecnologias": [
{ {
"tecnologia": { "tecnologia": {
"nombre": "Scala" "id": 5
}, },
"nivel": 5 "nivel": 5
} }
......
...@@ -18,5 +18,17 @@ ...@@ -18,5 +18,17 @@
{ {
"id": 5, "id": 5,
"nombre": "spring" "nombre": "spring"
},
{
"id": 6,
"nombre": "php"
},
{
"id": 7,
"nombre": "laravel"
},
{
"id": 8,
"nombre": "sqlserver"
} }
] ]
\ No newline at end of file
...@@ -175,7 +175,7 @@ function agregarFieldTecnologia(){ ...@@ -175,7 +175,7 @@ function agregarFieldTecnologia(){
if(tecn==null) continue; if(tecn==null) continue;
content1 += ` content1 += `
<div class="col-auto" id="tecn-${index}"> <div class="col-auto" id="tecn-${index}">
${tecn.tecnologia.nombre} ( ${tecn.nivel} <i class="bi bi-star-fill"></i> ) &nbsp; <i class="bi bi-trash-fill" onclick="eliminarTecnologia(event)"></i> ${tecn.tecnologia.nombre} ( ${tecn.nivel} <i class="bi bi-star-fill"></i> ) &nbsp; <i class="bi bi-trash-fill pointer" onclick="eliminarTecnologia(event)"></i>
</div> </div>
` `
...@@ -267,7 +267,7 @@ function agregarFieldExpierncia(event){ ...@@ -267,7 +267,7 @@ function agregarFieldExpierncia(event){
if(exp==null) continue; if(exp==null) continue;
content += ` content += `
<div class="col border border-3 rounded" id="exp-${index}"> <div class="col border border-3 rounded" id="exp-${index}">
<center><h5>Experiencia <i class="bi bi-trash-fill" onclick="eliminarExperiencia(${index})"></i></h5></center> <center><h5>Experiencia <i class="bi bi-trash-fill pointer" onclick="eliminarExperiencia(${index})"></i></h5></center>
<dl class="row row-cols-md-2 gx-0 gy-2"> <dl class="row row-cols-md-2 gx-0 gy-2">
<dt class="col-sm-auto text-start">Institucion</dt> <dt class="col-sm-auto text-start">Institucion</dt>
<dd class="col-sm-6 text-start">${exp.institucion}</dd> <dd class="col-sm-6 text-start">${exp.institucion}</dd>
...@@ -380,7 +380,7 @@ function agregarFieldEstudio(){ ...@@ -380,7 +380,7 @@ function agregarFieldEstudio(){
if(est==null) continue; if(est==null) continue;
content += ` content += `
<div class="col border border-3 rounded" id="est-${index}"> <div class="col border border-3 rounded" id="est-${index}">
<center><h5>Estudio <i class="bi bi-trash-fill" onclick="eliminarEstudio(${index})"></i></h5></center> <center><h5>Estudio <i class="bi bi-trash-fill pointer" onclick="eliminarEstudio(${index})"></i></h5></center>
<dl class="row row-cols-md-2 gx-0 gy-2"> <dl class="row row-cols-md-2 gx-0 gy-2">
<dt class="col-sm-auto text-start">Institucion</dt> <dt class="col-sm-auto text-start">Institucion</dt>
<dd class="col-sm-6 text-start">${est.institucion.nombre}</dd> <dd class="col-sm-6 text-start">${est.institucion.nombre}</dd>
...@@ -473,7 +473,7 @@ function agregarFieldCargo(){ ...@@ -473,7 +473,7 @@ function agregarFieldCargo(){
if(car==null) continue; if(car==null) continue;
content1 += ` content1 += `
<div class="col-auto" id="car-${index}" style="text-transform: uppercase;"> <div class="col-auto" id="car-${index}" style="text-transform: uppercase;">
${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML} &nbsp;<i class="bi bi-trash-fill" onclick="eliminarCargoPostulante(event)"></i> ${document.querySelector('[name=cargo-id] > option[value="'+car.id+'"]').innerHTML} &nbsp;<i class="bi bi-trash-fill pointer" onclick="eliminarCargoPostulante(event)"></i>
</div> </div>
...@@ -547,7 +547,7 @@ function agregarFieldReferencia(event){ ...@@ -547,7 +547,7 @@ function agregarFieldReferencia(event){
if(exp==null) continue; if(exp==null) continue;
content += ` content += `
<div class="col border border-3 rounded" id="ref-${index}"> <div class="col border border-3 rounded" id="ref-${index}">
<center><h5>Referencia Personal <i class="bi bi-trash-fill" onclick="eliminarReferencia(${index})"></i></h5></center> <center><h5>Referencia Personal <i class="bi bi-trash-fill pointer" onclick="eliminarReferencia(${index})"></i></h5></center>
<dl class="row row-cols-sm-2"> <dl class="row row-cols-sm-2">
<dt class="col-sm-auto text-start">Nombre</dt> <dt class="col-sm-auto text-start">Nombre</dt>
<dd class="col-sm text-start">${exp.nombre}</dd> <dd class="col-sm text-start">${exp.nombre}</dd>
......
...@@ -213,4 +213,121 @@ h4{ ...@@ -213,4 +213,121 @@ h4{
} }
form[name="postulante"]{ form[name="postulante"]{
color: #ffffff; color: #ffffff;
} }
\ No newline at end of file
.form-check-input:checked {
background-color: #198754;
border-color: #0d6efd;
}
label:hover {
color: #bfbfbf;
}
/*ICONOS Y PLACEHOLDER*/
.FA{
font-family: 'Shippori Antique B1',FontAwesome;
}
#nroDocument::-webkit-outer-spin-button,
#nroDocument::-webkit-inner-spin-button
{
-webkit-appearance: none;
margin: 0;
}
#nroDocument[type=number] {
-moz-appearance: textfield;
}
#telefono::-webkit-outer-spin-button,
#telefono::-webkit-inner-spin-button
{
-webkit-appearance: none;
margin: 0;
}
#telefono[type=number] {
-moz-appearance: textfield;
}
#refTel::-webkit-outer-spin-button,
#refTel::-webkit-inner-spin-button
{
-webkit-appearance: none;
margin: 0;
}
#refTel[type=number] {
-moz-appearance: textfield;
}
.pointer {cursor: pointer;}
/*
.size-placeholder::placeholder{
background-size: 18px 18px;
background-repeat: no-repeat;
background-position: right center;
}
/*Nombre
.nombre-ph::placeholder{
background-image: url(../img/placeholder/name_ph.png);
}
Apellido
#apellido::placeholder{
background-image: url(../img/placeholder/lastname_ph.png);
}
Email
#correo::placeholder{
background-image: url(../img/placeholder/email_ph.png);
}
Numero de documento*/
/*
.nroDocument-ph::placeholder{
background-image: url(../img/placeholder/nroDocumento_ph.png);
margin-left: 5px;
}
Direccion
#direccion::placeholder{
background-image: url(../img/placeholder/adress_ph.png);
background-size: 14px 14px;
}*/
/*Telefono*/
/*
.telefono-ph::placeholder{
background-image: url(../img/placeholder/telephone_ph.png);
}
/*Modal Estudio
#institucionEstudio::placeholder{
background-image: url(../img/placeholder/studios_ph.png);
}
#temaDeEstudio::placeholder{
background-image: url(../img/placeholder/studios_ph.png);
}
#institucionExperiencia::placeholder{
background-image: url(../img/placeholder/studios_ph.png);
}
#cargo::placeholder{
background-image: url(../img/placeholder/cargo_ph.png);
}
#descripcion::placeholder{
background-image: url(../img/placeholder/description_ph.png);
}
#refNombre::placeholder{
background-image: url(../img/placeholder/name_ph.png);
}*/
/*
.telefono-ph::placeholder{
background-image: url(../img/placeholder/telephone_ph.png);
}
#motivoSalida::placeholder{
background-image: url(../img/placeholder/motivoSalida_ph.png);
}
#relacion::placeholder{
background-image: url(../img/placeholder/relacion_ph.png);
}
*/
/*Prueba Font Awesome*/
...@@ -20,40 +20,45 @@ contentType="text/html;charset=UTF-8" language="java" %> ...@@ -20,40 +20,45 @@ contentType="text/html;charset=UTF-8" language="java" %>
</form> </form>
<a href="/cargo">Agregar Nuevo Cargo</a> <a href="/cargo">Agregar Nuevo Cargo</a>
</div> </div>
<div> <div class="card text-dark bg-light mt-3">
<table class="table">
<thead> <div class="card-body">
<tr> <div class="table-responsive">
<th scope="col">#</th> <table class="table">
<th scope="col">Cargo</th> <thead>
</tr>
</thead>
<tbody>
<c:forEach items="${cargos}" var="cargo" varStatus="sta">
<tr> <tr>
<th scope="row">${sta.index+1}</th> <th scope="col">#</th>
<td>${cargo.getNombre()}</td> <th scope="col">Cargo</th>
<td>
<a href="/convocatorias?cargoId=${cargo.id}"
>Ver Convocatorias</a
>
</td>
<td><a href="/cargo/${cargo.id}">Editar cargo</a></td>
</tr> </tr>
</c:forEach> </thead>
</tbody> <tbody>
</table> <c:forEach items="${cargos}" var="cargo" varStatus="sta">
<tr>
<th scope="row">${sta.index+1}</th>
<td>${cargo.getNombre()}</td>
<td>
<a href="/convocatorias?cargoId=${cargo.id}"
>Ver Convocatorias</a
>
</td>
<td><a href="/cargo/${cargo.id}">Editar cargo</a></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div> </div>
</div> <div class="card-footer">
<div class="card-footer"> <div>
<div> <nav aria-label="Page navigation example">
<nav aria-label="Page navigation example"> <ul class="pagination">
<ul class="pagination"> <c:forEach begin="1" end="${pages}" var="nro">
<c:forEach begin="1" end="${pages}" var="nro"> <li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li>
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li> </c:forEach>
</c:forEach> </ul>
</ul> </nav>
</nav> </div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%> <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<layout:extends name="layouts/base.jsp"> <layout:extends name="layouts/base.jsp">
<layout:put block="cssDeclaracion" type="APPEND"></layout:put> <layout:put block="cssDeclaracion" type="APPEND"></layout:put>
<layout:put block="contents" type="REPLACE"> <layout:put block="contents" type="REPLACE">
...@@ -25,12 +27,16 @@ ...@@ -25,12 +27,16 @@
<input type="submit" value="Buscar"> <input type="submit" value="Buscar">
</form> </form>
</div> </div>
<div>
<a href="/convocatoria">Agregar Nueva Convocatoria</a> <a href="/convocatoria">Agregar Nueva Convocatoria</a>
<c:if test="${SUCCESS_MESSAGE != null}"> <c:if test="${SUCCESS_MESSAGE != null}">
<div id="status_message" style="color: brown;" >${SUCCESS_MESSAGE}</div> <div id="status_message" style="color: brown;">${SUCCESS_MESSAGE}</div>
</c:if> </c:if>
<table class="table"> <div class="card text-dark bg-light mt-3">
<div class="card-body">
<div class="table-responsive">
<table class="table">
<thead> <thead>
<tr> <tr>
<th scope="col">#</th> <th scope="col">#</th>
...@@ -47,9 +53,9 @@ ...@@ -47,9 +53,9 @@
<th scope="row">${sta.index+1}</th> <th scope="row">${sta.index+1}</th>
<td>${convocatoria.getCargo().getNombre()}</td> <td>${convocatoria.getCargo().getNombre()}</td>
<td>${convocatoria.getEstado().getDescripcion()}</td> <td>${convocatoria.getEstado().getDescripcion()}</td>
<td>${convocatoria.getFechaInicio().toString().split(" ")[0]}</td> <td><fmt:formatDate value="${convocatoria.getFechaInicio()}" pattern="dd-MM-yyyy" /></td>
<td>${convocatoria.getFechaFin().toString().split(" ")[0]}</td> <td><fmt:formatDate value="${convocatoria.getFechaFin()}" pattern="dd-MM-yyyy" /></td>
<td>Ver Postulantes</td> <td><a href="/postulantes?convId=${convocatoria.id}">Ver postulantes</a></td>
<td><button onclick=window.location.href="/convocatoria/${convocatoria.id}">Cerrar convocatoria</button></td> <td><button onclick=window.location.href="/convocatoria/${convocatoria.id}">Cerrar convocatoria</button></td>
</tr> </tr>
</c:forEach> </c:forEach>
...@@ -57,8 +63,9 @@ ...@@ -57,8 +63,9 @@
</tbody> </tbody>
</table> </table>
</div>
</div>
</div> </div>
</layout:put> </layout:put>
......
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<layout:extends name="layouts/base.jsp">
<layout:put block="contents" type="REPLACE">
<h2 style="text-align: center;">
DETALLE POSTULANTE
</h2>
${postulante.nombre} ${postulante.apellido}
</layout:put>
</layout:extends>
...@@ -252,7 +252,6 @@ ...@@ -252,7 +252,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="row"> <div class="row">
<div class="col-auto col-md-4"> <div class="col-auto col-md-4">
...@@ -267,6 +266,16 @@ ...@@ -267,6 +266,16 @@
</div> </div>
</div> --> </div> -->
</form> </form>
<div class="row">
<div class="col-md-12">
<a href="/postulantesExcel?${query}" type="button" class="btn btn-light float-end">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-excel-fill" viewBox="0 0 16 16">
<path d="M9.293 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.707A1 1 0 0 0 13.707 4L10 .293A1 1 0 0 0 9.293 0zM9.5 3.5v-2l3 3h-2a1 1 0 0 1-1-1zM5.884 6.68 8 9.219l2.116-2.54a.5.5 0 1 1 .768.641L8.651 10l2.233 2.68a.5.5 0 0 1-.768.64L8 10.781l-2.116 2.54a.5.5 0 0 1-.768-.641L7.349 10 5.116 7.32a.5.5 0 1 1 .768-.64z"></path>
</svg>
Excel
</a>
</div>
</div>
</div> </div>
<div class="card text-dark bg-light mt-3"> <div class="card text-dark bg-light mt-3">
...@@ -324,11 +333,18 @@ ...@@ -324,11 +333,18 @@
<div class="card-footer"> <div class="card-footer">
<div> <div>
<nav aria-label="Page navigation example"> <nav aria-label="Page navigation example">
<ul class="pagination"> <div class="row">
<c:forEach begin="1" end="${pages}" var="nro"> <div class="col-md-10">
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li> <ul class="pagination">
</c:forEach> <c:forEach begin="1" end="${pages}" var="nro">
</ul> <li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li>
</c:forEach>
</ul>
</div>
<div class="col-md-2">
<span class="badge bg-light text-dark">Numero de Ocurrencias: ${numeroOcurrencias}</span>
</div>
</div>
</nav> </nav>
</div> </div>
</div> </div>
...@@ -355,12 +371,13 @@ ...@@ -355,12 +371,13 @@
function buscarPagina(nro){ function buscarPagina(nro){
nro-- nro--
const aBuscar = 'nroPagina='+nro const aBuscar = 'nroPagina='+nro
if(!location.search) location.search = "?"+aBuscar if(!location.search) location.search = aBuscar
const inicial = location.search.search(aBuscar); const inicial = location.search.search(aBuscar);
if(inicial==-1){//si no se encuentra y hay otros queries if(inicial==-1){//si no se encuentra y hay otros queries
location.search = "&"+aBuscar location.search = "&"+aBuscar;
} }
location.search.replace('nroPagina=',aBuscar) location.search.replace('nroPagina=',aBuscar)
console.log(location.search)
} }
const tecId = document.querySelector("#tecId"); const tecId = document.querySelector("#tecId");
const lvlTec = document.querySelector("#lvlTec"); const lvlTec = document.querySelector("#lvlTec");
......
...@@ -15,41 +15,47 @@ ...@@ -15,41 +15,47 @@
</form> </form>
<a href="/tecnologia">Agregar Nueva Tecnologia</a> <a href="/tecnologia">Agregar Nueva Tecnologia</a>
</div> </div>
<div> <div class="card text-dark bg-light mt-3">
<table class="table">
<thead> <div class="card-body">
<tr> <div class="table-responsive">
<th scope="col">#</th> <table class="table">
<th scope="col">Tecnologia</th> <thead>
</tr> <tr>
</thead> <th scope="col">#</th>
<tbody> <th scope="col">Tecnologia</th>
<th scope="col"></th>
<c:forEach items="${tecnologias}" var="tecnologia" varStatus="sta"> </tr>
<tr> </thead>
<th scope="row">${sta.index+1}</th> <tbody>
<td>${tecnologia.getNombre()}</td>
<c:forEach items="${tecnologias}" var="tecnologia" varStatus="sta">
<td><a href="/tecnologia/${tecnologia.id}">Editar tecnologia</a></td> <tr>
</tr> <th scope="row">${sta.index+1}</th>
</c:forEach> <td>${tecnologia.getNombre()}</td>
<td><a href="/tecnologia/${tecnologia.id}"><i class="bi bi-pencil-fill"></i></a></td>
</tr>
</c:forEach>
</tbody>
</tbody>
</table> </table>
</div>
<div class="card-footer">
<div>
<nav aria-label="Page navigation example">
<ul class="pagination">
<c:forEach begin="1" end="${pages}" var="nro">
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li>
</c:forEach>
</ul>
</nav>
</div> </div>
</div> </div>
<div class="card-footer">
<div>
<nav aria-label="Page navigation example">
<ul class="pagination">
<c:forEach begin="1" end="${pages}" var="nro">
<li class="page-item ${(param.nroPagina == null and nro == 1) or param.nroPagina == nro-1 ? 'active' : ''}"><a class="page-link" href="javascript:buscarPagina(${nro})">${nro}</a></li>
</c:forEach>
</ul>
</nav>
</div>
</div>
</div>
</div> </div>
......
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