Skip to content
Snippets Groups Projects
DataTable.vue 15.3 KiB
Newer Older
<template>
moon's avatar
moon committed
  <div>
    <a ref="download" />
    <table
      :id="id"
      class="table table-striped table-bordered table-hover"
      width="100%"
    />
  </div>
</template>

<script>
  const _ = require('lodash');
  const $ = window.jQuery = require('jquery');
  require('./js/datatable');

  let table;

  function getRating(data) {
moon's avatar
moon committed
    const rating = data;
    const r = ['<div style="white-space: nowrap;">']
    for (let i = 0; i < 5; i++) {
      if (i < rating) {
moon's avatar
moon committed
        if (rating - i === 0.5) {
          r.push('<span class="fa fa-star-half-o checked"/>');
        } else {
          r.push('<span class="fa fa-star checked"/>');
        }
moon's avatar
moon committed
        r.push('<span class="fa fa-star"/>');
  //import StarRating from "vue-star-rating"

  export default {
moon's avatar
moon committed
    name: 'DataTable',
    props: ['id', 'data', 'keyword', 'category'],
moon's avatar
moon committed
    mounted() {
      const vm = this;
      vm.createTable(vm.id, vm.data);
      // console.log('in data table condensate data', vm.data);
moon's avatar
moon committed
    },
    // watch: {
    //   selectedItem: function update(newValue) {
    //     const vm = this;
    //
    //     switch (newValue) {
    //       case 'Genes':
    //       default:
    //         vm.createTable(vm.id, vm.data);
    //     }
    //   },
    // },
    methods: {
      moveDetailPage(id) {
        const vm = this;

moon's avatar
moon committed
        const url = vm.category === 'protein' ? `/protein/${id}` : `/condensate/${id}`
        // eslint-disable-next-line
        // console.log(url)
        vm.$router.push(url)
        // window.location = url
        // window.open(url)
      },
      createTable(id, data) {
        const vm = this;

        _.forEach(data, (d) => {
moon's avatar
moon committed
          d.DT_RowID = vm.category === 'protein' ? `${d.proteinId}` : `${d.canonical_id}`;
        });

        const proteinColumns = [
          {
            title: 'Uniprot',
            data: 'uniprot_id',
            // visible: false,
            // fnCreatedCell: (nTd, sData, oData) => {
            //   $(nTd).html(`<a href="" class="detail-link gene"><i class="glyphicon glyphicon-list-alt"></i> </a>`);
            // },
            // render: function ( data, type, row, meta ) {
            //   return data + ' (' + row.uniprot_readable_id + ')';
            // }
            fnCreatedCell: (nTd, sData, oData) => {
              let n = `${oData.uniprot_id} (${oData.uniprot_readable_id})`;
              if(vm.keyword) {
                n.replace(new RegExp(vm.keyword, 'gi'), `<mark>$&</mark>`);
              }
              $(nTd).html(`<a href="" class="detail-link"> ${n}</a>`);
            },
          },
          {
            title: 'Gene Name',
            data: 'gene_name',
            fnCreatedCell: (nTd, sData, oData) => {
              let n = `${oData.gene_name ? oData.gene_name : 'N/A'}`;
              if(vm.keyword) {
                n = n.replace(new RegExp(vm.keyword, 'gi'), `<mark>$&</mark>`);
              }
              $(nTd).html(`${n}`);
            },
          },
          {
            title: 'Name',
            data: 'name',
            fnCreatedCell: (nTd, sData, oData) => {
              let n = oData.name !== null ? `${oData.name}`: '';
              if(vm.keyword) {
                n = n.replace(new RegExp(vm.keyword, 'gi'), `<mark>$&</mark>`);
              }
              $(nTd).html(`${n}`);
            },
          {
            title: 'Functional Type',
            data: 'functional_type',
            render: function ( data, type, row, meta ) {
              return data;
            }
          },
          {
            title: 'Species',
            data: 'species_name',
            render: function ( data, type, row, meta ) {
              return data + ' (' + row.species_tax_id + ')';
            }
          },
          // {
          //   title: 'Evidence Stars',
          //   className: "text-nowrap",
          //   data: 'condensates',
          //   render: function ( data, type, row, meta ) {
          //     if(row.condensates) {
          //       return getRatingValue(_.flatMap(row.condensates, c => c.data_sources));
          //     }
          //     return '';
          //   },
          //   fnCreatedCell: (nTd, sData, oData) => {
          //     let data = _.flatMap(sData, c => c.data_sources);
          //     if(data) {
          //       $(nTd).html(getRating(data).join('\n'));
          //     }
          //   }
          // },
        ];

        const condensateColumns = [
          {
            title: 'Name',
            data: 'name',
            fnCreatedCell: (nTd, sData, oData) => {
              if(vm.keyword) {
                let n = `${oData.name}`.replace(new RegExp(vm.keyword, 'gi'), `<mark>$&</mark>`);
                $(nTd).html(`<a href="" class="detail-link"> ${n}</a>`);
              } else {
                $(nTd).html(`<a href="" class="detail-link"> ${oData.name}</a>`);
              }
            title: 'Proteins',
            data: 'proteins',
            fnCreatedCell: (nTd, sData, oData) => {
              // console.log(sData)
              if(sData) {
                $(nTd).html(sData.length > 4 ? sData.splice(0, 4).join(', ') + ' ...' : sData.join(', '));
              }
            }
          },
          {
            title: 'No. Proteins',
            render: function ( data, type, row, meta ) {
           {
            title: 'Species',
            data: 'species_name',
HongKee Moon's avatar
HongKee Moon committed
            render: function ( data, type, row, meta ) {
              return data + ' (' + row.species_tax_id + ')';
          {
            title: 'Evidence Stars',
            data: 'confidence_score',
            defaultContent:`0`,
moon's avatar
moon committed
            render: function ( data, type, row, meta ) {
              return data;
            },
            fnCreatedCell: (nTd, sData, oData) => {
              // console.log(sData)
              if(sData) {
                $(nTd).html(getRating(sData).join('\n'));
              } else {
                $(nTd).html(getRating(0).join('\n'));
              }
            }
          //   title: 'Localization',
          //   render: function ( data, type, row, meta ) {
          //     return '(placeholder)';
          //   }
          // },
HongKee Moon's avatar
HongKee Moon committed
          // {
          //   title: 'Species',
          //   data: 'species_name',
          //   render: function ( data, type, row, meta ) {
          //     return data + ' (' + row.species_tax_id + ')';
          //   }
          // },
moon's avatar
moon committed
        const columns = vm.category === 'protein' ? proteinColumns : condensateColumns;

        // console.log(columns)

moon's avatar
moon committed
        const doms = vm.category === 'protein' ? '<"row"<"col-sm-3"f><"#function_filter.col-sm-3"><"col-sm-6"p>><"row"t><"row"<"col-sm-4"i><"col-sm-8"p>>' : '<"row"<"col-sm-3"f><"col-sm-9"p>><"row"t><"row"<"col-sm-4"i><"col-sm-8"p>>';
        const nTableOptions = {
          columns,
          // aaSorting: [[ 0, 'asc' ]],
          paging: true,
          searching: true,
          info: true,
          data,
          order: [], // order: [[0, 'asc']],
          bDestroy: true, // Add this property to new setting,
          oLanguage: {
moon's avatar
moon committed
            sSearch: 'Filter',
          dom: doms,
          initComplete: function () {
moon's avatar
moon committed
            if(vm.category === 'protein') {
              this.api().columns([3]).every( function () {
                // console.log(this);
                let column = this;
                let select = $('<select class="form-control input-sm"><option value=""></option></select>')
                    .appendTo( $('#function_filter').empty() )
                    .on( 'change', function () {
                      var val = $.fn.dataTable.util.escapeRegex(
                          $(this).val()
                      );

                      column
                          .search( val ? val === 'null' ? '^\\s*$' : '^'+val+'$' : '', true, false )
                          .draw();
                    } );

moon's avatar
moon committed
                $( '<label>Functional Type</label>' ).prependTo( '#function_filter' );

                column.data().unique().sort().each( function ( d, j ) {
                  if( d === null) {
                    select.append( '<option value="'+d+'">unknown</option>' )
                  } else {
                    select.append( '<option value="'+d+'">'+d+'</option>' )
                  }
                } );
              } );
            }
          },
        };

        const tableId = `#${id}`;
        if (table) {
          table.destroy();
          $(tableId).empty();
        }

        table = $(tableId).DataTable(nTableOptions);

        // $("#download").html('<div style="text-align: right;"><div class="dropdown">\n' +
        //   '  <button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n' +
        //   '    Download\n' +
        //   '  </button>\n' +
        //   '  <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">\n' +
        //   '    <a class="dropdown-item" href="#" ref="csv">CSV</a>\n' +
        //   '    <a class="dropdown-item" href="#" ref="tsv">TSV</a>\n' +
        //   '    <a class="dropdown-item" href="#" ref="json">JSON</a>\n' +
        //   '  </div>\n' +
        //   '</div></div>');

        const tableBody = `${tableId} tbody`;

        $(tableBody).on('click', 'tr td a.detail-link', (e) => {
          e.preventDefault()
          const tr = $(e.target).parent().parent();
          const row = table.row(tr);
          // console.log(row.data().proteinName)
moon's avatar
moon committed
          if (vm.category === 'protein') {
            vm.moveDetailPage(row.data().uniprot_id);
          } else {
            vm.moveDetailPage(row.data().canonical_id);
          }
        });

        // $('#download').on('click', 'a.dropdown-item', (e) => {
        //   e.preventDefault()
        //   switch ($(e.target).text()) {
        //     case 'CSV':
        //       vm.downloadCsv(); break;
        //     case 'TSV':
        //       vm.downloadTsv(); break;
        //     case 'JSON':
        //       vm.downloadJson(); break;
        //   }
        // });
      },
      // downloadCsv() {
      //   const vm = this;
      //   let exports = [];
      //
      //   let header = ['Gene', 'GO Terms', 'Description', 'Phenotypic Top Matches'];
      //   exports.push(header.join(', '));
      //
      //   _.forEach(vm.data, item => {
      //     let goTerms = [];
      //     _.each(item.gos, (i) => {
      //       goTerms.push(`${i[1]}(${i[0]})`)
      //     })
      //
      //     let tophits = [];
      //     _.each(item.em_tophits, (i) => {
      //       tophits.push(`${i}`)
      //     })
      //     _.each(item.ee_tophits, (i) => {
      //       tophits.push(`${i}`)
      //     })
      //     _.each(item.gm_tophits, (i) => {
      //       tophits.push(`${i}`)
      //     })
      //
      //     exports.push([item.locusName, `"${goTerms.join('\t')}"`, `"${item.description}"`, tophits.join('\t')].join(','));
      //   })
      //
      //   let blob = new Blob([exports.join('\n')], {type: 'text/csv'})
      //
      //   let contentDisposition = 'Content-Disposition: attachment; filename="download-data.csv"'
      //   let filename = contentDisposition.split('filename=')[1]
      //   filename = filename.replace(/"/g, '')
      //
      //   let link = vm.$refs.download
      //   link.href = window.URL.createObjectURL(blob)
      //   link.download = filename
      //   link.click()
      // },
      // downloadTsv() {
      //   const vm = this;
      //   let exports = [];
      //
      //   let header = ['Gene', 'GO Terms', 'Description', 'Phenotypic Top Matches'];
      //   exports.push(header.join('\t'));
      //
      //   _.forEach(vm.data, item => {
      //     let goTerms = [];
      //     _.each(item.gos, (i) => {
      //       goTerms.push(`${i[1]}(${i[0]})`)
      //     })
      //
      //     let tophits = [];
      //     _.each(item.em_tophits, (i) => {
      //       tophits.push(`${i}`)
      //     })
      //     _.each(item.ee_tophits, (i) => {
      //       tophits.push(`${i}`)
      //     })
      //     _.each(item.gm_tophits, (i) => {
      //       tophits.push(`${i}`)
      //     })
      //
      //     exports.push([item.locusName, goTerms.join(', '), item.description, tophits.join(', ')].join('\t'));
      //   })
      //
      //   let blob = new Blob([exports.join('\n')], {type: 'text/tsv'})
      //
      //   let contentDisposition = 'Content-Disposition: attachment; filename="download-data.tsv"'
      //   let filename = contentDisposition.split('filename=')[1]
      //   filename = filename.replace(/"/g, '')
      //
      //   let link = vm.$refs.download
      //   link.href = window.URL.createObjectURL(blob)
      //   link.download = filename
      //   link.click()
      // },
      // downloadJson() {
      //   const vm = this;
      //   let blob = new Blob([JSON.stringify(vm.data, null, 2)], {type: 'application/json'})
      //
      //   let contentDisposition = 'Content-Disposition: attachment; filename="download-data.json"'
      //   let filename = contentDisposition.split('filename=')[1]
      //   filename = filename.replace(/"/g, '')
      //
      //   let link = vm.$refs.download
      //   link.href = window.URL.createObjectURL(blob)
      //   link.download = filename
      //   link.click()
      // },
    },
  };
</script>

<style>

    .no-padding {
        padding: 0;
    }

    .checked {
      color: orange;
    }

    .gene {
        font-size: large;
    }

    table.pheno {
        width: 330px;
    }

    td.pheno-title {
        text-align: center;
    }
    td.pheno {
        width: 33%;
        border-top: none;
        border-bottom: none;
        text-align: center;
        vertical-align: middle;
        font-size: small;
        word-wrap: break-spaces;
    }

    td.pheno-item {
        width: 33%;
        text-align: center;
        border-width: 0 1px;
        word-wrap: break-word;
    }

    .table thead td.pheno {
        border-width: 0 1px;
    }

    table.dataTable.row-border > tbody > tr:first-child > th,
    table.dataTable.row-border > tbody > tr:first-child > td,
    table.dataTable.display > tbody > tr:first-child > th,
    table.dataTable.display > tbody > tr:first-child > td {
        border-top: none;
    }

    table.dataTable.row-border > tbody > tr > th,
    table.dataTable.row-border > tbody > tr > td,
    table.dataTable.display > tbody > tr > th,
    table.dataTable.display > tbody > tr > td {
        border-top: 1px solid #ddd;
    }

    table.dataTable > tbody > tr {
        background-color: #ffffff;
    }

    table.dataTable.row-border > tbody > tr:hover,
    table.dataTable.display > tbody > tr:hover {
        background-color: #f6f6f6;
    }

    .detail-link {
        color: #0065b9;
        font-weight: bold;
    }

    .dropdown-item {
        font-size: 1.2rem;
    }

    select.form-control {
        font-size: 12px;
        padding: 3px 12px;
    }

    .pagination {
        font-size: 1.2rem;
    }

    a mark {
        color: #0065b9;
        padding: 0;
        text-decoration: underline;
        font-style: oblique;
    }

    div#function_filter label {
      font-weight: normal;
      text-align: left;
      margin-right: 10px;
    }
</style>