@vlci/vlcishared 109.0.0 → 110.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.
package/dist/js/vlcishared.js
CHANGED
|
@@ -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,{MONTHS_YEAR:()=>r,MONTHS_YEAR_SHORT:()=>a,TEXTS_COMMON:()=>i,THRESHOLDS:()=>xt,addPointInteger:()=>b,buildCamarasTrafico:()=>Lt,buildTableCalidadAire:()=>Et,calculateMaxYAxis:()=>L,calculatePentahoPath:()=>Ct,calculateXAxisStart:()=>F,capitalizarTexto:()=>D,checkAllGroupsCollapsed:()=>St,configureDataBar:()=>R,configureDataGaugeCommon:()=>P,configureDataGaugeMonthCommon:()=>k,configureDataLine:()=>_,configureDataValidate:()=>Ht,configureLinesChartValidates:()=>Ut,convertDateToInteger:()=>g,convertToLanguageSelectorDateRange:()=>ct,convertToTableTreeView:()=>bt,downloadCSVTable:()=>Mt,downloadPDFTable:()=>vt,formatCellMultiplesLines:()=>ht,formatDayMonthYear:()=>u,formatMilMillionEuros:()=>O,formatMonthAnyo:()=>c,formatName:()=>A,formatNameHeaderColumn:()=>pt,formatRoundTooltip:()=>T,formatShortMonthShortYear:()=>f,formatShortMonthYear:()=>d,formatToMillions:()=>S,formatToTons:()=>M,formatTooltip:()=>$,formatTooltipPie:()=>N,formatTrimestre:()=>m,formatWithPrefix:()=>v,getEnvironment:()=>wt,getMaxFieldNumberFromData:()=>j,getMonth:()=>o,getMonthList:()=>p,getSelectCommonOptions:()=>ot,getSelectTwoColumnsOptions:()=>rt,initBarChart:()=>Pt,initBarChartComparationMonth:()=>Jt,initChart:()=>E,initContractAllGroups:()=>At,initElement:()=>x,initExpandAllGroups:()=>Dt,initStackedBarChart:()=>Ot,initStackedBarChartMonthSeries:()=>zt,initTable:()=>mt,initValueDefaultDate:()=>st,initialCalls:()=>Ft,loadIframeOnClickEvent:()=>Wt,printDataChart:()=>w,printDataInHTMLElements:()=>W,printEchart:()=>I,printNoDataChart:()=>C,resetFilter:()=>nt,resetFilterAndUpdate:()=>ft,resetFilterDate:()=>it,resetFilterDates:()=>at,resetFilterToDefault:()=>ut,resultsetWithFields:()=>q,selectConfigDatasource:()=>tt,selectConfigDatasourceAllValue:()=>et,selectFilterAll:()=>K,selectFilterNumItemsDefault:()=>dt,selectValueDefaultInFilter:()=>lt,separateDayMonthYearToSlash:()=>s,splitDataset:()=>V,subtractOneDay:()=>h,subtractOneMonth:()=>y,traverseRows:()=>gt,updateDomElement:()=>G,updateObject:()=>J,updateStackedBarOptions:()=>It});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)]}const r={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"]])},a={es_ES:new Map([["1","Ene"],["2","Feb"],["3","Mar"],["4","Abr"],["5","May"],["6","Jun"],["7","Jul"],["8","Ago"],["9","Sep"],["10","Oct"],["11","Nov"],["12","Dic"]]),ca_ES:new Map([["1","Gen"],["2","Feb"],["3","Mar"],["4","Abr"],["5","Mai"],["6","Jun"],["7","Jul"],["8","Ago"],["9","Set"],["10","Oct"],["11","Nov"],["12","Des"]])},i={es_ES:new Map([["last_update","Última actualización"]]),ca_ES:new Map([["last_update","Última actualització"]])};function s(t){return`${t.substring(6,8)}/${t.substring(4,6)}/${t.substring(0,4)}`}function l(t){return[t.substring(0,4),n[t.substring(4,6)]]}function c(t){const[e,n]=l(t);return`${n} ${e}`}function u(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 d(t){const[e,n]=l(t);return`${n.substring(0,3)} ${e}`}function f(t){const[e,n]=l(t);return`${n.substring(0,3)} '${e.substring(2,4)}`}function m(t){const[e,n]=t.split("-");return`${parseFloat(n)/3}T ${e}`}function p(t,e){const n=t[e];return Array.from(n.values()).map(t=>t.slice(0,3))}function h(t){const e=Math.floor(t/1e4),n=new Date(e,t%1e4/100-1,t%100);return n.setDate(n.getDate()-1),`${n.getFullYear()}${(n.getMonth()+1).toString().padStart(2,"0")}${n.getDate().toString().padStart(2,"0")}`}function y(t){let e;const n=new Date(Math.floor(t/100),t%100-1,0);return e=`${n.getFullYear()}${(n.getMonth()+1).toString().padStart(2,"0")}`,e}function g(t){return"string"==typeof t?parseInt(t.replace("-",""),10):t}function b(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 S(t){const e=1e6;return t>=e?t/e+"M":t.toString()}function M(t){return t>=1e3?t/1e3+" Tn":t.toString()}function v(t){let e,n;return t>=1e6?(e=t/1e6,n="G"):t>=1e3?(e=t/1e3,n="M"):(e=t,n="k"),{value:Math.round(100*e)/100,prefix:n}}function A(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 D(t){return t.includes("N/D")?t:t.toLowerCase().replace(/(^|\s|[.,;:!?¡¿(){}[\]])([^\s])/gu,(t,e,n)=>e+n[0].toUpperCase())}function x(t,e,n="MainContentLoadedCustom"){let o=document.getElementById(t);return o?Promise.resolve(e(o)):new Promise(r=>{document.body.addEventListener(n,()=>{o=document.getElementById(t),o?r(e(o)):(console.error(`El elemento con ID ${t} aún no está disponible después del evento.`),r(null))})})}function E(t,e){return x(t,t=>{const n=echarts.init(t);n.setOption(e,!0),window.addEventListener("resize",()=>{null!=n&&void 0!==n&&n.resize()});const o=document.getElementById("main-content");return o&&(o.addEventListener("shown.bs.collapse",()=>{n.resize()}),o.addEventListener("hidden.bs.collapse",()=>{n.resize()})),n})}function C(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 w(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 $(t,e=!1,n=!0,o=""){let r=`<p style="font-weight: 500;color: #565656;">${t[0].name}</p>`;return t.forEach(t=>{const a=e?Math.round(t.data):t.data,i=n?`<div style="font-weight: 400;color: #666;">${s=t.color,`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;font-weight: 500;background-color:${s}"></span>`} ${t.seriesName}: \n <span style="float: right; margin-left:20px;font-weight: 600;color: #565656;">\n ${t.data?`${b(a)} ${o}`:"-"}\n </span>\n </div>`:`<div>\n <span style="font-weight: 600;color: #565656;">${t.data?`${b(a)} ${o}`:"-"}\n </span>\n </div>`;var s;r+=i}),r}function F(t){return 100*(t-120)/t}function L(t,e){const n=Math.max(...t);return n+(e-n%e)}function N(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}%`:b(t.value);return`<div> ${n} ${t.name} <span style="float: right; margin-left:20px;font-weight: 600;color: #333;"> ${o} </span></div>`}function T(t,e){let n=`${t.name} : `;return n+=`<span style="font-weight:500">${b(Math.round(t.value))}</span>`,e&&(n+=`<span> (${t.percent}%)</span>`),t.marker+n}function O(t){const e=1e6,n=Number(t);return n>=0&&n<e?`${b(n)} €`:n>=e?`${b(n/e)} M €`:"-"}function I(t,e,n){return 0===t.length?(C(`#${e}`,`#${n}`),!1):(w(`#${n}`,`#${e}`),!0)}function z(t,e,n=1){const o=Math.max(...t.map(t=>t[e]))*n;return 5e3*Math.ceil(o/5e3)}function P(t,e,n,o=30,r=15,a=30,i=-70,s=70,l=3){const c=z(t,e.data,1.1),u=s,d=n.slice(),f=[];let m=r,p=a,h=i;for(let n=0;n<t.length;n+=1)f.push({value:t[n][e.data],name:A(String(t[n][e.type]).replace(/\[.*?\]/g,"")),color:d.shift(),title:{offsetCenter:[`${String(h)}%`,`${String(m)}%`],fontFamily:"Montserrat",fontSize:o},detail:{offsetCenter:[`${String(h)}%`,`${String(p)}%`],fontFamily:"Montserrat",width:"33%",formatter:t=>b(Math.round(t))}}),h+=u,(n+1)%l===0&&(p+=a,m+=2*r,h=i);return[c,f]}function k(t,e,n,r=0){return[z(e,n.data,1),t=>function(t,e,n){const r=b(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 B(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 _(t,e=[],n=!1){const[o,r,a]=B(t,n);return o.forEach(t=>{t.type="line",t.symbol="circle",t.symbolSize=6,t.smooth=.1,e.length>0&&(t.color=e.shift())}),[o,a,r]}function R(t,e,n=!1){const[o,r,a]=B(t,n);return o.forEach(t=>{t.type="bar",t.color=e.shift(),t.smooth=!1}),[o,a,r]}function q(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 J(t,e){const n={...t};return Object.keys(e).forEach(o=>{Object.prototype.hasOwnProperty.call(e,o)&&("series"===o&&Array.isArray(e[o])?n[o]=e[o].map((e,n)=>({...Array.isArray(t[o])&&t[o][n]||{},...e})):"object"!=typeof e[o]||null===e[o]||Array.isArray(e[o])?t[o]!==e[o]&&(n[o]=e[o]):n[o]=J(t[o]||{},e[o]))}),n}function W(t,e){const n=()=>{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]})})};try{n()}catch(t){document.body.addEventListener("MainContentLoadedCustom",()=>{n()})}}function j(t,e){const n=q(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 G(t,e){const n=document.querySelector(t);n?n.textContent=e:console.warn(`Elemento ${t} no encontrado en el DOM`)}function V(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 H=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],U=["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],Y=["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],X=["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],Z=["Do","Lu","Ma","Mi","Ju","Vi","Sá"];function K(t){const e=t.resultset.map(t=>t[0]);return this.dashboard.fireChange(this.parameter,e),t}function Q(t){for(const e of t)if(Array.isArray(e)){if(!Q(e))return!1}else if("All"!==e)return!1;return!0}function tt(t,e,n,o){return Q(e)?(t.queryDefinition.dataAccessId=n,t.dashboard.setParameter(t.parameter,["All"])):t.queryDefinition.dataAccessId=o,!0}function et(t){return t.dashboard.setParameter(t.parameter,["All"]),!0}function nt(t){t.forEach(t=>{Dashboards.fireChange(t,["All"])})}function ot(t="Todos"){return{input:{root:{id:"All"},indexes:{id:0,label:0}},component:{Root:{strings:{isDisabled:"No disponible",allItems:t,noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}},Group:{Strings:{allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}}}}}function rt(t="Todos"){const e=ot(t);return e.input.indexes.id=1,e.input.indexes.label=0,e}function at(t,e,n,o){const r=Dashboards.getParameterValue(n),a=Dashboards.getParameterValue(o);return Dashboards.fireChange(t,[r]),Dashboards.fireChange(e,[a]),!0}function it(t,e){const n=Dashboards.getParameterValue(e);return Dashboards.fireChange(t,[n]),!0}function st(t,e){Dashboards.fireChange(e,t.resultset[0][0])}function lt(t,e){const n=Dashboards.getParameterValue(e),o=t.parameter;""!==n&&t.dashboard.setParameter(o,[n])}function ct(t){t.regional.es={monthNames:H,abbreviatedMonthNames:U,dayNames:Y,abbreviatedDayNames:X,dayNamesMin:Z,weekHeader:"Sm",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},t.setDefaults(t.regional.es)}function ut(t,e){const n=Dashboards.getParameterValue(e);return Dashboards.fireChange(t,Array.isArray(n)?n:[n]),!0}function dt(t,e,n,o=0){const r=t.resultset.slice(0,n).map(t=>t[o]);return Dashboards.setParameter(e,r),t}function ft(t,e,n){const o=Array.isArray(e)?e:[e];Dashboards.fireChange(t,o);const r=Dashboards.getComponent(n);r&&r.update()}function mt(t,e){return x(t,t=>new Tabulator(t,e))}function pt(t,e){let n=t.getValue();return n.length>e&&(n=`${n.substr(0,e)}<br>${n.substr(e)}`),n}function ht(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 yt(t,e){"expand"===e?t.treeExpand():t.treeCollapse();const n=t.getTreeChildren();n.length>0&&n.forEach(t=>{t.getTreeChildren().length>0&&yt(t,e)})}function gt(t,e){t.getRows().forEach(t=>{t.getTreeChildren().length>0&&yt(t,e)})}function bt(t,e,n,o){const r=[];return Object.keys(t).forEach(a=>{if(Object.prototype.hasOwnProperty.call(t,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)}}),r}function St(t){let e=!0;return t.getGroups().forEach(t=>{t._group.visible&&(e=!1)}),e}function Mt(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:";",bom:!0})})}function vt(t,e,n){const o=document.getElementById(n),r=o.cloneNode(!0);o.parentNode.replaceChild(r,o),r.addEventListener("click",()=>{const n=t.getRows().map(t=>t.getData()),o=t.getColumns(),r={};o.forEach((t,e)=>{const o=t.getField();o&&n.every(t=>{const e=t[o];return null==e||/^-?\d+([.,]\d+)?$/.test(e.toString().trim())})&&(r[e]={halign:"right"})}),t.download("pdf",`${e}.pdf`,{title:e,rowCalcStyles:{fontSize:8,fontStyle:"bold"},autoTable:{styles:{fontSize:8,lineWidth:.1,lineColor:[200,200,200]},headStyles:{halign:"center"},columnStyles:r}})})}function At(t,e,n){const o=document.getElementById(n);o&&o.addEventListener("click",()=>{t.setGroupStartOpen(!1),t.setData(e)})}function Dt(t,e,n){const o=document.getElementById(n);o&&o.addEventListener("click",()=>{t.setGroupStartOpen(!0),t.setData(e)})}const xt={SO2:[100,200,350,500,750,751],NO2:[40,90,120,230,340,341],O3:[50,100,130,240,380,381],PM10:[20,40,50,100,150,151],PM25:[10,20,25,50,75,76]};function Et(t){const e=[],n={0:"b",1:"a",2:"d",3:"m",4:"mm",5:"em",6:"",7:"nd"};function o(t,e,o){const r=document.createElement("td");if(r.setAttribute("id",t),null!=e){r.innerHTML=e;const t=function(t,e){let o;return void 0===e?o=6:"ND"===e?o=7:(o=5,t.forEach((t,n)=>{e<=t&&5===o&&(o=n)})),n[o]}(o,e);r.classList.add(t)}return r}return t.forEach(t=>{const n=t;"noData"===n.operationalstatus&&(n.so2value="ND",n.no2value="ND",n.o3value="ND",n.pm10value="ND",n.pm25value="ND");const r=document.createElement("tr"),a=document.createElement("td");a.innerHTML=n.address,r.appendChild(a),r.appendChild(o(`${n.entityid}_so2`,n.so2value,xt.SO2)),r.appendChild(o(`${n.entityid}_no2`,n.no2value,xt.NO2)),r.appendChild(o(`${n.entityid}_o3`,n.o3value,xt.O3)),r.appendChild(o(`${n.entityid}_pm10`,n.pm10value,xt.PM10)),r.appendChild(o(`${n.entityid}_pm25`,n.pm25value,xt.PM25)),e.push(r)}),e}function Ct(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 wt(){const t=window.location.href;let e="";return e=t.includes("localhost")?"local":t.includes("sc_valencia_pre")?"PRE":"PRO",e}function $t(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 Ft(t){window.realDashboardsInit=Dashboards.init,Dashboards.init=function(){console.warn("Dashboards.init bloqueado temporalmente")},$t("include-html-cabecera",function(){!function(){const t=wt();"PRO"!==t&&(document.title+=` (${t})`)}(),function(){const t=wt();"PRO"!==t&&(document.querySelector("nav").querySelectorAll("span")[1].textContent+=` (${t})`)}()}),$t("include-html-menu"),$t("include-html-main-container",function(){document.body.dispatchEvent(new Event("MainContentLoadedCustom")),function(){const t=document.querySelector("body");t.classList.remove("inicio"),t.classList.add(document.documentURI.split("%3A")[4].match(/(.*?).wcdf/)[1])}(),t&&t()}),$t("include-html-copyright"),function(t="MainContentLoadedCustom"){document.body.addEventListener(t,()=>{try{Dashboards.init=window.realDashboardsInit,Dashboards.init()}catch(t){console.warn("No se pudo restaurar Dashboards.init; la función original no está disponible.")}},{once:!0})}()}function Lt(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 f=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"),f(l)),c&&(c.setAttribute("sandbox","allow-scripts"),f(c)),document.querySelector(r).addEventListener("click",()=>{d(!1),window.setTimeout(d,a)})):document.querySelectorAll(o)[0].style.display="none"}const Nt={grid:{containLabel:!0},title:{left:"center",top:"0",textStyle:{fontSize:15,fontFamily:"Montserrat",fontWeight:500,color:"#666"}},legend:{orient:"horizontal",bottom:"0",left:"center",width:"100%",textStyle:{fontSize:11,fontFamily:"Montserrat",fontWeight:400,color:"#666"}},toolbox:{show:!0,right:"0",top:"0",feature:{restore:{textStyle:{fontSize:6,fontFamily:"Montserrat",fontWeight:300}},saveAsImage:{textStyle:{fontSize:6,fontFamily:"Montserrat",fontWeight:300}}},emphasis:{iconStyle:{borderColor:"#ffcd00",textFill:"#666"}}},tooltip:{textStyle:{fontFamily:"Montserrat",fontSize:12}},xAxis:[{type:"category",axisLabel:{show:!0,interval:0,textStyle:{fontFamily:"Montserrat",fontSize:11}},data:[]}],yAxis:[{type:"value",alignTicks:!0,position:"right",axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400},formatter:t=>`${t}%`}},{type:"value",position:"left",axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400},formatter:t=>`${S(t)}€`}}]},Tt=(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}: <span style="float: right; margin-left:20px;font-weight: 600;">${b(r)}</span></div>`;return o};function Ot(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=>Tt(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=>b(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=>b(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){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?J(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?J(s,n):s,E(t,l)}function It(t){let e={};return e=J(Nt,t),e}function zt(t,e,n={},r={}){let a={};a=J(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:J(r,i),l=e;l.forEach((t,e)=>{l[e][0]=o(t[0])}),Ot(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=>T(t,!1)},series:[{type:"bar",showBackground:!0}]};let o={};o=void 0!==e?J(n,e):n,E(t,o)}const kt="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 _t(t){return Math.max(...t.map(t=>Number(t[0])))}function Rt(t){const e=t.filter(e=>Number(e[0])===_t(t)),n=Array.from({length:12},()=>0);return e.forEach(([t,e,o])=>{const r=parseInt(e,10)-1;n[r]=o}),n}function qt(t){const e=t.filter(e=>Number(e[0])===_t(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 Jt(t,e,n=void 0){const o=_t(e).toString(),r=(_t(e)-1).toString();Pt(t,J({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:p(Bt,kt),interval:0,margin:10,axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400}}}],yAxis:[{type:"value",axisLabel:{formatter:t=>t.toLocaleString("es-ES"),textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400}}}],series:[{name:r,type:"bar",data:qt(e)},{name:o,type:"bar",barGap:0,data:Rt(e)}]},n))}function Wt(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}const jt="id",Gt="fecha",Vt="value";function Ht(t,e,n,o,r="es_ES"){const[a,i]=function(t,e,n){const o=[],r=[];return t.forEach(t=>{e.includes(`${t[jt]}`)?o.push(`${t[Gt]}`):n.includes(`${t[jt]}`)&&r.push(`${t[Gt]}`)}),[o.map(t=>[t,0]),r.map(t=>[t,0])]}(t,n,o);let s="es_ES"==r?"Datos sin validar":"Dades sense validar";0===i.length&&(s="");const l={name:"Datos validados",type:"line",data:[...a,i[0]],lineStyle:{color:"#00A9A0",width:4},showSymbol:!1,tooltip:{show:!1}};let c="",u="";if(0===i.length){const e=t[t.length-1].fecha;c=e,u=e}else c=i[0][0],u=i[i.length-1][0];return[...e,l,{name:"Datos NO validados",type:"line",data:i,lineStyle:{color:"#80D4CF",width:4},showSymbol:!1,tooltip:{show:!1},markArea:{silent:!0,itemStyle:{opacity:.6,color:"#eee"},tooltip:{show:!1},label:{color:"#333",fontStyle:"normal",fontWeight:"400",fontFamily:"Montserrat",fontSize:11},data:[[{name:s,xAxis:c,yAxis:0},{name:"end",xAxis:u,yAxis:Math.max(...t.filter(t=>null!==t[Vt]).map(t=>parseInt(`${t[Vt]}`,10)))}]]}}]}function Ut(t,e,n=void 0){E(t,J({grid:{left:"2.5%",right:"5%",bottom:"70",top:"150",containLabel:!0},title:{left:"center",top:"top",textStyle:{fontSize:20,fontFamily:"Montserrat",fontWeight:600,color:"#666"}},legend:{type:"plain",top:"50",width:"98%",textStyle:{fontFamily:"Montserrat"}},tooltip:{trigger:"axis",show:!0,formatter:t=>$(t),textStyle:{fontFamily:"Montserrat"}},xAxis:{type:"category",boundaryGap:!1,splitLine:{show:!1},axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",color:"#666"}}},yAxis:{type:"value",nameLocation:"end",nameGap:"0",nameTextStyle:{fontFamily:"Montserrat",fontWeight:"500",padding:[-25,0,0,-48],margin:0,align:"left",verticalAlign:"top",width:"auto"},scale:!0,splitNumber:"6",axisLabel:{margin:10,textStyle:{fontSize:10,fontFamily:"Montserrat",color:"#666"}}},dataZoom:{end:100,borderColor:"#eee",fillerColor:"rgba(0,0,0,.05)",textStyle:{fontSize:10,fontFamily:"Montserrat",color:"#333",textBorderColor:"#fff",textBorderWidth:3,fontWeight:"600"},selectedDataBackground:{lineStyle:{color:"#333"},areaStyle:{color:"#ffcd00"}},dataBackground:{backgroundColor:"rgba(0,0,0,1)",lineStyle:{color:"#333"},areaStyle:{color:"rgba(0,0,0,0.5)"}},handleStyle:{color:"rgba(0,0,0,0.2)"},moveHandleStyle:{color:"rgba(0,0,0,0.3)"},emphasis:{handleStyle:{color:"rgba(255,205,0,1)"},moveHandleStyle:{color:"rgba(255,205,0,1)"}}},toolbox:{feature:{restore:{title:"Restablir"},saveAsImage:{title:"Desar"}},right:"1%",top:"0%"},series:e},n))}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,{MONTHS_YEAR:()=>a,MONTHS_YEAR_SHORT:()=>i,TEXTS_COMMON:()=>s,THRESHOLDS:()=>Ct,addPointInteger:()=>M,buildCamarasTrafico:()=>Tt,buildTableCalidadAire:()=>wt,calculateMaxYAxis:()=>T,calculatePentahoPath:()=>$t,calculateXAxisStart:()=>N,capitalizarTexto:()=>E,checkAllGroupsCollapsed:()=>vt,configureDataBar:()=>J,configureDataGaugeCommon:()=>B,configureDataGaugeMonthCommon:()=>_,configureDataLine:()=>q,configureDataValidate:()=>Ht,configureLinesChartValidates:()=>Ut,convertDateToInteger:()=>b,convertISODateToEUDate:()=>S,convertToLanguageSelectorDateRange:()=>dt,convertToTableTreeView:()=>Mt,downloadCSVTable:()=>At,downloadPDFTable:()=>Dt,formatCellMultiplesLines:()=>gt,formatDayMonthYear:()=>d,formatMilMillionEuros:()=>z,formatMonthAnyo:()=>u,formatName:()=>x,formatNameHeaderColumn:()=>yt,formatRoundTooltip:()=>I,formatShortMonthShortYear:()=>m,formatShortMonthYear:()=>f,formatToMillions:()=>v,formatToTons:()=>A,formatTooltip:()=>L,formatTooltipPie:()=>O,formatTrimestre:()=>p,formatWithPrefix:()=>D,getEnvironment:()=>Ft,getMaxFieldNumberFromData:()=>V,getMonth:()=>r,getMonthList:()=>h,getSelectCommonOptions:()=>at,getSelectTwoColumnsOptions:()=>it,initBarChart:()=>Bt,initBarChartComparationMonth:()=>Jt,initChart:()=>w,initContractAllGroups:()=>xt,initElement:()=>C,initExpandAllGroups:()=>Et,initStackedBarChart:()=>zt,initStackedBarChartMonthSeries:()=>kt,initTable:()=>ht,initValueDefaultDate:()=>ct,initialCalls:()=>Nt,loadIframeOnClickEvent:()=>Wt,printDataChart:()=>F,printDataInHTMLElements:()=>G,printEchart:()=>P,printNoDataChart:()=>$,resetFilter:()=>rt,resetFilterAndUpdate:()=>pt,resetFilterDate:()=>lt,resetFilterDates:()=>st,resetFilterToDefault:()=>ft,resultsetWithFields:()=>W,selectConfigDatasource:()=>nt,selectConfigDatasourceAllValue:()=>ot,selectFilterAll:()=>tt,selectFilterNumItemsDefault:()=>mt,selectValueDefaultInFilter:()=>ut,separateDayMonthYearToSlash:()=>l,splitDataset:()=>U,subtractOneDay:()=>y,subtractOneMonth:()=>g,traverseRows:()=>St,updateDomElement:()=>H,updateObject:()=>j,updateStackedBarOptions:()=>Pt});const n="es_ES",o=(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"]]),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"]]),{"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 r(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)]}const a={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"]])},i={es_ES:new Map([["1","Ene"],["2","Feb"],["3","Mar"],["4","Abr"],["5","May"],["6","Jun"],["7","Jul"],["8","Ago"],["9","Sep"],["10","Oct"],["11","Nov"],["12","Dic"]]),ca_ES:new Map([["1","Gen"],["2","Feb"],["3","Mar"],["4","Abr"],["5","Mai"],["6","Jun"],["7","Jul"],["8","Ago"],["9","Set"],["10","Oct"],["11","Nov"],["12","Des"]])},s={es_ES:new Map([["last_update","Última actualización"]]),ca_ES:new Map([["last_update","Última actualització"]])};function l(t){return`${t.substring(6,8)}/${t.substring(4,6)}/${t.substring(0,4)}`}function c(t){return[t.substring(0,4),o[t.substring(4,6)]]}function u(t){const[e,n]=c(t);return`${n} ${e}`}function d(t){const[e,n,r]=function(t){return[t.substring(0,4),o[t.substring(4,6)],t.substring(6,8)]}(t);return`${r} ${n} ${e}`}function f(t){const[e,n]=c(t);return`${n.substring(0,3)} ${e}`}function m(t){const[e,n]=c(t);return`${n.substring(0,3)} '${e.substring(2,4)}`}function p(t){const[e,n]=t.split("-");return`${parseFloat(n)/3}T ${e}`}function h(){const t=a[n];return Array.from(t.values()).map(t=>t.slice(0,3))}function y(t){const e=Math.floor(t/1e4),n=new Date(e,t%1e4/100-1,t%100);return n.setDate(n.getDate()-1),`${n.getFullYear()}${(n.getMonth()+1).toString().padStart(2,"0")}${n.getDate().toString().padStart(2,"0")}`}function g(t){const e=new Date(Math.floor(t/100),t%100-1,0);return`${e.getFullYear()}${(e.getMonth()+1).toString().padStart(2,"0")}`}function b(t){return"string"==typeof t?parseInt(t.replace("-",""),10):t}function S(t){if(!t||"string"!=typeof t)return"";const[e,n,o]=t.split("-");return`${o}/${n}/${e}`}function M(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 v(t){const e=1e6;return t>=e?t/e+"M":t.toString()}function A(t){return t>=1e3?t/1e3+" Tn":t.toString()}function D(t){let e,n;return t>=1e6?(e=t/1e6,n="G"):t>=1e3?(e=t/1e3,n="M"):(e=t,n="k"),{value:Math.round(100*e)/100,prefix:n}}function x(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 E(t){return t.includes("N/D")?t:t.toLowerCase().replace(/(^|\s|[.,;:!?¡¿(){}[\]])([^\s])/gu,(t,e,n)=>e+n[0].toUpperCase())}function C(t,e,n="MainContentLoadedCustom"){let o=document.getElementById(t);return o?Promise.resolve(e(o)):new Promise(r=>{document.body.addEventListener(n,()=>{o=document.getElementById(t),o?r(e(o)):(console.error(`El elemento con ID ${t} aún no está disponible después del evento.`),r(null))})})}function w(t,e){return C(t,t=>{const n=echarts.init(t);n.setOption(e,!0),window.addEventListener("resize",()=>{null!=n&&void 0!==n&&n.resize()});const o=document.getElementById("main-content");return o&&(o.addEventListener("shown.bs.collapse",()=>{n.resize()}),o.addEventListener("hidden.bs.collapse",()=>{n.resize()})),n})}function $(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 F(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 L(t,e=!1,n=!0,o=""){let r=`<p style="font-weight: 500;color: #565656;">${t[0].name}</p>`;return t.forEach(t=>{const a=e?Math.round(t.data):t.data,i=n?`<div style="font-weight: 400;color: #666;">${s=t.color,`<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;font-weight: 500;background-color:${s}"></span>`} ${t.seriesName}: \n <span style="float: right; margin-left:20px;font-weight: 600;color: #565656;">\n ${t.data?`${M(a)} ${o}`:"-"}\n </span>\n </div>`:`<div>\n <span style="font-weight: 600;color: #565656;">${t.data?`${M(a)} ${o}`:"-"}\n </span>\n </div>`;var s;r+=i}),r}function N(t){return 100*(t-120)/t}function T(t,e){const n=Math.max(...t);return n+(e-n%e)}function O(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}%`:M(t.value);return`<div> ${n} ${t.name} <span style="float: right; margin-left:20px;font-weight: 600;color: #333;"> ${o} </span></div>`}function I(t,e){let n=`${t.name} : `;return n+=`<span style="font-weight:500">${M(Math.round(t.value))}</span>`,e&&(n+=`<span> (${t.percent}%)</span>`),t.marker+n}function z(t){const e=1e6,n=Number(t);return n>=0&&n<e?`${M(n)} €`:n>=e?`${M(n/e)} M €`:"-"}function P(t,e,n){return 0===t.length?($(`#${e}`,`#${n}`),!1):(F(`#${n}`,`#${e}`),!0)}function k(t,e,n=1){const o=Math.max(...t.map(t=>t[e]))*n;return 5e3*Math.ceil(o/5e3)}function B(t,e,n,o=30,r=15,a=30,i=-70,s=70,l=3){const c=k(t,e.data,1.1),u=s,d=n.slice(),f=[];let m=r,p=a,h=i;for(let n=0;n<t.length;n+=1)f.push({value:t[n][e.data],name:x(String(t[n][e.type]).replace(/\[.*?\]/g,"")),color:d.shift(),title:{offsetCenter:[`${String(h)}%`,`${String(m)}%`],fontFamily:"Montserrat",fontSize:o},detail:{offsetCenter:[`${String(h)}%`,`${String(p)}%`],fontFamily:"Montserrat",width:"33%",formatter:t=>M(Math.round(t))}}),h+=u,(n+1)%l===0&&(p+=a,m+=2*r,h=i);return[c,f]}function _(t,e,n,o=0){return[k(e,n.data,1),t=>function(t,e,n){const o=M(Math.round(e)),a=r(t[n][0]),i=t[n][1],s=`\n${a} ${i} : ${o}`,l=`${o}\n${a} ${i}`;return window.innerWidth<=1710?s:l}(e,t,o),[{value:e[o][n.data]}]]}function R(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 q(t,e=[],n=!1){const[o,r,a]=R(t,n);return o.forEach(t=>{t.type="line",t.symbol="circle",t.symbolSize=6,t.smooth=.1,e.length>0&&(t.color=e.shift())}),[o,a,r]}function J(t,e,n=!1){const[o,r,a]=R(t,n);return o.forEach(t=>{t.type="bar",t.color=e.shift(),t.smooth=!1}),[o,a,r]}function W(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 j(t,e){const n={...t};return Object.keys(e).forEach(o=>{Object.prototype.hasOwnProperty.call(e,o)&&("series"===o&&Array.isArray(e[o])?n[o]=e[o].map((e,n)=>({...Array.isArray(t[o])&&t[o][n]||{},...e})):"object"!=typeof e[o]||null===e[o]||Array.isArray(e[o])?t[o]!==e[o]&&(n[o]=e[o]):n[o]=j(t[o]||{},e[o]))}),n}function G(t,e){const n=()=>{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]})})};try{n()}catch(t){document.body.addEventListener("MainContentLoadedCustom",()=>{n()})}}function V(t,e){const n=W(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 H(t,e){const n=document.querySelector(t);n?n.textContent=e:console.warn(`Elemento ${t} no encontrado en el DOM`)}function U(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 Y=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],X=["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],Z=["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],K=["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],Q=["Do","Lu","Ma","Mi","Ju","Vi","Sá"];function tt(t){const e=t.resultset.map(t=>t[0]);return this.dashboard.fireChange(this.parameter,e),t}function et(t){for(const e of t)if(Array.isArray(e)){if(!et(e))return!1}else if("All"!==e)return!1;return!0}function nt(t,e,n,o){return et(e)?(t.queryDefinition.dataAccessId=n,t.dashboard.setParameter(t.parameter,["All"])):t.queryDefinition.dataAccessId=o,!0}function ot(t){return t.dashboard.setParameter(t.parameter,["All"]),!0}function rt(t){t.forEach(t=>{Dashboards.fireChange(t,["All"])})}function at(t="Todos"){return{input:{root:{id:"All"},indexes:{id:0,label:0}},component:{Root:{strings:{isDisabled:"No disponible",allItems:t,noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}},Group:{Strings:{allItems:"Todos",noItems:"Ninguno",btnApply:"Aceptar",btnCancel:"Cancelar"}}}}}function it(t="Todos"){const e=at(t);return e.input.indexes.id=1,e.input.indexes.label=0,e}function st(t,e,n,o){const r=Dashboards.getParameterValue(n),a=Dashboards.getParameterValue(o);return Dashboards.fireChange(t,[r]),Dashboards.fireChange(e,[a]),!0}function lt(t,e){const n=Dashboards.getParameterValue(e);return Dashboards.fireChange(t,[n]),!0}function ct(t,e){Dashboards.fireChange(e,t.resultset[0][0])}function ut(t,e){const n=Dashboards.getParameterValue(e),o=t.parameter;""!==n&&t.dashboard.setParameter(o,[n])}function dt(t){t.regional.es={monthNames:Y,abbreviatedMonthNames:X,dayNames:Z,abbreviatedDayNames:K,dayNamesMin:Q,weekHeader:"Sm",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},t.setDefaults(t.regional.es)}function ft(t,e){const n=Dashboards.getParameterValue(e);return Dashboards.fireChange(t,Array.isArray(n)?n:[n]),!0}function mt(t,e,n,o=0){const r=t.resultset.slice(0,n).map(t=>t[o]);return Dashboards.setParameter(e,r),t}function pt(t,e,n){const o=Array.isArray(e)?e:[e];Dashboards.fireChange(t,o);const r=Dashboards.getComponent(n);r&&r.update()}function ht(t,e){return C(t,t=>new Tabulator(t,e))}function yt(t,e){let n=t.getValue();return n.length>e&&(n=`${n.substr(0,e)}<br>${n.substr(e)}`),n}function gt(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 bt(t,e){"expand"===e?t.treeExpand():t.treeCollapse();const n=t.getTreeChildren();n.length>0&&n.forEach(t=>{t.getTreeChildren().length>0&&bt(t,e)})}function St(t,e){t.getRows().forEach(t=>{t.getTreeChildren().length>0&&bt(t,e)})}function Mt(t,e,n,o){const r=[];return Object.keys(t).forEach(a=>{if(Object.prototype.hasOwnProperty.call(t,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)}}),r}function vt(t){let e=!0;return t.getGroups().forEach(t=>{t._group.visible&&(e=!1)}),e}function At(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:";",bom:!0})})}function Dt(t,e,n){const o=document.getElementById(n),r=o.cloneNode(!0);o.parentNode.replaceChild(r,o),r.addEventListener("click",()=>{const n=t.getRows().map(t=>t.getData()),o=t.getColumns(),r={};o.forEach((t,e)=>{const o=t.getField();o&&n.every(t=>{const e=t[o];return null==e||/^-?\d+([.,]\d+)?$/.test(e.toString().trim())})&&(r[e]={halign:"right"})}),t.download("pdf",`${e}.pdf`,{title:e,rowCalcStyles:{fontSize:8,fontStyle:"bold"},autoTable:{styles:{fontSize:8,lineWidth:.1,lineColor:[200,200,200]},headStyles:{halign:"center"},columnStyles:r}})})}function xt(t,e,n){const o=document.getElementById(n);o&&o.addEventListener("click",()=>{t.setGroupStartOpen(!1),t.setData(e)})}function Et(t,e,n){const o=document.getElementById(n);o&&o.addEventListener("click",()=>{t.setGroupStartOpen(!0),t.setData(e)})}const Ct={SO2:[100,200,350,500,750,751],NO2:[40,90,120,230,340,341],O3:[50,100,130,240,380,381],PM10:[20,40,50,100,150,151],PM25:[10,20,25,50,75,76]};function wt(t){const e=[],n={0:"b",1:"a",2:"d",3:"m",4:"mm",5:"em",6:"",7:"nd"};function o(t,e,o){const r=document.createElement("td");if(r.setAttribute("id",t),null!=e){r.innerHTML=e;const t=function(t,e){let o;return void 0===e?o=6:"ND"===e?o=7:(o=5,t.forEach((t,n)=>{e<=t&&5===o&&(o=n)})),n[o]}(o,e);r.classList.add(t)}return r}return t.forEach(t=>{const n=t;"noData"===n.operationalstatus&&(n.so2value="ND",n.no2value="ND",n.o3value="ND",n.pm10value="ND",n.pm25value="ND");const r=document.createElement("tr"),a=document.createElement("td");a.innerHTML=n.address,r.appendChild(a),r.appendChild(o(`${n.entityid}_so2`,n.so2value,Ct.SO2)),r.appendChild(o(`${n.entityid}_no2`,n.no2value,Ct.NO2)),r.appendChild(o(`${n.entityid}_o3`,n.o3value,Ct.O3)),r.appendChild(o(`${n.entityid}_pm10`,n.pm10value,Ct.PM10)),r.appendChild(o(`${n.entityid}_pm25`,n.pm25value,Ct.PM25)),e.push(r)}),e}function $t(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 Ft(){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 Nt(t){window.realDashboardsInit=Dashboards.init,Dashboards.init=function(){console.warn("Dashboards.init bloqueado temporalmente")},Lt("include-html-cabecera",function(){!function(){const t=Ft();"PRO"!==t&&(document.title+=` (${t})`)}(),function(){const t=Ft();"PRO"!==t&&(document.querySelector("nav").querySelectorAll("span")[1].textContent+=` (${t})`)}()}),Lt("include-html-menu"),Lt("include-html-main-container",function(){document.body.dispatchEvent(new Event("MainContentLoadedCustom")),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(t="MainContentLoadedCustom"){document.body.addEventListener(t,()=>{try{Dashboards.init=window.realDashboardsInit,Dashboards.init()}catch(t){console.warn("No se pudo restaurar Dashboards.init; la función original no está disponible.")}},{once:!0})}()}function Tt(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 f=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"),f(l)),c&&(c.setAttribute("sandbox","allow-scripts"),f(c)),document.querySelector(r).addEventListener("click",()=>{d(!1),window.setTimeout(d,a)})):document.querySelectorAll(o)[0].style.display="none"}const Ot={grid:{containLabel:!0},title:{left:"center",top:"0",textStyle:{fontSize:15,fontFamily:"Montserrat",fontWeight:500,color:"#666"}},legend:{orient:"horizontal",bottom:"0",left:"center",width:"100%",textStyle:{fontSize:11,fontFamily:"Montserrat",fontWeight:400,color:"#666"}},toolbox:{show:!0,right:"0",top:"0",feature:{restore:{textStyle:{fontSize:6,fontFamily:"Montserrat",fontWeight:300}},saveAsImage:{textStyle:{fontSize:6,fontFamily:"Montserrat",fontWeight:300}}},emphasis:{iconStyle:{borderColor:"#ffcd00",textFill:"#666"}}},tooltip:{textStyle:{fontFamily:"Montserrat",fontSize:12}},xAxis:[{type:"category",axisLabel:{show:!0,interval:0,textStyle:{fontFamily:"Montserrat",fontSize:11}},data:[]}],yAxis:[{type:"value",alignTicks:!0,position:"right",axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400},formatter:t=>`${t}%`}},{type:"value",position:"left",axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400},formatter:t=>`${v(t)}€`}}]},It=(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}: <span style="float: right; margin-left:20px;font-weight: 600;">${M(r)}</span></div>`;return o};function zt(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=>It(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=>M(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=>M(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){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?j(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?j(s,n):s,w(t,l)}function Pt(t){let e={};return e=j(Ot,t),e}function kt(t,e,n={},o={}){let a={};a=j(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===o?i:j(o,i),l=e;l.forEach((t,e)=>{l[e][0]=r(t[0])}),zt(t,l,a,s)}function Bt(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=>I(t,!1)},series:[{type:"bar",showBackground:!0}]};let o={};o=void 0!==e?j(n,e):n,w(t,o)}function _t(t){return Math.max(...t.map(t=>Number(t[0])))}function Rt(t){const e=t.filter(e=>Number(e[0])===_t(t)),n=Array.from({length:12},()=>0);return e.forEach(([t,e,o])=>{const r=parseInt(e,10)-1;n[r]=o}),n}function qt(t){const e=t.filter(e=>Number(e[0])===_t(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 Jt(t,e,n=void 0){const o=_t(e).toString(),r=(_t(e)-1).toString();Bt(t,j({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:h(),interval:0,margin:10,axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400}}}],yAxis:[{type:"value",axisLabel:{formatter:t=>t.toLocaleString("es-ES"),textStyle:{fontSize:10,fontFamily:"Montserrat",fontWeight:400}}}],series:[{name:r,type:"bar",data:qt(e)},{name:o,type:"bar",barGap:0,data:Rt(e)}]},n))}function Wt(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}const jt="id",Gt="fecha",Vt="value";function Ht(t,e,n,o,r="es_ES"){const[a,i]=function(t,e,n){const o=[],r=[];return t.forEach(t=>{e.includes(`${t[jt]}`)?o.push(`${t[Gt]}`):n.includes(`${t[jt]}`)&&r.push(`${t[Gt]}`)}),[o.map(t=>[t,0]),r.map(t=>[t,0])]}(t,n,o);let s="es_ES"==r?"Datos sin validar":"Dades sense validar";0===i.length&&(s="");const l={name:"Datos validados",type:"line",data:[...a,i[0]],lineStyle:{color:"#00A9A0",width:4},showSymbol:!1,tooltip:{show:!1}};let c="",u="";if(0===i.length){const e=t[t.length-1].fecha;c=e,u=e}else c=i[0][0],u=i[i.length-1][0];return[...e,l,{name:"Datos NO validados",type:"line",data:i,lineStyle:{color:"#80D4CF",width:4},showSymbol:!1,tooltip:{show:!1},markArea:{silent:!0,itemStyle:{opacity:.6,color:"#eee"},tooltip:{show:!1},label:{color:"#333",fontStyle:"normal",fontWeight:"400",fontFamily:"Montserrat",fontSize:11},data:[[{name:s,xAxis:c,yAxis:0},{name:"end",xAxis:u,yAxis:Math.max(...t.filter(t=>null!==t[Vt]).map(t=>parseInt(`${t[Vt]}`,10)))}]]}}]}function Ut(t,e,n=void 0){w(t,j({grid:{left:"2.5%",right:"5%",bottom:"70",top:"150",containLabel:!0},title:{left:"center",top:"top",textStyle:{fontSize:20,fontFamily:"Montserrat",fontWeight:600,color:"#666"}},legend:{type:"plain",top:"50",width:"98%",textStyle:{fontFamily:"Montserrat"}},tooltip:{trigger:"axis",show:!0,formatter:t=>L(t),textStyle:{fontFamily:"Montserrat"}},xAxis:{type:"category",boundaryGap:!1,splitLine:{show:!1},axisLabel:{textStyle:{fontSize:10,fontFamily:"Montserrat",color:"#666"}}},yAxis:{type:"value",nameLocation:"end",nameGap:"0",nameTextStyle:{fontFamily:"Montserrat",fontWeight:"500",padding:[-25,0,0,-48],margin:0,align:"left",verticalAlign:"top",width:"auto"},scale:!0,splitNumber:"6",axisLabel:{margin:10,textStyle:{fontSize:10,fontFamily:"Montserrat",color:"#666"}}},dataZoom:{end:100,borderColor:"#eee",fillerColor:"rgba(0,0,0,.05)",textStyle:{fontSize:10,fontFamily:"Montserrat",color:"#333",textBorderColor:"#fff",textBorderWidth:3,fontWeight:"600"},selectedDataBackground:{lineStyle:{color:"#333"},areaStyle:{color:"#ffcd00"}},dataBackground:{backgroundColor:"rgba(0,0,0,1)",lineStyle:{color:"#333"},areaStyle:{color:"rgba(0,0,0,0.5)"}},handleStyle:{color:"rgba(0,0,0,0.2)"},moveHandleStyle:{color:"rgba(0,0,0,0.3)"},emphasis:{handleStyle:{color:"rgba(255,205,0,1)"},moveHandleStyle:{color:"rgba(255,205,0,1)"}}},toolbox:{feature:{restore:{title:"Restablir"},saveAsImage:{title:"Desar"}},right:"1%",top:"0%"},series:e},n))}return e})());
|
|
2
2
|
//# sourceMappingURL=vlcishared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vlcishared.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAoB,WAAID,IAExBD,EAAiB,WAAIC,GACtB,CATD,CASGK,KAAM,I,mBCRT,IAAIC,EAAsB,CCA1BA,EAAwB,CAACL,EAASM,KACjC,IAAI,IAAIC,KAAOD,EACXD,EAAoBG,EAAEF,EAAYC,KAASF,EAAoBG,EAAER,EAASO,IAC5EE,OAAOC,eAAeV,EAASO,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EF,EAAwB,CAACQ,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFT,EAAyBL,IACH,oBAAXkB,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeV,EAASkB,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeV,EAAS,aAAc,CAAEoB,OAAO,M,mgECLvD,MAAMC,EAAe,CACnB,KAAM,QACN,KAAM,UACN,KAAM,QACN,KAAM,QACN,KAAM,OACN,KAAM,QACN,KAAM,QACN,KAAM,SACN,KAAM,aACN,GAAI,UACJ,GAAI,YACJ,GAAI,aAQC,SAAS,EAASC,GAevB,MAdkB,CAChB,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,GAAI,MACJ,GAAI,MACJ,GAAI,OAEWC,SAASD,EAAKE,WAAY,IAC7C,CAEO,MAAMC,EAAc,CACzBC,MAAO,IAAIC,IAAI,CACb,CAAC,IAAK,SACN,CAAC,IAAK,WACN,CAAC,IAAK,SACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,SACN,CAAC,IAAK,SACN,CAAC,IAAK,UACN,CAAC,IAAK,cACN,CAAC,KAAM,WACP,CAAC,KAAM,aACP,CAAC,KAAM,eAETC,MAAO,IAAID,IAAI,CACb,CAAC,IAAK,SACN,CAAC,IAAK,UACN,CAAC,IAAK,QACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,YACN,CAAC,KAAM,WACP,CAAC,KAAM,YACP,CAAC,KAAM,eAIEE,EAAoB,CAC/BH,MAAO,IAAIC,IAAI,CACb,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,KAAM,OACP,CAAC,KAAM,OACP,CAAC,KAAM,SAETC,MAAO,IAAID,IAAI,CACb,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,IAAK,OACN,CAAC,KAAM,OACP,CAAC,KAAM,OACP,CAAC,KAAM,UAIEG,EAAe,CAC1BJ,MAAO,IAAIC,IAAI,CAAC,CAAC,cAAe,0BAChCC,MAAO,IAAID,IAAI,CAAC,CAAC,cAAe,2BAQ3B,SAASI,EAA4BC,GAC1C,MAAO,GAAGA,EAAaC,UAAU,EAAG,MAAMD,EAAaC,UACrD,EACA,MACGD,EAAaC,UAAU,EAAG,IACjC,CAOA,SAASC,EAAkBC,GACzB,MAAO,CAACA,EAAUF,UAAU,EAAG,GAAIZ,EAAac,EAAUF,UAAU,EAAG,IACzE,CAoBO,SAASG,EAAgBd,GAC9B,MAAOe,EAAMC,GAAOJ,EAAkBZ,GACtC,MAAO,GAAGgB,KAAOD,GACnB,CAOO,SAASE,EAAmBC,GACjC,MAAOH,EAAMC,EAAKG,GAxBpB,SAA8BD,GAC5B,MAAO,CACLA,EAAKP,UAAU,EAAG,GAClBZ,EAAamB,EAAKP,UAAU,EAAG,IAC/BO,EAAKP,UAAU,EAAG,GAEtB,CAkB2BS,CAAqBF,GAC9C,MAAO,GAAGC,KAAOH,KAAOD,GAC1B,CAOO,SAASM,EAAqBrB,GACnC,MAAOe,EAAMC,GAAOJ,EAAkBZ,GACtC,MAAO,GAAGgB,EAAIL,UAAU,EAAG,MAAMI,GACnC,CAOO,SAASO,EAA0BtB,GACxC,MAAOe,EAAMC,GAAOJ,EAAkBZ,GACtC,MAAO,GAAGgB,EAAIL,UAAU,EAAG,OAAOI,EAAKJ,UAAU,EAAG,IACtD,CAOO,SAASY,EAAgBL,GAC9B,MAAOH,EAAMC,GAAOE,EAAKM,MAAM,KAC/B,MAAO,GAAGC,WAAWT,GAAO,MAAMD,GACpC,CAQO,SAASW,EAAavB,EAAawB,GACxC,MAAMC,EAAYzB,EAAYwB,GAI9B,OAHmBE,MAAMC,KAAKF,EAAUG,UAAUC,IAAKC,GACrDA,EAAUC,MAAM,EAAG,GAGvB,CAMO,SAASC,EAAehB,GAC7B,MAAMiB,EAAOC,KAAKC,MAAMnB,EAAM,KAGxBD,EAAO,IAAIqB,KAAKH,EAFPjB,EAAM,IAAS,IAAM,EACxBA,EAAM,KAGlB,OADAD,EAAKsB,QAAQtB,EAAKuB,UAAY,GACvB,GAAGvB,EAAKwB,iBAAiBxB,EAAKyB,WAAa,GAC/CzC,WACA0C,SAAS,EAAG,OAAO1B,EAAKuB,UAAUvC,WAAW0C,SAAS,EAAG,MAC9D,CAMO,SAASC,EAAiBC,GAC/B,IAAIC,EACJ,MAAM7B,EAAO,IAAIqB,KACfF,KAAKC,MAAMQ,EAAQ,KAClBA,EAAQ,IAAO,EAChB,GAKF,OAHAC,EAAgB,GAAG7B,EAAKwB,iBAAiBxB,EAAKyB,WAAa,GACxDzC,WACA0C,SAAS,EAAG,OACRG,CACT,CAOO,SAASC,EAAqB9B,GAGnC,MADkB,iBAATA,EAAoBjB,SAASiB,EAAK+B,QAAQ,IAAK,IAAK,IAAM/B,CAErE,CC/OO,SAAS,EAAgBpB,EAAOoD,EAAW,GAEhD,IAAIC,EAAUC,UAAUC,UAAYD,UAAUE,aAC9CH,EACEA,EAAQI,QAAU,EAAI,GAAGJ,KAAWA,EAAQK,gBAAkBL,EAChE,MAAMM,EAAe,CACnBC,sBAAuB,EACvBC,sBAAuBT,GAEzB,MAAmB,UAAZC,EACHrD,EAAM8D,eAAe,QAASH,GAC9B3D,EAAM8D,eAAeT,EAASM,EACpC,CAOO,SAASI,EAAiB/D,GAC/B,MAAMgE,EAAU,IAChB,OAAOhE,GAASgE,EAAahE,EAAQgE,EAAX,IAAwBhE,EAAMI,UAC1D,CAOO,SAAS6D,EAAajE,GAE3B,OAAOA,GADK,IACaA,EADb,IACU,MAAsBA,EAAMI,UACpD,CAEO,SAAS8D,EAAiBlE,GAC/B,IAAImE,EACAC,EAaJ,OAXIpE,GAAS,KACXmE,EAASnE,EAAQ,IACjBoE,EAAS,KACApE,GAAS,KAClBmE,EAASnE,EAAQ,IACjBoE,EAAS,MAETD,EAASnE,EACToE,EAAS,KAGJ,CACLpE,MAAOuC,KAAK8B,MAAe,IAATF,GAAgB,IAClCC,SAEJ,CCpDO,SAASE,EAAWC,EAAMC,EAAO,IACtC,GAAID,EAAKd,QAAUe,EAAM,CACvB,MAAMC,EAAQF,EAAK7C,MAAM,KACzB,IAAIgD,EAAc,GACdP,EAAS,GAUb,OATAM,EAAME,QAASC,IACT,GAAGF,KAAeE,IAAOnB,QAAUe,EACrCE,IAAgBA,EAAc,IAAM,IAAME,GAE1CT,GAAU,GAAGO,MACbA,EAAcE,KAGlBT,GAAUO,EACHP,CACT,CACA,OAAOI,CACT,CAEO,SAASM,EAAiBC,GAC/B,OAAIA,EAAKC,SAAS,OACTD,EAEFA,EACJE,cACA7B,QACC,oCACA,CAAC8B,EAAGC,EAAKC,IAASD,EAAMC,EAAK,GAAGzB,cAEtC,CCtBO,SAAS0B,EACdC,EACAC,EACAC,EAAY,2BAEZ,IAAIC,EAAUC,SAASC,eAAeL,GAEtC,OAAKG,EAgBEG,QAAQC,QAAQN,EAAaE,IAf3B,IAAIG,QAASC,IAClBH,SAASI,KAAKC,iBAAiBP,EAAW,KACxCC,EAAUC,SAASC,eAAeL,GAE9BG,EACFI,EAAQN,EAAaE,KAErBO,QAAQC,MACN,sBAAsBX,gDAExBO,EAAQ,UAMlB,CAEO,SAASK,EAAUC,EAASC,GA0BjC,OAAOf,EAAYc,EAzBME,IACvB,MAAMC,EAAUC,QAAQC,KAAKH,GAC7BC,EAAQG,UAAUL,GAAQ,GAG1BM,OAAOX,iBAAiB,SAAU,KACjB,MAAXO,QAA+BK,IAAZL,GACrBA,EAAQM,WAKZ,MAAMC,EAAcnB,SAASC,eAAe,gBAU5C,OATIkB,IACFA,EAAYd,iBAAiB,oBAAqB,KAChDO,EAAQM,WAEVC,EAAYd,iBAAiB,qBAAsB,KACjDO,EAAQM,YAILN,GAIX,CAEO,SAASQ,EAAiBC,EAAQC,GACvC,MACMC,EAAcF,EAASrB,SAASwB,cAAcH,GAAU,KACxDI,EAAcH,EAAStB,SAASwB,cAAcF,GAAU,KAE1DC,IACFA,EAAYG,QAAS,GAEnBD,IACFA,EAAYE,MAAMC,WARA,yDASlBH,EAAYC,QAAS,EAEzB,CAEO,SAASG,EAAeR,EAAQC,GACrC,MAAMC,EAAcF,EAASrB,SAASwB,cAAcH,GAAU,KACxDI,EAAcH,EAAStB,SAASwB,cAAcF,GAAU,KAE1DC,IACFA,EAAYG,QAAS,GAEnBD,IACFA,EAAYE,MAAMC,WAAa,UAC/BH,EAAYC,QAAS,EAEzB,CAUO,SAASI,EACdC,EACAC,GAAc,EACdC,GAAQ,EACRC,EAAe,IAIf,IAAIC,EAAY,+CAA+CJ,EAAO,GAAGjD,WAyBzE,OAxBAiD,EAAO7C,QAASkD,IACd,MAAMC,EAAgBL,EAAclF,KAAK8B,MAAMwD,EAAK3H,MAAQ2H,EAAK3H,KAC3D6H,EAAcL,EAChB,8CANaM,EAM2CH,EAAKG,MALjE,gIAAgIA,gBAM1HH,EAAKI,mHAIDJ,EAAK3H,KACD,GAAG,EAAgB4H,MAAkBH,IACrC,yCAIV,mEAEIE,EAAK3H,KACD,GAAG,EAAgB4H,MAAkBH,IACrC,yCArBI,IAACK,EAyBjBJ,GAAaG,IAERH,CACT,CAQO,SAASM,EAAoBC,GAClC,OAAQ,KAAOA,EAAa,KAAQA,CACtC,CASO,SAASC,EAAkBnG,EAAQoG,GACxC,MAAMC,EAAW/F,KAAKgG,OAAOtG,GAE7B,OAAOqG,GADqBD,EAAYC,EAAWD,EAErD,CAwBO,SAASG,EAAiBhB,EAAQiB,GAAU,GACjD,MAAMC,EAAY,+GAA+GlB,EAAOQ,iBAClIW,EAAaF,EACf,GAAGjB,EAAOiB,WACV,EAAgBjB,EAAOxH,OAI3B,MAFkB,SAAS0I,KAAalB,EAAOjD,oFAAoFoE,iBAGrI,CAEO,SAASC,EAAmBpB,EAAQqB,GACzC,IAAIC,EAAQ,GAAGtB,EAAOjD,UAOtB,OANAuE,GAAS,iCAAiC,EACxCvG,KAAK8B,MAAMmD,EAAOxH,iBAEhB6I,IACFC,GAAS,WAAWtB,EAAOiB,oBAEtBjB,EAAOuB,OAASD,CACzB,CAEO,SAASE,EAAsBhJ,GACpC,MAAMiJ,EAAc,IACdC,EAAcC,OAAOnJ,GAE3B,OAAIkJ,GAAe,GAAKA,EAAcD,EAC7B,GAAG,EAAgBC,OAGxBA,GAAeD,EACV,GAAG,EAAgBC,EAAcD,SAGnC,GACT,CAEO,SAASG,EAAYC,EAAWC,EAASC,GAC9C,OAAyB,IAArBF,EAAU5F,QACZoD,EAAiB,IAAIyC,IAAW,IAAIC,MAC7B,IAETjC,EAAe,IAAIiC,IAAY,IAAID,MAC5B,EACT,CCvNA,SAASE,EAAiBC,EAAOC,EAAQC,EAAM,GAC7C,MAAMpB,EAAMhG,KAAKgG,OAAOkB,EAAMvH,IAAK0H,GAAQA,EAAIF,KAAYC,EAC3D,OAA+B,IAAxBpH,KAAKsH,KAAKtB,EAAM,IACzB,CAqBO,SAASuB,EACdC,EACAC,EACAC,EACAC,EAAW,GACXC,EAAyB,GACzBC,EAA0B,GAC1BC,GAAmB,GACnBC,EAAwB,GACxBC,EAA8B,GAE9B,MAAMC,EAAgBhB,EAAiBO,EAAeC,EAAW9J,KAAM,KACjEuK,EAAmBH,EACnBI,EAAaT,EAAgB7H,QAC7BuI,EAAiB,GACvB,IAAIC,EAAoBT,EACpBU,EAAqBT,EACrBU,EAAcT,EAElB,IAAK,IAAIU,EAAI,EAAGA,EAAIhB,EAActG,OAAQsH,GAAK,EAC7CJ,EAAeK,KAAK,CAClBhL,MAAO+J,EAAcgB,GAAGf,EAAW9J,MACnCqE,KAAMD,EACJ2G,OAAOlB,EAAcgB,GAAGf,EAAWkB,OAAO/H,QAAQ,WAAY,KAGhE6E,MAAO0C,EAAWS,QAClBC,MAAO,CACLC,aAAc,CACZ,GAAGJ,OAAOH,MACV,GAAGG,OAAOL,OAEZU,WAAY,aACZpB,YAEFqB,OAAQ,CACNF,aAAc,CACZ,GAAGJ,OAAOH,MACV,GAAGG,OAAOJ,OAEZS,WAAY,aACZE,MAAO,MACPC,UAAYzL,GAAU,EAAgBuC,KAAK8B,MAAMrE,OAGrD8K,GAAeL,GACVM,EAAI,GAAKR,IAAgC,IAC5CM,GAAsBT,EACtBQ,GAA8C,EAAzBT,EACrBW,EAAcT,GAIlB,MAAO,CAACG,EAAeG,EACzB,CA6BO,SAASe,EACdpC,EACAS,EACAC,EACA2B,EAAc,GAUd,MAAO,CARenC,EAAiBO,EAAeC,EAAW9J,KAAM,GACxCF,GA3B1B,SAAwC+J,EAAe/J,EAAO4L,GACnE,MAAMC,EAAQ,EAAgBtJ,KAAK8B,MAAMrE,IACnCgD,EAAQ,EAAS+G,EAAc6B,GAAO,IACtCtJ,EAAOyH,EAAc6B,GAAO,GAC5BE,EAAiB,KAAK9I,KAASV,OAAUuJ,IACzCE,EAAgB,GAAGF,MAAU7I,KAASV,IAC5C,OAAOmE,OAAOuF,YAAc,KAAOF,EAAiBC,CACtD,CAqBIE,CAA+BlC,EAAe/J,EAAO2L,GAChC,CACrB,CACE3L,MAAO+J,EAAc4B,GAAa3B,EAAW9J,QAInD,CAQO,SAASgM,EAAwBC,EAAO9H,GAC7C,MAAM,UAAE+H,GAAc,CAAEA,UAAWD,GAC7BE,EAAQ,IAAIC,IACZC,EAAa,IAAID,IAEjBE,EAAUJ,EAAUlK,IAAI,EAAEuK,EAAMC,EAAOC,MAC3C,MAAMC,EAAMvI,EAAQ9B,KAAK8B,MAAMsI,GAAQA,EAGvC,OAFAN,EAAM1C,IAAI8C,GACVF,EAAW5C,IAAI+C,GACR,CAAEG,IAAKH,EAAOxB,KAAMuB,EAAMzM,MAAO4M,KAGpCE,EAAa/K,MAAMC,KAAKuK,EAAWtK,UACnC8K,EAAahL,MAAMC,KAAKqK,EAAMpK,UAuBpC,OArBA8K,EAAWC,KAAK,CAACC,EAAGC,IAClBD,EACGjI,cACAmI,cAAcD,EAAElI,cAAe,KAAM,CAAEoI,mBAAmB,KAkBxD,CAfQL,EAAW7K,IAAKuK,IAC7B,MAAMY,EAAYb,EACfc,OAAQ7N,GAAQA,EAAIyL,OAASuB,GAC7BvK,IAAI,EAAG2K,MAAK7M,WAAY,CAAC6M,EAAKJ,EAAMzM,IAEjCuN,EAAiBT,EAAW5K,IAAKwK,IACrC,MAAMjN,EAAM4N,EAAUG,KAAK,EAAEC,KAAOA,IAAMf,GAC1C,OAAOjN,EAAMA,EAAI,GAAK,OAExB,MAAO,CACL8E,KAAMkI,EACNvM,KAAMqN,KAIMR,EAAYR,EAC9B,CASO,SAASmB,EAAkBvB,EAAOwB,EAAS,GAAItJ,GAAQ,GAC5D,MAAOuJ,EAAQb,EAAYR,GAAcL,EACvCC,EACA9H,GAaF,OAVAuJ,EAAOjJ,QAAS+C,IACdA,EAAMwD,KAAO,OACbxD,EAAMmG,OAAS,SACfnG,EAAMoG,WAAa,EACnBpG,EAAMqG,OAAS,GACXJ,EAAOlK,OAAS,IAClBiE,EAAMM,MAAQ2F,EAAOxC,WAIlB,CAACyC,EAAQrB,EAAYQ,EAC9B,CASO,SAASiB,EAAiB7B,EAAOwB,EAAQtJ,GAAQ,GACtD,MAAOuJ,EAAQb,EAAYR,GAAcL,EACvCC,EACA9H,GASF,OANAuJ,EAAOjJ,QAAS+C,IACdA,EAAMwD,KAAO,MACbxD,EAAMM,MAAQ2F,EAAOxC,QACrBzD,EAAMqG,QAAS,IAGV,CAACH,EAAQrB,EAAYQ,EAC9B,CC7MO,SAASkB,EAAoB/N,GAClC,MAAM,UAAEkM,EAAS,SAAE8B,GAAahO,EAC1BiO,EAA4B,GASlC,OARA/B,EAAUzH,QAASiF,IACjB,MAAMwE,EAAoB,CAAC,EAC3BxE,EAAIjF,QAAQ,CAAC+E,EAAQ2E,KACnBD,EAAkBF,EAASG,GAAQC,SAAW5E,IAGhDyE,EAA0BnD,KAAKoD,KAE1BD,CACT,CA6BO,SAASI,EAAaC,EAAUC,GACrC,MAAMC,EAAc,IAAKF,GA2BzB,OAzBAnP,OAAOsP,KAAKF,GAAU9J,QAASxF,IAEzBE,OAAOM,UAAUC,eAAeC,KAAK4O,EAAUtP,KACrC,WAARA,GAAoB4C,MAAM6M,QAAQH,EAAStP,IAC7CuP,EAAYvP,GAAOsP,EAAStP,GAAK+C,IAAI,CAAC2M,EAAgBjD,KAI7C,IAHgB7J,MAAM6M,QAAQJ,EAASrP,KAC1CqP,EAASrP,GAAKyM,IACd,CAAC,KAC0BiD,KAKR,iBAAlBJ,EAAStP,IACE,OAAlBsP,EAAStP,IACR4C,MAAM6M,QAAQH,EAAStP,IAIfqP,EAASrP,KAASsP,EAAStP,KACpCuP,EAAYvP,GAAOsP,EAAStP,IAF5BuP,EAAYvP,GAAOoP,EAAaC,EAASrP,IAAQ,CAAC,EAAGsP,EAAStP,OAO7DuP,CACT,CA+BO,SAASI,EAAwB5O,EAAM6O,GAC5C,MAAMC,EAAiB,KACrB9O,EAAKyE,QAASsK,IACRA,EAAUC,MAAMH,GAClB1P,OAAO8P,QAAQJ,EAAWE,EAAUC,KAAKvK,QAASyK,IAChD,MAAMjQ,EAAMiQ,EAAa,GACnBpP,EAAQoP,EAAa,GACN,iBAAVpP,EACLA,EAAMqP,UACR5J,SAASwB,cAAcjH,EAAMqP,WAAWA,UACtCJ,EAAU9P,GACHa,EAAMwF,SAAWxF,EAAMsP,SAChC7J,SAASwB,cAAcjH,EAAMwF,SAAS+J,YAAcR,EAClDE,EAAUC,IACV/P,GAAKmQ,OAAOL,EAAU9P,KAG1BsG,SAASwB,cAAcjH,GAAOuP,YAAcN,EAAU9P,QAOhE,IACE6P,GACF,CAAE,MAAOQ,GAEP/J,SAASI,KAAKC,iBAAiB,0BAA2B,KACxDkJ,KAEJ,CACF,CAQO,SAASS,EAA0BvP,EAAMwP,GAC9C,MAAMrG,EAAY4E,EAAoB/N,GAChCuJ,EAAQ,GACd,IAAIlB,EAAM,KAWV,OAVAc,EAAU1E,QAASa,IACjB,MAAMmK,EAAanK,EAAQkK,GACD,iBAAfC,GAA4BxG,OAAOyG,MAAMD,IAClDlG,EAAMuB,KAAK2E,KAIXlG,EAAMhG,OAAS,IACjB8E,EAAMhG,KAAKgG,OAAOkB,IAEblB,CACT,CAQO,SAASsH,EAAiBC,EAAU9P,GACzC,MAAM+P,EAAatK,SAASwB,cAAc6I,GACtCC,EACFA,EAAWR,YAAcvP,EAEzB+F,QAAQiK,KAAK,YAAYF,4BAE7B,CClMO,SAASG,EAAalG,EAAemG,GAAU,GACpD,MAAMC,EAAe,CAAEC,KAAM,GAAIC,IAAK,IAyBtC,OAhBAtG,EAAcpF,QAASwH,IAHN,+BAIXA,EATW,IAMI,UAGiBA,EARrB,KAST+D,EACFC,EAAaC,KAAKpF,KAAK,CAACmB,EARd,GAQ8BA,EAP7B,GAO8CA,EAT9C,KAWXgE,EAAaC,KAAKpF,KAAK,CAACmB,EAAMmE,GAAenE,EAXlC,MAKK,WAShBA,EAfW,KAgBT+D,EACFC,EAAaE,IAAIrF,KAAK,CAACmB,EAfb,GAe6BA,EAd5B,GAc6CA,EAhB7C,KAkBXgE,EAAaE,IAAIrF,KAAK,CAACmB,EAAMmE,GAAenE,EAlBjC,QAsBVgE,CACT,CC3BA,MAAMI,EAAe,CACnB,QACA,UACA,QACA,QACA,OACA,QACA,QACA,SACA,aACA,UACA,YACA,aAGIC,EAA0B,CAC9B,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEIC,EAAa,CACjB,UACA,QACA,SACA,YACA,SACA,UACA,UAGIC,EAAwB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACnEC,EAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAOpD,SAASC,EAAgB1Q,GAC9B,MAAM2Q,EAAgB3Q,EAAKkM,UAAUlK,IAAK2F,GAASA,EAAK,IAExD,OADAiJ,KAAKC,UAAUC,WAAWF,KAAKG,UAAWJ,GACnC3Q,CACT,CAOA,SAASgR,EAAMC,GAEb,IAAK,MAAM3L,KAAW2L,EACpB,GAAIpP,MAAM6M,QAAQpJ,IAChB,IAAK0L,EAAM1L,GACT,OAAO,OAEJ,GAAgB,QAAZA,EACT,OAAO,EAGX,OAAO,CACT,CAYO,SAAS4L,GACdC,EACAC,EACAC,EACAC,GAWA,OARIN,EAAMI,IAERD,EAAaI,gBAAgBC,aAAeH,EAC5CF,EAAaN,UAAUY,aAAaN,EAAaJ,UAAW,CAAC,SAG7DI,EAAaI,gBAAgBC,aAAeF,GAEvC,CACT,CAOO,SAASI,GAA+BP,GAE7C,OADAA,EAAaN,UAAUY,aAAaN,EAAaJ,UAAW,CAAC,SACtD,CACT,CAMO,SAASY,GAAYP,GAC1BA,EAAY3M,QAASa,IACnBsM,WAAWd,WAAWxL,EAAS,CAAC,SAEpC,CAOO,SAASuM,GAAuBxN,EAAO,SAC5C,MAAO,CACLyN,MAAO,CACLtT,KAAM,CACJwQ,GAAI,OAEN+C,QAAS,CACP/C,GAAI,EACJpG,MAAO,IAGXoJ,UAAW,CACTC,KAAM,CACJC,QAAS,CACPC,WAAY,gBACZC,SAAU/N,EACVgO,QAAS,UACTC,SAAU,UACVC,UAAW,aAGfC,MAAO,CACLC,QAAS,CACPL,SAAU,QACVC,QAAS,UACTC,SAAU,UACVC,UAAW,cAKrB,CAQO,SAASG,GAA2BrO,EAAO,SAChD,MAAMsO,EAAiBd,GAAuBxN,GAG9C,OAFAsO,EAAeb,MAAMC,QAAQ/C,GAAK,EAClC2D,EAAeb,MAAMC,QAAQnJ,MAAQ,EAC9B+J,CACT,CAUO,SAASC,GACdC,EACAC,EACAC,EACAC,GAEA,MAAMC,EAAWrB,WAAWsB,kBAAkBH,GACxCI,EAAWvB,WAAWsB,kBAAkBF,GAI9C,OAHApB,WAAWd,WAAW+B,EAAqB,CAACI,IAC5CrB,WAAWd,WAAWgC,EAAqB,CAACK,KAErC,CACT,CAMO,SAASC,GAAgBP,EAAqBE,GACnD,MAAME,EAAWrB,WAAWsB,kBAAkBH,GAE9C,OADAnB,WAAWd,WAAW+B,EAAqB,CAACI,KACrC,CACT,CAOO,SAASI,GAAqBrT,EAAMoR,GACzCQ,WAAWd,WAAWM,EAAapR,EAAKkM,UAAU,GAAG,GACvD,CAOO,SAASoH,GAA2BC,EAAiBC,GAC1D,MAAMC,EAAe7B,WAAWsB,kBAAkBM,GAC5CE,EAAcH,EAAgBxC,UACf,KAAjB0C,GACFF,EAAgB1C,UAAUY,aAAaiC,EAAa,CAACD,GACzD,CAMO,SAASE,GAAmCC,GAEjDA,EAAWC,SAASC,GAAK,CACvBC,WAAY1D,EACZ2D,sBAAuB1D,EACvB2D,SAAU1D,EACV2D,oBAAqB1D,EACrB2D,YAAa1D,EACb2D,WAAY,KACZC,SAAU,EACVC,OAAO,EACPC,oBAAoB,EACpBC,WAAY,IAEdZ,EAAWa,YAAYb,EAAWC,SAASC,GAC7C,CAQO,SAASY,GAAqBC,EAAgBC,GACnD,MAAMC,EAAejD,WAAWsB,kBAAkB0B,GAKlD,OAJAhD,WAAWd,WACT6D,EACA9S,MAAM6M,QAAQmG,GAAgBA,EAAe,CAACA,KAEzC,CACT,CAUO,SAASC,GACd9U,EACA0T,EACAqB,EACAC,EAAa,GAEb,MAEMC,EAFQjV,EAAKkM,UAGhBhK,MAAM,EAAG6S,GACT/S,IAAK2F,GAASA,EAAKqN,IAItB,OAFApD,WAAWH,aAAaiC,EAAauB,GAE9BjV,CACT,CAQO,SAASkV,GAAqBC,EAAWrV,EAAOsV,GACrD,MAAMC,EAAaxT,MAAM6M,QAAQ5O,GAASA,EAAQ,CAACA,GAEnD8R,WAAWd,WAAWqE,EAAWE,GAEjC,MAAMrD,EAAYJ,WAAW0D,aAAaF,GACtCpD,GACFA,EAAUuD,QAEd,CCpSO,SAASC,GAAUC,EAASxP,GAGjC,OAAOf,EAAYuQ,EAFMC,GAAU,IAAIC,UAAUD,EAAOzP,GAG1D,CAQO,SAAS2P,GAAuBC,EAAMvR,GAC3C,IAAIwR,EAAaD,EAAKE,WAItB,OAHID,EAAWvS,OAASe,IACtBwR,EAAa,GAAGA,EAAWE,OAAO,EAAG1R,SAAYwR,EAAWE,OAAO1R,MAE9DwR,CACT,CAQO,SAASG,GAAyBJ,EAAMvR,GAC7C,MACMC,EADasR,EAAKE,WACCvU,MAAM,KAC/B,IAAI0U,EAAQ,GACR1R,EAAc,GAYlB,OAVAD,EAAME,QAASC,KACRF,EAAcE,GAAMnB,QAAUe,EACjCE,GAAe,GAAGE,MAElBwR,GAAS,GAAG1R,QACZA,EAAc,GAAGE,QAGrBwR,GAAS,GAAG1R,QAEL0R,CACT,CAOA,SAASC,GAAazM,EAAK0M,GACV,WAAXA,EACF1M,EAAI2M,aAEJ3M,EAAI4M,eAGN,MAAMC,EAAY7M,EAAI8M,kBAElBD,EAAUhT,OAAS,GACrBgT,EAAU9R,QAASgS,IACbA,EAAMD,kBAAkBjT,OAAS,GACnC4S,GAAaM,EAAOL,IAI5B,CAOO,SAASM,GAAaC,EAAKP,GAChBO,EAAIC,UACZnS,QAASiF,IACXA,EAAI8M,kBAAkBjT,OAAS,GACjC4S,GAAazM,EAAK0M,IAGxB,CASO,SAASS,GACdC,EACAC,EACAC,EACAC,GAEA,MAAM3K,EAAU,GA6BhB,OA3BAnN,OAAOsP,KAAKqI,GAAQrS,QAASxF,IAC3B,GAAIE,OAAOM,UAAUC,eAAeC,KAAKmX,EAAQ7X,GAAM,CACrD,MAAMiY,EAAWJ,EAAO7X,GAElBkY,EAAU,CACd,CAACJ,GAAaG,EAAS,GAEvBE,UAAW,IAGbF,EAASjM,QAETiM,EAASzS,QAAQ,CAACkH,EAAOD,KACvB,MAAM2L,EAAW,CACf,CAACN,GAAaC,EAAiBtL,GAC/B,CAACuL,GAAgBtL,GAInBwL,EAAQC,UAAUtM,KAAKuM,KAGzB/K,EAAQxB,KAAKqM,EACf,IAIK7K,CACT,CAMO,SAASgL,GAAwB5B,GACtC,IAAI6B,GAAe,EAQnB,OAPe7B,EAAM8B,YACd/S,QAASgT,IAEVA,EAAMC,OAAOC,UACfJ,GAAe,KAGZA,CACT,CASO,SAASK,GAAiBlC,EAAOmC,EAAeC,GACrD,MAGMC,EAAoBxS,SAASC,eAAesS,GAE5CE,EAAuBD,EAAkBE,WAAU,GACzDF,EAAkBG,WAAWC,aAC3BH,EACAD,GAGFC,EAAqBpS,iBAAiB,QAXT,KAC3B8P,EAAM0C,SAAS,MAAO,GAAGP,QAAqB,CAAEQ,UAAW,IAAKC,KAAK,KAWzE,CASO,SAASC,GAAiB7C,EAAOmC,EAAeC,GACrD,MA0CMC,EAAoBxS,SAASC,eAAesS,GAC5CU,EAAuBT,EAAkBE,WAAU,GACzDF,EAAkBG,WAAWC,aAAaK,EAAsBT,GAEhES,EAAqB5S,iBAAiB,QA9CT,KAC3B,MAAM6S,EAAQ/C,EAAMkB,UAAU5U,IAAK0H,GAAQA,EAAIgP,WACzCC,EAAWjD,EAAMkD,aAEjBC,EAAe,CAAC,EAEtBF,EAASlU,QAAQ,CAACqU,EAAKpN,KACrB,MAAMqN,EAAQD,EAAIE,WACbD,GAEcN,EAAMQ,MAAOC,IAC9B,MAAMvN,EAAQuN,EAAKH,GACnB,OAAOpN,SAAyC,oBAAoBwN,KAAKxN,EAAMzL,WAAWkZ,YAI1FP,EAAanN,GAAS,CACpB2N,OAAQ,YAKd3D,EAAM0C,SAAS,MAAO,GAAGP,QAAqB,CAC5C3M,MAAO2M,EACPyB,cAAe,CACbtP,SAAU,EACVuP,UAAW,QAEbC,UAAW,CACTC,OAAQ,CACNzP,SAAU,EACV0P,UAAW,GACXC,UAAW,CAAC,IAAK,IAAK,MAExBC,WAAY,CACVP,OAAQ,UAEVR,mBAUR,CASO,SAASgB,GAAsBnE,EAAO1V,EAAMmF,GACjD,MAAM2U,EAASvU,SAASC,eAAeL,GACnC2U,GACFA,EAAOlU,iBAAiB,QAAS,KAC/B8P,EAAMqE,mBAAkB,GACxBrE,EAAMsE,QAAQha,IAGpB,CAOO,SAASia,GAAoBvE,EAAO1V,EAAMmF,GAC/C,MAAM2U,EAASvU,SAASC,eAAeL,GACnC2U,GACFA,EAAOlU,iBAAiB,QAAS,KAC/B8P,EAAMqE,mBAAkB,GACxBrE,EAAMsE,QAAQha,IAGpB,CCpQO,MAAMka,GAAa,CACxBC,IAAK,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,KAC/BC,IAAK,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,KAC7BC,GAAI,CAAC,GAAI,IAAK,IAAK,IAAK,IAAK,KAC7BC,KAAM,CAAC,GAAI,GAAI,GAAI,IAAK,IAAK,KAC7BC,KAAM,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,KCHtB,SAASC,GAAsBtO,GACpC,MAAMuO,EAAU,GACVC,EAAsB,CAC1B,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,KACH,EAAG,KACH,EAAG,GACH,EAAG,MAkCL,SAASC,EAAgBC,EAAQ9a,EAAO+a,GACtC,MAAMC,EAAYvV,SAASwV,cAAc,MAEzC,GADAD,EAAUE,aAAa,KAAMJ,GACzB9a,QAAuC,CACzCgb,EAAUG,UAAYnb,EACtB,MAAMob,EA7BV,SAAqB3R,EAAOzJ,GAC1B,IAAI+a,EAaJ,YAZcrU,IAAV1G,EACF+a,EAAY,EACO,OAAV/a,EACT+a,EAAY,GAEZA,EAAY,EACZtR,EAAM9E,QAAQ,CAACa,EAASoG,KAClB5L,GAASwF,GAAyB,IAAduV,IACtBA,EAAYnP,MAIXgP,EAAoBG,EAC7B,CAcqBM,CAAYN,EAAW/a,GACxCgb,EAAUM,UAAU3R,IAAIyR,EAC1B,CACA,OAAOJ,CACT,CAyDA,OAvDA5O,EAAUzH,QAASiF,IACjB,MAAM2R,EAAW3R,EAEkB,WAA/B2R,EAASC,oBACXD,EAASE,SAAW,KACpBF,EAASG,SAAW,KACpBH,EAASI,QAAU,KACnBJ,EAASK,UAAY,KACrBL,EAASM,UAAY,MAIvB,MAAMC,EAAkBrW,SAASwV,cAAc,MACzCc,EAAkBtW,SAASwV,cAAc,MAC/Cc,EAAgBZ,UAAYI,EAASS,QACrCF,EAAgBG,YAAYF,GAE5BD,EAAgBG,YACdpB,EACE,GAAGU,EAASW,eACZX,EAASE,SACTrB,GAAWC,MAGfyB,EAAgBG,YACdpB,EACE,GAAGU,EAASW,eACZX,EAASG,SACTtB,GAAWE,MAGfwB,EAAgBG,YACdpB,EACE,GAAGU,EAASW,cACZX,EAASI,QACTvB,GAAWG,KAGfuB,EAAgBG,YACdpB,EACE,GAAGU,EAASW,gBACZX,EAASK,UACTxB,GAAWI,OAGfsB,EAAgBG,YACdpB,EACE,GAAGU,EAASW,gBACZX,EAASM,UACTzB,GAAWK,OAGfE,EAAQ3P,KAAK8Q,KAGRnB,CACT,CC5GO,SAASwB,GAAqBC,GACnC3W,SAAS4W,SAAW,GAAG5W,SAAS6W,YAAY5a,MAAM,OAAO,QACvD+D,SAAS6W,YAAY5a,MAAM,OAAO,QAC9B+D,SAAS6W,YAAY5a,MAAM,OAAO,QACtC+D,SAAS6W,YAAY5a,MAAM,OAAO,QAC9B0a,GACR,CAoBO,SAASG,KACd,MAAMC,EAAa/V,OAAO4V,SAASI,KACnC,IAAIC,EAAM,GAQV,OANEA,EADEF,EAAWzX,SAAS,aAChB,QACGyX,EAAWzX,SAAS,mBACvB,MAEA,MAED2X,CACT,CCGO,SAASC,GAA0BC,EAAUC,GACjCpX,SAASqX,iBAAiB,IAAIF,MACtCjY,QAASa,KAlCpB,SACEuX,EACAC,EACAC,GAEA,MAAMzX,EAAUwX,EAChB,GAAID,EAAU,CACZ,MAAMG,EAAQ,IAAIC,eAClBD,EAAME,mBAAqB,WACD,IAApBtM,KAAKuM,aACa,MAAhBvM,KAAKwM,SACP9X,EAAQ2V,UAAYrK,KAAKyM,aACrBN,GACFA,KAGgB,MAAhBnM,KAAKwM,SACP9X,EAAQ2V,UAAY,yCAG1B,EACA+B,EAAMM,KAAK,MAAOT,GAAU,GAC5BG,EAAMO,MACR,CACF,CAYIC,CADiBlY,EAAQmY,aAAaf,GACHpX,EAASqX,IAEhD,CAUO,SAASe,GAAaf,GAC3BpW,OAAOoX,mBAAqB/L,WAAWvL,KAGvCuL,WAAWvL,KAAO,WAChBR,QAAQiK,KAAK,0CACf,EAeA2M,GAA0B,wBAb1B,YDzBK,WACL,MAAMD,EAAMH,KACA,QAARG,IACFjX,SAAS2F,OAAS,KAAKsR,KAE3B,CCqBIoB,GDnBG,WACL,MAAMpB,EAAMH,KACA,QAARG,IACFjX,SAASwB,cAAc,OAAO6V,iBAAiB,QAAQ,GAAGvN,aAAe,QAAQmN,KAErF,CCeIqB,EACF,GAWApB,GAA0B,qBAC1BA,GAA0B,8BAV1B,WACElX,SAASI,KAAKmY,cAAc,IAAIC,MAAM,4BCtEnC,WACL,MAAMC,EAAczY,SAASwB,cAAc,QAC3CiX,EAAY5C,UAAU6C,OAAO,UAC7BD,EAAY5C,UAAU3R,IFWflE,SAAS6W,YAAY5a,MAAM,OAAO,GAAG0c,MAD7B,cAC2C,GEV5D,CDmEIC,GACIxB,GACFA,GAEJ,GAKAF,GAA0B,0BEhFrB,SACLpX,EAAY,2BAEZE,SAASI,KAAKC,iBACZP,EACA,KACE,IACEuM,WAAWvL,KAAOE,OAAOoX,mBACzB/L,WAAWvL,MACb,CAAE,MAAO+X,GACPvY,QAAQiK,KACN,gFAEJ,GAEF,CAAEuO,MAAM,GAEZ,CFgEEC,EACF,CGrFO,SAASC,GACdC,EACAC,EACAC,EACAC,EACAC,EACAC,GAYA,IAAIC,GAAc,EACdC,GAAiB,EAErB,MAAMC,EAAsBzZ,SAASwB,cAAcyX,GAC7CS,EAAwB1Z,SAASwB,cACrC0X,GAMIS,EAAiB,KAEA,oBAAZC,SAdc,UAgBrBA,QAAQC,aAAaC,sBAEjBL,GACFA,EAAoBhE,aAAa,MA3BrC,uEA6BMiE,GACFA,EAAsBjE,aACpB,MA7BN,gEAkCMgE,GACFA,EAAoBhE,aAAa,MAjCrC,uEAmCMiE,GACFA,EAAsBjE,aACpB,MAnCN,gEAkEF,SAASsE,EAASC,GAAS,GACzB,MAAMC,EAAmBja,SAASwB,cAAc2X,GAC5Ca,GAtBAP,IACFA,EAAoBS,IAAM,eAExBR,IACFA,EAAsBQ,IAAM,eAoB5BD,EAAiBpE,UAAU3R,IAAI,QAC/BsV,GAAiB,IAEjBS,EAAiBpE,UAAU6C,OAAO,QAClCiB,IACAH,GAAiB,EAErB,CASA,MAAMW,EAA0BC,IACP,IAAIC,qBAAsB3Q,IAC/CA,EAAQxK,QAASob,IACXA,EAAMC,iBACHf,GACHG,IAGGJ,IACHA,GAAc,EACdvY,OAAOwZ,WAAWT,EAAUT,SAKrBmB,QAAQL,KJ5FpB,WACL,MAAM,UAAEM,GAAc7c,UACtB,MAAO,6BAA6B+V,KAAK8G,KAAe1Z,OAAO2Z,QACjE,CI6FSC,IACCnB,IACFA,EAAoBhE,aAAa,UAAW,iBAC5C0E,EAAuBV,IAErBC,IACFA,EAAsBjE,aAAa,UAAW,iBAC9C0E,EAAuBT,IAEzB1Z,SAASwB,cAAc6X,GAAiBhZ,iBAAiB,QAAS,KAChE0Z,GAAS,GACT/Y,OAAOwZ,WAAWT,EAAUT,MA1DbtZ,SAASqX,iBAAiB+B,GAAiB,GACnDzX,MAAMkZ,QAAU,MAgE/B,CCpIO,MAAMC,GAA0B,CACrCC,KAAM,CACJC,cAAc,GAEhBrV,MAAO,CACLsV,KAAM,SACNC,IAAK,IACLC,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,IACZ7Y,MAAO,SAGX8Y,OAAQ,CACNC,OAAQ,aACRC,OAAQ,IACRN,KAAM,SACNlV,MAAO,OACPoV,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,IACZ7Y,MAAO,SAGXiZ,QAAS,CACPC,MAAM,EACNC,MAAO,IACPR,IAAK,IACLS,QAAS,CACPC,QAAS,CACPT,UAAW,CACT1W,SAAU,EACVoB,WAAY,aACZuV,WAAY,MAGhBS,YAAa,CACXV,UAAW,CACT1W,SAAU,EACVoB,WAAY,aACZuV,WAAY,OAIlBU,SAAU,CACRC,UAAW,CACTC,YAAa,UACbC,SAAU,UAIhBC,QAAS,CACPf,UAAW,CACTtV,WAAY,aACZpB,SAAU,KAGd0X,MAAO,CACL,CACE1W,KAAM,WACN2W,UAAW,CACTX,MAAM,EACN7Y,SAAU,EACVuY,UAAW,CACTtV,WAAY,aACZpB,SAAU,KAGdhK,KAAM,KAGV4hB,MAAO,CACL,CACE5W,KAAM,QACN6W,YAAY,EACZC,SAAU,QACVH,UAAW,CACTjB,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,KAEdpV,UAAYzL,GAAU,GAAGA,OAG7B,CACEkL,KAAM,QACN8W,SAAU,OACVH,UAAW,CACTjB,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,KAEdpV,UAAYzL,GAAU,GAAG+D,EAAiB/D,UC3F5CiiB,GAA6B,CAACza,EAAQ0a,KAC1CA,EAAWlV,KAAK,CAACC,EAAGC,IAAM/M,SAAS8M,EAAEhM,MAAQd,SAAS+M,EAAEjM,OAExD,MAAMkhB,EAAa,CAAC,EAGpBD,EAAWvd,QAASob,IAClB,MAAMzd,EAAOyd,EAAM,GACb/c,EAAQ+c,EAAM,GAEhB/c,IAAUwE,EAAOS,YAAeka,EAAW7f,KAC7C6f,EAAW7f,GAAQ,GAGjBU,IAAUwE,EAAOS,aACnBka,EAAW7f,IAASyd,EAAM,MAI9B,IAAInY,EAAY,MAAMJ,EAAOS,iBAE7B,IAAK,MAAO3F,EAAM8f,KAAQ/iB,OAAO8P,QAAQgT,GACvCva,GAAa,QACXJ,EAAOuB,UACLzG,qEAAwE,EAC1E8f,kBAIJ,OAAOxa,GAUF,SAASya,GACd/Y,EACApJ,EACAoiB,OAAgB5b,EAChB6b,OAAyB7b,GAEzB,MAAM8b,EACuB,OAA3BD,OAAkC7b,EAAY6b,EAC1CE,EAAQ,IAAInW,IAAIpM,EAAKgC,IAAKkV,GAAaA,EAAS,KACtD,IAAIsL,EAKJ,MA2EMC,EAAiB,CACrBvX,MAAO,CACLtG,KAAM,aACN4b,KAAM,SACNC,IAAK,MACLC,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,IACZ7Y,MAAO,SAGX2Z,QAAS,CACPiB,YAAa,CACX1X,KAAM,UAER2X,QAAS,OACTpX,UAAYjE,GAAWya,GAA2Bza,EAAQtH,GAC1D0gB,UAAW,CACTtV,WAAY,cAEd,QAAA0W,CAASc,EAAOtb,EAAQub,EAAKC,EAAMxe,GACjC,MAAMwd,EAAW,CAAC,EAGZiB,EADgBze,EAAK0e,YAAY,GACG,EACpCC,EAAc3e,EAAK4e,SAAS,GAC5BC,EAASP,EAAM,GAgBrB,OAdIO,EAASJ,EACXjB,EAASrB,IAAM,GACN0C,EAASJ,EAAoBE,EACtCnB,EAAShB,OAAS,GAElBgB,EAASrB,IAAM0C,EAASJ,EAGtBH,EAAM,GAAKte,EAAK4e,SAAS,GAAK,EAChCpB,EAAStB,KAAOoC,EAAM,GAAK,GAE3Bd,EAASb,MAAQ3c,EAAK4e,SAAS,GAAKN,EAAM,GAAK,GAG1Cd,CACT,GAEFlB,OAAQ,CACNwC,QAAS,GACT1C,UAAW,CACTtV,WAAY,eAGhBkV,KAAM,CACJE,KAAM,KACNS,MAAO,KACPH,OAAQ,KACRP,cAAc,GAEhBmB,MAAO,CACL1W,KAAM,QACNqY,YAAa,GACbhf,KAAM,aACNif,aAAc,QACdC,cAAe,CACb5C,WAAY,OACZvV,WAAY,aACZtD,MAAO,OACPsb,SAAU,IAEZzB,UAAW,CACT6B,OAAQ,EACR9C,UAAW,CACTtV,WAAY,cAEdG,UAAYzL,GAAU,EAAgBA,IAExC2jB,UAAW,CACTC,UAAW,CACT5b,MAAO,UAIb8Z,MAAO,CACL5W,KAAM,WACNhL,KAAM6B,MAAMC,KAAKygB,GACjBZ,UAAW,CACTjB,UAAW,CACTtV,WAAY,gBAIlBsC,OAvJsB,MACtB,MAAMiW,EAAqB,CACzBtf,KAAM,aACN2G,KAAM,MACN4Y,MAAO,QACPhb,MAAO,CACLoY,MAAM,EACN5V,WAAY,aACZpB,SAAU,GACVuB,UAAYjE,GAAW,EAAgBjF,KAAK8B,MAAMmD,EAAOxH,SAE3D+jB,eAAWrd,EACX6a,SAAU,CACRyC,MAAO,UAET9jB,UAAMwG,GA5BN8b,GACAA,EAAkBuB,WAClBhiB,MAAM6M,QAAQ4T,EAAkBuB,UAAUtC,eAE1CiB,EAAe,IAAIF,EAAkBuB,UAAUtC,oBACxCe,EAAkBuB,UAAUtC,aA4BrC,MAAMwC,EZ/FH,SAAmB/jB,GACxB,OAAOA,EAAKgkB,OAAO,CAACC,EAAaC,KAC/B,MAAMjlB,EAAMilB,EY6F0B,GZxFtC,OAJKD,EAAYhlB,KACfglB,EAAYhlB,GAAO,IAErBglB,EAAYhlB,GAAK6L,KAAKoZ,GACfD,GACN,CAAC,EACN,CYsF0BE,CAAUnkB,GAC1BokB,EAAajlB,OAAOsP,KAAKsV,GAC/BxB,EAAM9d,QAAS1D,IACbqjB,EAAW3f,QAAS4f,SAIH7d,IAHAud,EAAcM,GAAU/W,KACpC4J,GAAaA,EAAS,KAAOnW,KAG9BgjB,EAAcM,GAAUvZ,KAAK,CAC3BiZ,EAAcM,GAAU,GAAG,GAC3BtjB,OACAyF,IAEFud,EAAcM,GAAUvX,YAI9B,MAAMY,EAAS,GAqBf,OApBAvO,OAAOsP,KAAKsV,GAAetf,QAAS4f,IAC9B7B,IACFmB,EAAmBE,UAAY,CAAEtC,YAAaiB,EAAavX,UAE7D0Y,EAAmBtf,KAAOggB,EAE1BV,EAAmB3jB,KAAO+jB,EAAcM,GAAUriB,IAC/CkV,GAAaA,EAAS,IAEzB,IAAIoN,EAAqB,CAAC,EAExBA,OADwB9d,IAAtB8b,EACmBjU,EACnBsV,EACArB,GAGmBqB,EAEvBjW,EAAO5C,KAAK,IAAKwZ,MAEZ5W,GA6FC6W,GACRxD,QAAS,CACPC,MAAM,EACNE,QAAS,CACPC,QAAS,CAAEjW,MAAO,aAClBkW,YAAa,CAAElW,MAAO,UAExB+V,MAAO,KAIX,IAAIuD,EAAiB,CAAC,EAEpBA,OADoBhe,IAAlB4b,EACe/T,EAAaoU,EAAgBL,GAE7BK,EAEnB1c,EAAUqD,EAASob,EACrB,CAEO,SAASC,GAAwBC,GACtC,IAAIC,EAAkB,CAAC,EAEvB,OADAA,EAAkBtW,EAAagS,GAAyBqE,GACjDC,CACT,CAWO,SAASC,GACdxb,EACApJ,EACA6kB,EAAqB,CAAC,EACtBxC,EAAyB,CAAC,GAqC1B,IAAImC,EAAiB,CAAC,EACtBA,EAAiBnW,EAAawW,EArBR,CACpB/c,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEF8Z,MAAO,CACL5hB,KA3BJ,WACE,MAAM8kB,EAAW,IAAI1Y,IAMrB,OALApM,EAAKyE,QAASa,IACZwf,EAASrb,IAAInE,EAAQ,MAEFzD,MAAMC,KAAKgjB,GAAUhY,KAAK,CAACC,EAAGC,IAAMD,EAAIC,EAG/D,CAmBU+X,MAQV,MAAMzC,EAAoB,CACxBuB,UAAW,CACTmB,YAAa,EACbzD,YAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,aAKA+C,EACuB,OAA3BjC,EACIC,EACAjU,EAAagU,EAAwBC,GAGrC2C,EAAejlB,EACrBilB,EAAaxgB,QAAQ,CAACa,EAASoG,KAC7BuZ,EAAavZ,GAAO,GAAK,EAASpG,EAAQ,MAG5C6c,GACE/Y,EACA6b,EACAT,EACAF,EAEJ,CClVO,SAASY,GAAa9b,EAASgZ,OAAgB5b,GACpD,MAAMic,EAAiB,CACrBvX,MAAO,CACLtG,KAAM,aACN4b,KAAM,SACNC,IAAK,MACL2C,QAAS,GACT1C,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,IACZ7Y,MAAO,SAGX8Y,OAAQ,CACNI,MAAM,GAERV,KAAM,CACJG,IAAK,MACLK,OAAQ,KACRN,KAAM,KACNS,MAAO,MAETS,MAAO,CACL1W,KAAM,QACNgW,MAAM,GAERY,MAAO,CACLZ,MAAM,EACNhW,KAAM,YAERyW,QAAS,CACPT,MAAM,EACNN,UAAW,CACTtV,WAAY,aACZuV,WAAY,OAEdwE,cAAc,EACd5Z,UAAYjE,GAAWoB,EAAmBpB,GAAQ,IAEpDoG,OAAQ,CACN,CACE1C,KAAM,MACNoa,gBAAgB,KAKtB,IAAIZ,EAAiB,CAAC,EAEpBA,OADoBhe,IAAlB4b,EACe/T,EAAaoU,EAAgBL,GAE7BK,EAEnB1c,EAAUqD,EAASob,EACrB,CClEO,MAAM7iB,GAAmB,QAEnB,GAAc,CACzBvB,MAAO,IAAIC,IAAI,CACb,CAAC,IAAK,SACN,CAAC,IAAK,WACN,CAAC,IAAK,SACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,SACN,CAAC,IAAK,SACN,CAAC,IAAK,UACN,CAAC,IAAK,cACN,CAAC,KAAM,WACP,CAAC,KAAM,aACP,CAAC,KAAM,eAETC,MAAO,IAAID,IAAI,CACb,CAAC,IAAK,SACN,CAAC,IAAK,UACN,CAAC,IAAK,QACN,CAAC,IAAK,SACN,CAAC,IAAK,QACN,CAAC,IAAK,QACN,CAAC,IAAK,UACN,CAAC,IAAK,SACN,CAAC,IAAK,YACN,CAAC,KAAM,WACP,CAAC,KAAM,YACP,CAAC,KAAM,eCnBX,SAASglB,GAAYC,GACnB,OAAOjjB,KAAKgG,OAAOid,EAAUtjB,IAAKsD,GAAY2D,OAAO3D,EAAQ,KAC/D,CAOA,SAASigB,GAAkBD,GACzB,MAAME,EAAkBF,EAAUlY,OAC/B6D,GAAQhI,OAAOgI,EAAI,MAAQoU,GAAYC,IAEpCG,EAAoB5jB,MAAMC,KAAK,CAAEyB,OAAQ,IAAM,IAAM,GAK3D,OAJAiiB,EAAgB/gB,QAAQ,EAAEihB,EAAM1kB,EAAK2K,MACnC,MAAMga,EAAW1lB,SAASe,EAAK,IAAM,EACrCykB,EAAkBE,GAAYha,IAEzB8Z,CACT,CAOA,SAASG,GAAyBN,GAChC,MAAMO,EAAqBP,EAAUlY,OAClC6D,GAAQhI,OAAOgI,EAAI,MAAQoU,GAAYC,GAAa,GAEjDQ,EAAuBjkB,MAAMC,KAAK,CAAEyB,OAAQ,IAAM,IAAM,GAK9D,OAJAsiB,EAAmBphB,QAAQ,EAAEihB,EAAM1kB,EAAK2K,MACtC,MAAMga,EAAW1lB,SAASe,EAAK,IAAM,EACrC8kB,EAAqBH,GAAYha,IAE5Bma,CACT,CAUO,SAASC,GACd3c,EACAkc,EACAZ,OAAkBle,GAElB,MAAMwf,EAAiBX,GAAYC,GAAWplB,WACxC+lB,GAAyBZ,GAAYC,GAAa,GAAGplB,WAoE3DglB,GAAa9b,EADSiF,EAjEC,CACrBnD,MAAO,CACLsV,KAAM,SACNC,IAAK,OACLC,UAAW,CACT1W,SAAU,GACVoB,WAAY,eAGhBwV,OAAQ,CACNH,IAAK,MACLO,MAAM,EACNhhB,KAAM,CAACimB,EAAuBD,GAC9BtF,UAAW,CACTtV,WAAY,eAGhBkV,KAAM,CACJQ,OAAQ,KACRL,IAAK,MACLQ,MAAO,MAETS,MAAO,CACL,CACE1W,KAAM,WACNhL,KAAM0B,EAAa,GAAaC,IAChCwG,SAAU,EACVqb,OAAQ,GACR7B,UAAW,CACTjB,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,QAKpBiB,MAAO,CACL,CACE5W,KAAM,QACN2W,UAAW,CACTpW,UAAYzL,GAAUA,EAAM8D,eAAe,SAC3C8c,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,QAKpBjT,OAAQ,CACN,CACErJ,KAAM4hB,EACNjb,KAAM,MACNhL,KAAM4lB,GAAyBN,IAEjC,CACEjhB,KAAM2hB,EACNhb,KAAM,MACNkb,OAAQ,EACRlmB,KAAMulB,GAAkBD,MAKqBZ,GAErD,CC7HO,SAASyB,GACdC,EACAC,EACAC,GAEA,MAAM3G,EAASpa,SAASwB,cAAcsf,GAChCE,EAAehhB,SAASwB,cAAcqf,GAE5C,IAAII,GAAgB,EAYpBD,EAAa3gB,iBAAiB,QAXJ,MACF,IAAlB4gB,IACFA,GAAgB,EAChB7G,EAAO3E,aAAa,MAAO,eAC3B2E,EAAO3E,aAAa,MAAOsL,GAC3B3G,EAAO8G,OAAS,KACdD,GAAgB,MAMtBD,EAAaG,UAAW,CAC1B,CCzBA,MAAMC,GAAY,KACZC,GAAc,QACdC,GAAe,QAwCd,SAASC,GACdC,EACAC,EACAC,EACAC,EACA7jB,EAAS,SAET,MAAO8jB,EAAoBC,GArCtB,SACLL,EACAE,EACAC,GAGA,MAAMC,EAAqB,GACrBC,EAAuB,GAS7B,OAPAL,EAAYtiB,QAASkD,IACfsf,EAAapiB,SAAS,GAAG8C,EAAKgf,OAChCQ,EAAmBrc,KAAK,GAAGnD,EAAKif,OACvBM,EAAeriB,SAAS,GAAG8C,EAAKgf,QACzCS,EAAqBtc,KAAK,GAAGnD,EAAKif,SAG/B,CACLO,EAAmBnlB,IAAKwK,GAAU,CAACA,EAAO,IAC1C4a,EAAqBplB,IAAKwK,GAAU,CAACA,EAAO,IAEhD,CAiBqD6a,CACjDN,EACAE,EACAC,GAGF,IAAII,EAAoC,SAAZjkB,EAAqB,oBAAqB,sBAClC,IAAhC+jB,EAAqB7jB,SACvB+jB,EAAwB,IAG1B,MAAMC,EAAgB,CACpBljB,KAAM,kBACN2G,KAAM,OACNhL,KAAM,IAAImnB,EAAoBC,EAAqB,IACnD1D,UAAW,CACT5b,MAAO,UACPwD,MAAO,GAETkc,YAAY,EACZ/F,QAAS,CACPT,MAAM,IAGV,IAAIyG,EAA2B,GAC3BC,EAA0B,GAC9B,GAAoC,IAAhCN,EAAqB7jB,OAAc,CACrC,MAAMokB,EAAcZ,EAAYA,EAAYxjB,OAAS,GAAGiJ,MACxDib,EAA2BE,EAC3BD,EAA0BC,CAC5B,MACEF,EAA2BL,EAAqB,GAAG,GACnDM,EACEN,EAAqBA,EAAqB7jB,OAAS,GAAG,GAwD1D,MAFe,IAAIyjB,EAAYO,EA9CR,CACrBljB,KAAM,qBACN2G,KAAM,OACNhL,KAAMonB,EACN1D,UAAW,CACT5b,MAAO,UACPwD,MAAO,GAETkc,YAAY,EACZ/F,QAAS,CACPT,MAAM,GAER4G,SAAU,CACRC,QAAQ,EACRhE,UAAW,CACTiE,QAAS,GACThgB,MAAO,QAET2Z,QAAS,CACPT,MAAM,GAERpY,MAAO,CACLd,MAAO,OACPyR,UAAW,SACXoH,WAAY,MACZvV,WAAY,aACZpB,SAAU,IAEZhK,KAAM,CACJ,CACE,CACEqE,KAAMijB,EACN5F,MAAO+F,EACP7F,MAAO,GAET,CACEvd,KAAM,MACNqd,MAAOgG,EACP9F,MA5COvf,KAAKgG,OACjB0e,EACA3Z,OAAQzF,GAAgC,OAAvBA,EAAKkf,KACtB7kB,IAAK2F,GAAS1H,SAAS,GAAG0H,EAAKkf,MAAiB,WAoDvD,CASO,SAASkB,GACd3e,EACA4Y,EACA0C,OAAkBle,GAmIlBT,EAAUqD,EADYiF,EAhIC,CACrBiS,KAAM,CACJE,KAAM,OACNS,MAAO,KACPH,OAAQ,KACRL,IAAK,MAELF,cAAc,GAEhBrV,MAAO,CACLsV,KAAM,SACNC,IAAK,MACLC,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZuV,WAAY,IACZ7Y,MAAO,SAGX8Y,OAAQ,CACN5V,KAAM,QACNyV,IAAK,KACLnV,MAAO,MACPoV,UAAW,CACTtV,WAAY,eAGhBqW,QAAS,CACPkB,QAAS,OACT3B,MAAM,EACNzV,UAAYjE,GAAWD,EAAcC,GACrCoZ,UAAW,CACTtV,WAAY,eAGhBsW,MAAO,CACL1W,KAAM,WACNgd,aAAa,EACbvE,UAAW,CACTzC,MAAM,GAERW,UAAW,CACTjB,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZtD,MAAO,UAIb8Z,MAAO,CACL5W,KAAM,QACNsY,aAAc,MACd2E,QAAS,IACT1E,cAAe,CACbnY,WAAY,aACZuV,WAAY,MACZyC,QAAS,EAAE,GAAI,EAAG,GAAI,IACtBI,OAAQ,EACR0E,MAAO,OACPC,cAAe,MACf7c,MAAO,QAET8c,OAAO,EACP/E,YAAa,IACb1B,UAAW,CACT6B,OAAQ,GACR9C,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZtD,MAAO,UAIbugB,SAAU,CACRC,IAAK,IACL/G,YAAa,OACbgH,YAAa,kBACb7H,UAAW,CACT1W,SAAU,GACVoB,WAAY,aACZtD,MAAO,OACP0gB,gBAAiB,OACjBC,gBAAiB,EACjB9H,WAAY,OAEd+H,uBAAwB,CACtBhF,UAAW,CACT5b,MAAO,QAET6gB,UAAW,CACT7gB,MAAO,YAGX8gB,eAAgB,CACdC,gBAAiB,gBACjBnF,UAAW,CACT5b,MAAO,QAET6gB,UAAW,CACT7gB,MAAO,oBAGXghB,YAAa,CACXhhB,MAAO,mBAETihB,gBAAiB,CACfjhB,MAAO,mBAETuZ,SAAU,CACRyH,YAAa,CACXhhB,MAAO,qBAETihB,gBAAiB,CACfjhB,MAAO,uBAIbiZ,QAAS,CACPG,QAAS,CACPC,QAAS,CAAEjW,MAAO,aAClBkW,YAAa,CAAElW,MAAO,UAExB+V,MAAO,KACPR,IAAK,MAEP/S,OAAQsU,GAGyC0C,GAErD,C","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/constants/constants.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/pentaho-components/common-pentaho-components.js","webpack://@vlci/vlcishared/./src/camaras/camaras-trafico.js","webpack://@vlci/vlcishared/./src/charts/stacked-bar/stacked-bar-common-options.js","webpack://@vlci/vlcishared/./src/charts/stacked-bar/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","webpack://@vlci/vlcishared/./src/charts/lines-chart-datas-validate.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\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\nexport const MONTHS_YEAR_SHORT = {\n es_ES: new Map([\n ['1', 'Ene'],\n ['2', 'Feb'],\n ['3', 'Mar'],\n ['4', 'Abr'],\n ['5', 'May'],\n ['6', 'Jun'],\n ['7', 'Jul'],\n ['8', 'Ago'],\n ['9', 'Sep'],\n ['10', 'Oct'],\n ['11', 'Nov'],\n ['12', 'Dic'],\n ]),\n ca_ES: new Map([\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', 'Set'],\n ['10', 'Oct'],\n ['11', 'Nov'],\n ['12', 'Des'],\n ]),\n};\n\nexport const TEXTS_COMMON = {\n es_ES: new Map([['last_update', 'Última actualización']]),\n ca_ES: new Map([['last_update', 'Última actualització']]),\n};\n\n/**\n * Separa un string yyyymm en dd/mm/yyyy\n * @param {string} dayMonthYear\n * @returns {string}\n */\nexport function separateDayMonthYearToSlash(dayMonthYear) {\n return `${dayMonthYear.substring(6, 8)}/${dayMonthYear.substring(\n 4,\n 6,\n )}/${dayMonthYear.substring(0, 4)}`;\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/**\n * @param {string} dia 'YYYYMMDD'\n * @returns {string} devuelve el dia anterior con formato 'YYYYMMDD'\n */\nexport function subtractOneDay(dia) {\n const year = Math.floor(dia / 10000);\n const month = (dia % 10000) / 100 - 1; // se resta 1 porque los meses en JS van de 0 a 11\n const day = dia % 100;\n const date = new Date(year, month, day);\n date.setDate(date.getDate() - 1); // se resta un dia\n return `${date.getFullYear()}${(date.getMonth() + 1)\n .toString()\n .padStart(2, '0')}${date.getDate().toString().padStart(2, '0')}`;\n}\n\n/**\n * @param {string} month 'YYYYMM'\n * @returns {string} previousMonth devuelve el mes anterior con formato 'YYYYMM'\n */\nexport function subtractOneMonth(month) {\n let previousMonth;\n const date = new Date(\n Math.floor(month / 100),\n (month % 100) - 1, // Se resta 1 porque los meses en Date van de 0 a 11.\n 0, // El parametro 0 es para obtener el ultimo dia del mes anterior (en definitiva se resta un mes)\n );\n previousMonth = `${date.getFullYear()}${(date.getMonth() + 1)\n .toString()\n .padStart(2, '0')}`;\n return previousMonth;\n}\n\n/**\n * Convierte una fecha YYYY-MM a YYYYMM\n * @param {string} date 'YYYY-MM'\n * @returns {integer} devuelve la misma fecha en formato YYYYMM\n */\nexport function convertDateToInteger(date) {\n const dateInt =\n typeof date === 'string' ? parseInt(date.replace('-', ''), 10) : date;\n return dateInt;\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/**\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 toneladas\n */\nexport function formatToTons(value) {\n const ton = 1000;\n return value >= ton ? `${value / ton} Tn` : value.toString();\n}\n\nexport function formatWithPrefix(value) {\n let result;\n let prefix;\n\n if (value >= 1000000) {\n result = value / 1000000;\n prefix = 'G';\n } else if (value >= 1000) {\n result = value / 1000;\n prefix = 'M';\n } else {\n result = value;\n prefix = 'k';\n }\n\n return {\n value: Math.round(result * 100) / 100,\n prefix,\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\nexport function capitalizarTexto(text) {\n if (text.includes('N/D')) {\n return text;\n }\n return text\n .toLowerCase()\n .replace(\n /(^|\\s|[.,;:!?¡¿(){}[\\]])([^\\s])/gu,\n (_, sep, char) => sep + char[0].toUpperCase(),\n );\n}\n","import { addPointInteger } from '../formatting/common-number';\nimport { getMonth } from '../dates/common-date';\n\nexport const DIVSIZE = 33;\n\n/**\n * Esta función ejecuta el initFunction que recibe de parámetro si el elementId está\n * disponible en el DOM, si no es así espera a que se cargue el contenido dinámico\n * esperando el custom event del eventName, que por defecto es MainContentLoadedCustom.\n * @param {*} elementId el identificador del elemento en el que se renderizará el componente.\n * @param {*} initFunction la función que renedriza el componente.\n * @param {*} eventName el nombre del evento que hay que esperar.\n */\nexport function initElement(\n elementId,\n initFunction,\n eventName = 'MainContentLoadedCustom',\n) {\n let element = document.getElementById(elementId);\n\n if (!element) {\n return new Promise((resolve) => {\n document.body.addEventListener(eventName, () => {\n element = document.getElementById(elementId);\n\n if (element) {\n resolve(initFunction(element));\n } else {\n console.error(\n `El elemento con ID ${elementId} aún no está disponible después del evento.`,\n );\n resolve(null);\n }\n });\n });\n }\n return Promise.resolve(initFunction(element));\n}\n\nexport function initChart(chartId, option) {\n const initializeChart = (chartElem) => {\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\n return initElement(chartId, initializeChart);\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;font-weight: 500;background-color:${color}\"></span>`;\n let nameLabel = `<p style=\"font-weight: 500;color: #565656;\">${params[0].name}</p>`;\n params.forEach((item) => {\n const roundedValues = roundValues ? Math.round(item.data) : item.data;\n const valuesLabel = serie\n ? `<div style=\"font-weight: 400;color: #666;\">${colorSpan(item.color)} ${\n item.seriesName\n }: \n <span style=\"float: right; margin-left:20px;font-weight: 600;color: #565656;\">\n ${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </span>\n </div>`\n : `<div>\n <span style=\"font-weight: 600;color: #565656;\">${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </span>\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} <span style=\"float: right; margin-left:20px;font-weight: 600;color: #333;\"> ${valueLabel} </span></div>`;\n\n return nameLabel;\n}\n\nexport function formatRoundTooltip(params, isPie) {\n let label = `${params.name} : `;\n label += `<span style=\"font-weight:500\">${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\nexport function printEchart(resultSet, idChart, idNoData) {\n if (resultSet.length === 0) {\n printNoDataChart(`#${idChart}`, `#${idNoData}`);\n return false;\n }\n printDataChart(`#${idNoData}`, `#${idChart}`);\n return true;\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.symbolSize = 6;\n serie.smooth = 0.1;\n if (colors.length > 0) {\n serie.color = colors.shift();\n }\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 ESPECIFICOS 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' && Array.isArray(modified[key])) {\r\n originalOut[key] = modified[key].map((specificSeries, index) => {\r\n const originalSeries = Array.isArray(original[key])\r\n ? original[key][index] || {}\r\n : {};\r\n return { ...originalSeries, ...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 modified[key] !== null &&\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 if (original[key] !== modified[key]) {\r\n originalOut[key] = modified[key];\r\n }\r\n }\r\n });\r\n // Devuelve el objeto original actualizado\r\n return originalOut;\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 const updateElements = () => {\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 =\r\n 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 try {\r\n updateElements();\r\n } catch (e) {\r\n // Wait for the custom event to ensure elements are available\r\n document.body.addEventListener('MainContentLoadedCustom', () => {\r\n updateElements();\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\r\n/**\r\n * Inserta el contenido en un elemento del DOM, pasandole el id del elemento (selector) y el valor que queremos insertar.\r\n * @param {string} selector - El selector CSS del elemento (e.g., '#consumoTotal').\r\n * @param {number|string} value - El valor a inyectar en el elemento.\r\n * @param {function} [formatter] - (Opcional) Una función para formatear el valor antes de inyectarlo.\r\n */\r\nexport function updateDomElement(selector, value) {\r\n const domElement = document.querySelector(selector);\r\n if (domElement) {\r\n domElement.textContent = value;\r\n } else {\r\n console.warn(`Elemento ${selector} no encontrado en el DOM`);\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 // eslint-disable-next-line no-restricted-syntax\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 // eslint-disable-next-line no-param-reassign\n filterOrigen.queryDefinition.dataAccessId = queryDatasourceLoad;\n filterOrigen.dashboard.setParameter(filterOrigen.parameter, ['All']);\n } else {\n // eslint-disable-next-line no-param-reassign\n filterOrigen.queryDefinition.dataAccessId = queryDatasource;\n }\n return true;\n}\n/**\n * Esta función configura un filtro o parámetro en un dashboard (tablero) para seleccionar\n * todos los valores posibles para un filtro específico (lo cual es indicado por ['All']).\n * @param {FilterComponent} filterOrigen componentes del filtro\n * @returns true\n */\nexport function selectConfigDatasourceAllValue(filterOrigen) {\n filterOrigen.dashboard.setParameter(filterOrigen.parameter, ['All']);\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 * @param {string} name nombre que aparecerá en el filtro, por defecto es 'Todos'\n * @returns configuracion del filtro\n */\nexport function getSelectCommonOptions(name = 'Todos') {\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: name,\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 * @param {string} name nombre que aparecerá en el filtro, por defecto es 'Todos'\n * @returns configuracion del filtro\n */\nexport function getSelectTwoColumnsOptions(name = 'Todos') {\n const idLabelOptions = getSelectCommonOptions(name);\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(paramameterResetIni, paramameterLoadIni) {\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 if (paramDefault !== '')\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 // eslint-disable-next-line no-param-reassign\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/**\n * Resetea un filtro a su valor por defecto\n * @param {String} parameterReset El parámetro que se reseteará\n * @param {String|Array} parameterDefault El valor por defecto que se asignará al filtro\n * @returns true Si todo funciona correctamente\n */\nexport function resetFilterToDefault(parameterReset, parameterDefault) {\n const defaultValue = Dashboards.getParameterValue(parameterDefault);\n Dashboards.fireChange(\n parameterReset,\n Array.isArray(defaultValue) ? defaultValue : [defaultValue],\n );\n return true;\n}\n\n/**\n * Provoca que el filtro seleccione los numItems primeros\n * @param {Array} data Elementos del filtro\n * @param {String} paramFilter Parámetro del filtro\n * @param {Integer} numItems Número de elementos que queremos tener seleccionados\n * @param {Integer} valueIndex Tomará el valor el índice del array del data. Normalmente se pondrá el valor 1 cuando nuestro datos devuelve codigo, descripción\n * @returns data Elementos del filtro\n */\nexport function selectFilterNumItemsDefault(\n data,\n paramFilter,\n numItems,\n valueIndex = 0,\n) {\n const datos = data.resultset;\n\n const selectedValues = datos\n .slice(0, numItems)\n .map((item) => item[valueIndex]);\n\n Dashboards.setParameter(paramFilter, selectedValues);\n\n return data;\n}\n\n/**\n * Cambia el valor de un parámetro, dispara fireChange y refresca el componente del filtro\n * @param {String} paramName Nombre del parámetro a actualizar\n * @param {Array|String} value Valor que se asignará al parámetro\n * @param {String} componentName Nombre del componente del filtro en el dashboard\n */\nexport function resetFilterAndUpdate(paramName, value, componentName) {\n const valueArray = Array.isArray(value) ? value : [value];\n\n Dashboards.fireChange(paramName, valueArray);\n\n const component = Dashboards.getComponent(componentName);\n if (component) {\n component.update();\n }\n}\n\n","import { initElement } from '../charts/common-chart';\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 initializeTable = (table) => new Tabulator(table, option);\n\n return initElement(tableId, initializeTable);\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 Object.keys(origen).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(origen, key)) {\n const subArray = origen[key];\n\n const areaObj = {\n [nodeParent]: subArray[0],\n // eslint-disable-next-line no-underscore-dangle\n _children: [],\n };\n\n subArray.shift(); // Elimina el primer elemento del array, en este caso el área\n\n subArray.forEach((valor, index) => {\n const childObj = {\n [nodeParent]: listNameChildren[index],\n [valueChildren]: valor,\n };\n\n // eslint-disable-next-line no-underscore-dangle\n areaObj._children.push(childObj);\n });\n\n dataObj.push(areaObj);\n }\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 // eslint-disable-next-line no-underscore-dangle\n if (group._group.visible) {\n allCollapsed = false;\n }\n });\n return allCollapsed;\n}\n\n\n/**\n * Exporta en CSV la tabla.\n * @param {Table} table elemento tabla del que se descargará la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n * @param {String} elementHTML id del elemento HTML que lanza la descarga\n */\nexport function downloadCSVTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n table.download('csv', `${nombreFichero}.csv`, { delimiter: ';', bom: true });\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/**\n * Exporta en PDF la tabla.\n * @param {Table} table elemento tabla del que se descargará la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n * @param {String} elementHTML id del elemento HTML que lanza la descarga\n */\nexport function downloadPDFTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n const filas = table.getRows().map((row) => row.getData());\n const columnas = table.getColumns();\n\n const columnStyles = {};\n\n columnas.forEach((col, index) => {\n const field = col.getField();\n if (!field) return;\n\n const esNumerica = filas.every((fila) => {\n const valor = fila[field];\n return valor === null || valor === undefined || /^-?\\d+([.,]\\d+)?$/.test(valor.toString().trim());\n });\n\n if (esNumerica) {\n columnStyles[index] = {\n halign: 'right',\n };\n }\n });\n\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 lineWidth: 0.1,\n lineColor: [200, 200, 200],\n },\n headStyles: {\n halign: 'center',\n },\n columnStyles,\n },\n });\n };\n\n const downloadCsvButton = document.getElementById(elementHTML);\n const newDownloadPdfButton = downloadCsvButton.cloneNode(true);\n downloadCsvButton.parentNode.replaceChild(newDownloadPdfButton, downloadCsvButton);\n\n newDownloadPdfButton.addEventListener('click', previousClickHandler);\n}\n\n\n\n/**\n * Registra el evento del botón para colapsar todos los grupos de una tabla.\n * @param {Table} table Tabla que contiene los grupos.\n * @param {string} elementId ID del botón HTML que colapsa todos los grupos.\n */\nexport function initContractAllGroups(table, data, elementId) {\n const button = document.getElementById(elementId);\n if (button) {\n button.addEventListener('click', () => {\n table.setGroupStartOpen(false);\n table.setData(data);\n });\n }\n}\n\n/**\n * Registra el evento del botón para expandir todos los grupos de una tabla.\n * @param {Table} table Tabla que contiene los grupos.\n * @param {string} elementId ID del botón HTML que expande todos los grupos.\n */\nexport function initExpandAllGroups(table, data, elementId) {\n const button = document.getElementById(elementId);\n if (button) {\n button.addEventListener('click', () => {\n table.setGroupStartOpen(true);\n table.setData(data);\n });\n }\n}\n\n\n","export const THRESHOLDS = {\n SO2: [100, 200, 350, 500, 750, 751],\n NO2: [40, 90, 120, 230, 340, 341],\n O3: [50, 100, 130, 240, 380, 381],\n PM10: [20, 40, 50, 100, 150, 151],\n PM25: [10, 20, 25, 50, 75, 76],\n};\n","import { THRESHOLDS } from '../constants/constants';\n\nexport function buildTableCalidadAire(resultset) {\n const trArray = [];\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 // 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 THRESHOLDS.SO2,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_no2`,\n estacion.no2value,\n THRESHOLDS.NO2,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_o3`,\n estacion.o3value,\n THRESHOLDS.O3,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm10`,\n estacion.pm10value,\n THRESHOLDS.PM10,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm25`,\n estacion.pm25value,\n THRESHOLDS.PM25,\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';\nimport { initializeDashboardOnEvent } from '../pentaho-components/common-pentaho-components';\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 window.realDashboardsInit = Dashboards.init;\n\n // Bloqueamos la ejecución automática hasta que todo el contenido esté cargado.\n Dashboards.init = function () {\n console.warn('Dashboards.init bloqueado temporalmente');\n };\n\n function cabeceraContentLoaded() {\n changeTabTitle();\n changeNavTitle();\n }\n\n function mainContentLoaded() {\n document.body.dispatchEvent(new Event('MainContentLoadedCustom'));\n changeBodyClass();\n if (cllback) {\n cllback();\n }\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 initializeDashboardOnEvent();\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","/**\n * Difere la inicialización del dashboard de Pentaho hasta que se dispare un evento personalizado.\n *\n * @param {string} eventName - Nombre del evento que indica que el contenido ya está completamente cargado.\n */\nexport function initializeDashboardOnEvent(\n eventName = 'MainContentLoadedCustom',\n) {\n document.body.addEventListener(\n eventName,\n () => {\n try {\n Dashboards.init = window.realDashboardsInit;\n Dashboards.init();\n } catch (err) {\n console.warn(\n 'No se pudo restaurar Dashboards.init; la función original no está disponible.',\n );\n }\n },\n { once: true },\n );\n}\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 {\n formatToMillions,\n} from '../../formatting/common-number';\n\n\n/**\n * Opciones por defecto para todos los graficos stacked bar\n */\nexport const stackedBarCommonOptions = {\n grid: {\n containLabel: true,\n },\n title: {\n left: 'center',\n top: '0',\n textStyle: {\n fontSize: 15,\n fontFamily: 'Montserrat',\n fontWeight: 500,\n color: '#666',\n },\n },\n legend: {\n orient: 'horizontal',\n bottom: '0',\n left: 'center',\n width: '100%',\n textStyle: {\n fontSize: 11,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n color: '#666',\n },\n },\n toolbox: {\n show: true,\n right: '0',\n top: '0',\n feature: {\n restore: {\n textStyle: {\n fontSize: 6,\n fontFamily: 'Montserrat',\n fontWeight: 300,\n },\n },\n saveAsImage: {\n textStyle: {\n fontSize: 6,\n fontFamily: 'Montserrat',\n fontWeight: 300,\n },\n },\n },\n emphasis: {\n iconStyle: {\n borderColor: '#ffcd00',\n textFill: '#666',\n },\n },\n },\n tooltip: {\n textStyle: {\n fontFamily: 'Montserrat',\n fontSize: 12,\n },\n },\n xAxis: [\n {\n type: 'category',\n axisLabel: {\n show: true,\n interval: 0,\n textStyle: {\n fontFamily: 'Montserrat',\n fontSize: 11,\n },\n },\n data: [],\n },\n ],\n yAxis: [\n {\n type: 'value',\n alignTicks: true,\n position: 'right',\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\n formatter: (value) => `${value}%`,\n },\n },\n {\n type: 'value',\n position: 'left',\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\n formatter: (value) => `${formatToMillions(value)}€`,\n },\n },\n ],\n};\n","import { splitData, updateObject } from '../../data/common-data';\nimport { addPointInteger } from '../../formatting/common-number';\nimport { initChart } from '../common-chart';\nimport { getMonth } from '../../dates/common-date';\nimport { stackedBarCommonOptions } from './stacked-bar-common-options';\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 * @param {string} unidadMedida unidad de medida del valor\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}: <span style=\"float: right; margin-left:20px;font-weight: 600;\">${addPointInteger(\n sum,\n )}</span></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\nexport function updateStackedBarOptions(specificOptions) {\n let modifiedOptions = {};\n modifiedOptions = updateObject(stackedBarCommonOptions, specificOptions);\n return modifiedOptions;\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 interval: 0,\n margin: 10,\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\n },\n },\n ],\n yAxis: [\n {\n type: 'value',\n axisLabel: {\n formatter: (value) => value.toLocaleString('es-ES'),\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\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","import { formatTooltip, initChart } from './common-chart';\nimport { updateObject } from '../data/common-data';\n\nconst ID_COLUMN = 'id';\nconst DATE_COLUMN = 'fecha';\nconst VALUE_COLUMN = 'value';\n\n/**\n * Separa en dos listas las fechas con información de datos validados y de datos no validados\n * La función servirá para pintar en el eje X con diferente color la información\n * @param {array} datosOrigen Datos iniciales devueltos por la query\n * @param {array} kpiValidList Lista de entityId que indican las filas que contienen datos validados\n * @param {array} kpiInvalidList Lista de entityId que indican las filas que contienen datos NO validados\n * @returns lista de fechas con datos válidos y lista de fecha con datos validados y con datos no validados\n */\nexport function separarFechasValidadas(\n datosOrigen,\n kpiValidList,\n kpiInvalidList,\n) {\n // Inicializamos los arrays para las fechas validadas y no validadas\n const datesValidateAxisX = [];\n const datesInValidateAxisX = [];\n\n datosOrigen.forEach((item) => {\n if (kpiValidList.includes(`${item[ID_COLUMN]}`)) {\n datesValidateAxisX.push(`${item[DATE_COLUMN]}`);\n } else if (kpiInvalidList.includes(`${item[ID_COLUMN]}`)) {\n datesInValidateAxisX.push(`${item[DATE_COLUMN]}`);\n }\n });\n return [\n datesValidateAxisX.map((fecha) => [fecha, 0]),\n datesInValidateAxisX.map((fecha) => [fecha, 0]),\n ];\n}\n\n/**\n * Obtiene las series de la gráfica diferenciando entre los datos validados y los no validados\n * @param {array} datosOrigen Datos iniciales devueltos por la query\n * @param {array} datosClean Datos del kpiValue\n * @param {array} kpiValidList Lista de entityId que indican las filas que contienen datos validados\n * @param {array} kpiInvalidList Lista de entityId que indican las filas que contienen datos NO validados\n * @returns Series que mostrará la gráfica\n */\nexport function configureDataValidate(\n datosOrigen,\n datosClean,\n kpiValidList,\n kpiInvalidList,\n language='es_ES'\n) {\n const [datesValidateAxisX, datesInValidateAxisX] = separarFechasValidadas(\n datosOrigen,\n kpiValidList,\n kpiInvalidList,\n );\n\n let dataNoValidateMessage = language == 'es_ES'? 'Datos sin validar': 'Dades sense validar';\n if (datesInValidateAxisX.length === 0) {\n dataNoValidateMessage = '';\n }\n // Pinta la linea gruesa del exe X de los datos validados\n const validatedData = {\n name: 'Datos validados',\n type: 'line',\n data: [...datesValidateAxisX, datesInValidateAxisX[0]],\n lineStyle: {\n color: '#00A9A0',\n width: 4,\n },\n showSymbol: false,\n tooltip: {\n show: false,\n },\n };\n let firstDateInValidateExecX = '';\n let lastDateInValidateExecX = '';\n if (datesInValidateAxisX.length === 0) {\n const ultimaFecha = datosOrigen[datosOrigen.length - 1].fecha;\n firstDateInValidateExecX = ultimaFecha;\n lastDateInValidateExecX = ultimaFecha;\n } else {\n firstDateInValidateExecX = datesInValidateAxisX[0][0];\n lastDateInValidateExecX =\n datesInValidateAxisX[datesInValidateAxisX.length - 1][0];\n }\n const maxValue = Math.max(\n ...datosOrigen\n .filter((item) => item[VALUE_COLUMN] !== null)\n .map((item) => parseInt(`${item[VALUE_COLUMN]}`, 10)),\n );\n\n const invalidateData = {\n name: 'Datos NO validados',\n type: 'line',\n data: datesInValidateAxisX,\n lineStyle: {\n color: '#80D4CF',\n width: 4,\n },\n showSymbol: false,\n tooltip: {\n show: false,\n },\n markArea: {\n silent: true,\n itemStyle: {\n opacity: 0.6,\n color: '#eee',\n },\n tooltip: {\n show: false,\n },\n label: {\n color: '#333',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: 'Montserrat',\n fontSize: 11,\n },\n data: [\n [\n {\n name: dataNoValidateMessage,\n xAxis: firstDateInValidateExecX,\n yAxis: 0,\n },\n {\n name: 'end',\n xAxis: lastDateInValidateExecX,\n yAxis: maxValue,\n },\n ],\n ],\n },\n };\n\n // Crear el resultado final incluyendo a las líneas de la gráfica la lines gruesa del eje X\n const result = [...datosClean, validatedData, invalidateData];\n\n return result;\n}\n\n/**\n * Configura las gráficas con datos validados y no validados\n * @param {String} idChart Identificador del HTML que contiene la gráfica\n * @param {array} dataArray Datos iniciales devueltos por la query\n * @param {String} specificOptions Opciones especificas de la gráfica\n * @returns Datos configurados\n */\nexport function configureLinesChartValidates(\n idChart,\n seriesData,\n specificOptions = undefined,\n) {\n const defaultOptions = {\n grid: {\n left: '2.5%',\n right: '5%',\n bottom: '70',\n top: '150',\n //heigh: '90%',\n containLabel: true,\n },\n title: {\n left: 'center',\n top: 'top',\n textStyle: {\n fontSize: 20,\n fontFamily: 'Montserrat',\n fontWeight: 600,\n color: '#666',\n },\n },\n legend: {\n type: 'plain',\n top: '50',\n width: '98%',\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n tooltip: {\n trigger: 'axis',\n show: true,\n formatter: (params) => formatTooltip(params),\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n xAxis: {\n type: 'category',\n boundaryGap: false,\n splitLine: {\n show: false,\n },\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n color: '#666',\n },\n },\n },\n yAxis: {\n type: 'value',\n nameLocation: 'end',\n nameGap: '0',\n nameTextStyle: {\n fontFamily: 'Montserrat',\n fontWeight: '500',\n padding: [-25, 0, 0, -48],\n margin: 0,\n align: 'left',\n verticalAlign: 'top',\n width: 'auto',\n },\n scale: true,\n splitNumber: '6',\n axisLabel: {\n margin: 10,\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n color: '#666',\n },\n },\n },\n dataZoom: {\n end: 100,\n borderColor: '#eee',\n fillerColor: 'rgba(0,0,0,.05)',\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n color: '#333',\n textBorderColor: '#fff',\n textBorderWidth: 3,\n fontWeight: '600',\n },\n selectedDataBackground: {\n lineStyle: {\n color: '#333',\n },\n areaStyle: {\n color: '#ffcd00',\n },\n },\n dataBackground: {\n backgroundColor: 'rgba(0,0,0,1)',\n lineStyle: {\n color: '#333',\n },\n areaStyle: {\n color: 'rgba(0,0,0,0.5)',\n },\n },\n handleStyle: {\n color: 'rgba(0,0,0,0.2)',\n },\n moveHandleStyle: {\n color: 'rgba(0,0,0,0.3)',\n },\n emphasis: {\n handleStyle: {\n color: 'rgba(255,205,0,1)',\n },\n moveHandleStyle: {\n color: 'rgba(255,205,0,1)',\n },\n },\n },\n toolbox: {\n feature: {\n restore: { title: 'Restablir' },\n saveAsImage: { title: 'Desar' },\n },\n right: '1%',\n top: '0%',\n },\n series: seriesData,\n };\n\n const mergedOptions = updateObject(defaultOptions, specificOptions);\n initChart(idChart, mergedOptions);\n}\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","MONTHS_YEAR","es_ES","Map","ca_ES","MONTHS_YEAR_SHORT","TEXTS_COMMON","separateDayMonthYearToSlash","dayMonthYear","substring","separateMonthYear","monthYear","formatMonthAnyo","anyo","mes","formatDayMonthYear","date","dia","separateDayMonthYear","formatShortMonthYear","formatShortMonthShortYear","formatTrimestre","split","parseFloat","getMonthList","DEFAULT_LANGUAGE","monthsMap","Array","from","values","map","monthName","slice","subtractOneDay","year","Math","floor","Date","setDate","getDate","getFullYear","getMonth","padStart","subtractOneMonth","month","previousMonth","convertDateToInteger","replace","decimals","usrlang","navigator","language","userLanguage","length","toUpperCase","factorDigits","minimumFractionDigits","maximumFractionDigits","toLocaleString","formatToMillions","million","formatToTons","formatWithPrefix","result","prefix","round","formatName","name","size","words","currentLine","forEach","word","capitalizarTexto","text","includes","toLowerCase","_","sep","char","initElement","elementId","initFunction","eventName","element","document","getElementById","Promise","resolve","body","addEventListener","console","error","initChart","chartId","option","chartElem","myChart","echarts","init","setOption","window","undefined","resize","mainContent","printNoDataChart","idHide","idShow","hideElement","querySelector","showElement","hidden","style","background","printDataChart","formatTooltip","params","roundValues","serie","unidadMedida","nameLabel","item","roundedValues","valuesLabel","color","seriesName","calculateXAxisStart","dataLength","calculateMaxYAxis","interval","maxValue","max","formatTooltipPie","percent","colorSpan","valueLabel","formatRoundTooltip","isPie","label","marker","formatMilMillionEuros","ONE_MILLION","castedValue","Number","printEchart","resultSet","idChart","idNoData","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","shift","title","offsetCenter","fontFamily","detail","width","formatter","configureDataGaugeMonthCommon","monthNumber","index","valor","textBelowGraph","textIntoGraph","innerWidth","labelFormatterMonthlyDataGauge","configureMultipleSeries","datos","resultset","tipos","Set","valueAxisX","dataObj","tipo","fecha","dato","val","day","axisXArray","tiposArray","sort","a","b","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","isArray","specificSeries","printDataInHTMLElements","dataConfig","updateElements","indicador","id","entries","elementArray","className","format","textContent","e","getMaxFieldNumberFromData","fieldName","fieldValue","isNaN","updateDomElement","selector","domElement","warn","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","selectConfigDatasourceAllValue","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","resetFilterToDefault","parameterReset","parameterDefault","defaultValue","selectFilterNumItemsDefault","numItems","valueIndex","selectedValues","resetFilterAndUpdate","paramName","componentName","valueArray","getComponent","update","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","bom","downloadPDFTable","newDownloadPdfButton","filas","getData","columnas","getColumns","columnStyles","col","field","getField","every","fila","test","trim","halign","rowCalcStyles","fontStyle","autoTable","styles","lineWidth","lineColor","headStyles","initContractAllGroups","button","setGroupStartOpen","setData","initExpandAllGroups","THRESHOLDS","SO2","NO2","O3","PM10","PM25","buildTableCalidadAire","trArray","CSS_CLASS_THRESHOLD","createTdElement","idName","threshold","tdElement","createElement","setAttribute","innerHTML","cssClass","getCssClass","classList","estacion","operationalstatus","so2value","no2value","o3value","pm10value","pm25value","markupTrElement","markupTdElement","address","appendChild","entityid","calculatePentahoPath","route","location","documentURI","getEnvironment","currentUrl","href","env","includeHTMLFileInElements","attrName","cllback","querySelectorAll","filePath","elementParam","cllbackOnContentLoaded","xhttp","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","send","includeHTMLFileInElement","getAttribute","initialCalls","realDashboardsInit","changeTabTitle","changeNavTitle","dispatchEvent","Event","bodyElement","remove","match","changeBodyClass","err","once","initializeDashboardOnEvent","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","MSStream","isIOSDevice","display","stackedBarCommonOptions","grid","containLabel","left","top","textStyle","fontWeight","legend","orient","bottom","toolbox","show","right","feature","restore","saveAsImage","emphasis","iconStyle","borderColor","textFill","tooltip","xAxis","axisLabel","yAxis","alignTicks","position","sameMonthAllYearsFormatter","seriesData","sumsByYear","sum","initStackedBarChart","updateOptions","updateDataOptionsParam","updateDataOptions","anyos","borderColors","defaultOptions","axisPointer","trigger","point","dom","rect","halfTooltipHeight","contentSize","chartHeight","viewSize","pointY","padding","splitNumber","nameLocation","nameTextStyle","margin","splitLine","lineStyle","defaultDataOptions","stack","itemStyle","focus","separatedData","reduce","accumulator","currentValue","splitData","categories","category","finallyDataOptions","calculateSeries","finallyOptions","updateStackedBarOptions","specificOptions","modifiedOptions","initStackedBarChartMonthSeries","updateOptionsParam","yearsSet","getYearsOrdered","borderWidth","formatedData","initBarChart","appendToBody","showBackground","getLastYear","dataArray","getLastYearValues","arrayUltimoAnyo","valoresUltimoAnyo","anio","mesIndex","getPenultimateYearValues","arrayPenultimoAnyo","valoresPenultimoAnyo","initBarChartComparationMonth","lastYearString","penultimateYearString","barGap","loadIframeOnClickEvent","clickElementSelector","iframeSelector","url","clickElement","loadingIframe","onload","disabled","ID_COLUMN","DATE_COLUMN","VALUE_COLUMN","configureDataValidate","datosOrigen","datosClean","kpiValidList","kpiInvalidList","datesValidateAxisX","datesInValidateAxisX","separarFechasValidadas","dataNoValidateMessage","validatedData","showSymbol","firstDateInValidateExecX","lastDateInValidateExecX","ultimaFecha","markArea","silent","opacity","configureLinesChartValidates","boundaryGap","nameGap","align","verticalAlign","scale","dataZoom","end","fillerColor","textBorderColor","textBorderWidth","selectedDataBackground","areaStyle","dataBackground","backgroundColor","handleStyle","moveHandleStyle"],"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/language/common-language.js","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/constants/constants.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/pentaho-components/common-pentaho-components.js","webpack://@vlci/vlcishared/./src/camaras/camaras-trafico.js","webpack://@vlci/vlcishared/./src/charts/stacked-bar/stacked-bar-common-options.js","webpack://@vlci/vlcishared/./src/charts/stacked-bar/stacked-bar.js","webpack://@vlci/vlcishared/./src/charts/bar-chart.js","webpack://@vlci/vlcishared/./src/charts/bar-chart-comparation-month.js","webpack://@vlci/vlcishared/./src/iframes/load-iframes.js","webpack://@vlci/vlcishared/./src/charts/lines-chart-datas-validate.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};","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 { DEFAULT_LANGUAGE } from '../language/common-language';\n\nconst 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\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\nexport const MONTHS_YEAR_SHORT = {\n es_ES: new Map([\n ['1', 'Ene'],\n ['2', 'Feb'],\n ['3', 'Mar'],\n ['4', 'Abr'],\n ['5', 'May'],\n ['6', 'Jun'],\n ['7', 'Jul'],\n ['8', 'Ago'],\n ['9', 'Sep'],\n ['10', 'Oct'],\n ['11', 'Nov'],\n ['12', 'Dic'],\n ]),\n ca_ES: new Map([\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', 'Set'],\n ['10', 'Oct'],\n ['11', 'Nov'],\n ['12', 'Des'],\n ]),\n};\n\nexport const TEXTS_COMMON = {\n es_ES: new Map([['last_update', 'Última actualización']]),\n ca_ES: new Map([['last_update', 'Última actualització']]),\n};\n\n/**\n * Separa un string yyyymm en dd/mm/yyyy\n * @param {string} dayMonthYear\n * @returns {string}\n */\nexport function separateDayMonthYearToSlash(dayMonthYear) {\n return `${dayMonthYear.substring(6, 8)}/${dayMonthYear.substring(\n 4,\n 6,\n )}/${dayMonthYear.substring(0, 4)}`;\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 * @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() {\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/**\n * @param {string} dia 'YYYYMMDD'\n * @returns {string} devuelve el dia anterior con formato 'YYYYMMDD'\n */\nexport function subtractOneDay(dia) {\n const year = Math.floor(dia / 10000);\n const month = (dia % 10000) / 100 - 1; // se resta 1 porque los meses en JS van de 0 a 11\n const day = dia % 100;\n const date = new Date(year, month, day);\n date.setDate(date.getDate() - 1); // se resta un dia\n return `${date.getFullYear()}${(date.getMonth() + 1)\n .toString()\n .padStart(2, '0')}${date.getDate().toString().padStart(2, '0')}`;\n}\n\n/**\n * @param {string} month 'YYYYMM'\n * @returns {string} previousMonth devuelve el mes anterior con formato 'YYYYMM'\n */\nexport function subtractOneMonth(month) {\n const date = new Date(\n Math.floor(month / 100),\n (month % 100) - 1, // Se resta 1 porque los meses en Date van de 0 a 11.\n 0, // El parametro 0 es para obtener el ultimo dia del mes anterior (en definitiva se resta un mes)\n );\n const previousMonth = `${date.getFullYear()}${(date.getMonth() + 1)\n .toString()\n .padStart(2, '0')}`;\n return previousMonth;\n}\n\n/**\n * Convierte una fecha YYYY-MM a YYYYMM\n * @param {string} date 'YYYY-MM'\n * @returns {integer} devuelve la misma fecha en formato YYYYMM\n */\nexport function convertDateToInteger(date) {\n const dateInt =\n typeof date === 'string' ? parseInt(date.replace('-', ''), 10) : date;\n return dateInt;\n}\n\n/**\n * Convierte una fecha de formato ISO (YYYY-MM-DD) a formato europeo (DD/MM/YYYY)\n * @param {string} dateISO 'YYYY-MM-DD'\n * @returns {string} devuelve la misma fecha en formato DD/MM/YYYY\n */\nexport function convertISODateToEUDate(dateISO) {\n if (!dateISO || typeof dateISO !== 'string') return '';\n\n const [yyyy, mm, dd] = dateISO.split('-');\n return `${dd}/${mm}/${yyyy}`;\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/**\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 toneladas\n */\nexport function formatToTons(value) {\n const ton = 1000;\n return value >= ton ? `${value / ton} Tn` : value.toString();\n}\n\nexport function formatWithPrefix(value) {\n let result;\n let prefix;\n\n if (value >= 1000000) {\n result = value / 1000000;\n prefix = 'G';\n } else if (value >= 1000) {\n result = value / 1000;\n prefix = 'M';\n } else {\n result = value;\n prefix = 'k';\n }\n\n return {\n value: Math.round(result * 100) / 100,\n prefix,\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\nexport function capitalizarTexto(text) {\n if (text.includes('N/D')) {\n return text;\n }\n return text\n .toLowerCase()\n .replace(\n /(^|\\s|[.,;:!?¡¿(){}[\\]])([^\\s])/gu,\n (_, sep, char) => sep + char[0].toUpperCase(),\n );\n}\n","import { addPointInteger } from '../formatting/common-number';\nimport { getMonth } from '../dates/common-date';\n\nexport const DIVSIZE = 33;\n\n/**\n * Esta función ejecuta el initFunction que recibe de parámetro si el elementId está\n * disponible en el DOM, si no es así espera a que se cargue el contenido dinámico\n * esperando el custom event del eventName, que por defecto es MainContentLoadedCustom.\n * @param {*} elementId el identificador del elemento en el que se renderizará el componente.\n * @param {*} initFunction la función que renedriza el componente.\n * @param {*} eventName el nombre del evento que hay que esperar.\n */\nexport function initElement(\n elementId,\n initFunction,\n eventName = 'MainContentLoadedCustom',\n) {\n let element = document.getElementById(elementId);\n\n if (!element) {\n return new Promise((resolve) => {\n document.body.addEventListener(eventName, () => {\n element = document.getElementById(elementId);\n\n if (element) {\n resolve(initFunction(element));\n } else {\n console.error(\n `El elemento con ID ${elementId} aún no está disponible después del evento.`,\n );\n resolve(null);\n }\n });\n });\n }\n return Promise.resolve(initFunction(element));\n}\n\nexport function initChart(chartId, option) {\n const initializeChart = (chartElem) => {\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\n return initElement(chartId, initializeChart);\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;font-weight: 500;background-color:${color}\"></span>`;\n let nameLabel = `<p style=\"font-weight: 500;color: #565656;\">${params[0].name}</p>`;\n params.forEach((item) => {\n const roundedValues = roundValues ? Math.round(item.data) : item.data;\n const valuesLabel = serie\n ? `<div style=\"font-weight: 400;color: #666;\">${colorSpan(item.color)} ${\n item.seriesName\n }: \n <span style=\"float: right; margin-left:20px;font-weight: 600;color: #565656;\">\n ${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </span>\n </div>`\n : `<div>\n <span style=\"font-weight: 600;color: #565656;\">${\n item.data\n ? `${addPointInteger(roundedValues)} ${unidadMedida}`\n : '-'\n }\n </span>\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} <span style=\"float: right; margin-left:20px;font-weight: 600;color: #333;\"> ${valueLabel} </span></div>`;\n\n return nameLabel;\n}\n\nexport function formatRoundTooltip(params, isPie) {\n let label = `${params.name} : `;\n label += `<span style=\"font-weight:500\">${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\nexport function printEchart(resultSet, idChart, idNoData) {\n if (resultSet.length === 0) {\n printNoDataChart(`#${idChart}`, `#${idNoData}`);\n return false;\n }\n printDataChart(`#${idNoData}`, `#${idChart}`);\n return true;\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.symbolSize = 6;\n serie.smooth = 0.1;\n if (colors.length > 0) {\n serie.color = colors.shift();\n }\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 ESPECIFICOS 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' && Array.isArray(modified[key])) {\r\n originalOut[key] = modified[key].map((specificSeries, index) => {\r\n const originalSeries = Array.isArray(original[key])\r\n ? original[key][index] || {}\r\n : {};\r\n return { ...originalSeries, ...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 modified[key] !== null &&\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 if (original[key] !== modified[key]) {\r\n originalOut[key] = modified[key];\r\n }\r\n }\r\n });\r\n // Devuelve el objeto original actualizado\r\n return originalOut;\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 const updateElements = () => {\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 =\r\n 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 try {\r\n updateElements();\r\n } catch (e) {\r\n // Wait for the custom event to ensure elements are available\r\n document.body.addEventListener('MainContentLoadedCustom', () => {\r\n updateElements();\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\r\n/**\r\n * Inserta el contenido en un elemento del DOM, pasandole el id del elemento (selector) y el valor que queremos insertar.\r\n * @param {string} selector - El selector CSS del elemento (e.g., '#consumoTotal').\r\n * @param {number|string} value - El valor a inyectar en el elemento.\r\n * @param {function} [formatter] - (Opcional) Una función para formatear el valor antes de inyectarlo.\r\n */\r\nexport function updateDomElement(selector, value) {\r\n const domElement = document.querySelector(selector);\r\n if (domElement) {\r\n domElement.textContent = value;\r\n } else {\r\n console.warn(`Elemento ${selector} no encontrado en el DOM`);\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 // eslint-disable-next-line no-restricted-syntax\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 // eslint-disable-next-line no-param-reassign\n filterOrigen.queryDefinition.dataAccessId = queryDatasourceLoad;\n filterOrigen.dashboard.setParameter(filterOrigen.parameter, ['All']);\n } else {\n // eslint-disable-next-line no-param-reassign\n filterOrigen.queryDefinition.dataAccessId = queryDatasource;\n }\n return true;\n}\n/**\n * Esta función configura un filtro o parámetro en un dashboard (tablero) para seleccionar\n * todos los valores posibles para un filtro específico (lo cual es indicado por ['All']).\n * @param {FilterComponent} filterOrigen componentes del filtro\n * @returns true\n */\nexport function selectConfigDatasourceAllValue(filterOrigen) {\n filterOrigen.dashboard.setParameter(filterOrigen.parameter, ['All']);\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 * @param {string} name nombre que aparecerá en el filtro, por defecto es 'Todos'\n * @returns configuracion del filtro\n */\nexport function getSelectCommonOptions(name = 'Todos') {\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: name,\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 * @param {string} name nombre que aparecerá en el filtro, por defecto es 'Todos'\n * @returns configuracion del filtro\n */\nexport function getSelectTwoColumnsOptions(name = 'Todos') {\n const idLabelOptions = getSelectCommonOptions(name);\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(paramameterResetIni, paramameterLoadIni) {\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 if (paramDefault !== '')\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 // eslint-disable-next-line no-param-reassign\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/**\n * Resetea un filtro a su valor por defecto\n * @param {String} parameterReset El parámetro que se reseteará\n * @param {String|Array} parameterDefault El valor por defecto que se asignará al filtro\n * @returns true Si todo funciona correctamente\n */\nexport function resetFilterToDefault(parameterReset, parameterDefault) {\n const defaultValue = Dashboards.getParameterValue(parameterDefault);\n Dashboards.fireChange(\n parameterReset,\n Array.isArray(defaultValue) ? defaultValue : [defaultValue],\n );\n return true;\n}\n\n/**\n * Provoca que el filtro seleccione los numItems primeros\n * @param {Array} data Elementos del filtro\n * @param {String} paramFilter Parámetro del filtro\n * @param {Integer} numItems Número de elementos que queremos tener seleccionados\n * @param {Integer} valueIndex Tomará el valor el índice del array del data. Normalmente se pondrá el valor 1 cuando nuestro datos devuelve codigo, descripción\n * @returns data Elementos del filtro\n */\nexport function selectFilterNumItemsDefault(\n data,\n paramFilter,\n numItems,\n valueIndex = 0,\n) {\n const datos = data.resultset;\n\n const selectedValues = datos\n .slice(0, numItems)\n .map((item) => item[valueIndex]);\n\n Dashboards.setParameter(paramFilter, selectedValues);\n\n return data;\n}\n\n/**\n * Cambia el valor de un parámetro, dispara fireChange y refresca el componente del filtro\n * @param {String} paramName Nombre del parámetro a actualizar\n * @param {Array|String} value Valor que se asignará al parámetro\n * @param {String} componentName Nombre del componente del filtro en el dashboard\n */\nexport function resetFilterAndUpdate(paramName, value, componentName) {\n const valueArray = Array.isArray(value) ? value : [value];\n\n Dashboards.fireChange(paramName, valueArray);\n\n const component = Dashboards.getComponent(componentName);\n if (component) {\n component.update();\n }\n}\n\n","import { initElement } from '../charts/common-chart';\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 initializeTable = (table) => new Tabulator(table, option);\n\n return initElement(tableId, initializeTable);\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 Object.keys(origen).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(origen, key)) {\n const subArray = origen[key];\n\n const areaObj = {\n [nodeParent]: subArray[0],\n // eslint-disable-next-line no-underscore-dangle\n _children: [],\n };\n\n subArray.shift(); // Elimina el primer elemento del array, en este caso el área\n\n subArray.forEach((valor, index) => {\n const childObj = {\n [nodeParent]: listNameChildren[index],\n [valueChildren]: valor,\n };\n\n // eslint-disable-next-line no-underscore-dangle\n areaObj._children.push(childObj);\n });\n\n dataObj.push(areaObj);\n }\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 // eslint-disable-next-line no-underscore-dangle\n if (group._group.visible) {\n allCollapsed = false;\n }\n });\n return allCollapsed;\n}\n\n\n/**\n * Exporta en CSV la tabla.\n * @param {Table} table elemento tabla del que se descargará la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n * @param {String} elementHTML id del elemento HTML que lanza la descarga\n */\nexport function downloadCSVTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n table.download('csv', `${nombreFichero}.csv`, { delimiter: ';', bom: true });\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/**\n * Exporta en PDF la tabla.\n * @param {Table} table elemento tabla del que se descargará la información\n * @param {String} nombreFichero nombre del fichero que se descargará (sin la extensión)\n * @param {String} elementHTML id del elemento HTML que lanza la descarga\n */\nexport function downloadPDFTable(table, nombreFichero, elementHTML) {\n const previousClickHandler = () => {\n const filas = table.getRows().map((row) => row.getData());\n const columnas = table.getColumns();\n\n const columnStyles = {};\n\n columnas.forEach((col, index) => {\n const field = col.getField();\n if (!field) return;\n\n const esNumerica = filas.every((fila) => {\n const valor = fila[field];\n return valor === null || valor === undefined || /^-?\\d+([.,]\\d+)?$/.test(valor.toString().trim());\n });\n\n if (esNumerica) {\n columnStyles[index] = {\n halign: 'right',\n };\n }\n });\n\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 lineWidth: 0.1,\n lineColor: [200, 200, 200],\n },\n headStyles: {\n halign: 'center',\n },\n columnStyles,\n },\n });\n };\n\n const downloadCsvButton = document.getElementById(elementHTML);\n const newDownloadPdfButton = downloadCsvButton.cloneNode(true);\n downloadCsvButton.parentNode.replaceChild(newDownloadPdfButton, downloadCsvButton);\n\n newDownloadPdfButton.addEventListener('click', previousClickHandler);\n}\n\n\n\n/**\n * Registra el evento del botón para colapsar todos los grupos de una tabla.\n * @param {Table} table Tabla que contiene los grupos.\n * @param {string} elementId ID del botón HTML que colapsa todos los grupos.\n */\nexport function initContractAllGroups(table, data, elementId) {\n const button = document.getElementById(elementId);\n if (button) {\n button.addEventListener('click', () => {\n table.setGroupStartOpen(false);\n table.setData(data);\n });\n }\n}\n\n/**\n * Registra el evento del botón para expandir todos los grupos de una tabla.\n * @param {Table} table Tabla que contiene los grupos.\n * @param {string} elementId ID del botón HTML que expande todos los grupos.\n */\nexport function initExpandAllGroups(table, data, elementId) {\n const button = document.getElementById(elementId);\n if (button) {\n button.addEventListener('click', () => {\n table.setGroupStartOpen(true);\n table.setData(data);\n });\n }\n}\n\n\n","export const THRESHOLDS = {\n SO2: [100, 200, 350, 500, 750, 751],\n NO2: [40, 90, 120, 230, 340, 341],\n O3: [50, 100, 130, 240, 380, 381],\n PM10: [20, 40, 50, 100, 150, 151],\n PM25: [10, 20, 25, 50, 75, 76],\n};\n","import { THRESHOLDS } from '../constants/constants';\n\nexport function buildTableCalidadAire(resultset) {\n const trArray = [];\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 // 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 THRESHOLDS.SO2,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_no2`,\n estacion.no2value,\n THRESHOLDS.NO2,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_o3`,\n estacion.o3value,\n THRESHOLDS.O3,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm10`,\n estacion.pm10value,\n THRESHOLDS.PM10,\n ),\n );\n markupTrElement.appendChild(\n createTdElement(\n `${estacion.entityid}_pm25`,\n estacion.pm25value,\n THRESHOLDS.PM25,\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';\nimport { initializeDashboardOnEvent } from '../pentaho-components/common-pentaho-components';\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 window.realDashboardsInit = Dashboards.init;\n\n // Bloqueamos la ejecución automática hasta que todo el contenido esté cargado.\n Dashboards.init = function () {\n console.warn('Dashboards.init bloqueado temporalmente');\n };\n\n function cabeceraContentLoaded() {\n changeTabTitle();\n changeNavTitle();\n }\n\n function mainContentLoaded() {\n document.body.dispatchEvent(new Event('MainContentLoadedCustom'));\n changeBodyClass();\n if (cllback) {\n cllback();\n }\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 initializeDashboardOnEvent();\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","/**\n * Difere la inicialización del dashboard de Pentaho hasta que se dispare un evento personalizado.\n *\n * @param {string} eventName - Nombre del evento que indica que el contenido ya está completamente cargado.\n */\nexport function initializeDashboardOnEvent(\n eventName = 'MainContentLoadedCustom',\n) {\n document.body.addEventListener(\n eventName,\n () => {\n try {\n Dashboards.init = window.realDashboardsInit;\n Dashboards.init();\n } catch (err) {\n console.warn(\n 'No se pudo restaurar Dashboards.init; la función original no está disponible.',\n );\n }\n },\n { once: true },\n );\n}\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 {\n formatToMillions,\n} from '../../formatting/common-number';\n\n\n/**\n * Opciones por defecto para todos los graficos stacked bar\n */\nexport const stackedBarCommonOptions = {\n grid: {\n containLabel: true,\n },\n title: {\n left: 'center',\n top: '0',\n textStyle: {\n fontSize: 15,\n fontFamily: 'Montserrat',\n fontWeight: 500,\n color: '#666',\n },\n },\n legend: {\n orient: 'horizontal',\n bottom: '0',\n left: 'center',\n width: '100%',\n textStyle: {\n fontSize: 11,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n color: '#666',\n },\n },\n toolbox: {\n show: true,\n right: '0',\n top: '0',\n feature: {\n restore: {\n textStyle: {\n fontSize: 6,\n fontFamily: 'Montserrat',\n fontWeight: 300,\n },\n },\n saveAsImage: {\n textStyle: {\n fontSize: 6,\n fontFamily: 'Montserrat',\n fontWeight: 300,\n },\n },\n },\n emphasis: {\n iconStyle: {\n borderColor: '#ffcd00',\n textFill: '#666',\n },\n },\n },\n tooltip: {\n textStyle: {\n fontFamily: 'Montserrat',\n fontSize: 12,\n },\n },\n xAxis: [\n {\n type: 'category',\n axisLabel: {\n show: true,\n interval: 0,\n textStyle: {\n fontFamily: 'Montserrat',\n fontSize: 11,\n },\n },\n data: [],\n },\n ],\n yAxis: [\n {\n type: 'value',\n alignTicks: true,\n position: 'right',\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\n formatter: (value) => `${value}%`,\n },\n },\n {\n type: 'value',\n position: 'left',\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\n formatter: (value) => `${formatToMillions(value)}€`,\n },\n },\n ],\n};\n","import { splitData, updateObject } from '../../data/common-data';\nimport { addPointInteger } from '../../formatting/common-number';\nimport { initChart } from '../common-chart';\nimport { getMonth } from '../../dates/common-date';\nimport { stackedBarCommonOptions } from './stacked-bar-common-options';\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 * @param {string} unidadMedida unidad de medida del valor\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}: <span style=\"float: right; margin-left:20px;font-weight: 600;\">${addPointInteger(\n sum,\n )}</span></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\nexport function updateStackedBarOptions(specificOptions) {\n let modifiedOptions = {};\n modifiedOptions = updateObject(stackedBarCommonOptions, specificOptions);\n return modifiedOptions;\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}","import { initBarChart } from './bar-chart';\nimport { updateObject } from '../data/common-data';\nimport { getMonthList } from '../dates/common-date';\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(),\n interval: 0,\n margin: 10,\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\n },\n },\n ],\n yAxis: [\n {\n type: 'value',\n axisLabel: {\n formatter: (value) => value.toLocaleString('es-ES'),\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n fontWeight: 400,\n },\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","import { formatTooltip, initChart } from './common-chart';\nimport { updateObject } from '../data/common-data';\n\nconst ID_COLUMN = 'id';\nconst DATE_COLUMN = 'fecha';\nconst VALUE_COLUMN = 'value';\n\n/**\n * Separa en dos listas las fechas con información de datos validados y de datos no validados\n * La función servirá para pintar en el eje X con diferente color la información\n * @param {array} datosOrigen Datos iniciales devueltos por la query\n * @param {array} kpiValidList Lista de entityId que indican las filas que contienen datos validados\n * @param {array} kpiInvalidList Lista de entityId que indican las filas que contienen datos NO validados\n * @returns lista de fechas con datos válidos y lista de fecha con datos validados y con datos no validados\n */\nexport function separarFechasValidadas(\n datosOrigen,\n kpiValidList,\n kpiInvalidList,\n) {\n // Inicializamos los arrays para las fechas validadas y no validadas\n const datesValidateAxisX = [];\n const datesInValidateAxisX = [];\n\n datosOrigen.forEach((item) => {\n if (kpiValidList.includes(`${item[ID_COLUMN]}`)) {\n datesValidateAxisX.push(`${item[DATE_COLUMN]}`);\n } else if (kpiInvalidList.includes(`${item[ID_COLUMN]}`)) {\n datesInValidateAxisX.push(`${item[DATE_COLUMN]}`);\n }\n });\n return [\n datesValidateAxisX.map((fecha) => [fecha, 0]),\n datesInValidateAxisX.map((fecha) => [fecha, 0]),\n ];\n}\n\n/**\n * Obtiene las series de la gráfica diferenciando entre los datos validados y los no validados\n * @param {array} datosOrigen Datos iniciales devueltos por la query\n * @param {array} datosClean Datos del kpiValue\n * @param {array} kpiValidList Lista de entityId que indican las filas que contienen datos validados\n * @param {array} kpiInvalidList Lista de entityId que indican las filas que contienen datos NO validados\n * @returns Series que mostrará la gráfica\n */\nexport function configureDataValidate(\n datosOrigen,\n datosClean,\n kpiValidList,\n kpiInvalidList,\n language='es_ES'\n) {\n const [datesValidateAxisX, datesInValidateAxisX] = separarFechasValidadas(\n datosOrigen,\n kpiValidList,\n kpiInvalidList,\n );\n\n let dataNoValidateMessage = language == 'es_ES'? 'Datos sin validar': 'Dades sense validar';\n if (datesInValidateAxisX.length === 0) {\n dataNoValidateMessage = '';\n }\n // Pinta la linea gruesa del exe X de los datos validados\n const validatedData = {\n name: 'Datos validados',\n type: 'line',\n data: [...datesValidateAxisX, datesInValidateAxisX[0]],\n lineStyle: {\n color: '#00A9A0',\n width: 4,\n },\n showSymbol: false,\n tooltip: {\n show: false,\n },\n };\n let firstDateInValidateExecX = '';\n let lastDateInValidateExecX = '';\n if (datesInValidateAxisX.length === 0) {\n const ultimaFecha = datosOrigen[datosOrigen.length - 1].fecha;\n firstDateInValidateExecX = ultimaFecha;\n lastDateInValidateExecX = ultimaFecha;\n } else {\n firstDateInValidateExecX = datesInValidateAxisX[0][0];\n lastDateInValidateExecX =\n datesInValidateAxisX[datesInValidateAxisX.length - 1][0];\n }\n const maxValue = Math.max(\n ...datosOrigen\n .filter((item) => item[VALUE_COLUMN] !== null)\n .map((item) => parseInt(`${item[VALUE_COLUMN]}`, 10)),\n );\n\n const invalidateData = {\n name: 'Datos NO validados',\n type: 'line',\n data: datesInValidateAxisX,\n lineStyle: {\n color: '#80D4CF',\n width: 4,\n },\n showSymbol: false,\n tooltip: {\n show: false,\n },\n markArea: {\n silent: true,\n itemStyle: {\n opacity: 0.6,\n color: '#eee',\n },\n tooltip: {\n show: false,\n },\n label: {\n color: '#333',\n fontStyle: 'normal',\n fontWeight: '400',\n fontFamily: 'Montserrat',\n fontSize: 11,\n },\n data: [\n [\n {\n name: dataNoValidateMessage,\n xAxis: firstDateInValidateExecX,\n yAxis: 0,\n },\n {\n name: 'end',\n xAxis: lastDateInValidateExecX,\n yAxis: maxValue,\n },\n ],\n ],\n },\n };\n\n // Crear el resultado final incluyendo a las líneas de la gráfica la lines gruesa del eje X\n const result = [...datosClean, validatedData, invalidateData];\n\n return result;\n}\n\n/**\n * Configura las gráficas con datos validados y no validados\n * @param {String} idChart Identificador del HTML que contiene la gráfica\n * @param {array} dataArray Datos iniciales devueltos por la query\n * @param {String} specificOptions Opciones especificas de la gráfica\n * @returns Datos configurados\n */\nexport function configureLinesChartValidates(\n idChart,\n seriesData,\n specificOptions = undefined,\n) {\n const defaultOptions = {\n grid: {\n left: '2.5%',\n right: '5%',\n bottom: '70',\n top: '150',\n //heigh: '90%',\n containLabel: true,\n },\n title: {\n left: 'center',\n top: 'top',\n textStyle: {\n fontSize: 20,\n fontFamily: 'Montserrat',\n fontWeight: 600,\n color: '#666',\n },\n },\n legend: {\n type: 'plain',\n top: '50',\n width: '98%',\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n tooltip: {\n trigger: 'axis',\n show: true,\n formatter: (params) => formatTooltip(params),\n textStyle: {\n fontFamily: 'Montserrat',\n },\n },\n xAxis: {\n type: 'category',\n boundaryGap: false,\n splitLine: {\n show: false,\n },\n axisLabel: {\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n color: '#666',\n },\n },\n },\n yAxis: {\n type: 'value',\n nameLocation: 'end',\n nameGap: '0',\n nameTextStyle: {\n fontFamily: 'Montserrat',\n fontWeight: '500',\n padding: [-25, 0, 0, -48],\n margin: 0,\n align: 'left',\n verticalAlign: 'top',\n width: 'auto',\n },\n scale: true,\n splitNumber: '6',\n axisLabel: {\n margin: 10,\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n color: '#666',\n },\n },\n },\n dataZoom: {\n end: 100,\n borderColor: '#eee',\n fillerColor: 'rgba(0,0,0,.05)',\n textStyle: {\n fontSize: 10,\n fontFamily: 'Montserrat',\n color: '#333',\n textBorderColor: '#fff',\n textBorderWidth: 3,\n fontWeight: '600',\n },\n selectedDataBackground: {\n lineStyle: {\n color: '#333',\n },\n areaStyle: {\n color: '#ffcd00',\n },\n },\n dataBackground: {\n backgroundColor: 'rgba(0,0,0,1)',\n lineStyle: {\n color: '#333',\n },\n areaStyle: {\n color: 'rgba(0,0,0,0.5)',\n },\n },\n handleStyle: {\n color: 'rgba(0,0,0,0.2)',\n },\n moveHandleStyle: {\n color: 'rgba(0,0,0,0.3)',\n },\n emphasis: {\n handleStyle: {\n color: 'rgba(255,205,0,1)',\n },\n moveHandleStyle: {\n color: 'rgba(255,205,0,1)',\n },\n },\n },\n toolbox: {\n feature: {\n restore: { title: 'Restablir' },\n saveAsImage: { title: 'Desar' },\n },\n right: '1%',\n top: '0%',\n },\n series: seriesData,\n };\n\n const mergedOptions = updateObject(defaultOptions, specificOptions);\n initChart(idChart, mergedOptions);\n}\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","DEFAULT_LANGUAGE","mesDescLarga","Map","data","parseInt","toString","es_ES","ca_ES","MONTHS_YEAR_SHORT","TEXTS_COMMON","separateDayMonthYearToSlash","dayMonthYear","substring","separateMonthYear","monthYear","formatMonthAnyo","anyo","mes","formatDayMonthYear","date","dia","separateDayMonthYear","formatShortMonthYear","formatShortMonthShortYear","formatTrimestre","split","parseFloat","getMonthList","monthsMap","Array","from","values","map","monthName","slice","subtractOneDay","year","Math","floor","Date","setDate","getDate","getFullYear","getMonth","padStart","subtractOneMonth","month","convertDateToInteger","replace","convertISODateToEUDate","dateISO","yyyy","mm","dd","decimals","usrlang","navigator","language","userLanguage","length","toUpperCase","factorDigits","minimumFractionDigits","maximumFractionDigits","toLocaleString","formatToMillions","million","formatToTons","formatWithPrefix","result","prefix","round","formatName","name","size","words","currentLine","forEach","word","capitalizarTexto","text","includes","toLowerCase","_","sep","char","initElement","elementId","initFunction","eventName","element","document","getElementById","Promise","resolve","body","addEventListener","console","error","initChart","chartId","option","chartElem","myChart","echarts","init","setOption","window","undefined","resize","mainContent","printNoDataChart","idHide","idShow","hideElement","querySelector","showElement","hidden","style","background","printDataChart","formatTooltip","params","roundValues","serie","unidadMedida","nameLabel","item","roundedValues","valuesLabel","color","seriesName","calculateXAxisStart","dataLength","calculateMaxYAxis","interval","maxValue","max","formatTooltipPie","percent","colorSpan","valueLabel","formatRoundTooltip","isPie","label","marker","formatMilMillionEuros","ONE_MILLION","castedValue","Number","printEchart","resultSet","idChart","idNoData","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","shift","title","offsetCenter","fontFamily","detail","width","formatter","configureDataGaugeMonthCommon","monthNumber","index","valor","textBelowGraph","textIntoGraph","innerWidth","labelFormatterMonthlyDataGauge","configureMultipleSeries","datos","resultset","tipos","Set","valueAxisX","dataObj","tipo","fecha","dato","val","day","axisXArray","tiposArray","sort","a","b","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","isArray","specificSeries","printDataInHTMLElements","dataConfig","updateElements","indicador","id","entries","elementArray","className","format","textContent","e","getMaxFieldNumberFromData","fieldName","fieldValue","isNaN","updateDomElement","selector","domElement","warn","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","selectConfigDatasourceAllValue","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","resetFilterToDefault","parameterReset","parameterDefault","defaultValue","selectFilterNumItemsDefault","numItems","valueIndex","selectedValues","resetFilterAndUpdate","paramName","componentName","valueArray","getComponent","update","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","bom","downloadPDFTable","newDownloadPdfButton","filas","getData","columnas","getColumns","columnStyles","col","field","getField","every","fila","test","trim","halign","rowCalcStyles","fontStyle","autoTable","styles","lineWidth","lineColor","headStyles","initContractAllGroups","button","setGroupStartOpen","setData","initExpandAllGroups","THRESHOLDS","SO2","NO2","O3","PM10","PM25","buildTableCalidadAire","trArray","CSS_CLASS_THRESHOLD","createTdElement","idName","threshold","tdElement","createElement","setAttribute","innerHTML","cssClass","getCssClass","classList","estacion","operationalstatus","so2value","no2value","o3value","pm10value","pm25value","markupTrElement","markupTdElement","address","appendChild","entityid","calculatePentahoPath","route","location","documentURI","getEnvironment","currentUrl","href","env","includeHTMLFileInElements","attrName","cllback","querySelectorAll","filePath","elementParam","cllbackOnContentLoaded","xhttp","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","send","includeHTMLFileInElement","getAttribute","initialCalls","realDashboardsInit","changeTabTitle","changeNavTitle","dispatchEvent","Event","bodyElement","remove","match","changeBodyClass","err","once","initializeDashboardOnEvent","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","MSStream","isIOSDevice","display","stackedBarCommonOptions","grid","containLabel","left","top","textStyle","fontWeight","legend","orient","bottom","toolbox","show","right","feature","restore","saveAsImage","emphasis","iconStyle","borderColor","textFill","tooltip","xAxis","axisLabel","yAxis","alignTicks","position","sameMonthAllYearsFormatter","seriesData","sumsByYear","sum","initStackedBarChart","updateOptions","updateDataOptionsParam","updateDataOptions","anyos","borderColors","defaultOptions","axisPointer","trigger","point","dom","rect","halfTooltipHeight","contentSize","chartHeight","viewSize","pointY","padding","splitNumber","nameLocation","nameTextStyle","margin","splitLine","lineStyle","defaultDataOptions","stack","itemStyle","focus","separatedData","reduce","accumulator","currentValue","splitData","categories","category","finallyDataOptions","calculateSeries","finallyOptions","updateStackedBarOptions","specificOptions","modifiedOptions","initStackedBarChartMonthSeries","updateOptionsParam","yearsSet","getYearsOrdered","borderWidth","formatedData","initBarChart","appendToBody","showBackground","getLastYear","dataArray","getLastYearValues","arrayUltimoAnyo","valoresUltimoAnyo","anio","mesIndex","getPenultimateYearValues","arrayPenultimoAnyo","valoresPenultimoAnyo","initBarChartComparationMonth","lastYearString","penultimateYearString","barGap","loadIframeOnClickEvent","clickElementSelector","iframeSelector","url","clickElement","loadingIframe","onload","disabled","ID_COLUMN","DATE_COLUMN","VALUE_COLUMN","configureDataValidate","datosOrigen","datosClean","kpiValidList","kpiInvalidList","datesValidateAxisX","datesInValidateAxisX","separarFechasValidadas","dataNoValidateMessage","validatedData","showSymbol","firstDateInValidateExecX","lastDateInValidateExecX","ultimaFecha","markArea","silent","opacity","configureLinesChartValidates","boundaryGap","nameGap","align","verticalAlign","scale","dataZoom","end","fillerColor","textBorderColor","textBorderWidth","selectedDataBackground","areaStyle","dataBackground","backgroundColor","handleStyle","moveHandleStyle"],"sourceRoot":""}
|