rickthewilliams
01/12/2021, 6:58 PMbattk
01/12/2021, 7:07 PMbattk
01/12/2021, 7:08 PMbattk
01/12/2021, 7:10 PMbattk
01/12/2021, 7:15 PMrickthewilliams
01/12/2021, 7:23 PMbattk
01/12/2021, 7:25 PMrickthewilliams
01/12/2021, 7:28 PMbattk
01/12/2021, 7:32 PMbattk
01/12/2021, 7:33 PMrickthewilliams
01/12/2021, 9:12 PMbattk
01/12/2021, 9:32 PMbattk
01/12/2021, 9:38 PMbattk
01/12/2021, 9:42 PMbattk
01/12/2021, 9:44 PMrickthewilliams
01/13/2021, 12:57 AMbattk
01/13/2021, 12:59 AMbattk
01/13/2021, 12:59 AMbattk
01/13/2021, 1:01 AMWatz
01/13/2021, 6:36 AMfunction createStringHTML(dataObject) {
var sHTML = '<html>\n';
sHTML += '<head>\n';
sHTML += '<script src="<https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.bundle.min.js>"></script>\n<script type="text/javascript" src="<https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@0.4.0>"></script>\n';
sHTML += '<style>'
sHTML += '.stat > table {\n';
.....
more style tags...
.....
sHTML += '</style>'
sHTML += '</head>\n';
sHTML += '<body>\n';
sHTML += '<table>'
sHTML += '<tr><td colspan=2 style="padding-top:0.5cm;border-bottom:1px solid black;text-align:center;font-family:sans-serif;font-size:1cm;"><b>Sales Statistics for: </b>' + dataObject.htmlTitle + '</td></tr>'
sHTML += '<tr><td style="width:17cm">'
sHTML += ' <canvas id="ForecastVsBudget" style="width: 17cm; height:10cm;margin: 0 auto"></canvas>\n'
sHTML += ' <canvas id="Bookings" style="width: 17cm; height:8cm;margin: 0 auto"></canvas>\n'
....
a bunch of more html...
....
sHTML += '</td></tr></table>'
sHTML += '</body>\n';
sHTML += '<script type="text/javascript">\n';
sHTML += 'function createCharts(){\n';
sHTML += 'Chart.defaults.global.title.fontSize = 20;\n'
sHTML += 'Chart.defaults.global.title.display = true;\n'
sHTML += 'Chart.defaults.global.tooltips.mode = "index";\n'
sHTML += 'Chart.defaults.global.tooltips.intersect = false;\n'
sHTML += 'Chart.defaults.global.hover.mode = "nearest";\n'
sHTML += 'Chart.defaults.global.hover.intersect = true;\n'
sHTML += 'Chart.defaults.global.elements.line.fill = false;\n'
sHTML += 'Chart.defaults.global.elements.line.borderWidth = 4;\n'
sHTML += 'Chart.defaults.global.elements.line.tension = 0;\n'
sHTML += 'Chart.defaults.scale.gridLines.drawBorder = false;\n'
sHTML += 'Chart.defaults.global.legend.labels.boxWidth = 4;\n'
sHTML += 'Chart.defaults.global.plugins.datalabels.backgroundColor = function(context) {return context.dataset.backgroundColor;};\n'
sHTML += 'Chart.defaults.global.plugins.datalabels.borderRadius = 4;\n';
sHTML += 'Chart.defaults.global.plugins.datalabels.color = "white";\n';
sHTML += 'Chart.defaults.global.plugins.datalabels.font.weight = "bold";\n'
sHTML += 'var options = ' + JSON.stringify(dataObject.bookings) + ';\n';
sHTML += "var ctx = document.getElementById('Bookings').getContext('2d');\n";
sHTML += "new Chart(ctx, options);\n";
sHTML += 'var options = ' + JSON.stringify(dataObject.quotes) + ';\n';
sHTML += "var ctx = document.getElementById('Quotes').getContext('2d');\n";
sHTML += "new Chart(ctx, options);\n";
sHTML += 'var options = ' + JSON.stringify(dataObject.noOrderAndQuotes) + ';\n';
sHTML += "var ctx = document.getElementById('NoOrderAndQuotes').getContext('2d');\n";
sHTML += "new Chart(ctx, options);\n";
sHTML += 'var options = ' + JSON.stringify(dataObject.activitiesChart) + ';\n';
sHTML += "var ctx = document.getElementById('activitiesChart').getContext('2d');\n";
sHTML += "new Chart(ctx, options);\n";
sHTML += 'var options = ' + JSON.stringify(dataObject.productSplit) + ';\n';
sHTML += "options.options.plugins.datalabels = {\n";
sHTML += "color: '#000',\n";
sHTML += "formatter: (value, ctx) => { \n";
sHTML += " var sum = 0; \n";
sHTML += " var dataArr = ctx.chart.data.datasets[0].data; \n";
sHTML += " dataArr.map(data => { \n";
sHTML += " sum += data; \n";
sHTML += " }); \n";
sHTML += ' var percentage = ctx.chart.data.labels[ctx.dataIndex] + "\\n" + (value*100 / sum).toFixed(1)+"%"; \n';
sHTML += " return percentage;}};\n";
sHTML += "var ctx = document.getElementById('ProductSplit').getContext('2d');\n";
sHTML += "new Chart(ctx, options);\n";
sHTML += 'var options = ' + JSON.stringify(dataObject.forecastVsBudget) + ';\n';
sHTML += "options.options.scales = {\n";
sHTML += "xAxes: [{ "
sHTML += " stacked: true, "
sHTML += " gridLines: { display: false },"
sHTML += " }],"
sHTML += ' yAxes: [{\n';
sHTML += ' stacked: true,\n';
sHTML += ' ticks: {\n';
sHTML += ' callback: function(value) {return value.toString().replace(\/\\B(?=(\\d{3})+(?!\\d))/g, " ")+"k";}\n';
sHTML += ' }\n';
sHTML += ' }]\n';
sHTML += "};\n";
sHTML += "options.options.tooltips.callbacks = {\n";
sHTML += " label: function(tooltipItem, data) {\n";
sHTML += ' if(data.datasets[tooltipItem.datasetIndex].label == "Percentage of budget" && tooltipItem.yLabel.toString() != "NaN"){return data.datasets[tooltipItem.datasetIndex].label + ": " + (parseFloat(tooltipItem.yLabel)*100).toFixed(0)+"%";}else if(tooltipItem.yLabel.toString() != "NaN"){return data.datasets[tooltipItem.datasetIndex].label + ": " + tooltipItem.yLabel.toString().replace(\/\\B(?=(\\d{3})+(?!\\d))/g, " ")+"k";}\n';
sHTML += ' }\n';
sHTML += '};\n';
sHTML += "options.options.plugins.datalabels = {\n";
sHTML += ' formatter: (value) => {return value.toString().replace(\/\\B(?=(\\d{3})+(?!\\d))/g, " ")+"k";}\n';
sHTML += "}\n";
sHTML += "var ctx = document.getElementById('ForecastVsBudget').getContext('2d');\n";
sHTML += "new Chart(ctx, options);\n";
sHTML += '}\n';
sHTML += 'setTimeout(createCharts, 30);\n';
sHTML += '</script>\n';
return sHTML;
}
Watz
01/13/2021, 6:36 AMWatz
01/13/2021, 6:37 AMbattk
01/14/2021, 4:35 AMbattk
01/14/2021, 4:36 AMbattk
01/14/2021, 4:39 AMWatz
01/14/2021, 10:33 AMrickthewilliams
01/30/2021, 1:15 AM