dataImport.html 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml"
  3. xmlns:th="http://www.thymeleaf.org">
  4. <head th:replace="~{layouts/common.html :: head}"></head>
  5. <style>
  6. .file-drop-area {
  7. position: relative;
  8. display: flex;
  9. align-items: center;
  10. width: 100%;
  11. min-width: 100%;
  12. max-width: 100%;
  13. padding: 25px;
  14. border: 1px dashed black;
  15. border-radius: 3px;
  16. transition: 0.2s;
  17. }
  18. .choose-file-button {
  19. flex-shrink: 0;
  20. padding: 8px 15px;
  21. margin-right: 20px;
  22. font-size: 12px;
  23. text-transform: uppercase;
  24. width: 100%;
  25. min-width: 100%;
  26. max-width: 100%;
  27. text-align: center;
  28. }
  29. .file-message {
  30. font-size: small;
  31. font-weight: 300;
  32. line-height: 1.4;
  33. white-space: nowrap;
  34. overflow: hidden;
  35. text-overflow: ellipsis;
  36. }
  37. .file-input {
  38. position: absolute;
  39. left: 0;
  40. top: 0;
  41. height: 100%;
  42. width: 100%;
  43. cursor: pointer;
  44. opacity: 0;
  45. }
  46. .mt-100{
  47. margin-top:100px;
  48. }
  49. </style>
  50. <body id="page-top">
  51. <!-- Navigation -->
  52. <nav th:replace="~{layouts/common.html :: navbar}"></nav>
  53. <!-- Content -->
  54. <div class="content uv-content d-flex" id="uv-wrapper">
  55. <div class="bg-light border-right" id="uv-sidebar-wrapper" th:replace="~{layouts/sidebar.html :: sidebar}"></div>
  56. <div class="container uv-home-section navVisible" id="uv-content-wrapper">
  57. <div class="uv-loading-spinner" th:text="#{global.loading}"></div>
  58. <div class="col-sm-12"></div>
  59. <div class="uv-container">
  60. <div class="uv-table-group-procedure-info" style="margin-bottom:20px;">
  61. <div class="uv-table-title">
  62. <h6 class="uv-table-header-h6" th:text="#{data.import.title}"></h6>
  63. <hr class="uv-procedure-hr">
  64. <span th:text="#{data.import.subtitle}"></span><br>
  65. </div>
  66. </div>
  67. <form enctype='multipart/form-data' method="POST" action="/data/import">
  68. <div class="uv-table-group-procedure row" style="padding:20px;cursor:auto;">
  69. <div class="col-12 row">
  70. <div class="col-5" id="databaseContainer">
  71. <label th:text="#{data.input.source}">Origen</label>
  72. <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>
  73. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  74. <option value="grado">Encuestas Grado</option>
  75. <option value="master">Encuestas Máster</option>
  76. <option value="doctorado">Encuestas Doctorado</option>
  77. <option value="pas">Encuestas PAS</option>
  78. <option value="evalprof">Encuestas Evaluación Profesorado</option>
  79. <option value="otros">Indicadores</option>
  80. </select>
  81. </div>
  82. <div class="col-5">
  83. <label th:text="#{data.input.survey}">Encuesta</label>
  84. <div class="subselect" id="gradoSelector">
  85. <select class="form-control" name="enquesta" required style="cursor:pointer;">
  86. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  87. <option value="dades_1er">Estudiantes primero</option>
  88. <option value="dades_3er">Estudiantes tercero</option>
  89. <option value="dades_graduats">Graduados</option>
  90. <option value="profes">Profesores</option>
  91. </select>
  92. </div>
  93. <div class="subselect" id="masterSelector">
  94. <select class="form-control" name="enquesta" required style="cursor:pointer;">
  95. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  96. <option value="data">Estudiantes</option>
  97. <option value="data_g">Graduados</option>
  98. <option value="profes_tancades">Profesores</option>
  99. </select>
  100. </div>
  101. <div class="subselect" id="doctoradoSelector">
  102. <select class="form-control" name="enquesta" required style="cursor:pointer;">
  103. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  104. <option value="doc_estud">Estudiantes</option>
  105. <option value="doc_etesi">Graduados</option>
  106. <option value="doc_prof">Profesores</option>
  107. <option value="doc_tasas">Tasas</option>
  108. <option value="doc_inds">Indicadores</option>
  109. <option value="doc_recom">Recomendaciones</option>
  110. </select>
  111. </div>
  112. <div class="subselect" id="evalprofSelector">
  113. <select class="form-control" name="enquesta" required style="cursor:pointer;">
  114. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  115. <option value="evalprof">Evaluación del profesorado</option>
  116. </select>
  117. </div>
  118. <div class="subselect" id="otrosSelector">
  119. <select class="form-control" name="enquesta" required style="cursor:pointer;">
  120. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  121. <option value="otros">Profesorado + Tasas</option>
  122. <option value="docentia">Docentia</option>
  123. <option value="enquestes">Encuestas (SAE/SAEM)</option>
  124. <option value="sprodw">Indicadores</option>
  125. </select>
  126. </div>
  127. <div class="subselect" id="pasSelector">
  128. <select class="form-control" name="enquesta" required style="cursor:pointer;">
  129. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  130. <option value="dadespas">PAS</option>
  131. </select>
  132. </div>
  133. </div>
  134. <div class="col-2">
  135. <label th:text="#{data.input.year}">Curso</label>
  136. <input class="form-control" type="number" value="" name="curs">
  137. <small class="importType importType-db" th:text="#{data.import.note4}">* Solo para consultar</small>
  138. </div>
  139. </div>
  140. <div class="col-12 row" style="margin-top:20px;">
  141. <div class="col-4">
  142. <label th:text="#{data.input.scope}">Ámbito</label>
  143. <select class="form-control" name="ambit" required style="cursor:pointer;">
  144. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  145. <option value="T" th:text="#{data.input.scope.t}">Titulación</option>
  146. <option value="C" th:text="#{data.input.scope.c}">Centro</option>
  147. <option value="U" th:text="#{data.input.scope.u}">Universidad</option>
  148. </select>
  149. </div>
  150. <div class="col-4">
  151. <label th:text="#{data.input.type}">Tipo Titulación</label>
  152. <select class="form-control" name="estudi" required style="cursor:pointer;">
  153. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  154. <option value="g" th:text="#{data.input.type.g}">Grado</option>
  155. <option value="m" th:text="#{data.input.type.m}">Máster</option>
  156. <option value="d" th:text="#{data.input.type.d}">Doctorado</option>
  157. <option value="u" th:text="#{data.input.type.u}">Global</option>
  158. </select>
  159. </div>
  160. <div class="col-4">
  161. <label th:text="#{data.input.importType}">Tipo de importación</label>
  162. <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>
  163. <option value="file" th:text="#{data.input.importType.file}" selected>Fichero CSV</option>
  164. <option value="db" th:text="#{data.input.importType.db}">Base de datos</option>
  165. </select>
  166. <small th:text="#{data.import.note3}">* Solo para importar</small>
  167. </div>
  168. </div>
  169. <div class="col-12 row" style="margin-top:20px;"></div>
  170. <div class="col-2 importType importType-db">
  171. <label th:text="'DB Origen'">DB origen</label>
  172. <select class="form-control" name="dbOrigen" required style="cursor:pointer;">
  173. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  174. <option th:each="i : ${sources}" th:value="${i.id}" th:text="${i.nom}">
  175. </select>
  176. <small th:text="#{data.import.note3}">* Solo para importar</small>
  177. </div>
  178. <div class="col-4 importType importType-db">
  179. <label th:text="#{data.input.view}">Nombre de la vista a importar</label>
  180. <input class="form-control" type="text" value="" name="vista">
  181. <small th:text="#{data.import.note3}">* Solo para importar</small>
  182. </div>
  183. <div class="col-2 importType importType-file">
  184. <label th:text="#{data.input.delim}">Delimitador</label>
  185. <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();">
  186. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  187. <option value=";">Punto y coma [ ; ]</option>
  188. <option value=",">Coma [ , ]</option>
  189. <option value="\t">Tabulador [ \t ]</option>
  190. </select>
  191. <small th:text="#{data.import.note3}">* Solo para importar</small>
  192. </div>
  193. <div class="col-2">
  194. <label th:text="#{data.input.key}">Clave</label>
  195. <select class="form-control" name="clau" required style="cursor:pointer;">
  196. <option disabled selected th:text="#{data.input.option}">Selecciona una opción</option>
  197. <option value="ruct">RUCT</option>
  198. <option value="cod">Cod. Intern</option>
  199. </select>
  200. <small th:text="#{data.import.note3}">* Solo para importar</small>
  201. </div>
  202. <div class="col-2 importType importType-db">
  203. <label th:text="#{data.input.dstyear}">Curso a imputar</label>
  204. <input class="form-control" type="text" value="" name="dstCurs">
  205. <small th:text="#{data.import.note3}">* Solo para importar</small>
  206. </div>
  207. </div>
  208. <div class="col-12 row importType importType-file" style="margin-top:20px;">
  209. <div class="tab-pane fade show active tab_item" style="width: 100%;min-width: 100%;max-width: 100%;">
  210. <div class="file-drop-area">
  211. <span class="filename choose-file-button" th:text="#{data.input.file}">Selecciona o suelta aquí el archivo CSV</span>
  212. <input class="file-input" type="file" name="file" id="filecsv">
  213. </div>
  214. </div>
  215. </div>
  216. <div>
  217. * <small th:text="#{data.import.note1}"> El fichero debe de contener las columnas "titulacio", "centre" y "tipus".</small>
  218. <br/>
  219. ** <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>
  220. </div>
  221. </div>
  222. <div id="fileInfoContainer" class="uv-table-group-procedure" style="padding-left:20px;cursor:auto;">
  223. </div>
  224. <div class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:auto;">
  225. <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>
  226. <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>
  227. <span class="btn btn-info pointer" onclick="showData();"><i class="fas fa-eye"></i> <span th:text="#{data.btn.show}">Ver</span></span>
  228. <!-- <span class="btn btn-success pointer" onclick="checkData();"><i class="fas fa-clipboard-check"></i> <span th:text="#{data.btn.check}">Comprobar</span></span> -->
  229. <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>
  230. </div>
  231. </form>
  232. <div id="resultsContainer" class="uv-table-group-procedure" style="padding-left:20px;padding-top:20px;cursor:auto;">
  233. </div>
  234. </div>
  235. </div>
  236. </div>
  237. <!-- contactModal -->
  238. <div th:replace="~{layouts/common.html :: contactModal}"></div>
  239. <!-- Footer -->
  240. <footer class="uv-footer uv-footer-text" th:replace="~{layouts/common.html :: footer}"></footer>
  241. <script th:src="@{/js/jquery/jquery.min.js}"></script>
  242. <script th:src="@{/js/popper.js}"></script>
  243. <script th:src="@{/js/bootstrap/bootstrap.min.js}"></script>
  244. <script th:src="@{/js/fa/all.js}"></script>
  245. <script th:src="@{/js/jquery/jquery.dataTables.min.js}"></script>
  246. <script th:src="@{/js/jquery/jquery.dataTables.responsive.min.js}"></script>
  247. <script th:src="@{/js/jquery/jquery.dataTables.rowReorder.min.js}"></script>
  248. <script th:src="@{/js/bootstrap/dataTables.bootstrap4.min.js}"></script>
  249. <script th:src="@{/js/jquery-easing/jquery.easing.min.js}"></script>
  250. <script th:src="@{/js/saic.js}"></script>
  251. <script th:src="@{/js/datepicker/bootstrap-datepicker.min.js}"></script>
  252. <script th:src="@{/js/bootstrap-select/bootstrap-select.js}"></script>
  253. <script th:src="@{/js/bootstrap-select/i18n/defaults-es_ES.js}" th:if="${#locale.language} == 'es'"></script>
  254. <script th:src="@{/js/bootstrap-select/i18n/defaults-ca_CA.js}" th:if="${#locale.language} != 'es'"></script>
  255. <script type="text/javascript">
  256. var locale = '[[${#locale.language}]]';
  257. var orderCol1 = [3, 'asc'], orderCol2 = [1, 'asc'];
  258. var cursorPosition;
  259. var reader = new FileReader();
  260. var tabParams = {
  261. paging: true,
  262. language:{
  263. "lengthMenu": "[[#{admin.stats.table.lengthMenu}]]",
  264. "zeroRecords": "[[#{admin.stats.table.zeroRecords}]]",
  265. "info": "[[#{admin.stats.table.info}]]",
  266. "infoEmpty": "[[#{admin.stats.table.infoEmpty}]]",
  267. "infoFiltered": "[[#{admin.stats.table.infoFiltered}]]",
  268. "paginate": {
  269. "previous": "[[#{admin.stats.table.previous}]]",
  270. "next": "[[#{admin.stats.table.next}]]"
  271. }
  272. },
  273. searching: true,
  274. order:[orderCol1, orderCol2],
  275. orderCellsTop: true,
  276. //fixedHeader: true, // Not compatible with android
  277. info: false,
  278. scrollX: true,
  279. responsive: false,
  280. initComplete: function () {
  281. var api = this.api();
  282. this.api()
  283. .columns()
  284. .eq(0)
  285. .each(function (colIdx) {
  286. var cell = $('.filters th').eq(
  287. $(api.column(colIdx).header()).index()
  288. );
  289. var title = $(cell).text();
  290. $(cell).html('<input type="text" placeholder="' + title + '" />');
  291. $('input', $('.filters th').eq($(api.column(colIdx).header()).index()))
  292. .off('keyup change')
  293. .on('change', function (e) {
  294. $(this).attr('title', $(this).val());
  295. var regexr = '({search})';
  296. cursorPosition = this.selectionStart;
  297. api.column(colIdx)
  298. .search(
  299. this.value != ''
  300. ? regexr.replace('{search}', '(((' + this.value + ')))')
  301. : '',
  302. this.value != '',
  303. this.value == ''
  304. )
  305. .draw();
  306. })
  307. .on('keyup', function (e) {
  308. e.preventDefault();
  309. e.stopPropagation();
  310. $(this).trigger('change');
  311. $(this)
  312. .focus()[0]
  313. .setSelectionRange(cursorPosition, cursorPosition);
  314. });
  315. });
  316. $('.table').DataTable().draw();
  317. }
  318. };
  319. $(document).ready(function(){
  320. layout = new Layout("");
  321. layout.initTableLayout({paging:false});
  322. layout.closeLoadingSpinner(".uv-loading-spinner");
  323. $('.subselect').hide();
  324. $('#btn-checkConn').hide();
  325. $('.subselect > select').attr('disabled', true);
  326. $('#databaseSelector').change(function(){
  327. $('.subselect').hide();
  328. $('.subselect > select').attr('disabled', true);
  329. $('#'+$(this).val()+'Selector > select').attr('disabled', false);
  330. $('#'+$(this).val()+'Selector').show();
  331. });
  332. $('#importTypeSelector').change(function(){
  333. $('.importType').hide();
  334. $('.importType-'+$(this).val()).show();
  335. if($(this).val() == 'file'){
  336. $('#btn-import').attr('disabled', false);
  337. $('#btn-checkConn').hide();
  338. }
  339. else{
  340. $('#btn-import').attr('disabled', true);
  341. $('#btn-checkConn').show();
  342. }
  343. });
  344. $('#importTypeSelector').trigger('change');
  345. reader.addEventListener("loadend", fileLoaded);
  346. $("#filecsv").change(function(){
  347. $(".filename").text(this.files[0].name);
  348. reader.readAsText(document.getElementById('filecsv').files[0]);
  349. });
  350. $("form").submit(function (event) {
  351. event.preventDefault();
  352. event.stopPropagation();
  353. if($('#importTypeSelector').val() == 'file'){
  354. if($('#filecsv').val().trim().length == 0 ||
  355. $('select[name="database"] option:not([disabled]):selected').length == 0 ||
  356. $('select[name="enquesta"] option:not([disabled]):selected').length == 0 ||
  357. $('select[name="delim"] option:not([disabled]):selected').length == 0 ||
  358. $('select[name="ambit"] option:not([disabled]):selected').length == 0 ||
  359. $('select[name="estudi"] option:not([disabled]):selected').length == 0){
  360. alert("Falta rellenar campos obligatorios");
  361. hideSpinner();
  362. return false;
  363. }
  364. }
  365. else{
  366. if($('select[name="database"] option:not([disabled]):selected').length == 0 ||
  367. $('select[name="enquesta"] option:not([disabled]):selected').length == 0 ||
  368. $('select[name="ambit"] option:not([disabled]):selected').length == 0 ||
  369. $('select[name="estudi"] option:not([disabled]):selected').length == 0 ||
  370. $('select[name="dbOrigen"] option:not([disabled]):selected').length == 0 ||
  371. $('input[name="curs"]').val().length == 0 ||
  372. $('input[name="vista"]').val().length == 0){
  373. alert("Falta rellenar campos obligatorios");
  374. hideSpinner();
  375. return false;
  376. }
  377. }
  378. showSpinner();
  379. var ignoredColumns = [];
  380. $("input:checkbox:not(:checked)").each(function(i){
  381. ignoredColumns.push($(this).val());
  382. });
  383. var data = new FormData(this);
  384. data.append('ignoredColumns', ignoredColumns);
  385. $.ajax({
  386. type: "POST",
  387. enctype: 'multipart/form-data',
  388. contentType: false,
  389. url: $(this).attr('action'),
  390. processData: false,
  391. cache: false,
  392. data: data,
  393. })
  394. .done(function (d) {
  395. console.log(d);
  396. var t = d.replace(/\[INFO\]/g, '<span style="color:green;">[INFO]</span>')
  397. .replace(/\[ERROR\]/g, '<span style="color:red;">[ERROR]</span>')
  398. .replace(/\[WARNING\]/g, '<span style="color:orange;">[WARNING]</span>');
  399. $('#resultsContainer').html(t);
  400. window.scrollTo(0, document.body.scrollHeight);
  401. })
  402. .fail( function(xhr, textStatus, errorThrown) {
  403. $('#resultsContainer').html('<span style="color:red;">[ERROR] Se ha producido un error en la importación.</span>');
  404. window.scrollTo(0, document.body.scrollHeight);
  405. });
  406. });
  407. });
  408. function fileLoaded(){
  409. if(reader.result == null){
  410. return false;
  411. }
  412. var header = reader.result.split('\n')[0];
  413. var colsArr = header.split($('select[name="delim"]').val());
  414. var cols = '[[#{data.import.note5}]] <br> <div class="row">';
  415. colsArr.forEach(function(d){
  416. var v = d.replaceAll('"', '');
  417. cols += `<div class="col-3" style="text-align:left;">
  418. <input type="checkbox" checked name="filecolumns" value="${v}"/> ${v}
  419. </div>`;
  420. });
  421. $('#fileInfoContainer').html(cols);
  422. }
  423. function removeData(){
  424. showSpinner();
  425. $.post("/data/delete", {enquesta:$('select[name="enquesta"]:enabled').val(),
  426. curs:$('input[name="curs"]').val(),
  427. ambit:$('select[name="ambit"]').val(),
  428. estudi:$('select[name="estudi"]').val()})
  429. .done(function(d) {
  430. var t = d.replace('[INFO]', '<span style="color:green;">[INFO]</span>')
  431. .replace('[ERROR]', '<span style="color:red;">[ERROR]</span>')
  432. .replace('[WARNING]', '<span style="color:orange;">[WARNING]</span>');
  433. $('#resultsContainer').html(t);
  434. window.scrollTo(0, document.body.scrollHeight);
  435. }
  436. );
  437. }
  438. function showSpinner(){
  439. 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;">
  440. <div class="spinner-border text-primary" role="status" style="font-size:150%;text-align:center;width:100px;height:100px;display:flex;margin:0 auto;">
  441. <span class="sr-only">Loading...</span>
  442. </div>
  443. </div>
  444. `;
  445. $('#resultsContainer').html(spinner);
  446. }
  447. function hideSpinner(){
  448. $('#resultsContainer').html('');
  449. }
  450. function listTableColumns(){
  451. if($('select[name="database"] option:not([disabled]):selected').length == 0 ||
  452. $('select[name="enquesta"] option:not([disabled]):selected').length == 0 ||
  453. $('select[name="ambit"] option:not([disabled]):selected').length == 0 ||
  454. $('select[name="estudi"] option:not([disabled]):selected').length == 0 ||
  455. $('select[name="dbOrigen"] option:not([disabled]):selected').length == 0 ||
  456. $('input[name="curs"]').val().length == 0 ||
  457. $('input[name="vista"]').val().length == 0){
  458. alert("Falta rellenar campos obligatorios");
  459. hideSpinner();
  460. return false;
  461. }
  462. showSpinner();
  463. $.post("/data/view/columns", {vista:$('input[name="vista"]').val(),
  464. dbOrigen:$('select[name="dbOrigen"]').val()})
  465. .done(function(data) {
  466. console.log(data);
  467. if(data.length == 0){
  468. $('#btn-import').attr('disabled', true);
  469. alert('[[#{data.alert.connect}]]');
  470. }
  471. else{
  472. $('#btn-import').attr('disabled', false);
  473. var cols = '[[#{data.import.note5}]] <br> <div class="row">';
  474. data.forEach(function(d){
  475. var v = d.replaceAll('"', '');
  476. cols += `<div class="col-3" style="text-align:left;">
  477. <input type="checkbox" checked name="filecolumns" value="${v}"/> ${v}
  478. </div>`;
  479. });
  480. $('#fileInfoContainer').html(cols);
  481. }
  482. $('#resultsContainer').html('');
  483. }
  484. );
  485. }
  486. function showData(){
  487. showSpinner();
  488. $.post("/data/show", {enquesta:$('select[name="enquesta"]:enabled').val(),
  489. curs:$('input[name="curs"]').val(),
  490. ambit:$('select[name="ambit"]').val(),
  491. estudi:$('select[name="estudi"]').val()})
  492. .done(function(data) {
  493. var trs = '';
  494. data.forEach(function(d){
  495. trs += `
  496. <tr>
  497. <td>${d.titulacio}</td>
  498. <td>${d.centre}</td>
  499. <td>${d.ambit}</td>
  500. <td>${d.tipus}</td>
  501. <td>${d.indicador}</td>
  502. <td>${d.valor}</td>
  503. <td>${d.nenq}</td>
  504. <td>${d.titulacioOrigen}</td>
  505. <td>${d.centreOrigen}</td>
  506. <td>${d.ruct}</td>
  507. <td>${d.usuari}</td>
  508. </tr>
  509. `;
  510. });
  511. $('#resultsContainer').html(`
  512. <div class="uv-table-group-procedure" style="margin-bottom:25px;">
  513. <table class="table table-striped table-bordered display responsive no-wrap">
  514. <thead>
  515. <tr>
  516. <th class="uv-table">[[#{data.table.1}]]</th>
  517. <th class="uv-table">[[#{data.table.2}]]</th>
  518. <th class="uv-table">[[#{data.table.3}]]</th>
  519. <th class="uv-table">[[#{data.table.4}]]</th>
  520. <th class="uv-table">[[#{data.table.5}]]</th>
  521. <th class="uv-table">[[#{data.table.6}]]</th>
  522. <th class="uv-table">[[#{data.table.7}]]</th>
  523. <th class="uv-table">[[#{data.table.8}]]</th>
  524. <th class="uv-table">[[#{data.table.9}]]</th>
  525. <th class="uv-table">[[#{data.table.10}]]</th>
  526. <th class="uv-table">[[#{data.table.11}]]</th>
  527. </tr>
  528. </thead>
  529. <tbody>
  530. ${trs}
  531. </tbody>
  532. </table>
  533. </div>
  534. `);
  535. $('.table thead tr').clone(true)
  536. .addClass('filters')
  537. .appendTo('.table thead');
  538. $('.table').DataTable({
  539. searching: tabParams.searching,
  540. paging: tabParams.paging,
  541. orderCellsTop: tabParams.orderCellsTop,
  542. // fixedHeader: tabParams.fixedHeader, // Not compatible with Android
  543. info: tabParams.info,
  544. responsive: tabParams.responsive,
  545. order: tabParams.order,
  546. scrollX: tabParams.scrollX,
  547. "language": ((!("language" in tabParams)) ? { "emptyTable": this.emptyMsg } : tabParams.language),
  548. initComplete: tabParams.initComplete
  549. });
  550. }
  551. );
  552. }
  553. </script>
  554. </body>
  555. </html>