1function onloadComponent(rootSite, dato, lastlevel) { 2 graficoBilancio(rootSite, dato, lastlevel); 3} 4 5function graficoBilancio(rootSite, dato, lastlevel) { 6 var ctx = jQuery("#myChart, #myCharttime").get(0).getContext("2d"); 7 var originalData = dato; 8 9 const tooltipFunction = function (tooltipModel) { 10 // Tooltip element 11 const tooltipEl = document.getElementById("chartjs-tooltip"); 12 13 // Nascondi il tooltip se non è visibile 14 const tooltip = tooltipModel; 15 if (tooltip.opacity === 0) { 16 tooltipEl.style.opacity = 0; 17 return; 18 } 19 20 // Imposta il contenuto del tooltip 21 // Imposta il contenuto del tooltip 22 if (tooltip.body) { 23 const titleLines = tooltip.title || []; 24 const bodyLines = tooltip.body.map((b) => b.lines); 25 26 // Aggiungi dati personalizzati 27 const dataIndex = tooltip.dataPoints[0].index; 28 const datasetIndex = tooltip.dataPoints[0].datasetIndex; 29 30 const additionalData = 31 this._chart.config.data.datasets[datasetIndex].numericLabel[dataIndex]; 32 const title = 33 this._chart.config.data.datasets[datasetIndex].label[dataIndex]; 34 let innerHtml = "<thead>"; 35 36 innerHtml += `<tr><th>${title}</th></tr>`; 37 38 innerHtml += "</thead><tbody>"; 39 bodyLines.forEach((body, i) => { 40 const colors = tooltip.labelColors[i]; 41 const style = `background:${colors.backgroundColor}; border-color:${colors.borderColor}`; 42 const span = `<span style="${style}"></span>`; 43 innerHtml += `<tr><td>${span} ${additionalData}</td></tr>`; 44 }); 45 innerHtml += "</tbody>"; 46 47 tooltipEl.innerHTML = `<table>${innerHtml}</table>`; 48 } 49 50 // Calcola la dimensione del tooltip 51 const tooltipRect = tooltipEl.getBoundingClientRect(); 52 53 const position = this._chart.canvas.getBoundingClientRect(); 54 55 let left = tooltip.caretX + tooltipRect.width + window.scrollX; 56 let top = tooltip.caretY + tooltipRect.height + window.scrollY; 57 58 // Adegua la posizione per evitare che il tooltip vada fuori dal canvas 59 if (left + tooltipRect.width > position.right) { 60 left = tooltip.left; 61 } 62 if (top + tooltipRect.height > position.bottom) { 63 top = tooltip.top; 64 } 65 66 // Applica la posizione calcolata 67 tooltipEl.style.opacity = 1; 68 tooltipEl.style.left = `${left}px`; 69 tooltipEl.style.top = `${top}px`; 70 tooltipEl.style.padding = tooltip.padding + "px " + tooltip.padding + "px"; 71 tooltipEl.style.pointerEvents = "none"; 72 }; 73 74 // Trasforma originalData in array se è un oggetto 75 let dataArray = Array.isArray(originalData) 76 ? originalData 77 : Object.values(originalData); 78 79 const chartData = { 80 labels: dataArray.map((item) => item.label), 81 datasets: [ 82 { 83 data: dataArray.map((item) => parseFloat(item.value)), 84 backgroundColor: dataArray.map((item) => item.color), 85 hoverBackgroundColor: dataArray.map((item) => item.highlight), 86 87 // Aggiungi qui i dati aggiuntivi 88 azione: dataArray.map((item) => item.azione || 0), 89 sezione: dataArray.map((item) => item.sezione || 0), 90 id: dataArray.map((item) => item.id || 0), 91 nv: dataArray.map((item) => item.nv || 0), 92 fv: dataArray.map((item) => item.fv || 0), 93 group: dataArray.map((item) => item.group || 0), 94 anno: dataArray.map((item) => item.anno || 0), 95 haslink: dataArray.map((item) => item.haslink || 0), 96 numericLabel: dataArray.map((item) => item.numericLabel || 0), 97 label: dataArray.map((item) => item.label || ""), 98 }, 99 ], 100 }; 101 102 const options = { 103 legend: false, 104 responsive: false, 105 animation: { 106 animateRotate: true, 107 animateScale: true, 108 easing: "easeInOutExpo", 109 110 onProgress: function (animation) { 111 jQuery(".preloader").toggleClass(); 112 }, 113 onComplete: function (animation) { 114 jQuery(".titolosezionebilancio").css("opacity", "1"); 115 }, 116 }, 117 118 tooltips: { 119 enabled: false, 120 // position: "nearest", 121 custom: tooltipFunction, 122 }, 123 124 cutout: "60%", 125 }; 126 127 grafico = new Chart(ctx, { 128 type: "doughnut", 129 data: chartData, 130 options: options, 131 }); 132 133 jQuery("#myChart").click(function (evt) { 134 var activeElement = grafico.getElementAtEvent(evt); 135 if (activeElement.length > 0) { 136 var firstElement = activeElement[0]; 137 var datasetIndex = firstElement._datasetIndex; 138 var elementIndex = firstElement._index; 139 var dataset = grafico.data.datasets[datasetIndex]; 140 141 // Assumi che ogni attributo (azione, sezione, ecc.) sia un array nel dataset 142 var azione = dataset.azione[elementIndex] || 0; 143 var sezione = dataset.sezione[elementIndex] || 0; 144 var id = dataset.id[elementIndex] || 0; 145 var nv = dataset.nv[elementIndex] || 0; 146 var fv = dataset.fv[elementIndex] || 0; 147 var group = dataset.group[elementIndex] || 0; 148 var anno = dataset.anno[elementIndex] || 0;
149 var haslink = dataset.haslink[elementIndex] || 0; 150 151 if (haslink === 1) { 152 lastlevel = 0; 153 } 154 if (lastlevel !== 1 && group === 0) { 155 window.location.href = 156 "?anno=" + 157 anno + 158 "&sr=" + 159 sezione + 160 "&cap=" + 161 id + 162 "&az=" + 163 azione + 164 "&nv=" + 165 nv + 166 "&fv=" + 167 fv; 168 } 169 // ajaxBilancio(rootSite, id, grafico); // Se necessario 170 } 171 }); 172 173 jQuery("#myCharttime").click(function (evt) { 174 var activeElement = grafico.getElementAtEvent(evt); 175 if (activeElement.length > 0) { 176 var firstElement = activeElement[0]; 177 var datasetIndex = firstElement._datasetIndex; 178 var elementIndex = firstElement._index; 179 var dataset = grafico.data.datasets[datasetIndex]; 180 181 // Assumi che ogni attributo (azione, sezione, ecc.) sia un array nel dataset 182 var azione = dataset.azione[elementIndex] || 0; 183 var sezione = dataset.sezione[elementIndex] || 0; 184 var id = dataset.id[elementIndex] || 0; 185 var nv = dataset.nv[elementIndex] || 0; 186 var fv = dataset.fv[elementIndex] || 0; 187 var group = dataset.group[elementIndex] || 0; 188 var anno = dataset.anno[elementIndex] || 0; 189 var haslink = dataset.haslink[elementIndex] || 0; 190 191 if (haslink === 1) { 192 lastlevel = 0; 193 } 194 if (lastlevel !== 1 && group === 0) { 195 window.location.href = 196 "?anno=" + 197 anno + 198 "&sr=" + 199 sezione + 200 "&cap=" + 201 id + 202 "&az=" + 203 azione + 204 "&nv=" + 205 nv; 206 } 207 // ajaxBilancio(rootSite, id, grafico); // Se necessario 208 } 209 //ajaxBilancio(rootSite, activePoints[0].id, grafico); 210 }); 211} 212 213function alertX(data) { 214 alert(data); 215} 216function _resetChartData(chart, new_segments) { 217 // remove all the segments 218 while (chart.segments.length) { 219 chart.removeData(); 220 } 221 // add the new data fresh 222 jQuery.each(JSON.parse(new_segments), function (segment, index) { 223 chart.addData(index, segment); 224 }); 225} 226 227function ajaxBilancio(rootSite, id, grafico) { 228 var page = rootSite + "modules/mod_bilancio/helper.php"; 229 230 jQuery.get( 231 page, 232 { 233 cap: id, 234 }, 235 function (data) { 236 _resetChartData(grafico, data); 237 238 grafico.update(); 239 } 240 ); 241}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.