1/** 2 * Perimite comprobar que el fichero que se va a subir no exceda el tamaño indicado en el segundo parámetro. 3 * Requeire que se le envie como primer parametro el id del inputFile y como segundo el mañano máximo de este en bytes 4 * Como tercer parámetro espera el indice del fichero a comprobar. En caso de singleFile el parámetro siemrpe será cero 5 * y no es necesario enviarlo. 6 */ 7function checkFileSize(fileFieldId, maxFileSize, index = 0) { 8 var input = document.getElementById(fileFieldId); 9 if (!input.files) { // This is VERY unlikely, browser support is near-universal 10 console.error("This browser doesn't seem to support the `files` property of file inputs."); 11 return true; 12 } else { 13 var file = input.files[index]; 14 if (file.size > maxFileSize) { 15 return false; 16 } else { 17 return true; 18 } 19 } 20} 21 22/** 23 * Perimite comprobar la extension del fichero que se va a subir. 24 */ 25function getExtension(fileFieldId, index = 0) { 26 var input = document.getElementById(fileFieldId); 27 if (!input.files) { // This is VERY unlikely, browser support is near-universal 28 console.error("This browser doesn't seem to support the `files` property of file inputs."); 29 return true; 30 } else { 31 var file = input.files[index]; 32 var parts = file.name.split('.'); 33 return parts[parts.length - 1]; 34 } 35} 36 37/** 38 * Registra un como (Comunas) como actualizable a partir del combo de Regiones. 39 * Recibe el id del select de regiones, comunas, y un boolean indicando si se 40 * debe dejar el primer resultado en blanco. También actualiza el combo de 41 * comunas si el de región tiene algún valor (distinto de vacÃo o -1), 42 * si el último parámetro es true. 43 */ 44function registrarComboComunas(idRegiones, idComunas, dejarBlanco) { 45 $("#" + idRegiones).on("change", function() { 46 cambiarSelectComunas(idRegiones, idComunas, dejarBlanco); 47 }); 48 49} 50 51/** 52 * Actualiza el select de Comunas en función de la región. Se permite indicar si el primer 53 * valor debe ser blanco 54 */ 55function cambiarSelectComunas(idRegiones, idComunas, dejarBlanco) { 56 var valorRegiones = $("#" + idRegiones).val(); 57 58 if (!valorRegiones || $.trim(valorRegiones) == "") { 59 limpiarCombo(idComunas); 60 } else { 61 $.getJSON("/data/generic/comunas/" + valorRegiones, function(json) { 62 alimentarSelectJSON(idComunas, json, dejarBlanco); 63 }); 64 } 65}; 66 67/** 68 * Actualiza el combo indicado, mediante datos JSON de pares 'codigo'/'valor' 69 */ 70function alimentarSelectJSON(idSelect, json, dejarBlanco){ 71 var listItems = ""; 72 if (dejarBlanco) { 73 listItems += "<option value=''></option>"; 74 } 75 for (var i = 0; i < json.length; i++) { 76 listItems += "<option value='" + json[i].codigo + "'>" + json[i].valor + "</option>"; 77 } 78 $("#" + idSelect).html(listItems); 79} 80 81/** 82 * Deja el combo indicado con una única opción vacÃa 83 */ 84function limpiarSelect(idSelect){ 85 $("#" + idSelect).html("<option value=''></option>"); 86} 87 88function isUndefined(object) 89{ 90 if(object == 'undefined') 91 { 92 return ""; 93 } 94 else 95 { 96 return object; 97 } 98 99} 100 101/** 102 * Recibe el id de un span con los atributos: 103 * - data-dir : parte de usuario de una dirección de email 104 * - data-server : parte de dominio sin extensión de una dirección de email 105 * - data-extension : extensión del dominio de la dirección de email 106 * @param idSpan 107 * @returns 108 */ 109function establecerEmail(idSpan){ 110 var s = $("#" + idSpan); 111 var dir = s.data("dir") + "@" + s.data("server") + "." + s.data("extension"); 112 var anchor = "<a href='mailto:" + dir + "'>" + dir + "</a>"; 113 s.html(anchor); 114} 115 116/** 117 * Recibe el prefijo de un ''array'' de id de un span con los atributos: 118 * - data-dir : parte de usuario de una dirección de email 119 * - data-server : parte de dominio sin extensión de una dirección de email 120 * - data-extension : extensión del dominio de la dirección de email 121 * El segundo parámetro es el Ãndice inicial 122 * La función recorrerá todos los idSpan comenzando por idSpan1 hasta que no encuentre el siguiente id. 123 * @param idSpan 124 * @returns 125 */ 126function establecerEmails(idSpan, startIndex){ 127 var i = startIndex; 128 var current = $('#' + idSpan + i); 129 while (current.length){ 130 establecerEmail(current.attr('id')); 131 current = $('#' + idSpan + ++i); 132 } 133} 134 135/** 136 * Complemento a establecerEmails cuando el enlace es compuesto (imagen + enlace, por ejemplo). Cambia únicamente el href 137 * del elemento recibido sin generar contenido. 138 * @param idHref
139 * @returns 140 */ 141function establecerEmailHref(idHref) { 142 let enlace = $('#' + idHref); 143 let dir = "mailto:" + enlace.data("dir") + "@" + enlace.data("server") + "." + enlace.data("extension"); 144 enlace.attr('href', dir); 145} 146 147/** 148 * Lee el CSRF Token del input oculto si existe y lo añade a la request. Si no existe el input que contiene el token, no hace nada. 149 * @param request request de la petición AJAX en la que incluir la cabecera con el token 150 */ 151function setXCSRFTokenHeader(request){ 152 var hiddenInput = $('input[name=_csrf]'); 153 if (hiddenInput.length > 0){ 154 request.setRequestHeader("X-CSRF-TOKEN", hiddenInput.val()); 155 } 156} 157 158/** 159 * Dadas dos fechas, indica el periodo en meses. en caso de no venir alguna, nos devuelve texto vacio 160 */ 161var calcularMeses = function(fechaIni,fechaFin) { 162 var exp; 163 if (fechaIni.trim() && fechaFin.trim()) { 164 var meses; 165 meses = (toDate(fechaFin).getFullYear() - toDate(fechaIni).getFullYear()) * 12; 166 meses -= toDate(fechaIni).getMonth(); 167 meses += toDate(fechaFin).getMonth(); 168 if(toDate(fechaFin).getDate() < toDate(fechaIni).getDate()){ 169 meses -= 1; 170 } 171 if (meses > 0) { 172 exp = meses; 173 } else { 174 exp = 0; 175 } 176 } else { 177 exp = ""; 178 } 179 return exp; 180} 181 182function put(data, destUrl, successCallback, errorCallback, alwaysCallback) { 183 _ajax(data, destUrl, 'PUT', successCallback, errorCallback, alwaysCallback); 184} 185 186function get(destUrl, successCallback, errorCallback, alwaysCallback) { 187 _ajax(null, destUrl, 'GET', successCallback, errorCallback, alwaysCallback); 188} 189 190function post(data, destUrl, successCallback, errorCallback, alwaysCallback) { 191 _ajax(data, destUrl, 'POST', successCallback, errorCallback, alwaysCallback); 192} 193 194function delet(destUrl, successCallback, errorCallback, alwaysCallback) { 195 _ajax(null, destUrl, 'DELETE', successCallback, errorCallback, alwaysCallback); 196} 197 198function _ajax(data, destUrl, verb, successCallback, errorCallback, alwaysCallback) { 199 var jqxhr = $.ajax({ 200 url : destUrl, 201 type : verb, 202 contentType : "application/json", 203 data : data, 204 beforeSend : function(request) { 205 setXCSRFTokenHeader(request); 206 } 207 }).done(function(data, textStatus, jqXHR) { 208 if (successCallback) { 209 successCallback(data, textStatus, jqXHR); 210 } 211 }).fail(function(jqXHR, textStatus, errorThrown) { 212 if (errorCallback) { 213 errorCallback(jqXHR, textStatus, errorThrown); 214 } else { 215 genericErrorCallback(jqXHR, textStatus, errorThrown); 216 } 217 }).always(function() { 218 if (alwaysCallback) { 219 alwaysCallback();// TODO parámetros 220 } 221 }); 222} 223 224//https://stackoverflow.com/a/35713609 225function s2ab(s) { 226 var buf = new ArrayBuffer(s.length); 227 var view = new Uint8Array(buf); 228 for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; 229 return buf; 230} 231 232/** 233 * Genera descarga 'offline' de un fichero recibido en B64 234 * @param data 235 * @param filename 236 * @returns 237 */ 238function generarDescargaLocalB64(data, filename){ 239 var blob = new Blob([s2ab(atob(data))], { 240 type: '' 241 }); 242 243 var link = document.createElement('a'); 244 link.href = window.URL.createObjectURL(blob); 245 link.download = filename; 246 link.style.display = 'none'; 247 248 document.body.appendChild(link); 249 link.click(); 250 document.body.removeChild(link); 251 window.URL.revokeObjectURL(blob); 252} 253 254//https://css-tricks.com/snippets/javascript/htmlentities-for-javascript/ 255function htmlEntities(str) { 256 return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"') 257 .replace(/'/g, '''); 258} 259 260/** 261 * Recoge el nombre de enlaces para no ser rastreados 262 * */ 263function establecerMailDeferred(idSpan){ 264 $(document).ready(function() { 265 establecerEmail(idSpan); 266 });
267} 268 269/** 270 * Crea un contador (dependencia a CountUp.js), permitiendo sobrecargar los valores por defecto 271 * de la animación. Se debe indicar el ID del elemento que tendrá el texto y el attributo data-count 272 * necesarios para setear los números y coger el valor final del contador. Si se lanzará iniciado y opcionalmente los 273 * parámetros de sobrecarga. 274 * Devuelve el contador creado por si se quiere gestionar posteriormente. 275 * @returns 276 */ 277function crearContador(elemId, iniciar, options) { 278 let valorFinal = $('#' + elemId).data('count'); 279 280 let contador; 281 if (options) { 282 contador = new CountUp(elemId, valorFinal, options); 283 } else { 284 contador = new CountUp(elemId, valorFinal); 285 } 286 287 if (iniciar) { 288 contador.start(); 289 } 290 291 return contador; 292} 293 294// Dada una fecha, la devuelve sumandole el numero de meses pasador como parametro 295function _addMeses(fecActive, meses) { 296 if (fecActive != "" && meses != "") { 297 var date = new Date(_validDateFormat(fecActive)); 298 date.setMonth(date.getMonth() + parseInt(meses)); 299 var newdateFecFin = new Date(date.getFullYear(), date.getMonth(), parseInt(date.getDate())); 300 //newdateFecFin.setDate(newdateFecFin.getDate() + parseInt(meses)); 301 302 var dd = newdateFecFin.getDate(); 303 var mm = newdateFecFin.getMonth() + 1; 304 var y = newdateFecFin.getFullYear(); 305 306 return [ dd, mm, y ].join('/'); 307 } else { 308 return ""; 309 } 310} 311 312// Devuelve la fecha en formato mm/dd/YYYY 313function _validDateFormat(fecActive) { 314 var day = fecActive.split("/")[0]; 315 var month = fecActive.split("/")[1]; 316 var year = fecActive.split("/")[2]; 317 return [ month, day, year ].join('/'); 318} 319 320// Reemplaza el patrón window.location.href + setTimeout, que en iOS Safari 321// disparaba el diálogo de descarga al recibir 204 No Content del endpoint. 322// El fetch es fire-and-forget; el callback se invoca cuando termina la 323// petición o tras 1500 ms (lo que ocurra primero) para no quedar colgado 324// en redes mal conectadas. 325function cerrarSesionClaveUnica(callback) { 326 var timeout = new Promise(function(resolve) { setTimeout(resolve, 1500); }); 327 var request = fetch('https://accounts.claveunica.gob.cl/api/v1/accounts/app/logout', { 328 method: 'GET', mode: 'no-cors', credentials: 'include' 329 }).catch(function() { /* ignorar errores de red */ }); 330 Promise.race([request, timeout]).finally(function() { 331 if (typeof callback === 'function') callback(); 332 }); 333} 334 335// Método 2 de la guÃa ClaveÃnica: cierra la sesión SSO con navegación real 336// del navegador y, tras ~1s, continúa al authorize (urlContinuar). 337function prepararLoginClaveUnica(urlContinuar) { 338 if (!urlContinuar) { 339 return; 340 } 341 window.location.href = 'https://accounts.claveunica.gob.cl/api/v1/accounts/app/logout'; 342 setTimeout(function() { 343 window.location.href = urlContinuar; 344 }, 1000); 345}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.