github.com/jenkins-x/jx/v2@v2.1.155/pkg/reports/blog_report.go (about)

     1  package reports
     2  
     3  import (
     4  	"io"
     5  	"io/ioutil"
     6  	"strings"
     7  
     8  	"github.com/jenkins-x/jx-logging/pkg/log"
     9  	"github.com/jenkins-x/jx/v2/pkg/util"
    10  )
    11  
    12  type BlogBarReport struct {
    13  	Name       string
    14  	BlogWriter io.Writer
    15  	JSFileName string
    16  	JSLinkURI  string
    17  
    18  	labels []string
    19  	data   []string
    20  }
    21  
    22  func NewBlogBarReport(name string, blogWriter io.Writer, jsFileName string, jsLinkURI string) *BlogBarReport {
    23  	if name == "" {
    24  		name = "barChart"
    25  	}
    26  	if jsLinkURI == "" {
    27  		jsLinkURI = jsFileName
    28  	}
    29  	return &BlogBarReport{Name: name, BlogWriter: blogWriter, JSFileName: jsFileName, JSLinkURI: jsLinkURI}
    30  }
    31  
    32  func (r *BlogBarReport) AddText(name string, value string) {
    33  	r.labels = append(r.labels, `"`+name+`"`)
    34  	r.data = append(r.data, value)
    35  }
    36  
    37  func (r *BlogBarReport) AddNumber(name string, value int) {
    38  	ReportAddNumber(r, name, value)
    39  }
    40  
    41  func (r *BlogBarReport) Render() error {
    42  	err := r.writeBlog()
    43  	if err != nil {
    44  		return err
    45  	}
    46  	js := r.createJs()
    47  	err = ioutil.WriteFile(r.JSFileName, []byte(js), util.DefaultWritePermissions)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	log.Logger().Infof("Generated JavaScript %s", util.ColorInfo(r.JSFileName))
    52  	return nil
    53  }
    54  
    55  func (r *BlogBarReport) writeBlog() error {
    56  	text := `
    57  <canvas id="` + r.elementName() + `" width="400" height="200"></canvas>
    58  <script type="text/javascript" src="` + r.JSLinkURI + `"></script>
    59  </canvas>
    60  `
    61  	_, err := r.BlogWriter.Write([]byte(text))
    62  	return err
    63  }
    64  
    65  func (r *BlogBarReport) createJs() string {
    66  	label := strings.Title(r.Name)
    67  	labelsJs := strings.Join(r.labels, ", ")
    68  	dataJs := strings.Join(r.data, ", ")
    69  	elementId := r.elementName()
    70  	return `var ctx = document.getElementById("` + elementId + `").getContext('2d');
    71  		var ` + elementId + ` = new Chart(ctx, {
    72  		    type: 'bar',
    73  		    data: {
    74  		        labels: [` + labelsJs + `],
    75  		        datasets: [{
    76  		            label: '# of ` + label + `',
    77  		            data: [` + dataJs + `],
    78  		            backgroundColor: [
    79  		                'rgba(255, 99, 132, 0.2)',
    80  		                'rgba(54, 162, 235, 0.2)',
    81  		                'rgba(255, 206, 86, 0.2)',
    82  		                'rgba(75, 192, 192, 0.2)',
    83  		                'rgba(153, 102, 255, 0.2)',
    84  		                'rgba(255, 159, 64, 0.2)'
    85  		            ],
    86  		            borderColor: [
    87  		                'rgba(255,99,132,1)',
    88  		                'rgba(54, 162, 235, 1)',
    89  		                'rgba(255, 206, 86, 1)',
    90  		                'rgba(75, 192, 192, 1)',
    91  		                'rgba(153, 102, 255, 1)',
    92  		                'rgba(255, 159, 64, 1)'
    93  		            ],
    94  		            borderWidth: 1
    95  		        }]
    96  		    },
    97  		    options: {
    98  		        responsive: true,
    99  		        /*
   100  		        scales: {
   101  		            yAxes: [{
   102  		                ticks: {
   103  		                    beginAtZero:true
   104  		                }
   105  		            }]
   106  		        }
   107  		        */
   108  		    }
   109  		});
   110  		`
   111  }
   112  
   113  func (r *BlogBarReport) elementName() string {
   114  	return r.Name + "Chart"
   115  }