Skip to content
Snippets Groups Projects
stored-results.vue 6.35 KiB
Newer Older
<template>
  <div class="container">
    <h1>R-loop tracker results</h1>

    <pagination ref="pagination" @pageChange="downloadResults">
      <checkable-list ref="resultsList">
        <th slot="header">Sequence/Analyse name</th>
        <th class="text-center" slot="header">
          <sort-toggle @sort="sortResults" crit="finished" :current="currentSort">Created</sort-toggle>
        </th>
        <th class="text-center" slot="header">
          <sort-toggle @sort="sortResults" crit="resultCount" :current="currentSort">Results count</sort-toggle>
        </th>
        <th class="text-center" slot="header">Tags</th>
        <th class="text-center" slot="header">Details</th>
        <th class="text-center" slot="header">Edit</th>
        <th class="text-center" slot="header">Delete</th>

        <span slot="item-name" slot-scope="props">
          {{ props.item.title }}
        </span>

        <template slot-scope="props">
          <td class="text-right">
            <span v-if="props.item.finished">{{ props.item.finished | dateTime }}</span>
            <span v-else class="fa fa-spinner animate"></span>
          </td>
          <td class="text-right">
            <span v-if="props.item.finished">
              {{ props.item.resultCount | number(0) }}
            </span>
          </td>
          <td>
            <b-badge v-for="tag in props.item.tags" :key="tag" pill variant="primary">
              {{ tag }}
            </b-badge>
          </td>
          <td class="text-center">
            <a :href="downloadCSV(props.item)" v-if="downloadToken" class="btn btn-primary btn-sm">
              <span class="fa fa-cube"></span>
            </a>
            <a :href="downloadBED(props.item)" v-if="downloadToken" class="btn btn-primary btn-sm">
              <span class="fa fa-bed"></span>
            </a>
            <router-link
              class="btn btn-primary btn-sm"
              :to="{ name: 'results.rloopr.detail', params: { id: props.item.id } }"
            >
              <span class="fa fa-search"></span>
            </router-link>
          </td>
          <td class="text-center">
            <button class="btn btn-primary btn-sm" @click.stop="editResult(props.item)">
              <span class="fa fa-edit"></span>
            </button>
          </td>
          <td class="text-center">
            <button class="btn btn-danger btn-sm" @click.stop="deleteResult(props.item)">
              <span class="fa fa-trash"></span>
            </button>
          </td>
        </template>

        <p slot="no-items" class="alert alert-warning">
          No results found.
        </p>
      </checkable-list>
    </pagination>

    <button type="button" class="btn btn-default" @click="toggleSelection">
      <i class="fa fa-refresh"></i> Invert selection
    </button>
    <button class="btn btn-danger" @click="deleteResults"><i class="fa fa-trash"></i> Delete selected</button>

    <modal-confirm ref="confirmModal">Really delete results?</modal-confirm>
    <modal-confirm ref="confirmModalMulti">Really delete selected results?</modal-confirm>

    <modal-confirm ref="editModal">
      <template slot="header">
        Modify result
      </template>

      <result-editor v-if="selectedResult" :result="selectedResult" ref="resultEditor"></result-editor>

      <template slot="buttonConfirm">
        Save changes
      </template>
    </modal-confirm>
  </div>
</template>
<script>
import SortToggle from '@/components/core/sort-toggle'
import Formatters from '@/formatters'
import CheckableList from '@/components/core/checkable-list'
import Pagination from '@/components/core/pagination'
import ResultEditor from '@/components/core/result-editor'

/**
 * list of stored result groups
 */
export default {
  data() {
    return {
      selectedResult: null,
      currentSort: {
        crit: 'finished',
        asc: true,
      },
      downloadToken: '',
    }
  },
  methods: {
    downloadResults() {
      this.$http
        .get('analyse/rloopr', {
          params: {
            sort: this.currentSort.crit,
            order: this.currentSort.asc ? 'ASC' : 'DESC',
            pageSize: this.$refs.pagination.getPageSize(),
            pageNumber: this.$refs.pagination.getPageCurrent() - 1,
          },
        })
        .then(response => {
          this.$refs.pagination.setPageCount(response.data.page.totalElements)
          this.$refs.resultsList.setItems(response.data.items)
          this.downloadToken = response.data.downloadToken
        })
    },
    performDelete(result) {
      return this.$http.delete('analyse/rloopr/' + result.id)
    },
    deleteResult(result) {
      this.$refs.confirmModal
        .display()
        .then(() => {
          return this.performDelete(result)
        })
        .then(() => {
          this.downloadResults()
        })
    },
    deleteResults() {
      this.$refs.confirmModalMulti.display().then(() => {
        var checked = this.$refs.resultsList.getCheckedItems()
        var promises = []
        checked.forEach(result => {
          if (result.ui.checked) {
            promises.push(this.performDelete(result))
          }
        })
        Promise.all(promises).then(() => {
          this.downloadResults()
        })
      })
    },
    editResult(result) {
      this.selectedResult = result
      this.$refs.editModal
        .display()
        .then(() => {
          this.$http
            .put('analyse/rloopr/' + result.id + '/tags', {
              tags: this.$refs.resultEditor.getTags(),
            })
            .then(() => {
              this.downloadResults()
            })
        })
        .finally(() => {
          this.selectedResult = null
        })
    },
    sortResults(info) {
      this.currentSort = info
      this.downloadResults()
    },
    toggleSelection() {
      this.$refs.resultsList.toggleSelection()
    },
    downloadCSV(analysisInfo) {
      return `${this.$http.defaults.baseURL}analyse/rloopr/${analysisInfo.id}/rloopr.csv`
    },
    downloadBED(analysisInfo) {
      return `${this.$http.defaults.baseURL}analyse/rloopr/${analysisInfo.id}/rloopr.bedgraph`
    },
  },
  mounted() {
    this.downloadResults()
  },
  components: {
    'sort-toggle': SortToggle,
    'checkable-list': CheckableList,
    pagination: Pagination,
    'result-editor': ResultEditor,
  },
  filters: {
    dateTime: Formatters.dateTime,
    number: Formatters.number,
    sequenceName: Formatters.sequenceName,
  },
}
</script>