Skip to content
Snippets Groups Projects
LlpsTable.vue 4.94 KiB
Newer Older
<template>
    <div>
        <div class="inline-block no-underline font-bold mb-4">
        </div>
        <table :id=id class="table table-striped table-bordered table-hover" width="100%"></table>
    </div>
</template>

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

  let table;

  export default {
    name: 'llps-table',
    props: ['id', 'data'],
    data() {
      return {
      };
    },
    methods: {
      fetchProtein(uniprot_id) {
        // eslint-disable-next-line
        const url = `/protein/${uniprot_id}`
        // // eslint-disable-next-line
        // console.log(url)
        window.open(url)
      },
      forwardUniprot(uniprot_id) {
        // eslint-disable-next-line
        const url = `https://www.uniprot.org/uniprot/${uniprot_id}`
        // // eslint-disable-next-line
        // console.log(url)
        window.open(url)
      },
      createTable(id, data) {
        const vm = this;

        _.forEach(data, (d) => {
          d.DT_RowID = `${d.n}`;
        });

        const columns = [
          {
            title: 'Name',
            data: 'name',
            fnCreatedCell: (nTd, sData, oData) => {
              if (sData) {
                $(nTd).html(`<a href="" class="protein-link"> ${sData}</a>`);
              } else {
                $(nTd).html(`<a href="" class="protein-link"> ${oData.uniprot_id}</a>`);
              }
            },
          },
          {
            title: 'Species',
            data: 'species_name',
            className: "text-nowrap"
          },
          {
            title: 'UniProt',
            data: 'uniprot_id',
            className: "text-nowrap",
            fnCreatedCell: (nTd, sData, oData) => {
              $(nTd).html(`<a href="" class="uniprot-link tooltipped tooltipped-n tooltipped-multiline"
                    aria-label="Clicking this link opens UniProt page."> ${sData} <i class="glyphicon glyphicon-link"></i></a>`);
            },
          },
          {
            title: 'Sequence',
            data: 'sequence',
            className: "text-nowrap",
            fnCreatedCell: (nTd, sData, oData) => {
              $(nTd).html(`<input type="text" value="${sData}">
                    <button class="copy-button" name="${oData.uniprot_id}" id="${oData.uniprot_id}" data-clipboard-text="${sData}"><i class="glyphicon glyphicon-copy"></i> </button>`);
            },
          }
        ];

        const nTableOptions = {
          columns,
          // aaSorting: [[ 0, 'asc' ]],
          lengthMenu: [[10, 25, 50, -1], [10, 25, 50, "All"]],
          paging: true,
          searching: true,
          info: false,
          data,
          order: [], // order: [[0, 'asc']],
          bDestroy: true, // Add this property to new setting,
          oLanguage: {
            sSearch: "Filter",
          },
        };

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

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

        const tableBody = `${tableId} tbody`;

        $(tableBody).on('click', 'tr td a.protein-link', (e) => {
          e.preventDefault()
          const tr = $(e.target).parent().parent();
          const row = table.row(tr);
          vm.fetchProtein(row.data().uniprot_id);
        });

        $(tableBody).on('click', 'tr td a.uniprot-link', (e) => {
          e.preventDefault()
          const tr = $(e.target).parent().parent();
          const row = table.row(tr);
          vm.forwardUniprot(row.data().uniprot_id);
        });
      },
      exportTsv() {
        // const vm = this;
      },
    },
    mounted() {
      const vm = this;
      vm.createTable(vm.id, vm.data);
    },
  };
</script>

<style>
    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;
    }

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

    ul.pagination {
        font-size: 1rem;
    }

    .form-inline .form-control {
        height: 25px;
        line-height: 25px;
        vertical-align: middle;
    }

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

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

    .pagination {
        font-size: 1.2rem;
    }
</style>