jsontypescriptangularjspdfjspdf-autotable

Typescript: How to use drawHeaderRow to create table with horizontal headers?


jsPDF allows to create a table form JSON data and save that table into a PDF document. I have created a Angualr2/Typescript application to do the same. This create table form my JSON data. I'm trying to use jsPDF is create a table with horizontal headers. Example for this given here. Code to create that is as follows.

// Horizontal - shows how tables can be drawn with horizontal headers
examples.horizontal = function () {
  var doc = new jsPDF('p', 'pt');
  doc.autoTable(getColumns().splice(1,4), getData(), {
    drawHeaderRow: function() {
        // Don't draw header row
        return false;
    },
    columnStyles: {
        first_name: {fillColor: [41, 128, 185], textColor: 255, fontStyle: 'bold'}
    }
  });
  return doc;
};

Complete code is available here. This code is written in JavaScript. I'm looking for a way to convert this into Typescript. Does anyone have any idea how to do it?


Solution

  • Your component might look like this:

    @Component({
      selector: 'my-app',
      template: 
        `<h1>JSON to PDF app</h1>
        <div class="container" id="div1">
            <button id="create" (click)="convert('base')">Create file</button> 
            <button id="create" (click)="convert('horizontal')">
               Create file with horizontal table
            </button> 
        </div>
        `
    })
    export class AppComponent {
      cols: Array<any> = [{
          title: "Details",
          dataKey: 'details'
        }, {
          title: "Values",
          dataKey: 'values'
       }];
    
      optionsContainer = {
        base: {},
        horizontal: {
          drawHeaderRow: () => false,
          columnStyles: {
              details: {fillColor: [41, 128, 185], textColor: 255, fontStyle: 'bold'}
          }
        }
      };
    
      rows: Array<any> = [];
    
      constructor() {
        const item = {
          "Name" : "XYZ",
          "Age" : "22",
          "Gender" : "Male"
        }; 
    
        this.rows = Object.keys(item).map((key) => {  
          return { 'details': key, 'values': item[key] };
        });
      }
    
      convert(action){
        const doc = new jsPDF()
           .autoTable(this.cols, this.rows, this.optionsContainer[action]);
        doc.save('Test.pdf');
      }
    }
    

    Demo Plunker