atributosegreso_plan.php 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. <?php
  2. require_once("../include/constantes.php");
  3. require_once("../include/bd_pdo.php");
  4. require_once("../classes/ValidaSesion.php");
  5. require_once("../classes/MainMenu.php");
  6. $menu = 27;
  7. $submenu = 277;
  8. //--- Objeto para validar usuario. El id de usuario lo lee desde sesión
  9. $objSesion = new ValidaSesion($pdo, $submenu, APSA);
  10. if(!$objSesion->tieneAcceso()){
  11. $objSesion->terminaSesion();
  12. }
  13. $objSesion->validaPeriodoUsuario();//si no tiene periodo manda a main
  14. //Obtiene plan de estudios
  15. $stmt = $pdo->prepare('Select * from fs_planestudio(:nivel, NULL, NULL, true, NULL, NULL) WHERE "Carrera_esComun" IS NOT true');
  16. $stmt->bindParam(":nivel", $_SESSION["nivel_id"]);
  17. if(!$stmt->execute()){
  18. print_r($stmt->errorInfo());
  19. $errorDesc = "Ocurrió un error al cargar los planes de estudios";
  20. }else
  21. $plan_rs = $stmt->fetchAll();
  22. $stmt->closeCursor();
  23. $stmt = null;
  24. if(count($plan_rs) == 0){
  25. header("Location: planestudios.php?error=4");
  26. exit();
  27. }
  28. function recorta($texto, $tam){
  29. $cortado = substr($texto, 0, $tam);
  30. $pos = strrpos($cortado, " ");
  31. return substr($cortado, 0, $pos);
  32. }
  33. ?>
  34. <!DOCTYPE html>
  35. <html lang="es" prefix="og: http://ogp.me/ns#">
  36. <head>
  37. <title>APSA - Facultad de Ingeniería</title>
  38. <meta charset="utf-8">
  39. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  40. <link rel="icon" type="image/png" href="../img/favicon.png" />
  41. <link rel="stylesheet" href="../css/bootstrap-ulsa.min.css" type="text/css">
  42. <link rel="stylesheet" href="../css/indivisa.css" type="text/css">
  43. <link rel="stylesheet" href="../css/sgi.css?rand=<?php echo rand();?>" type="text/css">
  44. <link rel="stylesheet" href="../css/fa_all.css" type="text/css">
  45. <link rel="stylesheet" href="../css/jquery-ui.css" type="text/css">
  46. <link rel="stylesheet" href="./css/mapacurricular.css" type="text/css">
  47. <script src="../js/util.js"></script>
  48. </head>
  49. <body>
  50. <div>
  51. <?php
  52. function getRGBA_color($hex, $nivel){
  53. list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
  54. $style = "rgba($r,$g, $b,";
  55. $a = 1.0;
  56. switch($nivel){
  57. case 0: $a = 0.15; break;
  58. //case 1: $a = 0.32; break;
  59. //case 2: $a = 0.48; break;
  60. case 3: $a = 0.50; break;
  61. //case 4: $a = 0.80; break;
  62. }
  63. $style .= "$a)";
  64. return $style;
  65. }
  66. //--- Objeto que pinta menu
  67. $menuObj = new MainMenu($_SESSION["usuario_id"], $menu, $pdo, APSA, "Atributos de egreso por plan");//usr, menu, pdo, sist
  68. $menuObj->printMenu();
  69. //Obtiene materias y sus planes
  70. if(isset($_POST["plan"]) && is_numeric($_POST["plan"])){
  71. $filter_plan = filter_input(INPUT_POST, "plan", FILTER_SANITIZE_NUMBER_INT);//limpia texto
  72. //Obtiene atributo
  73. $stmt = $pdo->prepare('Select * from fs_atributoegreso(:plan, NULL)');
  74. $stmt->bindParam(":plan", $filter_plan);
  75. if(!$stmt->execute()){
  76. $errorDesc = "Ocurrió un error al cargar los atributos";
  77. }else{
  78. $atributo_rs = $stmt->fetchAll();
  79. }
  80. $stmt->closeCursor();
  81. //Obtiene niveles de atributos de egreso
  82. $stmt = $pdo->prepare('Select * from fs_atributoegreso_nivel(NULL)');
  83. if(!$stmt->execute()){
  84. //print_r($stmt->errorInfo());
  85. $errorDesc = "Ocurrió un error al cargar los atribuos de egreso";
  86. }else{
  87. $nivel_rs = $stmt->fetchAll();
  88. }
  89. $stmt->closeCursor();
  90. $stmt = null;
  91. //Obtiene mapa
  92. $stmt = $pdo->prepare('Select * from fs_planestudio_atributoegreso(:plan, :usr)');
  93. $stmt->bindParam(":plan", $filter_plan);
  94. $stmt->bindParam(":usr", $_SESSION["usuario_id"]);
  95. if(!$stmt->execute()){
  96. $errorDesc = "Ocurrió un error al cargar los grupos";
  97. }else{
  98. $materiasplan_rs = $stmt->fetchAll();
  99. $materiasArray = array();//Gruarda el RS formateado
  100. $id_old=0;
  101. $sem_old=0;
  102. /*
  103. {
  104. {sem1
  105. {nombre, clave, area, atributos=>{atributo1, atributo2} },
  106. {nombre, clave, area},
  107. },
  108. {sem2
  109. {nombre, clave, area},
  110. {nombre, clave, area},
  111. },
  112. }
  113. */
  114. $i=0;
  115. $semestreArr[] = array();
  116. foreach($materiasplan_rs as $row){
  117. if($id_old != $row["Materia_id"]){
  118. if($id_old != 0){
  119. $semestreArr[$i]["atributos"] = $atributoArr;
  120. $i++;
  121. }
  122. $id_old = $row["Materia_id"];
  123. $atributoArr = array();
  124. }
  125. if($sem_old != $row["Materia_semestre"]){//cambio de semestre
  126. if($sem_old != 0){
  127. $materiasArray[] = array("semestre"=> $sem_old, "materias"=>$semestreArr);
  128. }
  129. $sem_old = $row["Materia_semestre"];
  130. $semestreArr = array();//reiniciar para unevo semestre
  131. }
  132. //Si tiene atributo lo guarda
  133. $semestreArr[$i] = array("id"=>$row["Materia_id"], "nombre" => $row["Materia_desc"], "clave" => $row["Materia_clave"], "area"=>$row["Area_desc"], "editable"=>$row["Editable"], "atributos"=>array());
  134. if(!empty($row["AtributoEgreso_id"])){
  135. $atributoArr[] = array("num"=>$row["AtributoEgreso_id"], "desc"=>$row["AtributoEgreso_desc"],
  136. "nivel"=>$row["AtributoNivel_id"], "nivel_desc"=>$row["AtributoNivel_desc"], "color"=>getRGBA_color($row["AtributoEgresoGeneral_color"], $row["AtributoNivel_id"]));
  137. }
  138. }
  139. if($id_old != 0){
  140. $semestreArr[$i]["atributos"] = $atributoArr;
  141. }
  142. if($sem_old != 0){
  143. $materiasArray[] = array("semestre"=> $sem_old, "materias"=>$semestreArr);
  144. }
  145. }
  146. $stmt->closeCursor();
  147. }
  148. //--Manejo de errores y mensajes de exito
  149. if(isset($_GET["error"]) && is_numeric($_GET["error"])){
  150. switch ($_GET["error"]){
  151. case 0: $errorDesc = "No se reciberon los datos del grupo."; break;
  152. case 1: $errorDesc = "Ocurrió un error al insertar los datos del grupo."; break;
  153. case 2: $errorDesc = "Ocurrió un error al actualizar los datos del grupo."; break;
  154. case 3: $errorDesc = "No tienes permisos para realizar esa acción."; break;
  155. case 4: $errorDesc = "Ocurrió un error al cargar los datos grupos."; break;
  156. case 5: $errorDesc = "No existen grupos para el periodo. Primero debes crear grupos en esta sección."; break;
  157. case 6: $errorDesc = "El grupo que buscas no existe. Consulta la lista de grupos disponibles en esta sección."; break;
  158. }
  159. }
  160. if(isset($_GET["ok"]) && is_numeric($_GET["ok"])){
  161. switch ($_GET["ok"]){
  162. case 0: $successDesc = "Los atributos se guardaron correctamente."; break;
  163. case 1: $successDesc = "Los atributo se actualizaron correctamente."; break;
  164. }
  165. }
  166. ?>
  167. <div class="container-fluid pt-4 marco">
  168. <?php include_once("../include/errorMessage.php");?>
  169. <?php
  170. if(isset($plan_rs)){
  171. ?>
  172. <!-- Filtro -->
  173. <div class="row">
  174. <div class="col-12">
  175. <form action="atributosegreso_plan.php" method="post">
  176. <div class="form-box form-box-info">
  177. <div class="form-group row">
  178. <label for="filter_plan" class="col-4 col-form-label">Plan de estudios</label>
  179. <div class="col-8 col-sm-6">
  180. <div class="datalist datalist-select mb-1 w-100">
  181. <div class="datalist-input">Selecciona un plan</div>
  182. <span class="ing-buscar icono"></span>
  183. <ul style="display:none">
  184. <li data-id="">Selecciona un plan</li>
  185. <?php foreach($plan_rs as $plan) {?>
  186. <li data-id="<?php echo $plan["PlanEstudio_id"];?>" <?php if(isset($filter_plan) && $filter_plan == $plan["PlanEstudio_id"]){echo "class='selected'";}?> ><?php echo $plan["Carrera_desc"]." - ".$plan["PlanEstudio_desc"];?></li>
  187. <?php }?>
  188. </ul>
  189. <input type="hidden" id="filter_plan" name="plan" value="">
  190. </div>
  191. </div>
  192. </div>
  193. </div>
  194. <div class="form-group row">
  195. <div class="col-12 text-center">
  196. <button type="submit" class="btn btn-outline-primary"><?php echo $ICO["buscar"]; ?> Consultar</button>
  197. </div>
  198. </div>
  199. </form>
  200. </div>
  201. </div>
  202. </div>
  203. <main class="container-fluid content">
  204. <?php if(empty($materiasplan_rs) || count($materiasplan_rs)==0){ ?>
  205. <h3 class="text-center text-warning"><?php echo $ICO["alerta"];?> Selecciona un plan de estudios</h3>
  206. <?php } else {?>
  207. <div class="row mb-4 bg-info">
  208. <div class="col-sm-9">
  209. <div class="row">
  210. <div class="col-12">
  211. <p class="alert-heading py-2">
  212. <a class="d-block collapsed" data-toggle="collapse" href="#avanzadoBox" role="button" aria-expanded="false" aria-controls="collapseExample">
  213. <strong class="mx-4">Atributos de egreso</strong><i class="ing-caret ing-fw"></i></a>
  214. </p>
  215. </div>
  216. <div class="col-12 collapse px-5" id="avanzadoBox">
  217. <div class="row">
  218. <?php
  219. foreach($atributo_rs as $atributo){
  220. echo '<div class="col-sm-6"><span class="mr-5 text-80">';
  221. echo '<span class="badge mr-2 nivel5" style="color:#fff; background-color:'.$atributo["AtributoEgresoGeneral_color"].'"> Atributo '.$atributo["AtributoEgreso_id"].'</span>';
  222. echo $atributo["AtributoEgreso_desc"]."</span></div>";
  223. }
  224. ?>
  225. </div>
  226. <div class="row mt-3">
  227. <div class="col-12">
  228. <hr/>
  229. <p class="mb-1"><strong>Niveles</strong></p>
  230. <ul class="list-inline atributo-list text-80">
  231. <li class="list-inline-item mr-3">Los niveles de cumplimiento se indican a través de la intensidad del color: </li>
  232. <?php foreach($nivel_rs as $nivel){ ?>
  233. <li class="list-inline-item">
  234. <span class="badge nivel<?php echo $nivel["AtributoNivel_id"];?>" style="background-color:<?php echo getRGBA_color("#001D68", $nivel["AtributoNivel_id"]);?>"><?php echo "Nivel ".$nivel["AtributoNivel_desc"];?></span>
  235. </li>
  236. <?php } ?>
  237. </ul>
  238. </div>
  239. </div>
  240. </div>
  241. </div>
  242. </div>
  243. <div class="col-sm-3 pt-2">
  244. <select id="filter_atributo" class="form-control">
  245. <option value="0">Mostrar todos los atributos</option>
  246. <?php foreach($atributo_rs as $atributo) {?>
  247. <option value="<?php echo $atributo["AtributoEgreso_id"];?>">Mostrar solo atributo <?php echo $atributo["AtributoEgreso_id"];?></option>
  248. <?php }?>
  249. </select>
  250. </div>
  251. </div>
  252. <div class="row ">
  253. <div class="col-12">
  254. <div class="d-flex align-items-start" style="overflow-x: auto;">
  255. <?php
  256. foreach($materiasArray as $semestre){
  257. ?>
  258. <div class="d-flex flex-column flex-mismo-ancho">
  259. <div class="d-flex flex-mismo-ancho semestre">
  260. <p class="text-center font-weight-bold text-primary text-uppercase w-100"><span class="text-danger"><?php echo $semestre["semestre"]; ?>.</span> semestre</p>
  261. </div>
  262. <?php foreach($semestre["materias"] as $materia){
  263. $clase = "";
  264. if(!empty($materia["atributos"]) && count($materia["atributos"])>0){
  265. foreach($materia["atributos"] as $atr){
  266. $clase.= "atr-".$atr["num"]." ";
  267. }
  268. }else{
  269. $clase = "sin-atributos";
  270. }
  271. ?>
  272. <div class="d-flex flex-mismo-ancho bloque-materia <?php echo $clase;?>" id="mat<?php echo $materia["id"]; ?>">
  273. <div class="menu-wrapper w-100">
  274. <p class="materia-titulo"><?php echo $materia["nombre"];?></p>
  275. <p class="mb-2"><b>Clave:</b> <?php echo $materia["clave"];?><br>
  276. <b>Área:</b> <?php echo $materia["area"];?></p>
  277. <ul class="list-inline atributo-list">
  278. <?php if(!empty($materia["atributos"]) && count($materia["atributos"])>0){?>
  279. <?php foreach($materia["atributos"] as $atr){ ?>
  280. <li class="list-inline-item">
  281. <span class="badge nivel<?php echo $atr["nivel"];?>" style="background-color:<?php echo $atr["color"];?>" data-toggle="tooltip" data-placement="top" data-html="true" title="<b>Atributo <?php echo $atr["num"];?></b><br><?php echo $atr["nivel_desc"];?>">AE <?php echo $atr["num"];?></span>
  282. </li>
  283. <?php } ?>
  284. <?php } ?>
  285. </ul>
  286. <div class="menu-flotante d-none" data-id="<?php echo $materia["id"]; ?>">
  287. <span class="float-right iconos">
  288. <span class="ing-buscar ing-fw bloque-ver mx-1" aria-hidden="true" title="Ver detalle"></span>
  289. <?php if($materia["editable"] || $_SESSION["sgi_administrador"]){?>
  290. <span class="ing-editar ing-fw bloque-edita mx-1" aria-hidden="true" title="Editar atributos"></span>
  291. <?php } ?>
  292. </span>
  293. </div>
  294. </div>
  295. </div>
  296. <?php }//termina materias ?>
  297. </div>
  298. <?php }//termina semestres ?>
  299. </div>
  300. </div>
  301. </div>
  302. <?php }
  303. }?>
  304. </div>
  305. <!--- FOOTER--->
  306. <?php require_once("../include/footer.php"); ?>
  307. <?php if($objSesion->puedeEditar()){ ?>
  308. <!-- Modal -->
  309. <div class="modal fade" id="modalVer" tabindex="-1" role="dialog" aria-labelledby="modalVer" aria-hidden="true">
  310. <div class="modal-dialog modal-dialog-centered modal-lg" role="document">
  311. <div class="modal-content">
  312. <div class="modal-header">
  313. <h4 class="col-12 modal-title text-center"><span id="modalLabel">Detalles de Materia</span>
  314. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  315. <span aria-hidden="true">&times;</span>
  316. </button></h4>
  317. </div>
  318. <div class="modal-body pb-0">
  319. <div class="row">
  320. <div class="col-4"><p><strong>Clave:</strong> <span class="mat-clave"></span></p></div>
  321. <div class="col-4 text-center"><p><strong>Semestre:</strong> <span class="mat-sem"></span></p></div>
  322. </div>
  323. <div class="row bg-info pt-3">
  324. <div class="col-4"><p><strong>Área:</strong> <span class="mat-area"></span></p></div>
  325. <div class="col-4 text-center"><p><strong>Horas de clase:</strong> <span class="mat-horasclase"></span></p></div>
  326. </div>
  327. <div class="row pt-3" id="mat-atributos-block">
  328. <div class="col-4 text-center barra-right"><p><strong>Atributos de egreso:</strong></div>
  329. <div class="col-8 text-left" id="mat-atributos"></div>
  330. </div>
  331. <!-- <div class="row">
  332. <div class="col-6 mt-4" id="relacionadas-block">
  333. <p><strong>Materias relacionadas:</strong></p>
  334. <ul class="relacionada m-0"></ul>
  335. </div>
  336. <div class="col-6 mt-4" id="submaterias-block">
  337. <p><strong><span class="mat-tipo"></span></strong></p>
  338. <ul class="submateria m-0"></ul>
  339. </div>
  340. </div> -->
  341. <div class="bg-primary text-white pt-2 px-4 mt-4" style="margin-left: -16px; margin-right: -16px;">
  342. <div class="row">
  343. <div class="col text-right ">
  344. <h5 class="mat-plan"></h5>
  345. </div>
  346. </div>
  347. </div>
  348. </div>
  349. </div>
  350. </div>
  351. </div>
  352. <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  353. <div class="modal-dialog modal-dialog-centered" role="document">
  354. <div class="modal-content">
  355. <div class="modal-header">
  356. <h4 class="col-12 modal-title text-center">Editar Atributos
  357. <button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
  358. <span aria-hidden="true">&times;</span>
  359. </button></h4>
  360. </div>
  361. <div class="modal-body">
  362. <form action="" method="post" id="formaModal">
  363. <input type="hidden" name="mat_id" id="mat_id">
  364. <div class="row">
  365. <div class="col-12">
  366. <table class="table table-sm table-borderless">
  367. <thead class="table-dark">
  368. <tr>
  369. <th style="width:60%">Atributo</th>
  370. <th style="width:30%">Nivel</th>
  371. <th>&nbsp;</th>
  372. </tr>
  373. </thead>
  374. <tbody id="atributo-list">
  375. <tr>
  376. <td>
  377. <select name="atributo[]" class="form-control form-control-sm atributo_select">
  378. <option value="0">- Sin atributo -</option>
  379. <?php foreach($atributo_rs as $atributo){?>
  380. <option value="<?php echo $atributo["AtributoEgreso_id"];?>"><?php echo $atributo["AtributoEgreso_id"]."- ".recorta($atributo["AtributoEgreso_desc"], 50);?>...</option>
  381. <?php } ?>
  382. </select>
  383. </td>
  384. <td>
  385. <select name="nivel[]" class="form-control form-control-sm nivel_select">
  386. <?php foreach($nivel_rs as $nivel){?>
  387. <option value="<?php echo $nivel["AtributoNivel_id"];?>"><?php echo $nivel["AtributoNivel_desc"];?></option>
  388. <?php } ?>
  389. </select>
  390. </td>
  391. <td class="text-center"><button type="button" class="btn btn-sm btn-outline-danger borra-atributo" title="Quitar atributo"><?php echo $ICO["borrar2"];?></button></td>
  392. </tr>
  393. </tbody>
  394. </table>
  395. </div>
  396. </div>
  397. <div class="row mb-5">
  398. <div class="col-6 pl-4">
  399. <button type="button" class="btn btn-outline-primary btn-block" id="agrega-atributo"><?php echo $ICO["mas"];?> Agregar atributo</button>
  400. </div>
  401. </div>
  402. <div class="form-group row">
  403. <div class="offset-4 col-8">
  404. <button type="button" class="btn btn-outline-primary" id="submitBtn" data-tipo="1"><?php echo $ICO["aceptar"];?> Guardar</button>
  405. <button type="reset" class="btn btn-outline-danger" data-dismiss="modal"><?php echo $ICO["cancelar"];?> Cancelar</button>
  406. </div>
  407. </div>
  408. </form>
  409. </div>
  410. </div>
  411. </div>
  412. </div>
  413. <div class="modal fade" id="modal_confirm" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
  414. <div class="modal-dialog modal-dialog-centered" role="document">
  415. <div class="modal-content">
  416. <div class="modal-body">
  417. <div class="row">
  418. <div class="col">
  419. <p class="font-weight-bold">¿Estás seguro de que quieres borrar el grupo?</p>
  420. <p>Esta acción no se puede deshacer.</p>
  421. </div>
  422. </div>
  423. </div>
  424. <div class="modal-footer">
  425. <input type="hidden" id="id_borrar" value="">
  426. <button type="button" class="btn btn-outline-primary btn-borrar"><?php echo $ICO["aceptar"];?> Borrar</button>
  427. <button type="button" class="btn btn-outline-danger" data-dismiss="modal" aria-label="Close"><?php echo $ICO["cancelar"];?> Cancelar</button>
  428. </div>
  429. </div>
  430. </div>
  431. </div>
  432. <?php } ?>
  433. </div>
  434. <script src="../js/jquery.min.js"></script>
  435. <script src="../js/jquery-ui.js"></script>
  436. <script src="../js/datepicker-es.js"></script>
  437. <script src="../js/bootstrap/popper.min.js"></script>
  438. <script src="../js/bootstrap/bootstrap.min.js"></script>
  439. <script src="../js/fechas.js"></script>
  440. <script src="../js/sidebarmenu.js"></script>
  441. <script src="../js/datalist.js"></script>
  442. <script>
  443. $(function () {
  444. $('[data-toggle="tooltip"]').tooltip()
  445. })
  446. </script>
  447. <?php if($objSesion->puedeEditar() && isset($filter_plan)){ ?>
  448. <script>
  449. $(document).on( "mouseenter", ".menu-wrapper", function(){
  450. $(this).find('.menu-flotante').removeClass('d-none');
  451. });
  452. $(document).on( "mouseleave", ".menu-wrapper", function(){
  453. $(this).find('.menu-flotante').addClass('d-none');
  454. });
  455. $(document).on( "click", ".bloque-edita", function(event){
  456. var cid= $(this).parents(".menu-flotante").data("id");
  457. $("#mat_id").val(cid);
  458. $.ajax({
  459. url: './action/atributomateria_select.php',
  460. type: 'POST',
  461. dataType: 'json',
  462. data: { mat: cid },
  463. success: function(result) {
  464. if(result["error"]!= "" && result["error"] !== undefined){
  465. $("#errorBox").collapse('show');
  466. $("#errorBox_text").html(result["error"]);
  467. $('#messageBox')[0].scrollIntoView({ block: "end" });
  468. }else{
  469. while($('#atributo-list tr').length > 1){
  470. $("#atributo-list tr:last-child").remove();
  471. }
  472. if(result["atributoArr"].length > 0){
  473. for(var i=0; i<result["atributoArr"].length; i++){
  474. var cloned;
  475. if(i==0){
  476. cloned = $("#atributo-list tr:first-child");
  477. }else{
  478. cloned = $("#atributo-list tr:first-child").clone(true).appendTo("#atributo-list");
  479. }
  480. cloned.find(".atributo_select").val(result["atributoArr"][i]["id"]);
  481. cloned.find(".nivel_select").val(result["atributoArr"][i]["nivel"]);
  482. }
  483. }else{
  484. $("#atributo-list .atributo_select").get(0).selectedIndex = 0;
  485. $("#atributo-list .nivel_select").get(0).selectedIndex = 0;
  486. }
  487. hideBorraAtributo();
  488. $('#modal').modal('show');
  489. }
  490. },
  491. error: function(jqXHR, textStatus, errorThrown ){
  492. $("#modal").modal('hide');
  493. $("#errorBox").collapse('show');
  494. $("#errorBox_text").html(errorThrown);
  495. $('#messageBox')[0].scrollIntoView({ block: "end" });
  496. }
  497. });//ajax
  498. $('#modal').modal('show');
  499. });
  500. $(document).on( "click", ".bloque-ver", function(event){
  501. var cid = $(this).parents(".menu-flotante").data("id");
  502. $.ajax({
  503. url: './action/materia_select.php',
  504. type: 'POST',
  505. dataType: 'json',
  506. data: { id: cid },
  507. success: function(result) {
  508. if(result["error"]!= "" && result["error"] !== undefined){
  509. $("#errorBox").collapse('show');
  510. $("#errorBox_text").html(result["error"]);
  511. $('#messageBox')[0].scrollIntoView({ block: "end" });
  512. }else{
  513. $("#modalVer").find("#modalLabel").html(result["desc"]);
  514. $("#modalVer").find(".mat-area").html(result["area"]);
  515. $("#modalVer").find(".mat-plan").html(result["plan"]);
  516. $("#modalVer").find(".mat-clave").html(result["clave"]);
  517. $("#modalVer").find(".mat-sem").html(result["sem"]);
  518. $("#modalVer").find(".mat-horasclase").html(result["horas_clase"]);
  519. //$("#modal").find(".mat-horaslab").html(result["horas_lab"]);
  520. if(result["total_atributos"] > 0){
  521. $("#mat-atributos-block").removeClass("d-none");
  522. var html = "";
  523. for(var i=0; i < result["atributosArr"].length; i++){
  524. html+="<p><span class='badge text-white' style='background-color:"+result["atributosArr"][i]["color"]+"'>Atributo "+result["atributosArr"][i]["num"]+"</span> <i>"+result["atributosArr"][i]["nivel"]+"</i><br> <small>"+result["atributosArr"][i]["desc"]+"</small></p>";
  525. }
  526. $("#mat-atributos").html(html);
  527. }else{
  528. $("#mat-atributos-block").addClass("d-none");
  529. $("#mat-atributos").html("");
  530. }
  531. $('#modalVer').modal('show');
  532. }
  533. },
  534. error: function(jqXHR, textStatus, errorThrown ){
  535. $("#modal").modal('hide');
  536. $("#errorBox").collapse('show');
  537. $("#errorBox_text").html(errorThrown);
  538. $('#messageBox')[0].scrollIntoView({ block: "end" });
  539. }
  540. });//ajax
  541. });
  542. function hideBorraAtributo(){
  543. var total = $("#atributo-list >tr").length;//cuenta renglones actuales
  544. if(total == 1){
  545. $('.borra-atributo').hide();
  546. }else{
  547. $('.borra-atributo').show();
  548. }
  549. }
  550. function atributoHTML(num, desc, nivel, color){
  551. return '<li class="list-inline-item"> \
  552. <span class="badge nivel'+nivel+'" style="background-color:'+color+'" data-toggle="tooltip" data-placement="top" data-html="true" title="<b>Atributo '+num+'</b><br>'+desc+'">AE '+num+'</span> \
  553. </li>';
  554. }
  555. $(document).ready(function(){
  556. setDatalistFirst("#plan");
  557. $("#filter_atributo option:first-child").prop("selected", true);
  558. hideBorraAtributo();
  559. $("#filter_atributo").change(function(){
  560. var id_ver = $(this).val();
  561. if(id_ver == 0){
  562. $(".bloque-materia").removeClass("oculto");
  563. }else{
  564. $(".bloque-materia").addClass("oculto");
  565. $(".atr-"+id_ver).removeClass("oculto");
  566. }
  567. });
  568. $("#agrega-atributo").click(function(){
  569. var cloned = $("#atributo-list >tr:first-child").clone(true).appendTo("#atributo-list");
  570. cloned.find('select').get(0).selectedIndex = 0;
  571. hideBorraAtributo();
  572. });
  573. $(".borra-atributo").click(function(){//quita profesor
  574. $(this).parents("tr").remove();
  575. hideBorraAtributo();
  576. });
  577. $("#submitBtn").click(function(){
  578. //Valida que no estén repetidos
  579. var atributosArr=[];
  580. var atributosObj = [];
  581. var error = false;
  582. $('#atributo-list tr .is-invalid').removeClass("is-invalid");
  583. $.each($('#atributo-list tr .atributo_select'), function(){
  584. if(atributosArr.includes($(this).val())){
  585. $(this).addClass("is-invalid");
  586. error = true;
  587. }else{
  588. atributosArr.push($(this).val());
  589. }
  590. });
  591. if(!error){
  592. $.each($('#atributo-list tr'), function(){
  593. atributosObj.push({"id":$(this).find(".atributo_select").val(), "nivel":$(this).find(".nivel_select").val(),});
  594. });
  595. //Actualiza en BD
  596. $.ajax({
  597. url: './action/atributomateria_update.php',
  598. type: 'POST',
  599. dataType: 'json',
  600. data: { "plan": <?php echo $filter_plan;?>, "mat": $("#mat_id").val(), "atributos": atributosObj },
  601. success: function(result) {
  602. if(result["error"]!= "" && result["error"] !== undefined){
  603. $("#errorBox").collapse('show');
  604. $("#errorBox_text").html(result["error"]);
  605. $('#messageBox')[0].scrollIntoView({ block: "end" });
  606. }else{
  607. //Quita atributos
  608. var lista = $("#mat"+$("#mat_id").val()+" .atributo-list");
  609. lista.html("");
  610. if(result["atributosArr"].length > 0){
  611. for(var i=0; i < result["atributosArr"].length; i++){
  612. lista.append(atributoHTML(result["atributosArr"][i]["id"], result["atributosArr"][i]["desc"], result["atributosArr"][i]["nivel"], result["atributosArr"][i]["color"]));
  613. }
  614. }
  615. }
  616. $('#modal').modal('hide');
  617. },
  618. error: function(jqXHR, textStatus, errorThrown ){
  619. $("#modal").modal('hide');
  620. $("#errorBox").collapse('show');
  621. $("#errorBox_text").html(errorThrown);
  622. $('#messageBox')[0].scrollIntoView({ block: "end" });
  623. $('#modal').modal('hide');
  624. }
  625. });//ajax
  626. }
  627. });
  628. });
  629. </script>
  630. <?php } ?>
  631. </body>
  632. </html>