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

se agregaron los cambios de adecuacion al backend modificado, tambien el...

se agregaron los cambios de adecuacion al backend modificado, tambien el cambio a la estructura de las convocatorias y los cargos
parent bc9b5e49
......@@ -7,6 +7,9 @@ $gray-dark: #373a3c !default;
$btn-secondary-color: $gray-dark !default;
$btn-secondary-bg: #fff !default;
$btn-secondary-border: #ccc !default;
//textos personalizados
$state-danger-text: $brand-danger;
$state-success-text: $brand-success;
$icon-font-path: "../bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/";
@import '../bower_components/bootstrap-sass-official/vendor/assets/stylesheets/bootstrap';
$fa-font-path: "../bower_components/font-awesome/fonts";
......@@ -110,6 +113,8 @@ tags-input.primary .tags .tag-item {
border-radius: 4px;
}
//labels
//titulos
h4.color-primary {
......@@ -163,19 +168,22 @@ input[type=checkbox].with-font ~ label:before {
}
input[type=radio].with-font:checked ~ label:before,
input[type=checkbox].with-font:checked ~ label:before {
input[type=checkbox].with-font:checked ~ label:before {
content: "\f00c";
font-size: 1.2em;
color: $brand-primary;
letter-spacing: 5px;
}
input[type=checkbox].with-font ~ label:before {
content: "\f204";
}
input[type=checkbox].with-font:checked ~ label:before {
content: "\f205";
//color: darkgreen;
}
//input[type=radio].with-font:focus ~ label:before,
//input[type=checkbox].with-font:focus ~ label:before,
//input[type=radio].with-font:focus ~ label,
......
......@@ -8,20 +8,15 @@
this.modal = $uibModalInstance;
this.service = CalificacionService;
if (parametros.evaluacion.Calificacion._id) {
this.evaluacion = Object.assign({}, parametros.evaluacion);
this.evaluacionInicial = parametros.evaluacion;
}
else
this.evaluacion = parametros.evaluacion;
this.evaluacionInicial = parametros.evaluacion;
this.calificacion = Object.assign({}, parametros.evaluacion.Calificacion);
}
guardar(form) {
this.enviado = true;
if (form.$valid) {
if (!this.evaluacion.Calificacion._id) {
this.service.crear(this.evaluacion.Calificacion)
if (!this.calificacion._id) {
this.service.crear(this.calificacion)
.then(calificacion=> {
this.modal.close(calificacion)
})
......@@ -30,7 +25,7 @@
})
}
else {
this.service.editar(this.evaluacionInicial.Calificacion._id, this.evaluacion.Calificacion)
this.service.editar(this.evaluacionInicial.Calificacion._id, this.calificacion)
.then(calificacion=> {
this.modal.close(calificacion)
})
......
......@@ -7,13 +7,13 @@
<div class="row">
<div class="text-right" title="Evaluación">
<i class="fa fa-check-square-o fa-lg" title="Evaluacion"></i>
{{vm.evaluacion.nombre}} &nbsp;&nbsp;&nbsp;
{{vm.evaluacionInicial.nombre}} &nbsp;&nbsp;&nbsp;
</div>
</div>
<div class="row">
<div class="col-md-12">
<label>Calificación</label>
<input type="number" name="valor" class="form-control" ng-model="vm.evaluacion.Calificacion.valor" max="100"
<input type="number" name="valor" class="form-control" ng-model="vm.calificacion.valor" max="100"
required autofocus>
<p class="help-block" ng-show="form.valor.$error.required && vm.enviado">
Ingrese una calificación
......
......@@ -2,7 +2,7 @@
<div class="col-sm-5 col-md-4 col-xs-6">
<h3>Cargo - Convocatoria</h3>
</div>
<div class="col-sm-5 col-md-4 col-sm-offset-2">
<div class="col-sm-5 col-md-6 col-sm-offset-2">
<div class="pull-right">
<a class="btn btn-default header-button" ng-click="vm.estadoAnterior.go()">
<i class="fa fa-arrow-left"></i>
......@@ -20,7 +20,7 @@
<blockquote class="col-md-12 blockquote-primary">
<form class="form" name="form" novalidate>
<div class="row">
<div class="col-md-10">
<div class="col-md-12">
<label>Nombre</label>
<div class="input-group">
<input type="text" name="nombre" class="form-control" ng-model="vm.cargoConvocatoria.Cargo.nombre"
......
......@@ -15,6 +15,7 @@
url: appConfig.serverAddress + '/api/convocatorias/:id/cargosConvocatoria'
},
agregarCargos: {
isArray: true,
method: 'POST',
url: appConfig.serverAddress + '/api/convocatorias/:id/cargos'
},
......
......@@ -4,14 +4,17 @@
</div>
<div class="col-sm-5 col-md-4 col-sm-offset-2">
<div class="pull-right">
<a class="btn btn-default header-button" ng-click="vm.estadoAnterior.go()">
<i class="fa fa-arrow-left"></i>
Regresar
</a>
<a class="btn btn-primary header-button" ui-sref="migracionMoodle.categoria({entidadId:vm.entidadId, convocatoriaId:vm.convocatoriaId})">
<i class="fa fa-database"></i>
Migrar Datos Moodle
</a>
<div class="input-group">
<btn class="btn btn-default" ng-click="vm.estadoAnterior.go()">
<i class="fa fa-arrow-left"></i>
Regresar
</btn>
<btn class="btn btn-primary"
ui-sref="entidades.convocatorias.migrar({entidadId: vm.entidadId, convocatoriaId:vm.convocatoriaId})">
<i class="fa fa-database"></i>
Migrar Datos Moodle
</btn>
</div>
</div>
</div>
</div>
......
......@@ -63,11 +63,11 @@ angular.module('moduloPersonalApp')
controller: 'EtapaCtrl',
controllerAs: 'vm'
},
'evaluaciones': {
templateUrl: 'app/evaluaciones/evaluaciones.lista.html',
controller: 'EvaluacionCtrl',
controllerAs: 'vm'
},
// 'evaluaciones': {
// templateUrl: 'app/evaluaciones/evaluaciones.lista.html',
// controller: 'EvaluacionCtrl',
// controllerAs: 'vm'
// },
'cargos': {
templateUrl: 'app/cargosConvocatorias/cargosConvocatorias.lista.html',
controller: 'CargoConvocatoriaCtrl',
......@@ -75,6 +75,18 @@ angular.module('moduloPersonalApp')
}
}
})
.state('entidades.convocatorias.migrar', {
url: '/:convocatoriaId/migrar',
templateUrl: 'app/migracionMoodle/migracionMoodle.lista.html',
controller: 'MigracionMoodleCtrl',
controllerAs: 'vm'
})
.state('entidades.convocatorias.migrar.evaluaciones', {
url: '/:idCurso/evaluaciones',
templateUrl: 'app/migracionMoodle/evaluaciones/migracionMoodle.evaluaciones.html',
controller: 'MigracionMoodleEvaluacionCtrl',
controllerAs: 'vm'
})
.state('entidades.convocatorias.cargosConvocatoria', {
abstract: true,
url: '/:convocatoriaId/cargos',
......@@ -92,12 +104,12 @@ angular.module('moduloPersonalApp')
templateUrl: 'app/postulaciones/postulaciones.lista.html',
controller: 'PostulacionCtrl',
controllerAs: 'vm'
},
'evaluacionesCargosEtapas': {
templateUrl: 'app/evaluacionesCargosEtapas/evaluacionesCargosEtapas.lista.html',
controller: 'EvaluacionCargoEtapaCtrl',
controllerAs: 'vm'
}
// 'evaluacionesCargosEtapas': {
// templateUrl: 'app/evaluacionesCargosEtapas/evaluacionesCargosEtapas.lista.html',
// controller: 'EvaluacionCargoEtapaCtrl',
// controllerAs: 'vm'
// }
}
})
.state('entidades.convocatorias.cargosConvocatoria.cargos', {
......@@ -124,8 +136,7 @@ angular.module('moduloPersonalApp')
controllerAs: 'vm'
}
}
})
;
});
});
......@@ -2,7 +2,7 @@
'use strict';
class EtapaController {
constructor($stateParams, $uibModal, Modal, EtapaService, ConvocatoriaService) {
constructor($stateParams, $uibModal, Modal, EtapaService, ConvocatoriaService, EvaluacionService) {
this.errores = {}; // lista de errores
this.modal = $uibModal;
this.Modal = Modal;
......@@ -13,6 +13,7 @@
this.service = EtapaService;
this.convocatoriaService = ConvocatoriaService;
this.evaluacionService = EvaluacionService;
this.etapas = {count: 0};
......@@ -23,10 +24,53 @@
}
}
//region Evaluaciones
crearEvaluacion(etapa) {
this.modal.open({
templateUrl: 'app/evaluaciones/modals/evaluaciones.modal.html',
controller: 'EvaluacionCrearModalCtrl',
controllerAs: 'vm',
resolve: {parametros: {etapaId: etapa._id}}
}).result.then(evaluacion=> {
etapa.Evaluaciones.push(evaluacion);
this.alertas.push({
tipo: 'success',
mensaje: 'Se creo correctamente la evaluación ' + evaluacion.nombre
});
})
}
editarEvaluacion(evaluacion) {
this.modal.open({
templateUrl: 'app/evaluaciones/modals/evaluaciones.modal.html',
controller: 'EvaluacionEditarModalCtrl',
controllerAs: 'vm',
resolve: {parametros: {evaluacion: evaluacion}}
}).result.then(evl=> {
evaluacion = Object.assign(evaluacion, evl);
this.alertas.push({
tipo: 'success',
mensaje: 'Se edito correctamente la evaluación ' + evaluacion.nombre
});
})
}
eliminarEvaluacion(etapa, evaluacion) {
this.Modal.confirm.eliminar(evaluacion=> {
this.evaluacionService.eliminar(evaluacion._id).then(()=> {
etapa.Evaluaciones.splice(etapa.Evaluaciones.indexOf(evaluacion), 1);
this.alertas.push({tipo: 'danger', mensaje: 'La evaluación se elimino correctamente'});
});
})(evaluacion.nombre, evaluacion);
}
//endregion
cambiarPagina() {
let parametros = {pagina: this.paginaActual, elementos: 10};
let parametros = {pagina: this.paginaActual, elementos: 10, incluye: [{entidad: 'Evaluaciones'}]};
this.convocatoriaService.etapas(this.convocatoriaId, parametros)
.then(etapas=> {
console.log(etapas);
this.etapas = etapas;
this.etapas.rows = this.etapas.rows.sort((x, y)=>x.orden - y.orden);
})
......@@ -54,7 +98,7 @@
templateUrl: 'app/etapas/modals/etapas.modal.html',
controller: 'EtapaEditarModalCtrl',
controllerAs: 'vm',
resolve: {parametros: {etapa: etapa}}
resolve: {parametros: {etapa: etapa, etapas: this.etapas}}
}).result.then(etp=> {
etapa = Object.assign(etapa, etp);
this.alertas.push({
......
......@@ -22,44 +22,100 @@
<div ui-tree="vm.treeOptions">
<div ui-tree-nodes ng-model="vm.etapas.rows" class="list-group">
<div class="list-group-item" ng-repeat="etapa in vm.etapas.rows" ui-tree-node>
<div>
<div ng-init="colapsado=true">
<span class="pull-right">
<div class="btn-group">
<button type="button" class="btn btn-info-outline"
<button type="button" class="btn btn-info-outline btn-xs"
ng-click="vm.editar(etapa);$event.stopPropagation();console.log('editar');"><i
class="fa fa-edit fa-lg"></i></button>
<button type="button" class="btn btn-danger-outline"
<button type="button" class="btn btn-danger-outline btn-xs"
ng-click="vm.eliminar(etapa);$event.stopPropagation();">
<i class="fa fa-trash fa-lg"></i></button>
<button type="button" class="btn btn-primary-outline btn-xs"
ng-click="colapsado = !colapsado">
<i class="fa fa-lg" ng-class="{'fa-angle-up':!colapsado, 'fa-angle-down':colapsado}"></i></button>
</div>
</span>
<h4 class="list-group-item-heading" ui-tree-handle>{{etapa.nombre}}
<small>porcentajes:</small>
</h4>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: {{etapa.porcentajeMinimo}}%"
aria-valuenow="{{etapa.porcentajeMinimo}}">
{{etapa.porcentajeMinimo}} %
<h4 class="list-group-item-heading text-primary" ui-tree-handle>{{etapa.nombre}}</h4>
<div class="row">
<div class="col-sm-6">
<h4>
<small>porcentaje:</small>
</h4>
<div class="progress">
<div class="progress-bar progress-bar-primary progress-bar-striped" aria-valuenow="{{etapa.porcentaje}}"
style="width: {{etapa.porcentaje}}%">
{{etapa.porcentaje}} %
</div>
</div>
</div>
<div class="progress-bar progress-bar-primary progress-bar-striped" aria-valuenow="{{etapa.porcentaje}}"
style="width: {{etapa.porcentaje-etapa.porcentajeMinimo}}%">
{{etapa.porcentaje}} %
<div class="col-sm-6">
<h4>
<small>puntaje mínimo:</small>
</h4>
<div class="progress">
<div class="progress-bar progress-bar-danger progress-bar-striped"
aria-valuenow="{{etapa.puntajeMinimo}}" aria-valuemin="0" aria-valuemax="100"
style="width: {{etapa.puntajeMinimo}}%">
{{etapa.puntajeMinimo}} pts
</div>
<div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar"
aria-valuenow="{{100-etapa.puntajeMinimo}}" aria-valuemin="0" aria-valuemax="100"
style="width: {{100-etapa.puntajeMinimo}}%">
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="row">
<div class="col-sm-5 col-md-4 col-xs-6">
<h4>Evaluaciones
<button class="btn btn-xs btn-default" ng-disabled="true">
<span class="">{{etapa.Evaluaciones.length}}</span>
</button>
</h4>
</div>
<div class="col-sm-5 col-md-6 col-sm-offset-2">
<div class="pull-right">
<button class="btn btn-success-outline" ng-click="vm.crearEvaluacion(etapa)" type="button"><i
class="fa fa-plus fa-lg"></i>
Crear evaluación
</button>
</div>
</div>
</div>
<div uib-collapse="colapsado">
<table class="table table-hover">
<thead>
<tr>
<th>Nombre</th>
<th class="text-right">Opciones</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="evaluacion in etapa.Evaluaciones">
<td>{{evaluacion.nombre}}</td>
<td class="text-right">
<div class="btn-group" role="group">
<a class="btn btn-info-outline btn-xs" href="#" role="button"
ng-click="vm.editarEvaluacion(evaluacion)">
<i class="fa fa-edit fa-lg"></i>
</a>
<a class="btn btn-danger-outline btn-xs" href="#" role="button"
ng-click="vm.eliminarEvaluacion(etapa, evaluacion)">
<i class="fa fa-trash fa-lg"></i>
</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-10">
<uib-pagination
ng-hide="vm.etapas.count<10"
total-items="vm.etapas.count"
items-per-page="10"
max-size="8"
force-ellipses="true"
ng-model="vm.paginaActual"
ng-change="vm.cambiarPagina()"
next-text="Siguiente"
previous-Text="Anterior"></uib-pagination>
</div>
</blockquote>
......@@ -9,6 +9,8 @@
this.convocatoriaId = parametros.convocatoriaId;
this.etapas = parametros.etapas; // TODO validar con el porcentaje total de las otras etapas, esta validacion tambien se debe realizar en el servidor
this.porcentajeUtilizado = parametros.etapas.rows.map(x=>x.porcentaje).reduce((a, b)=>a + b);
console.log(this.porcentajeUtilizado);
this.service = EtapaService;
......
......@@ -10,6 +10,8 @@
this.service = EtapaService;
this.etapaInicial = parametros.etapa;
this.porcentajeUtilizado = parametros.etapas.rows.map(x=>x.porcentaje).reduce((a, b)=>a + b) - this.etapaInicial.porcentaje;
this.etapa = Object.assign({}, this.etapaInicial);
}
......
......@@ -8,7 +8,7 @@
<div class="col-md-10">
<label>Nombre</label>
<div class="">
<input type="text" class="form-control" name="nombre" ng-model="vm.etapa.nombre" required>
<input type="text" class="form-control" name="nombre" ng-model="vm.etapa.nombre" required autofocus placeholder="Nombre de la etapa">
<p class="help-block" ng-show="form.nombre.$error.required && vm.enviado">
Ingrese un nombre para la etapa
</p>
......@@ -17,24 +17,22 @@
<div class="col-md-10">
<label>Porcentaje</label>
<div class="">
<input type="number" class="form-control" name="porcentaje" ng-model="vm.etapa.porcentaje" max="100" required>
<input type="number" class="form-control" name="porcentaje" ng-model="vm.etapa.porcentaje"
max="{{100-vm.porcentajeUtilizado}}" required placeholder="Porcentaje asignado">
<p class="help-block" ng-show="form.porcentaje.$error.required && vm.enviado">
Asigne un porcentaje a la etapa
</p>
<p class="help-block" ng-show="form.porcentaje.$error.max">
El porcentaje asignado no puede ser mayor a 100
La suma de los porcentajes no puede ser mayor al 100 %
</p>
</div>
</div>
<div class="col-md-10">
<label>Porcentaje Mínimo</label>
<input type="number" name="porcentajeMinimo" class="form-control" ng-model="vm.etapa.porcentajeMinimo" required
max="{{vm.etapa.porcentaje}}">
<p class="help-block" ng-show="form.porcentajeMinimo.$error.required && vm.enviado">
Ingrese un porcentaje mínimo para que el postulante pueda pasar a la siguiente etapa
</p>
<p class="help-block" ng-show="form.porcentajeMinimo.$error.max">
El porcentaje mínimo no puede ser mayor que el porcentaje asignado
<label>Puntaje Mínimo</label>
<input type="number" name="puntajeMinimo" class="form-control" ng-model="vm.etapa.puntajeMinimo" required
max="100" placeholder="Puntaje mínimo de aprovación">
<p class="help-block" ng-show="form.puntajeMinimo.$error.required && vm.enviado">
Ingrese una calificacion minima para el postulante
</p>
</div>
</div>
......@@ -42,19 +40,21 @@
<p class="help-block">{{ vm.errores.otros}}</p>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: {{vm.etapa.porcentajeMinimo}}%"
aria-valuenow="{{vm.etapa.porcentajeMinimo}}">
{{vm.etapa.porcentajeMinimo}} %
</div>
<div class="progress-bar progress-bar-primary progress-bar-striped" aria-valuenow="{{vm.etapa.porcentaje}}"
style="width: {{vm.etapa.porcentaje-vm.etapa.porcentajeMinimo}}%">
{{vm.etapa.porcentaje}} %
</div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-danger" style="width: {{vm.etapa.puntajeMinimo}}%"
aria-valuenow="{{vm.etapa.puntajeMinimo}}">
{{vm.etapa.puntajeMinimo}} pts
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary-outline" type="submit"
ng-disabled="!(form.nombre.$dirty || form.porcentaje.$dirty || form.porcentajeMinimo.$dirty ) || form.$invalid">
ng-disabled="!(form.nombre.$dirty || form.porcentaje.$dirty || form.puntajeMinimo.$dirty ) || form.$invalid">
Guardar
</button>
<button class="btn btn-default" type="button" ng-click="vm.modal.dismiss()">Cancelar</button>
......
......@@ -7,11 +7,11 @@
this.errores = {};
this.modal = $uibModalInstance;
this.convocatoriaId = parametros.convocatoriaId;
this.etapaId = parametros.etapaId;
this.service = EvaluacionService;
this.evaluacion = {fk_convocatoria: this.convocatoriaId};
this.evaluacion = {fk_etapa: this.etapaId};
}
guardar(form) {
......
'use strict';
(()=> {
class MigracionMoodleEvaluacionController {
constructor($stateParams, $state, MigracionMoodleService) {
this.alertas = [];
this.service = MigracionMoodleService;
this.$state = $state;
this.entidadId = $stateParams.entidadId;
this.convocatoriaId = $stateParams.convocatoriaId;
this.idCurso = $stateParams.idCurso;
this.service.evaluaciones(this.idCurso)
.then(evaluaciones=> {
this.evaluaciones = evaluaciones;
})
}
migrar(form) {
this.enviado = true;
if (form.$valid) {
var evaluacionesIds = [];
Object.keys(this.evaluacionesSeleccionadas).forEach(key=> {
if (this.evaluacionesSeleccionadas[key])
evaluacionesIds.push(key)
});
this.service.migrarEvaluaciones(this.idCurso, {
idConvocatoria: this.convocatoriaId,
idsEvaluaciones: evaluacionesIds
})
.then(datos=> {
this.$state.go('entidades.convocatorias.editar', {
entidadId: this.entidadId,
convocatoriaId: this.convocatoriaId
});
})
.catch(err => {
this.errores.other = err.message;
});
}
}
}
angular.module('moduloPersonalApp')
.controller('MigracionMoodleEvaluacionCtrl', MigracionMoodleEvaluacionController);
})();
<div class="container">
<div class="row">
<div class="col-sm-3 col-md-3 col-xs-6">
<h4 class="color-primary">Examenes Moodle
<small><span class="label label-default">{{vm.totalElementos}}</span></small>
<h4 class="color-primary">Evaluaciones Moodle
<small><span class="label label-default">{{vm.evaluaciones.length}}</span></small>
</h4>
</div>
<div class="col-sm-7 col-md-5 col-sm-offset-2">
......@@ -14,53 +14,38 @@
</div>
</div>
</div>
<div class="col-md-10">
<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>
<div class="row">
<form class="form" name="form" ng-submit="vm.migrarDatos(form)" novalidate>
<div class="row">
<form class="form" name="form" ng-submit="vm.migrar(form)" novalidate>
<div class="table-responsive col-md-10">
<table class="table table-striped">
<thead>
<tr>
<th>id</th>
<th>Nombre</th>
<th>Introdución</th>
<th colspan="2" class="text-center">Opciones</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="examen in vm.examenes">
<td>{{examen.idExamen}}</td>
<td>{{examen.nombreExamen}}</td>
<td ng-bind-html="examen.introExamen">{{examen.introExamen}}</td>
<td class="text-center">
<input type="checkbox" ng-model="examen.checked" id="{{examen.idExamen}}" name="seleccionado" >
<tr ng-repeat="evaluacion in vm.evaluaciones">
<td>{{evaluacion.activityid}}</td>
<td>
<label for="{{evaluacion.activityid}}">
<input type="checkbox" ng-model="vm.evaluacionesSeleccionadas[evaluacion.activityid]"
id="{{evaluacion.activityid}}">
{{evaluacion.name}}
</label>
</td>
</tr>
</tbody>
</table>
</div>
<uib-pagination
ng-hide="vm.totalElementos < 1000"
total-items="vm.totalElementos"
items-per-page="10"
max-size="8"
force-ellipses="true"
ng-model="vm.paginaActual"
ng-change="vm.cambiarPagina()"
next-text="Siguiente"
previous-Text="Anterior"></uib-pagination>
<div class="col-md-10">
<div class="pull-right">
<button class="btn btn-primary-outline" type="submit" ng-disabled="!(examen.checked!=1)">
Migrar Datos
</button>
</div>
<div class="col-md-10">
<div class="pull-right">
<button class="btn btn-primary-outline" type="submit" ng-disabled="!vm.evaluacionesSeleccionadas">
<i class="fa fa-lg fa-ex-left"></i>
Migrar
</button>
</div>
</form>
</div>
</div>
</form>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-sm-3 col-md-3 col-xs-6">
<h4 class="color-primary">Categorias Moodle
<small><span class="label label-default">{{vm.totalElementos}}</span></small>
</h4>
</div>
</div>
<div class="col-md-10">
<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>
<div class="row">
<div class="table-responsive col-md-10">
<table class="table table-striped">
<thead>
<tr>
<th><a href="">id</a></th>
<th><a href="" ng-click="vm.ordenar('nombres')">Nombre</a></th>
<th colspan="2" class="text-center">Opciones</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="categoria in vm.categorias">
<td>{{categoria.idCategoria}}</td>
<td>{{categoria.nombreCategoria}}</td>
<td class="text-center">
<div class="btn-group" role="group">
<a class="btn btn-success-outline btn-xs" href="#" role="button" ui-sref="migracionMoodle.curso({idCategoria:categoria.idCategoria})">
<i class="fa fa-lg fa-clone"></i>
Cursos
</a>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<uib-pagination
ng-hide="vm.totalElementos < 100"
total-items="vm.totalElementos"
items-per-page="10"
max-size="8"
force-ellipses="true"