Browse Source

Cleaned all GUI

Drowsito 3 weeks ago
parent
commit
c017f14232
53 changed files with 0 additions and 11412 deletions
  1. 0 77
      src/main/resources/templates/401.html
  2. 0 200
      src/main/resources/templates/adminAcredita.html
  3. 0 597
      src/main/resources/templates/adminCalendar.html
  4. 0 134
      src/main/resources/templates/adminInstances.html
  5. 0 351
      src/main/resources/templates/adminProcedures.html
  6. 0 155
      src/main/resources/templates/adminStats.html
  7. 0 425
      src/main/resources/templates/adminTemplateEditor.html
  8. 0 152
      src/main/resources/templates/adminTemplateTest.html
  9. 0 204
      src/main/resources/templates/adminTemplates.html
  10. 0 240
      src/main/resources/templates/adminTemplates2.html
  11. 0 0
      src/main/resources/templates/blank.html
  12. 0 32
      src/main/resources/templates/components/form_new_manager.html
  13. 0 224
      src/main/resources/templates/components/form_procedure.html
  14. 0 9
      src/main/resources/templates/components/form_procedure_remove_confirm.html
  15. 0 113
      src/main/resources/templates/components/form_procedure_task.html
  16. 0 29
      src/main/resources/templates/components/form_template.html
  17. 0 107
      src/main/resources/templates/components/form_templates_indicators.html
  18. 0 46
      src/main/resources/templates/components/list_managers.html
  19. 0 2
      src/main/resources/templates/components/selector_centres.html
  20. 0 1
      src/main/resources/templates/components/selector_cursos.html
  21. 0 1
      src/main/resources/templates/components/selector_evidencies.html
  22. 0 1
      src/main/resources/templates/components/selector_processos.html
  23. 0 2
      src/main/resources/templates/components/selector_titulacions.html
  24. 0 1
      src/main/resources/templates/components/selector_titulacions_managers.html
  25. 0 31
      src/main/resources/templates/components/templates.html
  26. 0 54
      src/main/resources/templates/components/templates_indicators.html
  27. 0 161
      src/main/resources/templates/dashboard.html
  28. 0 863
      src/main/resources/templates/dashboardCentre.html
  29. 0 1178
      src/main/resources/templates/dashboardTitulacio.html
  30. 0 779
      src/main/resources/templates/dashboardUniversitat.html
  31. 0 350
      src/main/resources/templates/dataConsolidate.html
  32. 0 351
      src/main/resources/templates/dataCurrent.html
  33. 0 602
      src/main/resources/templates/dataImport.html
  34. 0 101
      src/main/resources/templates/error.html
  35. 0 49
      src/main/resources/templates/home.html
  36. 0 84
      src/main/resources/templates/indicators.html
  37. 0 97
      src/main/resources/templates/layouts/common.html
  38. 0 68
      src/main/resources/templates/layouts/sidebar.back.html
  39. 0 69
      src/main/resources/templates/layouts/sidebar.html
  40. 0 122
      src/main/resources/templates/login.html
  41. 0 108
      src/main/resources/templates/mailing.html
  42. 0 259
      src/main/resources/templates/managers.html
  43. 0 257
      src/main/resources/templates/parseOptions.html
  44. 0 29
      src/main/resources/templates/preview.html
  45. 0 45
      src/main/resources/templates/previewWithPrint.html
  46. 0 906
      src/main/resources/templates/procedure.html
  47. 0 213
      src/main/resources/templates/procedure_versions.html
  48. 0 330
      src/main/resources/templates/procedures.html
  49. 0 190
      src/main/resources/templates/supervision.html
  50. 0 398
      src/main/resources/templates/supervisionProcedures.html
  51. 0 405
      src/main/resources/templates/testerTemplateEditor.html
  52. 0 103
      src/main/resources/templates/wiki.html
  53. 0 107
      src/main/resources/templates/wikiEditor.html

+ 0 - 77
src/main/resources/templates/401.html

@@ -1,77 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<div class="uv-container-login">
-					<div class="row" style="min-height:100px;">
-
-					</div>
-				
-					<div class="row">
-						<div class="col">
-							<h4 th:text="#{global.unautorized.msg}">Su usuario no está autorizado a acceder a este apartado.</h4>
-						</div>
-				    </div>
-				    <br><br>
-				    <div class="row">
-					    <div class="col justify-content-center align-items-center">
-					    </div>
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-		});
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 200
src/main/resources/templates/adminAcredita.html

@@ -1,200 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">	
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;cursor:auto;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{admin.acredita.title}"></h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				<div class="uv-table-group-procedure row" style="padding:20px;">
-					<div class="col-2" id="grupSelector">
-						<label th:text="#{admin.acredita.form.year}">Año</label>
-						<input class="form-control" type="number" value="" id="cursInput" name="curs">
-					</div>
-					<div class="col-5">
-						<label th:text="#{admin.acredita.form.group}">Grupo</label>
-						<select class="selectpicker" id="grupInput" name="grup" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-					        <option value="0" th:text="#{admin.acredita.form.groupnum.0}">Todos</option>
-					        <option value="1" th:text="#{admin.acredita.form.groupnum.1}">Enero</option>
-					        <option value="4" th:text="#{admin.acredita.form.groupnum.4}">Abril</option>
-					        <option value="9" th:text="#{admin.acredita.form.groupnum.9}">Septiembre</option>
-					        <option value="11" th:text="#{admin.acredita.form.groupnum.11}">Noviembre</option>
-					    </select>
-					</div>
-					<div class="col-2" >
-						<span class="btn btn-primary" th:text="#{admin.acredita.form.view}" style="margin-top:30px;" onclick="viewEvent();">Ver</span>
-					</div>
-				</div>
-				<div id="results" class="uv-table-group-procedure" style="padding:20px;">
-					<table class="table table-striped table-bordered display responsive no-wrap" style="width:100%;">
-					    <thead>
-					        <tr>
-					        	<th class="uv-table">RUCT</th>
-					        	<th class="uv-table">Nombre</th>
-					        	<th class="uv-table">Curso Accr.</th>
-					        	<th class="uv-table">Grupo Accr.</th>
-					        	<th class="uv-table">Tipo</th>
-					        </tr>
-					    </thead>
-						<tbody>
-							<tr th:each="item,inRowID : ${acreditacions}">
-								<td>
-									<a th:href="${'/dashboard/'+item.ruct}"><span th:text="${item.ruct}"></span></a>
-								</td>
-								<td>
-									<span th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}"></span>
-								</td>
-								<td>
-									<span th:text="${item.grupCurs}"></span>
-								</td>
-								<td>
-									<span th:text="${item.grup}"></span>
-								</td>
-								<td>
-									<span th:text="${item.tambit == 'M' ? 'Máster' : item.tambit == 'G' ? 'Grado' : 'Doctorado'}"></span>
-								</td>
-							</tr>
-						</tbody>
-					</table>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-		var locale = '[[${#locale.language}]]';
-		var orderCol1 = [3, 'asc'], orderCol2 = [2, 'asc'];
-		var cursorPosition;
-	
-		$( document ).ready(function(){ 
-			layout = new Layout("No data to display");
-			layout.initTableLayout({
-				paging: true, 
-				language:{
-					"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		              }
-				},
-				searching: true,
-				order:[orderCol1, orderCol2],
-				orderCellsTop: true,
-				fixedHeader: true,
-				info: false,
-				responsive: true,
-				initComplete: function () {
-					var api = this.api();
-		        	this.api()
-		        	.columns()
-	                .eq(0)
-	                .each(function (colIdx) {
-	                    var cell = $('.filters th').eq(
-	                        $(api.column(colIdx).header()).index()
-	                    );
-	                    var title = $(cell).text();
-	                    $(cell).html('<input type="text" placeholder="' + title + '" />');
-	                    $('input', $('.filters th').eq($(api.column(colIdx).header()).index()))
-	                        .off('keyup change')
-	                        .on('change', function (e) {
-	                            $(this).attr('title', $(this).val());
-	                            var regexr = '({search})'; 
-	                            cursorPosition = this.selectionStart;
-	                            api.column(colIdx)
-	                               .search(   
-	                                    this.value != ''
-	                                        ? regexr.replace('{search}', '(((' + this.value + ')))')	
-	                                        : '',
-	                                    this.value != '',
-	                                    this.value == ''
-	                                )
-	                                .draw();
-	                        })
-	                        .on('keyup', function (e) {
-								e.preventDefault();
-	                            e.stopPropagation();
-	                            $(this).trigger('change');
-	                            $(this)
-	                                .focus()[0]
-	                                .setSelectionRange(cursorPosition, cursorPosition);
-	                        });
-	                });
-	    		}
-			});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-		});
-		
-		function showSpinner(){
-			var spinner = `<div class="d-flex justify-content-center">
-								<div class="spinner-border text-primary" role="status" style="font-size: 150%; text-align: center; width: 100px; height: 100px;">
-									<span class="sr-only">Loading...</span>
-								</div>
-							</div>
-						  `;
-			$('#resultsContainer').html(spinner);
-		}
-		
-		function viewEvent(){
-			//$('.table').DataTable().ajax.url(`/admin/acredita/${$('#cursInput').val()}/${$('#grupInput').val()}`).load();
-			$.get(`/admin/acredita/${$('#cursInput').val()}/${$('#grupInput').val()}/A`, function(data){
-				console.log(data);
-				var dataarr = [];
-				data.forEach(function(d){
-					dataarr.push([d.ruct, locale == 'es' ? d.nomCas : d.nomVal, d.grupCurs, d.grup, d.tambit == 'M' ? 'Máster' : d.tambit == 'G' ? 'Grado' : 'Doctorado']);
-				});
-				var table = $('.table').DataTable();
-                table.clear();
-                table.rows.add(dataarr).draw();
-		    });
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 597
src/main/resources/templates/adminCalendar.html

@@ -1,597 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link rel="stylesheet" href="https://uicdn.toast.com/calendar/latest/toastui-calendar.min.css" />
-
-<style>
-	.fc-toolbar-title{ font-size: 16px !important; font-weight: bolder !important;}
-	.fc-toolbar-title::first-letter{ text-transform: capitalize; }
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6">Planificador</h6>
-						<hr class="uv-procedure-hr">
-						<span></span>
-					</div>
-				</div>
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<div id="calendar" style="height:600px;max-height:600px;position:relative;z-index:0;"></div>
-			</div>
-		</div>
-	</div>
-	
-	<div class="modal fade" id="newInstanceModal" tabindex="-1" role="dialog" aria-labelledby="newInstanceModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title" th:text="#{admin.calendar.form.titleAdd}">Planificar nueva instancia</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="newInstanceForm" style="margin-top:25px;">
-						<div class="uv-table-group-procedure" id="proceduresContainer">
-							<label th:text="#{admin.instances.selector.procedure}">Proces(os)</label>
-							<select class="selectpicker" id="proceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<div class="form-check">
-								<input class="form-check-input" type="checkbox" value="1" id="selectionType" disabled onchange="toggleSelectionType(this);">
-								<label class="form-check-label" for="selectionType" th:text="#{admin.calendar.form.acredSel}">
-									Por acreditación
-								</label>
-							</div>
-						</div>
-						<div class="uv-table-group-procedure" id="selectorsByGroup">
-							<div class="input-group mb-3">
-								<div class="input-group-prepend">
-									<input class="input-group-text" id="inputAcredCurs" type="number" placeholder="Curso" value="" style="background-color:transparent !important;">
-								</div>
-								<select class="custom-select pointer" id="inputAcredGrup">
-									<option selected value="1" th:text="#{admin.calendar.form.input.grup.1}">Enero</option>
-									<option value="4" th:text="#{admin.calendar.form.input.grup.4}">Abril</option>
-									<option value="9" th:text="#{admin.calendar.form.input.grup.9}">Septiembre</option>
-									<option value="11" th:text="#{admin.calendar.form.input.grup.11}">Noviembre</option>
-								</select>
-								<div class="input-group-append">
-									<select class="custom-select pointer" id="inputAcredTambit">
-										<option selected value="G" th:text="#{admin.calendar.form.input.tambit.g}">Grados</option>
-										<option value="M" th:text="#{admin.calendar.form.input.tambit.m}">Másters</option>
-										<option value="D" th:text="#{admin.calendar.form.input.tambit.d}">Doctorados</option>
-									</select>
-								</div>
-								<div class="input-group-append">
-									<span class="btn btn-primary" onclick="loadByAcreditacio();" th:text="#{admin.calendar.form.load}">Cargar</span>
-								</div>
-							</div>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label><span th:text="#{admin.instances.selector.center}">Centre(s)</span> (<span id="numCentresSelected">0</span>)</label>
-							<select class="selectpicker" id="centresSelector" name="center" data-live-search="true" multiple data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label><span th:text="#{admin.instances.selector.titulation}">Titulació(ns)</span> (<span id="numTitsSelected">0</span>)</label>
-							<select class="selectpicker" id="titulacionsSelector" name="titulation" data-live-search="true" multiple data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label th:text="#{admin.calendar.form.date}">Fecha</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="dateSelector" name="dateSelector" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" type="submit" form="newInstanceForm" th:text="#{global.confirm}">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div class="modal fade" id="copyInstanceModal" tabindex="-1" role="dialog" aria-labelledby="copyInstanceModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title" th:text="#{admin.calendar.form.titleCopy}">Copiar instancia existente</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="copyInstanceForm" style="margin-top:25px;">
-			    		<input type="hidden" name="cid" id="cid">
-						<div class="uv-table-group-procedure" id="cproceduresContainer">
-							<label th:text="#{admin.instances.selector.procedure}">Proces(os)</label>
-							<select class="selectpicker" id="cproceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label th:text="#{admin.calendar.form.date}">Fecha</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="cdateSelector" name="data" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" type="submit" form="copyInstanceForm" th:text="#{global.confirm}">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div class="modal fade" id="editInstanceModal" tabindex="-1" role="dialog" aria-labelledby="editInstanceModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title" th:text="#{admin.calendar.form.titleEdit}">Editar instancia planificada</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-	        		<span class="btn btn-danger pointer" style="float:right;margin-top:-50px;width:40px;height:38px;border-radius:40px;" onclick="deleteEvent();" id="deletebtn" th:title="#{admin.calendar.form.delete}"><i class="fas fa-trash"></i></span>
-	        		<span class="btn btn-secondary pointer" style="float:right;margin-top:-50px;width:40px;height:38px;border-radius:40px;" onclick="copyEvent();" id="copybtn" th:title="'Copiar'"><i class="fas fa-copy"></i></span>
-	        		<button type="button" class="btn btn-primary" style="float:right;margin-right:50px;margin-top:-50px;width:40px;height:38px;border-radius:40px;" onclick="instantiate();" id="instantiatebtn" th:title="#{admin.calendar.form.instanciar}"><i class="fas fa-step-forward"></i></button>
-			    	<form id="editInstanceForm" style="margin-top:50px;">
-			    		<input type="hidden" id="eid" value="">
-						<div class="uv-table-group-procedure">
-							<label th:text="#{admin.instances.selector.procedure}">Proces(os)</label>
-							<select class="selectpicker editFormItem" id="eproceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label th:text="#{admin.instances.selector.center}">Centre(s)</label>
-							<select class="selectpicker editFormItem" id="ecentresSelector" name="center" data-live-search="true" multiple data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label th:text="#{admin.instances.selector.titulation}">Titulació(ns)</label>
-							<select class="selectpicker editFormItem" id="etitulacionsSelector" name="titulation" data-live-search="true" multiple data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure">
-							<label th:text="#{admin.calendar.form.date}">Fecha</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="edateSelector" name="dateSelector" class="form-control uv-datePicker editFormItem" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.close}">Cerrar</button>
-		        <button class="btn btn-success" type="submit" form="editInstanceForm" th:text="#{global.confirm}" id="editbtn">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div class="modal fade" id="resultsInstanceModal" tabindex="-1" role="dialog" aria-labelledby="resultsInstanceModal" aria-hidden="true" style="overflow: scroll;">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Resultados de la instanciación</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid" id="results">
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/fullcalendar/index.global.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/datepicker/locales/bootstrap-datepicker.es.min.js}"></script>
-	<script th:src="@{/js/datepicker/locales/bootstrap-datepicker.ca.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-	<script type="text/javascript">
-		var calendar;
-		var locale = '[[${#locale.language}]]';
-		var tmpEvent = {};
-		var acredSelection = false;
-		var acredCentres = [];
-		var acredTitulacions = [];
-	
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-			$('#proceduresSelector').val('').trigger('change');
-			$('#centresSelector').val('').trigger('change');
-			$('#centresSelector').change(completeTitulations);
-			$('#titulacionsSelector').change(updateCounters);
-			$('#proceduresSelector').change(complete);
-			
-			$('.datepicker').datepicker({
-				language: locale,
-			    autoclose: true,
-			    todayHighlight: true,
-			    orientation: "bottom center",
-			    clearBtn: true
-			});
-			
-			var calendarEl = document.getElementById('calendar');
-			calendar = new FullCalendar.Calendar(calendarEl, {
-			  initialView: 'dayGridMonth',
-			  locale: 'es',
-			  weekNumberCalculation: 'ISO',
-			  editable : true,
-              droppable : true, 
-              customButtons: {
-           	    btnAdd: {
-           	      text: "[[#{admin.calendar.form.add}]]",
-           	      click: function() {
-           	    	$('#newInstanceModal').modal('toggle');
-           	      }
-           	    }
-           	  },
-           	  headerToolbar: {
-           	    center: 'btnAdd',
-           	    right: 'today prev,next'
-           	  },
-              events: [],
-              eventReceive : function(info) {
-                  alert(info.event.title);
-              },
-              eventDrop : function(info) {
-            	  var d = info.event.startStr.split('-');
-            	  if(info.event._def.extendedProps.status !== 'P'){
-            		  info.revert();
-            		  return false;
-            	  }
-                  if (!confirm("[[#{admin.calendar.form.changeDate}]] "+d[2]+'/'+d[1]+'/'+d[0]+"?")) {
-                      info.revert();
-                  }
-                  else{
-                	  console.log(info.event._def.extendedProps.titulacions);
-                	  var d = info.event.startStr.split('-');
-                	  var params = {
-          			    	idProces: info.event._def.extendedProps.idProces,
-          			    	data: d[2]+'/'+d[1]+'/'+d[0],
-          			    	titulacions: info.event._def.extendedProps.titulacions.toString(),
-          					centres: info.event._def.extendedProps.centres.toString()
-          			    }
-          			    
-          			    $.post("/ajax/calendar/"+info.event.id, params, function(d){
-          			    	calendar.removeAllEvents();
-          					initCalendar();
-          			    });
-                  }
-              },
-              eventClick : function(info) {  
-            	  tmpEvent = info.event._def.extendedProps;
-            	  setEditData(info.event._def.publicId, info.event._def.extendedProps);
-            	  $("#editInstanceModal").modal();                               
-              },
-			});
-			calendar.render();
-			
-			initCalendar();
-			
-			$('#newInstanceForm').submit(function(e) {
-			    e.preventDefault();
-			    		    
-			    var params = {
-			    	idProces: $('#proceduresSelector').val(),
-			    	data: $('#dateSelector').val(),
-			    	titulacions: $('#titulacionsSelector').val().toString(),
-					centres: $('#centresSelector').val().toString()
-			    }
-			    
-			    $.post("/ajax/calendar", params, function(d){
-			    	var date = d.dataStr.substring(0,10).split('-');
-			    	var event = {
-		    			id: d.idCalendari,
-					    title: locale == 'es' ? d.titolCas : d.titolVal,
-					    start: d.dataStr,
-					    indate: date[2]+'/'+date[1]+'/'+date[0],
-					    idProces: d.idProces,
-					    titulacions: JSON.parse(d.titulacions),
-						centres: JSON.parse(d.centres),
-						color: d.color,
-						status: 'P',
-						allDay: true
-			    	}
-			    	calendar.addEvent(event);
-			    });
-			    $('#newInstanceModal').modal('toggle');
-			    return false;
-			});
-			
-			$('#editInstanceForm').submit(function(e) {
-				e.preventDefault();
-			    
-			    var params = {
-			    	idProces: $('#eproceduresSelector').val(),
-			    	data: $('#edateSelector').val(),
-			    	titulacions: $('#etitulacionsSelector').val().toString(),
-					centres: $('#ecentresSelector').val().toString()
-			    }
-			    
-			    $.post("/ajax/calendar/"+$('#eid').val(), params, function(d){
-			    	calendar.removeAllEvents();
-					initCalendar();
-			    });
-			    $('#editInstanceModal').modal('toggle');
-			    return false;
-			});
-			
-			$('#copyInstanceForm').submit(function(e) {
-				e.preventDefault();
-			    
-			    var params = {
-			    	idProces: $('#cproceduresSelector').val(),
-			    	data: $('#cdateSelector').val(),
-			    	titulacions: $('#etitulacionsSelector').val().toString(),
-					centres: $('#ecentresSelector').val().toString(),
-			    	instancia: $('#cid').val()
-			    }
-			    
-			    $.post("/ajax/calendar", params, function(d){
-			    	var date = d.dataStr.substring(0,10).split('-');
-			    	var event = {
-		    			id: d.idCalendari,
-					    title: locale == 'es' ? d.titolCas : d.titolVal,
-					    start: d.dataStr,
-					    indate: date[2]+'/'+date[1]+'/'+date[0],
-					    idProces: d.idProces,
-					    titulacions: JSON.parse(d.titulacions),
-						centres: JSON.parse(d.centres),
-						color: d.color,
-						status: 'P',
-						allDay: true
-			    	}
-			    	calendar.addEvent(event);
-			    });
-			    $('#copyInstanceModal').modal('toggle');
-			    return false;
-			});
-			
-			$('#selectorsByGroup').hide();
-						
-		});	
-		
-		function copyEvent(){
-			$('#editInstanceModal').modal('toggle');
-			$('#cid').val($('#eid').val());
-			$('#copyInstanceModal').modal('toggle');
-			
-		}
-		
-		function initCalendar(){
-			$.get("/ajax/calendar", function(data){
-				data.forEach(function(d){
-					var date = d.data.substring(0,10).split('-');
-			    	var event = {
-		    			id: d.idCalendari,
-					    title: locale == 'es' ? d.titolCas : d.titolVal,
-					    start: d.data,
-					    indate: date[2]+'/'+date[1]+'/'+date[0],
-					    idProces: d.idProces,
-					    titulacions: JSON.parse(d.titulacions),
-						centres: JSON.parse(d.centres),
-						color: d.color,
-						status: d.status,
-						allDay: true
-			    	}
-			    	calendar.addEvent(event);
-				});
-		    	
-		    });
-		}
-		
-		function deleteEvent(){
-			$.ajax({
-			    url: '/ajax/calendar',
-			    type: 'DELETE',
-			    data: {id:$('#eid').val()},
-			    success: function(d) {
-			    	calendar.removeAllEvents();
-					initCalendar();
-			    }
-			});
-		}
-						
-		function setEditData(id){
-			if(tmpEvent.status === 'P'){
-				$('#editbtn').show();
-				$('#instantiatebtn').show();
-				$('#deletebtn').show();
-				$('.editFormItem').prop("disabled", false);
-			}
-			else if(tmpEvent.status === 'E'){
-				$('#instantiatebtn').show();
-				$('#deletebtn').show();
-				$('#editbtn').hide();
-				$('.editFormItem').prop("disabled", true);
-			}
-			else {
-				$('#instantiatebtn').hide();
-				$('#editbtn').hide();
-				$('#deletebtn').hide();
-				$('.editFormItem').prop("disabled", true);
-			}
-			
-			$('#eid').val(id);
-			$('#edateSelector').datepicker("setDate", tmpEvent.indate);
-			$('#eproceduresSelector').val(tmpEvent.idProces).trigger('change');
-			var params = {'procedure':$('#eproceduresSelector').val()};
-			$.post("/ajax/find/centers", params, function(data){ 
-				$("#ecentresSelector").html(data).selectpicker('refresh'); 
-				$('#ecentresSelector').val(tmpEvent.centres).trigger('change');
-				var params = {'procedure':$('#eproceduresSelector').val(), 'centers[]':$('#ecentresSelector').val()};
-				$.post("/ajax/find/titulations2", params, function(data){ 
-					$("#etitulacionsSelector").html(data).selectpicker('refresh'); 
-					$('#etitulacionsSelector').val(tmpEvent.titulacions).trigger('change');
-				});
-			});
-		}
-		
-		function instantiate(){
-			var params = {
-				id: $('#eid').val(),
-				idProces: $('#eproceduresSelector').val(),
-				centres: $('#ecentresSelector').val().toString(),
-				titulacions: $('#etitulacionsSelector').val().toString()
-			}
-			$('#editInstanceModal').modal('toggle');
-			$.post("/ajax/instantiate", params, function(data){ 
-				$('#resultsInstanceModal').modal('toggle');
-				data.forEach(function(d){
-					var t = d.replace('[OK]', '<span style="color:green">[OK]</span>').replace('[ERROR]', '<span style="color:firebrick">[ERROR]</span>')
-					$("#results").append('<span>'+t+'</span><br>');
-				});
-				calendar.removeAllEvents();
-				initCalendar();
-			});
-		}
-
-		function complete(){
-			completeCenters();
-			completeTitulations();
-			$('#selectionType').attr('disabled', false)
-		}
-		
-		function completeCenters(){
-			var params = {'procedure':$('#proceduresSelector').val()};
-			$.post("/ajax/find/centers", params, function(data){ 
-				$("#centresSelector").html(data).selectpicker('refresh'); 
-				$('#centresSelector').val('').trigger('change');
-				$('#numCentresSelected').text($('#centresSelector').val().length);
-			});
-		}
-		
-		function completeTitulations(){
-			if ($('#centresSelector').val() !== null && $('#centresSelector').val().length > 0){
-				var params = {'procedure':$('#proceduresSelector').val(), 'centers[]':$('#centresSelector').val()};
-				$.post("/ajax/find/titulations2", params, function(data){ 
-					$("#titulacionsSelector").html(data).selectpicker('refresh'); 
-					if(acredSelection){
-						$('#titulacionsSelector').selectpicker('val', acredTitulacions);
-						acredSelection = false;
-					}
-					else{
-						$('#titulacionsSelector').val('').trigger('change');
-					}
-					$('#numTitsSelected').text($('#titulacionsSelector').val().length);
-				});
-			}
-		}
-		
-		function toggleSelectionType(e){
-			if($(e).is(':checked')){
-				$('#selectorsByGroup').show();
-			}
-			else{
-				$('#selectorsByGroup').hide();
-			}
-		}
-		
-		function loadByAcreditacio(){
-			$.get(`/admin/acredita/${$('#inputAcredCurs').val()}/${$('#inputAcredGrup').val()}/${$('#inputAcredTambit').val()}`, 
-				function(data){
-					acredSelection = true;
-					acredCentres = [];
-					acredTitulacions = [];
-					data.forEach(function(d){
-						acredCentres.push(d.lugarCentre);
-						acredTitulacions.push(d.lugar);
-					});
-					if(acredCentres.length < 1){
-						$('#titulacionsSelector').val('').trigger('change');
-					}
-					$('#centresSelector').selectpicker('val', acredCentres);
-					$('#centresSelector').trigger('change');
-					$('#numCentresSelected').text($('#centresSelector').val().length);
-		    });			
-		}
-		
-		function updateCounters(){
-			$('#numCentresSelected').text($('#centresSelector').val().length);
-			$('#numTitsSelected').text($('#titulacionsSelector').val().length);
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 134
src/main/resources/templates/adminInstances.html

@@ -1,134 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{admin.instances.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{admin.instances.subtitle}"></span>
-					</div>
-				</div>
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="/admin/instances">
-					<div class="uv-table-group-procedure" id="proceduresContainer">
-						<label th:text="#{admin.instances.selector.procedure}">Proces(os)</label>
-						<select class="selectpicker" id="proceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.center}">Centre(s)</label>
-						<select class="selectpicker" id="centersSelector" name="center" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.titulation}">Titulació(ns)</label>
-						<select class="selectpicker" id="titulationsSelector" name="titulation" data-live-search="true" data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group" style="margin-top:50px;">
-						<button th:text="#{admin.actions.instance}" class="btn btn-primary">Cargar</button>
-					</div>
-					<div class="uv-table-group uv-admin-instance-success" th:if="${success}">
-						<span th:text="#{admin.instances.done}"></span>
-						<br><br>
-						<span th:each="item : ${successCas}" th:if="${#locale.language == 'es'}"><span th:text="${item}"></span><br></span>
-						<span th:each="item : ${successVal}" th:if="${#locale.language != 'es'}"><span th:text="${item}"></span><br></span>
-					</div>
-					<div class="uv-table-group uv-admin-instance-error" th:if="${error}">
-						<span th:text="#{admin.instances.error}"></span>
-						<br><br>
-						<span th:each="item : ${errorCas}" th:if="${#locale.language == 'es'}"><span th:text="${item}"></span><br></span>
-						<span th:each="item : ${errorVal}" th:if="${#locale.language != 'es'}"><span th:text="${item}"></span><br></span>
-					</div>
-				</form>
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-  
-	<script type="text/javascript">
-		
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('#proceduresSelector').val('').trigger('change');
-			$('#centersSelector').val('').trigger('change');
-			$('#centersSelector').change(completeTitulations);
-			$('#proceduresSelector').change(complete);
-		});
-		
-		function complete(){
-			completeCenters();
-			completeTitulations();
-		}
-		
-		function completeCenters(){
-			console.log('cents');
-			var params = {'procedure':$('#proceduresSelector').val()};
-			$.post("/ajax/find/centers", params, function(data){ $("#centersSelector").html(data).selectpicker('refresh'); $('#centersSelector').val('').trigger('change');});
-		}
-		function completeTitulations(){
-			console.log('tits');
-			if ($('#centersSelector').val() !== null && $('#centersSelector').val() !== ''){
-				var params = {'procedure':$('#proceduresSelector').val(), 'center':$('#centersSelector').val()};
-				$.post("/ajax/find/titulations", params, function(data){ 
-					$("#titulationsSelector").html(data).selectpicker('refresh'); 
-					$('#titulationsSelector').val('').trigger('change');
-					/*if($('#centersSelector').val() === "0"){
-						$('#titulationsSelector').removeAttr('required');
-					}
-					else{
-						$('#titulationsSelector').attr('required', true);
-					}*/
-				});
-			}
-		}
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 351
src/main/resources/templates/adminProcedures.html

@@ -1,351 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<style>
-	svg[id^="mermaid-"] { min-width: 100%; font-size: 10px;}
-	polygon.label-container {
-		max-height: 50px !important;
-	}
-	g.node{
-		max-height: 50px !important;
-	}
-
-	svg[aria-roledescription="flowchart-v2"]{
-		-moz-transform: scale(0.75);
-		-webkit-transform: scale(0.75);
-		transform: scale(0.75);
-		transform-origin: top center;
-		top:0;
-		margin-top:0px;
-		margin-bottom:0px;
-	}
-
-	div.mermaid {
-		margin-left: 0 !important;
-		text-align: center;
-		resize:both;
-		overflow:auto;
-		margin-bottom: 2px;
-		position:relative;
-		max-height: 600px;
-		max-width: 100%;
-	}
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{admin.procedures.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{admin.procedures.subtitle}"></span>
-					</div>
-				</div>
-				<div class="uv-table-group">
-					<h5></h5>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="" id="procedureForm">
-					<div class="uv-table-group">
-						<label th:text="#{admin.instances.selector.procedure}">Proces</label>
-						<select class="selectpicker" id="proceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}">
-					        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<br>
-					<span class="btn btn-secondary pointer" onclick="formNew()"><i class="fas fa-plus"></i> <span th:text="#{admin.procedures.action.new}">Nuevo</span></span>
-					<span class="btn btn-primary pointer" onclick="formDuplicate()"><i class="fas fa-copy"></i> <span th:text="#{admin.procedures.action.duplicate}">Duplicar</span></span> 
-					<span class="btn btn-info pointer" onclick="formEdit()"><i class="fas fa-edit"></i> <span th:text="#{admin.procedures.action.edit}">Editar</span></span>
-					<span class="btn btn-danger pointer" onclick="formRemove()"><i class="fas fa-trash"></i> <span th:text="#{admin.procedures.action.remove}">Eliminar</span></span>
-					<div class="uv-table-group" id="formFields" style="margin-top:20px;"></div>
-				</form>
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/datepicker/locales/bootstrap-datepicker.es.min.js}"></script>
-	<script th:src="@{/js/datepicker/locales/bootstrap-datepicker.ca.min.js}"></script>
-	<script src="https://cdn.jsdelivr.net/npm/mermaid@11.3.0/dist/mermaid.min.js"></script>
-  
-	<script type="text/javascript">
-	
-	var locale = '[[${#locale.language}]]',
-		locale_new = "[[#{admin.procedures.confirm.new}]]", 
-		locale_copy = "[[#{admin.procedures.confirm.copy}]]", 
-		locale_edit = "[[#{admin.procedures.confirm.edit}]]", 
-		locale_remove = "[[#{admin.procedures.confirm.remove}]]";
-
-	var graphDef = '';
-
-	$( document ).ready(function(){ 
-		layout = new Layout("");
-		layout.initTableLayout({paging:false});
-		$('#proceduresSelector').val('').trigger('change');
-		$('#proceduresSelector').change(function(){$('#formFields').hide();});
-		$('#formFields').hide();
-		$('#actionFields').hide();
-		layout.closeLoadingSpinner(".uv-loading-spinner");
-
-		mermaid.initialize({ startOnLoad: false, theme: "default", flowchart: { diagramPadding: 5, useMaxWidth:false, htmlLabels:true, wrap: true, wrappingWidth: 750 } });
-		
-		$('#procedureForm').submit(function(e) {
-			$("input[type=text]").each(function() {
-				var element = $(this);
-				if (element.val() == "" || element.val() == " ") {
-					element.val(".");
-				}
-			});
-			$("textarea").each(function() {
-				var element = $(this);
-				if (element.val() == "" || element.val() == " ") {
-					element.val(".");
-				}
-			});
-			$("textarea.task").each(function() {
-				var element = $(this);
-				element.val(element.val().replaceAll(',', "[comma]"));
-			});
-			$("input[type=text].task").each(function() {
-				var element = $(this);
-				element.val(element.val().replaceAll(',', "[comma]"));
-			});
-		    return true;
-		});
-		
-		$('#procedureForm').on('submit', function() {
-			$('.hiddenFields').show();
-			return true;
-		});
-	});
-	
-	function formNew(){
-		$.post("/ajax/find/procedure", {procedure:0, action:"new"}, function(rawData){ 
-			$('#formFields').html(rawData);
-			$('.selectpicker').selectpicker('refresh');
-			$('#formFields').show();
-		});
-		$('#formFields').show();
-		$('#procedureForm').attr('action', '/admin/procedures/new');
-	}
-	
-	function formDuplicate(){
-		$.post("/ajax/find/procedure", {procedure:$('#proceduresSelector').val(), action:"duplicate"}, function(rawData){ 
-			$('#formFields').html(rawData);
-			$('.selectpicker').selectpicker('refresh');
-			$('#formFields').find('.datepicker').datepicker({
-				language: locale,
-			    autoclose: true,
-			    todayHighlight: true,
-			    orientation: "bottom center",
-			    clearBtn: true
-			});
-			$('#formFields').show();
-			$('#procedureForm').attr('action', '/admin/procedures/new');
-		});
-	}
-	
-	function formRemove(){
-		$.post("/ajax/find/procedure", {procedure:$('#proceduresSelector').val(), action:"remove"}, function(rawData){ 
-			$('#formFields').html(rawData);
-			$('.selectpicker').selectpicker('refresh');
-			$('#formFields').show();
-			$('#procedureForm').attr('action', '/admin/procedures/remove');
-		});
-	}
-		
-	function formEdit(){
-		$.post("/ajax/find/procedure", {procedure:$('#proceduresSelector').val(), action:"edit"}, function(rawData){ 
-			$('#formFields').html(rawData);
-			$('.selectpicker').selectpicker('refresh');
-			$('#formFields').show();
-			$('#procedureForm').attr('action', '/admin/procedures/edit');
-		});
-	}
-	
-	function newTask(){
-		$.get("/ajax/newTask/"+($('.card-task').length), function(d){
-			var node = $.parseHTML(d); 
-			$(node).find('.datepicker').datepicker({
-				language: locale,
-			    autoclose: true,
-			    todayHighlight: true,
-			    orientation: "bottom center",
-			    clearBtn: true
-			});
-			$(node).appendTo($('#accordion'));
-			$('.selectpicker').selectpicker('refresh');
-		});
-	}
-	
-	function removeTask(id){
-		$('#heading'+id).parent().remove();
-	}
-	
-	function changeType(e){
-		console.log('type');
-		$(e).parent().parent().parent().find('#evidence1Fields').hide();
-		$(e).parent().parent().parent().find('#evidence11Fields').hide();		
-		if(parseInt($(e).val()) == 11 || parseInt($(e).val()) == 15){	
-			$(e).parent().parent().parent().find('#evidence11Fields').show();
-		}
-		else{
-			$(e).parent().parent().parent().find('#evidence1Fields').show();
-		}
-	}
-
-	function loadFlowDiagramDelayed(){
-		setTimeout(loadFlowDiagram, 100);
-	}
-
-	function loadFlowDiagram(){
-		var nodeDefs = 'graph TD';
-		var nodeRels = '';
-		$('.card-task').each(function(i, d){ 
-			var type = $(d).find("select[name='tipus[]']").val();
-			var date = $(d).find("input[name='dataLimit[]']").val();
-			var title = locale == 'es' ? $(d).find("input[name='titolCas[]']").val() : $(d).find("input[name='titolVal[]']").val();
-			var rol = $(d).find( "select[name='idRol[]'] option:selected" ).text();
-			var id = $(d).find("input[name='idTascap[]']").val();
-			var idSeg = $(d).find("input[name='idTascaSeg[]']").val();
-			var idSeg2 = $(d).find("input[name='idTascaSeg2[]']").val();
-			var shape = 'rect';
-			if(type == 2 || type == 20){
-				shape = 'hex';
-			}
-			else if(type == 21 || type == 22){
-				shape = 'procs';
-			}
-			else if(type == 1 || type == 11 || type == 12 || type == 14 || type == 15){
-				shape = 'lean-r'
-			}
-			nodeDefs += `
-${id}@{shape: ${shape}, label: "${title}<br> <strong>Asignado a:</strong>  ${rol} <br> <strong>Fecha límite: ${date}</strong>"}`; 
-			if(type == 2 || type == 20){
-				nodeRels += `
-${id}-->|SÍ|${idSeg}
-${id}-->|NO|${idSeg2}`;
-			}
-			else if(idSeg != 9999){
-				nodeRels += `
-${id}-->${idSeg}`;
-			}
-		});
-		if(graphDef != nodeDefs+nodeRels){
-			$('.mermaid').removeAttr('data-processed');
-			$('.mermaid').text('');
-			$('.mermaid').text(nodeDefs+nodeRels);
-			$('.mermaid').css({
-				'margin-left': '0 !important',
-				'text-align': 'center',
-				'resize':'both',
-				'overflow':'auto',
-				'margin-bottom': '2px',
-				'position':'relative',
-				'max-height': '600px',
-				'max-width': '100%'
-			});
-			$('svg[id^="mermaid-"]').css({ 'min-width': '100%', 'font-size': '10px'});
-			$('polygon.label-container').css({ 'max-height': '50px !important' });
-			$('g.node').css({ 'max-height': '50px !important' });
-			$('svg[aria-roledescription="flowchart-v2"]').css({
-				'-moz-transform': 'scale(0.75)',
-				'-webkit-transform': 'scale(0.75)',
-				'transform': 'scale(0.75)',
-				'transform-origin': 'top center',
-				'top':'0',
-				'margin-top':'0px',
-				'margin-bottom':'0px'
-			});
-			mermaid.run({querySelector:'.mermaid'});
-		}
-	}
-
-	function downloadFlowDiagram() {
-		const svgElement = document.querySelector('svg[aria-roledescription="flowchart-v2"]');
-		const filename = 'flujo_procedimiento_'+$('#procedure_code').text();
-
-		if(!svgElement) {
-			console.error('No se encontró ningún SVG.');
-			return;
-		}
-
-		const clonedSvg = svgElement.cloneNode(true);
-		const width = parseInt(clonedSvg.getAttribute('width') || 800);
-		const height = parseInt(clonedSvg.getAttribute('height') || 600);
-
-		// Embebemos los estilos de Mermaid en el SVG
-		const style = document.createElement('style');
-		style.textContent = Array.from(document.styleSheets)
-			.filter(s => !s.href || s.href.startsWith(window.location.origin))
-			.map(sheet => {
-				try {
-					return Array.from(sheet.cssRules).map(rule => rule.cssText).join('\n');
-				} catch (e) {
-					return '';
-				}
-			})
-			.join('\n');
-		clonedSvg.insertBefore(style, clonedSvg.firstChild);
-		const svgData = new XMLSerializer().serializeToString(clonedSvg);
-		const svgBase64 = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svgData)));
-
-		const img = new Image();
-		img.onload = function () {
-			const canvas = document.createElement('canvas');
-			canvas.width = width;
-			canvas.height = height;
-			const ctx = canvas.getContext('2d');
-			ctx.fillStyle = '#ffffff';
-			ctx.fillRect(0, 0, canvas.width, canvas.height);
-
-			ctx.drawImage(img, 0, 0);
-
-			const pngUrl = canvas.toDataURL('image/png');
-			const link = document.createElement('a');
-			link.href = pngUrl;
-			link.download = filename;
-			document.body.appendChild(link);
-			link.click();
-			document.body.removeChild(link);
-		};
-		img.src = svgBase64;
-	}
-			
-	</script>
-
-</body>
-
-</html>

+ 0 - 155
src/main/resources/templates/adminStats.html

@@ -1,155 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="col-sm-12 uv-table-section">
-					<div class="uv-table-subheader">
-						<h6 class="uv-table-subheader-h6"><strong th:text="#{admin.stats.sessions.title}">Active Sessions</strong></h6>
-					</div>
-					<div class="uv-table-title">
-					</div>
-					<table class="table table-striped table-bordered display responsive no-wrap">
-					    <thead>
-					        <tr>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.sessions.id}">Session ID</th>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.sessions.username}">Username</th>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.sessions.last}">Last Request</th>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.sessions.expired}">Expired</th>
-					        </tr>
-					    </thead>
-						<tbody>
-							<tr th:each="item,inRowID : ${activeSessions}">
-								<td>
-									<span th:text="${item.id}"></span>
-								</td>
-								<td>
-									<span th:text="${item.username + ' ('+item.fullName+')' }"></span>
-								</td>
-								<td>
-									<span th:text="${item.lastRequest}"></span>
-								</td>
-								<td>
-									<span th:text="${item.expired}"></span>
-								</td>
-							</tr>
-						</tbody>
-						<tfoot>
-							<tr class="uv-table-footer-right">
-								<td class="uv-table-footer-td" colspan="4">
-									<h6 class="uv-table-title-h6">
-										<strong> <span th:text="#{admin.stats.sessions.active.total}"> Total active sessions: </span>: <span th:text="${totalActiveSessions}"></span></strong>
-										<br>
-										<strong><span th:text="#{admin.stats.sessions.expired.total}">Total expired sessions: </span>: <span th:text="${totalExpiredSessions}"></span></strong>
-									</h6>
-								 </td>
-							</tr>
-						</tfoot>
-					</table>
-					<div class="uv-table-subheader">
-						<h6 class="uv-table-subheader-h6"><strong th:text="#{admin.stats.pending.title}">Pending emails</strong></h6>
-					</div>
-					<div class="uv-table-title">
-					</div>
-					<table class="table table-striped table-bordered display responsive no-wrap">
-					    <thead>
-					        <tr>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.pending.username}">Username</th>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.pending.fullname}">Full name</th>
-					        	<th class="uv-table-no-sort" th:text="#{admin.stats.pending.email}">Email</th>
-					        </tr>
-					    </thead>
-						<tbody>
-							<tr th:each="item,inRowID : ${pendingEmails}">
-								<td>
-									<span th:text="${item.username}"></span>
-								</td>
-								<td>
-									<span th:text="${item.fullName}"></span>
-								</td>
-								<td>
-									<span th:text="${item.email}"></span>
-								</td>
-							</tr>
-						</tbody>
-						<tfoot>
-							<tr class="uv-table-footer-right">
-								<td class="uv-table-footer-td" colspan="3">
-									<h6 class="uv-table-title-h6">
-										<strong><span th:text="#{admin.stats.pending.total}">Total pending emails: </span>: <span th:text="${#lists.size(pendingEmails)}"></span></strong>
-									</h6>
-								 </td>
-							</tr>
-						</tfoot>
-					</table>
-				</div>
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("No data to display");
-			layout.initTableLayout({
-				paging: true, 
-				language:{
-					"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		              	}
-					},
-				searching: true,
-				order: false,
-				orderCellsTop: false,
-				fixedHeader: false,
-				info: false,
-				responsive: true,
-				initComplete: function(){return true;}
-			});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-		});
-		
-		
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 425
src/main/resources/templates/adminTemplateEditor.html

@@ -1,425 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-		
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6">Editor de plantillas</h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				
-				
-				<div class="uv-table-group">
-					<div class="uv-table-group">
-						<label>Plantilla</label>
-						<select class="selectpicker" id="templateSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" onchange="formEdit();">
-					        <option th:each="item : ${templates}" th:text="${#locale.language} == 'es' ? '['+${item.codi}+'] {v'+${item.versio}+'} ['+${item.ambit}+'] '+${item.nomCas}:${item.codi}+' {v'+${item.versio}+'} ['+${item.ambit}+'] '+${item.nomVal}" th:attr="value=${item.idPlantilla}"></option>
-					    </select>
-					</div>
-					<br>
-					<span class="btn btn-secondary pointer" onclick="formNew()"><i class="fas fa-plus"></i> <span th:text="#{admin.procedures.action.new}">Nuevo</span></span>
-					<span class="btn btn-primary pointer" onclick="formDuplicate()"><i class="fas fa-copy"></i> <span th:text="#{admin.procedures.action.duplicate}">Duplicar</span></span> 
-					<span class="btn btn-warning pointer" onclick="formTest()" data-toggle="modal" data-target="#testTemplateModal"><i class="fas fa-file"></i> <span th:text="Probar">Probar</span></span>
-					<span class="btn btn-danger pointer" onclick="formDelete()"><i class="fas fa-trash"></i> <span th:text="#{admin.procedures.action.remove}">Eliminar</span></span>
-					<span class="btn btn-info" id="isUsed" style="float:right;pointer-events:none;"><i class="fas fa-link"></i></span>
-					<hr class="uv-procedure-hr">
-				</div>
-				
-				<div class="uv-table-group" id="formFields">
-					
-				</div>
-				
-				<div class="uv-table-group">
-					<textarea id="editor" name="evidencia_text"></textarea>
-				</div>
-				
-				<div class="uv-table-group" id="actionFields" style="margin-bottom:25px;">
-					<button class="btn btn-info" onclick="save_content();"><span th:text="#{admin.procedures.confirm}">Confirmar</span></button>
-					<br><br>
-				</div>
-				
-			</div>
-		</div>
-	</div>
-	
-	<div class="modal fade" id="searchIndsModal" tabindex="-1" role="dialog" aria-labelledby="searchIndsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Buscar indicadores</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="searchIndForm" action="javascript:void(0)" style="margin-top:25px;">
-						<div class="form-group">
-							<label>Indicador/Valor de encuesta</label>
-							<select class="selectpicker" id="indSelector" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${inds}" th:text="${item}" th:attr="value=${item}"></option>
-						    </select>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <span class="btn btn-success" onclick="insert_data();">Insertar</span>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div class="modal fade" id="testTemplateModal" tabindex="-1" role="dialog" aria-labelledby="searchIndsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Probar plantilla</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.center}">Centre(s)</label>
-						<select class="selectpicker" id="centersSelector" name="center" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.titulation}">Titulació(ns)</label>
-						<select class="selectpicker" id="titulationsSelector" name="titulation" data-live-search="true" data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.curs}">Curso</label>
-						<select class="selectpicker" id="cursSelector" name="curs" data-live-search="true" data-width="100%" data-actions-box="true" required>
-							<option th:each="year : ${#numbers.sequence(2020, #dates.year(#dates.createNow()))}"
-							    th:value="${year}" th:text="${year}">
-							</option>
-						</select>
-					</div>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary pointer" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <span class="btn btn-success pointer" onclick="testTemplate();">Probar</span>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
-  
-	<script type="text/javascript">
-		
-	
-		var opts = { margin: [0, 12, 0, 12] };
-		var worker = html2pdf();
-		worker.set(opts);
-		var action;
-	
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('#centersSelector').val('').trigger('change');
-			$('#centersSelector').change(completeTitulations);
-			
-			tinymce.init({ 
-				selector: '#editor',
-				plugins: 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists charmap quickbars checklist tinycomments codeeditor',
-				menubar: 'file edit view insert format tools table help',
-				toolbar: 'save | undo redo | bold italic underline strikethrough forecolor backcolor removeformat | fontfamily fontsize | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist checklist | btn-editable btn-noneditable insert-data | codeeditor | topdf fullscreen ',
-				tinycomments_author: 'Sysadmin',
-				tinycomments_author_name: 'Sysadmin',
-				tinycomments_mode: 'embedded',
-				object_resizing : ":not(table)",
-				content_style: "body { width: 297mm; max-width: 297mm; font-size: 10pt; font-family: Verdana, Geneva, sans-serif; font-style: normal; font-variant: normal;}",
-				font_formats: "Arial=arial,helvetica,sans-serif; Verdana=verdana,geneva;", 
-				font_size_formats: '8pt 10pt 12pt 14pt 16pt 18pt 24pt',
-				setup: (editor) => {
-					
-					editor.on('keydown', function(e) {
-						if (e.keyCode == 8 || e.keyCode == 46) { //backspace and delete keycodes
-		                    try {
-		                        var elem = tinymce.activeEditor.selection.getNode(); //current caret node
-		                        if (elem.classList.contains("mceNonEditable")) {
-		                        	e.preventDefault();
-	                                return false;
-		                        }
-		                    } catch (e) {console.log(e);}
-		                }
-					});
-					
-					editor.on('TableModified', function(e) {
-						editor.setContent(editor.getContent());	      
-					});
-					
-					editor.ui.registry.addIcon('save', '<i style="font-size:125%;" class="fas fa-save"></i>')
-					
-					editor.ui.registry.addButton('insert-data', {
-						icon: 'code-sample',
-						tooltip: 'Insertar indicador/encuesta',
-				      	onAction: function(_){ 
-				      		$('#searchIndsModal').modal('show');
-				      	}
-				    });
-						
-					editor.ui.registry.addButton('topdf', {
-						icon: 'print',
-						tooltip: 'Imprimir a PDF',
-				      	onAction: function(_){ 
-				      		print_to_pdf(editor.getContent());
-				      	}
-				    });
-					
-					editor.ui.registry.addButton('btn-editable', {
-						icon: 'unlock',
-						tooltip: 'Desbloquear contenido',
-				      	onAction: function(_){ 
-				      		var ns = $(editor.selection.getSelectedBlocks()).each(function(b){
-				      			$(console.log($(this)))
-				      			$(this).removeClass('mceEditable').removeClass('mceNonEditable').addClass('mceEditable')
-				      		});
-				      		editor.setContent(editor.getContent());	      		
-				      	}
-				    });
-					
-					editor.ui.registry.addButton('btn-noneditable', {
-						icon: 'lock',
-						tooltip: 'Bloquear contenido',
-				      	onAction: function(_){ 
-				      		var ns = $(editor.selection.getSelectedBlocks()).each(function(b){
-				      			$(console.log($(this)))
-				      			$(this).removeClass('mceEditable').removeClass('mceNonEditable').addClass('mceNonEditable')
-				      		});
-				      		editor.setContent(editor.getContent());
-				      	}
-				    });
-					
-					editor.on('init', function(e) {
-			            formEdit();
-			        });
-				},
-				codesample_languages: [
-				    { text: 'Valor de indicador o encuesta', value: 'markup' },
-				  ],
-				save_onsavecallback: function(){save_content();},
-				autosave_ask_before_unload: true,
-				autosave_interval: '20s',
-				autosave_prefix: '{path}{query}-{id}-',
-				autosave_restore_when_empty: false,
-				autosave_retention: '2m',
-				image_advtab: true,
-				link_list: [
-				  { title: 'My page 1', value: 'https://www.tiny.cloud' },
-				  { title: 'My page 2', value: 'http://www.moxiecode.com' }
-				],
-				image_list: [
-				  { title: 'My page 1', value: 'https://www.tiny.cloud' },
-				  { title: 'My page 2', value: 'http://www.moxiecode.com' }
-				],
-				image_class_list: [
-				  { title: 'None', value: '' },
-				  { title: 'Some class', value: 'class-name' }
-				],
-				importcss_append: true,
-				file_picker_callback: (callback, value, meta) => {
-				  /* Provide file and text for the link dialog */
-				  if (meta.filetype === 'file') {
-				    callback('https://www.google.com/logos/google.jpg', { text: 'My text' });
-				  }
-				
-				  /* Provide image and alt text for the image dialog */
-				  if (meta.filetype === 'image') {
-				    callback('https://www.google.com/logos/google.jpg', { alt: 'My alt text' });
-				  }
-				
-				  /* Provide alternative source and posted for the media dialog */
-				  if (meta.filetype === 'media') {
-				    callback('movie.mp4', { source2: 'alt.ogg', poster: 'https://www.google.com/logos/google.jpg' });
-				  }
-				},
-				table_class_list: [
-				    {title: 'Normal', value: ''},
-				    {title: 'Editable', value: 'mceEditable'},
-				    {title: 'No editable', value: 'mceNonEditable'},
-				    {title: 'Ignorar en el PDF', value: 'mceNonEditable pdfignore'}
-				],
-				table_appearance_options: true,
-				table_sizing_mode: 'fixed',
-				table_default_styles: {
-				    width: '297mm'
-				},
-				height: 600,
-				image_caption: true,
-				quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
-				toolbar_mode: 'sliding',
-				contextmenu: 'link image table',
-			});			
-			
-		});
-		
-		function completeTitulations(){
-			console.log('tits');
-			if ($('#centersSelector').val() !== null && $('#centersSelector').val() !== ''){
-				var params = {'center':$('#centersSelector').val()};
-				$.post("/ajax/get/titulations", params, function(data){ 
-					$("#titulationsSelector").html(data).selectpicker('refresh'); 
-					$('#titulationsSelector').val('').trigger('change');
-				});
-			}
-		}
-		
-		function save_content(){			
-			$.post("/ajax/template/save", 
-			   {id: $('#templateSelector').val(),
-				codi:$('#codiInput').val(),
-				versio:$('#versioInput').val(),
-				nomCas:$('#nomCasInput').val(),
-				nomVal:$('#nomValInput').val(),
-				ambit:$('#ambitInput').val(),
-				text:tinymce.activeEditor.getContent(),
-				action:action},
-			   function(d){
-					if(d == '0'){
-						alert('Ya existe la combinación Código-Versión-Ámbito');
-					}
-					else{
-						alert('Acción realizada correctamente');
-					}
-					
-				}
-			);
-		}
-		
-		function print_to_pdf(content){
-			$('<form id="tmpDownloadForm" method="post" action="/pdf/preview" target="_blank">' +
-			  	'<textarea id="tmpDownloadContent" type="hidden" name="content">' +
-			  		tinymce.activeEditor.getContent() +
-			  	'</textarea>' +
-			  '</form>')
-			.appendTo('body')
-			.submit()
-			.remove();	
-		}
-		
-		function insert_data(){
-			tinymce.activeEditor.selection.setContent('{{'+$('#indSelector').val()+'}}');
-			$('#searchIndsModal').modal('hide');
-		}
-		
-		function formEdit(){
-			$.post("/ajax/template/form", {id:$('#templateSelector').val(), action:"edit"}, function(rawData){ 
-				var form = $($.parseHTML(rawData));
-				$(form).find('#editorContent')[0].remove()
-				var data = $($.parseHTML(rawData)).find('#editorContent').html();
-				$('#formFields').html('');
-				$(form).appendTo($('#formFields'));
-				tinymce.activeEditor.setContent(data);
-				action = "edit";
-				$('#formFields').show();
-				isUsed();
-			});
-		}
-		
-		function isUsed(){
-			$.get("/ajax/template/used/"+$('#templateSelector').val(), function(d){ 
-				$('#isUsed').html(d == 1 ? '<i class="fas fa-link"></i>' : '<i class="fas fa-unlink"></i>');	
-			});
-		}
-
-		function formNew(){
-			$.post("/ajax/template/form", {id:0, action:"new"}, function(rawData){ 
-				var form = $($.parseHTML(rawData));
-				$(form).find('#editorContent')[0].remove()
-				var data = $($.parseHTML(rawData)).find('#editorContent').html();
-				$('#formFields').html('');
-				$(form).appendTo($('#formFields'));
-				tinymce.activeEditor.setContent(data);
-				action = "new";
-				$('#formFields').show();
-			});
-		}
-		
-		function formDuplicate(){
-			$.post("/ajax/template/form", {id:$('#templateSelector').val(), action:"duplicate"}, function(rawData){ 
-				var form = $($.parseHTML(rawData));
-				$(form).find('#editorContent')[0].remove()
-				var data = $($.parseHTML(rawData)).find('#editorContent').html();
-				$('#formFields').html('');
-				$(form).appendTo($('#formFields'));
-				tinymce.activeEditor.setContent(data);
-				action = "duplicate";
-				$('#formFields').show();
-			});
-		}
-		
-		function formDelete(){
-			$.ajax({
-			     url: "/ajax/template/form",
-			     type: "DELETE",
-			     data: {id:$('#templateSelector').val()}
-			  })
-			  .done(function(d){
-					if(d == '1'){
-						location.reload();
-					}
-					else{
-						alert('La plantilla está asignada a un procedimiento. No se puede eliminar.');
-					}
-			  });
-		}
-		
-		function testTemplate(){
-			var url = "/admin/editor/test?idPlantilla="+$('#templateSelector').val()+"&idTitulacio="+$('#titulationsSelector').val()+"&idCentre="+$('#centersSelector').val()+"&curs="+$('#cursSelector').val();
-			window.open(url, '_blank').focus();	
-		}
-			
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 152
src/main/resources/templates/adminTemplateTest.html

@@ -1,152 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-		
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6">Editor de plantillas</h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				
-				
-				<div class="uv-table-group" id="formFields">
-					
-				</div>
-				
-				<div class="uv-table-group">
-					<textarea id="editor" name="evidencia_text" th:text="${text}"></textarea>
-				</div>
-				
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-  
-	<script type="text/javascript">
-		
-	
-		var action;
-		var locale = "[[${#locale.language}]]";
-	
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-			tinymce.init({ 
-				selector: '#editor',
-				language: locale,
-				plugins: 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists charmap quickbars checklist',
-				menubar: 'file edit',
-				toolbar: 'save | undo redo | bold italic underline strikethrough | forecolor backcolor removeformat | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | charmap | topdf | fullscreen ',
-				table_advtab: false,
-				table_row_advtab: false,
-				table_cell_advtab: false,
-				table_toolbar: 'tableinsertrowbefore tableinsertrowafter tabledeleterow',
-				content_style: "body { font-size: 10pt; }",
-				body_class: 'mceNonEditable',
-				setup: (editor) => {
-					
-					editor.on('keydown', function(e) {
-						if (e.keyCode == 8 || e.keyCode == 46) { //backspace and delete keycodes
-		                    try {
-		                        var elem = tinymce.activeEditor.selection.getNode(); //current caret node
-		                        console.log(elem);
-		                        if (elem.classList.contains("mceNonEditable")) {
-		                        	e.preventDefault();
-	                                return false;
-		                        }
-		                    } catch (e) {console.log(e);}
-		                }
-					});		
-					
-					editor.ui.registry.addIcon('save', '<i style="font-size:125%;" class="fas fa-save"></i>')
-						
-					editor.ui.registry.addButton('topdf', {
-						icon: 'print',
-						tooltip: 'Imprimir a PDF',
-				      	onAction: function(_){ 
-				      		print_to_pdf(editor.getContent());
-				      	}
-				    });	
-					
-					editor.on('FullscreenStateChanged', function () {
-						if(tinymce.activeEditor.plugins.fullscreen.isFullscreen()){
-							var e = '<span id="exitFullScreen" class="btn btn-primary pointer" style="position:absolute;display:none;float:right;right:15px;top:25px;color:white;background-color:#007bff;padding:8px;cursor:pointer;" onclick="tinymce.activeEditor.execCommand('+"'mceFullScreen'"+');">Volver a SAIC <i class="fas fa-compress-arrows-alt"></i></span>';
-							$(e).appendTo($($('.tox-editor-container').get(0)));
-							$('#exitFullScreen').show();
-						}
-						else{
-							$('#exitFullScreen').remove();	
-							
-						}
-					});	
-				},
-				save_onsavecallback: function(){return false;},
-				content_langs: [
-				    {title: 'Español', code: 'es'},
-				    {title: 'Català', code: 'ca'}],
-				image_advtab: true,
-				importcss_append: true,
-				height: 700,
-				image_caption: true,
-				quickbars_selection_toolbar: '',
-				toolbar_mode: 'sliding',
-				contextmenu: ''
-			});
-			
-		});
-		
-		function print_to_pdf(content){
-			$('<form id="tmpDownloadForm" method="post" action="/pdf/preview" target="_blank">' +
-			  	'<textarea id="tmpDownloadContent" type="hidden" name="content">' +
-			  		tinymce.activeEditor.getContent() +
-			  	'</textarea>' +
-			  '</form>')
-			.appendTo('body')
-			.submit()
-			.remove();	
-		}
-			
-	</script>
-
-</body>
-
-</html>

+ 0 - 204
src/main/resources/templates/adminTemplates.html

@@ -1,204 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{admin.templates.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{admin.templates.subtitle}"></span>
-					</div>
-				</div>
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<div class="uv-table-group-procedure" id="proceduresContainer">
-					<label th:text="#{admin.instances.selector.procedure}">Proces(os)</label>
-					<select class="selectpicker" id="proceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-				        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-				    </select>
-				</div>
-				<div class="uv-table-group-procedure">
-					<label th:text="#{admin.instances.selector.center}">Centre(s)</label>
-					<select class="selectpicker" id="centersSelector" name="center" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-				        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-				    </select>
-				</div>
-				<div class="uv-table-group-procedure">
-					<label th:text="#{admin.instances.selector.titulation}">Titulació(ns)</label>
-					<select class="selectpicker" id="titulationsSelector" name="titulation" data-live-search="true" data-width="100%" data-actions-box="true" required>
-				        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-				    </select>
-				</div>
-				<div class="uv-table-group" style="margin-top:50px;">
-					<button th:text="#{admin.actions.load}" class="btn btn-primary" onclick="loadTemplates();">Cargar</button>
-				</div>
-				<div class="uv-table-group" id="templates_container">
-					<br><br>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<div class="modal fade" id="editIndsModal" tabindex="-1" role="dialog" aria-labelledby="newRoleModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title" th:text="'Modificar los indicadores asociados'">Modificar los indicadores asociados</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid" id="editIndsContainer">
-			    	
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" th:text="#{global.confirm}" onclick="save();" data-dismiss="modal">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-  
-	<script type="text/javascript">
-		
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('#proceduresSelector').val('').trigger('change');
-			$('#centersSelector').val('').trigger('change');
-			$('#centersSelector').change(completeTitulations);
-			//$('#proceduresSelector').change(complete);
-		});
-		
-		function complete(){
-			completeCenters();
-			completeTitulations();
-		}
-		
-		function completeCenters(){
-			console.log('cents');
-			var params = {'procedure':$('#proceduresSelector').val()};
-			$.post("/ajax/find/centers", params, function(data){ $("#centersSelector").html(data).selectpicker('refresh'); $('#centersSelector').val('').trigger('change');});
-		}
-		function completeTitulations(){
-			console.log('tits');
-			if ($('#centersSelector').val() !== null && $('#centersSelector').val() !== ''){
-				var params = {'procedure':$('#proceduresSelector').val(), 'center':$('#centersSelector').val()};
-				$.post("/ajax/find/titulations", params, function(data){ 
-					$("#titulationsSelector").html(data).selectpicker('refresh'); 
-					$('#titulationsSelector').val('').trigger('change');
-				});
-			}
-		}
-		
-		function loadTemplates(){
-			var params = {'procedure':$('#proceduresSelector').val(), 'center':$('#centersSelector').val(), 'titulation':$('#titulationsSelector').val()};
-			$.post("/ajax/find/templates", params, function(data){ 
-				$("#templates_container").html(data);
-			});
-		}
-		
-		function getSelectedInds(e){
-			console.log($(e).attr('href').replace('/template/', '/template/inds/'));
-			$.get($(e).attr('href').replace('/template/', '/template/inds/'), function(data){
-				  $("#selectInds").html(data);
-				  layout.footerFixBySelector(".uv-container");
-			});
-		}
-		
-		function showEditInds(ev){
-			var params = {'procedure':$('#proceduresSelector').val(), 'center':$('#centersSelector').val(), 
-						  'titulation':$('#titulationsSelector').val(), 'ev':ev};
-			$.post('/ajax/find/template/inds', params, function(data){
-				  $('#editIndsContainer').html(data);
-				  $('#editIndsModal').modal('show');
-			});
-		}
-		
-		function removeRow(e){
-			e.parentNode.parentNode.remove();
-		}
-		
-		function addRow(e){		
-			var tr = document.createElement('tr');
-			var i = document.createElement('td');
-			var e = document.createElement('td');
-			var m = document.createElement('td');
-			var d = document.createElement('td');
-			
-			$('#new_val_indicador').clone()
-								   .attr('id', '')
-								   .attr('name','indicador[]')
-								   .val($('#new_val_indicador').val())
-								   .appendTo($(i));
-			$('#new_val_enquesta').clone()
-								  .attr('id', '')
-								  .attr('name','enquesta[]')
-								  .val($("#new_val_enquesta").find("option:selected").val())
-								  .appendTo($(e));
-			$('#new_val_media').clone()
-							   .attr('id', '')
-							   .attr('name','media[]')
-							   .val($('#new_val_media').val())
-							   .appendTo($(m));
-			$(d).html('<span class="pointer" style="color:red;" onclick="removeRow(this);"><i class="fas fa-times"></i></span>');
-			$(i).appendTo(tr);
-			$(e).appendTo(tr);
-			$(m).appendTo(tr);
-			$(d).appendTo(tr);
-			$(tr).appendTo($('#inds_table_body'));
-			
-			$('#new_val_indicador').val('');
-			$('#new_val_media').val('');
-		}
-		
-		function save(){
-			$.post('/admin/templates/inds/update', $('#inds_form').serialize())
-		}
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 240
src/main/resources/templates/adminTemplates2.html

@@ -1,240 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{admin.templates.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{admin.templates.subtitle}"></span>
-					</div>
-				</div>
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<!-- 
-				<div class="uv-table-group-procedure" id="proceduresContainer">
-					<label th:text="#{admin.instances.selector.procedure}">Proces(os)</label>
-					<select class="selectpicker" id="proceduresSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-				        <option th:each="item : ${procedures}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.value}"></option>
-				    </select>
-				</div>
-				 -->
-				<div class="form-group uv-table-group-procedure">
-					<div class="form-group row">
-						<label th:text="#{admin.instances.selector.center}">Centre</label>
-						<select class="selectpicker" id="centersSelector" name="center" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="form-group row">
-						<label th:text="#{admin.instances.selector.titulation}">Titulació</label>
-						<select class="selectpicker" id="titulationsSelector" name="titulation" data-live-search="true" data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="form-group row">
-						<div class="col-4">
-							<label>Evidencia</label>
-							<select class="selectpicker" id="evSelector" name="evidencia" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${evs}" th:text="${item}" th:attr="value=${item}"></option>
-						    </select>
-					    </div>
-						<div class="col-4">
-							<label th:text="#{admin.instances.selector.curs}">Curs</label>
-							<select class="selectpicker" id="cursSelector" name="taskType" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option th:each="i: ${#numbers.sequence(currentYear, currentYear-3)}" th:attr="value=${i}" th:text="${i}">2021</option>
-						    </select>
-						</div>
-						<div class="col-4">
-							<label th:text="#{admin.instances.selector.taskType}">Tipus de tasca</label>
-							<select class="selectpicker" id="taskSelector" name="taskType" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option value="1">Adjuntar evidencia</option>
-						        <option value="12">Adjuntar evidencia editable</option>
-						        <option value="14">Adjuntar evidencia, plantilla varias titulaciones</option>
-						    </select>
-						</div>
-					</div>
-				</div>
-				<div class="uv-table-group" style="margin-top:50px;">
-					<button th:text="#{admin.actions.load}" class="btn btn-primary" onclick="loadTemplates();">Cargar</button>
-				</div>
-				<div class="uv-table-group" id="templates_container">
-					<br><br>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<div class="modal fade" id="editIndsModal" tabindex="-1" role="dialog" aria-labelledby="newRoleModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title" th:text="'Modificar los indicadores asociados'">Modificar los indicadores asociados</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid" id="editIndsContainer">
-			    	
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" th:text="#{global.confirm}" onclick="save();" data-dismiss="modal">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-  
-	<script type="text/javascript">
-		
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('#proceduresSelector').val('').trigger('change');
-			$('#centersSelector').val('').trigger('change');
-			$('#centersSelector').change(completeTitulations);
-			//$('#proceduresSelector').change(complete);
-		});
-		
-		function complete(){
-			completeCenters();
-			completeTitulations();
-		}
-		
-		function completeCenters(){
-			console.log('cents');
-			var params = {'procedure':$('#proceduresSelector').val()};
-			$.post("/ajax/find/centers", params, function(data){ $("#centersSelector").html(data).selectpicker('refresh'); $('#centersSelector').val('').trigger('change');});
-		}
-		function completeTitulations(){
-			console.log('tits');
-			if ($('#centersSelector').val() !== null && $('#centersSelector').val() !== ''){
-				var params = {'center':$('#centersSelector').val()};
-				$.post("/ajax/get/titulations", params, function(data){ 
-					$("#titulationsSelector").html(data).selectpicker('refresh'); 
-					$('#titulationsSelector').val('').trigger('change');
-				});
-			}
-		}
-		
-		function loadTemplates(){
-			//var params = {'procedure':$('#proceduresSelector').val(), 'center':$('#centersSelector').val(), 'titulation':$('#titulationsSelector').val()};
-// 			var params = {'center':$('#centersSelector').val(), 'titulation':$('#titulationsSelector').val(),
-// 					      'curs':$('#proceduresSelector').val(), };
-// 			$.post("/ajax/find/templates", params, function(data){ 
-// 				$("#templates_container").html(data);
-// 			});
-
-			var url = "/test/template2/"+$('#titulationsSelector').val()+"/"+$('#centersSelector').val();
-			url += "/"+$('#evSelector').val()+"/"+$('#cursSelector').val()+"/"+$('#taskSelector').val();
-			window.open(url, '_blank').focus();
-			
-		}
-		
-		function getSelectedInds(e){
-			console.log($(e).attr('href').replace('/template/', '/template/inds/'));
-			$.get($(e).attr('href').replace('/template/', '/template/inds/'), function(data){
-				  $("#selectInds").html(data);
-				  layout.footerFixBySelector(".uv-container");
-			});
-		}
-		
-		function showEditInds(ev){
-			var params = {'procedure':$('#proceduresSelector').val(), 'center':$('#centersSelector').val(), 
-						  'titulation':$('#titulationsSelector').val(), 'ev':ev};
-			$.post('/ajax/find/template/inds', params, function(data){
-				  $('#editIndsContainer').html(data);
-				  $('#editIndsModal').modal('show');
-			});
-		}
-		
-		function removeRow(e){
-			e.parentNode.parentNode.remove();
-		}
-		
-		function addRow(e){		
-			var tr = document.createElement('tr');
-			var i = document.createElement('td');
-			var e = document.createElement('td');
-			var m = document.createElement('td');
-			var d = document.createElement('td');
-			
-			$('#new_val_indicador').clone()
-								   .attr('id', '')
-								   .attr('name','indicador[]')
-								   .val($('#new_val_indicador').val())
-								   .appendTo($(i));
-			$('#new_val_enquesta').clone()
-								  .attr('id', '')
-								  .attr('name','enquesta[]')
-								  .val($("#new_val_enquesta").find("option:selected").val())
-								  .appendTo($(e));
-			$('#new_val_media').clone()
-							   .attr('id', '')
-							   .attr('name','media[]')
-							   .val($('#new_val_media').val())
-							   .appendTo($(m));
-			$(d).html('<span class="pointer" style="color:red;" onclick="removeRow(this);"><i class="fas fa-times"></i></span>');
-			$(i).appendTo(tr);
-			$(e).appendTo(tr);
-			$(m).appendTo(tr);
-			$(d).appendTo(tr);
-			$(tr).appendTo($('#inds_table_body'));
-			
-			$('#new_val_indicador').val('');
-			$('#new_val_media').val('');
-		}
-		
-		function save(){
-			$.post('/admin/templates/inds/update', $('#inds_form').serialize())
-		}
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 0
src/main/resources/templates/blank.html


+ 0 - 32
src/main/resources/templates/components/form_new_manager.html

@@ -1,32 +0,0 @@
-<form enctype='multipart/form-data' method="POST" action="/admin/userrole/new" style="margin-top:25px;">
-
-	<input type="hidden" id="newRoleCentre" name="centre" value="">
-	<input type="hidden" id="newRoleTitulacio" name="titulacions" value="">
-	
-	<div class="row">
-		<div class="col">
-			<strong>Añadir nuevo responsable para el centro y titulación(es) seleccionado(s)</strong>
-			<br>
-		</div>
-	</div>
-	
-	<div class="row">
-		<div class="col">
-			<label>Usuario</label>
-			<select class="selectpicker" id="userSelector" name="usuari" data-dropup-auto="false" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-		        <option th:each="item : ${users}" th:text="${item.nom}+' '+${item.cognoms}+' ('+${item.email}+')'" th:attr="value=${item.usuari}"></option>
-		    </select>
-		</div>
-		<div class="col">
-			<label>Rol</label>
-			<select class="selectpicker" id="roleSelector" name="idRol" data-dropup-auto="false" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-		        <option th:each="item : ${roles}" th:text="${#locale.language} == 'es' ? ${item.descripcioCas}:${item.descripcioVal}" th:attr="value=${item.idRol}"></option>
-		    </select>
-		</div>
-	</div>
-	<div class="row" style="margin-top:20px;margin-bottom:25px;">
-		<div class="col" >
-			<button class="btn btn-success" type="submit">Confirmar</button>
-		</div>
-	</div>
-</form>

+ 0 - 224
src/main/resources/templates/components/form_procedure.html

@@ -1,224 +0,0 @@
-<div id="accordion">
-	<div class="card">
-		<div class="card-header pointer collapsed" id="headingSummary" onclick="loadFlowDiagramDelayed();" data-toggle="collapse" data-target="#collapseSummary" aria-expanded="false" aria-controls="collapseSummary">
-			<h6 class="mb-0">
-				<strong>Resumen</strong>
-				<span style="float:right;font-size: 21px; "><i class="fas fa-caret-down"></i></span>
-			</h6>
-		</div>
-		<div id="collapseSummary" class="collapse" aria-labelledby="headingSummary" data-parent="#accordion">
-			<div class="card-body">
-				<div class="btn-toolbar mermaid-tools" role="toolbar" style="float:left;">
-					<div class="btn-group w-auto ml-auto pointer" role="group" aria-label="downloadDiagram">
-						<span class="btn btn-secondary pointer" style="width:38px; height:38px; padding:6px" onclick="downloadFlowDiagram();"><i class="fas fa-download"></i></span>
-					</div>
-				</div>
-				<div class="mermaid"></div>
-			</div>
-		</div>
-	</div>
-	<div class="card">
-		<div class="card-header pointer" id="headingOne" data-toggle="collapse" data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
-			<h6 class="mb-0">
-				<strong th:text="#{admin.procedures.info.procedure}">Información del procedimiento</strong>
-				<span style="float:right;font-size: 21px; "><i class="fas fa-caret-down"></i></span>
-			</h6>
-		</div>
-		<div id="collapseOne" class="collapse show" aria-labelledby="headingOne" data-parent="#accordion">
-			<div class="card-body">
-				<div class="form-group row">
-					<div class="col-2">
-						<label th:text="#{admin.procedures.form.id}">ID</label>
-						<input type="text" name="idProces" id="idProces" class="form-control" th:value="${procedure.idProces}" required th:attr="readonly=(${action} == 'edit' ? 'true' : 'false')">
-					</div>
-					<div class="col-4">
-						<label th:text="#{admin.procedures.form.nameProcedure}">Código</label>
-						<input type="text" name="nomProces" id="nomProces" class="form-control" th:value="${procedure.nomProces}" required>
-					</div>
-					<div class="col-4">
-						<label th:text="#{admin.procedures.form.subtitleProcedure}">Dimensión abreviada</label>
-						<input type="text" name="subTitol" id="subTitol" class="form-control" th:value="${procedure.subTitol}">
-					</div>
-					<div class="col-2">
-						<label th:text="#{admin.procedures.form.context}">Ambito</label>
-						<select class="form-control pointer" name="ambit" id="ambit" required>
-							<option th:selected="${procedure.ambit=='U'}" value="U">U</option>
-							<option th:selected="${procedure.ambit=='C'}" value="C">C</option>
-							<option th:selected="${procedure.ambit=='T'}" value="T">T</option>
-						</select>
-					</div>
-
-				</div>
-				<div class="form-group row">
-					<div class="col">
-						<label th:text="#{admin.procedures.form.version}">Versión</label>
-						<input type="number" name="versio" id="versio" class="form-control" th:value="${procedure.versio}" required>
-					</div>
-					<div class="col">
-						<label th:text="#{admin.procedures.form.activationYear}">Curso de activación</label>
-						<input type="number" name="cursActivacio" id="cursActivacio" class="form-control" th:value="${procedure.cursActivacio}" required>
-					</div>
-					<div class="col">
-						<label th:text="#{admin.procedures.form.evalYear}">Curso evaluado</label>
-						<input type="number" name="cursAvaluat" id="cursAvaluat" class="form-control" th:value="${procedure.cursAvaluat}" required>
-					</div>
-				</div>
-				<div class="form-group">
-					<label th:text="#{admin.procedures.form.titleCas}">Titulo cas</label>
-					<input type="text" name="titolCas" id="titolCas" class="form-control" th:value="${procedure.titolCas}">
-				</div>
-				<div class="form-group">
-					<label th:text="#{admin.procedures.form.titleVal}">Titulo val</label>
-					<input type="text" name="titolVal" id="titolVal" class="form-control" th:value="${procedure.titolVal}">
-				</div>
-				<div class="form-group">
-					<label th:text="#{admin.procedures.form.descriptionCas}">Descripción cas</label>
-					<textarea name="descripcioCas" id="descripcioCas" class="form-control" th:text="${procedure.descripcioCas}"></textarea>
-				</div>
-				<div class="form-group">
-					<label th:text="#{admin.procedures.form.descriptionVal}">Descripción val</label>
-					<textarea name="descripcioVal" id="descripcioVal" class="form-control" th:text="${procedure.descripcioVal}"></textarea>
-				</div>
-				<div class="form-group">
-					<label th:text="#{admin.procedures.form.comments}">Comentarios</label>
-					<textarea name="comentaris" id="comentaris" class="form-control" th:text="${procedure.comentaris}"></textarea>
-				</div>
-			</div>
-		</div>
-	</div>
-	<div class="card card-task" th:each="item,i : ${tasks}">
-		<div class="card-header pointer collapsed" data-toggle="collapse" th:attr="data-target='#collapseTask'+${i.index}, id='heading'+${i.index}, aria-controls='collapseTask'+${i.index}" aria-expanded="false">
-			<h6 class="mb-0">
-				<strong th:text="#{admin.procedures.info.task}+' '+${i.index+1}"></strong>
-				<span style="float:right;font-size: 21px;"><i class="fas fa-caret-down"></i></span>
-			</h6>
-		</div>
-		<div th:attr="id='collapseTask'+${i.index}, aria-labelledby='heading'+${i.index}" class="collapse" data-parent="#accordion">
-			<div class="card-body">
-				<div>
-					<div class="form-group">
-						<span class="btn btn-danger pointer"
-							style="float:right;font-size: 14px;border-radius:50px;margin-right:10px;"
-							th:onclick="'removeTask(\''+${i.index}+'\');'"><i class="fas fa-trash"></i></span>
-						</br>
-					</div>
-					<div class="form-group row">
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.taskp}">ID Tascap</label>
-							<input type="text" name="idTascap[]" class="form-control" th:value="${item.idTascap}" required th:attr="readonly=(${action} == 'edit' ? 'true' : 'false')">
-						</div>
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.limitDate}">Fecha límite</label>
-							<div class="input-group date datepicker">
-								<input data-date-format="dd/mm/yyyy" type="text" name="dataLimit[]" th:value="${#dates.format(item.dataLim, 'dd/MM/yyyy')}" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>
-						</div>
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.type}">Tipo</label>
-							<select class="form-control pointer" name="tipus[]" required onchange="changeType(this);">
-								<option th:selected="${item.tipus.tipus==tt.tipus}" th:attr="value=${tt.tipus}" th:each="tt : ${tipus}" th:text="${tt.descripcio}">Tipo</option>
-							</select>
-						</div>
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.role}">ID Rol</label>
-							<select class="form-control" name="idRol[]" required>
-								<option th:each="role : ${roles}"
-									th:text="${#locale.language} == 'es' ? ${role.descripcioCas}:${role.descripcioVal}" th:attr="value=${role.idRol}" th:selected="${role.idRol==item.rol.idRol}"></option>
-							</select>
-						</div>
-					</div>
-					<div class="form-group row">
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.next}">ID Siguiente tarea</label>
-							<input type="text" name="idTascaSeg[]" class="form-control" th:value="${item.idTascaSeg}" required>
-						</div>
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.next2}">ID Siguiente tarea 2</label>
-							<input type="text" name="idTascaSeg2[]" class="form-control" th:value="${item.idTascaSeg2}">
-						</div>
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.options}">Opciones</label>
-							<input type="text" name="opcions[]" class="form-control" th:value="${item.opcions}">
-						</div>
-						<div class="col-3">
-							<label th:text="#{admin.procedures.form.report}">¿Genera informe?</label>
-							<select class="form-control" name="informe[]" required>
-								<option th:selected="${item.informe}" value="true">Si</option>
-								<option th:selected="${!item.informe}" value="false">No</option>
-							</select>
-						</div>
-					</div>
-					<div class="form-group">
-						<label th:text="#{admin.procedures.form.titleCas}">Titulo cas</label>
-						<input type="text" name="titolCas[]" class="form-control task" th:value="${item.titolCas}">
-					</div>
-					<div class="form-group">
-						<label th:text="#{admin.procedures.form.titleVal}">Titulo val</label>
-						<input type="text" name="titolVal[]" class="form-control task" th:value="${item.titolVal}">
-					</div>
-					<div class="form-group">
-						<label th:text="#{admin.procedures.form.descriptionCas}">Descripción cas</label>
-						<textarea name="descripcioCas[]" class="form-control task"
-							th:text="${item.descripcioCas}"></textarea>
-					</div>
-					<div class="form-group">
-						<label th:text="#{admin.procedures.form.descriptionVal}">Descripción val</label>
-						<textarea name="descripcioVal[]" class="form-control task"
-							th:text="${item.descripcioVal}"></textarea>
-					</div>
-					<div id="evidence1Fields" th:style="${item.tipus.tipus == 11 or item.tipus.tipus == 15 ? 'display:none;' : ''}">
-						<div class="form-group row">
-							<div class="col-3">
-								<label th:text="#{admin.procedures.form.evCode}">Código evidencia</label>
-								<input type="text" name="codiEvidencia[]" class="form-control task" th:value="${item.codiEvidencia}">
-							</div>
-						</div>
-						<div class="form-group row">
-							<div class="col-6">
-								<label th:text="#{admin.procedures.form.nameEvCas}">Nombre evidencia cas</label>
-								<input type="text" name="nomEvidenciaCas[]" class="form-control task" th:value="${item.nomEvidenciaCas}">
-							</div>
-							<div class="col-6">
-								<label th:text="#{admin.procedures.form.nameEvVal}">Nombre evidencia val</label>
-								<input type="text" name="nomEvidenciaVal[]" class="form-control task" th:value="${item.nomEvidenciaVal}">
-							</div>
-						</div>
-					</div>
-					<div class="hiddenFields" id="evidence11Fields" th:style="${item.tipus.tipus != 11 and item.tipus.tipus != 15 ? 'display:none;' : ''}">
-						<div class="form-group row">
-							<div class="col-8">
-								<label>Plantilla</label>
-								<select class="selectpicker" name="idPlantilla[]" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}">
-									<option th:each="template : ${templates}"
-										th:text="${#locale.language} == 'es' ? ${template.codi}+' {v'+${template.versio}+'} ['+${template.ambit}+'] '+${template.nomCas}:${template.codi}+' {v'+${template.versio}+'} ['+${template.ambit}+'] '+${template.nomVal}"
-										th:attr="value=${template.idPlantilla}" th:selected="${#strings.equals(item.codiEvidencia, #strings.toString(template.idPlantilla))}">
-									</option>
-								</select>
-							</div>
-						</div>
-					</div>
-					<hr>
-				</div>
-			</div>
-		</div>
-	</div>
-</div>
-<span class="btn btn-success pointer" onclick="newTask();" style="margin-top:15px; float:right;"> 
-	<i class="fas fa-plus"></i> 
-	<span th:text="#{admin.procedures.form.addTask}">Añadir tarea</span>
-</span>
-<div class="uv-table-group" id="actionFields" style="margin-top:20px;">
-	<button class="btn btn-primary" id="formSubmit" type="submit" th:if="${action == 'new' or action == 'duplicate'}"> 
-		<i class="fas fa-plus"></i> 
-		<span th:text="#{admin.procedures.confirm}">Confirmar</span>
-	</button>
-	<button class="btn btn-info" id="formSubmit" type="submit" th:if="${action == 'edit'}"> 
-		<i class="fas fa-edit"></i>
-		<span th:text="#{admin.procedures.confirm}">Confirmar</span>
-	</button>
-</div>

+ 0 - 9
src/main/resources/templates/components/form_procedure_remove_confirm.html

@@ -1,9 +0,0 @@
-<div class="row">
-	<div class="col">
-		<input type="hidden" name="idProces" th:value="${procedure.idProces}">
-		<br>
-		<strong><i class="fas fa-exclamation-triangle" style="color:#dc3545;"></i> <span th:text="#{admin.procedures.form.removeConfirm}">Si elimina este procedimiento los datos no se podrán recuperar</span></strong>
-		<br><br>
-		<button class="btn btn-danger" id="formSubmit" type="submit"><i class="fas fa-trash"></i> <span th:text="#{admin.procedures.confirm}">Confirmar</span></button>
-	</div>
-</div>

+ 0 - 113
src/main/resources/templates/components/form_procedure_task.html

@@ -1,113 +0,0 @@
-  <div class="card card-task">
-    <div class="card-header pointer collapsed" data-toggle="collapse" th:attr="data-target='#collapseTask'+${i}, id='heading'+${i}, aria-controls='collapseTask'+${i}" aria-expanded="false">
-      <h6 class="mb-0">
-		<strong th:text="#{admin.procedures.info.task}+' '+${i+1}"></strong>
-		<span style="float:right;font-size: 21px;"><i class="fas fa-caret-down"></i></span>
-      </h6>
-    </div>
-    <div th:attr="id='collapseTask'+${i}, aria-labelledby='heading'+${i}" class="collapse" data-parent="#accordion">
-      <div class="card-body">
-	      <div>
-	        <div class="form-group">
-		    	<span class="btn btn-danger pointer" style="float:right;font-size: 14px;border-radius:50px;margin-right:10px;" th:onclick="'removeTask(\''+${i}+'\');'"><i class="fas fa-trash"></i></span>
-	        	</br>
-	        </div>
-	      	<div class="form-group row">
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.taskp}">ID Tascap</label>
-					<input type="text" name="idTascap[]" class="form-control" required>
-				</div>
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.limitDate}">Fecha límite</label>
-					<div class="input-group date datepicker"> 
-						<input data-date-format="dd/mm/yyyy" type="text" name="dataLimit[]" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-						<div class="input-group-prepend uv-date-icon">
-							<div class="input-group-addon input-group-text">
-								<span class="fa fa-calendar"></span>
-							</div>
-						</div>
-					</div>					
-				</div> 
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.type}">Tipo</label>
-					<select class="form-control pointer" name="tipus[]" required onchange="changeType(this);">
-						<option th:selected="${tt.tipus==1}" th:attr="value=${tt.tipus}" th:each="tt : ${tipus}" th:text="${tt.descripcio}">Tipo</option>
-					</select>
-				</div>
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.role}">ID Rol</label>
-					<select class="form-control" name="idRol[]" required>
-				        <option th:each="role : ${roles}" th:text="${#locale.language} == 'es' ? ${role.descripcioCas}:${role.descripcioVal}" th:attr="value=${role.idRol}"></option>
-				    </select>
-				</div>
-			</div>
-			<div class="form-group row">
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.next}">ID Siguiente tarea</label>
-					<input type="text" name="idTascaSeg[]" class="form-control" required>
-				</div>
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.next2}">ID Siguiente tarea 2</label>
-					<input type="text" name="idTascaSeg2[]" class="form-control">
-				</div>
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.options}">Opciones</label>
-					<input type="text" name="opcions[]" class="form-control">
-				</div>
-				<div class="col-3">
-					<label th:text="#{admin.procedures.form.report}">¿Genera informe?</label>
-					<select class="form-control" name="informe[]" required>
-			        	<option value="true">Si</option>
-			        	<option value="false">No</option>
-			    	</select>					  
-				</div>
-			</div>
-			<div class="form-group">
-				<label th:text="#{admin.procedures.form.titleCas}">Titulo cas</label>
-				<input type="text" name="titolCas[]" class="form-control task">
-			</div>
-			<div class="form-group">
-				<label th:text="#{admin.procedures.form.titleVal}">Titulo val</label>
-				<input type="text" name="titolVal[]" class="form-control task">
-			</div>
-			<div class="form-group">
-				<label th:text="#{admin.procedures.form.descriptionCas}">Descripción cas</label>
-				<textarea name="descripcioCas[]" class="form-control task"></textarea>
-			</div>
-			<div class="form-group">
-				<label th:text="#{admin.procedures.form.descriptionVal}">Descripción val</label>
-				<textarea name="descripcioVal[]" class="form-control task"></textarea>
-			</div>
-			<div id="evidence1Fields">
-				<div class="form-group row">
-					<div class="col-3">
-						<label th:text="#{admin.procedures.form.evCode}">Código evidencia</label>
-						<input type="text" name="codiEvidencia[]" class="form-control task">
-					</div>
-				</div>
-				<div class="form-group row">
-					<div class="col-6">
-						<label th:text="#{admin.procedures.form.nameEvCas}">Nombre evidencia cas</label>
-						<input type="text" name="nomEvidenciaCas[]" class="form-control task">
-					</div>
-					<div class="col-6">
-						<label th:text="#{admin.procedures.form.nameEvVal}">Nombre evidencia val</label>
-						<input type="text" name="nomEvidenciaVal[]" class="form-control task">
-					</div>
-				</div>
-			</div>
-			<div class="hiddenFields" id="evidence11Fields" th:style="'display:none;'">
-				<div class="form-group row">
-					<div class="col-8">
-						<label>Plantilla</label>
-						<select class="selectpicker" name="idPlantilla[]" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}">
-					        <option th:each="template : ${templates}" th:text="${#locale.language} == 'es' ? ${template.codi}+' {v'+${template.versio}+'} ['+${template.ambit}+'] '+${template.nomCas}:${template.codi}+' {v'+${template.versio}+'} ['+${template.ambit}+'] '+${template.nomVal}" th:attr="value=${template.idPlantilla}"></option>
-					    </select>
-					</div>
-				</div>
-			</div>
-			<hr>
-		</div>
-      </div>
-    </div>
-  </div>

+ 0 - 29
src/main/resources/templates/components/form_template.html

@@ -1,29 +0,0 @@
-<div>
-	<div class="form-group row">
-		<div class="col-1">
-			<label>Código</label>
-			<input type="text" name="versio" id="codiInput" class="form-control" th:value="${template.codi}" required th:attr="readonly=(${editable} ? 'false' : 'true')">
-		</div>
-		<div class="col-1">
-			<label>Versión</label>
-			<input type="text" name="versio" id="versioInput" class="form-control" th:value="${template.versio}" required th:attr="readonly=(${editable} ? 'false' : 'true')">
-		</div>
-		<div class="col-1">
-				<label th:text="#{admin.procedures.form.context}">Ámbito</label>
-				<select class="form-control pointer" name="ambitInput" id="ambitInput" required>
-					<option th:selected="${template.ambit=='G'}" value="G">Grado</option>
-					<option th:selected="${template.ambit=='M'}" value="M">Máster</option>
-					<option th:selected="${template.ambit=='A'}" value="A">Cualquiera</option>
-				</select>
-			</div>
-		<div class="col-4">
-			<label>Nombre en Castellano</label>
-			<input type="text" name="nomCas" id="nomCasInput"  class="form-control" th:value="${template.nomCas}">
-		</div>
-		<div class="col-4">
-			<label>Nombre en Valenciano</label>
-			<input type="text" name="nomVal" id="nomValInput"  class="form-control" th:value="${template.nomVal}">
-		</div>
-	</div>
-	<div id="editorContent" th:utext="${template.text}"></div>
-</div>

+ 0 - 107
src/main/resources/templates/components/form_templates_indicators.html

@@ -1,107 +0,0 @@
-<span>
-	* Medias: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-	Especficar todas las necesarias separadas por comas, según la siguiente nomenclatura
-	<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-	T = Titulación, C = Centro, U = Universidad, CM = Min/Max Centro, UM = Min/Max Universidad
-</span>
-<form enctype='multipart/form-data' method="POST" action="/admin/templates/inds/update" style="margin-top:25px;" id="inds_form">
-
-	<input name="proces" th:value="${proces}" type="hidden"/>
-	<input name="evidencia" th:value="${evidencia}" type="hidden"/>
-	
-
-	<table class="table table-striped table-bordered display responsive no-wrap display">
-		<thead>
-	        <tr>
-	        	<th class="uv-table-no-sort">Indicador</th>
-	        	<th class="uv-table-no-sort">Enquesta</th>
-	        	<th class="uv-table-no-sort">Media</th>
-	        	<th class="uv-table-no-sort"></th>
-	        </tr>
-	    </thead>
-		<tbody id="inds_table_body">
-			<tr th:each="item : ${inds}">
-				<td>
-					<input name="indicador[]" th:value="${item.id.indicador}" class="uv-clear-input form-control"/>
-				</td>
-				<td>
-					<select name="enquesta[]" class="uv-clear-input form-control">
-						<optgroup label="Grado">
-							<option value="dades_1er" th:selected="${item.id.enquesta} == 'dades_1er'">dades_1er</option>
-							<option value="dades_3er" th:selected="${item.id.enquesta} == 'dades_3er'">dades_3er</option>
-							<option value="dades_graduats" th:selected="${item.id.enquesta} == 'dades_graduats'">dades_graduats</option>
-							<option value="profes" th:selected="${item.id.enquesta} == 'profes'">profes</option>
-						</optgroup>
-						<optgroup label="Máster">
-							<option value="data" th:selected="${item.id.enquesta} == 'data'">data</option>
-							<option value="data_g" th:selected="${item.id.enquesta} == 'data_g'">data_g</option>
-							<option value="data_i" th:selected="${item.id.enquesta} == 'data_i'">data_i</option>
-							<option value="profes_tancades" th:selected="${item.id.enquesta} == 'profes_tancades'">profes_tancades</option>
-						</optgroup>
-						<optgroup label="Eval. Prof.">
-							<option value="eval_prof" th:selected="${item.id.enquesta} == 'eval_prof'">eval_prof</option>
-						</optgroup>
-						<optgroup label="PAS">
-							<option value="dadespas" th:selected="${item.id.enquesta} == 'dadespas'">dadespas</option>
-						</optgroup>
-					</select>
-				</td>
-				<td>
-					<input name="media[]" th:value="${item.media}" class="uv-clear-input form-control"/>
-				</td>
-				<td>
-					<span class="pointer" style="color:red;" onclick="removeRow(this);"><i class="fas fa-times"></i></span>
-				</td>
-			</tr>
-		</tbody>
-		<tfoot>
-			<tr>
-				<td>
-					<input id="new_val_indicador" value="" class="uv-clear-input form-control"/>
-				</td>
-				<td>
-					<select id="new_val_enquesta" class="uv-clear-input form-control">
-<!-- 							<option disabled>Grado</option> -->
-<!-- 							<option value="dades_1er" selected="selected">dades_1er</option> -->
-<!-- 							<option value="dades_3er">dades_3er</option> -->
-<!-- 							<option value="dades_graduats">dades_graduats</option> -->
-<!-- 							<option value="profes">profes</option> -->
-<!-- 							<option disabled>Máster</option> -->
-<!-- 							<option value="data">data</option> -->
-<!-- 							<option value="data_g">data_g</option> -->
-<!-- 							<option value="data_g">data_i</option> -->
-<!-- 							<option value="profes_tancades">profes_tancades</option> -->
-<!-- 							<option disabled>Eval. Prof</option> -->
-<!-- 							<option value="eval_prof">eval_prof</option> -->
-<!-- 							<option disabled>PAS</option> -->
-<!-- 							<option value="dadespas">dadespas</option> -->
-						<optgroup label="Grado">
-							<option value="dades_1er">dades_1er</option>
-							<option value="dades_3er">dades_3er</option>
-							<option value="dades_graduats">dades_graduats</option>
-							<option value="profes">profes</option>
-						</optgroup>
-						<optgroup label="Máster">
-							<option value="data">data</option>
-							<option value="data_g">data_g</option>
-							<option value="data_i">data_i</option>
-							<option value="profes_tancades">profes_tancades</option>
-						</optgroup>
-						<optgroup label="Eval. Prof.">
-							<option value="eval_prof">eval_prof</option>
-						</optgroup>
-						<optgroup label="PAS">
-							<option value="dadespas">dadespas</option>
-						</optgroup>
-					</select>
-				</td>
-				<td>
-					<input id="new_val_media" value="" class="uv-clear-input form-control"/>
-				</td>
-				<td>
-					<span class="pointer" style="color:green;" onclick="addRow(this);"><i class="fas fa-plus"></i></span>
-				</td>
-			</tr>
-		</tfoot>
-	</table>
-</form>

+ 0 - 46
src/main/resources/templates/components/list_managers.html

@@ -1,46 +0,0 @@
-<div th:fragment="results">	
-	<div class="uv-table-group" style="margin-top:-20px;cursor: auto;" >
-		<div class="col-sm-12 uv-table-section">
-			<div class="uv-table-header" style="display:inline;">
-				<h6 th:text="#{managers.search.title}"></h6>
-				<hr class="uv-table-header-hr">
-			</div>
-		</div>
-	</div>
-	<div class="uv-table-group" th:if="${results}" style="cursor: auto;">
-		<div class="col-sm-12 uv-table-section" th:each="item : ${resp_centres}">
-			<strong th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></strong>
-			<br>
-			<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto='+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-			<form enctype='multipart/form-data' method="POST" action="/admin/userrole/remove" style="display:inline;margin-left:25px;" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-				<input type="hidden" name="idRol" th:value="${item.rol.idRol}">
-				<input type="hidden" name="usuari" th:value="${item.usuari.usuari}">
-				<input type="hidden" name="tlugar" th:value="${item.organ.id.tlugar}">
-				<input type="hidden" name="lugar" th:value="${item.organ.id.lugar}">
-				<button th:if="${(#authentication.principal.isAdmin() or #authentication.principal.isGranted()) and item.rol.idRol != 1}" 
-					class="btn btn-danger pointer" style="width:40px;height:38px;border-radius:40px;" th:title="#{admin.action.delete}">
-					<i class="fas fa-trash"></i>
-				</button>
-			</form>
-		</div>
-		<div class="col-sm-12 uv-table-section" th:each="item : ${resp_titulacions}" style="margin-top:20px;">
-			<strong th:text="${#locale.language} == 'es' ? ${item.organ.nomCas}:${item.organ.nomVal}"></strong>
-			<br>
-			<span th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></span>: 
-			<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto:'+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-			<form enctype='multipart/form-data' method="POST" action="/admin/userrole/remove" style="display:inline;margin-left:25px;" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-				<input type="hidden" name="idRol" th:value="${item.rol.idRol}">
-				<input type="hidden" name="usuari" th:value="${item.usuari.usuari}">
-				<input type="hidden" name="tlugar" th:value="${item.organ.id.tlugar}">
-				<input type="hidden" name="lugar" th:value="${item.organ.id.lugar}">
-				<button th:if="${(#authentication.principal.isAdmin() or #authentication.principal.isGranted()) and item.rol.idRol != 1}" 
-					class="btn btn-danger pointer" style="width:40px;height:38px;border-radius:40px;" th:title="#{admin.action.delete}">
-					<i class="fas fa-trash"></i>
-				</button>
-			</form>
-		</div>
-	</div>
-	<div th:if="${not results}">
-		<span th:text="${managers.noResults}"></span>
-	</div>
-</div>

+ 0 - 2
src/main/resources/templates/components/selector_centres.html

@@ -1,2 +0,0 @@
-<option th:each="item : ${sup_centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-	

+ 0 - 1
src/main/resources/templates/components/selector_cursos.html

@@ -1 +0,0 @@
-<option th:each="item : ${sup_years}" th:text="${item.text}" th:attr="value=${item.value}"></option>

+ 0 - 1
src/main/resources/templates/components/selector_evidencies.html

@@ -1 +0,0 @@
-<option th:each="item : ${sup_evs}" th:text="${#locale.language} == 'es' ? ${item.text} + ', ' +${item.text2}:${item.text} + ', ' +${item.text3}" th:attr="value=${item.text}"></option>

+ 0 - 1
src/main/resources/templates/components/selector_processos.html

@@ -1 +0,0 @@
-<option th:each="item : ${sup_procs}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.text}"></option>

+ 0 - 2
src/main/resources/templates/components/selector_titulacions.html

@@ -1,2 +0,0 @@
-<option th:each="item : ${sup_orgs}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-	

+ 0 - 1
src/main/resources/templates/components/selector_titulacions_managers.html

@@ -1 +0,0 @@
-<option th:each="item : ${resp_titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.id.lugar}"></option>

+ 0 - 31
src/main/resources/templates/components/templates.html

@@ -1,31 +0,0 @@
-<br>
-<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-	<div class="uv-table-title">
-		<hr class="uv-procedure-hr">
-		<span th:text="#{admin.templates.info}"></span>
-	</div>
-</div>
-<div class="uv-table-group">
-	<span th:each="item : ${evs}">
-	<!-- 
-		<span style="float:right;">
-			<span class="btn btn-primary pointer" style="border-radius:50%;" th:attr="onclick='showEditInds(\''+${item.codiEvidencia}+'\');'">
-				<i class="fas fa-pencil-alt"></i>
-			</span>
-		</span>
-	 -->
-	 	<a href="#">
-			<span class="pointer" style="border-radius:50%;" th:attr="onclick='showEditInds(\''+${item.codiEvidencia}+'\');'">
-				<i class="fas fa-pencil-alt"></i>
-			</span>
-		</a> &nbsp;&nbsp;&nbsp;
-		<a th:href="${'/test/template/'+idTitulacio+'/'+idCentre+'/'+idProces+'/'+item.idTascap}" target="blank_" onclick="getSelectedInds(this);" title="Descargar">
-			<strong th:text="${item.codiEvidencia}"></strong> <span th:text="${item.nomEvidenciaCas}"></span>
-		</a>
-		<br>
-	</span>
-</div>
-
-<div class="uv-table-group" id="selectInds">
-
-</div>

+ 0 - 54
src/main/resources/templates/components/templates_indicators.html

@@ -1,54 +0,0 @@
-<div class="uv-table-group">
-	<h6><span th:text="#{admin.templates.indicators}">Indicadores asociados a la plantilla</span> <span th:text="${evidencia}"></span></h6>
-	<div class="row">
-		<div class="col-5">
-		<!-- 
-			<span style="float:right;">
-				<span class="btn btn-primary pointer" style="border-radius:50%;margin-top:-30px;" onclick="showEditInds();">
-					<i class="fas fa-eye"></i>
-				</span>
-			</span>
-		 -->
-			<h6 th:text="#{admin.templates.table.enq}">Datos de encuestas</h6>
-			<table class="table table-striped table-bordered display responsive no-wrap display">
-				<thead>
-			        <tr>
-			        	<th class="uv-table-no-sort">Pregunta encuesta</th>
-			        	<th class="uv-table-no-sort">Valor</th>
-			        </tr>
-			    </thead>
-				<tbody>
-					<tr th:each="item : ${dataE}">
-						<td>
-							<span th:text="${item[0]}"></span>
-						</td>
-						<td>
-							<span th:text="${item[1]}"></span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-		<div class="col-5">
-			<h6 th:text="#{admin.templates.table.serv}">Datos de web service</h6>
-			<table class="table table-striped table-bordered display responsive no-wrap display">
-				<thead>
-			        <tr>
-			        	<th class="uv-table-no-sort">Indicador</th>
-			        	<th class="uv-table-no-sort">Valor</th>
-			        </tr>
-			    </thead>
-				<tbody>
-					<tr th:each="item : ${dataI}">
-						<td>
-							<span th:text="${item[0]}"></span>
-						</td>
-						<td>
-							<span th:text="${item[1]}"></span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-	</div>
-</div>

+ 0 - 161
src/main/resources/templates/dashboard.html

@@ -1,161 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/gijgo/css/gijgo.min.css}" rel="stylesheet"/>
-
-<style>
-
-	.gj-list-md-active{ background-color:transparent !important; }
-
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6">Resumen titulaciones</h6>
-						<hr class="uv-procedure-hr">
-						<span></span>
-					</div>
-				</div>
-				 <div class="uv-table-group-procedure">
-					<table class="table table-striped table-bordered display responsive no-wrap">
-					    <thead>
-					        <tr>
-					        	<th class="uv-table">RUCT</th>
-					        	<th class="uv-table">Nombre</th>
-					        	<th class="uv-table">Tipo</th>
-					        	<th class="uv-table">Centro</th>
-					        </tr>
-					    </thead>
-						<tbody>
-							<tr th:each="item,inRowID : ${titulacions}">
-								<td>
-									<a th:href="${'/dashboard/'+item.ruct}"><span th:text="${item.ruct}"></span></a>
-								</td>
-								<td>
-									<span th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}"></span>
-								</td>
-								<td>
-									<span th:text="${item.tambit == 'M' ? 'Máster' : item.tambit == 'G' ? 'Grado' : 'Doctorado'}"></span>
-								</td>
-								<td>
-									<a th:if="${showCentres}" th:href="${'/dashboard/'+item.organ.ruct}"><span th:text="${#locale.language} == 'es' ? ${item.organ.nomCas}:${item.organ.nomVal}"></span></a>
-									<span th:unless="${showCentres}" th:text="${#locale.language} == 'es' ? ${item.organ.nomCas}:${item.organ.nomVal}"></span>
-								</td>
-							</tr>
-						</tbody>
-					</table>
-				</div>
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-  
-	<script type="text/javascript">
-		var locale = '[[${#locale.language}]]';
-		var orderCol1 = [3, 'asc'], orderCol2 = [1, 'asc'];
-		var cursorPosition;
-		
-		$(document).ready(function(){ 
-			layout = new Layout("No data to display");
-			layout.initTableLayout({
-				paging: true, 
-				language:{
-					"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		              }
-				},
-				searching: true,
-				order:[orderCol1, orderCol2],
-				orderCellsTop: true,
-				fixedHeader: true,
-				info: false,
-				responsive: true,
-				scrollX: true,
-				initComplete: function () {
-					var api = this.api();
-		        	this.api()
-		        	.columns()
-	                .eq(0)
-	                .each(function (colIdx) {
-	                    var cell = $('.filters th').eq(
-	                        $(api.column(colIdx).header()).index()
-	                    );
-	                    var title = $(cell).text();
-	                    $(cell).html('<input type="text" placeholder="' + title + '" />');
-	                    $('input', $('.filters th').eq($(api.column(colIdx).header()).index()))
-	                        .off('keyup change')
-	                        .on('change', function (e) {
-	                            $(this).attr('title', $(this).val());
-	                            var regexr = '({search})'; 
-	                            cursorPosition = this.selectionStart;
-	                            api.column(colIdx)
-	                               .search(   
-	                                    this.value != ''
-	                                        ? regexr.replace('{search}', '(((' + this.value + ')))')	
-	                                        : '',
-	                                    this.value != '',
-	                                    this.value == ''
-	                                )
-	                                .draw();
-	                        })
-	                        .on('keyup', function (e) {
-								e.preventDefault();
-	                            e.stopPropagation();
-	                            $(this).trigger('change');
-	                            $(this)
-	                                .focus()[0]
-	                                .setSelectionRange(cursorPosition, cursorPosition);
-	                        });
-	                });
-	    		}
-			});
-			layout.closeLoadingSpinner(".uv-loading-spinner");		
-		});		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 863
src/main/resources/templates/dashboardCentre.html

@@ -1,863 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/gijgo/css/gijgo.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/jquery/datatables.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/frappe-gantt/frappe-gantt.min.css}" rel="stylesheet"/>
-
-<style>
-	table.tableizer-table {
-		font-size: 12px;
-		border: 1px solid #CCC; 
-		font-family: Arial, Helvetica, sans-serif;
-	} 
-
-	.tableizer-table td {
-		padding: 4px;
-		margin: 3px;
-		border: 1px solid #CCC;
-	}
-
-	.tableizer-table th {
-		background-color: #1B3552; 
-		color: #FFF;
-		font-weight: bold;
-	}
-
-	.chart-container{
-		min-height:150px;
-	}
-
-	.gantt-container{
-		height: calc(100vh - 250px);
-	}
-
-	.dropdown-colvis ~ .dropdown-menu {
-		transform: translate(-100px, 0px);
-	}
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="row">
-                     <div class="col-sm-10">
-                         <h5 style="margin-bottom:3px;"><span style="text-transform: uppercase;" th:text="${#locale.language} == 'es' ? ${organ.nomCas}:${organ.nomVal}">nombre centro</span></h5>
-                         <h6 ><small style="font-weight: bold;">RUCT: </small><small style="font-weight: bold;" th:text="${organ.ruct}"></small></h6>
-                     </div>
-                     <div class="col-sm-2" style="padding:0;">
-                     	<img th:src="@{${'/logos/C' + organ.id.lugar +'.png'}}" class="float-right img-responsive img-rounded" style="width:80px;margin-top:0px;">
-                     </div>
-                 </div>
-				<div class="clearfix"></div>
-                <div class="row" style="margin-top:5px;">
-                    <div class="card card-default card-body" style="padding: 0 !important;">
-                        <ul id="tabsJustified" class="nav nav-tabs nav-justified">
-                        	<li class="nav-item">
-                                <a class="nav-link active" href="" data-target="#tab0" data-toggle="tab" th:text="#{dashboard.menu.summary}">Resumen</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab1" data-toggle="tab" th:text="#{dashboard.menu.procedures}">Procedimientos SAIC</a>
-                            </li>
-                            <li class="nav-item" onclick="adjustTableHeader();">
-                                <a class="nav-link" href="" data-target="#tab2" data-toggle="tab" th:text="#{dashboard.menu.docs}">Seguimiento/Acreditación</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab3" data-toggle="tab" th:text="#{dashboard.menu.data}">Indicadores</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab4" data-toggle="tab" th:text="#{dashboard.menu.managers}">Responsables</a>
-                            </li>
-                        </ul>
-                        <!--/tabs-->
-                        <br>
-                        <div id="viewTabsProcYears" class="tab-content">
-                        	<div class="tab-pane active" id="tab0">  
-                        		<div class="row">
-	                        		<div class="col-lg-12" style="margin-top:-10px;margin-bottom:5px;padding-left:30px;padding-right:30px;">  
-										<span class="gantt-legend-done"><span th:text="#{dashboard.summary.legend.active}">Finalizado</span></span>
-										<span class="gantt-legend-active"><span th:text="#{dashboard.summary.legend.ontime}">En curso</span></span>
-										<span class="gantt-legend-expired"><span th:text="#{dashboard.summary.legend.delayed}">Atrasado</span></span>
-										<span class="gantt-legend-closed"><span th:text="#{dashboard.summary.legend.closed}">Cerrado</span></span>
-										<div class="input-group" style="text-align:right;float:right;margin-right:0px;width:auto !important;">
-										    <div class="input-group-prepend">
-										    	<span class="input-group-text"><span th:text="#{dashboard.gantt.selector}">Procedimientos de</span></span>
-										    </div>
-									    	<select class="form-control pointer" id="ganttOrigin" style="max-width:300px;" onchange="changeGanttOrigin();">
-												<option selected th:value="${organ.ruct}" th:text="#{dashboard.data.legend.2}">Centre</option>
-												<option th:each="item : ${titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.ruct}">Tit 1</option>
-											</select>
-									  	</div>
-	                            	</div> 
-	                                <div class="col-lg-12" style="position:relative;z-index:0;">  
-	                            		<svg id="gantt"></svg>     
-	                            	</div>  
-                        		</div>		    
-                            </div>
-                            <div class="tab-pane" id="tab1">  
-                            	<div class="col-lg-12" style="margin-top:-10px;margin-bottom:20px;">  
-									<span class="gantt-legend-done"><span th:text="#{dashboard.summary.legend.active}">Finalizado</span></span>
-									<span class="gantt-legend-active"><span th:text="#{dashboard.summary.legend.ontime}">En curso</span></span>
-									<span class="gantt-legend-closed"><span th:text="#{dashboard.summary.legend.closed}">Cerrado</span></span>
-									<div class="input-group" style="text-align:right;float:right;margin-right:0px;width:auto !important;">
-									    <div class="input-group-prepend">
-									    	<span class="input-group-text" th:text="#{dashboard.tree.selector.title}">Ver procedimientos de:</span>
-									    </div>
-								    	<select class="form-control pointer" id="reportsOrigin" style="max-width:300px;" onchange="changeReportsOrigin();">
-											<option selected th:value="${organ.ruct}" th:text="#{dashboard.tree.selector.centre}">Centre</option>
-											<option th:each="item : ${titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.ruct}">Tit 1</option>
-										</select>
-								  	</div>
-                            	</div> 
-                                <div class="col-lg-12">  
-									<div id="reportsSpinner"></div>
-                            		<div id="treeProcedures"></div>      
-                            	</div>      
-                            </div>
-                            <div class="tab-pane" id="tab2">
-								<span th:if="${editable}" class="btn btn-primary pointer" style="z-index:100;float:right;margin-right:25px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#newDocumentModal').modal('toggle');"><i class="fa fa-plus"></i></span>
-								<span th:if="${editable}" class="btn btn-warning pointer" style="z-index:100;float:right;margin-right:10px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#hideDocumentsModal').modal('toggle');"><i class="fas fa-eye-slash"></i></span>
-								<div class="row" style="padding-left:25px;width:100%;">  	
-                            		<div class="col-lg-12" style="margin-left:-5px;">
-                           				<strong th:text="#{dashboard.acred.docs.title}">Documentación</strong>
-                           				<div id="treeDocuments"></div>
-                            		</div>
-                            		
-                            		<div class="col-lg-12" id="acredita-container" style="margin-left:0px;margin-top:0px;min-width:100%;width:100%;position:relative;z-index:0;"> 
-                            			<strong th:text="#{dashboard.acred.table.title}" style="margin-bottom:50px;">Titulaciones del centro</strong>
-										<table id="titsTable" class="table table-striped table-bordered display responsive no-wrap" style="min-width:100%;width:100%;position:relative;z-index:0;">
-										    <thead style="min-width:100%;width:100%;">
-										        <tr>
-										        	<th class="uv-table" th:text="#{dashboard.tits.ruct}">RUCT</th>
-										        	<th class="uv-table" th:text="#{dashboard.tits.codes}">Códigos</th>
-										        	<th class="uv-table" th:text="#{dashboard.tits.tit}">Titulación</th>
-										        	<th class="uv-table" th:text="#{dashboard.tits.type}">Tipo</th>
-										        	<th class="uv-table" th:text="#{dashboard.acred.table.next}">Próx Accr.</th>
-											        <th class="uv-table" th:text="#{dashboard.acred.table.acred}">Fecha Accr.</th>
-											        <th class="uv-table" th:text="#{dashboard.acred.table.renov}">Renovación</th>
-											        <th class="uv-table" th:text="#{dashboard.acred.table.segui}">Seguimiento</th>
-											        <th class="uv-table" th:text="#{dashboard.acred.table.verif}">Verificación</th>
-											        <th class="uv-table" th:text="#{dashboard.acred.table.impla}">Implantación</th>
-											        <th class="uv-table" th:text="#{dashboard.acred.table.inter}">InterUniv.</th>
-										        </tr>
-										    </thead>
-											<tbody>
-												<tr th:each="item,inRowID : ${titulacions}">
-													<td>
-														<span th:text="${item.ruct}"></span>
-													</td>
-													<td>
-														<span th:text="${item.codis}"></span>
-													</td>
-													<td>
-														<a target="_blank" th:href="${'/dashboard/'+item.ruct}"><span th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}"></span></a>
-													</td>
-													<td>
-														<span th:text="${item.tambit == 'M' ? 'Máster' : item.tambit == 'G' ? 'Grado' : 'Doctorado'}"></span>
-													</td>
-													<td>
-														<span th:text="${item.acreditacio?.grupCurs+' - '+item.acreditacio?.grup}"></span>
-													</td>
-													<td>
-														<span th:text="${#dates.format(item.acreditacio?.dataAcred, 'dd/MM/yyyy')}"></span>
-													</td>
-													<td>
-														<span th:text="${#dates.format(item.acreditacio?.dataRenov, 'dd/MM/yyyy')}"></span>
-													</td>
-													<td>
-														<span th:text="${#dates.format(item.acreditacio?.dataSegui, 'dd/MM/yyyy')}"></span>
-													</td>
-													<td>
-														<span th:text="${#dates.format(item.acreditacio?.dataVerif, 'dd/MM/yyyy')}"></span>
-													</td>
-													<td>
-														<span th:text="${item.acreditacio?.cursImpla}"></span>
-													</td>
-													<td>
-														<span th:if="${item.acreditacio != null}" th:text="${item.acreditacio?.inter ? 'SI' : 'NO'}"></span>
-													</td>
-												</tr>
-											</tbody>
-										</table>
-                            		</div> 
-                            	</div> 
-                            </div>
-                            <div class="tab-pane" id="tab3">
-                            	<div class="row" style="margin-left:0px;">  
-                            		<div class="col-lg-4">
-                            			<div style="margin-bottom:5px;">
-                            				<select class="form-control pointer data-selector data-selector-orig">
-                            					<option value="G" selected th:text="#{dashboard.data.sel.g}" th:if="${organ.id.lugar != 62}">Grado</option>
-                            					<option value="M" th:text="#{dashboard.data.sel.m}" th:if="${organ.id.lugar != 62}">Máster</option>
-                            					<option value="D" selected th:text="#{dashboard.data.sel.d}" th:if="${organ.id.lugar == 62}">Doctorado</option>
-                            				</select>
-                            				<select class="form-control pointer data-selector data-selector-group">
-                            					<option value="2" data-group="G" th:text="#{dashboard.data.sel.estud1}" selected>Satisfacción Estudiantes 1º</option>
-                            					<option value="2" data-group="MD" th:text="#{dashboard.data.sel.estud}">Satisfacción Estudiantes</option>
-                            					<option value="3" data-group="G" th:text="#{dashboard.data.sel.estud3}">Satisfacción Estudiantes 3º</option>
-                            					<option value="4" data-group="GMD" th:text="#{dashboard.data.sel.gradu}">Satisfacción Graduados</option>
-                            					<option value="5" data-group="GMD" th:text="#{dashboard.data.sel.prof}">Satisfacción Profesorado</option>
-                            					<option value="6" data-group="GMD" th:text="#{dashboard.data.sel.ptgas}">Satisfacción PTGAS</option>
-                            					<option value="7" data-group="GMD" th:text="#{dashboard.data.sel.eval}">Evaluación Docente</option>
-                            				</select>
-                            			</div>
-	                            		<div class="data-inds data-inds-2" data-group="GMD" data-id="2"></div>
-	                            		<div class="data-inds data-inds-3" data-group="G" data-id="3"></div>
-	                            		<div class="data-inds data-inds-4" data-group="GMD" data-id="4"></div>
-	                            		<div class="data-inds data-inds-5" data-group="GMD" data-id="5"></div>
-	                            		<div class="data-inds data-inds-6" data-group="GMD" data-id="6"></div>
-	                            		<div class="data-inds data-inds-7" data-group="GMD" data-id="7"></div>
-                            		</div>
-	                                <div class="col-lg-8">  
-	                                	<div class="data-legend row" style="margin-top:-15px;">
-	                                		<div class="col-lg-4" style="text-align:right;">
-	                                			<small>
-	                                				<span><span class="btn data-legend-c"></span> <span>Centro</span></span>
-	                                			</small>
-	                                		</div>
-	                                		<div class="col-lg-4" style="text-align:right;">
-	                                			<small>
-	                                				<span><span class="btn data-legend-u"></span> <span>Universidad</span></span>
-	                                			</small>
-	                                		</div>
-	                            		</div>
-	                                	<div class="row chart-inds chart-inds-2" data-group="GMD" data-id="2"></div>
-	                                	<div class="row chart-inds chart-inds-3" data-group="G" data-id="3"></div>
-	                                	<div class="row chart-inds chart-inds-4" data-group="GMD" data-id="4"></div>
-	                                	<div class="row chart-inds chart-inds-5" data-group="GMD" data-id="5"></div>
-	                                	<div class="row chart-inds chart-inds-6" data-group="GMD" data-id="6"></div>
-	                                	<div class="row chart-inds chart-inds-7" data-group="GMD" data-id="7"></div>
-	                            	</div> 
-	                            </div>
-                            </div>
-                            <div class="tab-pane" id="tab4">
-                                <div class="uv-table-group" th:if="${results}" style="cursor: auto;">
-									<div class="col-sm-12 uv-table-section" th:each="item : ${resp_titulacions}" style="margin-top:20px;">
-										<strong><span th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></span>:</strong> 
-										<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto:'+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-									</div>
-									<div class="col-sm-12 uv-table-section" th:each="item : ${resp_centres}">
-										<strong th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></strong>
-										<br>
-										<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto='+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-									</div>
-								</div>
-                            </div>
-                        </div>
-                        <!--/tabs content-->
-                    </div><!--/card-->
-                </div><!--/col-->
-			</div>
-		</div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="newDocumentModal" tabindex="-1" role="dialog" aria-labelledby="newDocumentModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Añadir documento</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="newDocumentForm" style="margin-top:25px;">
-			    		<input type="hidden" id="fileLugar" name="lugar" th:value="${organ.id.lugar}">  
-			    		<input type="hidden" id="fileTlugar" name="tlugar" th:value="${organ.id.tlugar}">  
-						<div class="uv-table-group-procedure" id="categoryContainer">
-							<label>Categoría</label>
-							<select class="form-control selectpicker" id="categorySelector" name="category" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						    	<option th:each="item : ${categories}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.idCategoria}">
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure documentSelectorContainer">
-							<label>Documento</label>
-							<select class="form-control selectpicker" id="documentSelector" name="idCategoria" data-showContent="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure documentSelectorContainer">
-							<br>
-							<div class="custom-file">
-								<input type="file" class="custom-file-input pointer" id="customFile" name="file" required>
-								<label class="custom-file-label pointer" for="customFile">Seleccionar archivo</label>
-							</div>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" type="submit" form="newDocumentForm" th:text="#{global.confirm}">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="hideDocumentsModal" tabindex="-1" role="dialog" aria-labelledby="hideDocumentsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Ocultar todos los documentos visibles</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<p>Se ocultarán todos los documentos visibles.</p>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" th:text="#{global.confirm}" onclick="hideAllDocuments();">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/datatables.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script th:src="@{/js/gijgo/gijgo.min.js}"></script>
-	<script th:src="@{/js/frappe-gantt/frappe-gantt.min.js}"></script>
-	<script th:src="@{/js/chartjs/chart.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-  	<script th:if="${editable}" type="text/javascript">
-  		function editableSettings(){
-  			$(".custom-file-input").on("change", function() {
-  				var fileName = $(this).val().split("\\").pop();
-  				$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
-  			});
-  			
-  			$("#newDocumentForm").submit(function(e) {
-  			    e.preventDefault();
-  			    var formData = new FormData(this);    
-  			    $.ajax({
-  			        url: "/dashboard/documents",
-  			        type: "POST",
-  			        data: formData,
-  			        processData: false,
-  			        contentType: false,
-  			        success: function(data){
-  			        	treeDocuments.reload();
-  			        }
-  			    });
-  			    $('#categorySelector').val('').trigger('change');
-  			    $('#documentSelector').val('').trigger('change');
-  			    $('#customFile').val('').trigger('change');
-  				$('#newDocumentModal').modal('toggle');
-  			});
-  		}
-  		
-  		function hideAllDocuments(){
-  			$.post("/dashboard/documents/archive", {tlugar:tlugar, lugar:lugar}, function(){treeDocuments.reload();});
-  			$('#hideDocumentsModal').modal('toggle');
-  		}
-  	</script>
-  	
-  	<script th:if="${!editable}" type="text/javascript">
-  		function editableSettings(){}
-  		function hideAllDocuments(){}
-  	</script>
-  
-	<script type="text/javascript">
-		var locale = '[[${#locale.language}]]';
-		var lugar = '[[${organ.id.lugar}]]';
-		var tlugar = '[[${organ.id.tlugar}]]';
-		var ruct = '[[${organ.ruct}]]';
-		var tambit = '[[${organ.tambit}]]';
-		var treeProcedures, treeDocuments, ganttChart;
-		var tasks = [];
-		var inds = [];
-				
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			initTables();
-			layout.closeLoadingSpinner(".uv-loading-spinner");	
-			
-			$('.data-inds-2').hide();
-			$('.chart-container').hide();
-			
-			$('#categorySelector').val('').trigger('change');
-			$('#categorySelector').change(getChildCats);
-			
-			$('.data-selector-orig').on('change', function(){
-				changeDataOrig($(this).val());
-			});
-			
-			$('.data-selector-group').on('change', function(){
-				toggleDataView($(this).val());
-			});
-			
-			$('.data-selector-orig').trigger('change');
-			
-			treeDocuments = $('#treeDocuments').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: '/dashboard/documents/'+ruct
-			});
-			drawReports(ruct);
-			drawGantt(ruct);
-			$.get('/dashboard/graphs/list/'+ruct, function(data){
-				inds = data;
-				inds = inds.map((e, i) => ({...e, idGrafica: data[i].idGrafica.idGrafica, estudi: data[i].idGrafica.estudi}));
-				getGraphData();	
-			});
-					
-			editableSettings();
-			
-		});		
-		
-	function initTables(){
-							
-		$('#titsTable thead tr')
-	        .clone(true)
-	        .addClass('filters')
-			.addClass('titsFilters')
-	        .appendTo('#titsTable thead');
-		
-		
-		tableTits = $('#titsTable').DataTable({
-			paging: false, 
-			buttons: [
-				{
-					extend: "pageLength",
-				},
-				{
-					extend: 'excelHtml5',
-					text: '<span><i class="fas fa-file-excel"></i></span>',
-					titleAttr: 'Exportar Excel',
-					title: 'ListadoTitulaciones',
-					exportOptions: {
-						columns: ':visible'
-					}
-	            },
-	            {
-					extend: 'csvHtml5',
-					text: '<span><i class="fas fa-file-csv"></i></span>',
-					titleAttr: 'Exportar CSV',
-					title: 'ListadoTitulaciones',
-					exportOptions: {
-						columns: ':visible'
-					}
-	            },
-	            {
-					extend: 'pdfHtml5',
-					text: '<span><i class="fas fa-file-pdf"></i></span>',
-					titleAttr: 'Exportar PDF',
-					title: 'ListadoTitulaciones',
-					exportOptions: {
-						columns: ':visible'
-					}
-	            },
-	            {
-					extend: 'colvis',
-					text: '<span><i class="fas fa-eye"></i></span>',
-					className: 'dropdown-colvis',
-					titleAttr: 'Mostrar/Ocultar columnas'
-	        	}
-			],
-			layout: {
-		        topStart: null,
-			    topEnd: 'buttons'
-		    },
-			"language":{
-				"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-	            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-	            "info": "[[#{admin.stats.table.info}]]",
-	            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-	            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-	            "paginate": {
-	                "previous": "[[#{admin.stats.table.previous}]]",
-	                "next": "[[#{admin.stats.table.next}]]"
-	            },
-				"buttons": {
-					"pageLength": "%d [[#{admin.stats.table.lengthMenu}]]"
-				}
-			},
-			bAutoWidth: false, 
-			aoColumns : [
-				{ sWidth: '5%' },
-				{ sWidth: '5%' },
-			    { sWidth: '50%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' },
-			    { sWidth: '5%' }
-			],
-			searching: true,
-			order:[ [2, 'asc'], [4, 'asc'], [3, 'asc'] ],
-			orderCellsTop: true,
-			//fixedHeader: true, // Not compatible with android
-			info: false,
-			responsive: false,
-			scrollX: true,
-			lengthMenu: [10, 25, 50, 100, { label: 'All', value: -1 }],
-			initComplete: function () {
-				var api = this.api();
-	        	this.api()
-	        	.columns()
-	            .eq(0)
-	            .each(function (colIdx) {
-	                var cell = $('.filters.titsFilters th').eq(
-	                    $(api.column(colIdx).header()).index()
-	                );
-	                var title = $(cell).text();
-	                $(cell).html('<input type="text" placeholder="' + title + '" />');
-	                $('input', $('.filters.titsFilters th').eq($(api.column(colIdx).header()).index()))
-	                    .off('keyup change')
-	                    .on('change', function (e) {
-	                        $(this).attr('title', $(this).val());
-	                        var regexr = '({search})'; 
-	                        cursorPosition = this.selectionStart;
-	                        api.column(colIdx)
-	                           .search(   
-	                                this.value != ''
-	                                    ? regexr.replace('{search}', '(((' + this.value + ')))')	
-	                                    : '',
-	                                this.value != '',
-	                                this.value == ''
-	                            )
-	                            .draw();
-	                    })
-	                    .on('keyup', function (e) {
-							e.preventDefault();
-	                        e.stopPropagation();
-	                        $(this).trigger('change');
-	                        $(this)
-	                            .focus()[0]
-	                            .setSelectionRange(cursorPosition, cursorPosition);
-	                    });
-	            });
-	            api.column(0).visible(false);
-	            api.column(1).visible(false);
-	            api.column(5).visible(false);
-	            api.column(6).visible(false);
-	            api.column(7).visible(false);
-	            api.column(8).visible(false);
-	            api.column(9).visible(false);
-	            api.column(10).visible(false);
-				            
-			}
-		});
-		//setTimeout(function(){$('#titsTable').DataTable().columns.adjust();}, 3000);
-		}
-		
-		function drawGantt(ructAttr){
-			$.get('/dashboard/gantt/'+ructAttr, function(data){
-				data.forEach(function(d){d.id = 'Task '+d.id;});
-				data.at(-1).custom_class += ' gantt-task-last';
-				tasks = data;
-				ganttChart = new Gantt("#gantt", tasks, {
-					on_click: function (task) {
-						window.open("/procedure/"+task.id.replace('Task_', ''));
-					},
-					on_date_change: function(task, start, end) {
-						return false;
-					},
-					on_progress_change: function(task, progress) {
-						return false;
-					},
-					on_view_change: function() {
-						var bars = document.querySelectorAll("#gantt" + " .bar-group");
-						for (var i = 0; i < bars.length; i++) {
-							bars[i].addEventListener("mousedown", stopEvent, true);
-						}
-						var handles = document.querySelectorAll("#gantt" + " .handle-group");
-						for (var i = 0; i < handles.length; i++) {
-							handles[i].remove();
-						}
-					},
-					bar_height: 20, 
-					bar_corner_radius: 10, 
-					arrow_curve: 10, 
-					padding: 15,
-					view_mode: "Month",
-					date_format: "YYYY-MM-DD",
-					language: locale,
-					draggable: false, 
-		            hasArrows: false,
-		            highlight_weekend: false,
-					infinite_padding: false,
-		            readonly: true,
-					//column_width: 20,
-		            popup: function(task) {
-		                return `
-		                  <div class="details-container">
-							<h6>${task.titCas}</h6>
-		                    <p>${task._start.toLocaleDateString()} - ${task._end.toLocaleDateString()}</p>
-		                  </div>
-		                `;
-		        	},
-				});
-				ganttChart.change_view_mode("Month");
-				$('.today-button').trigger('click');
-				$('.gantt-task-last').get(0).scrollIntoView({
-				            behavior: 'auto',
-				            block: 'center',
-				            inline: 'center'
-				        });
-				$(window).scrollTop(0);
-			});
-		}
-		
-		function getGraphData(){
-			$.get('/dashboard/graphs/inds/'+ruct+'/'+$('.data-selector-orig').val(), function(data){
-				$('.chart-inds').html('');
-				$('.data-inds').html('');
-				createDataTables();
-				inds.filter(d => d.estudi.toLowerCase() == $('.data-selector-orig').val().toLowerCase()).forEach(function(o){
-					var datasets = [], labels = [];
-					var vals = data.filter(d => d.dimension+'_'+d.indicador === o.idGrafica);
-					if(vals.length < 1){ console.log(o.idGrafica); return; }
-					createChartCanvas(o);
-					vals.forEach(function(v){
-						var values = [];
-						v.valores.forEach(function(v, k){
-							values.push(v.valor);
-							labels.push(v.curso);
-						});
-						if(v.ambit === 'C'){
-							datasets.push({
-						        label: locale == 'es' ? 'Centro' : 'Centre',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(154,240,41,1)",
-						        backgroundColor: "rgba(154,240,41,0.5)",
-							});
-							drawTr(o, values.at(-1), values.at(-2));
-						}
-						if(v.ambit === 'U'){
-							datasets.push({
-						        label: locale == 'es' ? 'Universidad' : 'Universitat',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(255,0,0,1)",
-						        backgroundColor: "rgba(240,41,67,0.5)",
-							});
-						}
-					});
-					labels = Array.from(new Set(labels)).sort();
-					drawChart(o, datasets, labels);
-					$('.data-selector-group').val(2).trigger('change');
-				});			
-			});
-		}
-		
-		function createChartCanvas(i){
-			 $(`.chart-inds-${i.g}`).append(`<div class="col-lg-4 chart-container"> 
-						     			   	     <canvas id="chart_${i.idGrafica}"></canvas>	    
-						             	     </div>`);
-		}
-				
-		function createDataTables(){
-			$('.data-inds').html('');
-			$('.data-inds').each(function(idx){
-				var i = $(this).attr('data-id');
-				var group = inds.filter(d => d.estudi.toLowerCase() == $('.data-selector-orig').val().toLowerCase()).filter(o => o.g == i);
-				var trs = '';
-				group.forEach(function(g){
-					trs += `<tr id="tr_${g.idGrafica}"></tr>`; 
-				});
-				$(this).html(`<table class="tableizer-table" style="width:100%;">
-					<thead>
-						<tr class="tableizer-firstrow">
-							<th></th>
-							<th style="width:50px;text-align: center;">Actual</th>
-							<th style="width:50px;text-align: center;">Anterior</th>
-							<th style="width:50px;text-align: center;">Desv.</th>
-						</tr>
-					 </thead>
-					 <tbody>
-						 ${trs}
-					</tbody>
-                </table>`);	
-			});
-		}
-		
-		function drawTr(obj, value1, value2){
-			var color = (value2 == undefined) ? 'black' : value1 - value2 < 0 ? 'red' : 'green';
-			if(obj.negate){
-				color = (color == 'black') ? color : value1 - value2 > 0 ? 'red' : 'green';
-			}
-			$('#tr_'+obj.idGrafica).html(`<td>${locale == 'es' ? obj.nomCas : obj.nomVal}</td>
-							   <td>${parseFloat(value1).toFixed(2)}${obj.unitats}</td>
-							   <td>${value2 == undefined ? '---' : parseFloat(value2).toFixed(2)+obj.unitats}</td>
-							   <td style="color:${color}">${value2 == undefined ? '---' : (value1 - value2).toFixed(2)+obj.unitats}</td>`);
-		}
-		
-		function drawChart(obj, values, labels){
-			if(typeof Chart.getChart('chart_'+obj.idGrafica) !== 'undefined'){
-				Chart.getChart('chart_'+obj.idGrafica).destroy();
-			}
-			const ctx = document.getElementById('chart_'+obj.idGrafica);
-			var callback;
-			if(obj.unitats == '%'){
-				callback = function(value, index, values){return value + " %";};
-			}
-			else{
-				callback = function(value, index, values){return value;};
-			}
-			new Chart(ctx, {
-			    type: 'line',
-			    data: {
-			      labels: labels,
-			      datasets: values
-			    },
-			    options: {
-			    	responsive: true,
-			        maintainAspectRatio: false,
-			    	plugins: {
-			    		title: {
-			                display: true,
-			                text: locale == 'es' ? obj.nomCas : obj.nomVal
-			            },
-			            legend: {
-			                display: false
-			            },
-			            labels: {
-			                render: () => {}
-			            }
-			        },
-					scales: {
-					  y: {
-							max: obj.likert ? 5 : null,
-							min: obj.likert ? 1 : 0,
-						    beginAtZero: obj.likert ? true : false,
-						    ticks: {
-						    	beginAtZero: obj.likert ? true : false,
-						    	autoSkip: !obj.likert,
-						    	stepSize: obj.likert ? 1 : null,
-						    	stepValue: obj.likert ? 1 : null,
-						    	callback: callback
-					    },
-					    grid: {
-					        drawBorder: true
-					    },
-					    gridLines: {
-					        display: true,
-					        color: "rgba(255,99,132,0.2)"
-					      },
-					    stacked: false,
-					  }
-					}
-			    }
-			  });
-		}
-		
-		function getChildCats(){
-			$.get('/dashboard/documents/cats/'+$(this).val()+'/'+tambit, function(data){
-				$('#documentSelector').html('');
-				data = data.length > 0 ? data : [];
-				data.forEach(function(d){
-					$(`<option value="${d.idCategoria}" data-content="${locale == 'es' ? d.nomCas : d.nomVal}">${locale == 'es' ? d.nomCas : d.nomVal}</option>`)
-					.appendTo($('#documentSelector'));
-				});
-				$('#documentSelector').selectpicker('refresh');
-			});
-		}
-		
-		function toggleDataView(id){
-			$('.data-inds').hide();
-			$('.data-inds-'+id).show();
-			$('.chart-inds').hide();
-			$('.chart-inds-'+id).show();
-		}
-		
-		function changeDataOrig(id){
-			$('option[data-group]').hide();
-			$(`option[data-group*='${id}']`).show();
-			$('.data-selector-group option:not([style*="display: none"]):first')
-				.attr('selected', true)
-				.siblings()
-			  	.removeAttr("selected");
-			$(".data-selector-group").val($('.data-selector-group option:not([style*="display: none"]):first').val());
-			getGraphData();
-		}
-		
-		function stopEvent(event) {
-			event.preventDefault();
-		}
-		
-		function changeGanttOrigin(){
-			ganttChart.clear();
-			$('.gantt-container').parent().html('<svg id="gantt"></svg>')
-			drawGantt($('#ganttOrigin').val());
-		}
-		
-		function changeReportsOrigin(){
-			treeProcedures.destroy();
-			drawReports($('#reportsOrigin').val());
-		}
-		
-		function drawReports(ructAttr){
-			openReportsSpinner();
-			treeProcedures = $('#treeProcedures').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  lazyLoading: true,
-				  dataSource: '/dashboard/procedures/'+ructAttr,
-				  dataBinding: function (e) {
-					closeReportsSpinner();
-				  }
-			});
-		}
-
-		function openReportsSpinner(){
-			var spinner = `<div class="d-flex justify-content-center" style="position:fixed;z-index:9999;top:0;left:0;right:0;bottom:0;margin:auto;width:100%;height:100%;background:rgba(0,0,0,0.25);align-items: center;justify-content:center;">
-								<div class="spinner-border text-primary" role="status" style="font-size:150%;text-align:center;width:100px;height:100px;display:flex;margin:0 auto;">
-									<span class="sr-only">Loading...</span>
-								</div>
-							</div>
-						  `;
-			$('#reportsSpinner').html(spinner);
-		}
-
-		function closeReportsSpinner(){
-			$('#reportsSpinner').html('');
-		}
-
-		function adjustTableHeader(){
-			setTimeout(() => {
-				$('#titsTable').DataTable().columns.adjust();
-			}, 100);
-		}
-
-	</script>
-
-</body>
-
-</html>

+ 0 - 1178
src/main/resources/templates/dashboardTitulacio.html

@@ -1,1178 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/gijgo/css/gijgo.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/jquery/datatables.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/frappe-gantt/frappe-gantt.min.css}" rel="stylesheet"/>
-
-<style>
-	table.tableizer-table {
-		font-size: 12px;
-		border: 1px solid #CCC; 
-		font-family: Arial, Helvetica, sans-serif;
-	} 
-	
-	.tableizer-table td {
-		padding: 4px;
-		margin: 3px;
-		border: 1px solid #CCC;
-	}
-
-	.tableizer-table th {
-		background-color: #1B3552; 
-		color: #FFF;
-		font-weight: bold;
-	}
-
-	.chart-container{
-		min-height:150px;
-	}
-
-	.gantt-container{
-		height: calc(100vh - 250px);
-	}
-
-	.input-group-text{
-		background-color:#f5f5f5 !important;
-	}
-
-	.dropdown-colvis ~ .dropdown-menu {
-		transform: translate(-100px, 0px);
-	}
-
-	.datepicker {
-      z-index: 1600 !important; 
-    }
-
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="row">
-                     <div class="col-sm-10">
-                         <h5 style="margin-bottom:3px;"><span style="text-transform: uppercase;" th:text="${#locale.language} == 'es' ? ${organ.nomCas}:${organ.nomVal}">nombre titulación</span></h5>
-                         <h5 style="text-transform: uppercase;margin-bottom:3px;"><small th:text="${#locale.language} == 'es' ? ${organ.organ.nomCas}:${organ.organ.nomVal}">nombre centro</small></h5>
-                         <h5 style="margin-bottom:0px;"><a target="_blank" th:href="${'/public/reports/'+organ.ruct}"><small><i class="fa fa-link"></i></small> <small th:text="#{dashboard.header.published}">Informes publicados</small></a></h5>
-                     </div>
-                     <div class="col-sm-2" style="padding:0;">
-						<h6 style="margin-bottom:10px;margin-top:-5px;text-align: right;"><small style="font-weight: bold;">RUCT: </small><small class="pointer" style="font-weight: bold;"><a tabindex="0" role="button" data-container="body" data-trigger="focus" data-toggle="popover" data-placement="left" th:attr="title=#{dashboard.acred.codes}, data-content=${organ.codis}" th:text="${organ.ruct}"></a></small></h6>
-                     	<img th:src="@{${'/logos/C' + organ.organ.id.lugar +'.png'}}" class="float-right img-responsive img-rounded" style="width:80px;max-width:80px;margin-top:0px;">
-                     </div>
-                 </div>
-				<div class="clearfix"></div>
-                <div class="row" style="margin-top:5px;">
-                    <div class="card card-default card-body" style="padding: 0 !important;">
-                        <ul id="tabsJustified" class="nav nav-tabs nav-justified">
-                        	<li class="nav-item">
-                                <a class="nav-link active" href="" data-target="#tab0" data-toggle="tab" th:text="#{dashboard.menu.summary}">Resumen</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab1" data-toggle="tab" th:text="#{dashboard.menu.procedures}">Procedimientos SAIC</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab2" data-toggle="tab" th:text="#{dashboard.menu.docs}">Seguimiento/Acreditación</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab3" data-toggle="tab" th:text="#{dashboard.menu.data}">Indicadores</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab4" data-toggle="tab" th:text="#{dashboard.menu.managers}">Responsables</a>
-                            </li>
-                        </ul>
-                        <!--/tabs-->
-                        <br>
-                        <div id="viewTabsProcYears" class="tab-content">
-                        	<div class="tab-pane active" id="tab0">  
-                        		<div class="row">
-	                        		<div class="col-lg-12" style="margin-top:-10px;margin-bottom:5px;padding-left:30px;padding-right:30px;">  
-										<span class="gantt-legend-done"><span th:text="#{dashboard.summary.legend.active}">Finalizado</span></span>
-										<span class="gantt-legend-active"><span th:text="#{dashboard.summary.legend.ontime}">En curso</span></span>
-										<span class="gantt-legend-expired"><span th:text="#{dashboard.summary.legend.delayed}">Atrasado</span></span>
-										<span class="gantt-legend-closed"><span th:text="#{dashboard.summary.legend.closed}">Cerrado</span></span>
-	                            	</div> 
-	                                <div class="col-lg-12" style="position:relative;z-index:0;">  
-	                            		<svg id="gantt"></svg>     
-	                            	</div>  
-                        		</div>     
-                            </div>
-                            <div class="tab-pane" id="tab1">  
-                            	<div class="col-lg-12" style="margin-top:-10px;margin-bottom:20px;">  
-									<span class="gantt-legend-done"><span th:text="#{dashboard.summary.legend.active}">Finalizado</span></span>
-									<span class="gantt-legend-active"><span th:text="#{dashboard.summary.legend.ontime}">En curso</span></span>
-									<span class="gantt-legend-closed"><span th:text="#{dashboard.summary.legend.closed}">Cerrado</span></span>
-                            	</div> 
-                                <div class="col-lg-12">  
-                            		<div id="treeProcedures"></div>      
-                            	</div>      
-                            </div>
-                            <div class="tab-pane" id="tab2">
-                            		<span th:if="${editable}" class="btn btn-primary pointer" style="z-index:100;float:right;margin-right:25px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#newDocumentModal').modal('toggle');"><i class="fa fa-plus"></i></span>
-									<span th:if="${editable}" class="btn btn-warning pointer" style="z-index:100;float:right;margin-right:10px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#hideDocumentsModal').modal('toggle');"><i class="fas fa-eye-slash"></i></span>
-                               		<span th:if="${editable}" class="btn btn-secondary pointer" style="z-index:100;float:right;margin-right:10px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#updateAcreditaModal').modal('toggle');"><i class="fas fa-calendar-alt"></i></span>
-                               		
-                               	<div class="row" style="padding-left:25px;width:100%;">
-                               		<div class="col-lg-12" th:if="${organ.acreditacio != null}" style="margin-left:-5px;">
-                          				<div class="input-group date-group-lg">
-											<div class="input-group-prepend date-group-prep">
-												<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-medal"></i></span>
-											</div>
-											<div class="input-group-prepend">
-												<span class="input-group-text date-group-text-lg" style="background-color: transparent !important;"><strong th:text="#{dashboard.acred.date.acred}">Prox. acreditación: </strong>:&nbsp;<span id="dataAcred"><span th:text="${organ.acreditacio?.grup}"></span>&nbsp;-&nbsp;<span th:text="${organ.acreditacio?.grupCurs}"></span></span></span>
-											</div>
-                          				</div>
-                           			</div>
-                           			<div class="row" th:if="${organ.acreditacio != null}" style="padding-left:25px;">
-                           				<div style="display:contents;">
-                           					<div class="input-group date-group-lg">
-												<div class="input-group-prepend date-group-prep">
-													<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-splotch"></i></span>
-												</div>
-												<div class="input-group-prepend">
-													<span class="input-group-text date-group-text-lg" style="background-color: transparent !important;"><strong th:text="#{dashboard.acred.date.renov}">Fecha Renovación: </strong>:&nbsp;<span id="dataRenov" th:text="${#dates.format(organ.acreditacio?.dataRenov, 'dd/MM/yyyy')}"></span></span>
-												</div>
-											</div>
-											<div class="input-group date-group-sm">
-												<div class="input-group-prepend date-group-prep">
-													<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-check-double"></i></span>
-												</div>
-												<div class="input-group-prepend">
-													<span class="input-group-text date-group-text-sm" style="background-color: transparent !important;"><strong th:text="#{dashboard.acred.date.segui}">Fecha seguimiento: </strong>:&nbsp;<span id="dataSegui" th:text="${#dates.format(organ.acreditacio?.dataSegui, 'yyyy')}"></span></span>
-												</div>
-											</div>
-											<div class="input-group date-group-sm">
-												<div class="input-group-prepend date-group-prep">
-													<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-check"></i></span>
-												</div>
-												<div class="input-group-prepend">
-													<span class="input-group-text date-group-text-sm" style="background-color: transparent !important;"><strong th:text="#{dashboard.acred.date.verif}">Fecha verificación: </strong>:&nbsp;<span id="dataVerif" th:text="${#dates.format(organ.acreditacio?.dataVerif, 'dd/MM/yyyy')}"></span></span>
-												</div>
-											</div>
-											<div class="input-group date-group-sm">
-												<div class="input-group-prepend date-group-prep">
-													<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-flag"></i></span>
-												</div>
-												<div class="input-group-prepend">
-													<span class="input-group-text date-group-text-sm" style="background-color: transparent !important;"><strong th:text="#{dashboard.acred.date.impla}">Fecha implantación: </strong>:&nbsp;<span id="cursImpla" th:text="${organ.acreditacio?.cursImpla}"></span></span>
-												</div>
-											</div>
-											<div class="input-group row" id="acredRecomsContainer" th:style="${organ.acreditacio?.recom ? 'padding-left:15px;' : 'padding-left:15px; display:none;'}">
-												<div class="input-group-prepend date-group-prep">
-													<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-exclamation-triangle" style="color:orange"></i></span>
-												</div>
-												<div class="input-group-prepend">
-													<span class="input-group-text date-group-text-sm" style="background-color: transparent !important;" th:text="#{dashboard.acred.recom.msg}">Hay recomendaciones de obligado cumplimiento derivadas de la última renovación</span>
-												</div>
-											</div>
-											<div class="input-group row" id="acredSeguiContainer" th:style="${organ.acreditacio?.segui ? 'padding-left:15px;' : 'padding-left:15px; display:none;'}">
-												<div class="input-group-prepend date-group-prep">
-													<span class="input-group-text date-group-icon" style="background-color: transparent !important;"><i class="fas fa-exclamation-triangle" style="color:orange"></i></span>
-												</div>
-												<div class="input-group-prepend">
-													<span class="input-group-text date-group-text-sm" style="background-color: transparent !important;" th:text="#{dashboard.acred.segui.msg}">La titulación debe pasar seguimiento obligatoriamente</span>
-												</div>
-											</div>
-										</div>
-                            		</div>
-	                            	<div class="col-lg-12"  style="margin-top:25px;">
-                           				<strong th:text="#{dashboard.acred.docs.title}">Documentación:</strong>
-										<span th:if="${editable}" class="btn btn-primary pointer" style="z-index:100;float:right;margin-right:0;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#linksModal').modal('toggle');"><i class="fa fa-link"></i></span>
-                            		</div>
-                            		<div class="col-lg-12" id="treeDocuments"></div>
-                           		</div>     
-                            </div>
-                            <div class="tab-pane" id="tab3">
-                            	<div class="row" id="dataContainer" th:if="${editable}" style="display:none;padding-right:10px;padding-left:10px;"> 
-                            		<div class="col-lg-12">
-                            			<table id="dataTabular" class="table table-striped table-bordered display responsive no-wrap" style="width:100%;position:relative;z-index:0;">
-										    <thead>
-										        <tr>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr1}">Encuesta</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr2}">Indicador</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr3}">Ámbito</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr4}">Estudio</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr5}">Valor</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr6}">Curso</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr7}">CursoD</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr8}">Tipo</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr9}">NºEnq</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr10}">Curso Enq</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr11}">Centro Orig</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr12}">Tit. Orig</th>
-										        	<th class="uv-table" th:text="#{dashboard.data.table.hr13}">RUCT</th>
-										        </tr>
-										    </thead>
-											<tbody></tbody>
-										</table>
-                            		</div>
-                            	</div>
-                            	<div class="row" id="graphsContainer" style="margin-left:0px;">  
-                            		<div class="col-lg-4">
-                            			<div style="margin-bottom:5px;">
-                            				<select class="form-control pointer data-selector">
-                            					<option value="1" th:text="#{dashboard.data.sel.rates}">Tasas</option>
-                            					<option value="2" th:if="${organ.tambit == 'G'}" th:text="#{dashboard.data.sel.estud1}">Satisfacción Estudiantes 1º</option>
-                            					<option value="2" th:if="${organ.tambit == 'M' or organ.tambit == 'D'}" th:text="#{dashboard.data.sel.estud}">Satisfacción Estudiantes</option>
-                            					<option value="3" th:if="${organ.tambit == 'G'}" th:text="#{dashboard.data.sel.estud3}">Satisfacción Estudiantes 3º</option>
-                            					<option value="4" th:text="#{dashboard.data.sel.gradu}">Satisfacción Graduados</option>
-                            					<option value="5" th:text="#{dashboard.data.sel.prof}">Satisfacción Profesorado</option>
-                            					<option value="6" th:text="#{dashboard.data.sel.ptgas}">Satisfacción PTGAS</option>
-                            					<option value="7" th:if="${organ.tambit != 'D'}" th:text="#{dashboard.data.sel.eval}">Evaluación Docente</option>
-                            				</select>
-                            			</div>
-                            			<div class="data-inds data-inds-1" data-id="1"></div>
-	                            		<div class="data-inds data-inds-2" data-id="2"></div>
-	                            		<div class="data-inds data-inds-3" data-id="3" th:if="${organ.tambit == 'G'}"></div>
-	                            		<div class="data-inds data-inds-4" data-id="4"></div>
-	                            		<div class="data-inds data-inds-5" data-id="5"></div>
-	                            		<div class="data-inds data-inds-6" data-id="6"></div>
-	                            		<div class="data-inds data-inds-7" data-id="7"></div>
-                            		</div>
-	                                <div class="col-lg-8">  
-	                                	<div class="data-legend row" style="margin-top:-15px;">
-	                                		<div class="col-lg-4" style="text-align:right;">
-	                                			<small>
-	                                				<span><span class="btn data-legend-t"></span> <span th:text="#{dashboard.data.legend.1}">Titulación</span></span>
-	                                			</small>
-	                                		</div>
-	                                		<div class="col-lg-4" style="text-align:center;">
-	                                			<small>
-	                                				<span><span class="btn data-legend-c"></span> <span th:text="#{dashboard.data.legend.2}">Centro</span></span>
-	                                			</small>
-	                                		</div>
-	                                		<div class="col-lg-4" style="text-align:left;">
-	                                			<small>
-	                                				<span><span class="btn data-legend-u"></span> <span th:text="#{dashboard.data.legend.3}">Universidad</span></span>
-	                                			</small>
-	                                			<span class="pointer btn btn-secondary" th:if="${editable}" th:attr="title=#{dashboard.data.table.btn7}" style="float:right;margin-top:-5px;margin-right:5px;min-width:25px;min-height:25px;max-width:25px;max-height:25px;padding:0px;" onclick="toggleDataViz();"><i class="fas fa-table"></i></span>
-	                                		</div>
-	                            		</div>
-	                                	<div class="row chart-inds chart-inds-1" data-id="1"></div>
-	                                	<div class="row chart-inds chart-inds-2" data-id="2"></div>
-	                                	<div class="row chart-inds chart-inds-3" data-id="3" th:if="${organ.tambit == 'G'}"></div>
-	                                	<div class="row chart-inds chart-inds-4" data-id="4"></div>
-	                                	<div class="row chart-inds chart-inds-5" data-id="5"></div>
-	                                	<div class="row chart-inds chart-inds-6" data-id="6"></div>
-	                                	<div class="row chart-inds chart-inds-7" data-id="7"></div>
-	                            	</div> 
-	                            </div>
-                            </div>
-                            <div class="tab-pane" id="tab4">
-                                <div class="uv-table-group" th:if="${results}" style="cursor: auto;">
-									<div class="col-sm-12 uv-table-section" th:each="item : ${resp_titulacions}" style="margin-top:20px;">
-										<strong><span th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></span>:</strong> 
-										<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto:'+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-									</div>
-									<div class="col-sm-12 uv-table-section" th:each="item : ${resp_centres}">
-										<strong th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></strong>
-										<br>
-										<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto='+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-									</div>
-								</div>
-                            </div>
-                        </div>
-                        <!--/tabs content-->
-                    </div><!--/card-->
-                </div><!--/col-->
-			</div>
-		</div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="newDocumentModal" tabindex="-1" role="dialog" aria-labelledby="newDocumentModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Añadir documento</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="newDocumentForm" style="margin-top:25px;">
-			    		<input type="hidden" id="fileLugar" name="lugar" th:value="${organ.id.lugar}">  
-			    		<input type="hidden" id="fileTlugar" name="tlugar" th:value="${organ.id.tlugar}">  
-						<div class="uv-table-group-procedure" id="categoryContainer">
-							<label>Categoría</label>
-							<select class="form-control selectpicker" id="categorySelector" name="category" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						    	<option th:each="item : ${categories}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.idCategoria}">
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure documentSelectorContainer">
-							<label>Documento</label>
-							<select class="form-control selectpicker" id="documentSelector" name="idCategoria" data-showContent="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure documentSelectorContainer">
-							<br>
-							<div class="custom-file">
-								<input type="file" class="custom-file-input pointer" id="customFile" name="file" required>
-								<label class="custom-file-label pointer" for="customFile">Seleccionar archivo</label>
-							</div>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" type="submit" form="newDocumentForm" th:text="#{global.confirm}">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="hideDocumentsModal" tabindex="-1" role="dialog" aria-labelledby="hideDocumentsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Ocultar todos los documentos visibles</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<p>Se ocultarán todos los documentos visibles.</p>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" th:text="#{global.confirm}" onclick="hideAllDocuments();">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="updateAcreditaModal" tabindex="-1" role="dialog" aria-labelledby="updateAcreditaModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Editar fechas de acreditación</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-	        		<input type="hidden" id="lugar" th:value="${organ.id.lugar}">
-	        		<input type="hidden" id="tlugar" th:value="${organ.id.tlugar}">
-			    	<div class="row">
-			    		<div class="col-3">
-							<label th:text="#{dashboard.acred.date.acred}">Fecha acreditación</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="edataAcred" th:value="${#dates.format(organ.acreditacio?.dataAcred, 'dd/MM/yyyy')}" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>					
-						</div> 
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.group.year}">Curso acreditación</label>
-							<input class="form-control" type="number" id="egrupCurs" th:value="${organ.acreditacio?.grupCurs}" style="margin-top:5px;">					
-						</div>
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.group.name}">Grupo acreditación</label>
-							<select class="form-control pointer" id="egrupNum" style="margin-top:5px;">
-								<option value="1" th:selected="${organ.acreditacio?.grupNum == 1}">Enero</option>
-								<option value="4" th:selected="${organ.acreditacio?.grupNum == 4}">Abril</option>
-								<option value="9" th:selected="${organ.acreditacio?.grupNum == 9}">Septiembre</option>
-								<option value="10" th:selected="${organ.acreditacio?.grupNum == 10}">Noviembre</option>
-							</select>					
-						</div> 
-			    	</div>
-			    	<div class="row" style="margin-top:10px;">
-			    		<div class="col-3">
-							<label th:text="#{dashboard.acred.date.segui}">Fecha seguimiento</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="edataSegui" th:value="${#dates.format(organ.acreditacio?.dataSegui, 'dd/MM/yyyy')}" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>					
-						</div> 
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.date.renov}">Fecha renovación</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="edataRenov" th:value="${#dates.format(organ.acreditacio?.dataRenov, 'dd/MM/yyyy')}" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>					
-						</div> 
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.date.verif}">Fecha verificación</label>
-							<div class="input-group date datepicker"> 
-								<input data-date-format="dd/mm/yyyy" type="text" id="edataVerif" th:value="${#dates.format(organ.acreditacio?.dataVerif, 'dd/MM/yyyy')}" class="form-control uv-datePicker" required pattern=".{1,}" autocomplete="off">
-								<div class="input-group-prepend uv-date-icon">
-									<div class="input-group-addon input-group-text">
-										<span class="fa fa-calendar"></span>
-									</div>
-								</div>
-							</div>					
-						</div> 
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.date.impla}" style="margin-top:5px;">Curso implantación</label>
-							<input class="form-control" type="number" id="ecursImpla" th:value="${organ.acreditacio?.cursImpla}"/>					
-						</div>
-			    	</div>
-					<div class="row" style="margin-top:10px;">
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.recom.title}">Recomendaciones *</label>
-							<input type="checkbox" class="form-control pointer" id="erecom" th:checked="${organ.acreditacio?.recom}" style="margin-top:5px;">
-						</div>
-						<div class="col-3">
-							<label th:text="#{dashboard.acred.segui.title}">Seguimiento **</label>
-							<input type="checkbox" class="form-control pointer" id="esegui" th:checked="${organ.acreditacio?.segui}" style="margin-top:5px;">
-						</div>
-					</div>
-					<br>
-					<span>* <small th:text="#{dashboard.acred.recom.info}"></small></span><br>
-					<span>** <small th:text="#{dashboard.acred.segui.info}"></small></span>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" th:text="#{global.confirm}" onclick="updateAcreditaDates();">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<div th:if="${editable}" class="modal fade" id="linksModal" tabindex="-1" role="dialog" aria-labelledby="linksModal" aria-hidden="true">
-		<div class="modal-dialog modal-lg" style="max-width: 80% !important;">
-		  <div class="modal-content">
-			  <div class="modal-header">
-				  <h5 class="modal-title">Enlaces públicos a la documentación</h5>
-				  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-					  <span aria-hidden="true">&times;</span>
-				  </button>
-			  </div>
-			  <div class="modal-body">
-				  <div class="container-fluid" id="linksContainer">
-					  
-				  </div>
-				  <div class="container-fluid" id="linksFormContainer" style="margin-top:25px;">
-					<h5 style="font-size: 99%;"><strong>Nuevo enlace público</strong></h5>
-					<div class="col-3">
-						<label th:text="'Válido hasta'">Válido hasta</label>
-						<div class="input-group date datepicker"> 
-							<input data-date-format="dd/mm/yyyy" type="text" id="links_dataExp" name="dataExp" class="form-control uv-datePicker editFormItem" required pattern=".{1,}" autocomplete="off">
-							<div class="input-group-prepend uv-date-icon">
-								<div class="input-group-addon input-group-text">
-									<span class="fa fa-calendar"></span>
-								</div>
-							</div>
-						</div>					
-					</div>
-					<button class="btn btn-success" th:text="'Crear'" onclick="createLink();" style="margin-top:15px;">Crear</button> 
-				  </div>
-				  
-			  </div>
-			  <div class="modal-footer">
-				  <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="'Cerrar'">Cerrar</button>
-			  </div>
-		  </div>
-		</div>
-	  </div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/datatables.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/gijgo/gijgo.min.js}"></script>
-	<script th:src="@{/js/frappe-gantt/frappe-gantt.min.js}"></script>
-	<script th:src="@{/js/chartjs/chart.js}"></script>
-	<script th:src="@{/js/moment.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/datepicker/locales/bootstrap-datepicker.es.min.js}"></script>
-	<script th:src="@{/js/datepicker/locales/bootstrap-datepicker.ca.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-  	<script type="text/javascript">
-	  	var locale = '[[${#locale.language}]]';
-		var lugar = '[[${organ.id.lugar}]]';
-		var tlugar = '[[${organ.id.tlugar}]]';
-		var ruct = '[[${organ.ruct}]]';
-		var tambit = '[[${organ.tambit}]]';
-		$.fn.selectpicker.Constructor.BootstrapVersion = '4';
-  	</script>
-  
-  	<script th:if="${editable}" type="text/javascript">
-  		var indsDataTable = null;
-  		var translator = {dades_1er:'estud1', dades_3er:'estud3', dades_graduats:'gradu', data:'estud', datag:'gradu',
-  						  profes:'profes', profes_tancades:'profes', evalprof:'evalprof', enquestes:'enquestes',
-  						  doc_tasas:'doc_tasas', doc_prof:'doc_prof', doc_inds:'doc_inds', doc_recom:'doc_recom', doc_etesi:'doc_egres',
-  						  doc_estud:'doc_estud', dadespas:'PTGAS', docentia:'docentia', otros:'otros'};
-  		var currYear = new Date().getFullYear();
-  		
-  		function editableSettings(){
-  			$(".custom-file-input").on("change", function() {
-  				var fileName = $(this).val().split("\\").pop();
-  				$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
-  			});
-  			
-  			$("#newDocumentForm").submit(function(e) {
-  			    e.preventDefault();
-  			    var formData = new FormData(this);    
-  			    $.ajax({
-  			        url: "/dashboard/documents",
-  			        type: "POST",
-  			        data: formData,
-  			        processData: false,
-  			        contentType: false,
-  			        success: function(data){
-  			        	treeDocuments.reload();
-  			        }
-  			    });
-  			    $('#categorySelector').val('').trigger('change');
-  			    $('#documentSelector').val('').trigger('change');
-  			    $('#customFile').val('').trigger('change');
-  				$('#newDocumentModal').modal('toggle');
-  			});
-  		}
-  		
-  		function hideAllDocuments(){
-  			$.post("/dashboard/documents/archive", {tlugar:tlugar, lugar:lugar}, function(){treeDocuments.reload();});
-  			$('#hideDocumentsModal').modal('toggle');
-  		}
-
-  		function updateAcreditaDates(){
-  			var params = {tlugar:tlugar, lugar:lugar, dataAcred:$('#edataAcred').val(), dataSegui:$('#edataSegui').val(),
-  						  dataRenov:$('#edataRenov').val(), dataVerif:$('#edataVerif').val(), cursImpla:$('#ecursImpla').val(),
-  						  grupCurs:$('#egrupCurs').val(), grupNum:$('#egrupNum').val(), recom:$('#erecom').is(':checked'),
-						  segui:$('#esegui').is(':checked')};
-  			$.post("/admin/acredita", params, function(d){
-  				$('#dataAcred').text(d.grup + " - " + d.grupCurs);
-  				$('#dataSegui').text(moment(d.dataSegui.toString()).format("YYYY"));
-  				$('#dataRenov').text(moment(d.dataRenov.toString()).format("DD/MM/YYYY"));
-  				$('#dataVerif').text(moment(d.dataVerif.toString()).format("DD/MM/YYYY"));
-  				$('#cursImpla').text(d.cursImpla);
-  				$('#edataAcred').val(moment(d.dataAcred.toString()).format("DD/MM/YYYY"));
-  				$('#edataSegui').val(moment(d.dataSegui.toString()).format("DD/MM/YYYY"));
-  				$('#edataRenov').val(moment(d.dataRenov.toString()).format("DD/MM/YYYY"));
-  				$('#edataVerif').val(moment(d.dataVerif.toString()).format("DD/MM/YYYY"));
-  				$('#ecursImpla').val(d.cursImpla);
-  				$('#egrupNum').val(d.grupNum);
-  				$('#egrupCurs').val(d.grupCurs);
-				$('#erecom').attr('checked', d.recom);
-				$('#esegui').attr('checked', d.segui);
-  				$('#updateAcreditaModal').modal('toggle');
-				if(d.recom){
-					$('#acredRecomsContainer').show();
-				}
-				else{
-					$('#acredRecomsContainer').hide();
-				}
-				if(d.segui){
-					$('#acredSeguiContainer').show();
-				}
-				else{
-					$('#acredSeguiContainer').hide();
-				}
-  			});
-  		}
-  		
-		function getTableData(){
-			showSpinner();
-			$.get('/data/current/show/'+ruct+'/'+currYear, function(data){
-				$('#dataTabular > tbody').html('');
-				data.forEach(function(d){
-					$('#dataTabular > tbody').append(`
-					<tr>
-						<td>${translator[d.enquesta]}</td>
-						<td>${d.indicador}</td>
-						<td>${d.ambit}</td>
-						<td>${d.estudi}</td>
-						<td>${d.valor === null ? '' : d.valor}</td>
-						<td>${d.curs === null ? '' : d.curs}</td>
-						<td>${d.cursd === null ? '' : d.cursd}</td>
-						<td>${d.tipus === null ? '' : d.tipus}</td>
-						<td>${d.nenq === null ? '' : d.nenq}</td>
-						<td>${d.cursEnquesta === null ? '' : d.cursEnquesta}</td>
-						<td>${d.centreOrigen === null ? '' : d.centreOrigen}</td>
-						<td>${d.titulacioOrigen === null ? '' : d.titulacioOrigen}</td>
-						<td>${d.ruct === null ? '' : d.ruct}</td>
-					</tr>
-					`);
-				});
-				
-				initDataTable();
-			});
-		}
-		
-		function toggleDataViz(){
-			if(indsDataTable === null){
-				getTableData();
-			}
-			$('#graphsContainer').toggle();
-			$('#dataContainer').toggle();
-		}
-		
-		function showSpinner(){
-			$('#uv-content-wrapper').append('<div class="uv-loading-spinner" th:text="#{global.loading}"></div>');
-		}
-		
-		function closeSpinner(){
-			$('.uv-loading-spinner').remove();
-		}
-		
-		function updateDataTable(){
-			showSpinner();
-			$.get('/data/current/show/'+ruct+'/'+$('#dataSelectedCurs').val(), function(data){
-				var dataArr = [];
-				data.forEach(function(d){
-					dataArr.push([translator[d.enquesta],
-							   d.indicador,
-							   d.ambit,
-							   d.estudi,
-							   d.valor === null ? '' : d.valor,
-							   d.curs === null ? '' : d.curs,
-							   d.cursd === null ? '' : d.cursd,
-							   d.tipus === null ? '' : d.tipus,
-							   d.nenq === null ? '' : d.nenq,
-							   d.cursEnquesta === null ? '' : d.cursEnquesta,
-							   d.centreOrigen === null ? '' : d.centreOrigen,
-							   d.titulacioOrigen === null ? '' : d.titulacioOrigen,
-							   d.ruct === null ? '' : d.ruct]);
-				});
-				indsDataTable.clear();
-				indsDataTable.rows.add(dataArr).draw();
-				closeSpinner();
-			});
-		}
-		
-		function initDataTable(){
-			
-			$('#dataTabular thead tr')
-		        .clone(true)
-		        .addClass('filters')
-				.addClass('dataFilters')
-		        .appendTo('#dataTabular thead');
-	
-			indsDataTable = $('#dataTabular').DataTable({
-				paging: true, 
-				buttons: [
-					{
-						extend: "pageLength",
-					},
-					{
-						text: `[[#{dashboard.data.table.btn1}]]: <input id="dataSelectedCurs" type="number" value="${currYear}" style="width: 75px;">`,
-						action: function (e, dt, node, config) {
-							updateDataTable();
-						}
-					},
-					{
-						extend: 'excelHtml5',
-						text: '<span><i class="fas fa-file-excel"></i></span>',
-						titleAttr: '[[#{dashboard.data.table.btn2}]]',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'csvHtml5',
-						text: '<span><i class="fas fa-file-csv"></i></span>',
-						titleAttr: '[[#{dashboard.data.table.btn3}]]',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'pdfHtml5',
-						text: '<span><i class="fas fa-file-pdf"></i></span>',
-						titleAttr: '[[#{dashboard.data.table.btn4}]]',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'colvis',
-						text: '<span><i class="fas fa-eye"></i></span>',
-						className: 'dropdown-colvis',
-						titleAttr: '[[#{dashboard.data.table.btn5}]]'
-					},
-					{
-						text: '<span title="'+'[[#{dashboard.data.table.btn6}]]'+'"><i class="fas fa-chart-line"></i></span>',
-						action: function ( e, dt, node, config ) {
-							toggleDataViz();
-						}
-					}
-				],
-				layout: {
-			        topStart: null,
-			        topEnd: 'buttons'
-			    },
-				"language":{
-					"lengthMenu": "_MENU_", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		            },
-					"buttons": {
-						"pageLength": "%d [[#{admin.stats.table.lengthMenu}]]"
-					}
-				},
-				bAutoWidth: false, 
-				searching: true,
-				order:[ [0, 'asc'], [1, 'asc'] ],
-				orderCellsTop: true,
-				//fixedHeader: true, // Not compatible with android
-				info: false,
-				responsive: false,
-				scrollX: true,
-				lengthMenu: [10, 25, 50, 100, { label: 'All', value: -1 }],
-				initComplete: function () {
-					var api = this.api();
-		        	this.api()
-		        	.columns()
-		            .eq(0)
-		            .each(function (colIdx) {
-		                var cell = $('.filters.dataFilters th').eq(
-		                    $(api.column(colIdx).header()).index()
-		                );
-		                var title = $(cell).text();
-		                $(cell).html('<input type="text" placeholder="' + title + '" />');
-		                $('input', $('.filters.dataFilters th').eq($(api.column(colIdx).header()).index()))
-		                    .off('keyup change')
-		                    .on('change', function (e) {
-		                        $(this).attr('title', $(this).val());
-		                        var regexr = '({search})'; 
-		                        cursorPosition = this.selectionStart;
-		                        api.column(colIdx)
-		                           .search(   
-		                                this.value != ''
-		                                    ? regexr.replace('{search}', '(((' + this.value + ')))')	
-		                                    : '',
-		                                this.value != '',
-		                                this.value == ''
-		                            )
-		                            .draw();
-		                    })
-		                    .on('keyup', function (e) {
-								e.preventDefault();
-		                        e.stopPropagation();
-		                        $(this).trigger('change');
-		                        $(this)
-		                            .focus()[0]
-		                            .setSelectionRange(cursorPosition, cursorPosition);
-		                    });
-		            });
-		            api.column(5).visible(false);
-		            api.column(6).visible(false);
-		            api.column(7).visible(false);
-		            api.column(8).visible(false);
-		            api.column(9).visible(false);
-		            api.column(10).visible(false);
-		            api.column(11).visible(false);
-		            api.column(12).visible(false);
-		            closeSpinner();
-				}
-			});
-				
-			}
-
-			function loadLinks(){
-				$.get('/dashboard/links/'+ruct, function(data){
-					$('#linksContainer').html('');
-					data.forEach(function(d){
-						const date = d.dataExp.split('T')[0].split('-');
-						$('#linksContainer').append(`
-							</br>
-							<div id="shared_link_${d.id}" style="width:100%;magin-bottom:-10px;">
-								<a href="${d.link}" target="_blank">${d.link}</a> 
-								<span style="margin-left:20px;">(expira ${date[2]}/${date[1]}/${date[0]})</span>
-								<span style="margin-left:20px;">${d.visites} visitas</span>
-								<span style="float:right;">
-									<span class="pointer btn btn-danger" style="z-index:100;float:right;margin-right:0;font-size:75%;padding: 5px 8px 3px 8px;" onclick="deleteLink('${d.id}')"><i class="fas fa-trash"></i></span>
-									<span class="pointer btn btn-primary" style="z-index:100;float:right;margin-right:5px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="copyLink('${d.link}')"><i class="fas fa-copy"></i></span>	
-								</span>
-							</div>
-						`);
-					});
-				});
-			}
-
-			function deleteLink(id){
-				$.ajax({
-					url: '/dashboard/links/'+id,
-					type: 'DELETE',
-					success: function(r) {
-						loadLinks();
-					}
-				});
-			}
-
-			function createLink(){
-				$.post("/dashboard/links/"+ruct, {dataExp:$('#links_dataExp').val()}, 
-					function(data){
-						loadLinks();
-					}
-				);
-			}
-
-			function copyLink(link){
-				console.log(link);
-				navigator.clipboard.writeText(link);
-			}
-  		
-  	</script>
-  	
-  	<script th:if="${!editable}" type="text/javascript">
-  		function editableSettings(){}
-  		function hideAllDocuments(){}
-  		function updateAcreditaDates(){}
-		function loadLinks(){}
-  	</script>
-  
-	<script type="text/javascript">
-		var treeProcedures, treeDocuments, ganttChart;
-		var inds = [];
-		var tasks = [];
-				
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			layout.closeLoadingSpinner(".uv-loading-spinner");	
-			
-			$('[data-toggle="popover"]').popover();
-			
-			$('.data-inds').hide();
-			$('.chart-inds').hide();
-			$('.data-inds-1').show();
-			$('.chart-inds-1').show();
-			
-			$('#categorySelector').val('').trigger('change');
-			$('#categorySelector').change(getChildCats);
-			
-			$('.data-selector').on('change', function(){
-				toggleDataView($(this).val());
-			});
-
-			$('.datepicker').datepicker({
-				language: locale,
-			    autoclose: true,
-			    todayHighlight: true,
-			    orientation: "bottom center",
-			    clearBtn: true
-			});
-			
-			treeProcedures = $('#treeProcedures').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: '/dashboard/procedures/'+ruct
-			});
-			
-			treeDocuments = $('#treeDocuments').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: '/dashboard/documents/'+ruct
-			});
-		
-			$.get('/dashboard/gantt/'+ruct, function(data){
-				data.forEach(function(d){d.id = 'Task '+d.id;});
-				data.at(-1).custom_class += ' gantt-task-last';
-				tasks = data;
-				ganttChart = new Gantt("#gantt", tasks, {
-					on_click: function (task) {
-						window.open("/procedure/"+task.id.replace('Task_', ''));
-					},
-					on_date_change: function(task, start, end) {
-						return false;
-					},
-					on_progress_change: function(task, progress) {
-						return false;
-					},
-					on_view_change: function() {
-						var bars = document.querySelectorAll("#gantt" + " .bar-group");
-						for (var i = 0; i < bars.length; i++) {
-							bars[i].addEventListener("mousedown", stopEvent, true);
-						}
-						var handles = document.querySelectorAll("#gantt" + " .handle-group");
-						for (var i = 0; i < handles.length; i++) {
-							handles[i].remove();
-						}
-					},
-					bar_height: 20, 
-					bar_corner_radius: 10, 
-					arrow_curve: 10, 
-					padding: 15,
-					view_mode: "Month",
-					date_format: "YYYY-MM-DD",
-					language: locale,
-					draggable: false, 
-		            hasArrows: false,
-		            highlight_weekend: false,
-					infinite_padding: false,
-		            readonly: true,
-					//column_width: 20,
-		            popup: function(task) {
-		                return `
-		                  <div class="details-container">
-							<h6>${task.titCas}</h6>
-		                    <p>${task._start.toLocaleDateString()} - ${task._end.toLocaleDateString()}</p>
-		                  </div>
-		                `;
-		        	},
-				});
-				ganttChart.change_view_mode("Month");
-				$('.today-button').trigger('click');
-				$('.gantt-task-last').get(0).scrollIntoView({
-				            behavior: 'auto',
-				            block: 'center',
-				            inline: 'center'
-				        });
-				$(window).scrollTop(0);
-			});
-			
-			$.get('/dashboard/graphs/list/'+ruct, function(data){
-				inds = data;
-				inds = inds.map((e, i) => ({...e, idGrafica: data[i].idGrafica.idGrafica, estudi: data[i].idGrafica.estudi}));
-				createDataTables();
-				getGraphData();	
-			});			
-						
-			editableSettings();
-			loadLinks();
-		});		
-		
-		function createChartCanvas(i){
-			 $(`.chart-inds-${i.g}`).append(`<div class="col-lg-4 chart-container"> 
-						     			   	     <canvas id="chart_${i.idGrafica}"></canvas>	    
-						             	     </div>`);
-		}
-				
-		function createDataTables(){
-			$('.data-inds').each(function(idx){
-				var i = $(this).attr('data-id');
-				var group = inds.filter(o => o.g == i);
-				var trs = '';
-				group.forEach(function(g){
-					trs += `<tr id="tr_${g.idGrafica}"></tr>`; 
-				});
-				$(this).html(`<table class="tableizer-table" style="width:100%;">
-					<thead>
-						<tr class="tableizer-firstrow">
-							<th></th>
-							<th style="width:50px;text-align: center;">Actual</th>
-							<th style="width:50px;text-align: center;">Anterior</th>
-							<th style="width:50px;text-align: center;">Desv.</th>
-						</tr>
-					 </thead>
-					 <tbody>
-						 ${trs}
-					</tbody>
-                 </table>`);	
-			});
-		}
-		
-		function drawTr(obj, value1, value2){
-			var color = (value2 == undefined) ? 'black' : value1 - value2 < 0 ? 'red' : 'green';
-			if(obj.negar){
-				color = (color == 'black') ? color : value1 - value2 > 0 ? 'red' : 'green';
-			}
-			$('#tr_'+obj.idGrafica).html(`<td>${locale == 'es' ? obj.nomCas : obj.nomVal}</td>
-							   <td>${parseFloat(value1).toFixed(2)}${obj.unitats}</td>
-							   <td>${value2 == undefined ? '---' : parseFloat(value2).toFixed(2)+obj.unitats}</td>
-							   <td style="color:${color}">${value2 == undefined ? '---' : (value1 - value2).toFixed(2)+obj.unitats}</td>`);
-		}
-		
-		function drawChart(obj, values, labels){
-			const ctx = document.getElementById('chart_'+obj.idGrafica);
-			var callback;
-			if(obj.unitats == '%'){
-				callback = function(value, index, values){return value + " %";};
-			}
-			else{
-				callback = function(value, index, values){return value;};
-			}
-			new Chart(ctx, {
-			    type: 'line',
-			    data: {
-			      labels: labels,
-			      datasets: values
-			    },
-			    options: {
-			    	responsive: true,
-			        maintainAspectRatio: false,
-			    	plugins: {
-			    		title: {
-			                display: true,
-			                text: locale == 'es' ? obj.nomCas : obj.nomVal
-			            },
-			            legend: {
-			                display: false
-			            },
-			            labels: {
-			                render: () => {}
-			            }
-			        },
-					scales: {
-					  y: {
-							max: obj.likert ? 5 : null,
-							min: obj.likert ? 1 : 0,
-						    beginAtZero: obj.likert ? true : false,
-						    ticks: {
-						    	beginAtZero: obj.likert ? true : false,
-						    	autoSkip: !obj.likert,
-						    	stepSize: obj.likert ? 1 : null,
-						    	stepValue: obj.likert ? 1 : null,
-						    	callback: callback
-						    },
-						    grid: {
-						        drawBorder: true
-						    },
-						    gridLines: {
-						        display: true,
-						        color: "rgba(255,99,132,0.2)"
-						      },
-						    stacked: false,
-						  }
-						}
-			    }
-			  });
-		}
-		
-		function getGraphData(){
-			$.get('/dashboard/graphs/rates/'+lugar, function(data){
-				data.forEach(function(d, i){
-					var values = [], labels = [];
-					var datasets = [];
-					var obj = inds.find(o => o.idGrafica === d.indicador);
-					if(obj !== undefined){
-						d.valores.forEach(function(v, k){
-							values.push(v.valor);
-							labels.push(v.curso);
-						});
-						datasets.push({
-					        label: locale == 'es' ? 'Titulación' : 'Titulació',
-					        data: values,
-					        borderWidth: 1.2,
-					        lineTension: 0.6,
-					        borderColor: "rgba(0,123,255,1)",
-					        backgroundColor: "rgba(0,123,255,0.5)",
-						});
-						createChartCanvas(obj);
-						drawTr(obj, values.at(-1), values.at(-2));
-						drawChart(obj, datasets, labels, obj);
-					}
-				});
-			});
-			
-			$.get('/dashboard/graphs/inds/'+ruct, function(data){
-				inds.forEach(function(o){
-					var datasets = [], labels = [];
-					var vals = data.filter(d => d.dimension+'_'+d.indicador === o.idGrafica);
-					if(vals.length < 1){ console.log(o.idGrafica); return; }
-					createChartCanvas(o);
-					vals.forEach(function(v){
-						var values = [];
-						v.valores.forEach(function(v, k){
-							values.push(v.valor);
-							labels.push(v.curso);
-						});
-						if(v.ambit === 'T'){
-							datasets.push({
-						        label: locale == 'es' ? 'Titulación' : 'Titulació',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(0,123,255,1)",
-						        backgroundColor: "rgba(0,123,255,0.5)",
-							});
-							drawTr(o, values.at(-1), values.at(-2));
-						}
-						if(v.ambit === 'C'){
-							datasets.push({
-						        label: locale == 'es' ? 'Centro' : 'Centre',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(154,240,41,1)",
-						        backgroundColor: "rgba(154,240,41,0.5)",
-							});
-							if(v.dimension === 'ptgas'){
-								drawTr(o, values.at(-1), values.at(-2));
-							}
-						}
-						if(v.ambit === 'U'){
-							datasets.push({
-						        label: locale == 'es' ? 'Universidad' : 'Universitat',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(255,0,0,1)",
-						        backgroundColor: "rgba(240,41,67,0.5)",
-							});
-						}
-					});
-					labels = Array.from(new Set(labels)).sort();
-					drawChart(o, datasets, labels);
-				});			
-			});
-		}
-		
-		function getChildCats(){
-			$.get('/dashboard/documents/cats/'+$(this).val()+'/'+tambit, function(data){
-				$('#documentSelector').html('');
-				data.forEach(function(d){
-					$(`<option value="${d.idCategoria}" data-content="${locale == 'es' ? d.nomCas : d.nomVal}">${locale == 'es' ? d.nomCas : d.nomVal}</option>`)
-					.appendTo($('#documentSelector'));
-				});
-				$('#documentSelector').selectpicker('refresh');
-			});
-		}
-		
-		function toggleDataView(id){
-			$('.data-inds').hide();
-			$('.chart-inds').hide();
-			$('.data-inds-'+id).show();
-			$('.chart-inds-'+id).show();
-		}
-		
-		function stopEvent(event) {
-			event.preventDefault();
-		}
-
-	</script>
-
-</body>
-
-</html>

+ 0 - 779
src/main/resources/templates/dashboardUniversitat.html

@@ -1,779 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/gijgo/css/gijgo.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/jquery/datatables.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/frappe-gantt/frappe-gantt.min.css}" rel="stylesheet"/>
-
-<style>
-	table.tableizer-table {
-		font-size: 12px;
-		border: 1px solid #CCC; 
-		font-family: Arial, Helvetica, sans-serif;
-	} 
-	
-	.tableizer-table td {
-		padding: 4px;
-		margin: 3px;
-		border: 1px solid #CCC;
-	}
-
-	.tableizer-table th {
-		background-color: #1B3552; 
-		color: #FFF;
-		font-weight: bold;
-	}
-
-	.chart-container{
-		min-height:150px;
-	}
-
-	.gantt-container{
-		height: calc(100vh - 250px);
-	}
-
-	.dropdown-colvis ~ .dropdown-menu {
-		transform: translate(-100px, 0px);
-	}
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="row">
-                     <div class="col-sm-10">
-                         <h5 style="margin-top:10px;"><span style="text-transform: uppercase;" th:text="${#locale.language} == 'es' ? ${organ.nomCas}:${organ.nomVal}">nombre centro</span></h5>
-                     </div>
-                     <div class="col-sm-2" style="padding:0;">
-                     	<img th:src="@{${'/logos/C' + organ.id.lugar +'.png'}}" class="float-right img-responsive img-rounded" style="width:80px;margin-top:0px;">
-                     </div>
-                 </div>
-				<div class="clearfix"></div>
-                <div class="row" style="margin-top:5px;">
-                    <div class="card card-default card-body" style="padding: 0 !important;">
-                        <ul id="tabsJustified" class="nav nav-tabs nav-justified">
-                        	<li class="nav-item">
-                                <a class="nav-link active" href="" data-target="#tab3" data-toggle="tab" th:text="#{dashboard.menu.tits}">Titulaciones</a>
-                            </li>
-                        	<li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab0" data-toggle="tab" th:text="#{dashboard.menu.summary}">Resumen</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab1" data-toggle="tab" th:text="#{dashboard.menu.procedures}">Procedimientos SAIC</a>
-                            </li>
-							<li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab2" data-toggle="tab" th:text="#{dashboard.menu.docs}">Seguimiento/Acreditación</a>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="" data-target="#tab4" data-toggle="tab" th:text="#{dashboard.menu.managers}">Responsables</a>
-                            </li>
-                        </ul>
-                        <!--/tabs-->
-                        <br>
-                        <div id="viewTabsProcYears" class="tab-content">
-                        	<div class="tab-pane" id="tab0">  
-                        		<div class="row">
-	                        		<div class="col-lg-12" style="margin-top:-10px;margin-bottom:5px;padding-left:30px;padding-right:30px;">  
-										<span class="gantt-legend-done"><span th:text="#{dashboard.summary.legend.active}">Finalizado</span></span>
-										<span class="gantt-legend-active"><span th:text="#{dashboard.summary.legend.ontime}">En curso</span></span>
-										<span class="gantt-legend-expired"><span th:text="#{dashboard.summary.legend.delayed}">Atrasado</span></span>
-										<span class="gantt-legend-closed"><span th:text="#{dashboard.summary.legend.closed}">Cerrado</span></span>
-										<div class="input-group" style="text-align:right;float:right;margin-right:0px;width:auto !important;">
-										    <div class="input-group-prepend">
-										    	<span class="input-group-text"><span th:text="#{dashboard.gantt.selector}">Procedimientos de</span></span>
-										    </div>
-									    	<select class="form-control pointer" id="ganttOrigin" style="max-width:300px;" onchange="changeGanttOrigin();">
-												<option th:each="item : ${titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.ruct}">Tit 1</option>
-											</select>
-									  	</div>
-	                            	</div> 
-	                                <div class="col-lg-12" style="position:relative;z-index:0;">  
-	                            		<svg id="gantt"></svg>     
-	                            	</div>  
-                        		</div>		    
-                            </div>
-                            <div class="tab-pane" id="tab1">  
-                            	<div class="col-lg-12" style="margin-top:-10px;margin-bottom:20px;">  
-									<span class="gantt-legend-done"><span th:text="#{dashboard.summary.legend.active}">Finalizado</span></span>
-									<span class="gantt-legend-active"><span th:text="#{dashboard.summary.legend.ontime}">En curso</span></span>
-									<span class="gantt-legend-closed"><span th:text="#{dashboard.summary.legend.closed}">Cerrado</span></span>
-									<div class="input-group" style="text-align:right;float:right;margin-right:0px;width:auto !important;">
-									    <div class="input-group-prepend">
-									    	<span class="input-group-text">Procedimientos de:</span>
-									    </div>
-								    	<select class="form-control pointer" id="reportsOrigin" style="max-width:300px;" onchange="changeReportsOrigin();">
-											<option selected th:value="${organ.ruct}" th:text="#{dashboard.data.legend.2}">Centre</option>
-											<option th:each="item : ${titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.ruct}">Tit 1</option>
-										</select>
-								  	</div>
-                            	</div> 
-                                <div class="col-lg-12">  
-                            		<div id="treeProcedures"></div>      
-                            	</div>      
-                            </div>
-							<div class="tab-pane" id="tab2">
-								<span th:if="${editable}" class="btn btn-primary pointer" style="z-index:100;float:right;margin-right:25px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#newDocumentModal').modal('toggle');"><i class="fa fa-plus"></i></span>
-								<span th:if="${editable}" class="btn btn-warning pointer" style="z-index:100;float:right;margin-right:10px;font-size:75%;padding: 5px 8px 3px 8px;" onclick="$('#hideDocumentsModal').modal('toggle');"><i class="fas fa-eye-slash"></i></span>
-								<div class="row" style="padding-left:25px;width:100%;">  	
-                            		<div class="col-lg-12" style="margin-left:-5px;">
-                           				<strong th:text="#{dashboard.acred.docs.title}">Documentación</strong>
-                           				<div id="treeDocuments"></div>
-                            		</div>         
-                            	</div> 
-                            </div>
-                            <div class="tab-pane active" id="tab3">
-                            	<div class="col-lg-12" style="margin-left:0px;margin-top:-15px;width:100%;position:relative;z-index:0;">  
-									<table id="titsTable" class="table table-striped table-bordered display responsive no-wrap" style="width:100%;position:relative;z-index:0;">
-									    <thead>
-									        <tr>
-									        	<th class="uv-table" th:text="#{dashboard.tits.ruct}">RUCT</th>
-									        	<th class="uv-table" th:text="#{dashboard.tits.codes}">Códigos</th>
-												<th class="uv-table" th:text="#{dashboard.tits.centre}">Centro</th>
-									        	<th class="uv-table" th:text="#{dashboard.tits.tit}">Titulación</th>
-									        	<th class="uv-table" th:text="#{dashboard.tits.type}">Tipo</th>
-									        	<th class="uv-table" th:text="#{dashboard.acred.table.next}">Próx Accr.</th>
-										        <th class="uv-table" th:text="#{dashboard.acred.table.acred}">Fecha Accr.</th>
-										        <th class="uv-table" th:text="#{dashboard.acred.table.renov}">Renovación</th>
-										        <th class="uv-table" th:text="#{dashboard.acred.table.segui}">Seguimiento</th>
-										        <th class="uv-table" th:text="#{dashboard.acred.table.verif}">Verificación</th>
-										        <th class="uv-table" th:text="#{dashboard.acred.table.impla}">Implantación</th>
-										        <th class="uv-table" th:text="#{dashboard.acred.table.inter}">InterUniv.</th>
-									        </tr>
-									    </thead>
-										<tbody>
-											<tr th:each="item,inRowID : ${titulacions}">
-												<td>
-													<span th:text="${item.ruct}"></span>
-												</td>
-												<td>
-													<span th:text="${item.codis}"></span>
-												</td>
-												<td>
-													<a target="_blank" th:href="${'/dashboard/'+item.organ.ruct}"><span th:text="${#locale.language} == 'es' ? ${item.organ.nomCas}:${item.organ.nomVal}"></span></a>
-												</td>
-												<td>
-													<a target="_blank" th:href="${'/dashboard/'+item.ruct}"><span th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}"></span></a>
-												</td>
-												<td>
-													<span th:text="${item.tambit == 'M' ? 'Máster' : item.tambit == 'G' ? 'Grado' : 'Doctorado'}"></span>
-												</td>
-												<td>
-													<span th:text="${item.acreditacio?.grupCurs+' - '+item.acreditacio?.grup}"></span>
-												</td>
-												<td>
-													<span th:text="${#dates.format(item.acreditacio?.dataAcred, 'dd/MM/yyyy')}"></span>
-												</td>
-												<td>
-													<span th:text="${#dates.format(item.acreditacio?.dataRenov, 'dd/MM/yyyy')}"></span>
-												</td>
-												<td>
-													<span th:text="${#dates.format(item.acreditacio?.dataSegui, 'dd/MM/yyyy')}"></span>
-												</td>
-												<td>
-													<span th:text="${#dates.format(item.acreditacio?.dataVerif, 'dd/MM/yyyy')}"></span>
-												</td>
-												<td>
-													<span th:text="${item.acreditacio?.cursImpla}"></span>
-												</td>
-												<td>
-													<span th:if="${item.acreditacio != null}" th:text="${item.acreditacio?.inter ? 'SI' : 'NO'}"></span>
-												</td>
-											</tr>
-										</tbody>
-									</table>
-	                            </div>
-                            </div>
-                            <div class="tab-pane" id="tab4">
-                                <div class="uv-table-group" th:if="${results}" style="cursor: auto;">
-									<div class="col-sm-12 uv-table-section" th:each="item : ${resp_titulacions}">
-										<strong><span th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></span>:</strong> 
-										<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto:'+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-									</div>
-									<div class="col-sm-12 uv-table-section" th:each="item : ${resp_centres}">
-										<strong th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></strong>
-										<br>
-										<span th:text="${item.usuari.nom}"></span> <span th:text="${item.usuari.cognoms}"></span> (<a th:href="'mailto='+${item.usuari.email}" th:text="${item.usuari.email}"></a>)
-									</div>
-								</div>
-                            </div>
-                        </div>
-                        <!--/tabs content-->
-                    </div><!--/card-->
-                </div><!--/col-->
-			</div>
-		</div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="newDocumentModal" tabindex="-1" role="dialog" aria-labelledby="newDocumentModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Añadir documento</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="newDocumentForm" style="margin-top:25px;">
-			    		<input type="hidden" id="fileLugar" name="lugar" th:value="${organ.id.lugar}">  
-			    		<input type="hidden" id="fileTlugar" name="tlugar" th:value="${organ.id.tlugar}">  
-						<div class="uv-table-group-procedure" id="categoryContainer">
-							<label>Categoría</label>
-							<select class="form-control selectpicker" id="categorySelector" name="category" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						    	<option th:each="item : ${categories}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.idCategoria}">
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure documentSelectorContainer">
-							<label>Documento</label>
-							<select class="form-control selectpicker" id="documentSelector" name="idCategoria" data-showContent="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						    </select>
-						</div>
-						<div class="uv-table-group-procedure documentSelectorContainer">
-							<br>
-							<div class="custom-file">
-								<input type="file" class="custom-file-input pointer" id="customFile" name="file" required>
-								<label class="custom-file-label pointer" for="customFile">Seleccionar archivo</label>
-							</div>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" type="submit" form="newDocumentForm" th:text="#{global.confirm}">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div th:if="${editable}" class="modal fade" id="hideDocumentsModal" tabindex="-1" role="dialog" aria-labelledby="hideDocumentsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Ocultar todos los documentos visibles</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<p>Se ocultarán todos los documentos visibles.</p>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" th:text="#{global.confirm}" onclick="hideAllDocuments();">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/datatables.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script th:src="@{/js/gijgo/gijgo.min.js}"></script>
-	<script th:src="@{/js/frappe-gantt/frappe-gantt.min.js}"></script>
-	<script th:src="@{/js/chartjs/chart.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-  	<script th:if="${editable}" type="text/javascript">
-  		function editableSettings(){
-  			$(".custom-file-input").on("change", function() {
-  				var fileName = $(this).val().split("\\").pop();
-  				$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
-  			});
-  			
-  			$("#newDocumentForm").submit(function(e) {
-  			    e.preventDefault();
-  			    var formData = new FormData(this);    
-  			    $.ajax({
-  			        url: "/dashboard/documents",
-  			        type: "POST",
-  			        data: formData,
-  			        processData: false,
-  			        contentType: false,
-  			        success: function(data){
-  			        	treeDocuments.reload();
-  			        }
-  			    });
-  			    $('#categorySelector').val('').trigger('change');
-  			    $('#documentSelector').val('').trigger('change');
-  			    $('#customFile').val('').trigger('change');
-  				$('#newDocumentModal').modal('toggle');
-  			});
-  		}
-  		
-  		function hideAllDocuments(){
-  			$.post("/dashboard/documents/archive", {tlugar:tlugar, lugar:lugar}, function(){treeDocuments.reload();});
-  			$('#hideDocumentsModal').modal('toggle');
-  		}
-  	</script>
-  	
-  	<script th:if="${!editable}" type="text/javascript">
-  		function editableSettings(){}
-  		function hideAllDocuments(){}
-  	</script>
-  
-	<script type="text/javascript">
-		var locale = '[[${#locale.language}]]';
-		var lugar = '[[${organ.id.lugar}]]';
-		var tlugar = '[[${organ.id.tlugar}]]';
-		var ruct = '[[${organ.ruct}]]';
-		var tambit = '[[${organ.tambit}]]';
-		var treeProcedures, treeDocuments, ganttChart;
-		var tasks = [];
-		var inds = [];
-		var cursorPosition;
-		var tableAcreds, tableTits;
-				
-		$(document).ready(function(){  
-			layout = new Layout("");
-			initTables();
-			
-			$('.data-inds-2').hide();
-			$('.chart-container').hide();
-			
-			$('#categorySelector').val('').trigger('change');
-			$('#categorySelector').change(getChildCats);
-			
-			$('.data-selector-orig').on('change', function(){
-				//changeDataOrig($(this).val());
-			});
-			
-			$('.data-selector-group').on('change', function(){
-				//toggleDataView($(this).val());
-			});
-			
-			$('.data-selector-orig').trigger('change');
-			
-			treeDocuments = $('#treeDocuments').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: '/dashboard/documents/'+ruct
-			});
-			drawReports(ruct);
-			drawGantt(ruct);
-			editableSettings();
-			
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-		});	
-		
-		function initTables(){
-			
-			$('#titsTable thead tr')
-		        .clone(true)
-		        .addClass('filters')
-				.addClass('titsFilters')
-		        .appendTo('#titsTable thead');
-			
-			tableTits = $('#titsTable').DataTable({
-				paging: true, 
-				buttons: [
-					{
-						extend: "pageLength",
-					},
-					{
-						extend: 'excelHtml5',
-						text: '<span><i class="fas fa-file-excel"></i></span>',
-						titleAttr: 'Exportar Excel',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'csvHtml5',
-						text: '<span><i class="fas fa-file-csv"></i></span>',
-						titleAttr: 'Exportar CSV',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'pdfHtml5',
-						text: '<span><i class="fas fa-file-pdf"></i></span>',
-						titleAttr: 'Exportar PDF',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'colvis',
-						text: '<span><i class="fas fa-eye"></i></span>',
-						className: 'dropdown-colvis',
-						titleAttr: 'Mostrar/Ocultar columnas'
-					}
-				],
-				layout: {
-					topStart: null,
-			        topEnd: 'buttons'
-			    },
-				"language":{
-					"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		            },
-					"buttons": {
-						"pageLength": "%d [[#{admin.stats.table.lengthMenu}]]"
-					}
-				},
-				bAutoWidth: false, 
-				aoColumns : [
-					{ sWidth: '5%' },
-					{ sWidth: '5%' },
-				    { sWidth: '35%' },
-				    { sWidth: '50%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' },
-				    { sWidth: '5%' }
-				],
-				searching: true,
-				order:[ [2, 'asc'], [4, 'asc'], [3, 'asc'] ],
-				orderCellsTop: true,
-				//fixedHeader: true, // Not compatible with android
-				info: false,
-				responsive: false,
-				scrollX: true,
-				lengthMenu: [10, 25, 50, 100, { label: 'All', value: -1 }],
-				initComplete: function () {
-					var api = this.api();
-		        	this.api()
-		        	.columns()
-	                .eq(0)
-	                .each(function (colIdx) {
-	                    var cell = $('.filters.titsFilters th').eq(
-	                        $(api.column(colIdx).header()).index()
-	                    );
-	                    var title = $(cell).text();
-	                    $(cell).html('<input type="text" placeholder="' + title + '" />');
-	                    $('input', $('.filters.titsFilters th').eq($(api.column(colIdx).header()).index()))
-	                        .off('keyup change')
-	                        .on('change', function (e) {
-	                            $(this).attr('title', $(this).val());
-	                            var regexr = '({search})'; 
-	                            cursorPosition = this.selectionStart;
-	                            api.column(colIdx)
-	                               .search(   
-	                                    this.value != ''
-	                                        ? regexr.replace('{search}', '(((' + this.value + ')))')	
-	                                        : '',
-	                                    this.value != '',
-	                                    this.value == ''
-	                                )
-	                                .draw();
-	                        })
-	                        .on('keyup', function (e) {
-								e.preventDefault();
-	                            e.stopPropagation();
-	                            $(this).trigger('change');
-	                            $(this)
-	                                .focus()[0]
-	                                .setSelectionRange(cursorPosition, cursorPosition);
-	                        });
-	                });
-	                api.column(0).visible(false);
-	                api.column(1).visible(false);
-	                api.column(5).visible(false);
-	                api.column(6).visible(false);
-	                api.column(7).visible(false);
-	                api.column(8).visible(false);
-	                api.column(9).visible(false);
-	                api.column(10).visible(false);
-	                api.column(11).visible(false);
-	                
-				}
-			});
-		}	
-		
-		function drawGantt(ructAttr){
-			$.get('/dashboard/gantt/'+ructAttr, function(data){
-				data.forEach(function(d){d.id = 'Task '+d.id;});
-				data.at(-1).custom_class += ' gantt-task-last';
-				tasks = data;
-				ganttChart = new Gantt("#gantt", tasks, {
-					on_click: function (task) {
-						window.open("/procedure/"+task.id.replace('Task_', ''));
-					},
-					on_date_change: function(task, start, end) {
-						return false;
-					},
-					on_progress_change: function(task, progress) {
-						return false;
-					},
-					on_view_change: function() {
-						var bars = document.querySelectorAll("#gantt" + " .bar-group");
-						for (var i = 0; i < bars.length; i++) {
-							bars[i].addEventListener("mousedown", stopEvent, true);
-						}
-						var handles = document.querySelectorAll("#gantt" + " .handle-group");
-						for (var i = 0; i < handles.length; i++) {
-							handles[i].remove();
-						}
-					},
-					bar_height: 20, 
-					bar_corner_radius: 10, 
-					arrow_curve: 10, 
-					padding: 15,
-					view_mode: "Month",
-					date_format: "YYYY-MM-DD",
-					language: locale,
-					draggable: false, 
-		            hasArrows: false,
-		            highlight_weekend: false,
-		            readonly: true,
-		            popup: function(task) {
-		                return `
-		                  <div class="details-container">
-		                    <h6>${task.name}</h6>
-		                    <p>${task._start.toLocaleDateString()} - ${task._end.toLocaleDateString()}</p>
-		                  </div>
-		                `;
-		        	},
-				});
-				ganttChart.change_view_mode("Month");
-				$('.today-button').trigger('click');
-				$('.gantt-task-last').get(0).scrollIntoView({
-				            behavior: 'auto',
-				            block: 'center',
-				            inline: 'center'
-				        });
-				$(window).scrollTop(0);
-			});
-		}
-		
-		function getGraphData(){
-			$.get('/dashboard/graphs/inds/'+ruct+'/'+$('.data-selector-orig').val(), function(data){
-				$('.chart-inds').html('');
-				$('.data-inds').html('');
-				createDataTables();
-				inds.filter(d => d.estudi.toLowerCase() == $('.data-selector-orig').val().toLowerCase()).forEach(function(o){
-					var datasets = [], labels = [];
-					var vals = data.filter(d => d.dimension+'_'+d.indicador === o.idGrafica);
-					if(vals.length < 1){ console.log(o.idGrafica); return; }
-					createChartCanvas(o);
-					vals.forEach(function(v){
-						var values = [];
-						v.valores.forEach(function(v, k){
-							values.push(v.valor);
-							labels.push(v.curso);
-						});
-						if(v.ambit === 'C'){
-							datasets.push({
-						        label: locale == 'es' ? 'Centro' : 'Centre',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(154,240,41,1)",
-						        backgroundColor: "rgba(154,240,41,0.5)",
-							});
-							drawTr(o, values.at(-1), values.at(-2));
-						}
-						if(v.ambit === 'U'){
-							datasets.push({
-						        label: locale == 'es' ? 'Universidad' : 'Universitat',
-						        data: values,
-						        borderWidth: 1.2,
-						        lineTension: 0.6,
-						        borderColor: "rgba(255,0,0,1)",
-						        backgroundColor: "rgba(240,41,67,0.5)",
-							});
-						}
-					});
-					labels = Array.from(new Set(labels)).sort();
-					drawChart(o, datasets, labels);
-					$('.data-selector-group').val(2).trigger('change');
-				});			
-			});
-		}
-		
-		function createChartCanvas(i){
-			 $(`.chart-inds-${i.g}`).append(`<div class="col-lg-4 chart-container"> 
-						     			   	     <canvas id="chart_${i.idGrafica}"></canvas>	    
-						             	     </div>`);
-		}
-				
-		function createDataTables(){
-			$('.data-inds').html('');
-			$('.data-inds').each(function(idx){
-				var i = $(this).attr('data-id');
-				var group = inds.filter(d => d.estudi.toLowerCase() == $('.data-selector-orig').val().toLowerCase()).filter(o => o.g == i);
-				var trs = '';
-				group.forEach(function(g){
-					trs += `<tr id="tr_${g.idGrafica}"></tr>`; 
-				});
-				$(this).html(`<table class="tableizer-table" style="width:100%;">
-					<thead>
-						<tr class="tableizer-firstrow">
-							<th></th>
-							<th style="width:50px;text-align: center;">Actual</th>
-							<th style="width:50px;text-align: center;">Anterior</th>
-							<th style="width:50px;text-align: center;">Desv.</th>
-						</tr>
-					 </thead>
-					 <tbody>
-						 ${trs}
-					</tbody>
-                </table>`);	
-			});
-		}
-		
-		function drawTr(obj, value1, value2){
-			var color = (value2 == undefined) ? 'black' : value1 - value2 < 0 ? 'red' : 'green';
-			if(obj.negate){
-				color = (color == 'black') ? color : value1 - value2 > 0 ? 'red' : 'green';
-			}
-			$('#tr_'+obj.idGrafica).html(`<td>${locale == 'es' ? obj.nomCas : obj.nomVal}</td>
-							   <td>${parseFloat(value1).toFixed(2)}${obj.unitats}</td>
-							   <td>${value2 == undefined ? '---' : parseFloat(value2).toFixed(2)+obj.unitats}</td>
-							   <td style="color:${color}">${value2 == undefined ? '---' : (value1 - value2).toFixed(2)+obj.unitats}</td>`);
-		}
-		
-		function drawChart(obj, values, labels){
-			if(typeof Chart.getChart('chart_'+obj.idGrafica) !== 'undefined'){
-				Chart.getChart('chart_'+obj.idGrafica).destroy();
-			}
-			const ctx = document.getElementById('chart_'+obj.idGrafica);
-			var callback;
-			if(obj.unitats == '%'){
-				callback = function(value, index, values){return value + " %";};
-			}
-			else{
-				callback = function(value, index, values){return value;};
-			}
-			new Chart(ctx, {
-			    type: 'line',
-			    data: {
-			      labels: labels,
-			      datasets: values
-			    },
-			    options: {
-			    	responsive: true,
-			        maintainAspectRatio: false,
-			    	plugins: {
-			    		title: {
-			                display: true,
-			                text: locale == 'es' ? obj.nomCas : obj.nomVal
-			            },
-			            legend: {
-			                display: false
-			            },
-			            labels: {
-			                render: () => {}
-			            }
-			        },
-					scales: {
-					  y: {
-						max: obj.likert ? 5 : null,
-						min: 0,
-					    beginAtZero: true,
-					    ticks: {
-					    	beginAtZero: true,
-					    	autoSkip: !obj.likert,
-					    	stepSize: obj.likert ? 1 : null,
-					    	stepValue: obj.likert ? 1 : null,
-					    	callback: callback
-					    },
-					    grid: {
-					        drawBorder: true
-					    },
-					    gridLines: {
-					        display: true,
-					        color: "rgba(255,99,132,0.2)"
-					      },
-					    stacked: false,
-					  }
-					}
-			    }
-			  });
-		}
-		
-		function getChildCats(){
-			$.get('/dashboard/documents/catsu/'+$(this).val()+'/'+tambit, function(data){
-				$('#documentSelector').html('');
-				data.forEach(function(d){
-					$(`<option value="${d.idCategoria}" data-content="${locale == 'es' ? d.nomCas : d.nomVal}">${locale == 'es' ? d.nomCas : d.nomVal}</option>`)
-					.appendTo($('#documentSelector'));
-				});
-				$('#documentSelector').selectpicker('refresh');
-			});
-		}
-		
-		function toggleDataView(id){
-			$('.data-inds').hide();
-			$('.data-inds-'+id).show();
-			$('.chart-inds').hide();
-			$('.chart-inds-'+id).show();
-		}
-		
-		function changeDataOrig(id){
-			$('option[data-group]').hide();
-			$(`option[data-group*='${id}']`).show();
-			getGraphData();
-		}
-		
-		function stopEvent(event) {
-			event.preventDefault();
-		}
-		
-		function changeGanttOrigin(){
-			ganttChart.clear();
-			$('.gantt-container').parent().html('<svg id="gantt"></svg>')
-			drawGantt($('#ganttOrigin').val());
-		}
-		
-		function changeReportsOrigin(){
-			treeProcedures.destroy();
-			drawReports($('#reportsOrigin').val());
-		}
-		
-		function drawReports(ructAttr){
-			treeProcedures = $('#treeProcedures').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: '/dashboard/procedures/'+ructAttr
-			});
-		}
-
-	</script>
-
-</body>
-
-</html>

+ 0 - 350
src/main/resources/templates/dataConsolidate.html

@@ -1,350 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">	
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;cursor:auto;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{data.consolide.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{data.consolide.subtitle}"></span>
-					</div>
-				</div>
-				<div class="uv-table-group-procedure row" style="padding:20px;">
-					<select class="selectpicker" name="enquesta" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-				        <option disabled selected th:text="#{data.input.select}">Selecciona un conjunto de datos</option>
-				        <option value="dades_1er">[Grado] Estudiantes primero (dades_1er)</option>
-				        <option value="dades_3er">[Grado] Estudiantes tercero (dades_3er)</option>
-				        <option value="dades_graduats">[Grado] Graduados (dades_graduats)</option>
-				        <option value="profes">[Grado] Profesores (profes)</option>
-				        <option value="data">[Master] Estudiantes (data)</option>
-				        <option value="data_g">[Master] Graduados (data_g)</option>
-				        <option value="profes_tancades">[Master] Profesores (profes_tancades)</option>
-				        <option value="doc_estud">[Doctorado] Estudiantes (doc_estud)</option>
-				        <option value="doc_etesi">[Doctorado] Graduados (doc_etesi)</option>
-				        <option value="doc_prof">[Doctorado] Profesores (doc_prof)</option>
-				        <option value="doc_inds">[Doctorado] Indicadores (doc_inds)</option>
-				        <option value="doc_tasas">[Doctorado] Tasas (doc_tasas)</option>
-				        <option value="doc_recom">[Doctorado] Recomendaciones (doc_recom)</option>
-				        <option value="evalprof">[Evaluación del profesorado] (evalprof)</option>
-				        <option value="dadespas">[PAS] Encuestas PAS (dadespas)</option>
-				        <option value="otros">[Indicadores] Profesorado + Tasas</option>
-						<option value="sprodw">[Indicadores] Indicadores</option>
-				        <option value="docentia">[Docentia] Evaluación Docentia</option>
-				        <option value="enquestes">[SAE/SAEM] Asignaturas para encuestas (enquestes)</option>
-				    </select>
-				    <div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;">
-						<span class="btn btn-primary" onclick="run();"><i class="fas fa-clipboard-check"></i> <span th:text="#{data.btn.check}">Comprobar</span></span>
-					</div>
-				</div>
-				<div id="resultsContainer" class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:auto;">
-					
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-	var locale = '[[${#locale.language}]]';
-	var orderCol1 = [3, 'asc'], orderCol2 = [1, 'asc'];
-	var cursorPosition;
-	var numPending;
-	var tabParams = {
-			paging: true, 
-			language:{
-				"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-	            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-	            "info": "[[#{admin.stats.table.info}]]",
-	            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-	            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-	            "paginate": {
-	                "previous": "[[#{admin.stats.table.previous}]]",
-	                "next": "[[#{admin.stats.table.next}]]"
-	              }
-			},
-			searching: true,
-			order:[orderCol1, orderCol2],
-			orderCellsTop: true,
-			//fixedHeader: true, // Not compatible with android
-			info: false,
-			responsive: false,
-			initComplete: function () {
-				var api = this.api();
-	        	this.api()
-	        	.columns()
-                .eq(0)
-                .each(function (colIdx) {
-                    var cell = $('.filters th').eq(
-                        $(api.column(colIdx).header()).index()
-                    );
-                    var title = $(cell).text();
-                    $(cell).html('<input type="text" placeholder="' + title + '" />');
-                    $('input', $('.filters th').eq($(api.column(colIdx).header()).index()))
-                        .off('keyup change')
-                        .on('change', function (e) {
-                            $(this).attr('title', $(this).val());
-                            var regexr = '({search})'; 
-                            cursorPosition = this.selectionStart;
-                            api.column(colIdx)
-                               .search(   
-                                    this.value != ''
-                                        ? regexr.replace('{search}', '(((' + this.value + ')))')	
-                                        : '',
-                                    this.value != '',
-                                    this.value == ''
-                                )
-                                .draw();
-                        })
-                        .on('keyup', function (e) {
-							e.preventDefault();
-                            e.stopPropagation();
-                            $(this).trigger('change');
-                            $(this)
-                                .focus()[0]
-                                .setSelectionRange(cursorPosition, cursorPosition);
-                        });
-                });
-    		}
-		};
-	
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-		});
-		
-		function showSpinner(){
-			var spinner = `<div class="d-flex justify-content-center">
-								<div class="spinner-border text-primary" role="status" style="font-size: 150%; text-align: center; width: 100px; height: 100px;">
-									<span class="sr-only">Loading...</span>
-								</div>
-							</div>
-						  `;
-			$('#resultsContainer').html(spinner);
-		}
-		
-		function run(){
-			showSpinner();
-			$.post("/data/count", {enquesta:$('select[name="enquesta"]:enabled').val()})
-				.done(function(d){ 
-					if(d == 0){
-						$('#resultsContainer').html(`[INFO] [[#{data.consolide.nodata}]]`);
-					}
-					else{
-						numPending = d;
-						checkDuplicates();
-					}
-				});
-		}
-		
-		function consolidate(){
-			showSpinner();
-			$.post("/data/consolidate", {enquesta:$('select[name="enquesta"]:enabled').val()})
-				.done(function(d){ 
-					if(d == -1){
-						$('#resultsContainer').html(`
-							<div class="uv-table-group-procedure" style="margin-bottom:50px;cursor:default;">
-								<span style="color:red;">[ERROR] </span>
-								<span> 
-									[[#{data.consolide.err3}]]
-								</span>
-							</div>`);
-					}
-					else{
-						$('#resultsContainer').html(`
-							<div class="uv-table-group-procedure" style="margin-bottom:50px;cursor:default;">
-								<span style="color:green;">[INFO] </span><span> [[#{data.consolide.ok}]] </span>
-							</div>`);
-					}
-				});
-		}
-		
-		function checkDuplicates(){
-			$.post("/data/check/1", {enquesta:$('select[name="enquesta"]:enabled').val()})
-				.done(function(data) {					
-					var msgErr = `
-						<div class="uv-table-group-procedure" style="margin-bottom:50px;cursor:default;">
-							<span style="color:red;">[ERROR] </span>
-							<span> 
-								[[#{data.consolide.err1}]] <br>
-								[[#{data.consolide.count}]]: ${numPending}<br> 
-								[[#{data.consolide.tabdesc}]]
-							</span>
-						</div>
-						
-						<div>
-							<p><strong>[[#{data.consolide.actions.info}]]</strong></p>
-							<span class="btn btn-secondary pointer" onclick="fixDuplicationIssues();"><i class="fas fa-cog"></i> [[#{data.consolide.actions.action1}]]</span>
-						</div>
-						`;
-					
-					if(data.length > 0){
-						drawTable(data, msgErr);	
-					}
-					else {
-						checkIntegrity();
-					}
-				}
-			);
-		}
-		
-		function checkIntegrity(){
-			$.post("/data/check/2", {enquesta:$('select[name="enquesta"]:enabled').val()})
-				.done(function(data) {
-					var msgOk = `
-						<div class="uv-table-group-procedure" style="margin-bottom:50px;cursor:default;">
-							<span style="color:green;">[INFO] </span>
-							<span> [[#{data.consolide.noerr}]].</span>
-							<span> [[#{data.consolide.count}]]: ${numPending} </span>
-						</div>
-						<div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:default;">
-							<span class="btn btn-primary" onclick="consolidate();"><i class="fas fa-clone"></i> <span>[[#{data.btn.run}]]</span></span>
-						</div>`;
-					
-					var msgErr = `
-						<div class="uv-table-group-procedure" style="margin-bottom:50px;cursor:default;">
-							<span style="color:red;">[ERROR] </span>
-							<span> 
-								[[#{data.consolide.err2}]] <br>
-								[[#{data.consolide.count}]]: ${numPending}<br> 
-								[[#{data.consolide.tabdesc}]]
-							</span>
-							<div style="margin-top:10px;">
-								<span><strong>[[#{data.consolide.actions.info}]]:</strong></span><br>
-								<span class="btn btn-secondary pointer" onclick="fixIntegrityIssues('current')"><i class="fas fa-cog"></i> [[#{data.consolide.actions.action2}]]</span>
-								<span class="btn btn-secondary pointer" onclick="fixIntegrityIssues('new')"><i class="fas fa-cog"></i> [[#{data.consolide.actions.action3}]]</span>
-							</div>
-						</div>
-						`;
-					
-					if(data.length > 0){
-						drawTable(data, msgErr);	
-					}
-					else {
-						$('#resultsContainer').html(`
-							${msgOk}
-						`);
-					}
-				}
-			);
-		}
-		
-		function drawTable(data, msgErr){
-			var trs = '';
-			data.forEach(function(d){
-				trs += `
-					<tr>
-						<td>${d.curs}</td>
-						<td>${d.titulacio == null ? '' : d.titulacio}</td>
-						<td>${d.centre == null ? '' : d.centre}</td>
-					    <td>${d.ambit}</td>
-					    <td>${d.tipus}</td>
-					    <td>${d.indicador}</td>
-				  	</tr>
-			`;});
-			
-			if(data.length > 0){
-				$('#resultsContainer').html(`
-						${msgErr}
-						<div class="uv-table-group-procedure" style="cursor:default;">
-							<table class="table table-striped table-bordered display responsive no-wrap" style="margin-bottom:50px;">
-								<thead>
-									<tr>
-										<th class="uv-table">[[#{data.table.0}]]</th>
-										<th class="uv-table">[[#{data.table.1}]]</th>
-									  	<th class="uv-table">[[#{data.table.2}]]</th>
-									  	<th class="uv-table">[[#{data.table.3}]]</th>
-									  	<th class="uv-table">[[#{data.table.4}]]</th>
-									  	<th class="uv-table">[[#{data.table.5}]]</th>
-									</tr>
-								</thead>
-								<tbody>
-								  ${trs}
-								</tbody>
-							</table>
-						</div>
-				`);
-			}
-			else{
-				$('#resultsContainer').html(`
-					${msgOk}
-				`);
-			}
-			
-			$('.table thead tr').clone(true)
-						        .addClass('filters')
-						        .appendTo('.table thead');
-			
-			$('.table').DataTable({
-				searching: tabParams.searching, 
-				paging: tabParams.paging, 
-				orderCellsTop: tabParams.orderCellsTop,
-				// fixedHeader: tabParams.fixedHeader,  // Not compatible with Android
-				info: tabParams.info,
-		        responsive: tabParams.responsive,
-		        order: tabParams.order,
-		        "language": ((!("language" in tabParams)) ? { "emptyTable": this.emptyMsg } : tabParams.language),
-		        initComplete: tabParams.initComplete
-			});
-		}
-		
-		function fixIntegrityIssues(deleteFrom){
-			$.post("/data/fix/integrity/"+deleteFrom, {enquesta:$('select[name="enquesta"]:enabled').val()})
-				.done(function(data) {
-					alert("[[#{data.consolide.actions.msg}]]: "+data);
-					checkIntegrity();
-				}
-			);
-		}
-
-		function fixDuplicationIssues(){
-			$.post("/data/fix/duplication", {enquesta:$('select[name="enquesta"]:enabled').val()})
-				.done(function(data) {
-					alert("[[#{data.consolide.actions.msg}]]: "+data);
-					checkIntegrity();
-				}
-			);
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 351
src/main/resources/templates/dataCurrent.html

@@ -1,351 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/jquery/datatables.min.css}" rel="stylesheet"/>
-
-<style>
-	.file-drop-area {
-		position: relative;
-		display: flex;
-		align-items: center;
-		width: 100%;
-		min-width: 100%;
-		max-width: 100%;
-		padding: 25px;
-		border: 1px dashed black;
-		border-radius: 3px;
-		transition: 0.2s;
-	}
-
-	.choose-file-button {
-		flex-shrink: 0;
-		padding: 8px 15px;
-		margin-right: 20px;
-		font-size: 12px;
-		text-transform: uppercase;
-		width: 100%;
-		min-width: 100%;
-		max-width: 100%;
-		text-align: center;
-	}
-
-	.file-message {
-		font-size: small;
-		font-weight: 300;
-		line-height: 1.4;
-		white-space: nowrap;
-		overflow: hidden;
-		text-overflow: ellipsis;
-	}
-
-	.file-input {
-		position: absolute;
-		left: 0;
-		top: 0;
-		height: 100%;
-		width: 100%;
-		cursor: pointer;
-		opacity: 0;
-	}
-
-	.mt-100{
-		margin-top:100px;
-	}
-
-	.dropdown-colvis ~ .dropdown-menu {
-		transform: translate(-100px, 0px);
-	}
-	
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container" style="margin-bottom:50px;">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{data.show.title}"></h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				<div class="uv-table-group-procedure" style="cursor:auto;">
-					<div class="row">
-						<div class="col-6">
-							<label th:text="#{data.input.cen}">Centre(s)</label>
-							<select class="selectpicker" id="centresSelector" name="centre" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${data}" th:if="${item.tlugar == 'C'}" th:text="${#locale.language} == 'es' ? ${item.nomCas2}:${item.nomVal2}" th:attr="value=${item.ruct2}, data-tlugar=${item.tlugar2}, data-parent=${item.ruct2}"></option>
-						    </select>
-						</div>
-						<div class="col-6">
-							<label th:text="#{data.input.tit}">Titulació(ns)</label>
-							<select class="selectpicker" id="titulacionsSelector" name="titulacio" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${data}" th:if="${item.tlugar == 'T'}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.ruct}, data-tlugar=${item.tlugar}, data-parent=${item.ruct2}"></option>
-						    </select>
-						</div>
-					</div>
-					<div class="row" id="dataContainer" style="display:none;padding-right:10px;padding-left:10px;padding-top:25px;"> 
-		            	<div class="col-lg-12">
-		                	<table id="dataTabular" class="table table-striped table-bordered display responsive no-wrap" style="width:100%;position:relative;z-index:0;">
-							    <thead>
-							        <tr>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr1}">Encuesta</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr2}">Indicador</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr3}">Ámbito</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr4}">Estudio</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr5}">Valor</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr6}">Curso</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr7}">CursoD</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr8}">Tipo</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr9}">NºEnq</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr10}">Curso Enq</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr11}">Centro Orig</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr12}">Tit. Orig</th>
-							        	<th class="uv-table" th:text="#{dashboard.data.table.hr13}">RUCT</th>
-										<th class="uv-table" th:text="#{dashboard.data.table.hr14}">Fecha</th>
-							        </tr>
-							    </thead>
-								<tbody></tbody>
-							</table>
-		        		</div>
-		        	</div>
-		        </div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/datatables.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script th:src="@{/js/gijgo/gijgo.min.js}"></script>
-	<script th:src="@{/js/frappe-gantt/frappe-gantt.min.js}"></script>
-	<script th:src="@{/js/chartjs/chart.js}"></script>
-	<script th:src="@{/js/moment.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	
-	<script type="text/javascript">
-
-		var locale = '[[${#locale.language}]]';
-		var orderCol1 = [3, 'asc'], orderCol2 = [1, 'asc'];
-		var cursorPosition;
-		var translator = {dades_1er:'estud1', dades_3er:'estud3', dades_graduats:'gradu', data:'estud', data_g:'gradu',
-						  profes:'profes', profes_tancades:'profes', evalprof:'evalprof', enquestes:'enquestes',
-						  doc_tasas:'doc_tasas', doc_prof:'doc_prof', doc_inds:'doc_inds', doc_recom:'doc_recom', doc_etesi:'doc_egres',
-						  doc_estud:'doc_estud', dadespas:'PTGAS', docentia:'docentia', sprodw:'sprodw', otros:'otros'};
-		var currYear = new Date().getFullYear();
-		var datatable = null;
-
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-			$('#centresSelector').val('').trigger('change');
-			$('#centresSelector').change(completeTitulacions);
-			$('#titulacionsSelector').val('').trigger('change');
-			$('#titulacionsSelector').change(updateDataTable);
-			
-			initDataTable();
-						
-		});
-				
-		function showSpinner(){
-			$('#uv-content-wrapper').append('<div class="uv-loading-spinner" th:text="#{global.loading}"></div>');
-		}
-		
-		function closeSpinner(){
-			$('.uv-loading-spinner').remove();
-		}
-		
-		function updateDataTable(){
-			console.log('update');
-			showSpinner();
-			$.get(`/data/current/show/${$('#titulacionsSelector').val()}/${$('#dataSelectedCurs').val()}`, function(data){
-				var dataArr = [];
-				data.forEach(function(d){
-					dataArr.push([translator[d.enquesta],
-							   d.indicador,
-							   d.ambit,
-							   d.estudi,
-							   d.valor === null ? '' : d.valor,
-							   d.curs === null ? '' : d.curs,
-							   d.cursd === null ? '' : d.cursd,
-							   d.tipus === null ? '' : d.tipus,
-							   d.nenq === null ? '' : d.nenq,
-							   d.cursEnquesta === null ? '' : d.cursEnquesta,
-							   d.centreOrigen === null ? '' : d.centreOrigen,
-							   d.titulacioOrigen === null ? '' : d.titulacioOrigen,
-							   d.ruct === null ? '' : d.ruct,
-							   d.data === null ? '' : d.data]);
-				});
-				$('#dataContainer').show();
-				datatable.clear();
-				datatable.rows.add(dataArr).draw();
-				closeSpinner();
-			});
-		}
-		
-		function initDataTable(){
-			
-			$('#dataTabular thead tr')
-		        .clone(true)
-		        .addClass('filters')
-				.addClass('dataFilters')
-		        .appendTo('#dataTabular thead');
-	
-			datatable = $('#dataTabular').DataTable({
-				paging: true, 
-				buttons: [
-					{
-						extend: "pageLength",
-					},
-					{
-						text: `[[#{dashboard.data.table.btn1}]]: <input id="dataSelectedCurs" type="number" value="${currYear}" style="width: 75px;">`,
-						action: function (e, dt, node, config) {
-							updateDataTable();
-						}
-					},
-					{
-						extend: 'excelHtml5',
-						text: '<span><i class="fas fa-file-excel"></i></span>',
-						titleAttr: '[[#{dashboard.data.table.btn2}]]',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'csvHtml5',
-						text: '<span><i class="fas fa-file-csv"></i></span>',
-						titleAttr: '[[#{dashboard.data.table.btn3}]]',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'pdfHtml5',
-						text: '<span><i class="fas fa-file-pdf"></i></span>',
-						titleAttr: '[[#{dashboard.data.table.btn4}]]',
-						title: 'ListadoTitulaciones',
-						exportOptions: {
-							columns: ':visible'
-						}
-					},
-					{
-						extend: 'colvis',
-						text: '<span><i class="fas fa-eye"></i></span>',
-						className: 'dropdown-menu-right dropdown-colvis',
-						titleAttr: '[[#{dashboard.data.table.btn5}]]'
-					}
-				],
-				layout: {
-					topStart: null,
-			        topEnd: 'buttons',
-			    },
-				"language":{
-					"lengthMenu": "_MENU_", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		            },
-					"buttons": {
-						"pageLength": "%d [[#{admin.stats.table.lengthMenu}]]"
-					}
-				},
-				bAutoWidth: false, 
-				searching: true,
-				order:[ [0, 'asc'], [1, 'asc'] ],
-				orderCellsTop: true,
-				//fixedHeader: true, // Not compatible with android
-				info: false,
-				responsive: false,
-				scrollX: true,
-				lengthMenu: [10, 25, 50, 100, { label: 'All', value: -1 }],
-				initComplete: function () {
-					var api = this.api();
-		        	this.api()
-		        	.columns()
-		            .eq(0)
-		            .each(function (colIdx) {
-		                var cell = $('.filters.dataFilters th').eq(
-		                    $(api.column(colIdx).header()).index()
-		                );
-		                var title = $(cell).text();
-		                $(cell).html('<input type="text" placeholder="' + title + '" />');
-		                $('input', $('.filters.dataFilters th').eq($(api.column(colIdx).header()).index()))
-		                    .off('keyup change')
-		                    .on('change', function (e) {
-		                        $(this).attr('title', $(this).val());
-		                        var regexr = '({search})'; 
-		                        cursorPosition = this.selectionStart;
-		                        api.column(colIdx)
-		                           .search(   
-		                                this.value != ''
-		                                    ? regexr.replace('{search}', '(((' + this.value + ')))')	
-		                                    : '',
-		                                this.value != '',
-		                                this.value == ''
-		                            )
-		                            .draw();
-		                    })
-		                    .on('keyup', function (e) {
-								e.preventDefault();
-		                        e.stopPropagation();
-		                        $(this).trigger('change');
-		                        $(this)
-		                            .focus()[0]
-		                            .setSelectionRange(cursorPosition, cursorPosition);
-		                    });
-		            });
-		            api.column(5).visible(false);
-		            api.column(6).visible(false);
-		            api.column(7).visible(false);
-		            api.column(8).visible(false);
-		            api.column(9).visible(false);
-		            api.column(10).visible(false);
-		            api.column(11).visible(false);
-		            api.column(12).visible(false);
-					api.column(13).visible(false);
-		            closeSpinner();
-				}
-			});
-				
-		}
-		
-		function completeTitulacions(){
-			$('#titulacionsSelector option').hide();
-			$('#titulacionsSelector').selectpicker('refresh');
-			$('#titulacionsSelector option[data-parent="'+$('#centresSelector').val()+'"]').show();
-			$('#titulacionsSelector').selectpicker('refresh');
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 602
src/main/resources/templates/dataImport.html

@@ -1,602 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<style>
-      .file-drop-area {
-        position: relative;
-        display: flex;
-        align-items: center;
-        width: 100%;
-        min-width: 100%;
-        max-width: 100%;
-        padding: 25px;
-        border: 1px dashed black;
-        border-radius: 3px;
-        transition: 0.2s;
-
-      }
-
-      .choose-file-button {
-        flex-shrink: 0;
-        padding: 8px 15px;
-        margin-right: 20px;
-        font-size: 12px;
-        text-transform: uppercase;
-        width: 100%;
-        min-width: 100%;
-        max-width: 100%;
-        text-align: center;
-      }
-
-      .file-message {
-        font-size: small;
-        font-weight: 300;
-        line-height: 1.4;
-        white-space: nowrap;
-        overflow: hidden;
-        text-overflow: ellipsis;
-      }
-
-      .file-input {
-        position: absolute;
-        left: 0;
-        top: 0;
-        height: 100%;
-        width: 100%;
-        cursor: pointer;
-        opacity: 0;
-
-      }
-
-      .mt-100{
-          margin-top:100px;
-      }
-	
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{data.import.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{data.import.subtitle}"></span><br>
-					</div>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="/data/import">
-					<div class="uv-table-group-procedure row" style="padding:20px;cursor:auto;">
-						<div class="col-12 row">
-							<div class="col-5" id="databaseContainer">
-								<label th:text="#{data.input.source}">Origen</label>
-								<select class="selectpicker" id="databaseSelector" name="database" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-							        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-							        <option value="grado">Encuestas Grado</option>
-							        <option value="master">Encuestas Máster</option>
-							        <option value="doctorado">Encuestas Doctorado</option>
-							        <option value="pas">Encuestas PAS</option>
-							        <option value="evalprof">Encuestas Evaluación Profesorado</option>
-							        <option value="otros">Indicadores</option>
-							    </select>
-							</div>
-							<div class="col-5">
-								<label th:text="#{data.input.survey}">Encuesta</label>
-								<div class="subselect" id="gradoSelector">
-									<select class="form-control" name="enquesta" required style="cursor:pointer;">
-								        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-								        <option value="dades_1er">Estudiantes primero</option>
-								        <option value="dades_3er">Estudiantes tercero</option>
-								        <option value="dades_graduats">Graduados</option>
-								        <option value="profes">Profesores</option>
-								    </select>
-								</div>
-								<div class="subselect" id="masterSelector">
-								    <select class="form-control" name="enquesta" required style="cursor:pointer;">
-								        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-								        <option value="data">Estudiantes</option>
-								        <option value="data_g">Graduados</option>
-								        <option value="profes_tancades">Profesores</option>
-								    </select>
-								</div>
-								<div class="subselect" id="doctoradoSelector">
-								    <select class="form-control" name="enquesta" required style="cursor:pointer;">
-								        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-								        <option value="doc_estud">Estudiantes</option>
-								        <option value="doc_etesi">Graduados</option>
-								        <option value="doc_prof">Profesores</option>
-								        <option value="doc_tasas">Tasas</option>
-								        <option value="doc_inds">Indicadores</option>
-								        <option value="doc_recom">Recomendaciones</option>
-								    </select>
-								</div>
-								<div class="subselect" id="evalprofSelector">
-								    <select class="form-control" name="enquesta" required style="cursor:pointer;">
-								        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-								        <option value="evalprof">Evaluación del profesorado</option>
-								    </select>
-								</div>
-								<div class="subselect" id="otrosSelector">
-								    <select class="form-control" name="enquesta" required style="cursor:pointer;">
-								        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-								        <option value="otros">Profesorado + Tasas</option>
-								        <option value="docentia">Docentia</option>
-								        <option value="enquestes">Encuestas (SAE/SAEM)</option>
-										<option value="sprodw">Indicadores</option>
-								    </select>
-								</div>
-								<div class="subselect" id="pasSelector">
-								    <select class="form-control" name="enquesta" required style="cursor:pointer;">
-								        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-								        <option value="dadespas">PAS</option>
-								    </select>
-								</div>
-							</div>
-							<div class="col-2">
-								<label th:text="#{data.input.year}">Curso</label>
-								<input class="form-control" type="number" value="" name="curs">
-								<small class="importType importType-db" th:text="#{data.import.note4}">* Solo para consultar</small>
-							</div>
-						</div>
-						<div class="col-12 row" style="margin-top:20px;">
-							<div class="col-4">
-								<label th:text="#{data.input.scope}">Ámbito</label>
-								<select class="form-control" name="ambit" required style="cursor:pointer;">
-							        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-							        <option value="T" th:text="#{data.input.scope.t}">Titulación</option>
-							        <option value="C" th:text="#{data.input.scope.c}">Centro</option>
-							        <option value="U" th:text="#{data.input.scope.u}">Universidad</option>
-								</select>
-							</div>
-							<div class="col-4">
-								<label th:text="#{data.input.type}">Tipo Titulación</label>
-								<select class="form-control" name="estudi" required style="cursor:pointer;">
-							        <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-							        <option value="g" th:text="#{data.input.type.g}">Grado</option>
-							        <option value="m" th:text="#{data.input.type.m}">Máster</option>
-							        <option value="d" th:text="#{data.input.type.d}">Doctorado</option>
-							        <option value="u" th:text="#{data.input.type.u}">Global</option>
-								</select>
-							</div>
-							<div class="col-4">
-								<label th:text="#{data.input.importType}">Tipo de importación</label>
-								<select class="selectpicker" id="importTypeSelector" name="tipus" data-live-search="false" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-									<option value="file" th:text="#{data.input.importType.file}" selected>Fichero CSV</option>
-									<option value="db" th:text="#{data.input.importType.db}">Base de datos</option>
-								</select>
-								<small th:text="#{data.import.note3}">* Solo para importar</small>
-							</div>
-						</div>
-
-						<div class="col-12 row" style="margin-top:20px;"></div>
-							<div class="col-2 importType importType-db">
-								<label th:text="'DB Origen'">DB origen</label>
-								<select class="form-control" name="dbOrigen" required style="cursor:pointer;">
-									<option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-									<option th:each="i : ${sources}" th:value="${i.id}" th:text="${i.nom}">
-								</select>
-								<small th:text="#{data.import.note3}">* Solo para importar</small>
-							</div>
-							<div class="col-4 importType importType-db">
-								<label th:text="#{data.input.view}">Nombre de la vista a importar</label>
-								<input class="form-control" type="text" value="" name="vista">
-								<small th:text="#{data.import.note3}">* Solo para importar</small>
-							</div>
-							<div class="col-2 importType importType-file">
-								<label th:text="#{data.input.delim}">Delimitador</label>
-								<select class="selectpicker" id="delimSelector" name="delim" data-live-search="false" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required onchange="fileLoaded();">
-									<option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-									<option value=";">Punto y coma [ ; ]</option>
-									<option value=",">Coma [ , ]</option>
-									<option value="\t">Tabulador [ \t ]</option>
-								</select>
-								<small th:text="#{data.import.note3}">* Solo para importar</small>
-							</div>
-							<div class="col-2">
-								<label th:text="#{data.input.key}">Clave</label>
-								<select class="form-control" name="clau" required style="cursor:pointer;">
-									<option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
-									<option value="ruct">RUCT</option>
-									<option value="cod">Cod. Intern</option>
-								</select>
-								<small th:text="#{data.import.note3}">* Solo para importar</small>
-							</div>
-							<div class="col-2 importType importType-db">
-								<label th:text="#{data.input.dstyear}">Curso a imputar</label>
-								<input class="form-control" type="text" value="" name="dstCurs">
-								<small th:text="#{data.import.note3}">* Solo para importar</small>
-							</div>
-						</div>
-
-						<div class="col-12 row importType importType-file" style="margin-top:20px;">
-							<div class="tab-pane fade show active tab_item" style="width: 100%;min-width: 100%;max-width: 100%;">
-					            <div class="file-drop-area">
-					              <span class="filename choose-file-button" th:text="#{data.input.file}">Selecciona o suelta aquí el archivo CSV</span>
-					              <input class="file-input" type="file" name="file" id="filecsv">
-					            </div>
-					        </div>
-				        </div>
-				        <div>
-					        * <small th:text="#{data.import.note1}"> El fichero debe de contener las columnas "titulacio", "centre" y "tipus".</small>
-					        <br/>
-					        ** <small th:text="#{data.import.note2}"> Las columnas "titulacio" y "centre" deben de ser numéricas. La columna "tipus" puede ser "avg", "min" o "max".</small>
-				        </div>
-					</div>
-					<div id="fileInfoContainer" class="uv-table-group-procedure" style="padding-left:20px;cursor:auto;">
-					
-					</div>
-					<div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:auto;">
-						<span id="btn-checkConn" class="btn btn-primary pointer" onclick="listTableColumns();"><i class="fas fa-plug"></i> <span th:text="#{data.btn.connect}">Comprobar conexión</span></span>
-						<button id="btn-import" class="btn btn-primary pointer" type="submit" value="Importar"><i class="fas fa-upload"></i> <span th:text="#{data.btn.import}">Importar</span></button>
-						<span class="btn btn-info pointer" onclick="showData();"><i class="fas fa-eye"></i> <span th:text="#{data.btn.show}">Ver</span></span>
-						<!-- <span class="btn btn-success pointer" onclick="checkData();"><i class="fas fa-clipboard-check"></i> <span th:text="#{data.btn.check}">Comprobar</span></span>  -->
-						<span class="btn btn-danger pointer" onclick="removeData();" style="float:right;margin-right:30px;"><i class="fas fa-trash"></i> <span th:text="#{data.btn.delete}">Eliminar</span></span>
-					</div>
-				</form>
-				<div id="resultsContainer" class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:auto;">
-					
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-		var locale = '[[${#locale.language}]]';
-		var orderCol1 = [3, 'asc'], orderCol2 = [1, 'asc'];
-		var cursorPosition;
-		var reader = new FileReader();
-		var tabParams = {
-				paging: true, 
-				language:{
-					"lengthMenu": "[[#{admin.stats.table.lengthMenu}]]", 
-		            "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
-		            "info": "[[#{admin.stats.table.info}]]",
-		            "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
-		            "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
-		            "paginate": {
-		                "previous": "[[#{admin.stats.table.previous}]]",
-		                "next": "[[#{admin.stats.table.next}]]"
-		            }
-				},
-				searching: true,
-				order:[orderCol1, orderCol2],
-				orderCellsTop: true,
-				//fixedHeader: true, // Not compatible with android
-				info: false,
-				scrollX: true,
-				responsive: false,
-				initComplete: function () {
-					var api = this.api();
-		        	this.api()
-		        	.columns()
-	                .eq(0)
-	                .each(function (colIdx) {
-	                    var cell = $('.filters th').eq(
-	                        $(api.column(colIdx).header()).index()
-	                    );
-	                    var title = $(cell).text();
-	                    $(cell).html('<input type="text" placeholder="' + title + '" />');
-	                    $('input', $('.filters th').eq($(api.column(colIdx).header()).index()))
-	                        .off('keyup change')
-	                        .on('change', function (e) {
-	                            $(this).attr('title', $(this).val());
-	                            var regexr = '({search})'; 
-	                            cursorPosition = this.selectionStart;
-	                            api.column(colIdx)
-	                               .search(   
-	                                    this.value != ''
-	                                        ? regexr.replace('{search}', '(((' + this.value + ')))')	
-	                                        : '',
-	                                    this.value != '',
-	                                    this.value == ''
-	                                )
-	                                .draw();
-	                        })
-	                        .on('keyup', function (e) {
-								e.preventDefault();
-	                            e.stopPropagation();
-	                            $(this).trigger('change');
-	                            $(this)
-	                                .focus()[0]
-	                                .setSelectionRange(cursorPosition, cursorPosition);
-	                        });
-	                });
-		        	$('.table').DataTable().draw();
-	    		}
-			};
-	
-		
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('.subselect').hide();
-			$('#btn-checkConn').hide();
-			$('.subselect  > select').attr('disabled', true);
-			
-			$('#databaseSelector').change(function(){
-				$('.subselect').hide();
-				$('.subselect > select').attr('disabled', true);
-				$('#'+$(this).val()+'Selector  > select').attr('disabled', false);
-				$('#'+$(this).val()+'Selector').show();
-			});
-
-			$('#importTypeSelector').change(function(){
-				$('.importType').hide();
-				$('.importType-'+$(this).val()).show();
-				if($(this).val() == 'file'){
-					$('#btn-import').attr('disabled', false);
-					$('#btn-checkConn').hide();
-				}
-				else{
-					$('#btn-import').attr('disabled', true);
-					$('#btn-checkConn').show();
-				}
-			});
-
-			$('#importTypeSelector').trigger('change');
-			
-			reader.addEventListener("loadend", fileLoaded);
-			
-			$("#filecsv").change(function(){
-				$(".filename").text(this.files[0].name);
-				reader.readAsText(document.getElementById('filecsv').files[0]);
-			});
-			
-			
-			$("form").submit(function (event) {
-				event.preventDefault();
-				event.stopPropagation();
-				if($('#importTypeSelector').val() == 'file'){
-					if($('#filecsv').val().trim().length == 0 ||
-						$('select[name="database"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="enquesta"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="delim"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="ambit"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="estudi"] option:not([disabled]):selected').length == 0){
-							alert("Falta rellenar campos obligatorios");
-							hideSpinner();
-							return false;
-					}
-				}
-				else{ 
-					if($('select[name="database"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="enquesta"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="ambit"] option:not([disabled]):selected').length == 0 ||
-						$('select[name="estudi"] option:not([disabled]):selected').length == 0 || 
-						$('select[name="dbOrigen"] option:not([disabled]):selected').length == 0 ||
-						$('input[name="curs"]').val().length == 0 ||
-						$('input[name="vista"]').val().length == 0){
-							alert("Falta rellenar campos obligatorios");
-							hideSpinner();
-							return false;
-					}
-				}
-				showSpinner();
-				var ignoredColumns = [];
-				$("input:checkbox:not(:checked)").each(function(i){
-					ignoredColumns.push($(this).val());
-				});
-				var data = new FormData(this);
-				data.append('ignoredColumns', ignoredColumns);
-				$.ajax({
-					type: "POST",
-					enctype: 'multipart/form-data',
-					contentType: false,
-					url: $(this).attr('action'),
-					processData: false,
-					cache: false,
-					data: data,
-				})
-				.done(function (d) {
-					console.log(d);
-					var t = d.replace(/\[INFO\]/g, '<span style="color:green;">[INFO]</span>')
-							 .replace(/\[ERROR\]/g, '<span style="color:red;">[ERROR]</span>')
-							 .replace(/\[WARNING\]/g, '<span style="color:orange;">[WARNING]</span>');
-					$('#resultsContainer').html(t);
-					window.scrollTo(0, document.body.scrollHeight);
-				})
-				.fail( function(xhr, textStatus, errorThrown) {
-					$('#resultsContainer').html('<span style="color:red;">[ERROR] Se ha producido un error en la importación.</span>');
-					window.scrollTo(0, document.body.scrollHeight);
-				});
-			});
-			
-		});
-		
-		function fileLoaded(){
-			if(reader.result == null){
-				return false;
-			}
-			var header = reader.result.split('\n')[0];
-			var colsArr = header.split($('select[name="delim"]').val());
-			var cols = '[[#{data.import.note5}]] <br> <div class="row">';
-			colsArr.forEach(function(d){
-				var v = d.replaceAll('"', '');
-				cols += `<div class="col-3" style="text-align:left;">
-						 	<input type="checkbox" checked name="filecolumns" value="${v}"/> ${v}
-						 </div>`;
-			});
-			$('#fileInfoContainer').html(cols);
-		}
-		
-		function removeData(){
-			showSpinner();	
-			$.post("/data/delete", {enquesta:$('select[name="enquesta"]:enabled').val(), 
-								    curs:$('input[name="curs"]').val(), 
-								    ambit:$('select[name="ambit"]').val(), 
-								    estudi:$('select[name="estudi"]').val()})
-				.done(function(d) {
-					var t = d.replace('[INFO]', '<span style="color:green;">[INFO]</span>')
-	    			 .replace('[ERROR]', '<span style="color:red;">[ERROR]</span>')
-	    			 .replace('[WARNING]', '<span style="color:orange;">[WARNING]</span>');
-	    			$('#resultsContainer').html(t);
-	    			window.scrollTo(0, document.body.scrollHeight);
-				}
-			);
-		}
-		
-		function showSpinner(){
-			var spinner = `<div class="d-flex justify-content-center" style="position:fixed;z-index:9999;top:0;left:0;right:0;bottom:0;margin:auto;width:100%;height:100%;background:rgba(0,0,0,0.25);align-items: center;justify-content:center;">
-								<div class="spinner-border text-primary" role="status" style="font-size:150%;text-align:center;width:100px;height:100px;display:flex;margin:0 auto;">
-									<span class="sr-only">Loading...</span>
-								</div>
-							</div>
-						  `;
-			$('#resultsContainer').html(spinner);
-		}
-
-		function hideSpinner(){
-			$('#resultsContainer').html('');
-		}
-
-		function listTableColumns(){
-
-			if($('select[name="database"] option:not([disabled]):selected').length == 0 ||
-				$('select[name="enquesta"] option:not([disabled]):selected').length == 0 ||
-				$('select[name="ambit"] option:not([disabled]):selected').length == 0 ||
-				$('select[name="estudi"] option:not([disabled]):selected').length == 0 || 
-				$('select[name="dbOrigen"] option:not([disabled]):selected').length == 0 ||
-				$('input[name="curs"]').val().length == 0 ||
-				$('input[name="vista"]').val().length == 0){
-					alert("Falta rellenar campos obligatorios");
-					hideSpinner();
-					return false;
-			}
-
-			showSpinner();
-			$.post("/data/view/columns", {vista:$('input[name="vista"]').val(), 
-										  dbOrigen:$('select[name="dbOrigen"]').val()})
-				.done(function(data) {
-					console.log(data);
-					if(data.length == 0){
-						$('#btn-import').attr('disabled', true);
-						alert('[[#{data.alert.connect}]]');
-					}
-					else{
-						$('#btn-import').attr('disabled', false);
-						var cols = '[[#{data.import.note5}]] <br> <div class="row">';
-						data.forEach(function(d){
-							var v = d.replaceAll('"', '');
-							cols += `<div class="col-3" style="text-align:left;">
-										<input type="checkbox" checked name="filecolumns" value="${v}"/> ${v}
-									</div>`;
-						});
-						$('#fileInfoContainer').html(cols);
-					}
-					$('#resultsContainer').html('');
-				}
-			);
-		}
-		
-		function showData(){
-			showSpinner();
-			$.post("/data/show", {enquesta:$('select[name="enquesta"]:enabled').val(), 
-								  curs:$('input[name="curs"]').val(), 
-								  ambit:$('select[name="ambit"]').val(), 
-								  estudi:$('select[name="estudi"]').val()})
-				.done(function(data) {
-					var trs = '';
-					data.forEach(function(d){
-						trs += `
-							<tr>
-								<td>${d.titulacio}</td>
-								<td>${d.centre}</td>
-							    <td>${d.ambit}</td>
-							    <td>${d.tipus}</td>
-							    <td>${d.indicador}</td>
-							    <td>${d.valor}</td>
-							    <td>${d.nenq}</td>
-							    <td>${d.titulacioOrigen}</td>
-							    <td>${d.centreOrigen}</td>
-							    <td>${d.ruct}</td>
-							    <td>${d.usuari}</td>
-						  	</tr>
-						`;
-					});
-					
-					$('#resultsContainer').html(`
-							<div class="uv-table-group-procedure" style="margin-bottom:25px;">
-								<table class="table table-striped table-bordered display responsive no-wrap">
-									<thead>
-										<tr>
-											<th class="uv-table">[[#{data.table.1}]]</th>
-										  	<th class="uv-table">[[#{data.table.2}]]</th>
-										  	<th class="uv-table">[[#{data.table.3}]]</th>
-										  	<th class="uv-table">[[#{data.table.4}]]</th>
-										  	<th class="uv-table">[[#{data.table.5}]]</th>
-										  	<th class="uv-table">[[#{data.table.6}]]</th>
-										  	<th class="uv-table">[[#{data.table.7}]]</th>
-										  	<th class="uv-table">[[#{data.table.8}]]</th>
-										  	<th class="uv-table">[[#{data.table.9}]]</th>
-										  	<th class="uv-table">[[#{data.table.10}]]</th>
-										  	<th class="uv-table">[[#{data.table.11}]]</th>
-										</tr>
-									</thead>
-									<tbody>
-									  ${trs}
-									</tbody>
-								</table>
-							</div>
-					`);
-					
-					$('.table thead tr').clone(true)
-								        .addClass('filters')
-								        .appendTo('.table thead');
-					
-					$('.table').DataTable({
-						searching: tabParams.searching, 
-						paging: tabParams.paging, 
-						orderCellsTop: tabParams.orderCellsTop,
-						// fixedHeader: tabParams.fixedHeader, // Not compatible with Android
-						info: tabParams.info,
-				        responsive: tabParams.responsive,
-				        order: tabParams.order,
-				        scrollX: tabParams.scrollX,
-				        "language": ((!("language" in tabParams)) ? { "emptyTable": this.emptyMsg } : tabParams.language),
-				        initComplete: tabParams.initComplete
-					});
-					
-				}
-			);
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 101
src/main/resources/templates/error.html

@@ -1,101 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group">
-					<h5><br></h5>
-				</div>
-				<div class="uv-container-login">			
-					<div class="row">
-						<div class="col">
-							<h4><span th:text="#{global.error.msg.i}"></span> <a href="mailto:saic@uv.es">saic@uv.es</a> <span th:text="#{global.error.msg.f}"></span></h4>
-							<!-- <a th:href="'mailto:saic@uv.es?subject='+${error}+'&body='+${trace}">saic@uv.es</a> -->
-						</div>
-					</div>
-					<div class="row">
-						<div class="col">
-							<br><br>
-							<table>
-							    <tr>
-							        <td>Date:</td>
-							        <td th:text="${timestamp}"/>
-							    </tr>
-							    <tr>
-							        <td>Path:</td>
-							        <td th:text="${path}"/>
-							    </tr>
-							    <tr>
-							        <td>Error:</td>
-							        <td th:text="${error}"/>
-							    </tr>
-							    <tr>
-							        <td>Status:</td>
-							        <td th:text="${status}"/>
-							    </tr>
-							    <tr>
-							        <td>Message:</td>
-							        <td th:text="${message}"/>
-							    </tr>
-							</table>
-						</div>
-				    </div>
-				    <br><br>
-				    <div class="row">
-					    <div class="col justify-content-center align-items-center">
-					    </div>
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-		});
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 49
src/main/resources/templates/home.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		<div class="container uv-home-section" id="uv-content-wrapper">
-			<div class="uv-container">
-
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-  
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/docentia.js}"></script>
-  
-	<script type="text/javascript">
-		function changeLocale(locale){
-	        window.location.replace('?lang=' + locale);
-		}
-		
-		$(function () {
-			$("#uv-wrapper").height($(window).height() - 86);
-		});
-		
-
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 84
src/main/resources/templates/indicators.html

@@ -1,84 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="'Indicadores'"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="'Indicadores'"></span>
-					</div>
-				</div>
-				<div class="uv-table-group-procedure">
-					<span th:each="dim,dim_i : ${dims}">
-						<strong>Dimension: <span th:text="${dim.dimension}"></span></strong><br>
-						<span th:each="ind,ind_i : ${dim.indicadores}">
-							<strong>&nbsp;&nbsp;Indicador: <span th:text="${ind.indicador}"></span></strong><br>
-								<span th:each="sub,sub_i : ${ind.subindicadores}">
-									<strong>&nbsp;&nbsp;&nbsp;&nbsp;Subindicador: <span th:text="${sub.indicador}"></span></strong><br>
-									
-									<span th:each="val,val_i : ${sub.valores}">
-										&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span th:text="${val.curso}"> </span> <span th:text="${val.valor}"></span><br>
-									</span>
-								</span>
-							<span th:each="val,val_i : ${ind.valores}">
-								&nbsp;&nbsp;&nbsp;&nbsp;<span th:text="${val.curso}"> </span> <span th:text="${val.valor}"></span><br>
-							</span>
-						</span>
-						<br>
-					</span>
-				</div>
-			</div>
-		</div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-		
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-		});
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 97
src/main/resources/templates/layouts/common.html

@@ -1,97 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:fragment="head">
-	<meta charset="utf-8">
-	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-	<meta name="description" content="">
-	<meta name="author" content="">
-	<title>SAIC</title>
-	<link rel="shortcut icon" th:href="@{/img/uv-favicon.ico}">
-	<link th:href="@{/css/fa/all.css}" rel="stylesheet">
-	<link th:href="@{/css/bootstrap/bootstrap.min.css}" rel="stylesheet">
-	<link th:href="@{/css/bootstrap/dataTables.bootstrap4.min.css}" rel="stylesheet">
-<!--	<link th:href="@{/css/bootstrap/responsive.dataTables.min.css}" rel="stylesheet">-->
-	<link th:href="@{/css/datepicker/bootstrap-datepicker.standalone.min.css}" rel="stylesheet">
-	<link th:href="@{/css/bootstrap-select/bootstrap-select.min.css}" rel="stylesheet">
-	<link th:href="@{/css/saic.css}" rel="stylesheet">
-	<link th:href="@{/css/iconFont.css}" rel="stylesheet">
-	<link th:href="@{/js/fileinput/css/fileinput.css}" rel="stylesheet"/>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/tinymce2/tinymce.min.js}" referrerpolicy="origin"></script>
-	
-</head>
-
-<body id="page-top">
-	<!-- Navigation -->
-	<nav class="navbar navbar-expand-lg uv-navbar uv-navbar-background fixed-top" id="mainNav" th:fragment="navbar" height="45">
-		<div class="container nav-container uv-navbar-container" style="padding-left:0px;">
-			<div class="uv-navbar-left">
-				<button class="uv-sidebar-toggle" id="uv-sidebar-toggle" type="button" sec:authorize="isAuthenticated()">
-				  <span class="fas fa-bars uv-navbar-toggle" ></span>
-				</button>
-				<span class="uv-navbar-separator" sec:authorize="isAuthenticated()"></span>
-				<a href="/"><img th:src="@{/img/uv-saic-logo.png}" class="uv-navbar-img" height="40"></a>
-			</div>
-		</div>
-	</nav>
-
-	<!-- Content -->
-	<div class="content">
-
-		
-	</div>
-
-	<!-- Footer -->
-	<footer class="uv-footer" th:fragment="footer">
-		<div class="container uv-footer-container">
-			<p class="m-0 text-center text-white uv-footer-text">
-				<i class="far fa-copyright"></i> Universitat de València (Estudi General),  2025. Todos los derechos reservados.
-			</p>
-		</div>
-	</footer>
-	
-	<!-- validateModal -->
-	<div class="modal fade" id="contactModal" tabindex="-1" role="dialog" aria-labelledby="contactModal" aria-hidden="true" th:fragment="contactModal">
-		<div class="modal-dialog" role="document">
-		  <div class="modal-content">
-			<div class="modal-header">
-			  <h5 class="modal-title" id="exampleModalLabel" th:text="#{global.menu.contact.title}">Direcciones de correo electrónico de contacto</h5>
-			  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-				<span aria-hidden="true">&times;</span>
-			  </button>
-			</div>
-			<div class="modal-body">
-				<span class="uv-list-group-bottom-item bg-light">
-					<span th:text="#{global.footer.span1}"></span>: <span> <a href="mailto:unitat.qualitat@uv.es">unitat.qualitat@uv.es</a></span>
-				</span>
-				<br>
-				<span class="uv-list-group-bottom-item bg-light">
-					<span th:text="#{global.footer.span2}"></span>: <span> <a href="mailto:saic@uv.es">saic@uv.es</a></span>
-				</span>
-			</div>
-			<div class="modal-footer">
-			  <button type="button" class="btn btn-secondary" data-dismiss="modal">Cerrar</button>
-			</div>
-		  </div>
-		</div>
-	</div>
-
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-	<script type="text/javascript">
-		function changeLocale(locale){
-	        window.location.replace('?lang=' + locale);
-		}
-	</script>
-
-</body>
-
-</html>

+ 0 - 68
src/main/resources/templates/layouts/sidebar.back.html

@@ -1,68 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-	<div class="bg-light border-right" id="sidebarResponsive" th:fragment="sidebar">
-		<div class="sidebar-heading uv-sidebar-heading" th:text="${#authentication.principal.usuari}" th:attr="title=${#authentication.principal.nom}+' '+${#authentication.principal.cognoms}"></div>
-		<div class="navbar uv-navbar-menu-text" id="navbarResponsive" style="margin-top:-10px;">
-			<ul class="uv-navbar-nav navbar-nav ml-auto" style="flex-direction: row !important;">
-				<li class="nav-item dropright uv-dropright" th:attr="title=#{global.lang}">
-					<a class="nav-link nav-link-black dropdown-toggle"  href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fas fa-globe-africa"></i></a>
-					<div class="dropdown-menu dropdown-menu-right uv-navbar-dropdown" aria-labelledby="navbarDropdown" style="position:absolute !important;">
-						<a class="dropdown-item" href="#" th:text="#{global.lang.va}" onclick="changeLocale('ca')"></a>
-						<a class="dropdown-item" href="#" th:text="#{global.lang.es}" onclick="changeLocale('es')"></a>
-					</div>
-				</li>
-				<li class="uv-navbar-li-separator-black"></li>
-				<li class="nav-item uv-sidebar-nav-item" style="padding-right: .7rem;" th:attr="title=#{global.help}">
-					<a class="nav-link nav-link-black" target="_blank" href="https://www.uv.es/uq"><i class="far fa-question-circle"></i></a>
-				</li>
-				<li class="uv-navbar-li-separator-black"></li>
-				<li class="nav-item uv-sidebar-nav-item" th:attr="title=#{global.exit}">
-					<a href="/logout" class="nav-link nav-link-black"><i class="fas fa-sign-out-alt"> </i></a>
-				</li>
-			</ul>
-		</div>
-		<br>
-		<div class="list-group list-group-flush" style="margin-top:-10px;">
-			<a href="/procedures" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.procedures}"></span>
-			</a>
-			<a href="/supervision" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.supervision}"></span>
-			</a>
-			<a href="/managers" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.managers}"></span>
-			</a>
-		</div>
-		<br>
-		<div class="list-group list-group-flush" th:if="${#authentication.principal.isAdmin()}">
-			<span style="margin-left:10px;"><strong>Administración</strong></span>
-			<a href="/admin/instances" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.admin.instances}"></span>
-			</a>
-			<a href="/admin/procedures" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.admin.procedures}"></span>
-			</a>
-			<a href="/admin/templates" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.admin.templates}"></span>
-			</a>
-			<a href="/admin/mailing" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.admin.mailing}"></span>
-			</a>
-			<a href="/admin/stats" class="list-group-item list-group-item-action bg-light">
-				<span th:text="#{global.menu.admin.stats}"></span>
-			</a>
-		</div>
-		<br>
-		<div class="list-group uv-list-group-bottom list-group-flush">
-			<span class="uv-list-group-item bg-light">
-				<span th:text="#{global.footer.span1}"></span> <span> <a href="mailto:unitat.qualitat@uv.es">unitat.qualitat@uv.es</a></span>
-			</span>
-			<br>
-			<span class="uv-list-group-item bg-light">
-				<span th:text="#{global.footer.span2}"></span> <span> <a href="mailto:saic@uv.es">saic@uv.es</a></span>
-			</span>
-		</div>
-		
-	</div>
-</html>

+ 0 - 69
src/main/resources/templates/layouts/sidebar.html

@@ -1,69 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-	<div class="bg-light border-right" id="sidebarResponsive" th:fragment="sidebar">
-		<div class="sidebar-heading uv-sidebar-heading" th:text="${#authentication.principal.usuari}" th:attr="title=${#authentication.principal.nom}+' '+${#authentication.principal.cognoms}"></div>
-		<div class="navbar uv-navbar-menu-text" id="navbarResponsive" style="margin-top:-10px;">
-			<ul class="uv-navbar-nav navbar-nav ml-auto" style="flex-direction: row !important;">
-				<li class="nav-item dropright uv-dropright" th:attr="title=#{global.lang}">
-					<a class="nav-link nav-link-black dropdown-toggle"  href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fas fa-globe-africa"></i></a>
-					<div class="dropdown-menu dropdown-menu-right uv-navbar-dropdown" aria-labelledby="navbarDropdown" style="position:absolute !important;">
-						<a class="dropdown-item uv-dropdown-item" href="#" th:text="#{global.lang.va}" onclick="changeLocale('ca')"></a>
-						<a class="dropdown-item uv-dropdown-item" href="#" th:text="#{global.lang.es}" onclick="changeLocale('es')"></a>
-					</div>
-				</li>
-				<li class="uv-navbar-li-separator-black"></li>
-				<li class="nav-item uv-sidebar-nav-item" style="padding-right: .7rem;" th:attr="title=#{global.help}">
-					<a class="nav-link nav-link-black" target="_blank" href="https://www.uv.es/uq"><i class="far fa-question-circle"></i></a>
-				</li>
-				<li class="uv-navbar-li-separator-black"></li>
-				<li class="nav-item uv-sidebar-nav-item" th:attr="title=#{global.exit}">
-					<a href="/logout" class="nav-link nav-link-black"><i class="fas fa-sign-out-alt"> </i></a>
-				</li>
-			</ul>
-		</div>
-		<br>
-		<div class="list-group list-group-flush" style="margin-top:-10px;">	 
-			<a href="/dashboard" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.tits}"></a>	 
-			<a href="/procedures" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.procedures}"></a>
-			<a href="/supervision" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.supervision}"></a>
-			<a href="/managers" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.managers}"></a>
-		</div>
-		<br>
-		<div class="list-group list-group-flush" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isDataTest()}">
-			<div class="btn-group dropright">
-				<strong type="button" class="uv-list-group-item list-group-item list-group-item-action bg-light dropdown-toggle" th:text="#{global.menu.data}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-offset="-200">
-					Datos y plantillas
-				</strong>
-				<div class="dropdown-menu">
-					<a href="/data/import" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.data.import}"></a>
-					<a href="/data/current" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.data.data}"></a>
-					<a href="/data/consolidate" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:if="${#authentication.principal.isAdmin()}" th:text="#{global.menu.data.parse}"></a>
-					<a href="/admin/templates" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.data.templates}"></a>
-					<a href="/admin/editor" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.data.editor}"></a>
-			  	</div>
-			</div>
-		</div>
-		<div class="list-group list-group-flush" th:if="${#authentication.principal.isAdmin()}">
-			<div class="btn-group dropright">
-				<strong type="button" class="uv-list-group-item list-group-item list-group-item-action bg-light dropdown-toggle" th:text="#{global.menu.admin}" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-offset="-200">
-					Administración
-				</strong>
-				<div class="dropdown-menu">
-			  		<a href="/admin/instances" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.admin.instances}"></a>
-					<a href="/admin/calendar" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.admin.calendar}"></a>
-					<a href="/admin/procedures" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.admin.procedures}"></a>
-					<a href="/admin/mailing" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.admin.mailing}"></a>
-					<a href="/admin/stats" class="uv-list-group-item list-group-item list-group-item-action bg-light" th:text="#{global.menu.admin.stats}"></a>
-			  	</div>
-			</div>
-		</div>
-		<br>
-		<div class="list-group uv-list-group-bottom list-group-flush" style="text-align:center;">
-			<span class="uv-list-group-bottom-item bg-light">
-				<a href="#" data-toggle="modal" data-target="#contactModal"><i class="far fa-envelope" style="font-size:120%"></i> <span th:text="#{global.menu.contact}">Contacto</span></a>
-			</span>
-			<br>
-		</div>
-	</div>
-</html>

+ 0 - 122
src/main/resources/templates/login.html

@@ -1,122 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content">
-		<section class="container uv-home-section" style="min-width:100%">
-			<div class="uv-container">
-				<div class="uv-container-login">
-					<div class="row">
-						<div class="row uv-login-row">
-							<img class="uv-login-img" th:src="@{/img/uv-chano-gris.png}">
-						</div>
-						<div class="row uv-login-row">
-							<span class="uv-login-title" th:text="#{login.h2}"></span>
-						</div>
-					</div>
-					<div class="row">
-						<div class="row">
-							<form enctype='multipart/form-data' method="POST" action="/login" id="loginForm">
-								<div class="form-group uv-login-form-group">
-									<input type="text" id="username" class="uv-login-input" name="username" th:placeholder="#{login.placeholder.username}">
-								</div>
-								<div class="form-group uv-login-form-group">
-									<input type="password" id="passwd" class="uv-login-input" name="password" th:placeholder="#{login.placeholder.passwd}">
-								</div>
-								<div class="form-group">
-									<input type="submit" class="uv-login-button" th:value="#{login.button}" id="loginButton">
-								</div>
-						    </form>
-					    </div>
-					</div>
-					<div class="row uv-mar-t-20" th:if="${error}">
-						<span class="alert alert-danger alert-dismissible fade show" role="alert">
-							<span th:text="#{login.error}"></span>
-							<button type="button" class="close" data-dismiss="alert" aria-label="Close">
-						    	<span aria-hidden="true">&times;</span>
-						  	</button>
-						</span>
-					</div>
-					<div class="row uv-mar-t-20" th:if="${restricted}">
-						<span class="alert alert-warning alert-dismissible fade show" role="alert">
-							<span th:text="#{login.restricted}"></span>
-							<button type="button" class="close" data-dismiss="alert" aria-label="Close">
-						    	<span aria-hidden="true">&times;</span>
-						  	</button>
-						</span>
-					</div>
-					<div class="row uv-mar-t-20" th:if="${expired}">
-						<span class="alert alert-danger alert-dismissible fade show" role="alert">
-							<span th:text="#{login.expired}"></span>
-							<button type="button" class="close" data-dismiss="alert" aria-label="Close">
-						    	<span aria-hidden="true">&times;</span>
-						  	</button>
-						</span>
-					</div>
-					<div class="row uv-mar-t-20" style="display:none;" id="incompatible">
-
-					</div>
-					<div class="row" style="display:none;">
-						<div class="row uv-notice-container">
-							<div th:each="item : ${notices}">
-								<span th:if="${#locale.language} == 'ca'" th:text="${item.tituloV}"></span> 
-								<span th:if="${#locale.language} == 'es'" th:text="${item.tituloC}"></span> 
-								<br>
-								<span th:if="${#locale.language} == 'ca'" th:utext="${item.textoV}" th:remove="tag"></span>
-								<span th:if="${#locale.language} == 'es'" th:utext="${item.textoC}" th:remove="tag"></span>
-								<br>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
-		</section>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-  
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-  
-	<script type="text/javascript">
-		var ua = window.navigator.userAgent;
-		var isIE = /MSIE|Trident/.test(ua);
-		//var isIE = /MSIE/.test(ua);
-		if ( isIE ) {
-			$('#incompatible').show();
-			$("#loginForm :input").prop("disabled", true);			
-			var span = $(document.createElement('span'));
-			$(span).addClass('alert')
-				.addClass('alert-danger')
-				.addClass('fade')
-				.addClass('show')
-				.attr('role', 'alert')
-				.html("<span>El vostre navegador no és compatible amb aquesta aplicació</span>"
-							+"<br>"
-							+"<span>Recomanem l'ús de Chrome, Firefox o Edge</span>"
-							+"<hr>"
-							+"<span>Su navegador no es compatible con esta aplicación.</span>"
-							+"<br>"
-							+"<span>Recomendamos el uso de Chrome, Firefox o Edge.</span>")
-				.appendTo($('#incompatible'));	  
-		}
-	</script>
-
-</body>
-
-</html>

+ 0 - 108
src/main/resources/templates/mailing.html

@@ -1,108 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org"
-	lang="es">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{managers.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{managers.subtitle}"></span>
-					</div>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="/admin/mailing">
-					<div class="uv-table-group" th:if="${centres != null}">
-						<label th:text="#{admin.mailing.center}">Centre(s)</label>
-						<select class="selectpicker" id="centerSelector" name="centres[]" multiple data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option th:each="item : ${centres}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.id.lugar}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group">
-						<label th:text="#{admin.mailing.role}" th:if="${rols != null}">Rol</label>
-						<select class="selectpicker" id="roleSelector" name="idRol" data-live-search="true" data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${rols}" th:text="${#locale.language} == 'es' ? ${item.descripcioCas}:${item.descripcioVal}" th:attr="value=${item.idRol}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group" th:if="${sent != null}">
-						<br>
-						<span class="alert alert-success uv-admin-instance-success" th:if="${sent}" role="alert">
-							<button type="button" class="close" data-dismiss="alert" aria-label="Close">
-							  <span aria-hidden="true">&times;</span>
-							</button>
-							<span th:text="#{admin.mailing.sent.success}"></span>
-						</span>
-						<span class="alert alert-danger uv-admin-instance-error" th:if="${!sent}" role="alert">
-							<button type="button" class="close" data-dismiss="alert" aria-label="Close">
-							  <span aria-hidden="true">&times;</span>
-							</button>
-							<span th:text="#{admin.mailing.sent.error}"></span>
-						</span>
-						<br>
-					</div>
-					<div class="uv-table-group">
-						<div class="form-group">
-							<label th:text="#{admin.mailing.subject}">Asunto</label>
-							<input class="form-control" name="subject" type="text" value="">
-						</div>
-						<div class="form-group">
-							<label th:text="#{admin.mailing.body}">Mensaje</label>
-							<textarea class="form-control" name="body" rows="10"></textarea>
-						</div>
-					</div>
-					<div class="uv-table-group-procedure" style="margin-top:50px;cursor: auto;">
-						<button type="submit" class="btn btn-primary">Enviar</button>
-					</div>
-				</form>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");	
-			$('#roleSelector').val('').trigger('change');
-		});	
-	</script>
-
-</body>
-
-</html>

+ 0 - 259
src/main/resources/templates/managers.html

@@ -1,259 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{managers.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{managers.subtitle}"></span>
-					</div>
-				</div>
-				<div class="uv-table-group-procedure" th:if="${sup_centres != null}">
-					<label th:text="#{managers.centers}">Centre(s)</label>
-					<select class="selectpicker" id="centersSelector" name="centers[]" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-				        <option th:each="item : ${sup_centres}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.id.lugar}"></option>
-				    </select>
-				</div>
-				<div class="uv-table-group-procedure">
-					<label th:text="#{managers.titulations}" th:if="${sup_titulacions != null}">Titulació(ns)</label>
-					<select class="selectpicker" id="titulationsSelector" name="titulations[]" multiple data-live-search="true" data-width="100%" data-actions-box="true" required>
-				        <option th:each="item : ${sup_titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.id.lugar}"></option>
-				    </select>
-				</div>
-				<div class="uv-table-group-procedure" style="margin-top:50px;cursor: auto;">
-					<button th:text="#{managers.search}" class="btn btn-primary" onclick="search();">Cargar</button>
-				</div>
-				<div class="uv-table-group" th:if="${roleExists != null}" style="margin-top:25px;">
-					<span class="alert alert-warning" th:text="#{admin.managers.exists}"></span>
-				</div>
-				<div class="uv-table-group" style="margin-top:50px;cursor: auto;" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-					<div class="col-sm-12 uv-table-section">
-						<div class="uv-table-header">
-							<hr class="uv-table-header-hr">
-							<br><br>
-							<span class="btn btn-primary pointer" id="btnAddManager" style="float:right; cursor:pointer; margin-top:-45px;" data-toggle="modal" data-target="#newRoleModal" th:text="#{admin.managers.newRole}">Añadir responsable</span>
-						</div>
-					</div>
-				</div>
-				<div class="uv-table-group-procedure" id="results" style="cursor: auto;">
-					<div th:if="${#ctx.containsVariable('results')}">
-						<div th:replace="components/list_managers.html :: results" ></div>
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<div class="modal fade" id="newRoleModal" tabindex="-1" role="dialog" aria-labelledby="newRoleModal" aria-hidden="true" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title" th:text="#{admin.managers.newRole}">Añadir responsable</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="newRoleForm" enctype='multipart/form-data' method="POST" action="/admin/userrole/new" style="margin-top:25px;">
-						<div class="form-group">
-							<label th:text="#{admin.managers.center}">Centre</label>
-							<select class="selectpicker" id="roleCentersSelector" name="centre" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${sup_centres}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.id.lugar}"></option>
-						    </select>
-						</div>
-						<div class="form-group">
-							<label th:text="#{admin.managers.titulation}">Titulació</label>
-							<select class="selectpicker" id="roleTitulationsSelector" name="titulacio" data-live-search="true" data-width="100%" data-actions-box="true">
-						        <option th:each="item : ${sup_titulacions}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.id.lugar}"></option>
-						    </select>
-						</div>
-						<div class="form-group">
-							<label th:text="#{admin.managers.user}">Usuario</label>&nbsp;&nbsp;&nbsp;<span class="pointer" style="color:#007bff;" onclick="newUser();" th:title="#{admin.managers.newUser}"><i id="addUserIcon" class="fas fa-plus"></i></span>
-							<div id="userSelectorContainer">
-								<select class="selectpicker" id="userSelector" name="usuari" data-dropup-auto="false" data-live-search="true" data-width="100%" data-actions-box="true" required>
-							        <option th:each="item : ${users}" th:text="${item.nom}+' '+${item.cognoms}+' ('+${item.email}+')'" th:attr="value=${item.usuari}"></option>
-							    </select>
-						    </div>
-						    <div class="form-group" id="newUserContainer">
-						    	<div class="row">
-							    	<div class="form-group col-6">
-							    		<label  th:text="#{admin.managers.firstname}">Nombre</label>
-							    		<input class="form-control" type="text" value="" name="firstname" id="firstname">
-							    	</div>
-							    	<div class="form-group col-6">
-							    		<label th:text="#{admin.managers.lastname}">Apellidos</label>
-							    		<input class="form-control" type="text" value=""  name="lastname" id="lastname">
-							    	</div>
-							    	<div class="form-group col-6">
-							    		<label th:text="#{admin.managers.user}">Usuario</label>
-							    		<input class="form-control" type="text" value="" name="username" id="username" onkeyup="setEmail();">
-							    	</div>
-							    	<div class="form-group col-6">
-							    		<label  th:text="#{admin.managers.email}">Email</label>
-							    		<input class="form-control" type="email" value="" name="email" id="email"> 
-							    	</div>
-						    	</div>
-						    </div>
-						</div>
-						<div class="form-group">
-							<label th:text="#{admin.managers.role}">Rol</label>
-							<select class="selectpicker" id="roleSelector" name="idRol" data-dropup-auto="false" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option th:each="item : ${roles}" th:text="${#locale.language} == 'es' ? ${item.descripcioCas}:${item.descripcioVal}" th:attr="value=${item.idRol}"></option>
-						    </select>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <button class="btn btn-success" type="submit" form="newRoleForm" th:text="#{global.confirm}">Confirmar</button>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript" th:if="${#ctx.containsVariable('restoreCentres')}" th:inline="javascript">
-		 var selcentres = /*[[${restoreCentres}]]*/ "";
-		 selcentres = selcentres.replace('[', '').replace(']', '').split(',')
-	</script>
-	<script type="text/javascript" th:if="${#ctx.containsVariable('restoreTitulacions')}" th:inline="javascript">
-		 var seltitulacions = /*[[${restoreTitulacions}]]*/ "";
-		 seltitulacions = seltitulacions.replace('[', '').replace(']', '').split(',')
-	</script>
-	
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('#newUserContainer').hide();
-			if($('#centersSelector')){
-				$('#centersSelector').val('').trigger('change');
-				$('#centersSelector').change(complete_titulations);
-			}
-			if (typeof selcentres !== 'undefined') {
-				$('#centersSelector').selectpicker('val', selcentres[0]).trigger('change');
-				delete selcentres;
-			}
-			if (typeof seltitulacions !== 'undefined') {
-				$.post("/ajax/search/managers/titulations", {'center':$('#centersSelector').val()}, function(data) {
-					$("#titulationsSelector")
-					   .html(data)
-					   .selectpicker('refresh')
-					   .val('')
-					   .trigger('change');
-					$('#titulationsSelector').selectpicker('val', seltitulacions.map(String)).trigger('refresh');
-					delete seltitulacions;
-				});
-			}
-			$('#titulationsSelector').on('change', function(){$("#newManagerFields").html('');});
-			$('#roleCentersSelector').val('').trigger('change');
-			$('#roleTitulationsSelector').val('').trigger('change');
-			$('#roleSelector').val('').trigger('change');
-			$('#userSelector').val('').trigger('change');
-			$('#roleCentersSelector').change(complete_rolTitulacions);
-			
-		});
-		
-		function complete_titulations(){
-			$.post("/ajax/search/managers/titulations", {'center':$('#centersSelector').val()}, function(data) {
-				$("#titulationsSelector")
-				   .html(data)
-				   .selectpicker('refresh');
-			});
-		}
-		
-		function complete_rolTitulacions(){
-			$.post("/ajax/search/managers/titulations", {'center':$('#roleCentersSelector').val()}, function(data) {
-				$("#roleTitulationsSelector")
-				   .html(data)
-				   .selectpicker('refresh')
-				   .val('')
-				   .trigger('change');
-			});
-		}
-		
-		function search(){
-			$.post("/managers/search", {'center':$('#centersSelector').val(), 'titulation[]':$('#titulationsSelector').val()}, function(data) {
-				$("#results")
-				   .html(data)
-				   .selectpicker('refresh');
-				$('#btnAddManager').show();
-				$("#newManagerFields").html('');
-				layout.initTableLayout({paging:false});
-			});
-		}
-		
-		function newUser(){
-			if(!$('#newUserContainer').is(":visible")){
-				$('#firstname').val('').attr('required', true);
-				$('#lastname').val('').attr('required', true);
-				$('#username').val('').attr('required', true);
-				$('#email').val('').attr('required', true);
-				$('#newUserContainer').show();
-				$('#userSelector').attr('required', false);
-				$('#userSelectorContainer').hide();
-				$('#addUserIcon').removeClass('fa-plus');
-				$('#addUserIcon').addClass('fa-minus');
-			}
-			else{
-				$('#firstname').val('').attr('required', false);
-				$('#lastname').val('').attr('required', false);
-				$('#username').val('').attr('required', false);
-				$('#email').val('').attr('required', false);
-				$('#newUserContainer').hide();
-				$('#userSelector').attr('required', true);
-				$('#userSelectorContainer').show();
-				$('#addUserIcon').removeClass('fa-minus');
-				$('#addUserIcon').addClass('fa-plus');
-			}	
-		}
-		
-		function setEmail(){
-			$('#email').val($('#username').val()+'@uv.es');
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 257
src/main/resources/templates/parseOptions.html

@@ -1,257 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group">
-					<h5><i class="fas fa-exclamation-triangle" style="color:orange;"></i>&nbsp; ¡No toques nada si no sabes lo que estas haciendo! &nbsp;<i class="fas fa-exclamation-triangle" style="color:orange;"></i></h5> 
-				</div>
-				<div class="uv-table-group-procedure" style="padding-left:20px;padding-top:40px;">
-					<div th:if="${err != null}">
-						<span class="alert alert-warning">Ha habido un error al ejecutar la acción.</span>
-						<br>
-						<br>
-					</div>
-					<div th:if="${ok != null}">
-						<span class="alert alert-success">La acción se ha ejecutado correctamente, <span th:text="${ok}"></span> entradas afectadas</span>
-						<br>
-						<br>
-					</div>
-				</div>
-
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="'Importador de datos'"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="'Importa los datos desde el año indicado (>=), de Arya y UQserver a SAIC. Ojo, no elimina, sólo carga.'"></span>
-					</div>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="/admin/parse/do">
-					<div class="uv-table-group-procedure row" style="padding:20px;cursor:auto;">
-						<div class="col-3" id="databaseContainer">
-							<label>Bases de datos</label>
-							<select class="selectpicker" id="databaseSelector" name="database" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option disabled selected>Selecciona una opción</option>
-						        <option value="grado">Grado</option>
-						        <option value="master">Máster</option>
-						        <option value="doctorado">Doctorado</option>
-						        <option value="pas">PAS</option>
-						        <option value="evalprof">Evaluación profesorado</option>
-						        <option value="otros">Otros</option>
-						    </select>
-						</div>
-						<div class="col-3">
-							<label>Tabla</label>
-							<div class="subselect" id="gradoSelector">
-								<select class="form-control" name="table" required style="cursor:pointer;">
-							        <option disabled selected>Selecciona una opción</option>
-							        <option value="dades1er">Estudiantes primero</option>
-							        <option value="dades3er">Estudiantes tercero</option>
-							        <option value="dadesGraduats">Graduados</option>
-							        <option value="profes">Profesores</option>
-							    </select>
-							</div>
-							<div class="subselect" id="masterSelector">
-							    <select class="form-control" name="table" required style="cursor:pointer;">
-							        <option disabled selected>Selecciona una opción</option>
-							        <option value="data">Estudiantes</option>
-							        <option value="datag">Graduados</option>
-							        <option value="profes">Profesores</option>
-							    </select>
-							</div>
-							<div class="subselect" id="doctoradoSelector">
-							    <select class="form-control" name="table" required style="cursor:pointer;">
-							        <option disabled selected>Selecciona una opción</option>
-							        <option value="estud">Estudiantes</option>
-							        <option value="etesi">Graduados</option>
-							        <option value="prof">Profesores</option>
-							        <option value="tasas">Tasas</option>
-							        <option value="inds">Indicadores</option>
-							        <option value="recom">Recomendaciones</option>
-							    </select>
-							</div>
-							<div class="subselect" id="evalprofSelector">
-							    <select class="form-control" name="table" required style="cursor:pointer;">
-							        <option disabled selected>Selecciona una opción</option>
-							        <option value="evalprof">Evaluación del profesorado</option>
-							    </select>
-							</div>
-							<div class="subselect" id="otrosSelector">
-							    <select class="form-control" name="table" required style="cursor:pointer;">
-							        <option disabled selected>Selecciona una opción</option>
-							        <option value="otros">Otros (Profesorado + Tasas)</option>
-							        <option value="docentia">Docentia</option>
-							        <option value="enquestes">Encuestas (asignaturas)</option>
-							    </select>
-							</div>
-							<div class="subselect" id="pasSelector">
-							    <select class="form-control" name="table" required style="cursor:pointer;">
-							        <option disabled selected>Selecciona una opción</option>
-							        <option value="pas">PAS</option>
-							    </select>
-							</div>
-						</div>
-						<div class="col-2">
-							<label>Año (>=)</label>
-							<input class="form-control" type="number" value="" name="year">
-						</div>
-					</div>
-					<div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:auto;">
-						<input class="btn btn-primary" type="submit" value="Importar">
-					</div>
-				</form>
-				<div class="uv-table-group-procedure row">
-					<div class="col-4">
-						<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;cursor:auto;">
-							<div class="uv-table-title">
-								<h6 class="uv-table-header-h6" th:text="'Precarga de datos'"></h6>
-								<hr class="uv-procedure-hr">
-								<span th:text="'Carga los ficheros de texto a las tablas intermedias en Arya'"></span>
-							</div>
-						</div>
-						<form enctype='multipart/form-data' method="POST" action="/admin/parse/action" id="preload_form">
-							<div class="uv-table-group-procedure row" style="padding:20px;">
-								<select class="selectpicker" name="action" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-							        <option disabled selected>Selecciona el conjunto de ficheros a cargar</option>
-							        <option value="precargaEvalprof">Evaluación de profesorado</option>
-							        <option value="precargaMaster">Máster</option>
-							        <option value="precargaDoctorado">Doctorado</option>
-							    </select>
-							    <div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;">
-									<input class="btn btn-primary" type="submit" value="Ejecutar" form="preload_form">
-								</div>
-							</div>
-						</form>
-					</div>
-					<div class="col-4">
-						<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;cursor:auto;">
-							<div class="uv-table-title">
-								<h6 class="uv-table-header-h6" th:text="'Acciones sobre datos de encuestas'"></h6>
-								<hr class="uv-procedure-hr">
-								<span th:text="'Acciones de corrección sobre datos de encuestas'"></span>
-							</div>
-						</div>
-						<form enctype='multipart/form-data' method="POST" action="/admin/parse/action" id="actions_form">
-							<div class="uv-table-group-procedure row" style="padding:20px;">
-								<select class="selectpicker" name="action" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-							        <option disabled selected>Selecciona una acción</option>
-							        <option value="mediasCentroNP">Eliminar medias de centro para titulaciones no adscritas</option>
-							        <option value="bienalesProfesGrado">Corregir bienalidad profesorado (Solo para curso no completo) [Grado]</option>
-							        <option value="bienalesProfesMaster">Corregir bienalidad profesorado (Solo para curso no completo) [Máster] </option>
-							        <option value="bienalesPas">Corregir bienalidad PAS (Solo para curso no completo)</option>
-							        
-							    </select>
-							    <div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;">
-									<input class="btn btn-primary" type="submit" value="Ejecutar" form="actions_form">
-								</div>
-							</div>
-						</form>
-					</div>
-				</div>
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="'Eliminar datos de encuestas'"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="'Se eliminan permanentemente de la base de datos. (Año=0 para eliminar todos los registros)'"></span>
-					</div>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="/admin/parse/delete" id="delete_form">
-					<div class="uv-table-group-procedure row" style="padding:20px;cursor:auto;">
-						<div class="col-4">
-							<label>Encuesta</label>
-							<select class="selectpicker" name="action" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-						        <option disabled selected>Selecciona una encuesta</option>
-						        <option value="dades_1er">[Grado] Estudiantes primero (dades_1er)</option>
-						        <option value="dades_3er">[Grado] Estudiantes tercero (dades_3er)</option>
-						        <option value="dades_graduats">[Grado] Graduados (dades_graduats)</option>
-						        <option value="profes">[Grado] Profesores (profes)</option>
-						        <option value="data">[Master] Estudiantes (data)</option>
-						        <option value="data_g">[Master] Graduados (data_g)</option>
-						        <option value="profes_tancades">[Master] Profesores (profes_tancades)</option>
-						        <option value="estud">[Doctorado] Estudiantes (doc_estud)</option>
-						        <option value="etesi">[Doctorado] Graduados (doc_etesi)</option>
-						        <option value="prof">[Doctorado] Profesores (doc_prof)</option>
-						        <option value="doc_inds">[Doctorado] Indicadores (doc_inds)</option>
-						        <option value="doc_tasas">[Doctorado] Tasas (doc_tasas)</option>
-						        <option value="doc_recom">[Doctorado] Recomendaciones (doc_recom)</option>
-						        <option value="evalprof">[Evaluación del profesorado] (evalprof)</option>
-						        <option value="dadespas">[PAS] (dadespas)</option>
-						        <option value="otros">[Otros] Profesorado + Tasas</option>
-						        <option value="docentia">[Docentia]</option>
-						        <option value="enquestes">[Encuestas] Asignaturas para encuestas. SAE/SAEM (enquestes)</option>
-						    </select>
-					    </div>
-					    <div class="col-3">
-					    	<label>Año</label>
-							<input class="form-control" type="number" value="" name="year">
-					    </div>
-					</div>
-					<div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;">
-						<input class="btn btn-primary" type="submit" value="Ejecutar" form="delete_form">
-					</div>
-				</form>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script type="text/javascript">
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('.subselect').hide();
-			$('.subselect  > select').attr('disabled', true);
-			
-			$('#databaseSelector').change(function(){
-				console.log($(this).val());
-				$('.subselect').hide();
-				$('.subselect > select').attr('disabled', true);
-				$('#'+$(this).val()+'Selector  > select').attr('disabled', false);
-				$('#'+$(this).val()+'Selector').show();
-			});
-			
-		});
-		
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 29
src/main/resources/templates/preview.html

@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-	<head>
-		<link type="text/css" rel="stylesheet" href="/js/tinymce/skins/ui/oxide/content.min.css">
-		<link type="text/css" rel="stylesheet" href="/js/tinymce/skins/content/default/content.css">
-		<style type="text/css">
-			body{
-				font-size: 10pt;
-				size: 21cm 29.7cm;
-			    margin: 30mm 45mm 30mm 45mm;
-			}
-			
-			@page {
-			    size: 21cm 29.7cm;
-			    margin: 30mm 45mm 30mm 45mm;
-			}
-		
-		</style>
-
-		
-	</head> 
-	<body id="tinymce" class="mce-content-body mceNonEditable" style="padding:unset; margin:unset; padding-left:10px; padding-right:10px;">
-	
-		<section id="content" th:utext="${content}" style="margin-top:-50px;"></section>
-	
-	</body>
-</html>
-
-

+ 0 - 45
src/main/resources/templates/previewWithPrint.html

@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<html>
-	<head>
-		<link type="text/css" rel="stylesheet" href="/js/tinymce/skins/ui/oxide/content.min.css">
-		<link type="text/css" rel="stylesheet" href="/js/tinymce/skins/content/default/content.css">
-		<link th:href="@{/css/bootstrap/bootstrap.min.css}" rel="stylesheet">
-		<link th:href="@{/css/fa/all.css}" rel="stylesheet">
-		<style type="text/css">
-			body{
-				font-size: 10pt;
-				size: 21cm 29.7cm;
-			    margin: 30mm 45mm 30mm 45mm;
-			}
-			
-			@page {
-			    size: 21cm 29.7cm;
-			    margin: 30mm 45mm 30mm 45mm;
-			}
-		
-		</style>
-		<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
-
-		
-	</head> 
-	<body id="tinymce" class="mce-content-body mceNonEditable" style="padding:unset; margin:unset; margin-top:50px;">
-	
-		<span class="btn btn-primary" style="float:right;border-radius:50%;cursor:pointer;margin-right:50px;" onclick="print_to_pdf();"><i class="fa fa-print"></i></span>
-		<section style="border:1px dotted gray;max-width:1000px;margin:auto;padding:25px;">
-			<section id="content" th:utext="${content}" ></section>
-		</section>
-	
-		<script>
-			var opts = { margin: [20, 12, 20, 12] };
-			var worker = html2pdf();
-			worker.set(opts);
-			
-			function print_to_pdf(){
-				const element = document.getElementById('content');
-				worker.from(element).save();
-			}
-		</script>
-	</body>
-</html>
-
-

+ 0 - 906
src/main/resources/templates/procedure.html

@@ -1,906 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org"
-	lang="es">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<style>
-	svg[id^="mermaid-"] { min-width: 100%; font-size: 10px;}
-	polygon.label-container {
-		max-height: 50px !important;
-	}
-	g.node{
-		max-height: 50px !important;
-	}
-
-	svg[aria-roledescription="flowchart-v2"]{
-		-moz-transform: scale(0.75);
-		-webkit-transform: scale(0.75);
-		transform: scale(0.75);
-		transform-origin: top center;
-		top:0;
-		margin-top:0px;
-		margin-bottom:0px;
-	}
-
-	div.mermaid {
-		margin-left: 0 !important;
-		text-align: center;
-		resize:both;
-		overflow:auto;
-		margin-bottom: 2px;
-		position:relative;
-		max-height: 600px;
-		max-width: 100%;
-	}
-</style>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info">
-					<div class="uv-table-title">
-						<span>
-							<strong id="procedure_code" th:text="${instance.nomProces}"></strong>
-							<strong th:text="${#locale.language} == 'es' ? ${instance.titolCas}:${instance.titolVal}"></strong>
-						</span>
-						<br>
-						<span><strong th:text="#{procedures.center}"></strong>: <span th:text="${#locale.language} == 'es' ? ${instance.centreCas}:${instance.centreVal}"></span></span>
-						<br>
-						<span th:if="${instance.ruct != null}"><strong th:text="#{procedures.titulation}"></strong>: <a th:href="${'/dashboard/'+instance.ruct}"><span th:text="${#locale.language} == 'es' ? ${instance.titulacioCas}:${instance.titulacioVal}"></span></a></span>
-						<span th:if="${instance.ruct == null}"><strong th:text="#{procedures.titulation}"></strong>: <span th:text="${#locale.language} == 'es' ? ${instance.titulacioCas}:${instance.titulacioVal}"></span></span>
-						<br>
-						<span><strong th:text="#{procedures.year.eval}"></strong>: <span><span th:text="${instance.cursAvaluat-1}"></span> - <span th:text="${instance.cursAvaluat}"></span></span></span>
-						(<span th:text="#{procedures.year.act}"></span> <span th:text="${instance.cursActivacio-1}"></span> - <span th:text="${instance.cursActivacio}"></span>)
-						<br>
-						<p th:text="${#locale.language} == 'es' ? ${instance.descripcioCas}:${instance.descripcioVal}"></p>
-					</div>
-					<hr class="uv-procedure-hr">
-					<div class="uv-table-group" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}" style="text-align: right;">
-						<div class="btn-toolbar" role="toolbar" style="margin-bottom:-30px;">
-							<div class="btn-group mr-2 w-auto ml-auto" role="group" aria-label="First group">
-								<button form="formInstanceClear" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title="#{admin.action.reloadInstance}"><i class="fas fa-redo"></i></button>
-								<button form="formInstanceClose" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title="#{admin.action.closeInstance}"><i class="fas fa-lock"></i></button>
-								<button form="formInstanceDelete" class="btn btn-danger pointer" style="width:38px; height:38px;" th:title="#{admin.action.deleteInstance}"><i class="fas fa-trash"></i></button>
-							</div>
-						</div>
-						<form enctype='multipart/form-data' id="formInstanceClear" method="POST" action="/admin/instance/clear" style="display: inline;">
-							<input type="hidden" name="idInstancia" th:value="${instance.idInstancia}">
-						</form>
-						<form enctype='multipart/form-data' id="formInstanceClose" method="POST" action="/admin/instance/close" style="display: inline;">
-							<input type="hidden" name="idInstancia" th:value="${instance.idInstancia}">
-						</form>
-						<form enctype='multipart/form-data' id="formInstanceDelete" method="POST" action="/admin/instance/delete" style="display: inline;" th:if="${#authentication.principal.isAdmin()}">
-							<input type="hidden" name="idInstancia" th:value="${instance.idInstancia}">
-						</form>
-					</div>
-				</div>
-				<div class="uv-table-group">
-					<div class="col-sm-12 uv-table-section">
-						<div class="uv-table-header">
-							<h6 class="uv-table-header-h6"><span th:text="#{procedures.title.tasks}"></span>&nbsp;&nbsp;&nbsp;(<a href="javascript:void(0)" th:text="#{procedures.title.flow}" onclick="showFlowDiagram();">ver flujo</a>)</h6>
-							<hr class="uv-table-header-hr">
-							<div class="col">
-								<span class="legend-active"><span th:text="#{procedures.legend.active}">Activa</span></span>
-								<span class="legend-active-other"><span th:text="#{procedures.legend.other}">No corresponde</span></span>
-								<span class="legend-expired"><span th:text="#{procedures.legend.expired}">Atrasada</span></span>
-								<span class="legend-blocked"><span th:text="#{procedures.legend.blocked}">No procede</span></span>
-								<span class="legend-done"><span th:text="#{procedures.legend.done}">Realizada</span></span>
-							</div>
-						</div>
-					</div>
-					<div id="flowDiagramContainer" class="flowDiagramContainer" style="display: none;">
-						<button type="button" class="close" onclick="hideFlowDiagram();" style="margin-top:-50px;">
-							<span aria-hidden="true" style="font-size:125%;"><i class="fas fa-window-close"></i></span>
-						</button>
-						<div class="btn-toolbar mermaid-tools" role="toolbar" style="float:left;">
-							<div class="btn-group w-auto ml-auto pointer" role="group" aria-label="downloadDiagram">
-								<span class="btn btn-secondary pointer" style="width:38px; height:38px; padding:6px" onclick="downloadFlowDiagram();"><i class="fas fa-download"></i></span>
-							</div>
-						</div>
-						<div class="mermaid" th:text="${flow}"></div>
-					</div>
-				</div>
-				<div class="uv-accordion" style="margin-top:20px;text-align:center;">
-					<div id="accordion">
-						<div class="card" th:each="item,i : ${tasks}">
-							<input type="hidden" id="activeOptions" th:if="${item.estat == 'A'}" th:value="${item.opcions}">
-							<div class="card-header pointer" 
-								th:classappend="${(item.estat == 'A' and item.isAssignedToUser?'card-header-active ':'') + (item.estat == 'A' and not item.isAssignedToUser?'card-header-active-other ':'') + (item.isExpired and item.estatInstancia == 'A' and item.estat == 'A'?'card-header-expired ':'') + (item.estat == null?'card-header-blocked ':'')}" 
-								th:attr="id='heading'+${i.index},data-target='#collapse'+${i.index},aria-controls='#collapse'+${i.index}, data-toggle=${item.estat != null or #authentication.principal.isAdmin() or #authentication.principal.isGranted() ? 'collapse' : ''}" 
-								aria-expanded="true" onclick="showComments();">
-								<span style="float:left;font-size: 21px; margin-left:-10px;margin-top:-10px;" th:if="${item.estat != null or #authentication.principal.isAdmin() or #authentication.principal.isGranted()}"><i class="fas fa-caret-down"></i></span>
-								<h6 style="text-align:left; margin-left:15px;">
-									<strong th:text="${i.index+1}+'/'+${#lists.size(tasks)}"></strong><strong> - </strong>
-									<span th:text="${#locale.language} == 'es' ? ${item.titolCas}:${item.titolVal}"></span>
-									<br>
-									<span th:text="#{procedures.status}"></span>: 
-									<span th:if="${item.estat == 'A'}" th:text="#{procedures.status.a}"></span>
-									<span th:if="${item.estat == 'S'}" th:text="#{procedures.status.s}"></span>
-									<span th:if="${item.estat == 'N'}" th:text="#{procedures.status.n}"></span>
-									<span th:if="${item.estat == 'E'}" th:text="#{procedures.status.e}"></span>
-									<span th:if="${item.estat == 'F'}" th:text="#{procedures.status.f}"></span>
-									<span th:if="${item.estat == null}" th:text="#{procedures.status.i}"></span>
-									<span>
-										<br>
-										<span th:text="#{procedures.assignedTo}"></span>: 
-										<span th:text="${#locale.language} == 'es' ? ${item.descripcioRolCas}:${item.descripcioRolVal}"></span>
-									</span>
-									<br>
-									
-									<span th:if="${item.estat == 'A' or item.estat == null}"><span th:text="#{procedures.dateLimit}"></span>: <span th:text="${#dates.format(item.dataLim, 'dd-MM-yyyy')}"></span></span>
-									<span style="float: right; margin-top:-5px;" th:if="${item.estat == 'A' and item.isAssignedToUser}" th:attr="title=#{procedures.status.title.a}"><i class="fa fa-play-circle"></i></span>
-									<span style="float: right; margin-top:-5px;" th:if="${item.estat == 'A' and not item.isAssignedToUser}" th:attr="title=#{procedures.status.title.o}"><i class="fa fa-exclamation-triangle"></i></span>
-									<span style="float: right; margin-top:-5px;" th:if="${item.estat == null}"><i class="fa fa-lock" th:attr="title=#{procedures.status.title.p}"></i></span>
-									<span style="float: right; margin-top:-5px;" th:if="${item.estat != null and item.estat != 'A'}" th:attr="title=#{procedures.status.title.r}"><i class="fa fa-check"></i></span>
-									<span style="float: right; margin-top:-5px; margin-right:10px;" th:if="${(item.estat != 'A' and item.estat != null and #lists.contains({1, 11, 12, 13, 14, 15, 21, 22}, item.tipus)) or (item.estat == 'A' and item.evidencia != null)}">
-										<a th:href="${'/download/'+item.idInstanciaTasca}" target="_blank"><i class="fas fa-file-pdf" style="font-size:200%;margin-top:-10px;"></i></a>
-									</span>
-								</h6>
-							</div>
-							<div th:attr="id='collapse'+${i.index},aria-labelledby='heading'+${i.index}" class="collapse" data-parent="#accordion">
-								<div class="card-body uv-card-body">
-									<div id="taskAdminActions" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}" style="margin-bottom: 20px;">
-										<div class="btn-toolbar" role="toolbar" style="margin-top:-15px; margin-bottom:-15px;">
-											<div class="btn-group mr-2 w-auto ml-auto" role="group" aria-label="First group">
-												<button type="submit" th:attr="form=${'formTaskReload'+item.idInstanciaTasca}" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title="#{admin.action.reloadTask}"><i class="fas fa-redo"></i></button>
-												<button type="submit" th:attr="form=${'formTaskReactivate'+item.idInstanciaTasca}" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title="#{admin.action.reactivate}" th:if="${item.estat != 'A' and item.estat != null}"><i class="fas fa-lock-open"></i></button>
-												<button type="submit" th:attr="form=${'formTaskEdit'+item.idInstanciaTasca}" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title="#{admin.action.edit}" th:if="${item.estat != 'A' and item.estat != null and #lists.contains({11, 15}, item.tipus)}"><i class="fas fa-edit"></i></button>
-												<button type="submit" th:attr="form=${'formShowDrafts'+item.idInstanciaTasca}" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title="'Ver borradores'" th:if="${item.estat != null and #authentication.principal.isAdmin() and #lists.contains({11, 15}, item.tipus)}"><i class="fas fa-code-branch"></i></button>
-												<button th:attr="id=${'filepicker-creator'+item.idInstanciaTasca}" class="btn btn-secondary pointer" style="width:38px; height:38px;" th:title=#{admin.action.attach} th:onclick="'createFilepicker(\''+${instance.idInstancia}+'\', \''+${item.idInstanciaTasca}+'\')'" th:if="${item.estat != 'A' and item.estat != null and #lists.contains({1, 11, 12, 13, 14, 15}, item.tipus)}"><i class="fas fa-file-upload"></i></button>
-											</div>
-										</div>				
-										<form th:id="${'formTaskReload'+item.idInstanciaTasca}" enctype='multipart/form-data' method="POST" action="/admin/instance/task/reload" style="display: inline;">
-											<input type="hidden" name="idInstanciaTasca" th:value="${item.idInstanciaTasca}">
-										</form>
-										<form th:id="${'formTaskReactivate'+item.idInstanciaTasca}" enctype='multipart/form-data' method="POST" action="/admin/instance/task/reactivate" style="display: inline;" th:if="${item.estat != 'A'}">
-											<input type="hidden" name="idInstanciaTasca" th:value="${item.idInstanciaTasca}">
-										</form>
-										<form th:id="${'formTaskEdit'+item.idInstanciaTasca}" enctype='multipart/form-data' method="POST" action="/admin/instance/task/edit" style="display: inline;" th:if="${item.estat != 'A' and #lists.contains({11, 15}, item.tipus)}">
-											<input type="hidden" name="idInstanciaTasca" th:value="${item.idInstanciaTasca}">
-										</form>
-										<form th:id="${'formShowDrafts'+item.idInstanciaTasca}" enctype='multipart/form-data' method="GET" onsubmit="target_popup(this);" th:action="${'/procedure/drafts/'+item.idInstanciaTasca}" target="_blank" style="display: inline;" th:if="${#authentication.principal.isAdmin() and #lists.contains({11, 15}, item.tipus)}">
-										</form>
-									</div>					
-									<div class="row" style="margin-bottom:20px;text-align: left;width: 90%;">
-										<span th:text="${#locale.language} == 'es' ? ${item.descripcioCas}:${item.descripcioVal}"></span>
-									</div>
-									<div class="row" th:if="${item.estat == 'A'}">
-										<script>
-											var typeActive = "[[${item.tipus}]]";
-											var idInstanciaTasca = "[[${item.idInstanciaTasca}]]";
-										</script>
-										<div class="card-body-inner-action" th:if="${item.isAssignedToUser or #authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-											<form enctype='multipart/form-data' method="POST" th:action="${'/procedure/'+instance.idInstancia}">
-												<input class="active-task" type="hidden" name="taskid" th:value="${item.idInstanciaTasca}">
-												<input class="active-task" type="hidden" name="procid" th:value="${instance.idInstancia}">
-												
-												<div class="card-body-inner-action" th:if="${item.tipus == 4}"> </div>
-												
-												<div class="card-body-inner-action" th:if="${item.tipus == 2}">
-													<span id="action_y" class="btn btn-y pointer" th:text="#{procedures.btn.yes}" onclick="click_y();"></span> <span style="margin-left:10px;margin-right:10px;"></span>
-													<span id="action_n" class="btn btn-n pointer" th:text="#{procedures.btn.no}" onclick="click_n();"></span>
-													<input id="response" name="response" value="" required style="opacity: 0;">
-												</div>
-												
-												<div class="card-body-inner-action" th:if="${item.tipus == 11 or item.tipus == 15}">
-													<textarea id="editor" name="evidencia_text" th:text="${item.text}"></textarea>
-													<div style="text-align: left;">
-														<small style="text-align: left;font-weight: bold;"><span th:text="#{procedures.autosave.lastdate}">Última modificación</span>: <span th:if="${item.dataMod != null}" id="lastmoddate" th:text="${#dates.format(item.dataMod, 'dd/MM/yyyy HH:mm:ss')}"></span><span th:if="${item.dataMod == null}" id="lastmoddate" th:text="#{procedures.autosave.none}"></span></small>
-													</div>
-												</div>
-												
-												<div class="card-body-inner-action" th:if="${#lists.contains({1, 12, 13, 14}, item.tipus)}">
-													<div class="row">
-														<div class="col" style="text-align: left;margin-bottom:20px;" th:if="${!#strings.equals(item.codiEvidencia, '0')}">
-															<span th:text="#{procedures.template}"></span>: 
-															<a th:href="${'/download/template/'+item.idInstanciaTasca}" target="_blank">
-																<strong th:text="${item.codiEvidencia}"></strong> <span th:text="${#locale.language} == 'es' ? ${item.nomEvidenciaCas}:${item.nomEvidenciaVal}"></span>
-																<i class="fas fa-file-pdf"></i>
-															</a>
-														</div>
-													</div> 
-													<div class="file-loading">
-													    <input id="filepicker" multiple type="file" name="evidencias">
-													</div>
-													<br>
-													<div class="row card-body-up-btn" th:if="${item.oldEvidences != null}">
-														<a data-toggle="collapse" th:attr="href='#collapseEvidences'+${item.idInstanciaTasca}, aria-controls='#collapseEvidences'+${item.idInstanciaTasca}" 
-															role="button" aria-expanded="false" th:text="#{procedures.olderEvidences}">
-														    Evidencias generadas en el proceso anteriormente
-														</a>
-														<div class="collapse" th:attr="id='collapseEvidences'+${item.idInstanciaTasca}" style="width:95%;">
-															<div class="card card-body" th:each="ev : ${item.oldEvidences}">
-																<a th:href="${'/download/'+ev.idTascai}" target="_blank"><span></span> <span th:text="${ev.codiEvidencia}"></span> <span th:text="${#locale.language} == 'es' ? ${ev.nomEvidenciaCas}:${ev.nomEvidenciaVal}"></span> [<span th:text="${#locale.language} == 'es' ? 'Curso evaluado ':'Curs avaluat '"></span><span th:text="${ev.curs-1}"></span> - <span th:text="${ev.curs}"></span>]</a>
-															</div>
-														</div>
-													</div>
-												</div>
-												<div class="row card-body-up-btn">
-													<span class="btn btn-primary pointer" th:if="${#lists.contains({11, 15}, item.tipus)}" style="margin-right:10px;" onclick="saveEditorWithConfirmation();"><i class="fas fa-save"></i> <span th:text="#{procedures.btn.draft}">Guardar borrador</span></span>
-													<button class="btn btn-success" th:if="${not #lists.contains({1, 11, 12, 13, 14, 15}, item.tipus)}">Confirmar</button>
-													<button class="btn btn-success" th:if="${#lists.contains({11, 15}, item.tipus)}" data-toggle="confirmation" th:attr="data-title=#{procedures.editor.confirm}"><i class="fas fa-file-import"></i> Enviar</button>
-													<span class="btn btn-success pointer" th:if="${#lists.contains({1, 12, 13, 14}, item.tipus)}" onclick="$('#filepicker').fileinput('upload');">Confirmar</span>
-												</div>
-											</form>
-										</div>
-									</div>
-									<div class="row" th:if="${item.estat != 'A' and item.estat != null and (#lists.contains({1, 12, 13, 14, 22}, item.tipus)) and (#authentication.principal.isGranted() or #authentication.principal.isAdmin())}">
-									    <!-- Añadir más evidencias (solo uq y admin) -->
-										<form class="col" enctype='multipart/form-data' method="POST" th:action="${'/procedure/'+instance.idInstancia}">
-											<input type="hidden" name="taskid" th:value="${item.idInstanciaTasca}">
-											<input type="hidden" name="procid" th:value="${instance.idInstancia}">
-											<div class="additional-file-container" th:attr="id='additionalFileContainer'+${item.idInstanciaTasca}"></div>
-										</form>
-									</div>
-									<div class="row" th:unless="${item.estat == 'A'}">
-										<form enctype='multipart/form-data' method="POST" action="/admin/instance/task/clear" style="display:inline; margin-right:20px;" th:if="${item.estat != null and (#authentication.principal.isAdmin())}">
-											<input type="hidden" name="idInstanciaTasca" th:value="${item.idInstanciaTasca}">
-											<div class="btn-toolbar" role="toolbar" style="margin-top:20px;">
-												<div class="btn-group w-auto ml-auto" role="group" aria-label="First group" style="margin-left:0px;">
-													<button class="btn btn-danger pointer" style="width:30px; height:30px; padding:0;" th:title="#{admin.action.deleteTask}"><i class="fas fa-trash"></i></button>
-												</div>
-											</div>											
-										</form>
-										<span style="text-align:left;" th:if="${item.estat != null}">
-											<span th:if="${item.tipus == 4}"> <!-- avanzar -->
-												<span th:text="#{procedures.done.response}"></span>: <span th:text="#{procedures.status.f}"></span>
-											</span>
-											<span th:if="${item.tipus == 2 and item.estat == 'S'}"> <!-- pregunta resp si -->
-												<span th:text="#{procedures.done.response}"></span>: <span th:text="#{procedures.done.response.s}"></span>
-											</span>
-											<span th:if="${item.tipus == 2 and item.estat == 'N'}"> <!-- pregunta resp no -->
-												<span th:text="#{procedures.done.response}"></span>: <span th:text="#{procedures.done.response.n}"></span>
-											</span>
-											<span th:if="${#lists.contains({1, 11, 12, 13, 14, 15, 21, 22}, item.tipus)}"> <!-- evidencia -->
-												<span th:text="#{procedures.done.evidence}"></span>: 
-												<a th:href="${'/download/'+item.idInstanciaTasca}" target="_blank">
-													<strong th:text="${item.codiEvidencia}"></strong> <span th:text="${#locale.language} == 'es' ? ${item.nomEvidenciaCas}:${item.nomEvidenciaVal}"></span>
-													<i class="fas fa-file-pdf"></i>
-												</a>
-											</span>
-											<br>
-											<span><span th:text="#{procedures.done.user}"></span>: <span th:text="${item.usuariFet}"></span></span>
-											<br>
-											<span><span th:text="#{procedures.done.date}"></span>: <span th:text="${#dates.format(item.dataFet, 'dd-MM-yyyy')}"></span></span>
-										</span>
-									</div>
-									<div class="container" th:if="${item.versions != null}" style="margin-top:25px;text-align:left;margin-left: 0px;">
-										<strong th:if="${#lists.size(item.versions) > 0}" th:text="#{procedures.otherActions}">Acciones realizadas anteriormente</strong>
-										<br>
-										<div class="row" style="text-align:left;" th:if="${#lists.size(item.versions) > 0}" th:each="version,i : ${item.versions}">
-											<hr class="uv-procedure-hr" style="width:100%;text-align:left;margin-left: 0px;">
-											<div class="col-1" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}" style="flex:0 0 0;width:50px !important;padding:0;">
-												<form enctype='multipart/form-data' method="POST" action="/admin/instance/task/remove" style="display: inline;">
-													<input type="hidden" name="idInstanciaTasca" th:value="${version.idInstanciaTasca}">
-													<div class="btn-toolbar" role="toolbar" style="margin-top:20px;">
-														<div class="btn-group w-auto ml-auto" role="group" aria-label="First group" style="margin-left:0px;">
-															<button class="btn btn-danger pointer" style="width:30px; height:30px; padding:0;" th:title="#{admin.action.deleteTask}"><i class="fas fa-trash"></i></button>
-														</div>
-													</div>
-												</form>
-											</div>
-											<div class="col-11">
-												<span th:if="${version.tipus == 4}"> <!-- avanzar -->
-													<span th:text="#{procedures.done.response}"></span>: <span th:text="#{procedures.status.f}"></span>
-												</span>
-												<span th:if="${version.tipus == 2 and version.estat == 'S'}"> <!-- pregunta resp si -->
-													<span th:text="#{procedures.done.response}"></span>: <span th:text="#{procedures.done.response.s}"></span>
-												</span>
-												<span th:if="${version.tipus == 2 and version.estat == 'N'}"> <!-- pregunta resp no -->
-													<span th:text="#{procedures.done.response}"></span>: <span th:text="#{procedures.done.response.n}"></span>
-												</span>
-												<span th:if="${version.tipus == 1 or version.tipus == 11 or version.tipus == 15}"> <!-- evidencia -->
-													<span th:text="#{procedures.done.evidence}"></span>: 
-													<a th:href="${'/download/'+version.idInstanciaTasca}" target="_blank">
-														<strong th:text="${version.codiEvidencia}"></strong> <span th:text="${#locale.language} == 'es' ? ${version.nomEvidenciaCas}:${version.nomEvidenciaVal}"></span>
-														<i class="fas fa-file-pdf"></i>
-													</a>
-												</span>
-												<br>
-												<span><span th:text="#{procedures.done.user}"></span>: <span th:text="${version.usuariFet}"></span></span>
-												<br>
-												<span><span th:text="#{procedures.done.date}"></span>: <span th:text="${#dates.format(version.dataFet, 'dd-MM-yyyy')}"></span></span>
-											</div>
-											<br>
-										</div>
-									</div>
-								</div>
-							</div>
-						</div>
-					</div>
-				</div> 
-				<div class="uv-table-group procedure-status" th:if="${instance.estat == 'F'}">
-					<strong th:text="#{procedures.closed}"></strong>
-				</div>
-				<div class="uv-table-group procedure-status" th:if="${instance.estat == 'C'}">
-					<strong th:text="#{procedures.cancelled}"></strong>
-				</div>
-				<div class="uv-table-group procedure-status" th:if="${location == 'supervision'}">
-					<a href="/supervision/search" class="btn btn-primary pointer" th:text="#{procedures.back}">Volver</a>
-				</div>
-			</div>
-		</div>
-	</div>
-
-	<div class="modal fade" id="flowDiagramModal" tabindex="-1" role="dialog" aria-labelledby="flowDiagramModal" aria-hidden="true">
-		<div class="modal-dialog modal-xl" >
-		  <div class="modal-content">
-			  <div class="modal-header">
-				  <h5 class="modal-title">Flujo del procedimiento</h5>
-				  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-					  <span aria-hidden="true">&times;</span>
-				  </button>
-			  </div>
-			  <div class="modal-body">
-				<div class="mermaid-def" th:text="${flow}" style="display:none;"></div>
-				<div id="flowDiagram" class="mermaid"></div>
-			  </div>
-			  <div class="modal-footer">
-				  <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cerrar</button>
-			  </div>
-		  </div>
-		</div>
-	  </div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/fileinput/js/fileinput.min.js}"></script>
-	<script th:src="@{/js/fileinput/themes/fas/theme.js}"></script>
-	<script th:src="@{/js/fileinput/js/locales/es.js}" th:if="${#locale.language == 'es'}"></script>
-	<script th:src="@{/js/fileinput/js/locales/ca.js}" th:if="${#locale.language != 'es'}"></script>	
-	<script th:src="@{/js/confirmation/bootstrap-confirmation.js}"></script>
-	<script src="https://cdn.jsdelivr.net/npm/mermaid@11.3.0/dist/mermaid.min.js"></script>
-
-  
-  	<script th:inline="javascript" th:if="${#authentication.principal.isAdmin()}">
-  		var tinyobjectresizing = true;
-  	</script>
-    
-  	<script th:inline="javascript" th:if="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-	  	if (!window.Worker) {
-	  		alert(/*[[#{procedures.nosupported}]]*/);
-			window.location = '/';
-		}
-  		var aliveWorker; 
-  		var saveWorker;
-	    function confirmDelete(){ }
-	    function confirmClear(){ }
-	    function setSaveInterval(){ console.log('Autosave disabled'); }
-	    function setAliveInterval(){
-	    	console.log('KeepAlive enabled');
-	    	aliveWorker = new Worker(/*[[@{/js/workers/alive_worker.js}]]*/);
-	    	aliveWorker.onmessage = keepalive;
-	    }
-	    var tinyplugins = 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists charmap quickbars checklist tinycomments codeeditor paste';
-	    var tinytoolbar = 'save | undo redo | bold italic underline strikethrough forecolor backcolor removeformat | fontfamily fontsize | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist checklist | showcomments | btn-editable btn-noneditable insert-data | codeeditor | topdf fullscreen ';
-    	var tinymenu = 'file edit view insert format tools table help';
-    	var tinytable = 'table tabledelete | tableprops tablerowprops tablecellprops | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol';
-    	var tinycontextmenu = 'link table useBrowserSpellcheck';
-    	var tinytableappearance = true;
-    	var tinytableclass = [
-    		{title: 'Normal', value: ''},
-		    {title: 'Editable', value: 'mceEditable'},
-		    {title: 'No editable', value: 'mceNonEditable'},
-		    {title: 'Ignorar en el PDF', value: 'mceNonEditable pdfignore'}
-		];
-    	var tinytableresizebars = true;
-    	var tinyadvtab = true;
-    	var tinyobjectresizing = false;
-		var tinypasteplain = false;
-		var tinypasteremovestyles = true;
-    	
-    	function tinyconfigure(editor){
-			
-			editor.on('keydown', function(e) {
-				if (e.keyCode == 8 || e.keyCode == 46) { //backspace and delete keycodes
-                    try {
-                        var elem = tinymce.activeEditor.selection.getNode(); //current caret node
-                        if (elem.classList.contains("mceNonEditable")) {
-                        	e.preventDefault();
-                            return false;
-                        }
-                    } catch (e) {console.log(e);}
-                }
-			});
-			
-			editor.on('TableModified', function(e) {
-				editor.setContent(editor.getContent());	      
-			});
-			
-			editor.ui.registry.addIcon('save', '<i style="font-size:125%;" class="fas fa-save"></i>')
-				
-			editor.ui.registry.addButton('topdf', {
-				icon: 'print',
-				tooltip: 'Imprimir a PDF',
-		      	onAction: function(_){ 
-		      		print_to_pdf(editor.getContent());
-		      	}
-		    });	
-			
-			editor.on('FullscreenStateChanged', function () {
-				if(tinymce.activeEditor.plugins.fullscreen.isFullscreen()){
-					var e = '<span id="exitFullScreen" class="btn btn-primary pointer" style="position:absolute;display:none;float:right;right:15px;top:25px;color:white;background-color:#007bff;padding:8px;cursor:pointer;" onclick="tinymce.activeEditor.execCommand('+"'mceFullScreen'"+');">Volver a SAIC <i class="fas fa-compress-arrows-alt"></i></span>';
-					$(e).appendTo($($('.tox-editor-container').get(0)));
-					$('#exitFullScreen').show();
-				}
-				else{
-					$('#exitFullScreen').remove();	
-				}
-			});	
-			
-			editor.ui.registry.addButton('btn-editable', {
-				icon: 'unlock',
-				tooltip: 'Desbloquear contenido',
-		      	onAction: function(_){ 
-		      		var ns = $(editor.selection.getSelectedBlocks()).each(function(b){
-		      			$(this).removeClass('mceEditable').removeClass('mceNonEditable').addClass('mceEditable')
-		      		});
-		      		editor.setContent(editor.getContent());	      		
-		      	}
-		    });
-			
-			editor.ui.registry.addButton('btn-noneditable', {
-				icon: 'lock',
-				tooltip: 'Bloquear contenido',
-		      	onAction: function(_){ 
-		      		var ns = $(editor.selection.getSelectedBlocks()).each(function(b){
-		      			$(this).removeClass('mceEditable').removeClass('mceNonEditable').addClass('mceNonEditable')
-		      		});
-		      		editor.setContent(editor.getContent());
-		      	}
-		    });
-			
-			editor.ui.registry.addMenuItem("useBrowserSpellcheck", {
-				text: "Use `Ctrl + Click derecho` para acceder al corrector",
-				onAction: function () {
-					editor.notificationManager.open({
-						text:"Para usar el corrector, mantenga pulsada la tecla Control (Ctrl) y haga click derecho sobre la palabra.",
-						type: "info",
-						timeout: 5000,
-						closeButton: true
-					});
-				}
-			});
-			
-			editor.ui.registry.addContextMenu("useBrowserSpellcheck", {
-				update: function (node) {
-					return editor.selection.isCollapsed() ? ["useBrowserSpellcheck"] : [];
-				}
-			});
-			
-    	}
-    </script>
-    
-    <script th:inline="javascript" th:unless="${#authentication.principal.isAdmin() or #authentication.principal.isGranted()}">
-	    if (!window.Worker) {
-	    	alert(/*[[#{procedures.nosupported}]]*/);
-			window.location = '/';
-    	}
-    	var aliveWorker; 
-		var saveWorker;
-    	function confirmDelete(){ }
-	    function confirmClear(){ }
-	    function setSaveInterval(){
-	    	console.log('AutoSave enabled');
-	    	saveWorker = new Worker(/*[[@{/js/workers/autosave_worker.js}]]*/);
-	    	saveWorker.onmessage = triggerSave;
-	    }
-	    function setAliveInterval(){
-	    	console.log('KeepAlive enabled');
-	    	aliveWorker = new Worker(/*[[@{/js/workers/alive_worker.js}]]*/);
-	    	aliveWorker.onmessage = keepalive;
-	    }
-	    var tinyplugins = 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists charmap quickbars checklist tinycomments paste';
-	    var tinytoolbar = 'save | undo redo | bold italic underline strikethrough removeformat | forecolor backcolor | fontfamily fontsize | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | showcomments | charmap | topdf | fullscreen ';
-    	var tinymenu = 'file edit';
-    	var tinytable = 'tableinsertrowbefore tableinsertrowafter tabledeleterow';
-    	var tinycontextmenu = '';
-    	var tinytableappearance = false;
-    	var tinytableclass = [];
-    	var tinytableresizebars = false;
-    	var tinyadvtab = false;
-    	var tinyobjectresizing = false;
-		var tinypasteplain = false;
-		var tinypasteremovestyles = true;
-
-    	function tinyconfigure(editor){
-    		editor.on('keydown', function(e) {
-				if (e.keyCode == 8 || e.keyCode == 46) { //backspace and delete keycodes
-                    try {
-                        var elem = tinymce.activeEditor.selection.getNode(); //current caret node
-                        console.log(elem);
-                        if (elem.classList.contains("mceNonEditable")) {
-                        	e.preventDefault();
-                            return false;
-                        }
-                    } catch (e) {console.log(e);}
-                }
-			});		
-			
-			editor.ui.registry.addIcon('save', '<i style="font-size:125%;" class="fas fa-save"></i>')
-				
-			editor.ui.registry.addButton('topdf', {
-				icon: 'print',
-				tooltip: 'Imprimir a PDF',
-		      	onAction: function(_){ 
-		      		print_to_pdf(editor.getContent());
-		      	}
-		    });	
-			
-			editor.on('FullscreenStateChanged', function () {
-				if(tinymce.activeEditor.plugins.fullscreen.isFullscreen()){
-					var e = '<span id="exitFullScreen" class="btn btn-primary pointer" style="position:absolute;display:none;float:right;right:15px;top:25px;color:white;background-color:#007bff;padding:8px;cursor:pointer;" onclick="tinymce.activeEditor.execCommand('+"'mceFullScreen'"+');">Volver a SAIC <i class="fas fa-compress-arrows-alt"></i></span>';
-					$(e).appendTo($($('.tox-editor-container').get(0)));
-					$('#exitFullScreen').show();
-				}
-				else{
-					$('#exitFullScreen').remove();	
-					
-				}
-			});	
-    	}
-	</script>
-  
-	<script type="text/javascript">
-		
-	var locale = "[[${#locale.language}]]";
-	var fileInvalid = "[[#{procedures.extensionAlert}]]";
-	var fullname = "[[${#authentication.principal.nom + ' ' + #authentication.principal.cognoms}]]";
-	var username = "[[${#authentication.principal.usuari}]]";
-	var msgsave = "[[#{procedures.editor.msgsave}]]";
-	var expiredTxt = "[[#{procedures.session.expired}]]";
-	var layout;
-	var lastActiveTime = new Date().getTime();
-	var autosaveTriggered = false;
-
-	mermaid.initialize({ startOnLoad: false, theme: "default", flowchart: { diagramPadding: 5, useMaxWidth:false, htmlLabels:true, wrap: true, wrappingWidth: 750 } });
-	
-	$(document).ready(function(){ 
-		
-		setAliveInterval();
-		setSaveInterval();
-		
-		layout = new Layout("");
-		layout.initTableLayout({paging:false});
-		layout.closeLoadingSpinner(".uv-loading-spinner");
-		$('#extensionAlert').hide();
-				
-		var extensions = ($('#activeOptions').val().replace('.','') === '') ? [] : $('#activeOptions').val().replace('.','').split(';');
-		if(extensions.length < 1){
-			extensions = ['pdf'];
-			if (typeof typeActive !== 'undefined') {
-				if(typeActive == 12 | typeActive == 14){
-			    	extensions = ['pdf', 'doc', 'docx', 'odt'];
-				}
-			}
-		}
-		
-		$("#filepicker").fileinput({
-			uploadUrl: "/procedure/files/"+$('input[name=procid].active-task').val(),
-			uploadExtraData: {taskid:$('input[name=taskid].active-task').val()},
-		    uploadAsync: false,
-		    showUpload: false,
-		    required: true,
-		    browseOnZoneClick: true,
-		    language: locale,
-		    allowedFileExtensions: extensions,
-		    previewFileIcon: '<i class="fas fa-file"></i>',
-		    theme: 'fas',
-		    allowedPreviewTypes: null,
-		    removeFromPreviewOnError: true,
-		    initialPreviewShowDelete: true,
-		    msgFileRequired: locale == 'es'?'Debe seleccionar la evidencia':'Ha de seleccionar l\'evidència',
-		    previewFileIconSettings: {
-		        'pdf': '<i class="fas fa-file-pdf text-danger"></i>',
-		    },
-		    fileActionSettings: {
-		    	showRemove: true,
-		    	showZoom: false,
-		    	showUpload: false,
-		    	showDrag: false,
-		    	removeIcon: '<i class="fas fa-trash"></i>'
-		    }
-		});
-		
-		$('#filepicker').on('filebatchuploadsuccess', function(event, data) {
-		    var form = data.form, files = data.files, extra = data.extra,
-		        response = data.response, reader = data.reader;
-		    window.location.href = window.location.href;
-		});
-		
-		tinymce.init({ 
-			selector: '#editor',
-			language: locale,
-			browser_spellcheck: true,
-			plugins: tinyplugins,
-			menubar: tinymenu,
-			toolbar: tinytoolbar,
-			table_toolbar: tinytable,
-			tinycomments_author: username,
-			tinycomments_author_name: fullname,
-			tinycomments_mode: 'embedded',
-			tinycomments_can_delete: function(req, done, fail){ done({canDelete: true}); },
-			table_advtab: tinyadvtab,
-			table_row_advtab: tinyadvtab,
-			table_cell_advtab: tinyadvtab,
-			table_sizing_mode: 'fixed',
-			table_default_styles: {
-			    width: '297mm'
-			},
-			content_style: "body { width: 297mm; max-width: 297mm; font-size: 10pt; font-family: Verdana, Geneva, sans-serif; font-style: normal; font-variant: normal;}",
-			font_formats: "Arial=arial,helvetica,sans-serif; Verdana=verdana,geneva;", 
-			font_size_formats: '8pt 10pt 12pt 14pt 16pt 18pt 24pt',
-			setup: tinyconfigure,
-			save_onsavecallback: function(){
-				if(autosaveTriggered){
-					save_content(false);
-					autosaveTriggered = false;
-				}
-				else{
-					save_content(true);
-				}
-			},
-			content_langs: [
-			    {title: 'Español', code: 'es'},
-			    {title: 'Valencià', code: 'ca'}],   
-			image_advtab: true,
-			importcss_append: true,
-			height: 700,
-			image_caption: true,
-			quickbars_selection_toolbar: '',
-			toolbar_mode: 'sliding',
-			contextmenu: tinycontextmenu,
-			table_appearance_options: tinytableappearance,
-			table_class_list: tinytableclass,
-			table_resize_bars: tinytableresizebars,
-			verify_html: false,
-			cleanup: false,
-			valid_elements: '+*[*]',
-			paste_as_text: tinypasteplain,
-			paste_remove_styles: tinypasteremovestyles,
-			paste_strip_class_attributes: true
-		});
-		
-		$('[data-toggle=confirmation]').confirmation({
-		    rootSelector: '[data-toggle=confirmation]',
-		    container: 'body',
-		    btnOkClass: 'btn btn-sm btn-success',
-		    btnOkLabel: 'Sí',
-		    btnCancelClass: 'btn btn-sm btn-danger',
-		    btnCancelLabel: 'No',
-		  });		
-		  		
-	});
-	
-	$('#customFile').on("change", function() {
-		var fileName = $(this).val().split("\\").pop();
-		$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
-		if (fileName.split('.').pop().toLowerCase() == "pdf"){
-		    $('#custom-file-label').removeClass('file-invalid');
-		}
-		else{
-			$('#custom-file-label').text(fileInvalid)
-			$('#custom-file-label').addClass('file-invalid');
-			$('#customFile').val("");
-		}
-
-	});
-	
-	function openProcedure(id){
-		window.location.replace('/procedure/'+id);
-	}
-	
-	function click_y(){
-		$('#action_n').removeClass('btn-n-active');
-		$('#action_y').addClass('btn-y-active');
-		$('#response').val(1);
-	}
-	function click_n(){
-		$('#action_y').removeClass('btn-y-active');
-		$('#action_n').addClass('btn-n-active');
-		$('#response').val(0);
-	}
-	
-	function triggerSave(){
-		autosaveTriggered = true;
-		tinymce.activeEditor.execCommand('mceSave');
-		console.log('Autosave triggered');
-	}
-	
-	function keepalive(){
-		$.get("/keepalive")
-			.done(function(data){
-				if(data != 'alive'){
-					alert(expiredTxt.replaceAll("&#39;", "'"));
-					saveWorker.terminate();
-					aliveWorker.terminate();
-					window.location.reload();
-				}
-			})
-			.fail(function() {
-				alert(expiredTxt.replaceAll("&#39;", "'"));
-				saveWorker.terminate();
-				aliveWorker.terminate();
-				window.location.reload();
-			});
-	}
-	
-	function saveEditorWithConfirmation(){
-		tinymce.activeEditor.setDirty(true);
-		tinymce.activeEditor.execCommand('mceSave');
-		alert(msgsave);
-	}
-	
-	function createFilepicker(procId, taskId){
-		$('.additional-file-container').empty();
-		$('#additionalFileContainer'+taskId).html('<input class="additional-file-input" id="filepicker'+taskId+'" multiple type="file" name="evidencias">'
-			+'<br><span class="btn btn-success pointer" onclick="$(\'#filepicker'+taskId+'\').fileinput(\'upload\');">Confirmar</span><br><br><br>');
-		$("#filepicker"+taskId).fileinput({
-			uploadUrl: "/procedure/files/"+procId,
-			uploadExtraData: {taskid:taskId},
-		    uploadAsync: false,
-		    showUpload: false,
-		    required: true,
-		    browseOnZoneClick: true,
-		    language: locale,
-		    allowedFileExtensions: ['pdf'],
-		    previewFileIcon: '<i class="fas fa-file"></i>',
-		    theme: 'fas',
-		    allowedPreviewTypes: null,
-		    removeFromPreviewOnError: true,
-		    initialPreviewShowDelete: true,
-		    msgFileRequired: locale == 'es'?'Debe seleccionar la evidencia':'Ha de seleccionar l\'evidència',
-		    previewFileIconSettings: {
-		        'pdf': '<i class="fas fa-file-pdf text-danger"></i>',
-		    },
-		    fileActionSettings: {
-		    	showRemove: true,
-		    	showZoom: false,
-		    	showUpload: false,
-		    	showDrag: false,
-		    	removeIcon: '<i class="fas fa-trash"></i>'
-		    }
-		});
-		
-		$('#filepicker'+taskId).on('filebatchuploadsuccess', function(event, data) {
-		    var form = data.form, files = data.files, extra = data.extra,
-		        response = data.response, reader = data.reader;
-		    window.location.href = window.location.href;
-		});
-		
-	}
-		
-	
-	function save_content(manualDraftSave){
-		$.post("/procedure/save/"+idInstanciaTasca, 
-			   {text:tinymce.activeEditor.getContent(),
-				manual: manualDraftSave
-			})
-			.done(function(d){
-				$('#lastmoddate').text(d);
-				console.log('content saved at'+d);
-			});	
-	}
-	
-	function print_to_pdf(content){
-		$('<form id="tmpDownloadForm" method="post" action="/pdf/preview" target="_blank">' +
-			'<input type="text" name="idtascai" value="'+$('input[name="taskid"]').val()+'" />' +
-		  	'<textarea id="tmpDownloadContent" type="hidden" name="content">' +
-		  		tinymce.activeEditor.getContent() +
-		  	'</textarea>' +
-		  '</form>')
-		.appendTo('body')
-		.submit()
-		.remove();	
-	}
-	
-	function showComments(){
-		setTimeout(function(){
-			if(typeActive == 15){
-				tinymce.activeEditor.execCommand("ToggleSidebar", false, "showcomments");
-			}
-		}, 700);	
-	}
-
-	function target_popup(form) {
-		//window.open('', 'formpopup', 'width=1350,height=800,resizeable,scrollbars');
-		window.open('', 'formpopup', 'width=1350,height=800,resizeable');
-		form.target = 'formpopup';
-	}
-
-	function showFlowDiagram(){
-		if($('#flowDiagramContainer').is(":visible")){
-			hideFlowDiagram();
-		}
-		else{
-			$('#flowDiagramContainer').show();
-			mermaid.run({querySelector:'.mermaid'});
-		}
-	}
-
-	function hideFlowDiagram(){
-		$('#flowDiagramContainer').hide();
-	}
-
-	function downloadFlowDiagram() {
-		const svgElement = document.querySelector('svg[aria-roledescription="flowchart-v2"]');
-		const filename = 'flujo_procedimiento_'+$('#procedure_code').text();
-
-		if(!svgElement) {
-			console.error('No se encontró ningún SVG.');
-			return;
-		}
-
-		const clonedSvg = svgElement.cloneNode(true);
-		const width = parseInt(clonedSvg.getAttribute('width') || 800);
-		const height = parseInt(clonedSvg.getAttribute('height') || 600);
-
-		// Embebemos los estilos de Mermaid en el SVG
-		const style = document.createElement('style');
-		style.textContent = Array.from(document.styleSheets)
-			.filter(s => !s.href || s.href.startsWith(window.location.origin))
-			.map(sheet => {
-				try {
-					return Array.from(sheet.cssRules).map(rule => rule.cssText).join('\n');
-				} catch (e) {
-					return '';
-				}
-			})
-			.join('\n');
-		clonedSvg.insertBefore(style, clonedSvg.firstChild);
-		const svgData = new XMLSerializer().serializeToString(clonedSvg);
-		const svgBase64 = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svgData)));
-
-		const img = new Image();
-		img.onload = function () {
-			const canvas = document.createElement('canvas');
-			canvas.width = width;
-			canvas.height = height;
-			const ctx = canvas.getContext('2d');
-			ctx.fillStyle = '#ffffff';
-			ctx.fillRect(0, 0, canvas.width, canvas.height);
-
-			ctx.drawImage(img, 0, 0);
-
-			const pngUrl = canvas.toDataURL('image/png');
-			const link = document.createElement('a');
-			link.href = pngUrl;
-			link.download = filename;
-			document.body.appendChild(link);
-			link.click();
-			document.body.removeChild(link);
-		};
-		img.src = svgBase64;
-	}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 213
src/main/resources/templates/procedure_versions.html

@@ -1,213 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	  xmlns:th="http://www.thymeleaf.org"
-	  lang="es">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-<body id="page-top">
-
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper" style="margin-top:-20px !important">
-		
-		<div class="container uv-home-section" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info">
-					<div class="uv-table-title">
-						<span><strong>Borradores disponibles de la tarea:</strong></span>
-
-						<div class="row">
-							<div class="col-8">
-								<select class="selectpicker" id="versionSelector" name="versions" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-									<option th:each="item,i : ${versions}" th:value="${item.dataMod}" th:text="${item.usuari + ' - ' + item.dataMod}"></option>
-								</select>
-							</div>
-							<div class="col-4"><span class="btn btn-primary pointer" onclick="restoreDraft();">Restaurar</span></div>
-						</div>
-
-
-					</div>
-					<hr class="uv-procedure-hr">
-				</div>
-				<div class="uv-table-group">
-					<textarea id="editor" name="evidencia_text" th:text="''"></textarea>
-				</div>
-				<div class="uv-accordion" style="margin-top:20px;text-align:center;">
-					
-				</div> 
-			</div>
-		</div>
-	</div>
-    <input type="hidden" id="idInstanciaTasca" th:value="${idInstanciaTasca}">
-
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-    <script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-  
-
-    <script th:inline="javascript">
-	    if (!window.Worker) {
-	    	alert(/*[[#{procedures.nosupported}]]*/);
-			window.location = '/';
-    	}
-    	var aliveWorker; 
-		var saveWorker;
-    	function confirmDelete(){ }
-	    function confirmClear(){ }
-	    function setSaveInterval(){
-	    	console.log('AutoSave enabled');
-	    	saveWorker = new Worker(/*[[@{/js/workers/autosave_worker.js}]]*/);
-	    	saveWorker.onmessage = triggerSave;
-	    }
-	    function setAliveInterval(){
-	    	console.log('KeepAlive enabled');
-	    	aliveWorker = new Worker(/*[[@{/js/workers/alive_worker.js}]]*/);
-	    	aliveWorker.onmessage = keepalive;
-	    }
-	    var tinyplugins = 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists charmap quickbars checklist tinycomments';
-	    var tinytoolbar = 'save | undo redo | bold italic underline strikethrough | forecolor backcolor | fontfamily fontsize | removeformat | alignleft aligncenter alignright alignjustify | outdent indent | numlist bullist | showcomments | charmap | topdf | fullscreen ';
-    	var tinymenu = 'file edit';
-    	var tinytable = 'tableinsertrowbefore tableinsertrowafter tabledeleterow';
-    	var tinycontextmenu = '';
-    	var tinytableappearance = false;
-    	var tinytableclass = [];
-    	var tinytableresizebars = false;
-    	var tinyadvtab = false;
-    	var tinyobjectresizing = false;
-    	function tinyconfigure(editor){
-    		editor.on('keydown', function(e) {
-				if (e.keyCode == 8 || e.keyCode == 46) { //backspace and delete keycodes
-                    try {
-                        var elem = tinymce.activeEditor.selection.getNode(); //current caret node
-                        console.log(elem);
-                        if (elem.classList.contains("mceNonEditable")) {
-                        	e.preventDefault();
-                            return false;
-                        }
-                    } catch (e) {console.log(e);}
-                }
-			});		
-			
-			editor.ui.registry.addIcon('save', '<i style="font-size:125%;" class="fas fa-save"></i>')
-				
-			editor.ui.registry.addButton('topdf', {
-				icon: 'print',
-				tooltip: 'Imprimir a PDF',
-		      	onAction: function(_){ 
-		      		print_to_pdf(editor.getContent());
-		      	}
-		    });	
-			
-			editor.on('FullscreenStateChanged', function () {
-				if(tinymce.activeEditor.plugins.fullscreen.isFullscreen()){
-					var e = '<span id="exitFullScreen" class="btn btn-primary pointer" style="position:absolute;display:none;float:right;right:15px;top:25px;color:white;background-color:#007bff;padding:8px;cursor:pointer;" onclick="tinymce.activeEditor.execCommand('+"'mceFullScreen'"+');">Volver a SAIC <i class="fas fa-compress-arrows-alt"></i></span>';
-					$(e).appendTo($($('.tox-editor-container').get(0)));
-					$('#exitFullScreen').show();
-				}
-				else{
-					$('#exitFullScreen').remove();	
-					
-				}
-			});	
-    	}
-	</script>
-
-  	<script type="text/javascript">
-
-    var locale = "[[${#locale.language}]]";
-	var fileInvalid = "[[#{procedures.extensionAlert}]]";
-	var fullname = "[[${#authentication.principal.nom + ' ' + #authentication.principal.cognoms}]]";
-	var username = "[[${#authentication.principal.usuari}]]";
-	var msgsave = "[[#{procedures.editor.msgsave}]]";
-	var expiredTxt = "[[#{procedures.session.expired}]]";
-	var layout;
-	var lastActiveTime = new Date().getTime();
-	var manualDraftSave = false;
-
-        $(document).ready(function(){
-            layout = new Layout("");
-            layout.initTableLayout({paging:false});
-            layout.closeLoadingSpinner(".uv-loading-spinner");
-            $('#versionSelector').change(getDraft);
-
-            tinymce.init({ 
-                selector: '#editor',
-                language: locale,
-                browser_spellcheck: true,
-                plugins: tinyplugins,
-                menubar: tinymenu,
-                toolbar: tinytoolbar,
-                table_toolbar: tinytable,
-                tinycomments_author: username,
-                tinycomments_author_name: fullname,
-                tinycomments_mode: 'embedded',
-                tinycomments_can_delete: function(req, done, fail){ done({canDelete: true}); },
-                table_advtab: tinyadvtab,
-                table_row_advtab: tinyadvtab,
-                table_cell_advtab: tinyadvtab,
-                table_sizing_mode: 'fixed',
-                table_default_styles: {
-                    width: '297mm'
-                },
-                content_style: "body { width: 297mm; max-width: 297mm; font-size: 10pt; font-family: Verdana, Geneva, sans-serif; font-style: normal; font-variant: normal;}",
-                font_formats: "Arial=arial,helvetica,sans-serif; Verdana=verdana,geneva;", 
-                font_size_formats: '8pt 10pt 12pt 14pt 16pt 18pt 24pt',
-                setup: tinyconfigure,
-                save_onsavecallback: function(){save_content();},
-                content_langs: [
-                    {title: 'Español', code: 'es'},
-                    {title: 'Valencià', code: 'ca'}],   
-                image_advtab: true,
-                importcss_append: true,
-                height: 700,
-                image_caption: true,
-                quickbars_selection_toolbar: '',
-                toolbar_mode: 'sliding',
-                contextmenu: tinycontextmenu,
-                table_appearance_options: tinytableappearance,
-                table_class_list: tinytableclass,
-                table_resize_bars: tinytableresizebars
-		    });
-
-			window.setTimeout(getDraft, 2000);
-
-        });
-
-        function getDraft(){
-            $.get(`/procedure/draft/${$('#idInstanciaTasca').val()}`, {dataMod: $('#versionSelector').val()}, function(obj){
-				var data = $($.parseHTML(obj.text)).find('#editorContent').html();
-				tinymce.activeEditor.setContent(obj.text);
-			});
-        }
-
-		function restoreDraft(){
-			$.post(`/procedure/draft/${$('#idInstanciaTasca').val()}`, {dataMod: $('#versionSelector').val()}, function(data){
-				if(data === '1'){
-					alert('Borrador restaurado correctamente. Cierre esta ventana y actualice la página del procedimiento para ver los cambios.');
-				}
-				else{
-					alert('No se ha podido restaurar el borrador.');
-				}
-			});
-
-		}
-
-    </script>
-
-</body>
-
-</html>

+ 0 - 330
src/main/resources/templates/procedures.html

@@ -1,330 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group new_access" th:if="${new_access}" style="float:right;margin-top:-35px;">
-					<div class="row uv-mar-t-20">
-						<span class="alert alert-warning alert-dismissible fade show" role="alert">
-							<span th:text="#{login.session.info1}"></span>
-							<br>
-							<span th:text="#{login.session.info2}"></span>
-							<button type="button" class="close" data-dismiss="alert" aria-label="Close">
-						    	<span aria-hidden="true">&times;</span>
-						  	</button>
-						</span>
-					</div>
-				</div>
-				<div class="uv-table-group-procedure-info">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{procedures.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{procedures.subtitle}"></span>
-						<hr class="uv-procedure-hr">
-					</div>
-					<div class="col">
-						<span class="legend-active" style="cursor:pointer;" onclick="filter('active');"><span th:text="#{procedures.legend.active}">Activa</span></span>
-						<span class="legend-expired" style="cursor:pointer;" onclick="filter('expired');"><span th:text="#{procedures.legend.expired}">Atrasada</span></span>
-						
-						<div class="btn-toolbar" role="toolbar" style="float:right;margin-top:-7px;">
-							<div class="btn-group mr-2 w-auto ml-auto" role="group" aria-label="Acciones sobre la lista de tareas pendientes">
-								<button class="btn btn-secondary pointer" style="width:38px; height:38px;" onclick="download();" th:title="#{supervision.filter.download1}"><i class="fas fa-file-excel"></i></button>
-								<button class="btn btn-secondary pointer" style="width:38px; height:38px;" onclick="reset();" th:title="#{supervision.filter.none}"><svg style="width:20px;height:20px;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="122.88px" height="110.668px" viewBox="0 0 122.88 110.668" enable-background="new 0 0 122.88 110.668" xml:space="preserve"><g><path fill="#FFFFFF" fill-rule="evenodd" clip-rule="evenodd" d="M91.124,15.645c12.928,0,23.406,10.479,23.406,23.406 c0,12.927-10.479,23.406-23.406,23.406c-12.927,0-23.406-10.479-23.406-23.406C67.718,26.125,78.197,15.645,91.124,15.645 L91.124,15.645z M2.756,0h117.322c1.548,0,2.802,1.254,2.802,2.802c0,0.848-0.368,1.622-0.996,2.139l-10.667,13.556 c-1.405-1.375-2.95-2.607-4.614-3.672l6.628-9.22H9.43l37.975,46.171c0.59,0.516,0.958,1.254,0.958,2.102v49.148l21.056-9.623 V57.896c1.651,1.9,3.548,3.582,5.642,4.996v32.133c0,1.105-0.627,2.064-1.586,2.506l-26.476,12.758 c-1.327,0.773-3.023,0.332-3.798-1.033c-0.258-0.441-0.368-0.92-0.368-1.4V55.02L0.803,4.756c-1.07-1.106-1.07-2.839,0-3.945 C1.355,0.258,2.056,0,2.756,0L2.756,0z M96.93,28.282c1.328-1.349,3.489-1.355,4.825-0.013c1.335,1.342,1.341,3.524,0.013,4.872 l-5.829,5.914l5.836,5.919c1.317,1.338,1.299,3.506-0.04,4.843c-1.34,1.336-3.493,1.333-4.81-0.006l-5.797-5.878l-5.807,5.889 c-1.329,1.349-3.489,1.355-4.826,0.013c-1.335-1.342-1.341-3.523-0.013-4.872l5.83-5.913l-5.836-5.919 c-1.317-1.338-1.3-3.507,0.04-4.843c1.339-1.336,3.492-1.333,4.81,0.006l5.796,5.878L96.93,28.282L96.93,28.282z"/></g></svg></button>
-								<button class="btn btn-secondary pointer" style="width:38px; height:38px;" onclick="sort('date');" th:title="#{supervision.filter.date}"><i class="sort-btn-date fas fa-sort-numeric-up"></i></button>
-								<button class="btn btn-secondary pointer" style="width:38px; height:38px;" onclick="sort('alpha');" th:title="#{supervision.filter.apha}"><i class="sort-btn-alpha fas fa-sort-alpha-up"></i></button>
-							</div>
-						</div>
-						
-					</div>
-				</div>
-				<hr class="uv-procedure-hr">
-				<div th:if="${procedure_list != null}">
-					<div th:if="${#lists.size(procedure_list) == 0}">
-						<br>
-						<span th:text="#{global.noTasks}"></span>
-					</div>
-				</div>
-				<div id="uv-procedure-container">
-					<div class="uv-table-group-procedure" th:each="item,id : ${procedure_list}" th:attr="onclick='openProcedure('+${item.idInstancia}+')', data-id=${item.idInstancia}, data-alpha=${item.nomProces}, data-name=${item.titolCas}, data-date=${item.dataTascaActiva == null ? '0' : #dates.format(item.dataTascaActiva, 'yyyy-MM-dd')}" 
-					th:classappend="${(item.tascaActivaExpired == true?'procedure-expired':'procedure-active')}">
-						<div class="uv-table-title procedure">
-							<input type="hidden" proc_val="id" th:value="${item.idInstancia}">
-							<input type="hidden" proc_val="code" th:value="${item.nomProces}">
-							<input type="hidden" proc_val="name" th:value="${#locale.language} == 'es' ? ${item.titolCas}:${item.titolVal}">
-							<input type="hidden" proc_val="year" th:value="${item.cursAvaluat-1}+' - '+${item.cursAvaluat}">
-							<input type="hidden" proc_val="center" th:value="${#locale.language} == 'es' ? ${item.centreCas}:${item.centreVal}">
-							<input type="hidden" proc_val="tit" th:value="${#locale.language} == 'es' ? ${item.titulacioCas}:${item.titulacioVal}">
-							<input type="hidden" proc_val="status" th:value="${item.estat}">
-							<input type="hidden" proc_val="datelim" th:value="${#dates.format(item.dataLimTascaActiva, 'dd-MM-yyyy')}">
-							<input type="hidden" proc_val="date" th:value="${#dates.format(item.dataTascaActiva, 'dd-MM-yyyy')}">
-							<input type="hidden" proc_val="t_active" th:value="${#locale.language} == 'es' ? ${item.nomTascaActivaCas}:${item.nomTascaActivaVal}">
-							<div class="row">
-								<div class="col-md-12">
-									<span>
-										<strong th:text="${item.nomProces}"></strong>
-										<span th:text="${#locale.language} == 'es' ? ${item.titolCas}:${item.titolVal}"></span>
-									</span>
-								</div>
-								<div class="w-100"></div>
-								<div class="col-md-7">
-									<span><strong th:text="#{procedures.center}"></strong>: <span th:text="${#locale.language} == 'es' ? ${item.centreCas}:${item.centreVal}"></span></span>
-									<br>
-									<span><strong th:text="#{procedures.titulation}"></strong>: <span th:text="${#locale.language} == 'es' ? ${item.titulacioCas}:${item.titulacioVal}"></span></span>
-									<br>
-									<span><strong th:text="#{procedures.year.eval}"></strong>: <span th:text="${item.cursAvaluat-1}"></span> - <span th:text="${item.cursAvaluat}"></span></span>
-									(<span th:text="#{procedures.year.act}"></span> 
-									<span><span th:text="${item.cursActivacio-1}"></span> - <span th:text="${item.cursActivacio}"></span></span>)
-								</div>	
-								<div class="col-md-5">
-									<span>
-										<strong th:text="#{procedures.activeTask}"></strong>: <span th:text="${#locale.language} == 'es' ? ${item.nomTascaActivaCas}:${item.nomTascaActivaVal}"></span>
-										<br>
-										<span><strong th:text="#{procedures.dateInstance}"></strong>: <span th:text="${#dates.format(item.dataTascaActiva, 'dd-MM-yyyy')}"></span></span>
-										<br>
-										<span><strong th:text="#{procedures.dateLimit}"></strong>: <span th:text="${#dates.format(item.dataLimTascaActiva, 'dd-MM-yyyy')}"></span></span>
-									</span>
-								</div>
-								<div class="w-100"></div>
-								<div class="col">
-									<p th:text="${#locale.language} == 'es' ? ${item.descripcioCas}:${item.descripcioVal}"></p>
-								</div>
-							</div>
-						</div>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/csv-to-xls/xlsx-0.20.0.min.js}"></script>
-  
-	<script type="text/javascript">
-	
-		var sort_key = getCookie('sort_key');
-		var sort_typ = getCookie('sort_typ');
-		var filter_act = getCookie('filter');
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			if(sort_key != '' && sort_typ != ''){
-				sort_initial(sort_key, sort_typ);
-			}
-			if(filter_act != ''){
-				filter(filter_act);
-			}
-		});
-		
-		function openProcedure(id){
-			window.location.replace('/procedure/'+id);
-		}
-		
-		function filter(t){
-			if(t != 'none'){
-				$('.uv-table-group-procedure').hide();
-				$('.procedure-'+t).show();
-				setCookie('filter', t, 1);
-			}
-		}
-		
-		function downloaddd(){
-			var rows = [];
-			rows.push(['instancia','codigo','procedimiento','curso','centro','titulacion','estado','tarea_activa','fecha instancia','fecha vencimiento']);
-			$('.uv-table-group-procedure:visible').each(function(i, d){
-				rows.push([$(d).find("input[proc_val='id']").first().val(),
-						  $(d).find("input[proc_val='code']").first().val(),
-						  $(d).find("input[proc_val='name']").first().val(),
-						  $(d).find("input[proc_val='year']").first().val(),
-						  $(d).find("input[proc_val='center']").first().val(),
-						  $(d).find("input[proc_val='tit']").first().val(),
-						  $(d).find("input[proc_val='status']").first().val(),
-						  $(d).find("input[proc_val='t_active']").first().val(),
-						  $(d).find("input[proc_val='date']").first().val(),
-						  $(d).find("input[proc_val='datelim']").first().val()]);
-			});
-			var csv = rows.map(e => e.join(",")).join("\n");
-			downloadBlob(csv, 'export.csv', 'text/csv;charset=utf-8;');
-		}
-		
-		function download(){
-			var rows = [];
-			$('.uv-table-group-procedure:visible').each(function(i, d){
-				rows.push({"instancia":$(d).find("input[proc_val='id']").first().val(),
-							"codigo":$(d).find("input[proc_val='code']").first().val(),
-							"procedimiento":$(d).find("input[proc_val='name']").first().val(),
-							"curso":$(d).find("input[proc_val='year']").first().val(),
-							"centro":$(d).find("input[proc_val='center']").first().val(),
-							"titulacion":$(d).find("input[proc_val='tit']").first().val(),
-							"estado":$(d).find("input[proc_val='status']").first().val(),
-							"tarea_activa":$(d).find("input[proc_val='t_active']").first().val(),
-							"fecha_instancia":$(d).find("input[proc_val='date']").first().val(),
-							"fecha_vencimiento":$(d).find("input[proc_val='datelim']").first().val()});
-			});
-			const sheet = XLSX.utils.json_to_sheet(rows);
-			const book = XLSX.utils.book_new();
-			XLSX.utils.book_append_sheet(book, sheet, "datos");
-			XLSX.writeFile(book, "export.xlsx", { compression: true });
-		}
-		
-		function downloadBlob(content, filename, contentType) {
-			var blob = new Blob([content], { type: contentType });
-			var url = URL.createObjectURL(blob);
-			var pom = document.createElement('a');
-			pom.href = url;
-			pom.setAttribute('download', filename);
-			pom.click();
-		}
-		
-		function reset(){
-			$('.uv-table-group-procedure').show();
-			sort_initial('name', 'asc');
-			setCookie('filter', 'none', 1);
-			setCookie('sort_key', 'name', 1);
-			setCookie('sort_typ', 'asc', 1);
-		}
-		
-		function comparator_desc(a, b) {
-			if (a.dataset[sort_key] == null || a.dataset[sort_key] == undefined)
-				return -1;
-            if (a.dataset[sort_key] > b.dataset[sort_key])
-                return -1;
-            if (a.dataset[sort_key] < b.dataset[sort_key])
-                return 1;
-            return 0;
-        }
-        
-        function comparator_asc(a, b) {
-			if (a.dataset[sort_key] == null || a.dataset[sort_key] == undefined)
-				return 1;
-            if (a.dataset[sort_key] < b.dataset[sort_key])
-                return -1;
-            if (a.dataset[sort_key] > b.dataset[sort_key])
-                return 1;
-            return 0;
-        }
-        
-        function sort_initial(k, t){
-        	var subjects = document.querySelectorAll(".uv-table-group-procedure");
-            var subjectsArray = Array.from(subjects);
-            if(t == 'asc'){
-				sorted = subjectsArray.sort(comparator_asc);
-            }
-            else{
-            	sorted = subjectsArray.sort(comparator_desc);
-            }
-            sorted.forEach(e =>
-            document.querySelector("#uv-procedure-container")
-            		.appendChild(e));
-            sort_change_icons(sort_key, sort_typ);
-        }
-          
-        function sort(k) {
-        	sort_key = k;
-        	var subjects = document.querySelectorAll(".uv-table-group-procedure");
-            var subjectsArray = Array.from(subjects);
-            let sorted;
-        	if(sort_typ === '' || sort_typ == 'desc'){
-				sort_typ = 'asc';
-				sorted = subjectsArray.sort(comparator_asc);
-			}
-			else{
-				sort_typ = 'desc';
-				sorted = subjectsArray.sort(comparator_desc);
-			}
-            sorted.forEach(e =>
-                document.querySelector("#uv-procedure-container")
-                		.appendChild(e));
-                    
-            sort_change_icons(sort_key, sort_typ);
-			
-			setCookie('sort_key', sort_key, 1);
-			setCookie('sort_typ', sort_typ, 1);
-        }
-        
-        function sort_change_icons(k, t){
-        	if(k == 'alpha'){
-				$('.sort-btn-alpha').removeClass('fa-sort-alpha-down');
-				$('.sort-btn-alpha').removeClass('fa-sort-alpha-up');
-				if(t == 'asc'){
-					$('.sort-btn-alpha').addClass('fa-sort-alpha-up');
-				}
-				else{
-					$('.sort-btn-alpha').addClass('fa-sort-alpha-down');
-				}	
-			}
-			else if(k == 'date'){
-				$('.sort-btn-date').removeClass('fa-sort-numeric-down');
-				$('.sort-btn-date').removeClass('fa-sort-numeric-up');
-				if(t == 'asc'){
-					$('.sort-btn-date').addClass('fa-sort-numeric-up');
-				}
-				else{
-					$('.sort-btn-date').addClass('fa-sort-numeric-down');
-				}
-			}
-        }
-        
-		function setCookie(cname, cvalue, exdays) {
-			const d = new Date();
-			d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
-			let expires = "expires="+d.toUTCString();
-			document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
-		}
-		
-		function getCookie(cname) {
-			let name = cname + "=";
-			let ca = document.cookie.split(';');
-			for(let i = 0; i < ca.length; i++) {
-				let c = ca[i];
-				while (c.charAt(0) == ' ') {
-					c = c.substring(1);
-				}
-				if (c.indexOf(name) == 0) {
-					return c.substring(name.length, c.length);
-				}
-			}
-			return "";
-		}
-		
-		
-	</script>
-	
-	<script th:if="${new_access}">
-		setTimeout(function(){ $('.new_access').hide(); }, 10000);
-	</script>
-
-</body>
-
-</html>

+ 0 - 190
src/main/resources/templates/supervision.html

@@ -1,190 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="#{supervision.title}"></h6>
-						<hr class="uv-procedure-hr">
-						<span th:text="#{supervision.subtitle}"></span>
-					</div>
-				</div>
-				<form enctype='multipart/form-data' method="POST" action="/supervision/search">
-					<div class="uv-table-group-procedure" th:if="${granted}">
-						<label th:text="#{supervision.searchBy}">Cercar per </label>
-						<select class="selectpicker" id="typeSelector" name="searchType" data-width="100%" required>
-					        <option th:text="#{supervision.procedures}" value="procedures" selected></option>
-					        <option th:text="#{supervision.evidences}" value="evidences"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure" th:if="${sup_cents != null and granted}">
-						<label th:text="#{supervision.centers}">Centre(s)</label>
-						<select class="selectpicker" id="centersSelector" name="centers[]" data-live-search="true" multiple data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${sup_cents}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{supervision.titulations}">Titulació(ns)</label>
-						<select class="selectpicker" id="titulationsSelector" name="titulations[]" data-live-search="true" multiple data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${sup_orgs}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{supervision.years}">Curs(os)</label>
-						<select class="selectpicker" id="yearsSelector" name="years[]" data-live-search="true" multiple data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${sup_years}" th:text="${item.text}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure" id="proceduresContainer">
-						<label th:text="#{supervision.procedures}">Proces(os)</label>
-						<select class="selectpicker" id="proceduresSelector" name="procedures[]" data-live-search="true" multiple data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${sup_procs}" th:text="${#locale.language} == 'es' ? ${item.text2}:${item.text3}" th:attr="value=${item.text}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure" th:if="${sup_evs != null and granted}" id="evidencesContainer">
-						<label th:text="#{supervision.evidences}">Evidencia(es)</label>
-						<select class="selectpicker" id="evidencesSelector" name="evidences[]" data-live-search="true" multiple data-width="100%" data-actions-box="true">
-					        <option th:each="item : ${sup_evs}" th:text="${#locale.language} == 'es' ? ${item.text} + ', ' +${item.text2}:${item.text} + ', ' +${item.text3}" th:attr="value=${item.text}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure" style="margin-top:50px;">
-						<button th:text="#{supervision.search}" class="btn btn-primary">Cargar</button>
-					</div>
-				</form>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	
-	<script th:inline="javascript" th:if="${restore == null}" type="text/javascript">
-		var restore = 0; 
-	</script>
-	
-	<script th:inline="javascript" th:if="${restore != null}" type="text/javascript">
-		var restore = 1;
-		function restore_search(){
-			$('#typeSelector').selectpicker('val', /*[[${restore.searchType}]]*/);
-			$('#centersSelector').selectpicker('val', /*[[${restore.centres}]]*/);
-			$.post("/ajax/search/titulations", {'centers[]':$('#centersSelector').val()}, function(data){ 
-				$("#titulationsSelector").html(data).selectpicker('refresh'); 
-				$('#titulationsSelector').selectpicker('val', /*[[${restore.titulacions}]]*/);
-				var params = (($('#centersSelector')) ? {'centers[]':$('#centersSelector').val(), 'titulations[]':$('#titulationsSelector').val()} : {'titulations[]':$('#titulationsSelector').val()});
-				$.post("/ajax/search/years", params, function(data){ 
-					$("#yearsSelector").html(data).selectpicker('refresh'); 
-					$('#yearsSelector').selectpicker('val', /*[[${restore.cursos}]]*/);	
-					var params = (($('#centersSelector')) ? {'centers[]':$('#centersSelector').val(), 'titulations[]':$('#titulationsSelector').val(), 'years[]':$('#yearsSelector').val()} : {'titulations[]':$('#titulationsSelector').val(), 'years[]':$('#yearsSelector').val()});
-					if($('#typeSelector').val() == 'evidences'){ 
-						$.post("/ajax/search/evidences", params, function(data){ 
-							$("#evidencesSelector").html(data).selectpicker('refresh');
-							$('#evidencesSelector').selectpicker('val', /*[[${restore.evidencies}]]*/);
-						}); 
-					}
-					else { 
-						$.post("/ajax/search/procedures", params, function(data){ 
-							$("#proceduresSelector").html(data).selectpicker('refresh'); 
-							$('#proceduresSelector').selectpicker('val', /*[[${restore.procediments}]]*/);
-						}); 
-					}
-				});
-			});
-		}
-	</script>
-	
-	<script type="text/javascript">
-	
-		
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			if($('#centersSelector')){ $('#centersSelector').change(complete_titulations); }
-			$('#titulationsSelector').change(complete_years);
-			$('#yearsSelector').change(complete_procedures);
-			if($('#typeSelector')){ $('#evidencesContainer').hide(); $('#typeSelector').change(change_type); }
-			if(restore == 1){
-				restore_search();
-			}
-		});
-		
-		function complete_titulations(){
-			$.post("/ajax/search/titulations", {'centers[]':$('#centersSelector').val()}, function(data){ $("#titulationsSelector").html(data).selectpicker('refresh'); });
-		}
-		
-		function complete_years(){
-			var params = (($('#centersSelector')) ? {'centers[]':$('#centersSelector').val(), 'titulations[]':$('#titulationsSelector').val()} : {'titulations[]':$('#titulationsSelector').val()});
-			$.post("/ajax/search/years", params, function(data){ $("#yearsSelector").html(data).selectpicker('refresh'); });
-		}
-		
-		function complete_procedures(){
-			var params = (($('#centersSelector')) ? {'centers[]':$('#centersSelector').val(), 'titulations[]':$('#titulationsSelector').val(), 'years[]':$('#yearsSelector').val()} : {'titulations[]':$('#titulationsSelector').val(), 'years[]':$('#yearsSelector').val()});
-			if($('#typeSelector').val() == 'evidences'){ $.post("/ajax/search/evidences", params, function(data){ $("#evidencesSelector").html(data).selectpicker('refresh'); }); }
-			else { $.post("/ajax/search/procedures", params, function(data){ $("#proceduresSelector").html(data).selectpicker('refresh'); }); }
-		}
-		
-		function change_type(){
-			if($('#typeSelector').val() == 'procedures'){
-				$('#proceduresContainer').show();
-				$('#proceduresSelector').attr('required', true);
-				$('#evidencesContainer').hide();
-				$('#evidencesSelector').attr('required', false);
-				
-				$("#centersSelector").val('default').selectpicker("refresh");
-				$("#titulationsSelector").val('default').selectpicker("refresh");
-				$("#yearsSelector").val('default').selectpicker("refresh");
-				$("#proceduresSelector").val('default').selectpicker("refresh");
-				$("#evidencesSelector").val('default').selectpicker("refresh");
-			}
-			else{
-				$('#proceduresContainer').hide();
-				$('#proceduresSelector').attr('required', false);
-				$('#evidencesContainer').show();
-				$('#evidencesSelector').attr('required', true);
-				
-				$("#centersSelector").val('default').selectpicker("refresh");
-				$("#titulationsSelector").val('default').selectpicker("refresh");
-				$("#yearsSelector").val('default').selectpicker("refresh");
-				$("#proceduresSelector").val('default').selectpicker("refresh");
-				$("#evidencesSelector").val('default').selectpicker("refresh");
-			}
-		}
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 398
src/main/resources/templates/supervisionProcedures.html

@@ -1,398 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info">
-					<h6 class="uv-table-header-h6" th:text="#{supervision.procedures.title}"></h6>
-					<hr class="uv-procedure-hr">
-					<div class="col">
-						<span class="legend-active" style="cursor:pointer;" onclick="filter('active');"><span th:text="#{procedures.list.legend.active}">Activo</span></span>
-						<span class="legend-active-other" style="cursor:pointer;" onclick="filter('active-other');"><span th:text="#{procedures.list.legend.other}">No corresponde</span></span>
-						<span class="legend-expired" style="cursor:pointer;" onclick="filter('expired');"><span th:text="#{procedures.list.legend.expired}">Atrasado</span></span>
-						<span class="legend-done" style="cursor:pointer;" onclick="filter('done');"><span th:text="#{procedures.list.legend.done}">Finalizado</span></span>
-						<span class="legend-none" style="cursor:pointer;float:right;margin-top:-8px;margin-left:5px;" onclick="download();" th:title="#{supervision.filter.download1}"><i style="width:20px;height:20px;" class="fas fa-file-csv"></i></span>
-						<span class="legend-none" style="cursor:pointer;float:right;margin-top:-8px;margin-left:5px;" onclick="downloadReport();" th:title="#{supervision.filter.download2}"><i style="width:20px;height:20px;" class="fas fa-file-excel"></i></span>
-						<span class="legend-none" style="cursor:pointer;float:right;margin-top:-8px;margin-left:5px;" onclick="reset();" th:title="#{supervision.filter.none}"><svg style="width:20px;height:20px;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="122.88px" height="110.668px" viewBox="0 0 122.88 110.668" enable-background="new 0 0 122.88 110.668" xml:space="preserve"><g><path fill-rule="evenodd" clip-rule="evenodd" d="M91.124,15.645c12.928,0,23.406,10.479,23.406,23.406 c0,12.927-10.479,23.406-23.406,23.406c-12.927,0-23.406-10.479-23.406-23.406C67.718,26.125,78.197,15.645,91.124,15.645 L91.124,15.645z M2.756,0h117.322c1.548,0,2.802,1.254,2.802,2.802c0,0.848-0.368,1.622-0.996,2.139l-10.667,13.556 c-1.405-1.375-2.95-2.607-4.614-3.672l6.628-9.22H9.43l37.975,46.171c0.59,0.516,0.958,1.254,0.958,2.102v49.148l21.056-9.623 V57.896c1.651,1.9,3.548,3.582,5.642,4.996v32.133c0,1.105-0.627,2.064-1.586,2.506l-26.476,12.758 c-1.327,0.773-3.023,0.332-3.798-1.033c-0.258-0.441-0.368-0.92-0.368-1.4V55.02L0.803,4.756c-1.07-1.106-1.07-2.839,0-3.945 C1.355,0.258,2.056,0,2.756,0L2.756,0z M96.93,28.282c1.328-1.349,3.489-1.355,4.825-0.013c1.335,1.342,1.341,3.524,0.013,4.872 l-5.829,5.914l5.836,5.919c1.317,1.338,1.299,3.506-0.04,4.843c-1.34,1.336-3.493,1.333-4.81-0.006l-5.797-5.878l-5.807,5.889 c-1.329,1.349-3.489,1.355-4.826,0.013c-1.335-1.342-1.341-3.523-0.013-4.872l5.83-5.913l-5.836-5.919 c-1.317-1.338-1.3-3.507,0.04-4.843c1.339-1.336,3.492-1.333,4.81,0.006l5.796,5.878L96.93,28.282L96.93,28.282z"/></g></svg></span>
-						<span class="legend-none" style="cursor:pointer;float:right;margin-top:-8px;margin-left:5px;" onclick="sort('date');" th:title="#{supervision.filter.date}"><i style="width:20px;height:20px;" class="sort-btn-date fas fa-sort-numeric-up"></i></span>
-						<span class="legend-none" style="cursor:pointer;float:right;margin-top:-8px;margin-left:5px;" onclick="sort('alpha');" th:title="#{supervision.filter.apha}"><i style="width:20px;height:20px;" class="sort-btn-alpha fas fa-sort-alpha-up"></i></span>
-					</div>
-				</div>
-				<hr class="uv-procedure-hr">
-				<div id="uv-procedure-container">
-					<div class="uv-table-group-procedure" th:each="item,id : ${procedure_list}" th:attr="onclick='openProcedure('+${item.idInstancia}+')', data-id=${item.idInstancia}, data-alpha=${item.nomProces}, data-name=${item.titolCas}, data-date=${item.dataTascaActiva == null ? '0' : #dates.format(item.dataTascaActiva, 'yyyy-MM-dd')}" 
-					th:classappend="${(item.estat == 'A' and item.tascaActivaAssignedToUser?'procedure-active ':'') + (item.estat == 'A' and not item.tascaActivaAssignedToUser?'procedure-active-other ':'') + (item.estat == 'C'?'procedure-cancelled ':'') + (item.estat == 'C' or item.estat == 'F'?'procedure-done ':'') + (item.tascaActivaExpired == true?'procedure-expired ':'')}">
-						<div class="uv-table-title procedure">
-							<input type="hidden" proc_val="id" th:value="${item.idInstancia}">
-							<input type="hidden" proc_val="code" th:value="${item.nomProces}">
-							<input type="hidden" proc_val="name" th:value="${#locale.language} == 'es' ? ${item.titolCas}:${item.titolVal}">
-							<input type="hidden" proc_val="year" th:value="${item.cursAvaluat-1}+' - '+${item.cursAvaluat}">
-							<input type="hidden" proc_val="center" th:value="${#locale.language} == 'es' ? ${item.centreCas}:${item.centreVal}">
-							<input type="hidden" proc_val="tit" th:value="${#locale.language} == 'es' ? ${item.titulacioCas}:${item.titulacioVal}">
-							<input type="hidden" proc_val="status" th:value="${item.estat}">
-							<input type="hidden" proc_val="datelim" th:value="${#dates.format(item.dataLimTascaActiva, 'dd-MM-yyyy')}">
-							<input type="hidden" proc_val="date" th:value="${#dates.format(item.dataTascaActiva, 'dd-MM-yyyy')}">
-							<input type="hidden" proc_val="t_active" th:value="${#locale.language} == 'es' ? ${item.nomTascaActivaCas}:${item.nomTascaActivaVal}">
-							<div class="row">
-								<div class="col-md-12">
-								<span style="float:right;font-size: 21px; margin-top: -10px;"><i class="fas fa-caret-down"></i></span>
-									<span>  
-										<strong th:text="${item.nomProces}"></strong>
-										<span th:text="${#locale.language} == 'es' ? ${item.titolCas}:${item.titolVal}"></span>
-									</span>
-								</div>
-								<div class="w-100"></div>
-								<div class="col-md-7">
-									<span><strong th:text="#{procedures.center}"></strong>: <span class="proc_name" th:text="${#locale.language} == 'es' ? ${item.centreCas}:${item.centreVal}"></span></span>
-									<br>
-									<span><strong th:text="#{procedures.titulation}"></strong>: <span class="proc_tit" th:text="${#locale.language} == 'es' ? ${item.titulacioCas}:${item.titulacioVal}"></span></span>
-									<br>
-									<span class="proc_year"><strong th:text="#{procedures.year.eval}"></strong>: <span th:text="${item.cursAvaluat-1}"></span> - <span th:text="${item.cursAvaluat}"></span></span>
-									(<span th:text="#{procedures.year.act}"></span> 
-									<span><span th:text="${item.cursActivacio-1}"></span> - <span th:text="${item.cursActivacio}"></span></span>)
-								</div>	
-								<div class="col-md-5" th:if="${item.estat == 'A'}">
-									<span>
-										<span th:text="#{procedures.activeTask}"></span>: <span th:text="${#locale.language} == 'es' ? ${item.nomTascaActivaCas}:${item.nomTascaActivaVal}"></span>
-										<br>
-										<span><span th:text="#{procedures.dateInstance}"></span>: <span th:text="${#dates.format(item.dataTascaActiva, 'dd-MM-yyyy')}"></span></span>
-										<br>
-										<span><span th:text="#{procedures.dateLimit}"></span>: <span th:text="${#dates.format(item.dataLimTascaActiva, 'dd-MM-yyyy')}"></span></span>
-									</span>
-								</div>
-								<div class="col-md-auto" th:if="${item.estat != 'A'}">
-									<strong class="float-right" th:if="${item.estat == 'F'}" th:text="#{procedures.closed}" style="margin-top:25px;"></strong>
-									<strong class="float-right" th:if="${item.estat == 'C'}" th:text="#{procedures.cancelled}" style="margin-top:25px;"></strong>
-								</div>
-								<div class="w-100"></div>
-								<div class="col">
-									<p th:text="${#locale.language} == 'es' ? ${item.descripcioCas}:${item.descripcioVal}"></p>
-								</div>
-							</div>
-						</div>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				<div class="uv-table-group procedure-status">
-					<a href="/supervision" class="btn btn-primary pointer" th:text="#{procedures.back}">Volver</a>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<!-- <script th:src="@{/js/csv-to-xls/xlsx-0.20.0.min.js}"></script> -->
-	<script th:src="@{/js/sheetjs/xlsx.min.js}"></script>
-  
-	<script type="text/javascript">
-	
-		var sort_key = getCookie('sort_key');
-		var sort_typ = getCookie('sort_typ');
-		var filter_act = getCookie('filter');
-		var req = new XMLHttpRequest();
-
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			if(sort_key != '' && sort_typ != ''){
-				sort_initial(sort_key, sort_typ);
-			}
-			if(filter_act != ''){
-				filter(filter_act);
-			}
-			
-		});
-		
-		function openProcedure(id){
-			window.location.replace('/procedure/'+id);
-		}
-		
-		function filter(t){
-			if(t != 'none'){
-				$('.uv-table-group-procedure').hide();
-				$('.procedure-'+t).show();
-				setCookie('filter', t, 1);
-			}
-		}
-		
-		function download(){
-			var rows = [];
-			$('.uv-table-group-procedure:visible').each(function(i, d){
-				rows.push({"Instancia":$(d).find("input[proc_val='id']").first().val(),
-							"Código":$(d).find("input[proc_val='code']").first().val(),
-							"Procedimiento":$(d).find("input[proc_val='name']").first().val(),
-							"Curso":$(d).find("input[proc_val='year']").first().val(),
-							"Centro":$(d).find("input[proc_val='center']").first().val(),
-							"Titulación":$(d).find("input[proc_val='tit']").first().val(),
-							"Estado":translateStatus($(d).find("input[proc_val='status']").first().val()),
-							"Tarea activa":$(d).find("input[proc_val='t_active']").first().val(),
-							"Fecha":$(d).find("input[proc_val='date']").first().val(),
-							"Vencimiento":$(d).find("input[proc_val='datelim']").first().val()});
-			});
-			
-			var col_sizes = [{wpx:80}, {wpx:70}, {wpx:250}, {wpx:70}, {wpx:250}, {wpx:250}, {wpx:90}, {wpx:150}, {wpx:70}, {wpx:70}];
-			var row_sizes = [{hpx: 25}];
-			rows.forEach(function(v, k){
-				row_sizes.push({hpx: 25});
-			});
-			
-			const sheet = XLSX.utils.json_to_sheet(rows);
-			sheet["!cols"] = col_sizes;
-			sheet["!rows"] = row_sizes;
-			const book = XLSX.utils.book_new();
-			XLSX.utils.book_append_sheet(book, sheet, "datos");
-			XLSX.writeFile(book, "export.xlsx", { compression: true });
-		}
-		
-		function downloadReport(){
-			var rows = [];
-			var cols = [];
-			const DEF_BORDER = {top: {style: 'thin', color: {rgb: 'FF000000'}}, 
-			          right: {style: 'thin', color: {rgb: 'FF000000'}}, 
-			          bottom: {style: 'thin', color: {rgb: 'FF000000'}}, 
-			          left: {style: 'thin', color: {rgb: 'FF000000'}}};
-			const DEF_ALIGNMENT = {horizontal: "center", 
-						 	 	   vertical: "center", 
-						 		   wrapText: true};
-			$('.uv-table-group-procedure:visible').each(function(i, d){
-				if(rows.find(o => o['Código'] === $(d).find("input[proc_val='code']").first().val()+' '+$(d).find("input[proc_val='year']").first().val()) === undefined){
-					rows.push({"Código":$(d).find("input[proc_val='code']").first().val()+' '+$(d).find("input[proc_val='year']").first().val()});
-				}
-				if(!cols.includes($(d).find("input[proc_val='tit']").first().val())){
-					cols.push($(d).find("input[proc_val='tit']").first().val());
-				}
-				var t = rows.find(o => o['Código'] === $(d).find("input[proc_val='code']").first().val()+' '+$(d).find("input[proc_val='year']").first().val());
-				t[$(d).find("input[proc_val='tit']").first().val()] = translateStatus($(d).find("input[proc_val='status']").first().val());
-			});
-			
-			rows.forEach(function(d){
-				cols.forEach(function(z){
-					if(!d.hasOwnProperty(z)){
-						d[z] = '';
-					}
-				});
-			});
-			
-			var col_sizes = [{wpx:120}];
-			var row_sizes = [{hpx: 40}, {hpx: 40}];
-			cols.forEach(function(v, k){
-				col_sizes.push({wpx:v.length*5});
-			});
-			
-			var sheet = XLSX.utils.json_to_sheet(rows, {origin: "A2"});
-			
-			sheet["!merges"] = [{s: {r: 0, c: 0}, e: {r: 0, c: cols.length}}];
-			XLSX.utils.sheet_add_aoa(sheet, [ ["PROCESOS SAIC"] ], {origin: "A1", skipHeader:true});
-			sheet['A1'].t = 's';
-			sheet['A1'].s = {font: {bold:true}, 
-							  fill: {patternType:"solid", 
-								     bgColor:{rgb:"FFA1A1A1"}, 
-								     fgColor:{rgb:"FFA1A1A1"}},
-							  alignment: DEF_ALIGNMENT,
-					 	 	  border: DEF_BORDER};						
-			
-			for(var i = 0; i<=cols.length; i++){
-				sheet[String.fromCharCode('A'.charCodeAt()+i)+'2'].t = 's';
-				sheet[String.fromCharCode('A'.charCodeAt()+i)+'2'].s = {font: {bold:true}, 
-								  fill: {patternType:"solid", 
-									     bgColor:{rgb:"FFBDD7EE"}, 
-									     fgColor:{rgb:"FFBDD7EE"}},
-								  alignment: DEF_ALIGNMENT,
-								  border: DEF_BORDER};	
-			}
-			for(var i = 3; i<=rows.length+2; i++){
-				sheet['A'+i].t = 's';
-				sheet['A'+i].s = {font: {bold:true}, 
-								  fill: {patternType:"solid", 
-									     bgColor:{rgb:"FFA1A1A1"}, 
-									     fgColor:{rgb:"FFA1A1A1"}},
-								  alignment: DEF_ALIGNMENT,
-						 	 	  border: DEF_BORDER};	
-				row_sizes.push({hpx: 25});
-			}
-			for(var i = 3; i<=rows.length+2;i++){
-				for(var j = 1; j<=cols.length; j++){
-					sheet[String.fromCharCode('A'.charCodeAt()+j)+i].t = 's';
-					sheet[String.fromCharCode('A'.charCodeAt()+j)+i].s = {
-									  fill: {patternType:"solid", 
-										     bgColor:{rgb:"FFD4D4D4"}, 
-										     fgColor:{rgb:"FFD4D4D4"}},
-									  alignment: DEF_ALIGNMENT,
-									  border: DEF_BORDER};
-				}
-			}
-			sheet["!cols"] = col_sizes;
-			sheet["!rows"] = row_sizes;
-			const book = XLSX.utils.book_new();
-			XLSX.utils.book_append_sheet(book, sheet, "datos");
-			XLSX.writeFile(book, "export.xlsx");
-		}
-		
-		function downloadBlob(content, filename, contentType) {
-			var blob = new Blob([content], { type: contentType });
-			var url = URL.createObjectURL(blob);
-			var pom = document.createElement('a');
-			pom.href = url;
-			pom.setAttribute('download', filename);
-			pom.click();
-		}
-		
-		function reset(){
-			$('.uv-table-group-procedure').show();
-			sort_initial('name', 'asc');
-			setCookie('filter', 'none', 1);
-			setCookie('sort_key', 'name', 1);
-			setCookie('sort_typ', 'asc', 1);
-		}
-		
-		function translateStatus(d){
-			if(d == 'A'){
-				return 'Activo/Pendiente';	
-			}
-			else if(d == 'F'){
-				return 'Finalizado';	
-			}
-			else{
-				return d;	
-			}
-		}
-		
-		function comparator_desc(a, b) {
-			if (a.dataset[sort_key] == null || a.dataset[sort_key] == undefined)
-				return -1;
-            if (a.dataset[sort_key] > b.dataset[sort_key])
-                return -1;
-            if (a.dataset[sort_key] < b.dataset[sort_key])
-                return 1;
-            return 0;
-        }
-        
-        function comparator_asc(a, b) {
-			if (a.dataset[sort_key] == null || a.dataset[sort_key] == undefined)
-				return 1;
-            if (a.dataset[sort_key] < b.dataset[sort_key])
-                return -1;
-            if (a.dataset[sort_key] > b.dataset[sort_key])
-                return 1;
-            return 0;
-        }
-        
-        function sort_initial(k, t){
-        	var subjects = document.querySelectorAll(".uv-table-group-procedure");
-            var subjectsArray = Array.from(subjects);
-            if(t == 'asc'){
-				sorted = subjectsArray.sort(comparator_asc);
-            }
-            else{
-            	sorted = subjectsArray.sort(comparator_desc);
-            }
-            sorted.forEach(e =>
-            document.querySelector("#uv-procedure-container")
-            		.appendChild(e));
-            sort_change_icons(sort_key, sort_typ);
-        }
-          
-        function sort(k) {
-        	sort_key = k;
-        	var subjects = document.querySelectorAll(".uv-table-group-procedure");
-            var subjectsArray = Array.from(subjects);
-            let sorted;
-        	if(sort_typ === '' || sort_typ == 'desc'){
-				sort_typ = 'asc';
-				sorted = subjectsArray.sort(comparator_asc);
-			}
-			else{
-				sort_typ = 'desc';
-				sorted = subjectsArray.sort(comparator_desc);
-			}
-            sorted.forEach(e =>
-                document.querySelector("#uv-procedure-container")
-                		.appendChild(e));
-                    
-            sort_change_icons(sort_key, sort_typ);
-			
-			setCookie('sort_key', sort_key, 1);
-			setCookie('sort_typ', sort_typ, 1);
-        }
-        
-        function sort_change_icons(k, t){
-        	if(k == 'alpha'){
-				$('.sort-btn-alpha').removeClass('fa-sort-alpha-down');
-				$('.sort-btn-alpha').removeClass('fa-sort-alpha-up');
-				if(t == 'asc'){
-					$('.sort-btn-alpha').addClass('fa-sort-alpha-up');
-				}
-				else{
-					$('.sort-btn-alpha').addClass('fa-sort-alpha-down');
-				}	
-			}
-			else if(k == 'date'){
-				$('.sort-btn-date').removeClass('fa-sort-numeric-down');
-				$('.sort-btn-date').removeClass('fa-sort-numeric-up');
-				if(t == 'asc'){
-					$('.sort-btn-date').addClass('fa-sort-numeric-up');
-				}
-				else{
-					$('.sort-btn-date').addClass('fa-sort-numeric-down');
-				}
-			}
-        }
-        
-		function setCookie(cname, cvalue, exdays) {
-			const d = new Date();
-			d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
-			let expires = "expires="+d.toUTCString();
-			document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
-		}
-		
-		function getCookie(cname) {
-			let name = cname + "=";
-			let ca = document.cookie.split(';');
-			for(let i = 0; i < ca.length; i++) {
-				let c = ca[i];
-				while (c.charAt(0) == ' ') {
-					c = c.substring(1);
-				}
-				if (c.indexOf(name) == 0) {
-					return c.substring(name.length, c.length);
-				}
-			}
-			return "";
-		}
-		
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 405
src/main/resources/templates/testerTemplateEditor.html

@@ -1,405 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-		
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6">Editor de plantillas</h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				
-				
-				<div class="uv-table-group">
-					<div class="uv-table-group">
-						<label>Plantilla</label>
-						<select class="selectpicker" id="templateSelector" name="procedure" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" onchange="formEdit();">
-					        <option th:each="item : ${templates}" th:text="${#locale.language} == 'es' ? '['+${item.codi}+'] {v'+${item.versio}+'} ['+${item.ambit}+'] '+${item.nomCas}:${item.codi}+' {v'+${item.versio}+'} ['+${item.ambit}+'] '+${item.nomVal}" th:attr="value=${item.idPlantilla}"></option>
-					    </select>
-					</div>
-					<br>
-					<span class="btn btn-warning pointer" onclick="formTest()" data-toggle="modal" data-target="#testTemplateModal"><i class="fas fa-file"></i> <span th:text="Probar">Probar</span></span>
-					<hr class="uv-procedure-hr">
-				</div>
-				
-				<div class="uv-table-group" id="formFields">
-					
-				</div>
-				
-				<div class="uv-table-group">
-					<textarea id="editor" name="evidencia_text"></textarea>
-				</div>
-				
-			</div>
-		</div>
-	</div>
-	
-	<div class="modal fade" id="searchIndsModal" tabindex="-1" role="dialog" aria-labelledby="searchIndsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Buscar indicadores</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<form id="searchIndForm" action="javascript:void(0)" style="margin-top:25px;">
-						<div class="form-group">
-							<label>Indicador/Valor de encuesta</label>
-							<select class="selectpicker" id="indSelector" data-live-search="true" data-width="100%" data-actions-box="true" required>
-						        <option th:each="item : ${inds}" th:text="${item}" th:attr="value=${item}"></option>
-						    </select>
-						</div>
-					</form>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <span class="btn btn-success" onclick="insert_data();">Insertar</span>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-	
-	<div class="modal fade" id="testTemplateModal" tabindex="-1" role="dialog" aria-labelledby="searchIndsModal" aria-hidden="true">
-	  <div class="modal-dialog modal-lg">
-	    <div class="modal-content">
-		    <div class="modal-header">
-		        <h5 class="modal-title">Probar plantilla</h5>
-		        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-		        	<span aria-hidden="true">&times;</span>
-		        </button>
-	        </div>
-	        <div class="modal-body">
-	        	<div class="container-fluid">
-			    	<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.center}">Centre(s)</label>
-						<select class="selectpicker" id="centersSelector" name="center" data-live-search="true" data-width="100%" data-actions-box="true" th:attr="data-none-selected-text=#{global.selectors.noData}" required>
-					        <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.titulation}">Titulació(ns)</label>
-						<select class="selectpicker" id="titulationsSelector" name="titulation" data-live-search="true" data-width="100%" data-actions-box="true" required>
-					        <option th:each="item : ${titulations}" th:text="${#locale.language} == 'es' ? ${item.text}:${item.text2}" th:attr="value=${item.value}"></option>
-					    </select>
-					</div>
-					<div class="uv-table-group-procedure">
-						<label th:text="#{admin.instances.selector.curs}">Curso</label>
-						<select class="selectpicker" id="cursSelector" name="curs" data-live-search="true" data-width="100%" data-actions-box="true" required>
-							<option th:each="year : ${#numbers.sequence(2020, #dates.year(#dates.createNow()))}"
-							    th:value="${year}" th:text="${year}">
-							</option>
-						</select>
-					</div>
-				</div>
-			</div>
-			<div class="modal-footer">
-		        <button type="button" class="btn btn-secondary pointer" data-dismiss="modal" th:text="#{global.cancel}">Cancelar</button>
-		        <span class="btn btn-success pointer" onclick="testTemplate();">Probar</span>
-	        </div>
-	    </div>
-	  </div>
-	</div>
-
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
-	<script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
-	<script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
-	<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
-  
-	<script type="text/javascript">
-		
-	
-		var opts = { margin: [0, 12, 0, 12] };
-		var worker = html2pdf();
-		worker.set(opts);
-		var action;
-	
-		$( document ).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			$('#centersSelector').val('').trigger('change');
-			$('#centersSelector').change(completeTitulations);
-			
-			tinymce.init({ 
-				selector: '#editor',
-				plugins: 'preview visualblocks visualchars fullscreen image link media table pagebreak nonbreaking anchor advlist lists charmap quickbars checklist',
-				menubar: 'help',
-				toolbar: 'preview topdf | fullscreen ',
-				content_style: "body { font-size: 10pt; }",
-				body_class: 'mceNonEditable',
-				object_resizing : ":not(table)",
-				font_size_formats: '8pt 9pt 10pt 11pt 12pt 14pt 16pt 18pt 24pt',
-				setup: (editor) => {
-					
-					editor.on('keydown', function(e) {
-						if (e.keyCode == 8 || e.keyCode == 46) { //backspace and delete keycodes
-		                    try {
-		                        var elem = tinymce.activeEditor.selection.getNode(); //current caret node
-		                        if (elem.classList.contains("mceNonEditable")) {
-		                        	e.preventDefault();
-	                                return false;
-		                        }
-		                    } catch (e) {console.log(e);}
-		                }
-					});
-					
-					editor.on('TableModified', function(e) {
-						editor.setContent(editor.getContent());	      
-					});
-					
-					editor.ui.registry.addIcon('save', '<i style="font-size:125%;" class="fas fa-save"></i>')
-					
-					editor.ui.registry.addButton('insert-data', {
-						icon: 'code-sample',
-						tooltip: 'Insertar indicador/encuesta',
-				      	onAction: function(_){ 
-				      		$('#searchIndsModal').modal('show');
-				      	}
-				    });
-						
-					editor.ui.registry.addButton('topdf', {
-						icon: 'print',
-						tooltip: 'Imprimir a PDF',
-				      	onAction: function(_){ 
-				      		print_to_pdf(editor.getContent());
-				      	}
-				    });
-					
-					editor.ui.registry.addButton('btn-editable', {
-						icon: 'unlock',
-						tooltip: 'Desbloquear contenido',
-				      	onAction: function(_){ 
-				      		var ns = $(editor.selection.getSelectedBlocks()).each(function(b){
-				      			$(console.log($(this)))
-				      			$(this).removeClass('mceEditable').removeClass('mceNonEditable').addClass('mceEditable')
-				      		});
-				      		editor.setContent(editor.getContent());	      		
-				      	}
-				    });
-					
-					editor.ui.registry.addButton('btn-noneditable', {
-						icon: 'lock',
-						tooltip: 'Bloquear contenido',
-				      	onAction: function(_){ 
-				      		var ns = $(editor.selection.getSelectedBlocks()).each(function(b){
-				      			$(console.log($(this)))
-				      			$(this).removeClass('mceEditable').removeClass('mceNonEditable').addClass('mceNonEditable')
-				      		});
-				      		editor.setContent(editor.getContent());
-				      	}
-				    });
-					
-					editor.on('init', function(e) {
-			            formEdit();
-			        });
-				},
-				codesample_languages: [
-				    { text: 'Valor de indicador o encuesta', value: 'markup' },
-				  ],
-				save_onsavecallback: function(){save_content();},
-				autosave_ask_before_unload: true,
-				autosave_interval: '20s',
-				autosave_prefix: '{path}{query}-{id}-',
-				autosave_restore_when_empty: false,
-				autosave_retention: '2m',
-				image_advtab: true,
-				link_list: [
-				  { title: 'My page 1', value: 'https://www.tiny.cloud' },
-				  { title: 'My page 2', value: 'http://www.moxiecode.com' }
-				],
-				image_list: [
-				  { title: 'My page 1', value: 'https://www.tiny.cloud' },
-				  { title: 'My page 2', value: 'http://www.moxiecode.com' }
-				],
-				image_class_list: [
-				  { title: 'None', value: '' },
-				  { title: 'Some class', value: 'class-name' }
-				],
-				importcss_append: true,
-				file_picker_callback: (callback, value, meta) => {
-				  /* Provide file and text for the link dialog */
-				  if (meta.filetype === 'file') {
-				    callback('https://www.google.com/logos/google.jpg', { text: 'My text' });
-				  }
-				
-				  /* Provide image and alt text for the image dialog */
-				  if (meta.filetype === 'image') {
-				    callback('https://www.google.com/logos/google.jpg', { alt: 'My alt text' });
-				  }
-				
-				  /* Provide alternative source and posted for the media dialog */
-				  if (meta.filetype === 'media') {
-				    callback('movie.mp4', { source2: 'alt.ogg', poster: 'https://www.google.com/logos/google.jpg' });
-				  }
-				},
-				table_class_list: [
-				    {title: 'Normal', value: ''},
-				    {title: 'Tabla editable', value: 'mceEditable'},
-				    {title: 'Tabla editable A4 H', value: 'mceEditable mceTableA4H'},
-				    {title: 'Tabla editable A4 V', value: 'mceEditable mceTableA4V'},
-				    {title: 'Tabla no editable', value: 'mceNonEditable'},
-				    {title: 'Tabla comentario', value: 'mceNonEditable pdfignore'}
-				],
-				table_appearance_options: true,
-				height: 600,
-				image_caption: true,
-				quickbars_selection_toolbar: 'bold italic | quicklink h2 h3 blockquote quickimage quicktable',
-				toolbar_mode: 'sliding',
-				contextmenu: 'link image table',
-			});		
-			tinymce.get('id').setMode('readonly');
-			
-		});
-		
-		function completeTitulations(){
-			console.log('tits');
-			if ($('#centersSelector').val() !== null && $('#centersSelector').val() !== ''){
-				var params = {'center':$('#centersSelector').val()};
-				$.post("/ajax/get/titulations", params, function(data){ 
-					$("#titulationsSelector").html(data).selectpicker('refresh'); 
-					$('#titulationsSelector').val('').trigger('change');
-				});
-			}
-		}
-		
-		function save_content(){			
-			$.post("/ajax/template/save", 
-			   {id: $('#templateSelector').val(),
-				codi:$('#codiInput').val(),
-				versio:$('#versioInput').val(),
-				nomCas:$('#nomCasInput').val(),
-				nomVal:$('#nomValInput').val(),
-				ambit:$('#ambitInput').val(),
-				text:tinymce.activeEditor.getContent(),
-				action:action},
-			   function(d){
-					if(d == '0'){
-						alert('Ya existe la combinación Código-Versión-Ámbito');
-					}
-					else{
-						alert('Acción realizada correctamente');
-					}
-					
-				}
-			);
-		}
-		
-		function print_to_pdf(content){
-			$('<form id="tmpDownloadForm" method="post" action="/pdf/preview" target="_blank">' +
-			  	'<textarea id="tmpDownloadContent" type="hidden" name="content">' +
-			  		tinymce.activeEditor.getContent() +
-			  	'</textarea>' +
-			  '</form>')
-			.appendTo('body')
-			.submit()
-			.remove();	
-		}
-		
-		function insert_data(){
-			tinymce.activeEditor.selection.setContent('{{'+$('#indSelector').val()+'}}');
-			$('#searchIndsModal').modal('hide');
-		}
-		
-		function formEdit(){
-			$.post("/ajax/template/form", {id:$('#templateSelector').val(), action:"edit"}, function(rawData){ 
-				var form = $($.parseHTML(rawData));
-				$(form).find('#editorContent')[0].remove()
-				var data = $($.parseHTML(rawData)).find('#editorContent').html();
-				$('#formFields').html('');
-				$(form).appendTo($('#formFields'));
-				tinymce.activeEditor.setContent(data);
-				action = "edit";
-				$('#formFields').show();
-			});
-		}
-
-		function formNew(){
-			$.post("/ajax/template/form", {id:0, action:"new"}, function(rawData){ 
-				var form = $($.parseHTML(rawData));
-				$(form).find('#editorContent')[0].remove()
-				var data = $($.parseHTML(rawData)).find('#editorContent').html();
-				$('#formFields').html('');
-				$(form).appendTo($('#formFields'));
-				tinymce.activeEditor.setContent(data);
-				action = "new";
-				$('#formFields').show();
-			});
-		}
-		
-		function formDuplicate(){
-			$.post("/ajax/template/form", {id:$('#templateSelector').val(), action:"duplicate"}, function(rawData){ 
-				var form = $($.parseHTML(rawData));
-				$(form).find('#editorContent')[0].remove()
-				var data = $($.parseHTML(rawData)).find('#editorContent').html();
-				$('#formFields').html('');
-				$(form).appendTo($('#formFields'));
-				tinymce.activeEditor.setContent(data);
-				action = "duplicate";
-				$('#formFields').show();
-			});
-		}
-		
-		function formDelete(){
-			$.ajax({
-			     url: "/ajax/template/form",
-			     type: "DELETE",
-			     data: {id:$('#templateSelector').val()}
-			  })
-			  .done(function(d){
-					if(d == '1'){
-						location.reload();
-					}
-					else{
-						alert('La plantilla está asignada a un procedimiento. No se puede eliminar.');
-					}
-			  });
-		}
-		
-		function testTemplate(){
-			var url = "/admin/editor/test?idPlantilla="+$('#templateSelector').val()+"&idTitulacio="+$('#titulationsSelector').val()+"&idCentre="+$('#centersSelector').val()+"&curs="+$('#cursSelector').val();
-			window.open(url, '_blank').focus();	
-		}
-			
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 103
src/main/resources/templates/wiki.html

@@ -1,103 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/gijgo/css/gijgo.min.css}" rel="stylesheet"/>
-<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.css"/>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">	
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;cursor:auto;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="'Manual de usuario'"></h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				<div class="uv-table-group-procedure row" style="padding:20px;">
-					<div class="col-lg-3">  
-                    	<div id="treeDocuments"></div>      
-                    </div>
-                    <div class="col-lg-9">  
-                    	<textarea id="documentViewer" style="padding:10px;height:600px;max-height:600px;border-style:solid;border-width:1px;border-color: #ccc;"></textarea>      
-                    </div>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/gijgo/gijgo.min.js}"></script>
-	<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
-	
-	
-	<script type="text/javascript">
-
-		var locale = '[[${#locale.language}]]';
-		var treeDocuments;
-		var viewer = new EasyMDE({ element:document.getElementById('documentViewer'),
-								   toolbar: false,
-								   status: false});
-		
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-			treeDocuments = $('#treeDocuments').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: [{text:'Manual de Usuario', children:[{text:'<a href="#wiki_user_procedimientos">Procedimientos y tareas</a>'}]}, 
-					  		   {text:'Manual UQ', children:[{text:'<a href="#wiki_uq_procedimientos">Gestión de procedimientos</a>'}, 
-					  			   							{text:'<a href="#wiki_uq_tareas">Tareas y revisión</a>'}, 
-					  			   							{text:'<a href="#wiki_uq_importacion">Importación de datos</a>'}]},
-					  		   {text:'Manual de administración', children:[{text:'<a href="#wiki_admin_procedimientos">Procedimientos</a>'}, 
-															  			   {text:'<a href="#wiki_admin_plantillas">Plantillas</a>'}, 
-															  			   {text:'<a href="#wiki_admin_importacion">Importación de datos</a>'}, 
-															  			   {text:'<a href="#wiki_admin_integracion">Integración de datos</a>'}]}]
-			});
-			
-			window.addEventListener('hashchange', function() {
-				$.get('/wiki/text/'+$(location).attr('hash').substr(1), function(data){
-					viewer.value(data.text);
-					if(!viewer.isPreviewActive()){
-						viewer.togglePreview();	
-					}
-				});
-			});
-			
-		});
-		
-	</script>
-
-</body>
-
-</html>

+ 0 - 107
src/main/resources/templates/wikiEditor.html

@@ -1,107 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
-	xmlns:th="http://www.thymeleaf.org">
-
-<head th:replace="~{layouts/common.html :: head}"></head>
-
-<link th:href="@{/js/gijgo/css/gijgo.min.css}" rel="stylesheet"/>
-<link th:href="@{/js/easymde/easymde.css}" rel="stylesheet"/>
-
-<body id="page-top">
-
-	<!-- Navigation -->
-	<nav th:replace="~{layouts/common.html :: navbar}"></nav>
- 
- 	<!-- Content -->
-	<div class="content uv-content d-flex" id="uv-wrapper">
-		<div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
-		
-		<div class="container uv-home-section navVisible" id="uv-content-wrapper">
-			<div class="uv-loading-spinner" th:text="#{global.loading}"></div>
-			<div class="col-sm-12"></div>
-			<div class="uv-container">	
-				<div class="uv-table-group-procedure-info" style="margin-bottom:20px;margin-top:30px;cursor:auto;">
-					<div class="uv-table-title">
-						<h6 class="uv-table-header-h6" th:text="'Manual de usuario'"></h6>
-						<hr class="uv-procedure-hr">
-					</div>
-				</div>
-				<div class="uv-table-group-procedure row" style="padding:20px;">
-					<div class="col-lg-3">  
-                    	<div id="treeDocuments"></div>      
-                    </div>
-                    <div class="col-lg-9">  
-                    	<textarea id="editor" style="overflow-y:scroll;padding:10px;height:600px;max-height:600px;border-style:solid;border-width:1px;border-color: #ccc;"></textarea>  
-                    	<button class="btn btn-success" id="savebtn" onclick="save();">Guardar</button>    
-                    </div>
-				</div>
-			</div>
-		</div>
-	</div>
-	
-	<!-- contactModal -->
-	<div th:replace="~{layouts/common.html :: contactModal}"></div>
-	
-	<!-- Footer -->
-	<footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
-	
-	<script th:src="@{/js/jquery/jquery.min.js}"></script>
-	<script th:src="@{/js/popper.js}"></script>
-	<script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
-	<script th:src="@{/js/fa/all.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
-	<script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
-	<script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
-	<script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
-	<script th:src="@{/js/saic.js}"></script>
-	<script th:src="@{/js/gijgo/gijgo.min.js}"></script>
-	<script th:src="@{/js/easymde/easymde.js}"></script>
-	
-	
-	<script type="text/javascript">
-
-		var locale = '[[${#locale.language}]]';
-		var treeDocuments;
-		var editor = new EasyMDE({ element:document.getElementById('editor') });
-		
-		$(document).ready(function(){ 
-			layout = new Layout("");
-			layout.initTableLayout({paging:false});
-			layout.closeLoadingSpinner(".uv-loading-spinner");
-			
-			treeDocuments = $('#treeDocuments').tree({
-				  cascadeSelection: false,
-				  cascadeCheck: false,
-				  selectionType: 'single',
-				  dataSource: [{text:'Manual de Usuario', children:[{text:'<a href="#wiki_user_procedimientos">Procedimientos y tareas</a>'}]}, 
-					  		   {text:'Manual UQ', children:[{text:'<a href="#wiki_uq_procedimientos">Gestión de procedimientos</a>'}, 
-					  			   							{text:'<a href="#wiki_uq_tareas">Tareas y revisión</a>'}, 
-					  			   							{text:'<a href="#wiki_uq_importacion">Importación de datos</a>'}]},
-					  		   {text:'Manual de administración', children:[{text:'<a href="#wiki_admin_procedimientos">Procedimientos</a>'}, 
-															  			   {text:'<a href="#wiki_admin_plantillas">Plantillas</a>'}, 
-															  			   {text:'<a href="#wiki_admin_importacion">Importación de datos</a>'}, 
-															  			   {text:'<a href="#wiki_admin_integracion">Integración de datos</a>'}]}]
-			});
-			
-			window.addEventListener('hashchange', function() {
-				$.get('/wiki/text/'+$(location).attr('hash').substr(1), function(data){
-					editor.value(data.text);
-				});
-			});
-			
-		});
-		
-		function save(){
-			var params = {cat:$(location).attr('hash').substr(1), text:editor.value()};
-			$.post("/wiki/editor", params, function(data){
-				editor.value(data.text);
-				alert('Acción realizada correctamente');
-			});
-		}
-		
-	</script>
-
-</body>
-
-</html>