| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080 |
- <!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.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}" onclick="window.location.hash = 'tab3'">Titulaciones</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="" data-target="#tab0" data-toggle="tab" th:text="#{dashboard.menu.summary}" onclick="window.location.hash = 'tab0'">Resumen</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="" data-target="#tab1" data-toggle="tab" th:text="#{dashboard.menu.procedures}" onclick="window.location.hash = 'tab1'">Procedimientos SAIC</a>
- </li>
- <li class="nav-item">
- <a class="nav-link" href="" data-target="#tab2" data-toggle="tab" th:text="#{dashboard.menu.docs}" onclick="window.location.hash = 'tab2'">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}" onclick="window.location.hash = 'tab4'">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.codis2}"></span>
- </td>
- <td>
- <a target="_blank" th:href="${'/dashboard/'+item.ruct2}"><span th:text="${#locale.language} == 'es' ? ${item.nomCas2}:${item.nomVal2}"></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="${#temporals.format(item.acreditacio?.dataAcred, 'dd/MM/yyyy')}"></span>
- </td>
- <td>
- <span th:text="${#temporals.format(item.acreditacio?.dataRenov, 'dd/MM/yyyy')}"></span>
- </td>
- <td>
- <span th:text="${#temporals.format(item.acreditacio?.dataSegui, 'dd/MM/yyyy')}"></span>
- </td>
- <td>
- <span th:text="${#temporals.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">
- <span class="btn btn-primary pointer" id="btnAddManager" style="z-index:100;float:right;margin-right:25px;font-size:75%;padding: 5px 8px 3px 8px;" data-toggle="modal" data-target="#newRoleModal"><i class="fa fa-plus"></i></span>
- <div class="uv-table-group" th:if="${results}" style="cursor: auto; width: 90%;">
- <div class="col-sm-12 uv-table-section" th:each="item : ${resp_titulacions}" style="margin-top:20px;">
- <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>
- <a th:href="'mailto:'+${item.usuari.email}" th:title="${item.usuari.email}" th:text="${item.usuari.nom + ' ' + item.usuari.cognoms}"></a> (<small><span th:text="#{managers.since}">Desde el</span> <span th:text="${item.inici}"></span></small>)
- </div>
- <strong><span th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></span>: </strong>
- <a th:href="'mailto:'+${item.usuari.email}" th:title="${item.usuari.email}" th:text="${item.usuari.nom + ' ' + item.usuari.cognoms}"></a> (<small><span th:text="#{managers.since}">Desde el</span> <span th:text="${item.inici}"></span></small>)
- </div>
- <div class="col-sm-12 uv-table-section" th:each="item : ${resp_centres}" style="display: flex; align-items: flex-start; margin-bottom: 15px;">
- <form id="deleteUserForm" enctype='multipart/form-data' onsubmit="deleteUserRole(event)" style="margin-right: 15px;">
- <div class="form-group">
- <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.tlugar}">
- <input type="hidden" name="lugar" th:value="${item.organ.lugar}">
- <button class="btn" style="width:40px; height:38px; color: red;" th:title="#{admin.action.delete}" >
- <i class="fas fa-times"></i>
- </button>
- </div>
- </form>
- <div>
- <strong th:text="${#locale.language} == 'es' ? ${item.rol.descripcioCas}:${item.rol.descripcioVal}"></strong>
- <br>
- <a th:href="'mailto:'+${item.usuari.email}" th:title="${item.usuari.email}" th:text="${item.usuari.nom + ' ' + item.usuari.cognoms}"></a>
- (<small><span th:text="#{managers.since}">Desde el</span> <span th:text="${item.inici}"></span></small>)
- </div>
- </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">×</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.lugar}">
- <input type="hidden" id="fileTlugar" name="tlugar" th:value="${organ.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">×</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="newOrganModal" tabindex="-1" role="dialog" aria-labelledby="newOrganModal" aria-hidden="true">
- <div class="modal-dialog modal-lg">
- <div class="modal-content">
- <div class="modal-header">
- <h5 class="modal-title">Añadir organo</h5>
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
- <span aria-hidden="true">×</span>
- </button>
- </div>
- <div class="modal-body">
- <div class="container-fluid">
- <form id="newOrganForm">
- <div class="uv-table-group-procedure mb-4">
- <label>Organo a añadir</label>
- <select class="form-control selectpicker" id="typeSelector" onchange="toggleFormFields(this.value)">
- <option value="centro">Centro</option>
- <option value="titulacion">Titulación</option>
- </select>
- </div>
- <hr>
- <div id="sectionCentro">
- <div class="uv-table-group-procedure">
- <label>Codigo centro</label>
- <input type="number" class="form-control" name="codiCentro">
- </div>
- <div class="uv-table-group-procedure">
- <label>Nombre Castellano</label>
- <input type="text" class="form-control" name="nomCasCentro">
- </div>
- <div class="uv-table-group-procedure">
- <label>Nombre Valenciano</label>
- <input type="text" class="form-control" name="nomValCentro">
- </div>
- <div class="uv-table-group-procedure">
- <label>RUCT</label>
- <input type="number" class="form-control" name="ructCentro">
- </div>
- </div>
- <div id="sectionTitulacion" style="display:none;">
- <div class="uv-table-group-procedure">
- <label>Codigo titulación</label>
- <input type="number" class="form-control" name="codiTit">
- </div>
- <div class="uv-table-group-procedure">
- <label>Centro perteneciente</label>
- <select class="selectpicker" id="roleCentersSelector" name="centre" data-live-search="true" data-width="100%" data-actions-box="true" required>
- <option th:each="item : ${centers}" th:text="${#locale.language} == 'es' ? ${item.nomCas}:${item.nomVal}" th:attr="value=${item.lugar}"></option>
- </select>
- </div>
- <div class="uv-table-group-procedure">
- <label>Nombre Castellano</label>
- <input type="text" class="form-control" name="nomCasTit">
- </div>
- <div class="uv-table-group-procedure">
- <label>Nombre Valenciano</label>
- <input type="text" class="form-control" name="nomValTit">
- </div>
- <div class="uv-table-group-procedure">
- <label>RUCT</label>
- <input type="number" class="form-control" name="ructTit">
- </div>
- <div class="uv-table-group-procedure">
- <label>Ámbito</label>
- <select class="form-control selectpicker" name="tambit" data-width="100%">
- <option value="G">Grado</option>
- <option value="M">Máster</option>
- <option value="D">Doctorado</option>
- </select>
- </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="newOrganForm" th:text="#{global.confirm}">Confirmar</button>
- </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">×</span>
- </button>
- </div>
- <div class="modal-body">
- <div class="container-fluid">
- <form id="newRoleForm" enctype='multipart/form-data' onsubmit="addUserRole(event)" style="margin-top:25px;">
- <input type="hidden" name="centre" th:value="${organ.lugar2}">
- <input type="hidden" name="titulacio" th:value="${organ.lugar}">
- <div class="form-group">
- <label th:text="#{admin.managers.user}">Usuario</label> <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/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.lugar}]]';
- var tlugar = '[[${organ.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');
- $('#newUserContainer').hide();
- $('#userSelector').val('').trigger('change');
-
- treeDocuments = $('#treeDocuments').tree({
- cascadeSelection: false,
- cascadeCheck: false,
- selectionType: 'single',
- dataSource: '/dashboard/documents/'+ruct
- });
- $('#newOrganForm').on('submit', function(e) {
- e.preventDefault();
- var type = $('#typeSelector').val();
- var endpoint = (type === 'centro') ? '/organ/centre' : '/organ/titulacion';
- var formData = new FormData(this);
- $.ajax({
- url: endpoint,
- type: 'PUT',
- data: formData,
- processData: false,
- contentType: false,
- success: function(data) {
- $('#newOrganModal').modal('hide');
- location.reload();
- }
- })
- })
- drawReports(ruct);
- drawGantt(ruct);
- editableSettings();
-
- layout.closeLoadingSpinner(".uv-loading-spinner");
- var hash = window.location.hash;
- if(hash){
- $('.nav-link').removeClass('active');
- $('.tab-pane').removeClass('active');
- $('.nav-link[href="'+hash+'"]').addClass('active');
- $(hash).addClass('active');
- }
-
- });
-
- 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'
- },
- {
- text: '<i class="fas fa-plus"></i>',
- titleAttr: 'Añadir nueva',
- action: function ( ) {
- $('#newOrganModal').modal('toggle');
- }
- }
- ],
- 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
- });
- }
- function toggleFormFields(value) {
- if (value === 'centro') {
- $('#sectionCentro').show();
- $('#sectionTitulacion').hide();
-
- $('#sectionTitulacion').find("input, select").prop("disabled", true);
- $('#sectionCentro').find("input, select").prop("disabled", false);
- } else {
- $('#sectionCentro').hide();
- $('#sectionTitulacion').show();
-
- $('#sectionCentro').find("input, select").prop("disabled", true);
- $('#sectionTitulacion').find("input, select").prop("disabled", false);
- }
- $('.selectpicker').selectpicker('refresh');
- }
- 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');
- }
- function addUserRole(event){
- event.preventDefault(); // Evita que la página se recargue
- const form = document.getElementById('newRoleForm');
- const formData = new FormData(form);
- $.ajax({
- type: "POST",
- url: "/admin/userrole/new",
- data: formData,
- processData: false, // Necesario para FormData
- contentType: false, // Necesario para FormData
- success: function(response) {
- if (response === true) {
- location.reload();
- } else {
- alert("Error al añadir el rol");
- }
- },
- error: function() {
- alert("No se pudo conectar con el servidor");
- }
- });
- }
- function deleteUserRole(event){
- event.preventDefault(); // Evita que la página se recargue
- const form = document.getElementById('deleteUserForm');
- const formData = new FormData(form);
- $.ajax({
- type: "POST",
- url: "/admin/userrole/remove",
- data: formData,
- processData: false, // Necesario para FormData
- contentType: false, // Necesario para FormData
- success: function(response) {
- if (response === true) {
- location.reload();
- } else {
- alert("Error al eliminar el rol");
- }
- },
- error: function() {
- alert("No se pudo conectar con el servidor");
- }
- });
- }
- </script>
- </body>
- </html>
|