{% extends 'Layouts/layout.html.twig' %}
{% block title %} Retabit Platform {% endblock %}
{% block content %}
{% for message in app.flashes('notice') %}
<div class="flash-notice" id="flash_div">
<div class="text-end"><span class="material-symbols-outlined hover" onclick="removeDiv('flash_div')">close</span></div>
<div class="container">
<p>{{ message | raw | trans}}</p>
</div>
</div>
{% endfor %}
<div class="modal fade" id="popUpIndicadores" tabindex="-1" >
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">{% trans %}Selecciona los indicadores para descargar en un fichero Excel{% endtrans %}</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
<a id="selectAllBtn" class="px-5 mb-2" style="cursor: pointer; font-weight: 400; text-decoration:none;">{% trans %}Seleccionar Todos{% endtrans %}</a>
<div class="col-12 px-5" id="project_actions_content">
</div>
<div class="text-center" id="popUpIndicadores_button">
<button class="btn btn-primary" onclick="getExcel()">{% trans %}Descargar{% endtrans %} selección</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid project_explore_container" id="container_in_content">
<div class="row justify-content-center">
<div id="infoview_content" class="col-12">
{# {{dump(analytic_data)}} #}
{% for item in analytic_data %}
{% if item.slug == slug %}
{#% dump(item) %#}
<div class="row justify-content-center">
<!-- Textai box -->
<div class="col-12 p-3" id="header_content_info_top">
<div class="d-flex justify-content-between align-items-center">
<h2 class="d-inline-block" data-bs-toggle="collapse" href="#textai_box" role="button" aria-expanded="false" aria-controls="textai_box" onclick="expandIcon('analytics_title_arrow')" >
{% if app.request.locale == "ca" %}
{{item.name_ca}}
{% elseif app.request.locale == "en" %}
{{item.name_en}}
{% else %}
{{item.name}}
{% endif %}
<span class="material-symbols-outlined hover" id="analytics_title_arrow">expand_more</span>
</h2>
<div class="d-flex">
<div class="d-flex align-items-center">
<button class="btn btn-primary btn-sm" onclick="loadSelectorIndicators()">{% trans %}Descargar datos{% endtrans %}</button>
</div>
</div>
</div>
<div class="collapse" id="textai_box" style="max-width: 940px;">
<p class="flex-fill mb-3" style="font-size: 14px;">{{item.textai}}</p>
</div>
</div>
<div class="col-12 all_steps" id="analytic_step">
<div class="row justify-content-center align-items-top">
<div id="infoview" class="infoview_div col-12">
<div class="row align-items-center justify-content-center">
<div class="col-12 collapse show" id="filter_div">
<div class="row align-items-center justify-content-center">
</div>
</div>
</div>
<div class="row viewfindergroup" id="map_view" >
<div class="col-12">
<div class="map__container" style="position:relative;">
<div id="map" class="map"></div>
<div class="legend"></div>
<div id="popup" class="popup d-none">
<a href="#" id="popup-closer" class="popup__closer"></a>
<div id="popup-content" class="popup__content"></div>
</div>
<button id="centerbutton" class="btn btn-light btn-sm pb-0" onclick="centerViewMap()">
<span class="material-symbols-outlined">fit_screen</span>
<span class="material-symbols-outlined d-none">collapse_content</span></button>
<button id="expand" class="btn btn-light btn-sm pb-0" onclick="infoviewToggle()">
<span class="material-symbols-outlined">expand_content</span></button>
</div>
</div>
</div>
<div class="row viewfindergroup" id="data_view">
<div class="col-12 pb-2" style="overflow-y: scroll; height: 80vh;">
<div id="wrapper"></div>
</div>
</div>
<div class="row viewfindergroup" id="card_view" >
<div class="col-12 pb-2" style="overflow-y: scroll; height: 80vh;">
<form class="row row-cols-lg-auto g-2 align-items-center mb-2 d-none">
<div class="col-12">
<label class="visually-hidden" for="via">{% trans %}Tipo via{% endtrans %}</label>
<select class="form-select" id="via">
<option value="1">{% trans %}Calle{% endtrans %}</option>
<option value="2">{% trans %}Avenida{% endtrans %}</option>
<option value="3">{% trans %}Rambla{% endtrans %}</option>
</select>
</div>
<div class="col-12">
<label class="visually-hidden" for="street_name">{% trans %}Nombre calle{% endtrans %}</label>
<div class="input-group">
<input type="text" class="form-control" id="street" placeholder="Nombre de calle">
</div>
</div>
<div class="col-12">
<label class="visually-hidden" for="flat">{% trans %}Piso{% endtrans %}</label>
<div class="input-group">
<input type="text" class="form-control" id="flat" placeholder="Piso">
</div>
</div>
<div class="col-12">
<label class="visually-hidden" for="floor">{% trans %}Planta{% endtrans %}</label>
<div class="input-group">
<input type="text" class="form-control" id="floor" placeholder="Pta.">
</div>
</div>
<div class="col-12">
<button type="submit" class="btn btn-primary pb-0"><span class="material-symbols-outlined">search</span></button>
</div>
</form>
<div class="row" style=" padding: 20px; margin-bottom: 40px; box-sizing: border-box;">
<div class="col-6 col-sm-3 overflow-hidden" id="img_fachada" style="background: #fbfbfb; padding: 20px;"></div>
<div class="col-6 col-sm-3 overflow-hidden me-4" id="img_catastro" style="background: #fbfbfb; padding: 20px;"></div>
<div class="col-12 col-sm-5" id="txt_build"></div>
</div>
<div class="row g-3" id="build_indicators">
</div>
</div>
</div>
</div>
<div id="infoview2" class="infoview2_div collapse collapse-horizontal show">
<!-- Selected box -->
<div class="col-12 selected_box p-3 mb-3 sticky-top d-none">
<h4>{% trans %}Indicador seleccionado{% endtrans %}</h4>
<div id="selected_box_content" class="selected_box_item" title="Header" data-bs-toggle="popover_live_top" data-bs-trigger="hover focus" data-bs-title="Popover title" data-bs-content="And here's some amazing content. It's very engaging. Right?"></div>
</div>
<!-- Indicadores box -->
<div class="col-12 analytic_box box_blue_soft p-3 graphic_box stats_box mb-3">
<div class="d-flex justify-content-between">
<p class="fw-bold fs-5">{% trans %}Indicadores relacionados{% endtrans %}</p>
</div>
<div class="" id="analytics_indicators">
{% set break = false %}
{% set array_used = [] %}
{% set category = '' %}
{#% dump("Item") %#}
{#% dump(item) %#}
{% for rel in item.relation %}
{% if break == false %}
{#% dump(rel) %#}
{% if app.request.locale == "ca" %}
{% set title = rel.name_ca %}
{% set description = rel.info_ca %}
{% elseif app.request.locale == "en" %}
{% set title = rel.name_en %}
{% set description = rel.info_en %}
{% else %}
{% set title = rel.name %}
{% set description = rel.info %}
{% endif %}
{% set array_used = array_used|merge([rel.kpi]) %}
<div id="statline_id_{{rel.kpi}}" onclick="updateMapFromDiv({{rel.kpi}})" class="grayscale analytics_statsline_item" data-kpi="{{rel.kpi}}" data-slug="{{rel.slug}}" data-bs-toggle="popover_live_{{loop.index}}" data-bs-trigger="hover focus" data-bs-title="{{title|capitalize}}" data-bs-content="{{description}}" data-p="{{ rel.province }}" data-m="{{ rel.city }}" data-r="{{ rel.region }}" data-max="{{ rel.max_value }}" data-min="{{ rel.min_value }}">
<p class="mb-1 title" style="font-size: 14px; font-weight: 600;">{{title|capitalize}}</p>
<div class="statsline mb-3" >
{% set color = [] %}
{% for rank in kpi_rank %}
{% if rank.kpi_id == rel.kpi %}
{% set color = color|merge([rank.bgcolor]) %}
{% endif %}
{% endfor %}
{% set counter = color|length %}
{% set partsize = 100/counter %}
{% set stylestring = '' %}
<div class="bk_line">
{% for colorpart in color %}
{% if loop.last %}
{% set dato = 99.9-(partsize*(counter - 1)) %}
<div class="analytic_color_bar" style="width:{{dato}}%; background-color: {{colorpart}};"></div>
{% else %}
<div class="analytic_color_bar" style="width:{{partsize|number_format(2, '.')}}%; background-color: {{colorpart}};"></div>
{% endif %}
{% endfor %}
</div>
<span class="statsline_item statsline_{{loop.index}} item_tooltip" style="left: {{rel.theme_per}}%;margin-left: -6px;" data-text="{{rel.theme}}" data-kpi="{{rel.kpi}}" data-bs-custom-class="custom-tooltip" data-bs-placement="top"><i class="fa-solid triangle"></i></span>
</div>
<div class="statsline_range d-flex justify-content-between d-none">
<span>{{rel.min_value}}</span>
<span>{{rel.max_value}}</span>
</div>
{% if loop.index == 4 %}
{% set break = true %}
{% endif %}
</div>
<script>
$('[data-bs-toggle="popover_live_{{loop.index}}"]').mouseover(function(){
$('[data-bs-toggle="popover_live_{{loop.index}}"]').popover();
})
</script>
{% endif %}
{% endfor %}
</div>
</div>
<!-- Otros Indicadores box -->
<div class="col-12 analytic_box box_blue_soft p-3 graphic_box stats_box mb-3">
<div class="d-flex justify-content-between">
<p class="fw-bold fs-5" data-bs-toggle="collapse" data-bs-target="#analytics_indicators" aria-expanded="true" aria-controls="analytics_statsline" onclick="expandIcon('analytics_indicators_arrow')" role="button">{% trans %}Otros indicadores{% endtrans %}</p>
</div>
<div class="" id="analytics_indicators_others">
{% set category = '' %}
{#% dump("Analytic") %#}
{% for rel in analytic_data_relation %}
{#% dump(rel) %#}
{% if rel.kpi not in array_used %}
{% if category != rel.category %}
<p class="mt-2 fw-bold" style="font-size: 12px; font-weight: 700;">
{% if app.request.locale == "ca" %}
{{rel.category_ca}}
{% elseif app.request.locale == "en" %}
{{rel.category_en}}
{% else %}
{{rel.category}}
{% endif %}
</p>
{% set category = rel.category %}
{% endif %}
{% if app.request.locale == "ca" %}
{% set title = rel.name_ca %}
{% set description = rel.info_ca %}
{% elseif app.request.locale == "en" %}
{% set title = rel.name_en %}
{% set description = rel.info_en %}
{% else %}
{% set title = rel.name %}
{% set description = rel.info %}
{% endif %}
<div id="statline_id_{{rel.kpi}}" onclick="updateMapFromDiv({{rel.kpi}})" class="grayscale analytics_statsline_item" data-kpi="{{rel.kpi}}" data-slug="{{rel.slug}}" data-bs-toggle="popover_live_{{loop.index}}" data-bs-trigger="hover focus" data-bs-title="{{title|capitalize}}" data-bs-content="{{description}}" data-p="{{ rel.province }}" data-m="{{ rel.city }}" data-r="{{ rel.region }}" data-max="{{ rel.max_value }}" data-min="{{ rel.min_value }}">
<script>
$('[data-bs-toggle="popover_live_{{loop.index}}"]').mouseover(function(){
$('[data-bs-toggle="popover_live_{{loop.index}}"]').popover();
})
</script>
<p class="mb-1 title" style="font-size: 14px; font-weight: 600;">{{title|capitalize}}</p>
<div class="statsline mb-3" >
{% set color = [] %}
{% for rank in kpi_rank %}
{% if rank.kpi_id == rel.kpi %}
{% set color = color|merge([rank.bgcolor]) %}
{% endif %}
{% endfor %}
{% set counter = color|length %}
{% set partsize = 100/counter %}
{% set stylestring = '' %}
<div class="bk_line">
{% for colorpart in color %}
{% if loop.last %}
{% set dato = 99.9-(partsize*(counter - 1)) %}
<div class="analytic_color_bar" style="width:{{dato}}%; background-color: {{colorpart}};"></div>
{% else %}
<div class="analytic_color_bar" style="width:{{partsize|number_format(2, '.')}}%; background-color: {{colorpart}};"></div>
{% endif %}
{% endfor %}
</div>
<span class="statsline_item statsline_{{loop.index}} item_tooltip" style="left: {{rel.theme_per}}%; margin-left: -6px;" data-text="{{rel.theme}}" data-kpi="{{rel.kpi}}" data-bs-custom-class="custom-tooltip" data-bs-placement="top"><i class="fa-solid triangle"></i></span>
</div>
<div class="statsline_range d-flex justify-content-between d-none">
<span>{{rel.min_value}}</span>
<span>{{rel.max_value}}</span>
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
{# <div class="" id="analytics_barplot_container">
<div id="analytics_barplot">
<div class="hover_window">
<h5>Uso del edificio</h5>
<div class="mb-3" id="statUseBox" style="position: relative;" onclick="updateMapFromStat(105)"></div>
</div>
<div class="hover_window">
<h5>Año de construcción</h5>
<div class="mb-3" id="statYearBox" style="position: relative;" onclick="updateMapFromStat(100)"></div>
</div>
<div class="hover_window">
<h5>Área</h5>
<div class="mb-3" id="statAreaBox" style="position: relative;" onclick="updateMapFromStat(101)"></div>
</div>
<div class="hover_window">
<h5>Porcentaje de ocupación</h5>
<div class="mb-3" id="statOccupationBox" style="position: relative;" onclick="updateMapFromStat(104)"></div>
</div>
</div>
</div> #}
</div>
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
<style>
td.gridjs-td{
//padding: 2px 24px !important;
}
</style>
{% endblock %}
{% block javascripts %}
<script src="{{ asset('build/js/calls.js') }}"></script>
<script src="{{ asset('bundles/fosjsrouting/js/router.min.js') }}"></script>
<script src="{{ path('fos_js_routing_js', { callback: 'fos.Router.setData' }) }}"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gridjs/6.0.6/gridjs.production.min.js" integrity="sha512-wpiJjuL800CTEBA0QFs+RFw0tFtpXnQGea1p9S16WcYNXC1F3U0l1L7FQrDC3ihkYRtOj4Td7lKR3mYKxrwMMA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/gridjs/dist/theme/mermaid.min.css" />
<script type="text/javascript">
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl));
var Routes = Routing; // loaded from router.min.js
// because ES5 doesn't support require syntax,
// we use jquery getJSON function in order to set
// routing data to our Routing object
$.getJSON("{{ asset('build/js/fos_js_routes.json') }}", function (routes) {
Routes.setRoutingData(routes);
});
{# console.log(Routes); #}
</script>
<script type="text/javascript">
//let explore_baseUrl = '{{ base_url }}';
$(document).ready(function(){
$('.viewfindergroup').hide();
$('#map_view').show();
$('.build_bar').css('width','100%');
$('.people_bar').css('width','100%');
/*setTimeout(()=>{
$('#info_div').collapse('hide');
},10000);*/
let arrayData = document.querySelectorAll('.analytics_statsline_item');
let arraySlugs = [];
for(let i=0; arrayData.length > i; i++){
arraySlugs.push(arrayData[i].getAttribute('data-slug'));
}
// console.log(arraySlugs);
buttonsToHeaderBar();
$('#left_bar_button_map').addClass('active');
});
document.getElementById("selectAllBtn").addEventListener("click", function() {
let checkboxes = document.querySelectorAll(".form-check-input");
let allChecked = Array.from(checkboxes).every(checkbox => checkbox.checked);
checkboxes.forEach(checkbox => {
checkbox.checked = !allChecked; // Alterna selección
});
this.textContent = allChecked ? "Seleccionar Todos" : "Deseleccionar Todos";
});
function buttonsToHeaderBar(){
// <span class="material-symbols-outlined">bar_chart_4_bars</span>
document.getElementById('new_header_map').innerHTML = '<div id="left_bar_button_map" class="left_bar_button text-center d-inline-block" onclick="viewFinder(\'map\')"><span class="material-symbols-outlined">map</span><br>{{"Mapa" |trans}}</div>';
document.getElementById('new_header_table').innerHTML = '<div id="left_bar_button_data" class="left_bar_button text-center d-inline-block" onclick="viewFinder(\'data\')"><span class="material-symbols-outlined">table</span><br>{{"Tabla" |trans}}</div>';
document.getElementById('new_header_card').innerHTML = '<div id="left_bar_button_card" class="left_bar_button text-center d-inline-block" onclick="viewFinder(\'card\')"><span class="material-symbols-outlined">grid_view</span><br>{{"Ficha" |trans}}</div>';
}
$('.item_tooltip').on('mouseover',function (){
let name = this.getAttribute('data-text');
let kpi = this.getAttribute('data-kpi');
// console.log(name,kpi);
$('.item_tooltip[data-kpi='+kpi+']').tooltip({title: name, delay: {show: 100, hide: 100}});
})
const { Grid, html } = gridjs;
var rPlatform = map;
var caller = call;
let layers = {{ layers |raw}};
let configLayers = {{ configLayers|raw }};
let explore_baseUrl = '{{ base_url }}';
caller.vars.explore_baseUrl = '{{ base_url }}';
let explore_mun = '{{ mun }}';
let explore_kpi = 3;
let explore_slug = '';
let explore_colors = {{ kpi_colors|raw }};
let explore_insight = [];
let explore_extrakpi = [];
let explore_layer_data = [];
let explore_url = window.location.href;
let explore_filter_url = '';
let filtered_data_array = {{ filtered_data|raw }};
let kpi_list = {{ kpi_list|raw }};
let kpi_list_complete = document.querySelectorAll('#kpi_list_data li');
for(i=0; kpi_list_complete.length > i; i++){
let name = kpi_list_complete[i].innerText;
let kpi = kpi_list_complete[i].getAttribute('data-kpi');
let slug = kpi_list_complete[i].getAttribute('data-slug');
kpi_list.push({'name':name,'kpi':kpi,'slug':slug});
}
// use stats data and print graphic
let useStat = {{ useStatData|raw }};
let useStatData = analyticOrganizeData(useStat);
var useStatTotalData = analyticOrganizeTotalData(useStat);
{# barplotDoubleDouble100('statUseBox',useStatData[0],useStatTotalData[1],useStatData[2], 'analytics_barplot_container',useStatTotalData[0]); #}
// year stats data and print graphic
let yearStat = {{ yearStatData|raw }};
let yearStatData = analyticOrganizeData(yearStat);
var yearStatTotalData = analyticOrganizeTotalData(yearStat);
{# barplotDoubleDouble100('statYearBox',yearStatData[0],yearStatTotalData[1],yearStatData[2], 'analytics_barplot_container',yearStatTotalData[0]); #}
// area stats data and print graphic
let areaStat = {{ areaStatData|raw }};
let areaStatData = analyticOrganizeData(areaStat);
var areaStatTotalData = analyticOrganizeTotalData(areaStat);
{# barplotDoubleDouble100('statAreaBox',areaStatData[0],areaStatTotalData[1],areaStatData[2], 'analytics_barplot_container',areaStatTotalData[0]); #}
// occupation stats data and print graphic
let occupationStat = {{ occupationStatData|raw }};
let occupationStatData = analyticOrganizeData(occupationStat);
var occupationStatTotalData = analyticOrganizeTotalData(occupationStat);
{# barplotDoubleDouble100('statOccupationBox',occupationStatData[0],occupationStatTotalData[1],occupationStatData[2], 'analytics_barplot_container',occupationStatTotalData[0]); #}
let explore_mun_name = '{{ municipioname.adminunitname|capitalize }}';
let allgeodataUrl = explore_baseUrl + "/get-allgeodata?mun=" + explore_mun ;
let munPolygon = '{{ municipioname.geom }}';
let initGeo = '{{ municipioname.envelope }}';
let queryString = window.location.search;
let urlParams = new URLSearchParams(queryString);
let filterStart = urlParams.get('fs');
let filterEnd = urlParams.get('fe');
window.appLocale = '{{ app.request.locale|e('js') }}';
if(filterStart == null){
filterStart = 0;
}
if(filterEnd == null){
filterEnd = 0;
}
rPlatform.setInpireidList(filtered_data_array);
rPlatform.setMun(explore_mun);
rPlatform.setBaseUrl(explore_baseUrl);
rPlatform.setLayers(layers);
rPlatform.setColorsStyle(explore_colors);
rPlatform.setLayerData(explore_layer_data);
// ----------------------- Map ------------------------ //
async function init() { // Cargar mapa de inicio
let queryString = window.location.search;
let urlParams = new URLSearchParams(queryString);
// Crear indArr con el primer kpi del listado
let alldivi = document.getElementsByClassName('grayscale');
let kpi_init = alldivi[0].getAttribute('data-kpi');
let slug_init = alldivi[0].getAttribute('data-slug');
explore_kpi = kpi_init;
explore_slug = slug_init;
alldivi[0].classList.add('kpi_selected');
alldivi[0].classList.add('disabled');
// Colocar primer alldivi como seleccionado
selectedIndicator(alldivi[0]);
// Recibir parametros ind desde url
let indArr = [parseInt(kpi_init)];
let frArr = [filterStart, filterEnd];
await rPlatform.setiActive(indArr);
await rPlatform.initMapExplore(layers, explore_baseUrl, initGeo, explore_mun, frArr, indArr);
await rPlatform.getSimpleStyleDistrict();
await rPlatform.getSimpleStyleSection();
rPlatform.updateMap();
}
init();
// ----------------------- Table Map ------------------------ //
function tableData(){
let wrapper = document.getElementById("wrapper");
wrapper.innerHTML = '';
let tabla = null; // Variable global para almacenar la instancia de la tabla
function renderizarTabla(data) {
// Eliminar la tabla anterior si existe
if (tabla !== null) {
tabla.destroy();
}
// Crear una nueva instancia de Grid.js con los nuevos datos y renderizarla
tabla = new gridjs.Grid({
columns: [{
id: 'year',
name: "{{'Año' |trans }}"
},
{
id: 'currentuse',
name: "{{'Uso' |trans }}",
formatter: (cell, row) => {
if (cell == '1_residential' ){
return gridjs.html(`<span style="color: blue; cursor:pointer;" onclick=" viewFinder(\'card\'); viewCard(\'${row.cells[22].data}\')">Residential</span>`)
}else if(cell == '2_agriculture'){
return gridjs.html(`<span style="color: green; cursor:pointer;" onclick="viewFinder(\'card\'); viewCard(\'${row.cells[22].data}\')">Agriculture</span>`)
}else if(cell == '3_industrial'){
return gridjs.html(`<span style="color: gray; cursor:pointer;" onclick="viewFinder(\'card\'); viewCard(\'${row.cells[22].data}\')">Industrial</span>`)
}else if(cell == '4_3_publicServices'){
return gridjs.html(`<span style="color: orange; cursor:pointer;" onclick="viewFinder(\'card\'); viewCard(\'${row.cells[22].data}\')">Public services</span>`)
}else{
return gridjs.html(`<span style="color: black">${cell}</span>`)
}
}
},
{
id: 'grossfloorarea',
name: "{{'Grossfloorarea' |trans }}",
formatter: (cell) => html(`${cell} m<sup>2</sup>`)
},
{
id: 'habitantes',
name: "{{'Habitantes' |trans }}",
formatter: (cell) => {
return gridjs.html(`<div class="mt-2"><i class="fa-solid fa-users"></i> ${cell}</div>`)
}
},
{
id: 'numberofdwellings',
name: "{{'Viviendas' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_1_energy_renovated_residential_buildings',
name: "{{'Energy renovated residential buildings' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_2_final_energy_consumption',
name: "{{'Final energy consumption' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_3_renewable_energy_consumption',
name: "{{'Renewable energy consumption' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_4_pv_potential_generation',
name: "{{'Pv potential generation' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_7_heating_energy_consumption',
name: "{{'Heating energy consumption' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_8_ghg_emissions',
name: "{{'GhG emissions' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_19_population_income_below_60_average',
name: "{{'Population income below 60 average' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_20_median_household_income',
name: "{{'Median household income' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_21_average_price_renting_compared_family_income',
name: "{{'Average price renting compared family income' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_22_house_price',
name: "{{'House price' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_27_urban_equipment_at_15_min',
name: "{{'Urban equipment at 15 min' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_28_accessibility_to_bike_lane',
name: "{{'Accessibility to bike lane' |trans }}",
formatter: (cell) => html(`${cell}`)
},{
id: 'kpi_30_green_area_surfaces',
name: "{{'Green area surfaces' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_31_vulnerability_heatwaves_temperature_rise',
name: "{{'Vulnerability heatwaves temperature rise' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_36_charging_outlets',
name: "{{'Charging outlets' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_6_1_energy_efficient_and_energy_recovering_homes',
name: "{{'Energy efficient and energy recovering_homes' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'kpi_6_2_energy_efficient_and_energy_recovering_homes',
name: "{{'Energy efficient and energy recovering homes' |trans }}",
formatter: (cell) => html(`${cell}`)
},
{
id: 'inspireid',
name: "{{'inspireid' |trans }}",
formatter: (cell) => html(`${cell}`)
}],
data: data,
pagination: {
limit: 50,
summary: true,
},
resizable: true,
search: false,
sort: true,
fixedHeader: true,
height: $("#infoview").height(),
}).render(wrapper);
}
// Llamar a la función obtenerDatos() para obtener los datos inicialmente y renderizar la tabla
caller.obtenerDatos(explore_kpi, explore_mun, explore_slug)
.then((data) => {
console.log(data);
renderizarTabla(data);
})
.then(()=>{
setTimeout(()=>{
updateTable(explore_slug);
},2000)
});
}
//------------------------ Descargar Datos ------------------- //
function loadSelectorIndicators()
{
$("#project_actions_content").html('');
{% for item in analytic_data %}
{% if item.slug == slug %}
{% set break = false %}
{% set array_used = [] %}
{% for rel in item.relation %}
{% if break == false %}
{% set array_used = array_used|merge([rel.kpi]) %}
var check = "<div class='form-check'> <input class='form-check-input' type='checkbox' value='{{rel.slug}}' id='flexCheckDefault' data-name='{{rel.name}}'> <label class='form-check-label' for='flexCheckDefault'> {{rel.name}} </label></div>";
$("#project_actions_content").append(check);
console.log('{{rel.name}}');
{% endif %}
{% endfor %}
{% for rel in analytic_data_relation %}
{% if rel.kpi not in array_used %}
var check = "<div class='form-check'> <input class='form-check-input' type='checkbox' value='{{rel.slug}}' id='flexCheckDefault' data-name='{{rel.name}}'> <label class='form-check-label' for='flexCheckDefault'> {{rel.name}} </label></div>";
$("#project_actions_content").append(check);
console.log('{{rel.name}}');
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
$("#popUpIndicadores").modal('show');
}
function getExcel() {
const selectedNames = {};
const checkboxes = document.querySelectorAll('.form-check-input:checked');
const selectedValues = Array.from(checkboxes).map(checkbox => checkbox.value);
/*const selectedNames = Array.from(checkboxes).map(checkbox => ({
[checkbox.value]: checkbox.dataset.name
}));*/
checkboxes.forEach((checkbox) => selectedNames[checkbox.value] = checkbox.dataset.name);
console.log(selectedValues);
console.log(selectedNames);
caller.getExcel(explore_kpi, explore_mun, explore_slug, selectedValues, selectedNames)
.then((data) => {
console.log(data);
var bURL = "{{app.request.getBasePath() }}";
var href = bURL + "/documents/" + data;
location = href;
}).then(
//si hay que eliminar el archivo generado ---> here
);
}
// --------------------- Card ------------------------------- //
async function viewCard(id){
$("#infoview2").hide();
$('.viewfindergroup').hide();
$('#card_view').show();
let fachada = document.getElementById('img_fachada');
let catastro = document.getElementById('img_catastro');
let txt_build = document.getElementById('txt_build');
let build_indicators = document.getElementById('build_indicators');
let size = fachada.offsetWidth;
fachada.style.height = size + 'px';
catastro.style.height = size + 'px';
var imagenAlternativa = explore_baseUrl + '/img/img_bk_building.jpg';
let img_fachada = '<img class="img-fluid" src="https://ovc.catastro.meh.es/OVCServWeb/OVCWcfLibres/OVCFotoFachada.svc/RecuperarFotoFachadaGet?ReferenciaCatastral=' + id + '" width="auto" height="'+size+'px" onerror="this.onerror=null; this.src=\''+ imagenAlternativa + '\';" />';
let img_catastro = '<img class="img-fluid" src="https://www1.sedecatastro.gob.es/Cartografia/GeneraGraficoParcela.aspx?del=8&mun=279&refcat=' + id + '&AnchoPixels=500&AltoPixels=500" width="auto" height="'+size+'px" onerror="this.onerror=null; this.src=\''+ imagenAlternativa + '\';" />';
document.getElementById('img_fachada').innerHTML = img_fachada;
document.getElementById('img_catastro').innerHTML = img_catastro;
let buildData = await caller.getBuildData(id);
// console.log(buildData);
let UseValue = '';
let valuesContent = '';
if (buildData.use_numeric == 0) {
UseValue = 'SFH';
} else {
UseValue = 'MFH';
}
valuesContent += '<p style="font-size: 14px; "><b>{{"Referencia catastral" |trans}}:</b> <span style="color:#222222; padding-left: 15px;">' + buildData.inspireid + '</span></p>';
valuesContent += '<p style="font-size: 14px; "><b>{{"Año de construcción" |trans}}:</b> <span style="color:#222222; padding-left: 15px;">' + buildData.year + '</span></p>';
valuesContent += '<p style="font-size: 14px; "><b>{{"Uso" |trans}}:</b> <span style="color:#222222; padding-left: 15px;">' + UseValue + '</span></p>';
valuesContent += '<p style="font-size: 14px; "><b>{{"Plantas" |trans}}:</b> <span style="color:#222222; padding-left: 15px;">' + buildData.num_floors + '</span></p>';
valuesContent += '<p style="font-size: 14px; "><b>{{"Superficie" |trans}}:</b> <span style="color:#222222; padding-left: 15px;">' + buildData.grossfloorarea + '</span></p>';
document.getElementById('txt_build').innerHTML = valuesContent;
// console.log(kpi_list);
build_indicators.innerHTML = '';
for(let i=0; kpi_list.length > i; i++){
// console.log(kpi_list[i].slug);
let buildDataFiltered = Object.keys(buildData).filter((key) => key === kpi_list[i].slug).map((key) => buildData[key]);
//console.log(kpi_list[i]);
if(kpi_list[i].name != 'Todos'){
var styleBox = "";
var grafica = "";
if (kpi_list[i].name == "año de construcción" || kpi_list[i].name == "área" || kpi_list[i].name == "uso")
styleBox = "bk_box--color";
if ( $("#statline_id_"+kpi_list[i].id) ){
let contenido = $("#statline_id_"+kpi_list[i].id).html(); // Obtiene el HTML
let tempDiv = $("<div>").html(contenido); // Lo convierte en un objeto jQuery
tempDiv.find("p").hide();
tempDiv.find(".statsline_range").removeClass("d-none");
tempDiv.find(".statsline_range").css({
"position": "relative",
"font-size": "12px",
"color": "#7a7a7a",
//"top": "-10px"
});
let maxValue = $("#statline_id_"+kpi_list[i].id).data("max");
let minValue = $("#statline_id_"+kpi_list[i].id).data("min");
let per = Math.ceil(((buildDataFiltered[0]) - minValue)/(maxValue - minValue) * 100);
tempDiv.find(".statsline_item").css("left", per+"%");
grafica = tempDiv.html();
} else grafica = "";
let dataNumber = "";
if (buildDataFiltered[0] == null){
if (window.appLocale == 'ca') dataNumber = "No hi han dades";
else if (window.appLocale == 'en') dataNumber = "No data";
else dataNumber = "No hay datos";
}
else if (kpi_list[i].name != "año de construcción"){
numero = Number.parseFloat(buildDataFiltered[0]);
dataNumber = numero.toLocaleString("es-ES");
}else dataNumber = buildDataFiltered[0];
if (kpi_list[i].name == "uso" && buildDataFiltered[0] == 0){
if (window.appLocale == 'ca') dataNumber = "Unifamiliar";
else if (window.appLocale == 'en') dataNumber = "Unifamiliar";
else dataNumber = "Unifamiliar";
}
else if (kpi_list[i].name == "uso" && buildDataFiltered[0] == 1){
if (window.appLocale == 'ca') dataNumber = "Plurifamiliar";
else if (window.appLocale == 'en') dataNumber = "Plurifamiliar";
else dataNumber = "Plurifamiliar";
}
if (window.appLocale == 'ca')
{
var kpiName = kpi_list[i].name_ca;
var KpiInfo = kpi_list[i].info_ca;
}else if (window.appLocale == 'en') {
var kpiName = kpi_list[i].name_en;
var KpiInfo = kpi_list[i].info_en;
}else{
var kpiName = kpi_list[i].name;
var KpiInfo = kpi_list[i].info;
}
build_indicators.innerHTML += '<div class="col-6 col-sm-3 d-flex"><div class="bk_box '+styleBox+' p-3 w-100 d-flex flex-column"><div class="mb-2 d-flex justify-content-between align-items-baseline" style="height: 58px;"><p class="fw-bold mb-2" style="font-size: 14px; line-height: 18px; max-width: 70%;">'+ capitalizeFirstLetter(kpiName) +'</p><p style="font-weight:600; "><span style="font-size:16px; color:#6E93F6;"> '+ dataNumber +'</span></p></div><div class="d-flex justify-content-between mb-2"><div style="width: 100%;">'+grafica+'</div></div><p class=" mb-2 boxed_limited" onclick="activeClass(this)" >'+ KpiInfo +'</p></div></div>';
}
}
}
function formatearNumero(numero) {
//return numero;
if(typeof numero === 'number'){
numero = numero.toString();
numero = Number.parseFloat(numero);
return numero.toLocaleString("es-ES");
// return numero.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}else if(numero === null){
return numero;
}else{
// console.log(numero);
numero = Number.parseFloat(numero);
return numero.toLocaleString("es-ES");
}
}
function hideCardOnData(){
document.getElementById('info_window').innerHTML = '';
}
// --------------------- Fn OK ------------------------------- //
function updateMapFromDiv(a){
let indArr = [{'kpi': parseInt(a)}];
let divi = document.getElementById('statline_id_' + a);
let alldivi = document.getElementsByClassName('grayscale');
for(let i=0; alldivi.length > i; i++){
alldivi[i].classList.remove('kpi_selected');
alldivi[i].classList.remove('disabled');
}
divi.classList.add('kpi_selected');
divi.classList.add('disabled');
explore_kpi = divi.getAttribute('data-kpi');
explore_slug = divi.getAttribute('data-slug');
rPlatform.setiSelected(indArr);
rPlatform.setiActive();
rPlatform.updateMap();
// console.log(indArr);
this.selectedIndicator(divi);
this.updateTable(explore_slug);
//this.selectedDiv();
}
function updateMapFromStat(a){
let indArr = [{'kpi': parseInt(a)}];
let slug = '';
let name = '';
if(a == 100){
slug = 'statYearBox';
name = 'Año de construcción';
}else if(a == 101){
slug = 'statAreaBox';
name = 'Área';
}else if(a == 104){
slug = 'statOccupationBox';
name = 'Porcentaje de ocupación';
}else if(a == 105){
slug = 'statUseBox';
name = 'Uso del edificio';
}
let divi = document.getElementById(slug);
var selectedBox = document.getElementById('selected_box_content');
// selectedBox.innerHTML = divi.outerHTML;
let html = '<h6>'+name+'</h6>';
// selectedBox.insertAdjacentHTML("afterbegin", html);
rPlatform.setiSelected(indArr);
rPlatform.setiActive();
rPlatform.updateMap();
}
function updateTable(slug){
let kpiArray = ['kpi_1_energy_renovated_residential_buildings', 'kpi_2_final_energy_consumption', 'kpi_3_renewable_energy_consumption', 'kpi_4_pv_potential_generation', 'kpi_7_heating_energy_consumption', 'kpi_8_ghg_emissions', 'kpi_19_population_income_below_60_average', 'kpi_20_median_household_income', 'kpi_21_average_price_renting_compared_family_income', 'kpi_22_house_price', 'kpi_27_urban_equipment_at_15_min', 'kpi_28_accessibility_to_bike_lane', 'kpi_30_green_area_surfaces', 'kpi_31_vulnerability_heatwaves_temperature_rise', 'kpi_36_charging_outlets', 'kpi_6_2_energy_efficient_and_energy_recovering_homes', 'kpi_6_1_energy_efficient_and_energy_recovering_homes', 'inspireid']
// Seleccionar todas las columnas con slug
for(let i=0; kpiArray.length > i;i++){
let celda = document.querySelectorAll('#wrapper .gridjs-table [data-column-id='+kpiArray[i]+']');
for(let j=0; celda.length > j;j++){
celda[j].classList.add('d-none');
}
}
// Seleccionar las celdas de nuestro slug
let celdaSlug = document.querySelectorAll('#wrapper .gridjs-table [data-column-id='+slug+']');
for(let j=0; celdaSlug.length > j;j++){
celdaSlug[j].classList.remove('d-none');
celdaSlug[j].classList.add('selected');
}
// console.log('updateTable',slug);
}
function selectedIndicator(a){
var dataDiv = '';
var selectedBox = document.getElementById('selected_box_content');
var linestat = a.getElementsByClassName('statsline');
var titlestat = a.getElementsByClassName('title');
var p = parseFloat(a.getAttribute('data-p')).toFixed(2);
var m = parseFloat(a.getAttribute('data-m')).toFixed(2);
var r = parseFloat(a.getAttribute('data-r')).toFixed(2);
var max = parseFloat(a.getAttribute('data-max'));
// Si hay datos completos pintamos los pins en el indicador seleccionado
if (p !== null && m !== null && r !== null){
var dato_p = detres(p,max);
var dato_m = detres(m,max);
var dato_r = detres(r,max);
var pinDiv = '<span class="statsline_item_extra" style="left: '+dato_p+'%;"><i class="fa-solid vert_bar" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="Provincia '+p+'"></i><span class="pindata">P</span></span> <span class="statsline_item_extra" style="left: '+dato_m+'%;"><i class="fa-solid vert_bar" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="Municipio '+m+'"></i><span class="pindata">M</span></span> <span class="statsline_item_extra" style="left: '+dato_r+'%;"><i class="fa-solid vert_bar" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-custom-class="custom-tooltip" data-bs-title="Región '+r+'"></i><span class="pindata">R</span></span> ';
var elemento = linestat[0];
// elemento.insertAdjacentHTML('beforeend', pinDiv);
dataDiv = titlestat[0].outerHTML + elemento.outerHTML;
// selectedBox.innerHTML = dataDiv;
}else{
dataDiv = titlestat[0].outerHTML + linestat[0].outerHTML;
// selectedBox.innerHTML = dataDiv;
}
let titleAttribute = a.getAttribute('data-bs-title');
let descAttribute = a.getAttribute('data-bs-content');
// selectedBox.setAttribute("data-bs-title", titleAttribute);
// selectedBox.setAttribute("data-bs-content", descAttribute);
$('[data-bs-toggle="popover_live_top"]').mouseover(function(){
$('[data-bs-toggle="popover_live_top"]').popover();
});
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover_live_top"]')
const popovertipList = [...popoverTriggerList].map(item => new bootstrap.Popover(item));
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl));
}
function detres(value,max){
let dato = (value*100)/max;
return dato.toFixed(2);
}
function updateMap(){
var selectElement = document.querySelector('#kpi_selector');
var kpi_id = selectElement.value;
let indArr = [{'kpi': parseInt(kpi_id)}];
rPlatform.setiSelected(indArr);
rPlatform.setiActive();
rPlatform.updateMap();
var iActive = rPlatform.getiActive();
updateSelector(iActive)
}
// --------------------- Simple Fn OK ------------------------------- //
function updateSelector(kpi){
var selector = document.getElementById('kpi_selector');
selector.value = kpi;
}
function loadUrlBack(){
let url = explore_baseUrl + "/" + explore_mun ;
window.location.href = url;
}
function gotoproject(){
let url = '';
url = explore_baseUrl + "/" + explore_mun + "/plan";
window.location.href = url;
}
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
function viewFinder(a){
$('.viewfindergroup').hide();
$('#'+ a +'_view').show();
if(a == 'map' || a == 'data')
{
$("#infoview2").show();
}else{
$("#infoview2").hide();
}
if(a == 'data'){
tableData();
}
console.log(a);
[...document.querySelectorAll('.left_bar_button')].map(x => x.classList.remove('active'));
document.getElementById('left_bar_button_'+a).classList.add('active');
}
function centerViewMap(){
var zoom = rPlatform.getZoom();
rPlatform.setCenterView(initGeo);
}
function expandIcon(e){
var elemento = document.getElementById(e);
var textoExtraido = elemento.innerText;
if (textoExtraido == 'expand_more'){
elemento.innerText = 'expand_less';
}else{
elemento.innerText = 'expand_more';
}
}
function infoviewToggle(){
if($('#infoview2').hasClass('show')){
$('#infoview2').collapse('hide');
$('#infoview').addClass('w-100');
$('#expand .material-symbols-outlined').text('collapse_content');
}else{
$('#infoview2').collapse('show');
$('#infoview').removeClass('w-100');
$('#expand .material-symbols-outlined').text('expand_content');
}
}
function activeClass(elem){
var elemento = $(elem);
elemento.toggleClass('active');
}
</script>
<script>
$(document).ready(function(){
document.getElementById('big_container').classList.add('full');
var headerInTop = document.getElementById('header_in_top').offsetHeight;
var containerInContent = document.getElementById('container_in_content').offsetHeight;
var headerContentInfoTop = document.getElementById('header_content_info_top').offsetHeight;
var bigContainer = document.getElementById('big_container').offsetHeight;
var containerInContentTotal = bigContainer - headerInTop;
var containerSteps = bigContainer - headerInTop - headerContentInfoTop;
document.getElementById('container_in_content').style.height = containerInContentTotal + 'px';
document.getElementById('infoview_content').style.height = containerInContentTotal + 'px';
document.getElementById('analytic_step').style.height = containerInContentTotal + 'px';
var divs = document.querySelectorAll('.infoview_div');
for(let i=0; divs.length > i; i++){
divs[i].style.height = containerSteps + 'px';
}
var divs2 = document.querySelectorAll('.infoview2_div');
for(let i=0; divs2.length > i; i++){
divs2[i].style.height = containerSteps + 'px';
}
var divsIn = document.querySelectorAll('.viewfindergroup');
for(let i=0; divsIn.length > i; i++){
divsIn[i].style.height = containerSteps + 'px';
}
let flashDiv = document.querySelector('.flash-notice');
if(flashDiv){
setTimeout(()=>{
flashDiv.remove();
},10000);
}
});
function removeDiv(id){
let divi = document.getElementById(id);
divi.remove();
}
</script>
{% endblock %}