@vlci/vlcishared 38.0.0 → 39.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.vlcishared=e():t.vlcishared=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{addPointInteger:()=>d,buildCamarasTrafico:()=>st,buildTableCalidadAire:()=>nt,calculateMaxYAxis:()=>S,calculatePentahoPath:()=>ot,calculateXAxisStart:()=>y,checkAllGroupsCollapsed:()=>Z,configureDataBar:()=>w,configureDataGaugeCommon:()=>C,configureDataGaugeMonthCommon:()=>$,configureDataLine:()=>x,convertToLanguageSelectorDateRange:()=>H,convertToTableTreeView:()=>Q,downloadCSVTable:()=>tt,downloadPDFTable:()=>et,formatCellMultiplesLines:()=>Y,formatDayMonthYear:()=>i,formatMilMillionEuros:()=>M,formatMonthAnyo:()=>a,formatName:()=>f,formatNameHeaderColumn:()=>W,formatRoundTooltip:()=>A,formatShortMonthShortYear:()=>l,formatShortMonthYear:()=>s,formatToMillions:()=>m,formatTooltip:()=>g,formatTooltipPie:()=>v,formatTrimestre:()=>c,getEnvironment:()=>rt,getMaxFieldNumberFromData:()=>T,getMonth:()=>o,getMonthList:()=>u,getSelectCommonOptions:()=>J,getSelectTwoColumnsOptions:()=>G,initBarChart:()=>dt,initBarChartComparationMonth:()=>gt,initChart:()=>p,initStackedBarChart:()=>ct,initStackedBarChartMonthSeries:()=>ut,initTable:()=>U,initialCalls:()=>it,loadIframeOnClickEvent:()=>yt,printDataChart:()=>b,printDataInHTMLElements:()=>L,printNoDataChart:()=>h,resetFilter:()=>j,resetFilterDates:()=>V,resultsetWithFields:()=>N,selectConfigDatasource:()=>_,selectFilterAll:()=>R,splitDataset:()=>I,traverseRows:()=>K,updateObject:()=>F});const n={"01":"Enero","02":"Febrero","03":"Marzo","04":"Abril","05":"Mayo","06":"Junio","07":"Julio","08":"Agosto","09":"Septiembre",10:"Octubre",11:"Noviembre",12:"Diciembre"};function o(t){return{1:"Gen",2:"Feb",3:"Mar",4:"Abr",5:"Mai",6:"Jun",7:"Jul",8:"Ago",9:"Sep",10:"Oct",11:"Nov",12:"Des"}[parseInt(t.toString(),10)]}function r(t){return[t.substring(0,4),n[t.substring(4,6)]]}function a(t){const[e,n]=r(t);return`${n} ${e}`}function i(t){const[e,o,r]=function(t){return[t.substring(0,4),n[t.substring(4,6)],t.substring(6,8)]}(t);return`${r} ${o} ${e}`}function s(t){const[e,n]=r(t);return`${n.substring(0,3)} ${e}`}function l(t){const[e,n]=r(t);return`${n.substring(0,3)} '${e.substring(2,4)}`}function c(t){const[e,n]=t.split("-");return`${parseFloat(n)/3}T ${e}`}function u(t,e){const n=t[e];return Array.from(n.values()).map((t=>t.slice(0,3)))}function d(t,e=2){let n=navigator.language||navigator.userLanguage;n=n.length<=2?`${n}-${n.toUpperCase()}`:n;const o={minimumFractionDigits:0,maximumFractionDigits:e};return"es-ES"===n?t.toLocaleString("de-DE",o):t.toLocaleString(n,o)}function m(t){const e=1e6;return t>=e?t/e+"M":t.toString()}function f(t,e=29){if(t.length>=e){const n=t.split(" ");let o="",r="";return n.forEach((t=>{`${o} ${t}`.length<=e?o+=(o?" ":"")+t:(r+=`${o}\n`,o=t)})),r+=o,r}return t}function p(t,e){const n=document.getElementById(t);if(!n)return console.error(`No se pudo encontrar el elemento con ID ${t}.`),null;const o=echarts.init(n);o.setOption(e,!0),window.addEventListener("resize",(()=>{null!=o&&void 0!==o&&o.resize()}));const r=document.getElementById("main-content");return r&&(r.addEventListener("shown.bs.collapse",(()=>{o.resize()})),r.addEventListener("hidden.bs.collapse",(()=>{o.resize()}))),o}function h(t,e){const n=t?document.querySelector(t):null,o=e?document.querySelector(e):null;n&&(n.hidden=!0),o&&(o.style.background="url('./build/images/nodata1.png') no-repeat top center",o.hidden=!1)}function b(t,e){const n=t?document.querySelector(t):null,o=e?document.querySelector(e):null;n&&(n.hidden=!0),o&&(o.style.background="#ffffff",o.hidden=!1)}function g(t,e=!1,n=!0,o=""){let r=`<p>${t[0].name}</p>`;return t.forEach((t=>{const a=e?Math.round(t.data):t.data,i=n?`<div>${s=t.color,`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${s}"></span>`} ${t.seriesName}: \n <strong style="float: right; margin-left:20px">\n ${t.data?`${d(a)} ${o}`:"-"}\n </strong>\n </div>`:`<div>\n <strong>${t.data?`${d(a)} ${o}`:"-"}\n </strong>\n </div>`;var s;r+=i})),r}function y(t){return 100*(t-120)/t}function S(t,e){const n=Math.max(...t);return n+(e-n%e)}function v(t,e=!1){const n=`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${t.color}"></span>`,o=e?`${t.percent}%`:d(t.value);return`<div> ${n} ${t.name} <strong style="float: right; margin-left:20px"> ${o} </strong></div>`}function A(t,e){let n=`${t.name} : `;return n+=`<span style="font-weight:bold">${d(Math.round(t.value))}</span>`,e&&(n+=`<span> (${t.percent}%)</span>`),t.marker+n}function M(t){const e=1e6;return t>=0&&t<e?`${d(t,0)} €`:t>=e?`${d(t/e)} M €`:"-"}function E(t,e,n=1){const o=Math.max(...t.map((t=>t[e])))*n;return 5e3*Math.ceil(o/5e3)}function C(t,e,n,o=30,r=15,a=30,i=-70,s=70,l=3){const c=E(t,e.data,1.1),u=s,m=n.slice(),p=[];let h=r,b=a,g=i;for(let n=0;n<t.length;n+=1)p.push({value:t[n][e.data],name:f(String(t[n][e.type]).replace(/\[.*?\]/g,"")),color:m.shift(),title:{offsetCenter:[`${String(g)}%`,`${String(h)}%`],fontFamily:"Montserrat",fontSize:o},detail:{offsetCenter:[`${String(g)}%`,`${String(b)}%`],fontFamily:"Montserrat",width:"33%",formatter:t=>d(Math.round(t))}}),g+=u,(n+1)%l==0&&(b+=a,h+=2*r,g=i);return[c,p]}function $(t,e,n,r=0){return[E(e,n.data,1),t=>function(t,e,n){const r=d(Math.round(e)),a=o(t[n][0]),i=t[n][1],s=`\n${a} ${i} : ${r}`,l=`${r}\n${a} ${i}`;return window.innerWidth<=1710?s:l}(e,t,r),[{value:e[r][n.data]}]]}function D(t,e){const{resultset:n}={resultset:t},o=new Set,r=new Set,a=n.map((([t,n,a])=>{const i=e?Math.round(a):a;return o.add(t),r.add(n),{day:n,type:t,value:i}})),i=Array.from(r.values()),s=Array.from(o.values());return s.sort(((t,e)=>t.toLowerCase().localeCompare(e.toLowerCase(),"es",{ignorePunctuation:!0}))),[s.map((t=>{const e=a.filter((e=>e.type===t)).map((({day:e,value:n})=>[e,t,n])),n=i.map((t=>{const n=e.find((([e])=>e===t));return n?n[2]:null}));return{name:t,data:n}})),s,r]}function x(t,e,n=!1){const[o,r,a]=D(t,n);return o.forEach((t=>{t.type="line",t.symbol="circle",t.color=e.shift(),t.symbolSize=6,t.smooth=.1})),[o,a,r]}function w(t,e,n=!1){const[o,r,a]=D(t,n);return o.forEach((t=>{t.type="bar",t.color=e.shift(),t.smooth=!1})),[o,a,r]}function N(t){const{resultset:e,metadata:n}=t,o=[];return e.forEach((t=>{const e={};t.forEach(((t,o)=>{e[n[o].colName]=t})),o.push(e)})),o}function F(t,e){const n=t;return Object.keys(e).forEach((o=>{Object.prototype.hasOwnProperty.call(e,o)&&("series"===o?n[o]=e[o].map(((e,n)=>({...t[o][n],...e}))):"object"!=typeof e[o]||Array.isArray(e[o])?n[o]=e[o]:n[o]=F(t[o]||{},e[o]))})),t}function L(t,e){t.forEach((t=>{t.id in e&&Object.entries(e[t.id]).forEach((n=>{const o=n[0],r=n[1];"object"==typeof r?r.className?document.querySelector(r.className).className=t[o]:r.element&&r.format&&(document.querySelector(r.element).textContent=e[t.id][o].format(t[o])):document.querySelector(r).textContent=t[o]}))}))}function T(t,e){const n=N(t),o=[];let r=null;return n.forEach((t=>{const n=t[e];"number"!=typeof n||Number.isNaN(n)||o.push(n)})),o.length>0&&(r=Math.max(...o)),r}function I(t,e=!0){const n={Cont:[],Mob:[]};return t.forEach((t=>{"is-res-001-kgs-contenidors"===t[0]&&"total"===t[1]&&(e?n.Cont.push([t[3],t[4],t[2]]):n.Cont.push([t[3],t[2]])),"Mobles"===t[1]&&(e?n.Mob.push([t[3],t[4],t[2]]):n.Mob.push([t[3],t[2]]))})),n}const O=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],k=["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],P=["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],B=["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],q=["Do","Lu","Ma","Mi","Ju","Vi","Sá"];function R(t){const e=t.resultset.map((t=>t[0]));return this.dashboard.fireChange(this.parameter,e),t}function z(t){for(const e of t)if(Array.isArray(e)){if(!z(e))return!1}else if("All"!==e)return!1;return!0}function _(t,e,n,o){return z(e)?(t.queryDefinition.dataAccessId=n,t.dashboard.setParameter(t.parameter,["All"])):t.queryDefinition.dataAccessId=o,!0}function j(t){t.forEach((t=>{Dashboards.fireChange(t,["All"])}))}function J(){return{input:{root:{id:"All"},indexes:{id:0,label:0}},component:{Root:{strings:{isDisabled:"No disponible",allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}},Group:{Strings:{allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}}}}}function G(){const t={input:{root:{id:"All"},indexes:{id:0,label:0}},component:{Root:{strings:{isDisabled:"No disponible",allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}},Group:{Strings:{allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}}}};return t.input.indexes.id=1,t.input.indexes.label=0,t}function V(t,e,n,o){const r=Dashboards.getParameterValue(n),a=Dashboards.getParameterValue(o);return Dashboards.fireChange(t,[r]),Dashboards.fireChange(e,[a]),!0}function H(t){t.regional.es={monthNames:O,abbreviatedMonthNames:k,dayNames:P,abbreviatedDayNames:B,dayNamesMin:q,weekHeader:"Sm",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},t.setDefaults(t.regional.es)}function U(t,e){const n=document.getElementById(t);return n?new Tabulator(n,e):(console.error(`No se pudo encontrar el elemento con ID ${t}.`),null)}function W(t,e){let n=t.getValue();return n.length>e&&(n=`${n.substr(0,e)}<br>${n.substr(e)}`),n}function Y(t,e){const n=t.getValue().split(" ");let o="",r="";return n.forEach((t=>{(r+t).length<=e?r+=`${t} `:(o+=`${r}<br>`,r=`${t} `)})),o+=`${r}<br>`,o}function X(t,e){"expand"===e?t.treeExpand():t.treeCollapse();const n=t.getTreeChildren();n.length>0&&n.forEach((t=>{t.getTreeChildren().length>0&&X(t,e)}))}function K(t,e){t.getRows().forEach((t=>{t.getTreeChildren().length>0&&X(t,e)}))}function Q(t,e,n,o){const r=[];for(const a in t)if(t.hasOwnProperty(a)){const i=t[a],s={[e]:i[0],_children:[]};i.shift(),i.forEach(((t,r)=>{const a={[e]:n[r],[o]:t};s._children.push(a)})),r.push(s)}return r}function Z(t){let e=!0;return t.getGroups().forEach((t=>{t._group.visible&&(e=!1)})),e}function tt(t,e,n){const o=document.getElementById(n),r=o.cloneNode(!0);o.parentNode.replaceChild(r,o),r.addEventListener("click",(()=>{t.download("csv",`${e}.csv`,{delimiter:";"})}))}function et(t,e,n){const o=document.getElementById(n),r=o.cloneNode(!0);o.parentNode.replaceChild(r,o),r.addEventListener("click",(()=>{t.download("pdf",`${e}.pdf`,{title:e,rowCalcStyles:{fontSize:8,fontStyle:"bold"},autoTable:{styles:{fontSize:8}}})}))}function nt(t){const e=[],n=[100,200,350,500,750,751],o=[40,90,120,230,340,341],r=[50,100,130,240,380,381],a=[20,40,50,100,150,151],i=[10,20,25,50,75,76],s={0:"b",1:"a",2:"d",3:"m",4:"mm",5:"em",6:"",7:"nd"};function l(t,e,n){const o=document.createElement("td");if(o.setAttribute("id",t),null!=e){o.innerHTML=e;const t=function(t,e){let n;return void 0===e?n=6:"ND"===e?n=7:(n=5,t.forEach(((t,o)=>{e<=t&&5===n&&(n=o)}))),s[n]}(n,e);o.classList.add(t)}return o}return t.forEach((t=>{const s=t;"noData"===s.operationalstatus&&(s.so2value="ND",s.no2value="ND",s.o3value="ND",s.pm10value="ND",s.pm25value="ND"),"A09_CABANYAL_60m"===s.entityid&&(s.pm10value=void 0,s.pm25value=void 0);const c=document.createElement("tr"),u=document.createElement("td");u.innerHTML=s.address,c.appendChild(u),c.appendChild(l(`${s.entityid}_so2`,s.so2value,n)),c.appendChild(l(`${s.entityid}_no2`,s.no2value,o)),c.appendChild(l(`${s.entityid}_o3`,s.o3value,r)),c.appendChild(l(`${s.entityid}_pm10`,s.pm10value,a)),c.appendChild(l(`${s.entityid}_pm25`,s.pm25value,i)),e.push(c)})),e}function ot(t){document.location=`${document.documentURI.split("%3A")[0]}%3A${document.documentURI.split("%3A")[1]}%3A${document.documentURI.split("%3A")[2]}%3A${document.documentURI.split("%3A")[3]}%3A${t}`}function rt(){const t=window.location.href;let e="";return e=t.includes("localhost")?"local":t.includes("sc_valencia_pre")?"PRE":"PRO",e}function at(t,e){document.querySelectorAll(`[${t}]`).forEach((n=>{!function(t,e,n){const o=e;if(t){const e=new XMLHttpRequest;e.onreadystatechange=function(){4===this.readyState&&(200===this.status&&(o.innerHTML=this.responseText,n&&n()),404===this.status&&(o.innerHTML="No se ha podido cargar correctamente."))},e.open("GET",t,!0),e.send()}}(n.getAttribute(t),n,e)}))}function it(t){at("include-html-cabecera",(function(){!function(){const t=rt();"PRO"!==t&&(document.title+=` (${t})`)}(),function(){const t=rt();"PRO"!==t&&(document.querySelector("nav").querySelectorAll("span")[1].textContent+=` (${t})`)}()})),at("include-html-menu"),at("include-html-main-container",(function(){(function(){const t=document.querySelector("body");t.classList.remove("inicio"),t.classList.add(document.documentURI.split("%3A")[4].match(/(.*?).wcdf/)[1])})(),t&&t()})),at("include-html-copyright")}function st(t,e,n,o,r,a){let i=!1,s=!1;const l=document.querySelector(t),c=document.querySelector(e),u=()=>{"undefined"!=typeof Liferay&&"ca-ES"===Liferay.ThemeDisplay.getBCP47LanguageId()?(l&&l.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=cas"),c&&c.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?lang=cas")):(l&&l.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=val"),c&&c.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?lang=val"))};function d(t=!0){const e=document.querySelector(n);t?(l&&(l.src="about:blank"),c&&(c.src="about:blank"),e.classList.add("blur"),s=!0):(e.classList.remove("blur"),u(),s=!1)}const m=t=>{new IntersectionObserver((t=>{t.forEach((t=>{t.isIntersecting&&(s||u(),i||(i=!0,window.setTimeout(d,a)))}))})).observe(t)};!function(){const{userAgent:t}=navigator;return/iPad|iPhone|iPod|Macintosh/.test(t)&&!window.MSStream}()?(l&&(l.setAttribute("sandbox","allow-scripts"),m(l)),c&&(c.setAttribute("sandbox","allow-scripts"),m(c)),document.querySelector(r).addEventListener("click",(()=>{d(!1),window.setTimeout(d,a)}))):document.querySelectorAll(o)[0].style.display="none"}const lt=(t,e)=>{e.sort(((t,e)=>parseInt(t.anyo)-parseInt(e.anyo)));const n={};e.forEach((e=>{const o=e[1],r=e[0];r!==t.seriesName||n[o]||(n[o]=0),r===t.seriesName&&(n[o]+=e[2])}));let o=`<p>${t.seriesName}</p>`;for(const[e,r]of Object.entries(n))o+=`<div>${t.marker} ${e}: <strong style="float: right; margin-left:20px">${d(r)}</strong></div>`;return o};function ct(t,e,n=void 0,o=void 0){const r=null===o?void 0:o,a=new Set(e.map((t=>t[1])));let i;const s={title:{text:"SIN TITULO",left:"center",top:"top",textStyle:{fontSize:20,fontFamily:"Montserrat",fontWeight:600,color:"#666"}},tooltip:{axisPointer:{type:"shadow"},trigger:"item",formatter:t=>lt(t,e),textStyle:{fontFamily:"Montserrat"},position(t,e,n,o,r){const a={},i=r.contentSize[1]/2,s=r.viewSize[1],l=t[1];return l<i?a.top=10:l+i>s?a.bottom=10:a.top=l-i,t[0]<r.viewSize[0]/2?a.left=t[0]+20:a.right=r.viewSize[0]-t[0]+20,a}},legend:{padding:40,textStyle:{fontFamily:"Montserrat"}},grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0},xAxis:{type:"value",splitNumber:10,name:"SIN NOMBRE",nameLocation:"start",nameTextStyle:{fontWeight:"bold",fontFamily:"Montserrat",color:"#666",padding:-40},axisLabel:{margin:5,textStyle:{fontFamily:"Montserrat"},formatter:t=>d(t)},splitLine:{lineStyle:{color:"#DDD"}}},yAxis:{type:"category",data:Array.from(a),axisLabel:{textStyle:{fontFamily:"Montserrat"}}},series:(()=>{const t={name:"SIN NOMBRE",type:"bar",stack:"total",label:{show:!0,fontFamily:"Montserrat",fontSize:10,formatter:t=>d(Math.round(t.value))},itemStyle:void 0,emphasis:{focus:"series"},data:void 0};r&&r.itemStyle&&Array.isArray(r.itemStyle.borderColor)&&(i=[...r.itemStyle.borderColor],delete r.itemStyle.borderColor);const n=function(t,e){return t.reduce(((t,e)=>{const n=e[0];return t[n]||(t[n]=[]),t[n].push(e),t}),{})}(e),o=Object.keys(n);a.forEach((t=>{o.forEach((e=>{void 0===n[e].find((e=>e[1]===t))&&(n[e].push([n[e][0][0],t,void 0]),n[e].sort())}))}));const s=[];return Object.keys(n).forEach((e=>{i&&(t.itemStyle={borderColor:i.shift()}),t.name=e,t.data=n[e].map((t=>t[2]));let o={};o=void 0!==r?F(t,r):t,s.push({...o})})),s})(),toolbox:{show:!0,feature:{restore:{title:"Restablir"},saveAsImage:{title:"Desar"}},right:50}};let l={};l=void 0!==n?F(s,n):s,p(t,l)}function ut(t,e,n={},r={}){let a={};a=F(n,{color:["#81B1CC","#ABD9EA","#C2EEF9","#F9E2AF","#F9C780","#FDAE61","#F46D43","#FDAE61","#F9E2AF","#C2EEF9","#ABD9EA","#81B1CC"],yAxis:{data:function(){const t=new Set;return e.forEach((e=>{t.add(e[1])})),Array.from(t).sort(((t,e)=>t-e))}()}});const i={itemStyle:{borderWidth:2,borderColor:["#448DAD","#89CADB","#A0DEE8","#F4D28C","#F4B569","#F79646","#F25930","#F79646","#F4D28C","#A0DEE8","#89CADB","#448DAD"]}},s=null===r?i:F(r,i),l=e;l.forEach(((t,e)=>{l[e][0]=o(t[0])})),ct(t,l,a,s)}function dt(t,e=void 0){const n={title:{text:"SIN TITULO",left:"center",top:"top",padding:50,textStyle:{fontSize:14,fontFamily:"Montserrat",fontWeight:400,color:"#333"}},legend:{show:!1},grid:{top:"30%",bottom:"5%",left:"8%",right:"8%"},xAxis:{type:"value",show:!1},yAxis:{show:!1,type:"category"},tooltip:{show:!0,textStyle:{fontFamily:"Montserrat",fontWeight:"600"},appendToBody:!0,formatter:t=>A(t,!1)},series:[{type:"bar",showBackground:!0}]};let o={};o=void 0!==e?F(n,e):n,p(t,o)}const mt="es_ES",ft={es_ES:new Map([["1","Enero"],["2","Febrero"],["3","Marzo"],["4","Abril"],["5","Mayo"],["6","Junio"],["7","Julio"],["8","Agosto"],["9","Septiembre"],["10","Octubre"],["11","Noviembre"],["12","Diciembre"]]),ca_ES:new Map([["1","Gener"],["2","Febrer"],["3","Març"],["4","Abril"],["5","Maig"],["6","Juny"],["7","Juliol"],["8","Agost"],["9","Setembre"],["10","Octubre"],["11","Novembre"],["12","Desembre"]])};function pt(t){return Math.max(...t.map((t=>Number(t[0]))))}function ht(t){const e=t.filter((e=>Number(e[0])===pt(t))),n=Array.from({length:12},(()=>0));return e.forEach((([t,e,o])=>{const r=parseInt(e,10)-1;n[r]=o})),n}function bt(t){const e=t.filter((e=>Number(e[0])===pt(t)-1)),n=Array.from({length:12},(()=>0));return e.forEach((([t,e,o])=>{const r=parseInt(e,10)-1;n[r]=o})),n}function gt(t,e,n=void 0){const o=pt(e).toString(),r=(pt(e)-1).toString();dt(t,F({title:{left:"center",top:"-12%",textStyle:{fontSize:15,fontFamily:"Montserrat"}},legend:{top:"10%",show:!0,data:[r,o],textStyle:{fontFamily:"Montserrat"}},grid:{bottom:"8%",top:"20%",right:"2%"},xAxis:[{type:"category",data:u(ft,mt),axisLabel:{fontFamily:"Montserrat"}}],yAxis:[{type:"value",axisLabel:{formatter:t=>t.toLocaleString("es-ES"),fontFamily:"Montserrat"}}],series:[{name:r,type:"bar",data:bt(e)},{name:o,type:"bar",barGap:0,data:ht(e)}]},n))}function yt(t,e,n){const o=document.querySelector(e),r=document.querySelector(t);let a=!1;r.addEventListener("click",(()=>{!1===a&&(a=!0,o.setAttribute("src","about:blank"),o.setAttribute("src",n),o.onload=()=>{a=!1})})),r.disabled=!1}return e})()));
1
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.vlcishared=e():t.vlcishared=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{addPointInteger:()=>d,buildCamarasTrafico:()=>ut,buildTableCalidadAire:()=>at,calculateMaxYAxis:()=>S,calculatePentahoPath:()=>it,calculateXAxisStart:()=>y,checkAllGroupsCollapsed:()=>nt,configureDataBar:()=>w,configureDataGaugeCommon:()=>E,configureDataGaugeMonthCommon:()=>D,configureDataLine:()=>x,convertToLanguageSelectorDateRange:()=>Y,convertToTableTreeView:()=>et,downloadCSVTable:()=>ot,downloadPDFTable:()=>rt,formatCellMultiplesLines:()=>Q,formatDayMonthYear:()=>i,formatMilMillionEuros:()=>M,formatMonthAnyo:()=>a,formatName:()=>f,formatNameHeaderColumn:()=>K,formatRoundTooltip:()=>A,formatShortMonthShortYear:()=>l,formatShortMonthYear:()=>s,formatToMillions:()=>m,formatTooltip:()=>g,formatTooltipPie:()=>v,formatTrimestre:()=>c,getEnvironment:()=>st,getMaxFieldNumberFromData:()=>T,getMonth:()=>o,getMonthList:()=>u,getSelectCommonOptions:()=>J,getSelectTwoColumnsOptions:()=>V,initBarChart:()=>pt,initBarChartComparationMonth:()=>vt,initChart:()=>p,initStackedBarChart:()=>mt,initStackedBarChartMonthSeries:()=>ft,initTable:()=>X,initValueDefaultDate:()=>U,initialCalls:()=>ct,loadIframeOnClickEvent:()=>At,printDataChart:()=>b,printDataInHTMLElements:()=>L,printNoDataChart:()=>h,resetFilter:()=>j,resetFilterDate:()=>H,resetFilterDates:()=>G,resultsetWithFields:()=>N,selectConfigDatasource:()=>_,selectFilterAll:()=>R,selectValueDefaultInFilter:()=>W,splitDataset:()=>I,traverseRows:()=>tt,updateObject:()=>F});const n={"01":"Enero","02":"Febrero","03":"Marzo","04":"Abril","05":"Mayo","06":"Junio","07":"Julio","08":"Agosto","09":"Septiembre",10:"Octubre",11:"Noviembre",12:"Diciembre"};function o(t){return{1:"Gen",2:"Feb",3:"Mar",4:"Abr",5:"Mai",6:"Jun",7:"Jul",8:"Ago",9:"Sep",10:"Oct",11:"Nov",12:"Des"}[parseInt(t.toString(),10)]}function r(t){return[t.substring(0,4),n[t.substring(4,6)]]}function a(t){const[e,n]=r(t);return`${n} ${e}`}function i(t){const[e,o,r]=function(t){return[t.substring(0,4),n[t.substring(4,6)],t.substring(6,8)]}(t);return`${r} ${o} ${e}`}function s(t){const[e,n]=r(t);return`${n.substring(0,3)} ${e}`}function l(t){const[e,n]=r(t);return`${n.substring(0,3)} '${e.substring(2,4)}`}function c(t){const[e,n]=t.split("-");return`${parseFloat(n)/3}T ${e}`}function u(t,e){const n=t[e];return Array.from(n.values()).map((t=>t.slice(0,3)))}function d(t,e=2){let n=navigator.language||navigator.userLanguage;n=n.length<=2?`${n}-${n.toUpperCase()}`:n;const o={minimumFractionDigits:0,maximumFractionDigits:e};return"es-ES"===n?t.toLocaleString("de-DE",o):t.toLocaleString(n,o)}function m(t){const e=1e6;return t>=e?t/e+"M":t.toString()}function f(t,e=29){if(t.length>=e){const n=t.split(" ");let o="",r="";return n.forEach((t=>{`${o} ${t}`.length<=e?o+=(o?" ":"")+t:(r+=`${o}\n`,o=t)})),r+=o,r}return t}function p(t,e){const n=document.getElementById(t);if(!n)return console.error(`No se pudo encontrar el elemento con ID ${t}.`),null;const o=echarts.init(n);o.setOption(e,!0),window.addEventListener("resize",(()=>{null!=o&&void 0!==o&&o.resize()}));const r=document.getElementById("main-content");return r&&(r.addEventListener("shown.bs.collapse",(()=>{o.resize()})),r.addEventListener("hidden.bs.collapse",(()=>{o.resize()}))),o}function h(t,e){const n=t?document.querySelector(t):null,o=e?document.querySelector(e):null;n&&(n.hidden=!0),o&&(o.style.background="url('./build/images/nodata1.png') no-repeat top center",o.hidden=!1)}function b(t,e){const n=t?document.querySelector(t):null,o=e?document.querySelector(e):null;n&&(n.hidden=!0),o&&(o.style.background="#ffffff",o.hidden=!1)}function g(t,e=!1,n=!0,o=""){let r=`<p>${t[0].name}</p>`;return t.forEach((t=>{const a=e?Math.round(t.data):t.data,i=n?`<div>${s=t.color,`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${s}"></span>`} ${t.seriesName}: \n <strong style="float: right; margin-left:20px">\n ${t.data?`${d(a)} ${o}`:"-"}\n </strong>\n </div>`:`<div>\n <strong>${t.data?`${d(a)} ${o}`:"-"}\n </strong>\n </div>`;var s;r+=i})),r}function y(t){return 100*(t-120)/t}function S(t,e){const n=Math.max(...t);return n+(e-n%e)}function v(t,e=!1){const n=`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${t.color}"></span>`,o=e?`${t.percent}%`:d(t.value);return`<div> ${n} ${t.name} <strong style="float: right; margin-left:20px"> ${o} </strong></div>`}function A(t,e){let n=`${t.name} : `;return n+=`<span style="font-weight:bold">${d(Math.round(t.value))}</span>`,e&&(n+=`<span> (${t.percent}%)</span>`),t.marker+n}function M(t){const e=1e6,n=Number(t);return n>=0&&n<e?`${d(n)} €`:n>=e?`${d(n/e)} M €`:"-"}function C(t,e,n=1){const o=Math.max(...t.map((t=>t[e])))*n;return 5e3*Math.ceil(o/5e3)}function E(t,e,n,o=30,r=15,a=30,i=-70,s=70,l=3){const c=C(t,e.data,1.1),u=s,m=n.slice(),p=[];let h=r,b=a,g=i;for(let n=0;n<t.length;n+=1)p.push({value:t[n][e.data],name:f(String(t[n][e.type]).replace(/\[.*?\]/g,"")),color:m.shift(),title:{offsetCenter:[`${String(g)}%`,`${String(h)}%`],fontFamily:"Montserrat",fontSize:o},detail:{offsetCenter:[`${String(g)}%`,`${String(b)}%`],fontFamily:"Montserrat",width:"33%",formatter:t=>d(Math.round(t))}}),g+=u,(n+1)%l==0&&(b+=a,h+=2*r,g=i);return[c,p]}function D(t,e,n,r=0){return[C(e,n.data,1),t=>function(t,e,n){const r=d(Math.round(e)),a=o(t[n][0]),i=t[n][1],s=`\n${a} ${i} : ${r}`,l=`${r}\n${a} ${i}`;return window.innerWidth<=1710?s:l}(e,t,r),[{value:e[r][n.data]}]]}function $(t,e){const{resultset:n}={resultset:t},o=new Set,r=new Set,a=n.map((([t,n,a])=>{const i=e?Math.round(a):a;return o.add(t),r.add(n),{day:n,type:t,value:i}})),i=Array.from(r.values()),s=Array.from(o.values());return s.sort(((t,e)=>t.toLowerCase().localeCompare(e.toLowerCase(),"es",{ignorePunctuation:!0}))),[s.map((t=>{const e=a.filter((e=>e.type===t)).map((({day:e,value:n})=>[e,t,n])),n=i.map((t=>{const n=e.find((([e])=>e===t));return n?n[2]:null}));return{name:t,data:n}})),s,r]}function x(t,e,n=!1){const[o,r,a]=$(t,n);return o.forEach((t=>{t.type="line",t.symbol="circle",t.color=e.shift(),t.symbolSize=6,t.smooth=.1})),[o,a,r]}function w(t,e,n=!1){const[o,r,a]=$(t,n);return o.forEach((t=>{t.type="bar",t.color=e.shift(),t.smooth=!1})),[o,a,r]}function N(t){const{resultset:e,metadata:n}=t,o=[];return e.forEach((t=>{const e={};t.forEach(((t,o)=>{e[n[o].colName]=t})),o.push(e)})),o}function F(t,e){const n=t;return Object.keys(e).forEach((o=>{Object.prototype.hasOwnProperty.call(e,o)&&("series"===o?n[o]=e[o].map(((e,n)=>({...t[o][n],...e}))):"object"!=typeof e[o]||Array.isArray(e[o])?n[o]=e[o]:n[o]=F(t[o]||{},e[o]))})),t}function L(t,e){t.forEach((t=>{t.id in e&&Object.entries(e[t.id]).forEach((n=>{const o=n[0],r=n[1];"object"==typeof r?r.className?document.querySelector(r.className).className=t[o]:r.element&&r.format&&(document.querySelector(r.element).textContent=e[t.id][o].format(t[o])):document.querySelector(r).textContent=t[o]}))}))}function T(t,e){const n=N(t),o=[];let r=null;return n.forEach((t=>{const n=t[e];"number"!=typeof n||Number.isNaN(n)||o.push(n)})),o.length>0&&(r=Math.max(...o)),r}function I(t,e=!0){const n={Cont:[],Mob:[]};return t.forEach((t=>{"is-res-001-kgs-contenidors"===t[0]&&"total"===t[1]&&(e?n.Cont.push([t[3],t[4],t[2]]):n.Cont.push([t[3],t[2]])),"Mobles"===t[1]&&(e?n.Mob.push([t[3],t[4],t[2]]):n.Mob.push([t[3],t[2]]))})),n}const O=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],P=["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],k=["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],B=["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],q=["Do","Lu","Ma","Mi","Ju","Vi","Sá"];function R(t){const e=t.resultset.map((t=>t[0]));return this.dashboard.fireChange(this.parameter,e),t}function z(t){for(const e of t)if(Array.isArray(e)){if(!z(e))return!1}else if("All"!==e)return!1;return!0}function _(t,e,n,o){return z(e)?(t.queryDefinition.dataAccessId=n,t.dashboard.setParameter(t.parameter,["All"])):t.queryDefinition.dataAccessId=o,!0}function j(t){t.forEach((t=>{Dashboards.fireChange(t,["All"])}))}function J(){return{input:{root:{id:"All"},indexes:{id:0,label:0}},component:{Root:{strings:{isDisabled:"No disponible",allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}},Group:{Strings:{allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}}}}}function V(){const t={input:{root:{id:"All"},indexes:{id:0,label:0}},component:{Root:{strings:{isDisabled:"No disponible",allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}},Group:{Strings:{allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}}}};return t.input.indexes.id=1,t.input.indexes.label=0,t}function G(t,e,n,o){const r=Dashboards.getParameterValue(n),a=Dashboards.getParameterValue(o);return Dashboards.fireChange(t,[r]),Dashboards.fireChange(e,[a]),!0}function H(t,e){const n=Dashboards.getParameterValue(e);return Dashboards.fireChange(t,[n]),!0}function U(t,e){Dashboards.fireChange(e,t.resultset[0][0])}function W(t,e){const n=Dashboards.getParameterValue(e),o=t.parameter;t.dashboard.setParameter(o,[n])}function Y(t){t.regional.es={monthNames:O,abbreviatedMonthNames:P,dayNames:k,abbreviatedDayNames:B,dayNamesMin:q,weekHeader:"Sm",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},t.setDefaults(t.regional.es)}function X(t,e){const n=document.getElementById(t);return n?new Tabulator(n,e):(console.error(`No se pudo encontrar el elemento con ID ${t}.`),null)}function K(t,e){let n=t.getValue();return n.length>e&&(n=`${n.substr(0,e)}<br>${n.substr(e)}`),n}function Q(t,e){const n=t.getValue().split(" ");let o="",r="";return n.forEach((t=>{(r+t).length<=e?r+=`${t} `:(o+=`${r}<br>`,r=`${t} `)})),o+=`${r}<br>`,o}function Z(t,e){"expand"===e?t.treeExpand():t.treeCollapse();const n=t.getTreeChildren();n.length>0&&n.forEach((t=>{t.getTreeChildren().length>0&&Z(t,e)}))}function tt(t,e){t.getRows().forEach((t=>{t.getTreeChildren().length>0&&Z(t,e)}))}function et(t,e,n,o){const r=[];for(const a in t)if(t.hasOwnProperty(a)){const i=t[a],s={[e]:i[0],_children:[]};i.shift(),i.forEach(((t,r)=>{const a={[e]:n[r],[o]:t};s._children.push(a)})),r.push(s)}return r}function nt(t){let e=!0;return t.getGroups().forEach((t=>{t._group.visible&&(e=!1)})),e}function ot(t,e,n){const o=document.getElementById(n),r=o.cloneNode(!0);o.parentNode.replaceChild(r,o),r.addEventListener("click",(()=>{t.download("csv",`${e}.csv`,{delimiter:";"})}))}function rt(t,e,n){const o=document.getElementById(n),r=o.cloneNode(!0);o.parentNode.replaceChild(r,o),r.addEventListener("click",(()=>{t.download("pdf",`${e}.pdf`,{title:e,rowCalcStyles:{fontSize:8,fontStyle:"bold"},autoTable:{styles:{fontSize:8}}})}))}function at(t){const e=[],n=[100,200,350,500,750,751],o=[40,90,120,230,340,341],r=[50,100,130,240,380,381],a=[20,40,50,100,150,151],i=[10,20,25,50,75,76],s={0:"b",1:"a",2:"d",3:"m",4:"mm",5:"em",6:"",7:"nd"};function l(t,e,n){const o=document.createElement("td");if(o.setAttribute("id",t),null!=e){o.innerHTML=e;const t=function(t,e){let n;return void 0===e?n=6:"ND"===e?n=7:(n=5,t.forEach(((t,o)=>{e<=t&&5===n&&(n=o)}))),s[n]}(n,e);o.classList.add(t)}return o}return t.forEach((t=>{const s=t;"noData"===s.operationalstatus&&(s.so2value="ND",s.no2value="ND",s.o3value="ND",s.pm10value="ND",s.pm25value="ND"),"A09_CABANYAL_60m"===s.entityid&&(s.pm10value=void 0,s.pm25value=void 0);const c=document.createElement("tr"),u=document.createElement("td");u.innerHTML=s.address,c.appendChild(u),c.appendChild(l(`${s.entityid}_so2`,s.so2value,n)),c.appendChild(l(`${s.entityid}_no2`,s.no2value,o)),c.appendChild(l(`${s.entityid}_o3`,s.o3value,r)),c.appendChild(l(`${s.entityid}_pm10`,s.pm10value,a)),c.appendChild(l(`${s.entityid}_pm25`,s.pm25value,i)),e.push(c)})),e}function it(t){document.location=`${document.documentURI.split("%3A")[0]}%3A${document.documentURI.split("%3A")[1]}%3A${document.documentURI.split("%3A")[2]}%3A${document.documentURI.split("%3A")[3]}%3A${t}`}function st(){const t=window.location.href;let e="";return e=t.includes("localhost")?"local":t.includes("sc_valencia_pre")?"PRE":"PRO",e}function lt(t,e){document.querySelectorAll(`[${t}]`).forEach((n=>{!function(t,e,n){const o=e;if(t){const e=new XMLHttpRequest;e.onreadystatechange=function(){4===this.readyState&&(200===this.status&&(o.innerHTML=this.responseText,n&&n()),404===this.status&&(o.innerHTML="No se ha podido cargar correctamente."))},e.open("GET",t,!0),e.send()}}(n.getAttribute(t),n,e)}))}function ct(t){lt("include-html-cabecera",(function(){!function(){const t=st();"PRO"!==t&&(document.title+=` (${t})`)}(),function(){const t=st();"PRO"!==t&&(document.querySelector("nav").querySelectorAll("span")[1].textContent+=` (${t})`)}()})),lt("include-html-menu"),lt("include-html-main-container",(function(){(function(){const t=document.querySelector("body");t.classList.remove("inicio"),t.classList.add(document.documentURI.split("%3A")[4].match(/(.*?).wcdf/)[1])})(),t&&t()})),lt("include-html-copyright")}function ut(t,e,n,o,r,a){let i=!1,s=!1;const l=document.querySelector(t),c=document.querySelector(e),u=()=>{"undefined"!=typeof Liferay&&"ca-ES"===Liferay.ThemeDisplay.getBCP47LanguageId()?(l&&l.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=cas"),c&&c.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?lang=cas")):(l&&l.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=val"),c&&c.setAttribute("src","https://camaras.valencia.es/camaras/ocimovil.html?lang=val"))};function d(t=!0){const e=document.querySelector(n);t?(l&&(l.src="about:blank"),c&&(c.src="about:blank"),e.classList.add("blur"),s=!0):(e.classList.remove("blur"),u(),s=!1)}const m=t=>{new IntersectionObserver((t=>{t.forEach((t=>{t.isIntersecting&&(s||u(),i||(i=!0,window.setTimeout(d,a)))}))})).observe(t)};!function(){const{userAgent:t}=navigator;return/iPad|iPhone|iPod|Macintosh/.test(t)&&!window.MSStream}()?(l&&(l.setAttribute("sandbox","allow-scripts"),m(l)),c&&(c.setAttribute("sandbox","allow-scripts"),m(c)),document.querySelector(r).addEventListener("click",(()=>{d(!1),window.setTimeout(d,a)}))):document.querySelectorAll(o)[0].style.display="none"}const dt=(t,e)=>{e.sort(((t,e)=>parseInt(t.anyo)-parseInt(e.anyo)));const n={};e.forEach((e=>{const o=e[1],r=e[0];r!==t.seriesName||n[o]||(n[o]=0),r===t.seriesName&&(n[o]+=e[2])}));let o=`<p>${t.seriesName}</p>`;for(const[e,r]of Object.entries(n))o+=`<div>${t.marker} ${e}: <strong style="float: right; margin-left:20px">${d(r)}</strong></div>`;return o};function mt(t,e,n=void 0,o=void 0){const r=null===o?void 0:o,a=new Set(e.map((t=>t[1])));let i;const s={title:{text:"SIN TITULO",left:"center",top:"top",textStyle:{fontSize:20,fontFamily:"Montserrat",fontWeight:600,color:"#666"}},tooltip:{axisPointer:{type:"shadow"},trigger:"item",formatter:t=>dt(t,e),textStyle:{fontFamily:"Montserrat"},position(t,e,n,o,r){const a={},i=r.contentSize[1]/2,s=r.viewSize[1],l=t[1];return l<i?a.top=10:l+i>s?a.bottom=10:a.top=l-i,t[0]<r.viewSize[0]/2?a.left=t[0]+20:a.right=r.viewSize[0]-t[0]+20,a}},legend:{padding:40,textStyle:{fontFamily:"Montserrat"}},grid:{left:"3%",right:"4%",bottom:"3%",containLabel:!0},xAxis:{type:"value",splitNumber:10,name:"SIN NOMBRE",nameLocation:"start",nameTextStyle:{fontWeight:"bold",fontFamily:"Montserrat",color:"#666",padding:-40},axisLabel:{margin:5,textStyle:{fontFamily:"Montserrat"},formatter:t=>d(t)},splitLine:{lineStyle:{color:"#DDD"}}},yAxis:{type:"category",data:Array.from(a),axisLabel:{textStyle:{fontFamily:"Montserrat"}}},series:(()=>{const t={name:"SIN NOMBRE",type:"bar",stack:"total",label:{show:!0,fontFamily:"Montserrat",fontSize:10,formatter:t=>d(Math.round(t.value))},itemStyle:void 0,emphasis:{focus:"series"},data:void 0};r&&r.itemStyle&&Array.isArray(r.itemStyle.borderColor)&&(i=[...r.itemStyle.borderColor],delete r.itemStyle.borderColor);const n=function(t,e){return t.reduce(((t,e)=>{const n=e[0];return t[n]||(t[n]=[]),t[n].push(e),t}),{})}(e),o=Object.keys(n);a.forEach((t=>{o.forEach((e=>{void 0===n[e].find((e=>e[1]===t))&&(n[e].push([n[e][0][0],t,void 0]),n[e].sort())}))}));const s=[];return Object.keys(n).forEach((e=>{i&&(t.itemStyle={borderColor:i.shift()}),t.name=e,t.data=n[e].map((t=>t[2]));let o={};o=void 0!==r?F(t,r):t,s.push({...o})})),s})(),toolbox:{show:!0,feature:{restore:{title:"Restablir"},saveAsImage:{title:"Desar"}},right:50}};let l={};l=void 0!==n?F(s,n):s,p(t,l)}function ft(t,e,n={},r={}){let a={};a=F(n,{color:["#81B1CC","#ABD9EA","#C2EEF9","#F9E2AF","#F9C780","#FDAE61","#F46D43","#FDAE61","#F9E2AF","#C2EEF9","#ABD9EA","#81B1CC"],yAxis:{data:function(){const t=new Set;return e.forEach((e=>{t.add(e[1])})),Array.from(t).sort(((t,e)=>t-e))}()}});const i={itemStyle:{borderWidth:2,borderColor:["#448DAD","#89CADB","#A0DEE8","#F4D28C","#F4B569","#F79646","#F25930","#F79646","#F4D28C","#A0DEE8","#89CADB","#448DAD"]}},s=null===r?i:F(r,i),l=e;l.forEach(((t,e)=>{l[e][0]=o(t[0])})),mt(t,l,a,s)}function pt(t,e=void 0){const n={title:{text:"SIN TITULO",left:"center",top:"top",padding:50,textStyle:{fontSize:14,fontFamily:"Montserrat",fontWeight:400,color:"#333"}},legend:{show:!1},grid:{top:"30%",bottom:"5%",left:"8%",right:"8%"},xAxis:{type:"value",show:!1},yAxis:{show:!1,type:"category"},tooltip:{show:!0,textStyle:{fontFamily:"Montserrat",fontWeight:"600"},appendToBody:!0,formatter:t=>A(t,!1)},series:[{type:"bar",showBackground:!0}]};let o={};o=void 0!==e?F(n,e):n,p(t,o)}const ht="es_ES",bt={es_ES:new Map([["1","Enero"],["2","Febrero"],["3","Marzo"],["4","Abril"],["5","Mayo"],["6","Junio"],["7","Julio"],["8","Agosto"],["9","Septiembre"],["10","Octubre"],["11","Noviembre"],["12","Diciembre"]]),ca_ES:new Map([["1","Gener"],["2","Febrer"],["3","Març"],["4","Abril"],["5","Maig"],["6","Juny"],["7","Juliol"],["8","Agost"],["9","Setembre"],["10","Octubre"],["11","Novembre"],["12","Desembre"]])};function gt(t){return Math.max(...t.map((t=>Number(t[0]))))}function yt(t){const e=t.filter((e=>Number(e[0])===gt(t))),n=Array.from({length:12},(()=>0));return e.forEach((([t,e,o])=>{const r=parseInt(e,10)-1;n[r]=o})),n}function St(t){const e=t.filter((e=>Number(e[0])===gt(t)-1)),n=Array.from({length:12},(()=>0));return e.forEach((([t,e,o])=>{const r=parseInt(e,10)-1;n[r]=o})),n}function vt(t,e,n=void 0){const o=gt(e).toString(),r=(gt(e)-1).toString();pt(t,F({title:{left:"center",top:"-12%",textStyle:{fontSize:15,fontFamily:"Montserrat"}},legend:{top:"10%",show:!0,data:[r,o],textStyle:{fontFamily:"Montserrat"}},grid:{bottom:"8%",top:"20%",right:"2%"},xAxis:[{type:"category",data:u(bt,ht),axisLabel:{fontFamily:"Montserrat"}}],yAxis:[{type:"value",axisLabel:{formatter:t=>t.toLocaleString("es-ES"),fontFamily:"Montserrat"}}],series:[{name:r,type:"bar",data:St(e)},{name:o,type:"bar",barGap:0,data:yt(e)}]},n))}function At(t,e,n){const o=document.querySelector(e),r=document.querySelector(t);let a=!1;r.addEventListener("click",(()=>{!1===a&&(a=!0,o.setAttribute("src","about:blank"),o.setAttribute("src",n),o.onload=()=>{a=!1})})),r.disabled=!1}return e})()));
2
2
  //# sourceMappingURL=vlcishared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vlcishared.js","mappings":"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","sources":["webpack://@vlci/vlcishared/webpack/universalModuleDefinition","webpack://@vlci/vlcishared/webpack/bootstrap","webpack://@vlci/vlcishared/webpack/runtime/define property getters","webpack://@vlci/vlcishared/webpack/runtime/hasOwnProperty shorthand","webpack://@vlci/vlcishared/webpack/runtime/make namespace object","webpack://@vlci/vlcishared/./src/dates/common-date.js","webpack://@vlci/vlcishared/./src/formatting/common-number.js","webpack://@vlci/vlcishared/./src/formatting/common-text.js","webpack://@vlci/vlcishared/./src/charts/common-chart.js","webpack://@vlci/vlcishared/./src/data/common-process-data.js","webpack://@vlci/vlcishared/./src/data/common-data.js","webpack://@vlci/vlcishared/./src/residuos/common-data.js","webpack://@vlci/vlcishared/./src/selector/common-selector.js","webpack://@vlci/vlcishared/./src/tables/common-table.js","webpack://@vlci/vlcishared/./src/medioambiente/table-calidad-aire.js","webpack://@vlci/vlcishared/./src/navigation/common-navigation.js","webpack://@vlci/vlcishared/./src/initial-calls/common-initial-calls.js","webpack://@vlci/vlcishared/./src/style/body-class.js","webpack://@vlci/vlcishared/./src/camaras/camaras-trafico.js","webpack://@vlci/vlcishared/./src/charts/stacked-bar.js","webpack://@vlci/vlcishared/./src/charts/bar-chart.js","webpack://@vlci/vlcishared/./src/language/common-language.js","webpack://@vlci/vlcishared/./src/charts/bar-chart-comparation-month.js","webpack://@vlci/vlcishared/./src/iframes/load-iframes.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vlcishared\"] = factory();\n\telse\n\t\troot[\"vlcishared\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const mesDescLarga = {\n '01': 'Enero',\n '02': 'Febrero',\n '03': 'Marzo',\n '04': 'Abril',\n '05': 'Mayo',\n '06': 'Junio',\n '07': 'Julio',\n '08': 'Agosto',\n '09': 'Septiembre',\n 10: 'Octubre',\n 11: 'Noviembre',\n 12: 'Diciembre',\n};\n\n/**\n * Dado un valor entero, devuelve el mes/meses asociados a el: 01->Gen\n * @param {object/integer} data Valor a convertir en cadena\n * @returns Cadena asociada al valor.\n */\nexport function getMonth(data) {\n const monthDict = {\n 1: 'Gen',\n 2: 'Feb',\n 3: 'Mar',\n 4: 'Abr',\n 5: 'Mai',\n 6: 'Jun',\n 7: 'Jul',\n 8: 'Ago',\n 9: 'Sep',\n 10: 'Oct',\n 11: 'Nov',\n 12: 'Des',\n };\n return monthDict[parseInt(data.toString(), 10)];\n}\n\n/**\n * Separa un string yyyymm en yyyy & mm\n * @param {string} monthYear\n * @returns\n */\nfunction separateMonthYear(monthYear) {\n return [monthYear.substring(0, 4), mesDescLarga[monthYear.substring(4, 6)]];\n}\n\n/**\n * Separa un string yyyymmdd en yyyy mm dd\n * @param {string} date\n * @returns\n */\nfunction separateDayMonthYear(date) {\n return [\n date.substring(0, 4),\n mesDescLarga[date.substring(4, 6)],\n date.substring(6, 8),\n ];\n}\n\n/**\n * Dado un valor entero yyyyMM, devuelve el valor del mes + año . Ejem: 202301 --> Enero 2023\n * @param {integer} data Valor a convertir en cadena\n * @returns Cadena asociada al valor.\n */\nexport function formatMonthAnyo(data) {\n const [anyo, mes] = separateMonthYear(data);\n return `${mes} ${anyo}`;\n}\n\n/**\n * Dado un valor entero yyyyMMdd, devuelve el valor del dia mes año . Ejem: 20230101 --> 01 Enero 2023\n * @param {integer} date Valor a convertir en cadena\n * @returns Cadena asociada al valor.\n */\nexport function formatDayMonthYear(date) {\n const [anyo, mes, dia] = separateDayMonthYear(date);\n return `${dia} ${mes} ${anyo}`;\n}\n\n/**\n * Dado un valor entero yyyyMM, devuelve el nombre del mes recortado + año.\n * Ejem: 202301 --> Ene 2023\n * @param {integer} data\n */\nexport function formatShortMonthYear(data) {\n const [anyo, mes] = separateMonthYear(data);\n return `${mes.substring(0, 3)} ${anyo}`;\n}\n\n/**\n * Dado un valor entero yyyyMM, devuelve el nombre del mes recortado + año recortado.\n * Ejem: 202301 --> Ene '23\n * @param {integer} data\n */\nexport function formatShortMonthShortYear(data) {\n const [anyo, mes] = separateMonthYear(data);\n return `${mes.substring(0, 3)} '${anyo.substring(2, 4)}`;\n}\n\n/**\n * Formateo de fecha de un trimestre\n * @param {*} date YYYY-MM\n * @returns trimestre formato MM'T' YYYY\n */\nexport function formatTrimestre(date) {\n const [anyo, mes] = date.split('-');\n return `${parseFloat(mes) / 3}T ${anyo}`;\n}\n\n/**\n * @param MONTHS_YEAR Array con los meses del año\n * @param DEFAULT_LANGUAGE Lenguage por defecto. Ej: es_ES\n * @returns devuelve los 12 meses del año en el idioma que haya por defecto. Solo los 3 primeros caracteres del mes.\n * Por ej: Ene, Feb, ...\n */\nexport function getMonthList(MONTHS_YEAR, DEFAULT_LANGUAGE) {\n const monthsMap = MONTHS_YEAR[DEFAULT_LANGUAGE];\n const monthNames = Array.from(monthsMap.values()).map((monthName) =>\n monthName.slice(0, 3),\n );\n return monthNames;\n}\n","/**\n * Introduce . cada 3 cifras del número pasado por parámetros: 1234->1.234\n * @param {integer} value Entero al que se le va a poner.\n * @returns String con el número transformado.\n */\nexport function addPointInteger(value, decimals = 2) {\n // Obtiene el idioma del navegador\n let usrlang = navigator.language || navigator.userLanguage;\n usrlang =\n usrlang.length <= 2 ? `${usrlang}-${usrlang.toUpperCase()}` : usrlang;\n const factorDigits = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n return usrlang === 'es-ES'\n ? value.toLocaleString('de-DE', factorDigits)\n : value.toLocaleString(usrlang, factorDigits);\n}\n\n/**\n * Función que convierte un número a notación abreviada\n * @param {integer} value Entero que se va a formatear\n * @returns el valor abreviado a millones\n */\nexport function formatToMillions(value) {\n const million = 1000000;\n return value >= million ? `${value / million}M` : value.toString();\n}\n","/**\n * Separa las cadenas para su correcta representición.\n * @param {String} name Nombre a formatear.\n * @param {Integer} size numero de caracteres que como máximo se mostrarán en cada fila.\n * @returns Cadena formateada.\n */\nexport function formatName(name, size = 29) {\n if (name.length >= size) {\n const words = name.split(' ');\n let currentLine = '';\n let result = '';\n words.forEach((word) => {\n if (`${currentLine} ${word}`.length <= size) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n result += `${currentLine}\\n`;\n currentLine = word;\n }\n });\n result += currentLine;\n return result;\n }\n return name;\n}\n","import { addPointInteger } from '../formatting/common-number';\nimport { getMonth } from '../dates/common-date';\n\nexport const DIVSIZE = 33;\n\nexport function initChart(chartId, option) {\n const chartElem = document.getElementById(chartId);\n if (!chartElem) {\n console.error(`No se pudo encontrar el elemento con ID ${chartId}.`);\n return null;\n }\n\n const myChart = echarts.init(chartElem);\n myChart.setOption(option, true);\n\n // Resize chart on window resize\n window.addEventListener('resize', () => {\n if (myChart != null && myChart !== undefined) {\n myChart.resize();\n }\n });\n\n // Add event listener to 'main-content' for Bootstrap collapse events\n const mainContent = document.getElementById('main-content');\n if (mainContent) {\n mainContent.addEventListener('shown.bs.collapse', () => {\n myChart.resize();\n });\n mainContent.addEventListener('hidden.bs.collapse', () => {\n myChart.resize();\n });\n }\n\n return myChart;\n}\n\nexport function printNoDataChart(idHide, idShow) {\n const noDataStyle = \"url('./build/images/nodata1.png') no-repeat top center\";\n const hideElement = idHide ? document.querySelector(idHide) : null;\n const showElement = idShow ? document.querySelector(idShow) : null;\n\n if (hideElement) {\n hideElement.hidden = true;\n }\n if (showElement) {\n showElement.style.background = noDataStyle;\n showElement.hidden = false;\n }\n}\n\nexport function printDataChart(idHide, idShow) {\n const hideElement = idHide ? document.querySelector(idHide) : null;\n const showElement = idShow ? document.querySelector(idShow) : null;\n\n if (hideElement) {\n hideElement.hidden = true;\n }\n if (showElement) {\n showElement.style.background = '#ffffff';\n showElement.hidden = false;\n }\n}\n\n/**\n * Método que formatea el tooltip.\n * @param {string} params contine los valores del tooltip.\n * @param {boolean} roundValues indica si queremos redondear el valor en el tooltip. True quitará decimales redondeando. False no.\n * @param {boolean} serie indica si los valores tienen varias series o no.\n * @param {string} unidadMedida unidad de medida del valor\n * @returns el texto del tooltip formateado\n */\nexport function formatTooltip(\n params,\n roundValues = false,\n serie = true,\n unidadMedida = '',\n) {\n const colorSpan = (color) =>\n `<span style=\"display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${color}\"></span>`;\n let nameLabel = `<p>${params[0].name}</p>`;\n params.forEach((item) => {\n const roundedValues = roundValues ? Math.round(item.data) : item.data;\n const valuesLabel = serie\n ? `<div>${colorSpan(item.color)} ${item.seriesName}: \n <strong style=\"float: right; margin-left:20px\">\n ${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </strong>\n </div>`\n : `<div>\n <strong>${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </strong>\n </div>`;\n nameLabel += valuesLabel;\n });\n return nameLabel;\n}\n\n/**\n * Calcular inicio del datazoom\n * Devuelve el valor en el que comenzará el datazoom de la gráfica\n * @param {int} dataLength longitud de los datos del eje X\n * @returns number que indica donde comenzará el datazoom\n */\nexport function calculateXAxisStart(dataLength) {\n return (100 * (dataLength - 120)) / dataLength;\n}\n\n/**\n * Calcula cual es el máximo del eje Y en la gráfica dependiendo del intervalo\n * que se quiera tener entre los marcadores del eje.\n * Ej: el valor máximo de los datos es 2500 y el intervalo es 1000, el resultado será 3000.\n * @param {*} value el valor del dato máximo de la serie\n * @param {*} interval el intervalo de los ticks del eje Y\n */\nexport function calculateMaxYAxis(values, interval) {\n const maxValue = Math.max(...values);\n const taskForNextInterval = interval - (maxValue % interval);\n return maxValue + taskForNextInterval;\n}\n\n/**\n * Modulo que formatea en funcion del tamaño de la pantalla\n * @param {array} misDatosArray Array con los datos a formatear\n * @param {*} value Valor del campo que está tratando\n * @param {Number} index Indica la posicion del dato a representar dentro de misDatosArray\n * @returns cadena formateada segun las dimensiones de la pantalla\n */\nexport function formatterReloj(misDatosArray, value, index) {\n const valor = addPointInteger(Math.round(value));\n const month = getMonth(misDatosArray[index][0]);\n const year = misDatosArray[index][1];\n const textBelowGraph = `\\n${month} ${year} : ${valor}`;\n const textIntoGraph = `${valor}\\n${month} ${year}`;\n return window.innerWidth <= 1710 ? textBelowGraph : textIntoGraph;\n}\n\n/**\n * Método que formatea el tooltip de los gráficos pie.\n * @param {Object} params contine los valores del tooltip.\n * @param {boolean} percentage true si el tooltip muestra un porcentage\n * @returns el texto del tooltip formateado\n */\nexport function formatTooltipPie(params, percent = false) {\n const colorSpan = `<span style=\"display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${params.color}\"></span>`;\n const valueLabel = percent\n ? `${params.percent}%`\n : addPointInteger(params.value);\n\n const nameLabel = `<div> ${colorSpan} ${params.name} <strong style=\"float: right; margin-left:20px\"> ${valueLabel} </strong></div>`;\n\n return nameLabel;\n}\n\nexport function formatRoundTooltip(params, isPie) {\n let label = `${params.name} : `;\n label += `<span style=\"font-weight:bold\">${addPointInteger(\n Math.round(params.value),\n )}</span>`;\n if (isPie) {\n label += `<span> (${params.percent}%)</span>`;\n }\n return params.marker + label;\n}\n\nexport function formatMilMillionEuros(value) {\n const ONE_MILLION = 1000000;\n\n if (value >= 0 && value < ONE_MILLION) {\n return `${addPointInteger(value, 0)} €`;\n }\n\n if (value >= ONE_MILLION) {\n return `${addPointInteger(value / ONE_MILLION)} M €`;\n }\n\n return '-';\n}\n","import { splitData, updateObject } from './common-data';\nimport { getMonth } from '../dates/common-date';\nimport { addPointInteger } from '../formatting/common-number';\nimport { formatName } from '../formatting/common-text';\nimport { initChart, formatTooltip } from '../charts/common-chart';\n\n/**\n * Método que devuelve el máximo de una columna en concreto de un array.\n * @param {array} array Array que contiene la columna a tratar.\n * @param {integer} column Indice de la columna.\n * @param {float} add Si se quiere incrementar el máximo en X unidades.\n * @returns el valor máximo de array en la columna column\n */\nfunction getMaxGaugeValue(array, column, add = 1) {\n const max = Math.max(...array.map((row) => row[column])) * add;\n return Math.ceil(max / 5000) * 5000;\n}\n\n/**\n * Configura los datos de los Gauge Anuales o multiserie.\n * @param {Text} idChart Identificador del Chart\n * @param {Array} misDatosArray Resultset obtenido de la query a la BBDD\n * @param {Object} objColData Objeto que indica la correspondencia\n * entre la posicion y la columna de misDatosArray.\n * @param {Array} colorsDataGauge Array que contiene los colores que se van a utilizar.\n * @param {Number} fontSize Tamaño de la fuente utilizado.\n * @param {Number} paramOffsetCenterTitle Porcentaje de la ubicacion vertical\n * del titulo de las series.\n * @param {Number} paramOffsetCenterDetail Porcentaje de la ubicacion vertical\n * del valor de las series.\n * @param {Number} paramOffsetLabel Porcetaje de la ubicación horizontal desde el centro\n * tanto para el titulo como para el valor de las series.\n * @param {Number} paramCalculatedOffset Diferencia de porcentaje de la ubicación horizontal\n * entre una serie y otra.\n * @param {Number} paramNumberOfElementsByLine Numero de series que se van a mostrar por cada fila.\n * @returns Devuelve el valor maximo del gauge y los datos. */\n\nexport function configureDataGaugeCommon(\n misDatosArray,\n objColData,\n colorsDataGauge,\n fontSize = 30,\n paramOffsetCenterTitle = 15,\n paramOffsetCenterDetail = 30,\n paramOffsetLabel = -70,\n paramCalculatedOffset = 70,\n paramNumberOfElementsByLine = 3,\n) {\n const maxGaugeValue = getMaxGaugeValue(misDatosArray, objColData.data, 1.1); // Valor maximo del gauge\n const calculatedOffset = paramCalculatedOffset;\n const colorsCopy = colorsDataGauge.slice();\n const gaugeDataYears = [];\n let offsetCenterTitle = paramOffsetCenterTitle;\n let offsetCenterDetail = paramOffsetCenterDetail;\n let offsetLabel = paramOffsetLabel;\n\n for (let i = 0; i < misDatosArray.length; i += 1) {\n gaugeDataYears.push({\n value: misDatosArray[i][objColData.data],\n name: formatName(\n String(misDatosArray[i][objColData.type]).replace(/\\[.*?\\]/g, ''),\n ),\n\n color: colorsCopy.shift(),\n title: {\n offsetCenter: [\n `${String(offsetLabel)}%`,\n `${String(offsetCenterTitle)}%`,\n ],\n fontFamily: 'Montserrat',\n fontSize,\n },\n detail: {\n offsetCenter: [\n `${String(offsetLabel)}%`,\n `${String(offsetCenterDetail)}%`,\n ],\n fontFamily: 'Montserrat',\n width: '33%',\n formatter: (value) => addPointInteger(Math.round(value)),\n },\n });\n offsetLabel += calculatedOffset;\n if ((i + 1) % paramNumberOfElementsByLine === 0) {\n offsetCenterDetail += paramOffsetCenterDetail;\n offsetCenterTitle += paramOffsetCenterTitle * 2;\n offsetLabel = paramOffsetLabel;\n }\n }\n\n return [maxGaugeValue, gaugeDataYears];\n}\n\n/**\n * Modulo que formatea en funcion del tamaño de la pantalla\n * @param {array} misDatosArray Array con los datos a formatear\n * @param {*} value Valor del campo que está tratando\n * @param {Number} index Indica la posicion del dato a representar dentro de misDatosArray\n * @returns cadena formateada segun las dimensiones de la pantalla\n */\nexport function labelFormatterMonthlyDataGauge(misDatosArray, value, index) {\n const valor = addPointInteger(Math.round(value));\n const month = getMonth(misDatosArray[index][0]);\n const year = misDatosArray[index][1];\n const textBelowGraph = `\\n${month} ${year} : ${valor}`;\n const textIntoGraph = `${valor}\\n${month} ${year}`;\n return window.innerWidth <= 1710 ? textBelowGraph : textIntoGraph;\n}\n\n/**\n * Configura los datos de los Gauge Mensuales o de una sola serie.\n * @param {Text} idChart Identificador del Chart\n * @param {Array} misDatosArray Resultset obtenido de la query a la BBDD\n * @param {Object} objColData Objeto que indica la correspondencia\n * entre la posicion y la columna de misDatosArray.\n * @param {Number} monthNumber Indica el numero de mes que vamos a representar desde el actual,\n * siendo 0 el mes actual, 1 el anterior, etc.\n * @returns {Array} Devuelve el valor maximo del gauge,\n * el formato del detalle del Gauge y los datos. */\n\nexport function configureDataGaugeMonthCommon(\n idChart,\n misDatosArray,\n objColData,\n monthNumber = 0,\n) {\n const maxGaugeValue = getMaxGaugeValue(misDatosArray, objColData.data, 1);\n const seriesDetailFormatter = (value) =>\n labelFormatterMonthlyDataGauge(misDatosArray, value, monthNumber);\n const gaugeDataMonth = [\n {\n value: misDatosArray[monthNumber][objColData.data],\n },\n ];\n return [maxGaugeValue, seriesDetailFormatter, gaugeDataMonth];\n}\n\n/**\n * Configura un gráfico que tiene varias series\n * @param {Array} datos datos iniciales.\n * @param {boolean} round indica si se quiere redondear los datos de entrada.\n * @returns Datos configurados.\n */\nexport function configureMultipleSeries(datos, round) {\n const { resultset } = { resultset: datos };\n const tipos = new Set();\n const valueAxisX = new Set();\n\n const dataObj = resultset.map(([tipo, fecha, dato]) => {\n const val = round ? Math.round(dato) : dato;\n tipos.add(tipo);\n valueAxisX.add(fecha);\n return { day: fecha, type: tipo, value: val };\n });\n\n const axisXArray = Array.from(valueAxisX.values());\n const tiposArray = Array.from(tipos.values());\n // Ordenar si los nombres vienen desordenados:\n tiposArray.sort((a, b) =>\n a\n .toLowerCase()\n .localeCompare(b.toLowerCase(), 'es', { ignorePunctuation: true }),\n );\n\n const series = tiposArray.map((tipo) => {\n const arrayData = dataObj\n .filter((obj) => obj.type === tipo)\n .map(({ day, value }) => [day, tipo, value]);\n\n const arrayDataClean = axisXArray.map((fecha) => {\n const obj = arrayData.find(([d]) => d === fecha);\n return obj ? obj[2] : null;\n });\n return {\n name: tipo,\n data: arrayDataClean,\n };\n });\n\n return [series, tiposArray, valueAxisX];\n}\n\n/**\n * Configura los datos para los gráficos de líneas.\n * @param {Array} datos datos iniciales.\n * @param {Array} color colores de las lineas a mostrar en la gráfica.\n * @param {boolean} round indica si se quiere redondear los datos de entrada.\n * @returns Datos configurados.\n */\nexport function configureDataLine(datos, colors, round = false) {\n const [series, tiposArray, valueAxisX] = configureMultipleSeries(\n datos,\n round,\n );\n // Configurar el tipo de línea para cada serie individual\n series.forEach((serie) => {\n serie.type = 'line';\n serie.symbol = 'circle';\n serie.color = colors.shift();\n serie.symbolSize = 6;\n serie.smooth = 0.1;\n });\n\n return [series, valueAxisX, tiposArray];\n}\n\n/**\n * Configura los datos para los gráficos de barras.\n * @param {Array} datos datos iniciales.\n * @param {Array} color colores de las lineas a mostrar en la gráfica.\n * @param {boolean} round indica si se quiere redondear los datos de entrada.\n * @returns Datos configurados.\n */\nexport function configureDataBar(datos, colors, round = false) {\n const [series, tiposArray, valueAxisX] = configureMultipleSeries(\n datos,\n round,\n );\n // Configurar el tipo de línea para cada serie individual\n series.forEach((serie) => {\n serie.type = 'bar';\n serie.color = colors.shift();\n serie.smooth = false;\n });\n\n return [series, valueAxisX, tiposArray];\n}\n","/**\r\n * Separa el conjunto de datos \"data\" en función de la columna \"column\"\r\n * @param {array} data Conjunto de datos a separar y agrupar\r\n * @param {integer} column Columna por la que se va a agrupar\r\n * @returns Diccionario con el array \"data\" agrupado por \"column\"\r\n */\r\nexport function splitData(data, column) {\r\n return data.reduce((accumulator, currentValue) => {\r\n const key = currentValue[column];\r\n if (!accumulator[key]) {\r\n accumulator[key] = [];\r\n }\r\n accumulator[key].push(currentValue);\r\n return accumulator;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Función que partiendo de los datos obtenidos de una query de Pentaho, devuelve el resultset\r\n * indicando el nombre de las columnas en cada valor\r\n * @param {Array} data Datos obtenidos de la query de Pentaho.\r\n * @returns {Array} Array que contiene un objeto por cada fila.\r\n */\r\nexport function resultsetWithFields(data) {\r\n const { resultset, metadata } = data;\r\n const resultsetWithFieldsResult = [];\r\n resultset.forEach((row) => {\r\n const columnsWithFields = {};\r\n row.forEach((column, indice) => {\r\n columnsWithFields[metadata[indice].colName] = column;\r\n });\r\n\r\n resultsetWithFieldsResult.push(columnsWithFields);\r\n });\r\n return resultsetWithFieldsResult;\r\n}\r\n/**\r\n * Función que actualiza un objeto con otro. Ej)\r\n \r\nobjetoOriginal = {\r\n propiedad1: {\r\n atributo1: 'valor1',\r\n atributo2: 'valor2'\r\n },\r\n propiedad2: 'valor2'\r\n};\r\n\r\nconst objetoParcial = {\r\n propiedad1: {\r\n atributo1: 'nuevoValor1'\r\n }\r\n};\r\n\r\nobjetoActualizado = {\r\n propiedad1: {\r\n atributo1: 'nuevoValor1',\r\n atributo2: 'valor2'\r\n },\r\n propiedad2: 'valor2'\r\n};\r\n * @param {Object} original Objeto original que quiere ser actualizado. \r\n * @param {Object} modified Objeto que contiene los valores que queremos actualizar.\r\n * @returns \r\n */\r\nexport function updateObject(original, modified) {\r\n const originalOut = original;\r\n\r\n Object.keys(modified).forEach((key) => {\r\n // Evita los atributos heredados que no hemos creado nosotros.\r\n if (Object.prototype.hasOwnProperty.call(modified, key)) {\r\n if (key === 'series') {\r\n originalOut[key] = modified[key].map((specificSeries, index) =>\r\n // Fusionar propiedades específicas para cada elemento de 'series'\r\n ({ ...original[key][index], ...specificSeries }),\r\n );\r\n }\r\n // Comprueba si el valor de la propiedad es un objeto y no un array\r\n else if (\r\n typeof modified[key] === 'object' &&\r\n !Array.isArray(modified[key])\r\n ) {\r\n // Si la propiedad es un objeto, llama recursivamente a la función para combinar sus atributos\r\n originalOut[key] = updateObject(original[key] || {}, modified[key]);\r\n } else {\r\n // Si no es un objeto, simplemente asigna el valor al objeto original\r\n originalOut[key] = modified[key];\r\n }\r\n }\r\n });\r\n // Devuelve el objeto original actualizado\r\n return original;\r\n}\r\n\r\n/**\r\n * Pinta los datos obtenidos por una query de pentaho en el HTML aplicando una configuración.\r\n * @param {Object} data Objeto que devuelve pentaho tras realizar una query que contiene los datos que se van a pintar.\r\n * Requisitos:\r\n * 1- Tener una columna con el nombre id y coincida con el id del atributo del dataConfig.\r\n * 2- Cada fila del objeto debe tener un id distinto.\r\n * @param {Object} dataConfig Objeto que contiene la configuración de los datos que se van a pintar. Lo que no este declarado en este objeto, no se pintará.\r\n * Requisitos:\r\n * 1- El objeto contendra una lista de elementos que se corresponderan con el id de cada fila del objeto data.\r\n * 2- Dentro de cada elemento crearemos un nuevo atributo con el nombre de la columna que queremos pintar. Este atributo puede configurarse de dos formas distintas:\r\n * 2.1- Se puede asignar un valor directamente que correspondera con el selector del elemento html donde queremos pintarlo.\r\n * 2.2- Se puede crear un objeto que contendra dos elementos más:\r\n * 2.2.1- element contendra el selector del elemento html donde queremos pintarlo.\r\n * 2.2.2- format contendra una funcion con la que se podra formatear el valor antes de pintarlo.\r\n * 2.3 - Se puede crear un objeto que renombre el nombre de la clase por uno que venga de base de datos añadiendo un elemento className\r\n * Ejemplo:\r\n * const dataConfig = {\r\n NumeroQuejasSugerenciasMes: { <--- Id que debe coincidir con la columna id del data.\r\n value: '#indQuejasVal', <--- La columna value del data será pintada en el selector HTML indicado.\r\n variacion: {\r\n element: '#indQuejasVar', <--- La columna variacion del data será pintada en el selector HTML indicado.\r\n format: (value) => `${value}%`, <--- Además se le aplicará el formato indicado aqui antes de ser insertado.\r\n },\r\n tendencia: { <--- Id que debe coincidir con la columna que devuelve el valor por el que vamos a renombrar la clase\r\n className: '.prePrePrevioTrim', <--- El valor del elemento className será el de la clase indicada en el HTML.\r\n },\r\n RendimientoAdministrativo:{....}\r\n }\r\n */\r\nexport function printDataInHTMLElements(data, dataConfig) {\r\n data.forEach((indicador) => {\r\n if (indicador.id in dataConfig) {\r\n Object.entries(dataConfig[indicador.id]).forEach((elementArray) => {\r\n const key = elementArray[0];\r\n const value = elementArray[1];\r\n if (typeof value === 'object') {\r\n if (value.className) {\r\n document.querySelector(value.className).className = indicador[key];\r\n } else if (value.element && value.format) {\r\n document.querySelector(value.element).textContent = dataConfig[\r\n indicador.id\r\n ][key].format(indicador[key]);\r\n }\r\n } else {\r\n document.querySelector(value).textContent = indicador[key];\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Función que devuelve el máximo de uno de los campos del objeto data recuperado en una query.\r\n * @param {Object} data Objeto que contiene los datos de la query.\r\n * @param {String} fieldName Nombre del campo del cual queremos obtener el maximo.\r\n * @returns Si existia al menos un número en el campo especificado, devolvera el maximo del mismo, en caso contrario devuelve null.\r\n */\r\nexport function getMaxFieldNumberFromData(data, fieldName) {\r\n const resultSet = resultsetWithFields(data);\r\n const array = [];\r\n let max = null;\r\n resultSet.forEach((element) => {\r\n const fieldValue = element[fieldName];\r\n if (typeof fieldValue === 'number' && !Number.isNaN(fieldValue)) {\r\n array.push(fieldValue);\r\n }\r\n });\r\n\r\n if (array.length > 0) {\r\n max = Math.max(...array);\r\n }\r\n return max;\r\n}\r\n","export function splitDataset(misDatosArray, isMonth = true) {\n const splittedData = { Cont: [], Mob: [] };\n const COL_CLAS = 0;\n const COL_TIPO = 1;\n const COL_DATO = 2;\n const COL_MES = 3;\n const COL_ANYO = 4;\n const clasCont = 'is-res-001-kgs-contenidors';\n const colTipoTotal = 'total';\n const colTipoMobles = 'Mobles';\n misDatosArray.forEach((datos) => {\n if (datos[COL_CLAS] === clasCont && datos[COL_TIPO] === colTipoTotal) {\n if (isMonth) {\n splittedData.Cont.push([datos[COL_MES], datos[COL_ANYO], datos[COL_DATO]]);\n } else {\n splittedData.Cont.push([datos[COL_ANYO - 1], datos[COL_DATO]]);\n }\n }\n if (datos[COL_TIPO] === colTipoMobles) {\n if (isMonth) {\n splittedData.Mob.push([datos[COL_MES], datos[COL_ANYO], datos[COL_DATO]]);\n } else {\n splittedData.Mob.push([datos[COL_ANYO - 1], datos[COL_DATO]]);\n }\n }\n });\n return splittedData;\n}\n","const monthNamesEs = [\n 'Enero',\n 'Febrero',\n 'Marzo',\n 'Abril',\n 'Mayo',\n 'Junio',\n 'Julio',\n 'Agosto',\n 'Septiembre',\n 'Octubre',\n 'Noviembre',\n 'Diciembre',\n];\n\nconst abbreviatedMonthNamesEs = [\n 'Ene',\n 'Feb',\n 'Mar',\n 'Abr',\n 'May',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic',\n];\nconst dayNamesEs = [\n 'Domingo',\n 'Lunes',\n 'Martes',\n 'Miércoles',\n 'Jueves',\n 'Viernes',\n 'Sábado',\n];\n\nconst abbreviatedDayNamesEs = ['Dom', 'Lun', 'Mar', 'Mié', 'Juv', 'Vie', 'Sáb'];\nconst dayNamesMinEs = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'];\n\n/**\n * Por defecto provoca que el filtro seleccione todos los filtros\n * @param {Array} data Elementos del filtro\n * @returns data Elementos del filtro\n */\nexport function selectFilterAll(data) {\n const selectedItems = data.resultset.map((item) => item[0]);\n this.dashboard.fireChange(this.parameter, selectedItems);\n return data;\n}\n\n/**\n * Comprueba si los elementos de un array son todos 'All', incluso un array dentro otro array\n * @param {Array} arr Array de entrada\n * @returns true si todos los elementos son 'All'\n */\nfunction isAll(arr) {\n for (const element of arr) {\n if (Array.isArray(element)) {\n if (!isAll(element)) {\n return false;\n }\n } else if (element !== 'All') {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Selecciona el datasource que se debe ejecutar en los filtros y modificar parámetros.\n * En la primera ejecución se cargarán todos los elementos en los filtros y el valor del parámetro\n * se pondrá a 'All' para la correcta ejecución de las gráficas que están escuchando\n * @param {FilterComponent} filterOrigen componentes del filtro\n * @param {Array} filterParam Array con los valores del resto de filtros relacionados con este\n * @param {Array} queryDatasourceLoad datasource que se ejecutará al cargar la página o resetear\n * @param {Array} queryDatasource nombre del datasource que se ejecutará el resto de veces\n * @returns true Si todo funciona correctamente\n */\nexport function selectConfigDatasource(\n filterOrigen,\n filterParam,\n queryDatasourceLoad,\n queryDatasource,\n) {\n // Comprobar si estamos en la primera carga de los datos\n if (isAll(filterParam)) {\n filterOrigen.queryDefinition.dataAccessId = queryDatasourceLoad;\n filterOrigen.dashboard.setParameter(filterOrigen.parameter, ['All']);\n } else {\n filterOrigen.queryDefinition.dataAccessId = queryDatasource;\n }\n return true;\n}\n\n/**\n * Resetea los filtros de todos los selectores, excepto los de fechas\n * @param {Array} filterParam Array con los parámetros de los filtros\n */\nexport function resetFilter(filterParam) {\n filterParam.forEach((element) => {\n Dashboards.fireChange(element, ['All']);\n });\n}\n\n/**\n * Configura los componentes de filtros\n * @returns configuracion del filtro\n */\nexport function getSelectCommonOptions() {\n return {\n input: {\n root: {\n id: 'All',\n },\n indexes: {\n id: 0,\n label: 0,\n },\n },\n component: {\n Root: {\n strings: {\n isDisabled: 'No disponible',\n allItems: 'Todos',\n noItems: 'Ninguno',\n btnApply: 'Aceptar',\n btnCancel: 'Cancelar',\n },\n },\n Group: {\n Strings: {\n allItems: 'Todos',\n noItems: 'Ninguno',\n btnApply: 'Aceptar',\n btnCancel: 'Cancelar',\n },\n },\n },\n };\n}\n\n/**\n * Configura los componentes de filtros que van a recibir una query\n * donde la primera columna es el label que se vera en el cuadro de mandos y la segunda columna es el valor que tendrá el filtro\n * @returns configuracion del filtro\n */\nexport function getSelectTwoColumnsOptions() {\n const idLabelOptions = getSelectCommonOptions();\n idLabelOptions.input.indexes.id = 1;\n idLabelOptions.input.indexes.label = 0;\n return idLabelOptions;\n}\n\n/**\n * Resetea el filtro de fechas, asignando los valores de las fechas por defecto\n * @param {String} paramameterResetIni parametro que se reseteará con el valor por defecto de la fecha de inicio\n * @param {String} paramameterResetFin parametro que se reseteará con el valor por defecto de la fecha de fin\n * @param {String} paramameterLoadIni parametro que contiene el valor por defecto de la fecha de inicio\n * @param {String} paramameterLoadFin parametro que contiene el valor por defecto de la fecha de fin\n * @returns true Si todo funciona correctamente\n */\nexport function resetFilterDates(\n paramameterResetIni,\n paramameterResetFin,\n paramameterLoadIni,\n paramameterLoadFin,\n) {\n const valueIni = Dashboards.getParameterValue(paramameterLoadIni);\n const valueFin = Dashboards.getParameterValue(paramameterLoadFin);\n Dashboards.fireChange(paramameterResetIni, [valueIni]);\n Dashboards.fireChange(paramameterResetFin, [valueFin]);\n\n return true;\n}\n\n/**\n * Poner en castellano los meses y días de las semana del calendaria que muestra el selector de fechas\n * @param {datepicker} datepicker Componente datepciker del que se modificarán sus propiedades\n */\nexport function convertToLanguageSelectorDateRange(datepicker) {\n datepicker.regional.es = {\n monthNames: monthNamesEs,\n abbreviatedMonthNames: abbreviatedMonthNamesEs,\n dayNames: dayNamesEs,\n abbreviatedDayNames: abbreviatedDayNamesEs,\n dayNamesMin: dayNamesMinEs,\n weekHeader: 'Sm',\n firstDay: 1,\n isRTL: false,\n showMonthAfterYear: false,\n yearSuffix: '',\n };\n datepicker.setDefaults(datepicker.regional.es);\n}\n","/**\n * Inicializa la tabla con las opciones indicadas\n * @param {String} tableId Nombre del html.\n * @param {String} option opciones de la tabla.\n * @returns tabla completa.\n */\nexport function initTable(tableId, option) {\n const table = document.getElementById(tableId);\n if (!table) {\n console.error(`No se pudo encontrar el elemento con ID ${tableId}.`);\n return null;\n }\n\n return new Tabulator(table, option);\n}\n\n/**\n * Separa las cadenas para su correcta representición.\n * @param {String} name Nombre a formatear.\n * @param {Integer} size numero de caracteres que como máximo se mostrarán en cada fila.\n * @returns Cadena formateada.\n */\nexport function formatNameHeaderColumn(cell, size) {\n let columnName = cell.getValue();\n if (columnName.length > size) {\n columnName = `${columnName.substr(0, size)}<br>${columnName.substr(size)}`;\n }\n return columnName;\n}\n\n/**\n * Separa en diferentes líneas los valores de las celdas.\n * @param {String} cell Valor de la celda.\n * @param {Integer} size numero de caracteres que como máximo se mostrarán en cada fila.\n * @returns Cadena formateada.\n */\nexport function formatCellMultiplesLines(cell, size) {\n const columnName = cell.getValue();\n const words = columnName.split(' '); // Se divide el contenido del a celda en palabras\n let lines = '';\n let currentLine = '';\n // Recorrer las palabras y construir líneas\n words.forEach((word) => {\n if ((currentLine + word).length <= size) {\n currentLine += `${word} `;\n } else {\n lines += `${currentLine}<br>`;\n currentLine = `${word} `;\n }\n });\n lines += `${currentLine}<br>`;\n\n return lines;\n}\n\n/**\n * Expande o contrae todos los nodos de tree view.\n * @param {Row} row Nodo del tree view.\n * @param {String} action Indica la acción a realizar. Si action es igual a 'expand', la función expandirá el nodo; de lo contrario, la contraerá.\n */\nfunction findChildren(row, action) {\n if (action === 'expand') {\n row.treeExpand();\n } else {\n row.treeCollapse();\n }\n\n const childRows = row.getTreeChildren();\n\n if (childRows.length > 0) {\n childRows.forEach((child) => {\n if (child.getTreeChildren().length > 0) {\n findChildren(child, action);\n }\n });\n }\n}\n\n/**\n * Recorre todas las filas de una tabla tree view y aplica la función findChildren a cada una de ellas.\n * @param {Table} tbl Representa una tabla con filas y estructura tree view.\n * @param {String} action Indica la acción a realizar. Si action es igual a 'expand', la función expandirá el nodo; de lo contrario, la contraerá.\n */\nexport function traverseRows(tbl, action) {\n const tblRows = tbl.getRows();\n tblRows.forEach((row) => {\n if (row.getTreeChildren().length > 0) {\n findChildren(row, action);\n }\n });\n}\n\n/**\n * Convierte la estructura de una tabla a tree view.\n * @param {Array} origen Contiene el array de elemento origen devueltos por la query\n * @param {String} nodeParent Elemento padre del treeView\n * @param {Array} listNameChildren Lista de nombres de los elementos hijos\n * @param {String} valueChildren Elemento hijo del treeView\n */\nexport function convertToTableTreeView(\n origen,\n nodeParent,\n listNameChildren,\n valueChildren,\n) {\n const dataObj = [];\n\n for (const key in origen) {\n if (origen.hasOwnProperty(key)) {\n const subArray = origen[key];\n\n const areaObj = {\n [nodeParent]: subArray[0],\n _children: [],\n };\n\n subArray.shift(); // Elimina el primer elemento del array, en este caso el área\n subArray.forEach((valor, index) => {\n const childObj = {\n [nodeParent]: listNameChildren[index],\n [valueChildren]: valor,\n };\n\n areaObj._children.push(childObj);\n });\n\n dataObj.push(areaObj);\n }\n }\n\n return dataObj;\n}\n\n/**\n * Verifica si todas las agrupaciones en la tabla están colapsadas.\n * @returns {boolean} Devuelve true si están todas las agrupaciones colapsadas y false si no.\n */\nexport function checkAllGroupsCollapsed(table) {\n let allCollapsed = true;\n const groups = table.getGroups();\n groups.forEach((group) => {\n if (group._group.visible) {\n allCollapsed = false;\n }\n });\n return allCollapsed;\n}\n\n/**\n * Exporta en CSV la tabla.\n * @param {Table} table elemento tabla del que se descargá la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n * @param {String} elementHTML nombre el elemento HTML\n */\nexport function downloadCSVTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n table.download('csv', `${nombreFichero}.csv`, { delimiter: ';' });\n };\n const downloadCsvButton = document.getElementById(elementHTML);\n\n const newDownloadCsvButton = downloadCsvButton.cloneNode(true);\n downloadCsvButton.parentNode.replaceChild(\n newDownloadCsvButton,\n downloadCsvButton,\n );\n\n newDownloadCsvButton.addEventListener('click', previousClickHandler);\n}\n\n/**\n * Exporta en PDF la tabla.\n * @param {Table} table elemento tabla del que se descargá la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n */\nexport function downloadPDFTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n table.download('pdf', `${nombreFichero}.pdf`, {\n title: nombreFichero,\n rowCalcStyles: {\n fontSize: 8,\n fontStyle: 'bold',\n },\n autoTable: {\n styles: {\n fontSize: 8,\n },\n },\n });\n };\n const downloadCsvButton = document.getElementById(elementHTML);\n\n const newDownloadPdfButton = downloadCsvButton.cloneNode(true);\n downloadCsvButton.parentNode.replaceChild(\n newDownloadPdfButton,\n downloadCsvButton,\n );\n\n newDownloadPdfButton.addEventListener('click', previousClickHandler);\n}\n","export function buildTableCalidadAire(resultset) {\n const trArray = [];\n const SO2_THRESHOLDS = [100, 200, 350, 500, 750, 751];\n const NO2_THRESHOLDS = [40, 90, 120, 230, 340, 341];\n const O3_THRESHOLDS = [50, 100, 130, 240, 380, 381];\n const PM10_THRESHOLDS = [20, 40, 50, 100, 150, 151];\n const PM25_THRESHOLDS = [10, 20, 25, 50, 75, 76];\n const CSS_CLASS_THRESHOLD = {\n 0: 'b',\n 1: 'a',\n 2: 'd',\n 3: 'm',\n 4: 'mm',\n 5: 'em',\n 6: '',\n 7: 'nd',\n };\n /**\n * Setea la clase CSS al objeto con el id que recibe por parámetro\n * dependiendo de en que umbral se encuentra el valor.\n * @param {Array} array\n * @param {Number} value\n * @param {String} idCss\n * @returns {String}\n */\n function getCssClass(array, value) {\n let threshold;\n if (value === undefined) {\n threshold = 6;\n } else if (value === 'ND') {\n threshold = 7;\n } else {\n threshold = 5;\n array.forEach((element, index) => {\n if (value <= element && threshold === 5) {\n threshold = index;\n }\n });\n }\n return CSS_CLASS_THRESHOLD[threshold];\n }\n\n /**\n * Crea un elemento td para una tabla html con un id y valor determinados.\n * @param {string} idName Id que se le asignará al td.\n * @param {string} value Valor del td.\n * @param {string} threshold Array que contenga los umbrales.\n * @returns {td node} Elemento td\n */\n function createTdElement(idName, value, threshold) {\n const tdElement = document.createElement('td');\n tdElement.setAttribute('id', idName);\n if (value !== undefined && value !== null) {\n tdElement.innerHTML = value;\n const cssClass = getCssClass(threshold, value);\n tdElement.classList.add(cssClass);\n }\n return tdElement;\n }\n\n resultset.forEach((row) => {\n const estacion = row;\n // Si los datos estan desactualizados mostramos N/D en la estación\n if (estacion.operationalstatus === 'noData') {\n estacion.so2value = 'ND';\n estacion.no2value = 'ND';\n estacion.o3value = 'ND';\n estacion.pm10value = 'ND';\n estacion.pm25value = 'ND';\n }\n\n // ELIMINAR PARA MOSTRAR DATOS PM10 Y PM25 DE CABANYAL\n if (estacion.entityid === 'A09_CABANYAL_60m') {\n estacion.pm10value = undefined;\n estacion.pm25value = undefined;\n }\n // Rellenando la tabla dinamica\n const markupTrElement = document.createElement('tr');\n const markupTdElement = document.createElement('td');\n markupTdElement.innerHTML = estacion.address;\n markupTrElement.appendChild(markupTdElement);\n\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_so2`,\n estacion.so2value,\n SO2_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_no2`,\n estacion.no2value,\n NO2_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_o3`,\n estacion.o3value,\n O3_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm10`,\n estacion.pm10value,\n PM10_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm25`,\n estacion.pm25value,\n PM25_THRESHOLDS,\n ),\n );\n trArray.push(markupTrElement);\n });\n\n return trArray;\n}\n","/**\n * Obtiene una ruta completa del Cdm de Pentaho donde nos encontramos\n * con la ruta relativa proporcionada.\n * @param {string} route Ruta relativa que se concatenara al path principal.\n */\nexport function calculatePentahoPath(route) {\n document.location = `${document.documentURI.split('%3A')[0]}%3A${\n document.documentURI.split('%3A')[1]\n }%3A${document.documentURI.split('%3A')[2]}%3A${\n document.documentURI.split('%3A')[3]\n }%3A${route}`;\n}\n\n/**\n * Función que extrae el nombre del fichero wcdf del path principal.\n * @returns Nombre del fichero wcdf.\n */\nexport function getWCDFFileNameFromPath() {\n const regExp = /(.*?).wcdf/;\n return document.documentURI.split('%3A')[4].match(regExp)[1];\n}\n\n/**\n * Indica si el dispositivo con el que se consulta la pagina es IOS o no.\n * @returns True si es IOS y False si no lo es.\n */\nexport function isIOSDevice() {\n const { userAgent } = navigator;\n return /iPad|iPhone|iPod|Macintosh/.test(userAgent) && !window.MSStream;\n}\n\nexport function getEnvironment() {\n const currentUrl = window.location.href;\n let env = '';\n if (currentUrl.includes('localhost')) {\n env = 'local';\n } else if (currentUrl.includes('sc_valencia_pre')) {\n env = 'PRE';\n } else {\n env = 'PRO';\n }\n return env;\n}\n\nexport function changeTabTitle() {\n const env = getEnvironment();\n if (env !== 'PRO') {\n document.title += ` (${env})`;\n }\n}\n\nexport function changeNavTitle() {\n const env = getEnvironment();\n if (env !== 'PRO') {\n document.querySelector(\"nav\").querySelectorAll('span')[1].textContent += ` (${env})`;\n }\n}","import { changeBodyClass } from '../style/body-class';\nimport {\n changeTabTitle,\n changeNavTitle,\n} from '../navigation/common-navigation';\n\n/**\n * Función que inyecta codigo html de un fichero determinado en una etiqueta html.\n * @param {string} filePath Ruta de fichero que vamos a cargar.\n * @param {element} elementParam Elemento HTML en el que vamos a inyectar la ruta.\n * @param {function} cllbackOnContentLoaded Función que se ejecutará al cargar por completo el fichero HTML en la página.\n */\nfunction includeHTMLFileInElement(\n filePath,\n elementParam,\n cllbackOnContentLoaded,\n) {\n const element = elementParam;\n if (filePath) {\n const xhttp = new XMLHttpRequest();\n xhttp.onreadystatechange = function () {\n if (this.readyState === 4) {\n if (this.status === 200) {\n element.innerHTML = this.responseText;\n if (cllbackOnContentLoaded) {\n cllbackOnContentLoaded();\n }\n }\n if (this.status === 404) {\n element.innerHTML = 'No se ha podido cargar correctamente.';\n }\n }\n };\n xhttp.open('GET', filePath, true);\n xhttp.send();\n }\n}\n\n/**\n * Función que inyecta codigo html de un fichero determinado en una serie de etiquetas html\n * que contienen un atributo en común.\n * @param {string} attrName Nombre del atributo html que se va a buscar entre los elementos.\n * @returns void\n */\nexport function includeHTMLFileInElements(attrName, cllback) {\n const elements = document.querySelectorAll(`[${attrName}]`);\n elements.forEach((element) => {\n const filePath = element.getAttribute(attrName);\n includeHTMLFileInElement(filePath, element, cllback);\n });\n}\n\n/**\n * Función que se ejecuta desde el html de pentaho y que carga diferentes partes de la página.\n * Dentro de ella existen dos funciones que se ejecutan siempre en TODOS LOS PANELES:\n * cabeceraContentLoaded: Esta función se ejecutará cuando se haya cargado la cabecera por completo.\n * mainContentLoaded: Esta función se ejecutará cuando se haya cargado el main por completo incluyendo la función cllback del parametro de esta función.\n * @param {function} cllback Función especifica de un panel que puede ejecutarse trás la carga de la página main.\n * @param {*} id\n */\nexport function initialCalls(cllback) {\n function cabeceraContentLoaded() {\n changeTabTitle();\n changeNavTitle();\n }\n\n function mainContentLoaded() {\n changeBodyClass();\n if (cllback) {\n cllback();\n }\n }\n includeHTMLFileInElements('include-html-cabecera', cabeceraContentLoaded);\n includeHTMLFileInElements('include-html-menu');\n includeHTMLFileInElements('include-html-main-container', mainContentLoaded);\n includeHTMLFileInElements('include-html-copyright');\n}\n","import { getWCDFFileNameFromPath } from '../navigation/common-navigation';\r\n\r\n/**\r\n * Función que cambia la clase de la etiqueta Body por una con el nombre del fichero wcdf.\r\n */\r\nexport function changeBodyClass() {\r\n const bodyElement = document.querySelector('body');\r\n bodyElement.classList.remove('inicio');\r\n bodyElement.classList.add(getWCDFFileNameFromPath());\r\n}\r\n","import { isIOSDevice } from '../navigation/common-navigation';\n\nexport function buildCamarasTrafico(\n paramIframeAccesosCiudad,\n paramIframeViasPrincipales,\n paramSectionContainer,\n paramDivCamaras,\n paramBlurButton,\n paramMillisBeforeBlur,\n) {\n const URL_CAMARA_ACCESO_CIUDAD_CAS =\n 'https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=cas';\n const URL_CAMARA_VIAS_PRINCIPALES_CAS =\n 'https://camaras.valencia.es/camaras/ocimovil.html?lang=cas';\n const URL_CAMARA_ACCESO_CIUDAD_VAL =\n 'https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=val';\n const URL_CAMARA_VIAS_PRINCIPALES_VAL =\n 'https://camaras.valencia.es/camaras/ocimovil.html?lang=val';\n\n const COD_ISO_VALENCIA = 'ca-ES';\n let firstAccess = false;\n let blurModeActive = false;\n\n const iframeAccesosCiudad = document.querySelector(paramIframeAccesosCiudad);\n const iframeViasPrincipales = document.querySelector(\n paramIframeViasPrincipales,\n );\n\n /**\n * Agregar al Iframe la url de las camaras de trafico\n */\n const refreshCamaras = () => {\n if (\n typeof Liferay !== 'undefined' &&\n // eslint-disable-next-line no-undef\n Liferay.ThemeDisplay.getBCP47LanguageId() === COD_ISO_VALENCIA\n ) {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.setAttribute('src', URL_CAMARA_ACCESO_CIUDAD_CAS);\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.setAttribute(\n 'src',\n URL_CAMARA_VIAS_PRINCIPALES_CAS,\n );\n }\n } else {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.setAttribute('src', URL_CAMARA_ACCESO_CIUDAD_VAL);\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.setAttribute(\n 'src',\n URL_CAMARA_VIAS_PRINCIPALES_VAL,\n );\n }\n }\n };\n\n /**\n * Quita las url de las camaras de los iframes\n */\n const stopCamaras = () => {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.src = 'about:blank';\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.src = 'about:blank';\n }\n };\n\n /**\n * Oculta toda la caja de camaras.\n */\n function hideCamaras() {\n const divCamaras = document.querySelectorAll(paramDivCamaras)[0];\n divCamaras.style.display = 'none';\n }\n\n /**\n * Permite activar el modo blur que muestra las camaras difuminadas con un boton de recarga.\n * @param {boolean} active true para activar, false para desactivar.\n */\n function blurMode(active = true) {\n const sectionContainer = document.querySelector(paramSectionContainer);\n if (active) {\n stopCamaras();\n sectionContainer.classList.add('blur');\n blurModeActive = true;\n } else {\n sectionContainer.classList.remove('blur');\n refreshCamaras();\n blurModeActive = false;\n }\n }\n\n /**\n * Evento que activa la visualizacion de las camaras si se muestra\n * por pantalla.\n * @param {Object} iframe\n * @param {String} urlCamarasCas\n * @param {String} urlCamarasVal\n */\n const handlerIsVisibleIframe = (iframe) => {\n const observerCamara = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n if (!blurModeActive) {\n refreshCamaras();\n }\n // Aqui solo entra la primera vez\n if (!firstAccess) {\n firstAccess = true;\n window.setTimeout(blurMode, paramMillisBeforeBlur);\n }\n }\n });\n });\n observerCamara.observe(iframe);\n };\n\n function linksCamarasTrafico() {\n if (!isIOSDevice()) {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.setAttribute('sandbox', 'allow-scripts');\n handlerIsVisibleIframe(iframeAccesosCiudad);\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.setAttribute('sandbox', 'allow-scripts');\n handlerIsVisibleIframe(iframeViasPrincipales);\n }\n document.querySelector(paramBlurButton).addEventListener('click', () => {\n blurMode(false);\n window.setTimeout(blurMode, paramMillisBeforeBlur);\n });\n } else {\n hideCamaras();\n }\n }\n linksCamarasTrafico();\n}\n","import { splitData, updateObject } from '../data/common-data';\nimport { addPointInteger } from '../formatting/common-number';\nimport { initChart, formatTooltip } from './common-chart';\nimport { getMonth } from '../dates/common-date';\n\n/**\n * Método que formatea el tooltip.\n * @param {*} params contine los valores del tooltip.\n * @param {*} seriesData * Contine las serias de valores del tooltip de todos los años.\n * @returns el texto del tooltip formateado\n */\nconst sameMonthAllYearsFormatter = (params, seriesData) => {\n seriesData.sort((a, b) => parseInt(a.anyo) - parseInt(b.anyo));\n\n const sumsByYear = {};\n\n // Aggregacíon del los años del mes elegido.\n seriesData.forEach((entry) => {\n const year = entry[1];\n const month = entry[0];\n\n if (month === params.seriesName && !sumsByYear[year]) {\n sumsByYear[year] = 0;\n }\n\n if (month === params.seriesName) {\n sumsByYear[year] += entry[2];\n }\n });\n\n let nameLabel = `<p>${params.seriesName}</p>`;\n\n for (const [year, sum] of Object.entries(sumsByYear)) {\n nameLabel += `<div>${\n params.marker\n } ${year}: <strong style=\"float: right; margin-left:20px\">${addPointInteger(\n sum,\n )}</strong></div>`;\n }\n\n return nameLabel;\n};\n/**\n * Configura el grafico de barras apiladas a partir de un conjunto inicial de datos.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} misDatosArray Conjunto inicial de datos\n * @param {Object} updateOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n * @param {Object} updateDataOptions Objeto que contiene las opciones que se quieren cambiar de cada dato de la serie individualmente.\n */\nexport function initStackedBarChart(\n idChart,\n data,\n updateOptions = undefined,\n updateDataOptionsParam = undefined,\n) {\n const updateDataOptions =\n updateDataOptionsParam === null ? undefined : updateDataOptionsParam;\n const anyos = new Set(data.map((subArray) => subArray[1]));\n let borderColors;\n /**\n * Observa si el objeto updateDataOptions tiene definido un array dentro de itemStyle.borderColor.\n * Si es asi lo guardará para en el futuro aplicar cada color del array a cada una de las series.\n */\n const prepareBorderColors = () => {\n if (\n updateDataOptions &&\n updateDataOptions.itemStyle &&\n Array.isArray(updateDataOptions.itemStyle.borderColor)\n ) {\n borderColors = [...updateDataOptions.itemStyle.borderColor];\n delete updateDataOptions.itemStyle.borderColor;\n }\n };\n\n /**\n * Calcula las series de la StackedBarChart, aplicando el estilo updateDataOptions a cada una de las series.\n * @returns\n */\n const calculateSeries = () => {\n const defaultDataOptions = {\n name: 'SIN NOMBRE',\n type: 'bar',\n stack: 'total',\n label: {\n show: true,\n fontFamily: 'Montserrat',\n fontSize: 10,\n formatter: (params) => addPointInteger(Math.round(params.value)),\n },\n itemStyle: undefined,\n emphasis: {\n focus: 'series',\n },\n data: undefined,\n };\n\n prepareBorderColors();\n\n const separatedData = splitData(data, 0);\n const categories = Object.keys(separatedData);\n anyos.forEach((anyo) => {\n categories.forEach((category) => {\n const isYear = separatedData[category].find(\n (subArray) => subArray[1] === anyo,\n );\n if (isYear === undefined) {\n separatedData[category].push([\n separatedData[category][0][0],\n anyo,\n undefined,\n ]);\n separatedData[category].sort();\n }\n });\n });\n const series = [];\n Object.keys(separatedData).forEach((category) => {\n if (borderColors) {\n defaultDataOptions.itemStyle = { borderColor: borderColors.shift() };\n }\n defaultDataOptions.name = category;\n\n defaultDataOptions.data = separatedData[category].map(\n (subArray) => subArray[2],\n );\n let finallyDataOptions = {};\n if (updateDataOptions !== undefined) {\n finallyDataOptions = updateObject(\n defaultDataOptions,\n updateDataOptions,\n );\n } else {\n finallyDataOptions = defaultDataOptions;\n }\n series.push({ ...finallyDataOptions });\n });\n return series;\n };\n const defaultOptions = {\n title: {\n text: 'SIN TITULO',\n left: 'center',\n top: 'top',\n textStyle: {\n fontSize: 20,\n fontFamily: 'Montserrat',\n fontWeight: 600,\n color: '#666',\n },\n },\n tooltip: {\n axisPointer: {\n type: 'shadow',\n },\n trigger: 'item',\n formatter: (params) => sameMonthAllYearsFormatter(params, data),\n textStyle: {\n fontFamily: 'Montserrat',\n },\n position(point, params, dom, rect, size) {\n const position = {};\n\n const tooltipHeight = size.contentSize[1];\n const halfTooltipHeight = tooltipHeight / 2;\n const chartHeight = size.viewSize[1];\n const pointY = point[1];\n\n if (pointY < halfTooltipHeight) {\n position.top = 10;\n } else if (pointY + halfTooltipHeight > chartHeight) {\n position.bottom = 10;\n } else {\n position.top = pointY - halfTooltipHeight;\n }\n\n if (point[0] < size.viewSize[0] / 2) {\n position.left = point[0] + 20;\n } else {\n position.right = size.viewSize[0] - point[0] + 20;\n }\n\n return position;\n },\n },\n legend: {\n padding: 40,\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n grid: {\n left: '3%',\n right: '4%',\n bottom: '3%',\n containLabel: true,\n },\n xAxis: {\n type: 'value',\n splitNumber: 10,\n name: 'SIN NOMBRE',\n nameLocation: 'start',\n nameTextStyle: {\n fontWeight: 'bold',\n fontFamily: 'Montserrat',\n color: '#666',\n padding: -40,\n },\n axisLabel: {\n margin: 5,\n textStyle: {\n fontFamily: 'Montserrat',\n },\n formatter: (value) => addPointInteger(value),\n },\n splitLine: {\n lineStyle: {\n color: '#DDD',\n },\n },\n },\n yAxis: {\n type: 'category',\n data: Array.from(anyos),\n axisLabel: {\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n },\n series: calculateSeries(),\n toolbox: {\n show: true,\n feature: {\n restore: { title: 'Restablir' },\n saveAsImage: { title: 'Desar' },\n },\n right: 50,\n },\n };\n\n let finallyOptions = {};\n if (updateOptions !== undefined) {\n finallyOptions = updateObject(defaultOptions, updateOptions);\n } else {\n finallyOptions = defaultOptions;\n }\n initChart(idChart, finallyOptions);\n}\n\n/**\n * Configura el grafico de barras apiladas a partir de un conjunto inicial de datos. Esta función se utiliza cuando las series son meses.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * En concreto este tipo de graficos utiliza unos colores en común que son definidos aqui mismo.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} misDatosArray Conjunto inicial de datos\n * @param {Object} updateOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n * @param {Object} updateDataOptions Objeto que contiene las opciones que se quieren cambiar de cada dato de la serie individualmente.\n */\nexport function initStackedBarChartMonthSeries(\n idChart,\n data,\n updateOptionsParam = {},\n updateDataOptionsParam = {},\n) {\n /**\n * Ordena los años del eje y para mostrarlos adecuadamente\n * @returns Un array con los años ordenado de mayor a menor.\n */\n function getYearsOrdered() {\n const yearsSet = new Set();\n data.forEach((element) => {\n yearsSet.add(element[1]);\n });\n const orderedYears = Array.from(yearsSet).sort((a, b) => a - b);\n\n return orderedYears;\n }\n\n // Opciones especificas\n const updateOptions = {\n color: [\n '#81B1CC',\n '#ABD9EA',\n '#C2EEF9',\n '#F9E2AF',\n '#F9C780',\n '#FDAE61',\n '#F46D43',\n '#FDAE61',\n '#F9E2AF',\n '#C2EEF9',\n '#ABD9EA',\n '#81B1CC',\n ],\n yAxis: {\n data: getYearsOrdered(),\n },\n };\n\n let finallyOptions = {};\n finallyOptions = updateObject(updateOptionsParam, updateOptions);\n\n // Opciones especificas sobre los datos\n const updateDataOptions = {\n itemStyle: {\n borderWidth: 2,\n borderColor: [\n '#448DAD',\n '#89CADB',\n '#A0DEE8',\n '#F4D28C',\n '#F4B569',\n '#F79646',\n '#F25930',\n '#F79646',\n '#F4D28C',\n '#A0DEE8',\n '#89CADB',\n '#448DAD',\n ],\n },\n };\n\n const finallyDataOptions =\n updateDataOptionsParam === null\n ? updateDataOptions\n : updateObject(updateDataOptionsParam, updateDataOptions);\n\n // Sustución del número de mes por el nombre\n const formatedData = data;\n formatedData.forEach((element, index) => {\n formatedData[index][0] = getMonth(element[0]);\n });\n\n initStackedBarChart(\n idChart,\n formatedData,\n finallyOptions,\n finallyDataOptions,\n );\n}\n","import { formatRoundTooltip, initChart } from \"./common-chart\";\nimport { updateObject } from '../data/common-data';\n\n/**\n * Configura el grafico de barras a partir de un conjunto inicial de datos.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} data Conjunto inicial de datos.\n * @param {Object} updateOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n */\n\nexport function initBarChart(idChart, updateOptions = undefined) {\n const defaultOptions = {\n title: {\n text: 'SIN TITULO',\n left: 'center',\n top: 'top',\n padding: 50,\n textStyle: {\n fontSize: 14,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n color: '#333',\n },\n },\n legend: {\n show: false,\n },\n grid: {\n top: '30%',\n bottom: '5%',\n left: '8%',\n right: '8%',\n },\n xAxis: {\n type: 'value',\n show: false,\n },\n yAxis: {\n show: false,\n type: 'category',\n },\n tooltip: {\n show: true,\n textStyle: {\n fontFamily: 'Montserrat',\n fontWeight: '600',\n },\n appendToBody: true,\n formatter: (params) => formatRoundTooltip(params, false)\n },\n series: [\n {\n type: 'bar',\n showBackground: true,\n },\n ],\n };\n\n let finallyOptions = {};\n if (updateOptions !== undefined) {\n finallyOptions = updateObject(defaultOptions, updateOptions);\n } else {\n finallyOptions = defaultOptions;\n }\n initChart(idChart, finallyOptions);\n}","export const DEFAULT_LANGUAGE = 'es_ES';\n\nexport const MONTHS_YEAR = {\n es_ES: new Map([\n ['1', 'Enero'],\n ['2', 'Febrero'],\n ['3', 'Marzo'],\n ['4', 'Abril'],\n ['5', 'Mayo'],\n ['6', 'Junio'],\n ['7', 'Julio'],\n ['8', 'Agosto'],\n ['9', 'Septiembre'],\n ['10', 'Octubre'],\n ['11', 'Noviembre'],\n ['12', 'Diciembre'],\n ]),\n ca_ES: new Map([\n ['1', 'Gener'],\n ['2', 'Febrer'],\n ['3', 'Març'],\n ['4', 'Abril'],\n ['5', 'Maig'],\n ['6', 'Juny'],\n ['7', 'Juliol'],\n ['8', 'Agost'],\n ['9', 'Setembre'],\n ['10', 'Octubre'],\n ['11', 'Novembre'],\n ['12', 'Desembre'],\n ]),\n};\n","import { initBarChart } from './bar-chart';\nimport { updateObject } from '../data/common-data';\nimport { getMonthList } from '../dates/common-date';\nimport { DEFAULT_LANGUAGE, MONTHS_YEAR } from '../language/common-language';\n\n/**\n * Devuelve el último año del conjunto de datos.\n * @param {array} dataArray Conjunto inicial de datos.\n * @returns último año\n */\nfunction getLastYear(dataArray) {\n return Math.max(...dataArray.map((element) => Number(element[0])));\n}\n\n/**\n * Devuelve el valor del último año del conjunto de datos.\n * @param {array} dataArray Conjunto inicial de datos.\n * @returns valor del último año\n */\nfunction getLastYearValues(dataArray) {\n const arrayUltimoAnyo = dataArray.filter(\n (arr) => Number(arr[0]) === getLastYear(dataArray),\n );\n const valoresUltimoAnyo = Array.from({ length: 12 }, () => 0);\n arrayUltimoAnyo.forEach(([anio, mes, valor]) => {\n const mesIndex = parseInt(mes, 10) - 1; // Restar 1 porque los meses comienzan desde 1\n valoresUltimoAnyo[mesIndex] = valor;\n });\n return valoresUltimoAnyo;\n}\n\n/**\n * Devuelve el valor del penúltimo año del conjunto de datos.\n * @param {array} dataArray Conjunto inicial de datos.\n * @returns valor del penúltimo año\n */\nfunction getPenultimateYearValues(dataArray) {\n const arrayPenultimoAnyo = dataArray.filter(\n (arr) => Number(arr[0]) === getLastYear(dataArray) - 1,\n );\n const valoresPenultimoAnyo = Array.from({ length: 12 }, () => 0);\n arrayPenultimoAnyo.forEach(([anio, mes, valor]) => {\n const mesIndex = parseInt(mes, 10) - 1; // Restar 1 porque los meses comienzan desde 1\n valoresPenultimoAnyo[mesIndex] = valor;\n });\n return valoresPenultimoAnyo;\n}\n\n/**\n * Configura el grafico de barras a partir de un conjunto inicial de datos. Creando una gráfica de barras que compara 2 años.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} data Conjunto inicial de datos.\n * @param {Object} specificOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n */\n\nexport function initBarChartComparationMonth(\n idChart,\n dataArray,\n specificOptions = undefined,\n) {\n const lastYearString = getLastYear(dataArray).toString();\n const penultimateYearString = (getLastYear(dataArray) - 1).toString();\n\n const defaultOptions = {\n title: {\n left: 'center',\n top: '-12%',\n textStyle: {\n fontSize: 15,\n fontFamily: 'Montserrat',\n },\n },\n legend: {\n top: '10%',\n show: true,\n data: [penultimateYearString, lastYearString],\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n grid: {\n bottom: '8%',\n top: '20%',\n right: '2%',\n },\n xAxis: [\n {\n type: 'category',\n data: getMonthList(MONTHS_YEAR, DEFAULT_LANGUAGE),\n axisLabel: {\n fontFamily: 'Montserrat',\n },\n },\n ],\n yAxis: [\n {\n type: 'value',\n axisLabel: {\n formatter: (value) => value.toLocaleString('es-ES'),\n fontFamily: 'Montserrat',\n },\n },\n ],\n series: [\n {\n name: penultimateYearString,\n type: 'bar',\n data: getPenultimateYearValues(dataArray),\n },\n {\n name: lastYearString,\n type: 'bar',\n barGap: 0,\n data: getLastYearValues(dataArray),\n },\n ],\n };\n\n const mergedOptions = updateObject(defaultOptions, specificOptions);\n initBarChart(idChart, mergedOptions);\n}\n","/**\r\n * Crear el Evento necesario para que al hacer click sobre una etiqueta HTML cargue la url de un iframe por primera vez.\r\n * @param {*} clickElementSelector Elemento HTML que provocara la carga del iframe al hacer click sobre el.\r\n * @param {*} iframeSelector Selector que indica donde esta el iframe al que se le va a cambiar el src.\r\n * @param {*} url URL que se va a cargar en el iframe.\r\n */\r\nexport function loadIframeOnClickEvent(\r\n clickElementSelector,\r\n iframeSelector,\r\n url,\r\n) {\r\n const iframe = document.querySelector(iframeSelector);\r\n const clickElement = document.querySelector(clickElementSelector);\r\n\r\n let loadingIframe = false;\r\n const loadIframeOnClick = () => {\r\n if (loadingIframe === false) {\r\n loadingIframe = true;\r\n iframe.setAttribute('src', 'about:blank');\r\n iframe.setAttribute('src', url);\r\n iframe.onload = () => {\r\n loadingIframe = false;\r\n };\r\n }\r\n };\r\n\r\n clickElement.addEventListener('click', loadIframeOnClick);\r\n clickElement.disabled = false;\r\n}\r\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","mesDescLarga","data","parseInt","toString","separateMonthYear","monthYear","substring","formatMonthAnyo","anyo","mes","formatDayMonthYear","date","dia","separateDayMonthYear","formatShortMonthYear","formatShortMonthShortYear","formatTrimestre","split","parseFloat","getMonthList","MONTHS_YEAR","DEFAULT_LANGUAGE","monthsMap","Array","from","values","map","monthName","slice","decimals","usrlang","navigator","language","userLanguage","length","toUpperCase","factorDigits","minimumFractionDigits","maximumFractionDigits","toLocaleString","formatToMillions","million","formatName","name","size","words","currentLine","result","forEach","word","initChart","chartId","option","chartElem","document","getElementById","console","error","myChart","echarts","init","setOption","window","addEventListener","undefined","resize","mainContent","printNoDataChart","idHide","idShow","hideElement","querySelector","showElement","hidden","style","background","printDataChart","formatTooltip","params","roundValues","serie","unidadMedida","nameLabel","item","roundedValues","Math","round","valuesLabel","color","seriesName","calculateXAxisStart","dataLength","calculateMaxYAxis","interval","maxValue","max","formatTooltipPie","percent","colorSpan","valueLabel","formatRoundTooltip","isPie","label","marker","formatMilMillionEuros","ONE_MILLION","getMaxGaugeValue","array","column","add","row","ceil","configureDataGaugeCommon","misDatosArray","objColData","colorsDataGauge","fontSize","paramOffsetCenterTitle","paramOffsetCenterDetail","paramOffsetLabel","paramCalculatedOffset","paramNumberOfElementsByLine","maxGaugeValue","calculatedOffset","colorsCopy","gaugeDataYears","offsetCenterTitle","offsetCenterDetail","offsetLabel","i","push","String","type","replace","shift","title","offsetCenter","fontFamily","detail","width","formatter","configureDataGaugeMonthCommon","idChart","monthNumber","index","valor","month","year","textBelowGraph","textIntoGraph","innerWidth","labelFormatterMonthlyDataGauge","configureMultipleSeries","datos","resultset","tipos","Set","valueAxisX","dataObj","tipo","fecha","dato","val","day","axisXArray","tiposArray","sort","a","b","toLowerCase","localeCompare","ignorePunctuation","arrayData","filter","arrayDataClean","find","d","configureDataLine","colors","series","symbol","symbolSize","smooth","configureDataBar","resultsetWithFields","metadata","resultsetWithFieldsResult","columnsWithFields","indice","colName","updateObject","original","modified","originalOut","keys","specificSeries","isArray","printDataInHTMLElements","dataConfig","indicador","id","entries","elementArray","className","element","format","textContent","getMaxFieldNumberFromData","fieldName","resultSet","fieldValue","Number","isNaN","splitDataset","isMonth","splittedData","Cont","Mob","COL_ANYO","monthNamesEs","abbreviatedMonthNamesEs","dayNamesEs","abbreviatedDayNamesEs","dayNamesMinEs","selectFilterAll","selectedItems","this","dashboard","fireChange","parameter","isAll","arr","selectConfigDatasource","filterOrigen","filterParam","queryDatasourceLoad","queryDatasource","queryDefinition","dataAccessId","setParameter","resetFilter","Dashboards","getSelectCommonOptions","input","indexes","component","Root","strings","isDisabled","allItems","noItems","btnApply","btnCancel","Group","Strings","getSelectTwoColumnsOptions","idLabelOptions","resetFilterDates","paramameterResetIni","paramameterResetFin","paramameterLoadIni","paramameterLoadFin","valueIni","getParameterValue","valueFin","convertToLanguageSelectorDateRange","datepicker","regional","es","monthNames","abbreviatedMonthNames","dayNames","abbreviatedDayNames","dayNamesMin","weekHeader","firstDay","isRTL","showMonthAfterYear","yearSuffix","setDefaults","initTable","tableId","table","Tabulator","formatNameHeaderColumn","cell","columnName","getValue","substr","formatCellMultiplesLines","lines","findChildren","action","treeExpand","treeCollapse","childRows","getTreeChildren","child","traverseRows","tbl","getRows","convertToTableTreeView","origen","nodeParent","listNameChildren","valueChildren","subArray","areaObj","_children","childObj","checkAllGroupsCollapsed","allCollapsed","getGroups","group","_group","visible","downloadCSVTable","nombreFichero","elementHTML","downloadCsvButton","newDownloadCsvButton","cloneNode","parentNode","replaceChild","download","delimiter","downloadPDFTable","newDownloadPdfButton","rowCalcStyles","fontStyle","autoTable","styles","buildTableCalidadAire","trArray","SO2_THRESHOLDS","NO2_THRESHOLDS","O3_THRESHOLDS","PM10_THRESHOLDS","PM25_THRESHOLDS","CSS_CLASS_THRESHOLD","createTdElement","idName","threshold","tdElement","createElement","setAttribute","innerHTML","cssClass","getCssClass","classList","estacion","operationalstatus","so2value","no2value","o3value","pm10value","pm25value","entityid","markupTrElement","markupTdElement","address","appendChild","calculatePentahoPath","route","location","documentURI","getEnvironment","currentUrl","href","env","includes","includeHTMLFileInElements","attrName","cllback","querySelectorAll","filePath","elementParam","cllbackOnContentLoaded","xhttp","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","send","includeHTMLFileInElement","getAttribute","initialCalls","changeTabTitle","changeNavTitle","bodyElement","remove","match","changeBodyClass","buildCamarasTrafico","paramIframeAccesosCiudad","paramIframeViasPrincipales","paramSectionContainer","paramDivCamaras","paramBlurButton","paramMillisBeforeBlur","firstAccess","blurModeActive","iframeAccesosCiudad","iframeViasPrincipales","refreshCamaras","Liferay","ThemeDisplay","getBCP47LanguageId","blurMode","active","sectionContainer","src","handlerIsVisibleIframe","iframe","IntersectionObserver","entry","isIntersecting","setTimeout","observe","userAgent","test","MSStream","isIOSDevice","display","sameMonthAllYearsFormatter","seriesData","sumsByYear","sum","initStackedBarChart","updateOptions","updateDataOptionsParam","updateDataOptions","anyos","borderColors","defaultOptions","text","left","top","textStyle","fontWeight","tooltip","axisPointer","trigger","position","point","dom","rect","halfTooltipHeight","contentSize","chartHeight","viewSize","pointY","bottom","right","legend","padding","grid","containLabel","xAxis","splitNumber","nameLocation","nameTextStyle","axisLabel","margin","splitLine","lineStyle","yAxis","defaultDataOptions","stack","show","itemStyle","emphasis","focus","borderColor","separatedData","reduce","accumulator","currentValue","splitData","categories","category","finallyDataOptions","calculateSeries","toolbox","feature","restore","saveAsImage","finallyOptions","initStackedBarChartMonthSeries","updateOptionsParam","yearsSet","getYearsOrdered","borderWidth","formatedData","initBarChart","appendToBody","showBackground","es_ES","Map","ca_ES","getLastYear","dataArray","getLastYearValues","arrayUltimoAnyo","valoresUltimoAnyo","anio","mesIndex","getPenultimateYearValues","arrayPenultimoAnyo","valoresPenultimoAnyo","initBarChartComparationMonth","specificOptions","lastYearString","penultimateYearString","barGap","loadIframeOnClickEvent","clickElementSelector","iframeSelector","url","clickElement","loadingIframe","onload","disabled"],"sourceRoot":""}
1
+ {"version":3,"file":"vlcishared.js","mappings":"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","sources":["webpack://@vlci/vlcishared/webpack/universalModuleDefinition","webpack://@vlci/vlcishared/webpack/bootstrap","webpack://@vlci/vlcishared/webpack/runtime/define property getters","webpack://@vlci/vlcishared/webpack/runtime/hasOwnProperty shorthand","webpack://@vlci/vlcishared/webpack/runtime/make namespace object","webpack://@vlci/vlcishared/./src/dates/common-date.js","webpack://@vlci/vlcishared/./src/formatting/common-number.js","webpack://@vlci/vlcishared/./src/formatting/common-text.js","webpack://@vlci/vlcishared/./src/charts/common-chart.js","webpack://@vlci/vlcishared/./src/data/common-process-data.js","webpack://@vlci/vlcishared/./src/data/common-data.js","webpack://@vlci/vlcishared/./src/residuos/common-data.js","webpack://@vlci/vlcishared/./src/selector/common-selector.js","webpack://@vlci/vlcishared/./src/tables/common-table.js","webpack://@vlci/vlcishared/./src/medioambiente/table-calidad-aire.js","webpack://@vlci/vlcishared/./src/navigation/common-navigation.js","webpack://@vlci/vlcishared/./src/initial-calls/common-initial-calls.js","webpack://@vlci/vlcishared/./src/style/body-class.js","webpack://@vlci/vlcishared/./src/camaras/camaras-trafico.js","webpack://@vlci/vlcishared/./src/charts/stacked-bar.js","webpack://@vlci/vlcishared/./src/charts/bar-chart.js","webpack://@vlci/vlcishared/./src/language/common-language.js","webpack://@vlci/vlcishared/./src/charts/bar-chart-comparation-month.js","webpack://@vlci/vlcishared/./src/iframes/load-iframes.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vlcishared\"] = factory();\n\telse\n\t\troot[\"vlcishared\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const mesDescLarga = {\n '01': 'Enero',\n '02': 'Febrero',\n '03': 'Marzo',\n '04': 'Abril',\n '05': 'Mayo',\n '06': 'Junio',\n '07': 'Julio',\n '08': 'Agosto',\n '09': 'Septiembre',\n 10: 'Octubre',\n 11: 'Noviembre',\n 12: 'Diciembre',\n};\n\n/**\n * Dado un valor entero, devuelve el mes/meses asociados a el: 01->Gen\n * @param {object/integer} data Valor a convertir en cadena\n * @returns Cadena asociada al valor.\n */\nexport function getMonth(data) {\n const monthDict = {\n 1: 'Gen',\n 2: 'Feb',\n 3: 'Mar',\n 4: 'Abr',\n 5: 'Mai',\n 6: 'Jun',\n 7: 'Jul',\n 8: 'Ago',\n 9: 'Sep',\n 10: 'Oct',\n 11: 'Nov',\n 12: 'Des',\n };\n return monthDict[parseInt(data.toString(), 10)];\n}\n\n/**\n * Separa un string yyyymm en yyyy & mm\n * @param {string} monthYear\n * @returns\n */\nfunction separateMonthYear(monthYear) {\n return [monthYear.substring(0, 4), mesDescLarga[monthYear.substring(4, 6)]];\n}\n\n/**\n * Separa un string yyyymmdd en yyyy mm dd\n * @param {string} date\n * @returns\n */\nfunction separateDayMonthYear(date) {\n return [\n date.substring(0, 4),\n mesDescLarga[date.substring(4, 6)],\n date.substring(6, 8),\n ];\n}\n\n/**\n * Dado un valor entero yyyyMM, devuelve el valor del mes + año . Ejem: 202301 --> Enero 2023\n * @param {integer} data Valor a convertir en cadena\n * @returns Cadena asociada al valor.\n */\nexport function formatMonthAnyo(data) {\n const [anyo, mes] = separateMonthYear(data);\n return `${mes} ${anyo}`;\n}\n\n/**\n * Dado un valor entero yyyyMMdd, devuelve el valor del dia mes año . Ejem: 20230101 --> 01 Enero 2023\n * @param {integer} date Valor a convertir en cadena\n * @returns Cadena asociada al valor.\n */\nexport function formatDayMonthYear(date) {\n const [anyo, mes, dia] = separateDayMonthYear(date);\n return `${dia} ${mes} ${anyo}`;\n}\n\n/**\n * Dado un valor entero yyyyMM, devuelve el nombre del mes recortado + año.\n * Ejem: 202301 --> Ene 2023\n * @param {integer} data\n */\nexport function formatShortMonthYear(data) {\n const [anyo, mes] = separateMonthYear(data);\n return `${mes.substring(0, 3)} ${anyo}`;\n}\n\n/**\n * Dado un valor entero yyyyMM, devuelve el nombre del mes recortado + año recortado.\n * Ejem: 202301 --> Ene '23\n * @param {integer} data\n */\nexport function formatShortMonthShortYear(data) {\n const [anyo, mes] = separateMonthYear(data);\n return `${mes.substring(0, 3)} '${anyo.substring(2, 4)}`;\n}\n\n/**\n * Formateo de fecha de un trimestre\n * @param {*} date YYYY-MM\n * @returns trimestre formato MM'T' YYYY\n */\nexport function formatTrimestre(date) {\n const [anyo, mes] = date.split('-');\n return `${parseFloat(mes) / 3}T ${anyo}`;\n}\n\n/**\n * @param MONTHS_YEAR Array con los meses del año\n * @param DEFAULT_LANGUAGE Lenguage por defecto. Ej: es_ES\n * @returns devuelve los 12 meses del año en el idioma que haya por defecto. Solo los 3 primeros caracteres del mes.\n * Por ej: Ene, Feb, ...\n */\nexport function getMonthList(MONTHS_YEAR, DEFAULT_LANGUAGE) {\n const monthsMap = MONTHS_YEAR[DEFAULT_LANGUAGE];\n const monthNames = Array.from(monthsMap.values()).map((monthName) =>\n monthName.slice(0, 3),\n );\n return monthNames;\n}\n","/**\n * Introduce . cada 3 cifras del número pasado por parámetros: 1234->1.234\n * @param {integer} value Entero al que se le va a poner.\n * @returns String con el número transformado.\n */\nexport function addPointInteger(value, decimals = 2) {\n // Obtiene el idioma del navegador\n let usrlang = navigator.language || navigator.userLanguage;\n usrlang =\n usrlang.length <= 2 ? `${usrlang}-${usrlang.toUpperCase()}` : usrlang;\n const factorDigits = {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimals,\n };\n return usrlang === 'es-ES'\n ? value.toLocaleString('de-DE', factorDigits)\n : value.toLocaleString(usrlang, factorDigits);\n}\n\n/**\n * Función que convierte un número a notación abreviada\n * @param {integer} value Entero que se va a formatear\n * @returns el valor abreviado a millones\n */\nexport function formatToMillions(value) {\n const million = 1000000;\n return value >= million ? `${value / million}M` : value.toString();\n}\n","/**\n * Separa las cadenas para su correcta representición.\n * @param {String} name Nombre a formatear.\n * @param {Integer} size numero de caracteres que como máximo se mostrarán en cada fila.\n * @returns Cadena formateada.\n */\nexport function formatName(name, size = 29) {\n if (name.length >= size) {\n const words = name.split(' ');\n let currentLine = '';\n let result = '';\n words.forEach((word) => {\n if (`${currentLine} ${word}`.length <= size) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n result += `${currentLine}\\n`;\n currentLine = word;\n }\n });\n result += currentLine;\n return result;\n }\n return name;\n}\n","import { addPointInteger } from '../formatting/common-number';\nimport { getMonth } from '../dates/common-date';\n\nexport const DIVSIZE = 33;\n\nexport function initChart(chartId, option) {\n const chartElem = document.getElementById(chartId);\n if (!chartElem) {\n console.error(`No se pudo encontrar el elemento con ID ${chartId}.`);\n return null;\n }\n\n const myChart = echarts.init(chartElem);\n myChart.setOption(option, true);\n\n // Resize chart on window resize\n window.addEventListener('resize', () => {\n if (myChart != null && myChart !== undefined) {\n myChart.resize();\n }\n });\n\n // Add event listener to 'main-content' for Bootstrap collapse events\n const mainContent = document.getElementById('main-content');\n if (mainContent) {\n mainContent.addEventListener('shown.bs.collapse', () => {\n myChart.resize();\n });\n mainContent.addEventListener('hidden.bs.collapse', () => {\n myChart.resize();\n });\n }\n\n return myChart;\n}\n\nexport function printNoDataChart(idHide, idShow) {\n const noDataStyle = \"url('./build/images/nodata1.png') no-repeat top center\";\n const hideElement = idHide ? document.querySelector(idHide) : null;\n const showElement = idShow ? document.querySelector(idShow) : null;\n\n if (hideElement) {\n hideElement.hidden = true;\n }\n if (showElement) {\n showElement.style.background = noDataStyle;\n showElement.hidden = false;\n }\n}\n\nexport function printDataChart(idHide, idShow) {\n const hideElement = idHide ? document.querySelector(idHide) : null;\n const showElement = idShow ? document.querySelector(idShow) : null;\n\n if (hideElement) {\n hideElement.hidden = true;\n }\n if (showElement) {\n showElement.style.background = '#ffffff';\n showElement.hidden = false;\n }\n}\n\n/**\n * Método que formatea el tooltip.\n * @param {string} params contine los valores del tooltip.\n * @param {boolean} roundValues indica si queremos redondear el valor en el tooltip. True quitará decimales redondeando. False no.\n * @param {boolean} serie indica si los valores tienen varias series o no.\n * @param {string} unidadMedida unidad de medida del valor\n * @returns el texto del tooltip formateado\n */\nexport function formatTooltip(\n params,\n roundValues = false,\n serie = true,\n unidadMedida = '',\n) {\n const colorSpan = (color) =>\n `<span style=\"display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${color}\"></span>`;\n let nameLabel = `<p>${params[0].name}</p>`;\n params.forEach((item) => {\n const roundedValues = roundValues ? Math.round(item.data) : item.data;\n const valuesLabel = serie\n ? `<div>${colorSpan(item.color)} ${item.seriesName}: \n <strong style=\"float: right; margin-left:20px\">\n ${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </strong>\n </div>`\n : `<div>\n <strong>${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </strong>\n </div>`;\n nameLabel += valuesLabel;\n });\n return nameLabel;\n}\n\n/**\n * Calcular inicio del datazoom\n * Devuelve el valor en el que comenzará el datazoom de la gráfica\n * @param {int} dataLength longitud de los datos del eje X\n * @returns number que indica donde comenzará el datazoom\n */\nexport function calculateXAxisStart(dataLength) {\n return (100 * (dataLength - 120)) / dataLength;\n}\n\n/**\n * Calcula cual es el máximo del eje Y en la gráfica dependiendo del intervalo\n * que se quiera tener entre los marcadores del eje.\n * Ej: el valor máximo de los datos es 2500 y el intervalo es 1000, el resultado será 3000.\n * @param {*} value el valor del dato máximo de la serie\n * @param {*} interval el intervalo de los ticks del eje Y\n */\nexport function calculateMaxYAxis(values, interval) {\n const maxValue = Math.max(...values);\n const taskForNextInterval = interval - (maxValue % interval);\n return maxValue + taskForNextInterval;\n}\n\n/**\n * Modulo que formatea en funcion del tamaño de la pantalla\n * @param {array} misDatosArray Array con los datos a formatear\n * @param {*} value Valor del campo que está tratando\n * @param {Number} index Indica la posicion del dato a representar dentro de misDatosArray\n * @returns cadena formateada segun las dimensiones de la pantalla\n */\nexport function formatterReloj(misDatosArray, value, index) {\n const valor = addPointInteger(Math.round(value));\n const month = getMonth(misDatosArray[index][0]);\n const year = misDatosArray[index][1];\n const textBelowGraph = `\\n${month} ${year} : ${valor}`;\n const textIntoGraph = `${valor}\\n${month} ${year}`;\n return window.innerWidth <= 1710 ? textBelowGraph : textIntoGraph;\n}\n\n/**\n * Método que formatea el tooltip de los gráficos pie.\n * @param {Object} params contine los valores del tooltip.\n * @param {boolean} percentage true si el tooltip muestra un porcentage\n * @returns el texto del tooltip formateado\n */\nexport function formatTooltipPie(params, percent = false) {\n const colorSpan = `<span style=\"display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:${params.color}\"></span>`;\n const valueLabel = percent\n ? `${params.percent}%`\n : addPointInteger(params.value);\n\n const nameLabel = `<div> ${colorSpan} ${params.name} <strong style=\"float: right; margin-left:20px\"> ${valueLabel} </strong></div>`;\n\n return nameLabel;\n}\n\nexport function formatRoundTooltip(params, isPie) {\n let label = `${params.name} : `;\n label += `<span style=\"font-weight:bold\">${addPointInteger(\n Math.round(params.value),\n )}</span>`;\n if (isPie) {\n label += `<span> (${params.percent}%)</span>`;\n }\n return params.marker + label;\n}\n\nexport function formatMilMillionEuros(value) {\n const ONE_MILLION = 1000000;\n const castedValue = Number(value);\n\n if (castedValue >= 0 && castedValue < ONE_MILLION) {\n return `${addPointInteger(castedValue)} €`;\n }\n\n if (castedValue >= ONE_MILLION) {\n return `${addPointInteger(castedValue / ONE_MILLION)} M €`;\n }\n\n return '-';\n}\n","import { splitData, updateObject } from './common-data';\nimport { getMonth } from '../dates/common-date';\nimport { addPointInteger } from '../formatting/common-number';\nimport { formatName } from '../formatting/common-text';\nimport { initChart, formatTooltip } from '../charts/common-chart';\n\n/**\n * Método que devuelve el máximo de una columna en concreto de un array.\n * @param {array} array Array que contiene la columna a tratar.\n * @param {integer} column Indice de la columna.\n * @param {float} add Si se quiere incrementar el máximo en X unidades.\n * @returns el valor máximo de array en la columna column\n */\nfunction getMaxGaugeValue(array, column, add = 1) {\n const max = Math.max(...array.map((row) => row[column])) * add;\n return Math.ceil(max / 5000) * 5000;\n}\n\n/**\n * Configura los datos de los Gauge Anuales o multiserie.\n * @param {Text} idChart Identificador del Chart\n * @param {Array} misDatosArray Resultset obtenido de la query a la BBDD\n * @param {Object} objColData Objeto que indica la correspondencia\n * entre la posicion y la columna de misDatosArray.\n * @param {Array} colorsDataGauge Array que contiene los colores que se van a utilizar.\n * @param {Number} fontSize Tamaño de la fuente utilizado.\n * @param {Number} paramOffsetCenterTitle Porcentaje de la ubicacion vertical\n * del titulo de las series.\n * @param {Number} paramOffsetCenterDetail Porcentaje de la ubicacion vertical\n * del valor de las series.\n * @param {Number} paramOffsetLabel Porcetaje de la ubicación horizontal desde el centro\n * tanto para el titulo como para el valor de las series.\n * @param {Number} paramCalculatedOffset Diferencia de porcentaje de la ubicación horizontal\n * entre una serie y otra.\n * @param {Number} paramNumberOfElementsByLine Numero de series que se van a mostrar por cada fila.\n * @returns Devuelve el valor maximo del gauge y los datos. */\n\nexport function configureDataGaugeCommon(\n misDatosArray,\n objColData,\n colorsDataGauge,\n fontSize = 30,\n paramOffsetCenterTitle = 15,\n paramOffsetCenterDetail = 30,\n paramOffsetLabel = -70,\n paramCalculatedOffset = 70,\n paramNumberOfElementsByLine = 3,\n) {\n const maxGaugeValue = getMaxGaugeValue(misDatosArray, objColData.data, 1.1); // Valor maximo del gauge\n const calculatedOffset = paramCalculatedOffset;\n const colorsCopy = colorsDataGauge.slice();\n const gaugeDataYears = [];\n let offsetCenterTitle = paramOffsetCenterTitle;\n let offsetCenterDetail = paramOffsetCenterDetail;\n let offsetLabel = paramOffsetLabel;\n\n for (let i = 0; i < misDatosArray.length; i += 1) {\n gaugeDataYears.push({\n value: misDatosArray[i][objColData.data],\n name: formatName(\n String(misDatosArray[i][objColData.type]).replace(/\\[.*?\\]/g, ''),\n ),\n\n color: colorsCopy.shift(),\n title: {\n offsetCenter: [\n `${String(offsetLabel)}%`,\n `${String(offsetCenterTitle)}%`,\n ],\n fontFamily: 'Montserrat',\n fontSize,\n },\n detail: {\n offsetCenter: [\n `${String(offsetLabel)}%`,\n `${String(offsetCenterDetail)}%`,\n ],\n fontFamily: 'Montserrat',\n width: '33%',\n formatter: (value) => addPointInteger(Math.round(value)),\n },\n });\n offsetLabel += calculatedOffset;\n if ((i + 1) % paramNumberOfElementsByLine === 0) {\n offsetCenterDetail += paramOffsetCenterDetail;\n offsetCenterTitle += paramOffsetCenterTitle * 2;\n offsetLabel = paramOffsetLabel;\n }\n }\n\n return [maxGaugeValue, gaugeDataYears];\n}\n\n/**\n * Modulo que formatea en funcion del tamaño de la pantalla\n * @param {array} misDatosArray Array con los datos a formatear\n * @param {*} value Valor del campo que está tratando\n * @param {Number} index Indica la posicion del dato a representar dentro de misDatosArray\n * @returns cadena formateada segun las dimensiones de la pantalla\n */\nexport function labelFormatterMonthlyDataGauge(misDatosArray, value, index) {\n const valor = addPointInteger(Math.round(value));\n const month = getMonth(misDatosArray[index][0]);\n const year = misDatosArray[index][1];\n const textBelowGraph = `\\n${month} ${year} : ${valor}`;\n const textIntoGraph = `${valor}\\n${month} ${year}`;\n return window.innerWidth <= 1710 ? textBelowGraph : textIntoGraph;\n}\n\n/**\n * Configura los datos de los Gauge Mensuales o de una sola serie.\n * @param {Text} idChart Identificador del Chart\n * @param {Array} misDatosArray Resultset obtenido de la query a la BBDD\n * @param {Object} objColData Objeto que indica la correspondencia\n * entre la posicion y la columna de misDatosArray.\n * @param {Number} monthNumber Indica el numero de mes que vamos a representar desde el actual,\n * siendo 0 el mes actual, 1 el anterior, etc.\n * @returns {Array} Devuelve el valor maximo del gauge,\n * el formato del detalle del Gauge y los datos. */\n\nexport function configureDataGaugeMonthCommon(\n idChart,\n misDatosArray,\n objColData,\n monthNumber = 0,\n) {\n const maxGaugeValue = getMaxGaugeValue(misDatosArray, objColData.data, 1);\n const seriesDetailFormatter = (value) =>\n labelFormatterMonthlyDataGauge(misDatosArray, value, monthNumber);\n const gaugeDataMonth = [\n {\n value: misDatosArray[monthNumber][objColData.data],\n },\n ];\n return [maxGaugeValue, seriesDetailFormatter, gaugeDataMonth];\n}\n\n/**\n * Configura un gráfico que tiene varias series\n * @param {Array} datos datos iniciales.\n * @param {boolean} round indica si se quiere redondear los datos de entrada.\n * @returns Datos configurados.\n */\nexport function configureMultipleSeries(datos, round) {\n const { resultset } = { resultset: datos };\n const tipos = new Set();\n const valueAxisX = new Set();\n\n const dataObj = resultset.map(([tipo, fecha, dato]) => {\n const val = round ? Math.round(dato) : dato;\n tipos.add(tipo);\n valueAxisX.add(fecha);\n return { day: fecha, type: tipo, value: val };\n });\n\n const axisXArray = Array.from(valueAxisX.values());\n const tiposArray = Array.from(tipos.values());\n // Ordenar si los nombres vienen desordenados:\n tiposArray.sort((a, b) =>\n a\n .toLowerCase()\n .localeCompare(b.toLowerCase(), 'es', { ignorePunctuation: true }),\n );\n\n const series = tiposArray.map((tipo) => {\n const arrayData = dataObj\n .filter((obj) => obj.type === tipo)\n .map(({ day, value }) => [day, tipo, value]);\n\n const arrayDataClean = axisXArray.map((fecha) => {\n const obj = arrayData.find(([d]) => d === fecha);\n return obj ? obj[2] : null;\n });\n return {\n name: tipo,\n data: arrayDataClean,\n };\n });\n\n return [series, tiposArray, valueAxisX];\n}\n\n/**\n * Configura los datos para los gráficos de líneas.\n * @param {Array} datos datos iniciales.\n * @param {Array} color colores de las lineas a mostrar en la gráfica.\n * @param {boolean} round indica si se quiere redondear los datos de entrada.\n * @returns Datos configurados.\n */\nexport function configureDataLine(datos, colors, round = false) {\n const [series, tiposArray, valueAxisX] = configureMultipleSeries(\n datos,\n round,\n );\n // Configurar el tipo de línea para cada serie individual\n series.forEach((serie) => {\n serie.type = 'line';\n serie.symbol = 'circle';\n serie.color = colors.shift();\n serie.symbolSize = 6;\n serie.smooth = 0.1;\n });\n\n return [series, valueAxisX, tiposArray];\n}\n\n/**\n * Configura los datos para los gráficos de barras.\n * @param {Array} datos datos iniciales.\n * @param {Array} color colores de las lineas a mostrar en la gráfica.\n * @param {boolean} round indica si se quiere redondear los datos de entrada.\n * @returns Datos configurados.\n */\nexport function configureDataBar(datos, colors, round = false) {\n const [series, tiposArray, valueAxisX] = configureMultipleSeries(\n datos,\n round,\n );\n // Configurar el tipo de línea para cada serie individual\n series.forEach((serie) => {\n serie.type = 'bar';\n serie.color = colors.shift();\n serie.smooth = false;\n });\n\n return [series, valueAxisX, tiposArray];\n}\n","/**\r\n * Separa el conjunto de datos \"data\" en función de la columna \"column\"\r\n * @param {array} data Conjunto de datos a separar y agrupar\r\n * @param {integer} column Columna por la que se va a agrupar\r\n * @returns Diccionario con el array \"data\" agrupado por \"column\"\r\n */\r\nexport function splitData(data, column) {\r\n return data.reduce((accumulator, currentValue) => {\r\n const key = currentValue[column];\r\n if (!accumulator[key]) {\r\n accumulator[key] = [];\r\n }\r\n accumulator[key].push(currentValue);\r\n return accumulator;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Función que partiendo de los datos obtenidos de una query de Pentaho, devuelve el resultset\r\n * indicando el nombre de las columnas en cada valor\r\n * @param {Array} data Datos obtenidos de la query de Pentaho.\r\n * @returns {Array} Array que contiene un objeto por cada fila.\r\n */\r\nexport function resultsetWithFields(data) {\r\n const { resultset, metadata } = data;\r\n const resultsetWithFieldsResult = [];\r\n resultset.forEach((row) => {\r\n const columnsWithFields = {};\r\n row.forEach((column, indice) => {\r\n columnsWithFields[metadata[indice].colName] = column;\r\n });\r\n\r\n resultsetWithFieldsResult.push(columnsWithFields);\r\n });\r\n return resultsetWithFieldsResult;\r\n}\r\n/**\r\n * Función que actualiza un objeto con otro. Ej)\r\n \r\nobjetoOriginal = {\r\n propiedad1: {\r\n atributo1: 'valor1',\r\n atributo2: 'valor2'\r\n },\r\n propiedad2: 'valor2'\r\n};\r\n\r\nconst objetoParcial = {\r\n propiedad1: {\r\n atributo1: 'nuevoValor1'\r\n }\r\n};\r\n\r\nobjetoActualizado = {\r\n propiedad1: {\r\n atributo1: 'nuevoValor1',\r\n atributo2: 'valor2'\r\n },\r\n propiedad2: 'valor2'\r\n};\r\n * @param {Object} original Objeto original que quiere ser actualizado. \r\n * @param {Object} modified Objeto que contiene los valores que queremos actualizar.\r\n * @returns \r\n */\r\nexport function updateObject(original, modified) {\r\n const originalOut = original;\r\n\r\n Object.keys(modified).forEach((key) => {\r\n // Evita los atributos heredados que no hemos creado nosotros.\r\n if (Object.prototype.hasOwnProperty.call(modified, key)) {\r\n if (key === 'series') {\r\n originalOut[key] = modified[key].map((specificSeries, index) =>\r\n // Fusionar propiedades específicas para cada elemento de 'series'\r\n ({ ...original[key][index], ...specificSeries }),\r\n );\r\n }\r\n // Comprueba si el valor de la propiedad es un objeto y no un array\r\n else if (\r\n typeof modified[key] === 'object' &&\r\n !Array.isArray(modified[key])\r\n ) {\r\n // Si la propiedad es un objeto, llama recursivamente a la función para combinar sus atributos\r\n originalOut[key] = updateObject(original[key] || {}, modified[key]);\r\n } else {\r\n // Si no es un objeto, simplemente asigna el valor al objeto original\r\n originalOut[key] = modified[key];\r\n }\r\n }\r\n });\r\n // Devuelve el objeto original actualizado\r\n return original;\r\n}\r\n\r\n/**\r\n * Pinta los datos obtenidos por una query de pentaho en el HTML aplicando una configuración.\r\n * @param {Object} data Objeto que devuelve pentaho tras realizar una query que contiene los datos que se van a pintar.\r\n * Requisitos:\r\n * 1- Tener una columna con el nombre id y coincida con el id del atributo del dataConfig.\r\n * 2- Cada fila del objeto debe tener un id distinto.\r\n * @param {Object} dataConfig Objeto que contiene la configuración de los datos que se van a pintar. Lo que no este declarado en este objeto, no se pintará.\r\n * Requisitos:\r\n * 1- El objeto contendra una lista de elementos que se corresponderan con el id de cada fila del objeto data.\r\n * 2- Dentro de cada elemento crearemos un nuevo atributo con el nombre de la columna que queremos pintar. Este atributo puede configurarse de dos formas distintas:\r\n * 2.1- Se puede asignar un valor directamente que correspondera con el selector del elemento html donde queremos pintarlo.\r\n * 2.2- Se puede crear un objeto que contendra dos elementos más:\r\n * 2.2.1- element contendra el selector del elemento html donde queremos pintarlo.\r\n * 2.2.2- format contendra una funcion con la que se podra formatear el valor antes de pintarlo.\r\n * 2.3 - Se puede crear un objeto que renombre el nombre de la clase por uno que venga de base de datos añadiendo un elemento className\r\n * Ejemplo:\r\n * const dataConfig = {\r\n NumeroQuejasSugerenciasMes: { <--- Id que debe coincidir con la columna id del data.\r\n value: '#indQuejasVal', <--- La columna value del data será pintada en el selector HTML indicado.\r\n variacion: {\r\n element: '#indQuejasVar', <--- La columna variacion del data será pintada en el selector HTML indicado.\r\n format: (value) => `${value}%`, <--- Además se le aplicará el formato indicado aqui antes de ser insertado.\r\n },\r\n tendencia: { <--- Id que debe coincidir con la columna que devuelve el valor por el que vamos a renombrar la clase\r\n className: '.prePrePrevioTrim', <--- El valor del elemento className será el de la clase indicada en el HTML.\r\n },\r\n RendimientoAdministrativo:{....}\r\n }\r\n */\r\nexport function printDataInHTMLElements(data, dataConfig) {\r\n data.forEach((indicador) => {\r\n if (indicador.id in dataConfig) {\r\n Object.entries(dataConfig[indicador.id]).forEach((elementArray) => {\r\n const key = elementArray[0];\r\n const value = elementArray[1];\r\n if (typeof value === 'object') {\r\n if (value.className) {\r\n document.querySelector(value.className).className = indicador[key];\r\n } else if (value.element && value.format) {\r\n document.querySelector(value.element).textContent = dataConfig[\r\n indicador.id\r\n ][key].format(indicador[key]);\r\n }\r\n } else {\r\n document.querySelector(value).textContent = indicador[key];\r\n }\r\n });\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Función que devuelve el máximo de uno de los campos del objeto data recuperado en una query.\r\n * @param {Object} data Objeto que contiene los datos de la query.\r\n * @param {String} fieldName Nombre del campo del cual queremos obtener el maximo.\r\n * @returns Si existia al menos un número en el campo especificado, devolvera el maximo del mismo, en caso contrario devuelve null.\r\n */\r\nexport function getMaxFieldNumberFromData(data, fieldName) {\r\n const resultSet = resultsetWithFields(data);\r\n const array = [];\r\n let max = null;\r\n resultSet.forEach((element) => {\r\n const fieldValue = element[fieldName];\r\n if (typeof fieldValue === 'number' && !Number.isNaN(fieldValue)) {\r\n array.push(fieldValue);\r\n }\r\n });\r\n\r\n if (array.length > 0) {\r\n max = Math.max(...array);\r\n }\r\n return max;\r\n}\r\n","export function splitDataset(misDatosArray, isMonth = true) {\n const splittedData = { Cont: [], Mob: [] };\n const COL_CLAS = 0;\n const COL_TIPO = 1;\n const COL_DATO = 2;\n const COL_MES = 3;\n const COL_ANYO = 4;\n const clasCont = 'is-res-001-kgs-contenidors';\n const colTipoTotal = 'total';\n const colTipoMobles = 'Mobles';\n misDatosArray.forEach((datos) => {\n if (datos[COL_CLAS] === clasCont && datos[COL_TIPO] === colTipoTotal) {\n if (isMonth) {\n splittedData.Cont.push([datos[COL_MES], datos[COL_ANYO], datos[COL_DATO]]);\n } else {\n splittedData.Cont.push([datos[COL_ANYO - 1], datos[COL_DATO]]);\n }\n }\n if (datos[COL_TIPO] === colTipoMobles) {\n if (isMonth) {\n splittedData.Mob.push([datos[COL_MES], datos[COL_ANYO], datos[COL_DATO]]);\n } else {\n splittedData.Mob.push([datos[COL_ANYO - 1], datos[COL_DATO]]);\n }\n }\n });\n return splittedData;\n}\n","const monthNamesEs = [\n 'Enero',\n 'Febrero',\n 'Marzo',\n 'Abril',\n 'Mayo',\n 'Junio',\n 'Julio',\n 'Agosto',\n 'Septiembre',\n 'Octubre',\n 'Noviembre',\n 'Diciembre',\n];\n\nconst abbreviatedMonthNamesEs = [\n 'Ene',\n 'Feb',\n 'Mar',\n 'Abr',\n 'May',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic',\n];\nconst dayNamesEs = [\n 'Domingo',\n 'Lunes',\n 'Martes',\n 'Miércoles',\n 'Jueves',\n 'Viernes',\n 'Sábado',\n];\n\nconst abbreviatedDayNamesEs = ['Dom', 'Lun', 'Mar', 'Mié', 'Juv', 'Vie', 'Sáb'];\nconst dayNamesMinEs = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'];\n\n/**\n * Por defecto provoca que el filtro seleccione todos los filtros\n * @param {Array} data Elementos del filtro\n * @returns data Elementos del filtro\n */\nexport function selectFilterAll(data) {\n const selectedItems = data.resultset.map((item) => item[0]);\n this.dashboard.fireChange(this.parameter, selectedItems);\n return data;\n}\n\n/**\n * Comprueba si los elementos de un array son todos 'All', incluso un array dentro otro array\n * @param {Array} arr Array de entrada\n * @returns true si todos los elementos son 'All'\n */\nfunction isAll(arr) {\n for (const element of arr) {\n if (Array.isArray(element)) {\n if (!isAll(element)) {\n return false;\n }\n } else if (element !== 'All') {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Selecciona el datasource que se debe ejecutar en los filtros y modificar parámetros.\n * En la primera ejecución se cargarán todos los elementos en los filtros y el valor del parámetro\n * se pondrá a 'All' para la correcta ejecución de las gráficas que están escuchando\n * @param {FilterComponent} filterOrigen componentes del filtro\n * @param {Array} filterParam Array con los valores del resto de filtros relacionados con este\n * @param {Array} queryDatasourceLoad datasource que se ejecutará al cargar la página o resetear\n * @param {Array} queryDatasource nombre del datasource que se ejecutará el resto de veces\n * @returns true Si todo funciona correctamente\n */\nexport function selectConfigDatasource(\n filterOrigen,\n filterParam,\n queryDatasourceLoad,\n queryDatasource,\n) {\n // Comprobar si estamos en la primera carga de los datos\n if (isAll(filterParam)) {\n filterOrigen.queryDefinition.dataAccessId = queryDatasourceLoad;\n filterOrigen.dashboard.setParameter(filterOrigen.parameter, ['All']);\n } else {\n filterOrigen.queryDefinition.dataAccessId = queryDatasource;\n }\n return true;\n}\n\n/**\n * Resetea los filtros de todos los selectores, excepto los de fechas\n * @param {Array} filterParam Array con los parámetros de los filtros\n */\nexport function resetFilter(filterParam) {\n filterParam.forEach((element) => {\n Dashboards.fireChange(element, ['All']);\n });\n}\n\n/**\n * Configura los componentes de filtros\n * @returns configuracion del filtro\n */\nexport function getSelectCommonOptions() {\n return {\n input: {\n root: {\n id: 'All',\n },\n indexes: {\n id: 0,\n label: 0,\n },\n },\n component: {\n Root: {\n strings: {\n isDisabled: 'No disponible',\n allItems: 'Todos',\n noItems: 'Ninguno',\n btnApply: 'Aceptar',\n btnCancel: 'Cancelar',\n },\n },\n Group: {\n Strings: {\n allItems: 'Todos',\n noItems: 'Ninguno',\n btnApply: 'Aceptar',\n btnCancel: 'Cancelar',\n },\n },\n },\n };\n}\n\n/**\n * Configura los componentes de filtros que van a recibir una query\n * donde la primera columna es el label que se vera en el cuadro de mandos y la segunda columna es el valor que tendrá el filtro\n * @returns configuracion del filtro\n */\nexport function getSelectTwoColumnsOptions() {\n const idLabelOptions = getSelectCommonOptions();\n idLabelOptions.input.indexes.id = 1;\n idLabelOptions.input.indexes.label = 0;\n return idLabelOptions;\n}\n\n/**\n * Resetea el filtro de fechas, asignando los valores de las fechas por defecto\n * @param {String} paramameterResetIni parametro que se reseteará con el valor por defecto de la fecha de inicio\n * @param {String} paramameterResetFin parametro que se reseteará con el valor por defecto de la fecha de fin\n * @param {String} paramameterLoadIni parametro que contiene el valor por defecto de la fecha de inicio\n * @param {String} paramameterLoadFin parametro que contiene el valor por defecto de la fecha de fin\n * @returns true Si todo funciona correctamente\n */\nexport function resetFilterDates(\n paramameterResetIni,\n paramameterResetFin,\n paramameterLoadIni,\n paramameterLoadFin,\n) {\n const valueIni = Dashboards.getParameterValue(paramameterLoadIni);\n const valueFin = Dashboards.getParameterValue(paramameterLoadFin);\n Dashboards.fireChange(paramameterResetIni, [valueIni]);\n Dashboards.fireChange(paramameterResetFin, [valueFin]);\n\n return true;\n}\n\n/**\n * Resetea un filtro simple de fecha, asignando el valor de fecha por defecto\n * @param {String} paramameterResetIni parametro que se reseteará con el valor por defecto de la fecha de inicio\n * @param {String} paramameterLoadIni parametro que contiene el valor por defecto de la fecha de inicio */\nexport function resetFilterDate(\n paramameterResetIni,\n paramameterLoadIni\n) {\n const valueIni = Dashboards.getParameterValue(paramameterLoadIni);\n Dashboards.fireChange(paramameterResetIni, [valueIni]);\n return true;\n}\n\n/**\n * Inicializa el parametro que contiene el valor de fecha por defecto\n * @param {*} data es el dato de la query que se usa para obtener el valor por defecto\n * @param {String} filterParam parámetro que contiene el valor de fecha por defecto\n */\nexport function initValueDefaultDate(data, filterParam) {\n Dashboards.fireChange(filterParam, data.resultset[0][0]);\n}\n\n/**\n * Selecciona el valor de fecha por defecto en el selector de fecha\n * @param {*} filterComponent\n * @param {String} parameterOrigin parámetro que contiene el valor de fecha por defecto\n */\nexport function selectValueDefaultInFilter(filterComponent, parameterOrigin) {\n const paramDefault = Dashboards.getParameterValue(parameterOrigin);\n const paramFilter = filterComponent.parameter;\n filterComponent.dashboard.setParameter(paramFilter, [paramDefault]);\n}\n\n/**\n * Poner en castellano los meses y días de las semana del calendaria que muestra el selector de fechas\n * @param {datepicker} datepicker Componente datepciker del que se modificarán sus propiedades\n */\nexport function convertToLanguageSelectorDateRange(datepicker) {\n datepicker.regional.es = {\n monthNames: monthNamesEs,\n abbreviatedMonthNames: abbreviatedMonthNamesEs,\n dayNames: dayNamesEs,\n abbreviatedDayNames: abbreviatedDayNamesEs,\n dayNamesMin: dayNamesMinEs,\n weekHeader: 'Sm',\n firstDay: 1,\n isRTL: false,\n showMonthAfterYear: false,\n yearSuffix: '',\n };\n datepicker.setDefaults(datepicker.regional.es);\n}\n","/**\n * Inicializa la tabla con las opciones indicadas\n * @param {String} tableId Nombre del html.\n * @param {String} option opciones de la tabla.\n * @returns tabla completa.\n */\nexport function initTable(tableId, option) {\n const table = document.getElementById(tableId);\n if (!table) {\n console.error(`No se pudo encontrar el elemento con ID ${tableId}.`);\n return null;\n }\n\n return new Tabulator(table, option);\n}\n\n/**\n * Separa las cadenas para su correcta representición.\n * @param {String} name Nombre a formatear.\n * @param {Integer} size numero de caracteres que como máximo se mostrarán en cada fila.\n * @returns Cadena formateada.\n */\nexport function formatNameHeaderColumn(cell, size) {\n let columnName = cell.getValue();\n if (columnName.length > size) {\n columnName = `${columnName.substr(0, size)}<br>${columnName.substr(size)}`;\n }\n return columnName;\n}\n\n/**\n * Separa en diferentes líneas los valores de las celdas.\n * @param {String} cell Valor de la celda.\n * @param {Integer} size numero de caracteres que como máximo se mostrarán en cada fila.\n * @returns Cadena formateada.\n */\nexport function formatCellMultiplesLines(cell, size) {\n const columnName = cell.getValue();\n const words = columnName.split(' '); // Se divide el contenido del a celda en palabras\n let lines = '';\n let currentLine = '';\n // Recorrer las palabras y construir líneas\n words.forEach((word) => {\n if ((currentLine + word).length <= size) {\n currentLine += `${word} `;\n } else {\n lines += `${currentLine}<br>`;\n currentLine = `${word} `;\n }\n });\n lines += `${currentLine}<br>`;\n\n return lines;\n}\n\n/**\n * Expande o contrae todos los nodos de tree view.\n * @param {Row} row Nodo del tree view.\n * @param {String} action Indica la acción a realizar. Si action es igual a 'expand', la función expandirá el nodo; de lo contrario, la contraerá.\n */\nfunction findChildren(row, action) {\n if (action === 'expand') {\n row.treeExpand();\n } else {\n row.treeCollapse();\n }\n\n const childRows = row.getTreeChildren();\n\n if (childRows.length > 0) {\n childRows.forEach((child) => {\n if (child.getTreeChildren().length > 0) {\n findChildren(child, action);\n }\n });\n }\n}\n\n/**\n * Recorre todas las filas de una tabla tree view y aplica la función findChildren a cada una de ellas.\n * @param {Table} tbl Representa una tabla con filas y estructura tree view.\n * @param {String} action Indica la acción a realizar. Si action es igual a 'expand', la función expandirá el nodo; de lo contrario, la contraerá.\n */\nexport function traverseRows(tbl, action) {\n const tblRows = tbl.getRows();\n tblRows.forEach((row) => {\n if (row.getTreeChildren().length > 0) {\n findChildren(row, action);\n }\n });\n}\n\n/**\n * Convierte la estructura de una tabla a tree view.\n * @param {Array} origen Contiene el array de elemento origen devueltos por la query\n * @param {String} nodeParent Elemento padre del treeView\n * @param {Array} listNameChildren Lista de nombres de los elementos hijos\n * @param {String} valueChildren Elemento hijo del treeView\n */\nexport function convertToTableTreeView(\n origen,\n nodeParent,\n listNameChildren,\n valueChildren,\n) {\n const dataObj = [];\n\n for (const key in origen) {\n if (origen.hasOwnProperty(key)) {\n const subArray = origen[key];\n\n const areaObj = {\n [nodeParent]: subArray[0],\n _children: [],\n };\n\n subArray.shift(); // Elimina el primer elemento del array, en este caso el área\n subArray.forEach((valor, index) => {\n const childObj = {\n [nodeParent]: listNameChildren[index],\n [valueChildren]: valor,\n };\n\n areaObj._children.push(childObj);\n });\n\n dataObj.push(areaObj);\n }\n }\n\n return dataObj;\n}\n\n/**\n * Verifica si todas las agrupaciones en la tabla están colapsadas.\n * @returns {boolean} Devuelve true si están todas las agrupaciones colapsadas y false si no.\n */\nexport function checkAllGroupsCollapsed(table) {\n let allCollapsed = true;\n const groups = table.getGroups();\n groups.forEach((group) => {\n if (group._group.visible) {\n allCollapsed = false;\n }\n });\n return allCollapsed;\n}\n\n/**\n * Exporta en CSV la tabla.\n * @param {Table} table elemento tabla del que se descargá la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n * @param {String} elementHTML nombre el elemento HTML\n */\nexport function downloadCSVTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n table.download('csv', `${nombreFichero}.csv`, { delimiter: ';' });\n };\n const downloadCsvButton = document.getElementById(elementHTML);\n\n const newDownloadCsvButton = downloadCsvButton.cloneNode(true);\n downloadCsvButton.parentNode.replaceChild(\n newDownloadCsvButton,\n downloadCsvButton,\n );\n\n newDownloadCsvButton.addEventListener('click', previousClickHandler);\n}\n\n/**\n * Exporta en PDF la tabla.\n * @param {Table} table elemento tabla del que se descargá la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n */\nexport function downloadPDFTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n table.download('pdf', `${nombreFichero}.pdf`, {\n title: nombreFichero,\n rowCalcStyles: {\n fontSize: 8,\n fontStyle: 'bold',\n },\n autoTable: {\n styles: {\n fontSize: 8,\n },\n },\n });\n };\n const downloadCsvButton = document.getElementById(elementHTML);\n\n const newDownloadPdfButton = downloadCsvButton.cloneNode(true);\n downloadCsvButton.parentNode.replaceChild(\n newDownloadPdfButton,\n downloadCsvButton,\n );\n\n newDownloadPdfButton.addEventListener('click', previousClickHandler);\n}\n","export function buildTableCalidadAire(resultset) {\n const trArray = [];\n const SO2_THRESHOLDS = [100, 200, 350, 500, 750, 751];\n const NO2_THRESHOLDS = [40, 90, 120, 230, 340, 341];\n const O3_THRESHOLDS = [50, 100, 130, 240, 380, 381];\n const PM10_THRESHOLDS = [20, 40, 50, 100, 150, 151];\n const PM25_THRESHOLDS = [10, 20, 25, 50, 75, 76];\n const CSS_CLASS_THRESHOLD = {\n 0: 'b',\n 1: 'a',\n 2: 'd',\n 3: 'm',\n 4: 'mm',\n 5: 'em',\n 6: '',\n 7: 'nd',\n };\n /**\n * Setea la clase CSS al objeto con el id que recibe por parámetro\n * dependiendo de en que umbral se encuentra el valor.\n * @param {Array} array\n * @param {Number} value\n * @param {String} idCss\n * @returns {String}\n */\n function getCssClass(array, value) {\n let threshold;\n if (value === undefined) {\n threshold = 6;\n } else if (value === 'ND') {\n threshold = 7;\n } else {\n threshold = 5;\n array.forEach((element, index) => {\n if (value <= element && threshold === 5) {\n threshold = index;\n }\n });\n }\n return CSS_CLASS_THRESHOLD[threshold];\n }\n\n /**\n * Crea un elemento td para una tabla html con un id y valor determinados.\n * @param {string} idName Id que se le asignará al td.\n * @param {string} value Valor del td.\n * @param {string} threshold Array que contenga los umbrales.\n * @returns {td node} Elemento td\n */\n function createTdElement(idName, value, threshold) {\n const tdElement = document.createElement('td');\n tdElement.setAttribute('id', idName);\n if (value !== undefined && value !== null) {\n tdElement.innerHTML = value;\n const cssClass = getCssClass(threshold, value);\n tdElement.classList.add(cssClass);\n }\n return tdElement;\n }\n\n resultset.forEach((row) => {\n const estacion = row;\n // Si los datos estan desactualizados mostramos N/D en la estación\n if (estacion.operationalstatus === 'noData') {\n estacion.so2value = 'ND';\n estacion.no2value = 'ND';\n estacion.o3value = 'ND';\n estacion.pm10value = 'ND';\n estacion.pm25value = 'ND';\n }\n\n // ELIMINAR PARA MOSTRAR DATOS PM10 Y PM25 DE CABANYAL\n if (estacion.entityid === 'A09_CABANYAL_60m') {\n estacion.pm10value = undefined;\n estacion.pm25value = undefined;\n }\n // Rellenando la tabla dinamica\n const markupTrElement = document.createElement('tr');\n const markupTdElement = document.createElement('td');\n markupTdElement.innerHTML = estacion.address;\n markupTrElement.appendChild(markupTdElement);\n\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_so2`,\n estacion.so2value,\n SO2_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_no2`,\n estacion.no2value,\n NO2_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_o3`,\n estacion.o3value,\n O3_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm10`,\n estacion.pm10value,\n PM10_THRESHOLDS,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm25`,\n estacion.pm25value,\n PM25_THRESHOLDS,\n ),\n );\n trArray.push(markupTrElement);\n });\n\n return trArray;\n}\n","/**\n * Obtiene una ruta completa del Cdm de Pentaho donde nos encontramos\n * con la ruta relativa proporcionada.\n * @param {string} route Ruta relativa que se concatenara al path principal.\n */\nexport function calculatePentahoPath(route) {\n document.location = `${document.documentURI.split('%3A')[0]}%3A${\n document.documentURI.split('%3A')[1]\n }%3A${document.documentURI.split('%3A')[2]}%3A${\n document.documentURI.split('%3A')[3]\n }%3A${route}`;\n}\n\n/**\n * Función que extrae el nombre del fichero wcdf del path principal.\n * @returns Nombre del fichero wcdf.\n */\nexport function getWCDFFileNameFromPath() {\n const regExp = /(.*?).wcdf/;\n return document.documentURI.split('%3A')[4].match(regExp)[1];\n}\n\n/**\n * Indica si el dispositivo con el que se consulta la pagina es IOS o no.\n * @returns True si es IOS y False si no lo es.\n */\nexport function isIOSDevice() {\n const { userAgent } = navigator;\n return /iPad|iPhone|iPod|Macintosh/.test(userAgent) && !window.MSStream;\n}\n\nexport function getEnvironment() {\n const currentUrl = window.location.href;\n let env = '';\n if (currentUrl.includes('localhost')) {\n env = 'local';\n } else if (currentUrl.includes('sc_valencia_pre')) {\n env = 'PRE';\n } else {\n env = 'PRO';\n }\n return env;\n}\n\nexport function changeTabTitle() {\n const env = getEnvironment();\n if (env !== 'PRO') {\n document.title += ` (${env})`;\n }\n}\n\nexport function changeNavTitle() {\n const env = getEnvironment();\n if (env !== 'PRO') {\n document.querySelector(\"nav\").querySelectorAll('span')[1].textContent += ` (${env})`;\n }\n}","import { changeBodyClass } from '../style/body-class';\nimport {\n changeTabTitle,\n changeNavTitle,\n} from '../navigation/common-navigation';\n\n/**\n * Función que inyecta codigo html de un fichero determinado en una etiqueta html.\n * @param {string} filePath Ruta de fichero que vamos a cargar.\n * @param {element} elementParam Elemento HTML en el que vamos a inyectar la ruta.\n * @param {function} cllbackOnContentLoaded Función que se ejecutará al cargar por completo el fichero HTML en la página.\n */\nfunction includeHTMLFileInElement(\n filePath,\n elementParam,\n cllbackOnContentLoaded,\n) {\n const element = elementParam;\n if (filePath) {\n const xhttp = new XMLHttpRequest();\n xhttp.onreadystatechange = function () {\n if (this.readyState === 4) {\n if (this.status === 200) {\n element.innerHTML = this.responseText;\n if (cllbackOnContentLoaded) {\n cllbackOnContentLoaded();\n }\n }\n if (this.status === 404) {\n element.innerHTML = 'No se ha podido cargar correctamente.';\n }\n }\n };\n xhttp.open('GET', filePath, true);\n xhttp.send();\n }\n}\n\n/**\n * Función que inyecta codigo html de un fichero determinado en una serie de etiquetas html\n * que contienen un atributo en común.\n * @param {string} attrName Nombre del atributo html que se va a buscar entre los elementos.\n * @returns void\n */\nexport function includeHTMLFileInElements(attrName, cllback) {\n const elements = document.querySelectorAll(`[${attrName}]`);\n elements.forEach((element) => {\n const filePath = element.getAttribute(attrName);\n includeHTMLFileInElement(filePath, element, cllback);\n });\n}\n\n/**\n * Función que se ejecuta desde el html de pentaho y que carga diferentes partes de la página.\n * Dentro de ella existen dos funciones que se ejecutan siempre en TODOS LOS PANELES:\n * cabeceraContentLoaded: Esta función se ejecutará cuando se haya cargado la cabecera por completo.\n * mainContentLoaded: Esta función se ejecutará cuando se haya cargado el main por completo incluyendo la función cllback del parametro de esta función.\n * @param {function} cllback Función especifica de un panel que puede ejecutarse trás la carga de la página main.\n * @param {*} id\n */\nexport function initialCalls(cllback) {\n function cabeceraContentLoaded() {\n changeTabTitle();\n changeNavTitle();\n }\n\n function mainContentLoaded() {\n changeBodyClass();\n if (cllback) {\n cllback();\n }\n }\n includeHTMLFileInElements('include-html-cabecera', cabeceraContentLoaded);\n includeHTMLFileInElements('include-html-menu');\n includeHTMLFileInElements('include-html-main-container', mainContentLoaded);\n includeHTMLFileInElements('include-html-copyright');\n}\n","import { getWCDFFileNameFromPath } from '../navigation/common-navigation';\r\n\r\n/**\r\n * Función que cambia la clase de la etiqueta Body por una con el nombre del fichero wcdf.\r\n */\r\nexport function changeBodyClass() {\r\n const bodyElement = document.querySelector('body');\r\n bodyElement.classList.remove('inicio');\r\n bodyElement.classList.add(getWCDFFileNameFromPath());\r\n}\r\n","import { isIOSDevice } from '../navigation/common-navigation';\n\nexport function buildCamarasTrafico(\n paramIframeAccesosCiudad,\n paramIframeViasPrincipales,\n paramSectionContainer,\n paramDivCamaras,\n paramBlurButton,\n paramMillisBeforeBlur,\n) {\n const URL_CAMARA_ACCESO_CIUDAD_CAS =\n 'https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=cas';\n const URL_CAMARA_VIAS_PRINCIPALES_CAS =\n 'https://camaras.valencia.es/camaras/ocimovil.html?lang=cas';\n const URL_CAMARA_ACCESO_CIUDAD_VAL =\n 'https://camaras.valencia.es/camaras/ocimovil.html?camara=1&lang=val';\n const URL_CAMARA_VIAS_PRINCIPALES_VAL =\n 'https://camaras.valencia.es/camaras/ocimovil.html?lang=val';\n\n const COD_ISO_VALENCIA = 'ca-ES';\n let firstAccess = false;\n let blurModeActive = false;\n\n const iframeAccesosCiudad = document.querySelector(paramIframeAccesosCiudad);\n const iframeViasPrincipales = document.querySelector(\n paramIframeViasPrincipales,\n );\n\n /**\n * Agregar al Iframe la url de las camaras de trafico\n */\n const refreshCamaras = () => {\n if (\n typeof Liferay !== 'undefined' &&\n // eslint-disable-next-line no-undef\n Liferay.ThemeDisplay.getBCP47LanguageId() === COD_ISO_VALENCIA\n ) {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.setAttribute('src', URL_CAMARA_ACCESO_CIUDAD_CAS);\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.setAttribute(\n 'src',\n URL_CAMARA_VIAS_PRINCIPALES_CAS,\n );\n }\n } else {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.setAttribute('src', URL_CAMARA_ACCESO_CIUDAD_VAL);\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.setAttribute(\n 'src',\n URL_CAMARA_VIAS_PRINCIPALES_VAL,\n );\n }\n }\n };\n\n /**\n * Quita las url de las camaras de los iframes\n */\n const stopCamaras = () => {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.src = 'about:blank';\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.src = 'about:blank';\n }\n };\n\n /**\n * Oculta toda la caja de camaras.\n */\n function hideCamaras() {\n const divCamaras = document.querySelectorAll(paramDivCamaras)[0];\n divCamaras.style.display = 'none';\n }\n\n /**\n * Permite activar el modo blur que muestra las camaras difuminadas con un boton de recarga.\n * @param {boolean} active true para activar, false para desactivar.\n */\n function blurMode(active = true) {\n const sectionContainer = document.querySelector(paramSectionContainer);\n if (active) {\n stopCamaras();\n sectionContainer.classList.add('blur');\n blurModeActive = true;\n } else {\n sectionContainer.classList.remove('blur');\n refreshCamaras();\n blurModeActive = false;\n }\n }\n\n /**\n * Evento que activa la visualizacion de las camaras si se muestra\n * por pantalla.\n * @param {Object} iframe\n * @param {String} urlCamarasCas\n * @param {String} urlCamarasVal\n */\n const handlerIsVisibleIframe = (iframe) => {\n const observerCamara = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n if (!blurModeActive) {\n refreshCamaras();\n }\n // Aqui solo entra la primera vez\n if (!firstAccess) {\n firstAccess = true;\n window.setTimeout(blurMode, paramMillisBeforeBlur);\n }\n }\n });\n });\n observerCamara.observe(iframe);\n };\n\n function linksCamarasTrafico() {\n if (!isIOSDevice()) {\n if (iframeAccesosCiudad) {\n iframeAccesosCiudad.setAttribute('sandbox', 'allow-scripts');\n handlerIsVisibleIframe(iframeAccesosCiudad);\n }\n if (iframeViasPrincipales) {\n iframeViasPrincipales.setAttribute('sandbox', 'allow-scripts');\n handlerIsVisibleIframe(iframeViasPrincipales);\n }\n document.querySelector(paramBlurButton).addEventListener('click', () => {\n blurMode(false);\n window.setTimeout(blurMode, paramMillisBeforeBlur);\n });\n } else {\n hideCamaras();\n }\n }\n linksCamarasTrafico();\n}\n","import { splitData, updateObject } from '../data/common-data';\nimport { addPointInteger } from '../formatting/common-number';\nimport { initChart, formatTooltip } from './common-chart';\nimport { getMonth } from '../dates/common-date';\n\n/**\n * Método que formatea el tooltip.\n * @param {*} params contine los valores del tooltip.\n * @param {*} seriesData * Contine las serias de valores del tooltip de todos los años.\n * @returns el texto del tooltip formateado\n */\nconst sameMonthAllYearsFormatter = (params, seriesData) => {\n seriesData.sort((a, b) => parseInt(a.anyo) - parseInt(b.anyo));\n\n const sumsByYear = {};\n\n // Aggregacíon del los años del mes elegido.\n seriesData.forEach((entry) => {\n const year = entry[1];\n const month = entry[0];\n\n if (month === params.seriesName && !sumsByYear[year]) {\n sumsByYear[year] = 0;\n }\n\n if (month === params.seriesName) {\n sumsByYear[year] += entry[2];\n }\n });\n\n let nameLabel = `<p>${params.seriesName}</p>`;\n\n for (const [year, sum] of Object.entries(sumsByYear)) {\n nameLabel += `<div>${\n params.marker\n } ${year}: <strong style=\"float: right; margin-left:20px\">${addPointInteger(\n sum,\n )}</strong></div>`;\n }\n\n return nameLabel;\n};\n/**\n * Configura el grafico de barras apiladas a partir de un conjunto inicial de datos.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} misDatosArray Conjunto inicial de datos\n * @param {Object} updateOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n * @param {Object} updateDataOptions Objeto que contiene las opciones que se quieren cambiar de cada dato de la serie individualmente.\n */\nexport function initStackedBarChart(\n idChart,\n data,\n updateOptions = undefined,\n updateDataOptionsParam = undefined,\n) {\n const updateDataOptions =\n updateDataOptionsParam === null ? undefined : updateDataOptionsParam;\n const anyos = new Set(data.map((subArray) => subArray[1]));\n let borderColors;\n /**\n * Observa si el objeto updateDataOptions tiene definido un array dentro de itemStyle.borderColor.\n * Si es asi lo guardará para en el futuro aplicar cada color del array a cada una de las series.\n */\n const prepareBorderColors = () => {\n if (\n updateDataOptions &&\n updateDataOptions.itemStyle &&\n Array.isArray(updateDataOptions.itemStyle.borderColor)\n ) {\n borderColors = [...updateDataOptions.itemStyle.borderColor];\n delete updateDataOptions.itemStyle.borderColor;\n }\n };\n\n /**\n * Calcula las series de la StackedBarChart, aplicando el estilo updateDataOptions a cada una de las series.\n * @returns\n */\n const calculateSeries = () => {\n const defaultDataOptions = {\n name: 'SIN NOMBRE',\n type: 'bar',\n stack: 'total',\n label: {\n show: true,\n fontFamily: 'Montserrat',\n fontSize: 10,\n formatter: (params) => addPointInteger(Math.round(params.value)),\n },\n itemStyle: undefined,\n emphasis: {\n focus: 'series',\n },\n data: undefined,\n };\n\n prepareBorderColors();\n\n const separatedData = splitData(data, 0);\n const categories = Object.keys(separatedData);\n anyos.forEach((anyo) => {\n categories.forEach((category) => {\n const isYear = separatedData[category].find(\n (subArray) => subArray[1] === anyo,\n );\n if (isYear === undefined) {\n separatedData[category].push([\n separatedData[category][0][0],\n anyo,\n undefined,\n ]);\n separatedData[category].sort();\n }\n });\n });\n const series = [];\n Object.keys(separatedData).forEach((category) => {\n if (borderColors) {\n defaultDataOptions.itemStyle = { borderColor: borderColors.shift() };\n }\n defaultDataOptions.name = category;\n\n defaultDataOptions.data = separatedData[category].map(\n (subArray) => subArray[2],\n );\n let finallyDataOptions = {};\n if (updateDataOptions !== undefined) {\n finallyDataOptions = updateObject(\n defaultDataOptions,\n updateDataOptions,\n );\n } else {\n finallyDataOptions = defaultDataOptions;\n }\n series.push({ ...finallyDataOptions });\n });\n return series;\n };\n const defaultOptions = {\n title: {\n text: 'SIN TITULO',\n left: 'center',\n top: 'top',\n textStyle: {\n fontSize: 20,\n fontFamily: 'Montserrat',\n fontWeight: 600,\n color: '#666',\n },\n },\n tooltip: {\n axisPointer: {\n type: 'shadow',\n },\n trigger: 'item',\n formatter: (params) => sameMonthAllYearsFormatter(params, data),\n textStyle: {\n fontFamily: 'Montserrat',\n },\n position(point, params, dom, rect, size) {\n const position = {};\n\n const tooltipHeight = size.contentSize[1];\n const halfTooltipHeight = tooltipHeight / 2;\n const chartHeight = size.viewSize[1];\n const pointY = point[1];\n\n if (pointY < halfTooltipHeight) {\n position.top = 10;\n } else if (pointY + halfTooltipHeight > chartHeight) {\n position.bottom = 10;\n } else {\n position.top = pointY - halfTooltipHeight;\n }\n\n if (point[0] < size.viewSize[0] / 2) {\n position.left = point[0] + 20;\n } else {\n position.right = size.viewSize[0] - point[0] + 20;\n }\n\n return position;\n },\n },\n legend: {\n padding: 40,\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n grid: {\n left: '3%',\n right: '4%',\n bottom: '3%',\n containLabel: true,\n },\n xAxis: {\n type: 'value',\n splitNumber: 10,\n name: 'SIN NOMBRE',\n nameLocation: 'start',\n nameTextStyle: {\n fontWeight: 'bold',\n fontFamily: 'Montserrat',\n color: '#666',\n padding: -40,\n },\n axisLabel: {\n margin: 5,\n textStyle: {\n fontFamily: 'Montserrat',\n },\n formatter: (value) => addPointInteger(value),\n },\n splitLine: {\n lineStyle: {\n color: '#DDD',\n },\n },\n },\n yAxis: {\n type: 'category',\n data: Array.from(anyos),\n axisLabel: {\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n },\n series: calculateSeries(),\n toolbox: {\n show: true,\n feature: {\n restore: { title: 'Restablir' },\n saveAsImage: { title: 'Desar' },\n },\n right: 50,\n },\n };\n\n let finallyOptions = {};\n if (updateOptions !== undefined) {\n finallyOptions = updateObject(defaultOptions, updateOptions);\n } else {\n finallyOptions = defaultOptions;\n }\n initChart(idChart, finallyOptions);\n}\n\n/**\n * Configura el grafico de barras apiladas a partir de un conjunto inicial de datos. Esta función se utiliza cuando las series son meses.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * En concreto este tipo de graficos utiliza unos colores en común que son definidos aqui mismo.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} misDatosArray Conjunto inicial de datos\n * @param {Object} updateOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n * @param {Object} updateDataOptions Objeto que contiene las opciones que se quieren cambiar de cada dato de la serie individualmente.\n */\nexport function initStackedBarChartMonthSeries(\n idChart,\n data,\n updateOptionsParam = {},\n updateDataOptionsParam = {},\n) {\n /**\n * Ordena los años del eje y para mostrarlos adecuadamente\n * @returns Un array con los años ordenado de mayor a menor.\n */\n function getYearsOrdered() {\n const yearsSet = new Set();\n data.forEach((element) => {\n yearsSet.add(element[1]);\n });\n const orderedYears = Array.from(yearsSet).sort((a, b) => a - b);\n\n return orderedYears;\n }\n\n // Opciones especificas\n const updateOptions = {\n color: [\n '#81B1CC',\n '#ABD9EA',\n '#C2EEF9',\n '#F9E2AF',\n '#F9C780',\n '#FDAE61',\n '#F46D43',\n '#FDAE61',\n '#F9E2AF',\n '#C2EEF9',\n '#ABD9EA',\n '#81B1CC',\n ],\n yAxis: {\n data: getYearsOrdered(),\n },\n };\n\n let finallyOptions = {};\n finallyOptions = updateObject(updateOptionsParam, updateOptions);\n\n // Opciones especificas sobre los datos\n const updateDataOptions = {\n itemStyle: {\n borderWidth: 2,\n borderColor: [\n '#448DAD',\n '#89CADB',\n '#A0DEE8',\n '#F4D28C',\n '#F4B569',\n '#F79646',\n '#F25930',\n '#F79646',\n '#F4D28C',\n '#A0DEE8',\n '#89CADB',\n '#448DAD',\n ],\n },\n };\n\n const finallyDataOptions =\n updateDataOptionsParam === null\n ? updateDataOptions\n : updateObject(updateDataOptionsParam, updateDataOptions);\n\n // Sustución del número de mes por el nombre\n const formatedData = data;\n formatedData.forEach((element, index) => {\n formatedData[index][0] = getMonth(element[0]);\n });\n\n initStackedBarChart(\n idChart,\n formatedData,\n finallyOptions,\n finallyDataOptions,\n );\n}\n","import { formatRoundTooltip, initChart } from \"./common-chart\";\nimport { updateObject } from '../data/common-data';\n\n/**\n * Configura el grafico de barras a partir de un conjunto inicial de datos.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} data Conjunto inicial de datos.\n * @param {Object} updateOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n */\n\nexport function initBarChart(idChart, updateOptions = undefined) {\n const defaultOptions = {\n title: {\n text: 'SIN TITULO',\n left: 'center',\n top: 'top',\n padding: 50,\n textStyle: {\n fontSize: 14,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n color: '#333',\n },\n },\n legend: {\n show: false,\n },\n grid: {\n top: '30%',\n bottom: '5%',\n left: '8%',\n right: '8%',\n },\n xAxis: {\n type: 'value',\n show: false,\n },\n yAxis: {\n show: false,\n type: 'category',\n },\n tooltip: {\n show: true,\n textStyle: {\n fontFamily: 'Montserrat',\n fontWeight: '600',\n },\n appendToBody: true,\n formatter: (params) => formatRoundTooltip(params, false)\n },\n series: [\n {\n type: 'bar',\n showBackground: true,\n },\n ],\n };\n\n let finallyOptions = {};\n if (updateOptions !== undefined) {\n finallyOptions = updateObject(defaultOptions, updateOptions);\n } else {\n finallyOptions = defaultOptions;\n }\n initChart(idChart, finallyOptions);\n}","export const DEFAULT_LANGUAGE = 'es_ES';\n\nexport const MONTHS_YEAR = {\n es_ES: new Map([\n ['1', 'Enero'],\n ['2', 'Febrero'],\n ['3', 'Marzo'],\n ['4', 'Abril'],\n ['5', 'Mayo'],\n ['6', 'Junio'],\n ['7', 'Julio'],\n ['8', 'Agosto'],\n ['9', 'Septiembre'],\n ['10', 'Octubre'],\n ['11', 'Noviembre'],\n ['12', 'Diciembre'],\n ]),\n ca_ES: new Map([\n ['1', 'Gener'],\n ['2', 'Febrer'],\n ['3', 'Març'],\n ['4', 'Abril'],\n ['5', 'Maig'],\n ['6', 'Juny'],\n ['7', 'Juliol'],\n ['8', 'Agost'],\n ['9', 'Setembre'],\n ['10', 'Octubre'],\n ['11', 'Novembre'],\n ['12', 'Desembre'],\n ]),\n};\n","import { initBarChart } from './bar-chart';\nimport { updateObject } from '../data/common-data';\nimport { getMonthList } from '../dates/common-date';\nimport { DEFAULT_LANGUAGE, MONTHS_YEAR } from '../language/common-language';\n\n/**\n * Devuelve el último año del conjunto de datos.\n * @param {array} dataArray Conjunto inicial de datos.\n * @returns último año\n */\nfunction getLastYear(dataArray) {\n return Math.max(...dataArray.map((element) => Number(element[0])));\n}\n\n/**\n * Devuelve el valor del último año del conjunto de datos.\n * @param {array} dataArray Conjunto inicial de datos.\n * @returns valor del último año\n */\nfunction getLastYearValues(dataArray) {\n const arrayUltimoAnyo = dataArray.filter(\n (arr) => Number(arr[0]) === getLastYear(dataArray),\n );\n const valoresUltimoAnyo = Array.from({ length: 12 }, () => 0);\n arrayUltimoAnyo.forEach(([anio, mes, valor]) => {\n const mesIndex = parseInt(mes, 10) - 1; // Restar 1 porque los meses comienzan desde 1\n valoresUltimoAnyo[mesIndex] = valor;\n });\n return valoresUltimoAnyo;\n}\n\n/**\n * Devuelve el valor del penúltimo año del conjunto de datos.\n * @param {array} dataArray Conjunto inicial de datos.\n * @returns valor del penúltimo año\n */\nfunction getPenultimateYearValues(dataArray) {\n const arrayPenultimoAnyo = dataArray.filter(\n (arr) => Number(arr[0]) === getLastYear(dataArray) - 1,\n );\n const valoresPenultimoAnyo = Array.from({ length: 12 }, () => 0);\n arrayPenultimoAnyo.forEach(([anio, mes, valor]) => {\n const mesIndex = parseInt(mes, 10) - 1; // Restar 1 porque los meses comienzan desde 1\n valoresPenultimoAnyo[mesIndex] = valor;\n });\n return valoresPenultimoAnyo;\n}\n\n/**\n * Configura el grafico de barras a partir de un conjunto inicial de datos. Creando una gráfica de barras que compara 2 años.\n * Establece unas opciones predefinidas que pueden ser modificadas proporcionando un objeto a traves de los parametros.\n * @param {text} idChart Nombre del chart en el que se creará el gráfico.\n * @param {array} data Conjunto inicial de datos.\n * @param {Object} specificOptions Objeto que contiene las opciones que se quieren cambiar de las establecidas por defecto.\n */\n\nexport function initBarChartComparationMonth(\n idChart,\n dataArray,\n specificOptions = undefined,\n) {\n const lastYearString = getLastYear(dataArray).toString();\n const penultimateYearString = (getLastYear(dataArray) - 1).toString();\n\n const defaultOptions = {\n title: {\n left: 'center',\n top: '-12%',\n textStyle: {\n fontSize: 15,\n fontFamily: 'Montserrat',\n },\n },\n legend: {\n top: '10%',\n show: true,\n data: [penultimateYearString, lastYearString],\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n grid: {\n bottom: '8%',\n top: '20%',\n right: '2%',\n },\n xAxis: [\n {\n type: 'category',\n data: getMonthList(MONTHS_YEAR, DEFAULT_LANGUAGE),\n axisLabel: {\n fontFamily: 'Montserrat',\n },\n },\n ],\n yAxis: [\n {\n type: 'value',\n axisLabel: {\n formatter: (value) => value.toLocaleString('es-ES'),\n fontFamily: 'Montserrat',\n },\n },\n ],\n series: [\n {\n name: penultimateYearString,\n type: 'bar',\n data: getPenultimateYearValues(dataArray),\n },\n {\n name: lastYearString,\n type: 'bar',\n barGap: 0,\n data: getLastYearValues(dataArray),\n },\n ],\n };\n\n const mergedOptions = updateObject(defaultOptions, specificOptions);\n initBarChart(idChart, mergedOptions);\n}\n","/**\r\n * Crear el Evento necesario para que al hacer click sobre una etiqueta HTML cargue la url de un iframe por primera vez.\r\n * @param {*} clickElementSelector Elemento HTML que provocara la carga del iframe al hacer click sobre el.\r\n * @param {*} iframeSelector Selector que indica donde esta el iframe al que se le va a cambiar el src.\r\n * @param {*} url URL que se va a cargar en el iframe.\r\n */\r\nexport function loadIframeOnClickEvent(\r\n clickElementSelector,\r\n iframeSelector,\r\n url,\r\n) {\r\n const iframe = document.querySelector(iframeSelector);\r\n const clickElement = document.querySelector(clickElementSelector);\r\n\r\n let loadingIframe = false;\r\n const loadIframeOnClick = () => {\r\n if (loadingIframe === false) {\r\n loadingIframe = true;\r\n iframe.setAttribute('src', 'about:blank');\r\n iframe.setAttribute('src', url);\r\n iframe.onload = () => {\r\n loadingIframe = false;\r\n };\r\n }\r\n };\r\n\r\n clickElement.addEventListener('click', loadIframeOnClick);\r\n clickElement.disabled = false;\r\n}\r\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","mesDescLarga","data","parseInt","toString","separateMonthYear","monthYear","substring","formatMonthAnyo","anyo","mes","formatDayMonthYear","date","dia","separateDayMonthYear","formatShortMonthYear","formatShortMonthShortYear","formatTrimestre","split","parseFloat","getMonthList","MONTHS_YEAR","DEFAULT_LANGUAGE","monthsMap","Array","from","values","map","monthName","slice","decimals","usrlang","navigator","language","userLanguage","length","toUpperCase","factorDigits","minimumFractionDigits","maximumFractionDigits","toLocaleString","formatToMillions","million","formatName","name","size","words","currentLine","result","forEach","word","initChart","chartId","option","chartElem","document","getElementById","console","error","myChart","echarts","init","setOption","window","addEventListener","undefined","resize","mainContent","printNoDataChart","idHide","idShow","hideElement","querySelector","showElement","hidden","style","background","printDataChart","formatTooltip","params","roundValues","serie","unidadMedida","nameLabel","item","roundedValues","Math","round","valuesLabel","color","seriesName","calculateXAxisStart","dataLength","calculateMaxYAxis","interval","maxValue","max","formatTooltipPie","percent","colorSpan","valueLabel","formatRoundTooltip","isPie","label","marker","formatMilMillionEuros","ONE_MILLION","castedValue","Number","getMaxGaugeValue","array","column","add","row","ceil","configureDataGaugeCommon","misDatosArray","objColData","colorsDataGauge","fontSize","paramOffsetCenterTitle","paramOffsetCenterDetail","paramOffsetLabel","paramCalculatedOffset","paramNumberOfElementsByLine","maxGaugeValue","calculatedOffset","colorsCopy","gaugeDataYears","offsetCenterTitle","offsetCenterDetail","offsetLabel","i","push","String","type","replace","shift","title","offsetCenter","fontFamily","detail","width","formatter","configureDataGaugeMonthCommon","idChart","monthNumber","index","valor","month","year","textBelowGraph","textIntoGraph","innerWidth","labelFormatterMonthlyDataGauge","configureMultipleSeries","datos","resultset","tipos","Set","valueAxisX","dataObj","tipo","fecha","dato","val","day","axisXArray","tiposArray","sort","a","b","toLowerCase","localeCompare","ignorePunctuation","arrayData","filter","arrayDataClean","find","d","configureDataLine","colors","series","symbol","symbolSize","smooth","configureDataBar","resultsetWithFields","metadata","resultsetWithFieldsResult","columnsWithFields","indice","colName","updateObject","original","modified","originalOut","keys","specificSeries","isArray","printDataInHTMLElements","dataConfig","indicador","id","entries","elementArray","className","element","format","textContent","getMaxFieldNumberFromData","fieldName","resultSet","fieldValue","isNaN","splitDataset","isMonth","splittedData","Cont","Mob","COL_ANYO","monthNamesEs","abbreviatedMonthNamesEs","dayNamesEs","abbreviatedDayNamesEs","dayNamesMinEs","selectFilterAll","selectedItems","this","dashboard","fireChange","parameter","isAll","arr","selectConfigDatasource","filterOrigen","filterParam","queryDatasourceLoad","queryDatasource","queryDefinition","dataAccessId","setParameter","resetFilter","Dashboards","getSelectCommonOptions","input","indexes","component","Root","strings","isDisabled","allItems","noItems","btnApply","btnCancel","Group","Strings","getSelectTwoColumnsOptions","idLabelOptions","resetFilterDates","paramameterResetIni","paramameterResetFin","paramameterLoadIni","paramameterLoadFin","valueIni","getParameterValue","valueFin","resetFilterDate","initValueDefaultDate","selectValueDefaultInFilter","filterComponent","parameterOrigin","paramDefault","paramFilter","convertToLanguageSelectorDateRange","datepicker","regional","es","monthNames","abbreviatedMonthNames","dayNames","abbreviatedDayNames","dayNamesMin","weekHeader","firstDay","isRTL","showMonthAfterYear","yearSuffix","setDefaults","initTable","tableId","table","Tabulator","formatNameHeaderColumn","cell","columnName","getValue","substr","formatCellMultiplesLines","lines","findChildren","action","treeExpand","treeCollapse","childRows","getTreeChildren","child","traverseRows","tbl","getRows","convertToTableTreeView","origen","nodeParent","listNameChildren","valueChildren","subArray","areaObj","_children","childObj","checkAllGroupsCollapsed","allCollapsed","getGroups","group","_group","visible","downloadCSVTable","nombreFichero","elementHTML","downloadCsvButton","newDownloadCsvButton","cloneNode","parentNode","replaceChild","download","delimiter","downloadPDFTable","newDownloadPdfButton","rowCalcStyles","fontStyle","autoTable","styles","buildTableCalidadAire","trArray","SO2_THRESHOLDS","NO2_THRESHOLDS","O3_THRESHOLDS","PM10_THRESHOLDS","PM25_THRESHOLDS","CSS_CLASS_THRESHOLD","createTdElement","idName","threshold","tdElement","createElement","setAttribute","innerHTML","cssClass","getCssClass","classList","estacion","operationalstatus","so2value","no2value","o3value","pm10value","pm25value","entityid","markupTrElement","markupTdElement","address","appendChild","calculatePentahoPath","route","location","documentURI","getEnvironment","currentUrl","href","env","includes","includeHTMLFileInElements","attrName","cllback","querySelectorAll","filePath","elementParam","cllbackOnContentLoaded","xhttp","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","send","includeHTMLFileInElement","getAttribute","initialCalls","changeTabTitle","changeNavTitle","bodyElement","remove","match","changeBodyClass","buildCamarasTrafico","paramIframeAccesosCiudad","paramIframeViasPrincipales","paramSectionContainer","paramDivCamaras","paramBlurButton","paramMillisBeforeBlur","firstAccess","blurModeActive","iframeAccesosCiudad","iframeViasPrincipales","refreshCamaras","Liferay","ThemeDisplay","getBCP47LanguageId","blurMode","active","sectionContainer","src","handlerIsVisibleIframe","iframe","IntersectionObserver","entry","isIntersecting","setTimeout","observe","userAgent","test","MSStream","isIOSDevice","display","sameMonthAllYearsFormatter","seriesData","sumsByYear","sum","initStackedBarChart","updateOptions","updateDataOptionsParam","updateDataOptions","anyos","borderColors","defaultOptions","text","left","top","textStyle","fontWeight","tooltip","axisPointer","trigger","position","point","dom","rect","halfTooltipHeight","contentSize","chartHeight","viewSize","pointY","bottom","right","legend","padding","grid","containLabel","xAxis","splitNumber","nameLocation","nameTextStyle","axisLabel","margin","splitLine","lineStyle","yAxis","defaultDataOptions","stack","show","itemStyle","emphasis","focus","borderColor","separatedData","reduce","accumulator","currentValue","splitData","categories","category","finallyDataOptions","calculateSeries","toolbox","feature","restore","saveAsImage","finallyOptions","initStackedBarChartMonthSeries","updateOptionsParam","yearsSet","getYearsOrdered","borderWidth","formatedData","initBarChart","appendToBody","showBackground","es_ES","Map","ca_ES","getLastYear","dataArray","getLastYearValues","arrayUltimoAnyo","valoresUltimoAnyo","anio","mesIndex","getPenultimateYearValues","arrayPenultimoAnyo","valoresPenultimoAnyo","initBarChartComparationMonth","specificOptions","lastYearString","penultimateYearString","barGap","loadIframeOnClickEvent","clickElementSelector","iframeSelector","url","clickElement","loadingIframe","onload","disabled"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vlci/vlcishared",
3
- "version": "38.0.0",
3
+ "version": "39.0.0",
4
4
  "description": "Proyecto JavaScript que contine funciones comunes a todos los Cdm`s y V.Minut",
5
5
  "main": "index.js",
6
6
  "scripts": {