greenelab/adage-server

View on GitHub
interface/src/app/tribe_client/genesets.js

Summary

Maintainability
B
4 hrs
Test Coverage
angular.module('adage.tribe_client.genesets', [
  'adage.tribe_client.resource',
  'adage.gene.resource',
  'adage.utils'
])

// Wrapping component that houses the genesetSearchBar and the
// genesetResultTable.
.component('genesetSearchForm', {
  templateUrl: 'tribe_client/geneset-search-form.tpl.html',
  bindings: {
    organism: '@',
    mlModel: '@'
  },
  controller: ['$state', 'CommonGeneFuncts',
    function($state, CommonGeneFuncts) {
      var self = this;

      // Number of results (in this case genesets) to come back
      // in each response page.
      self.limit = 10;
      self.sendToNetwork = function() {
        self.selectedGenes = {};

        var genes = self.selectedGeneset.geneObjs;
        for (var i = 0; i < genes.length; i++) {
          self.selectedGenes[genes[i].id] = genes[i];
        }
        CommonGeneFuncts.sendToNetwork(self, $state);
      };
    }
  ]
})

// Search box for users to enter their search text into
// and go search Tribe genesets.
.component('genesetSearchBar', {
  templateUrl: 'tribe_client/geneset-search-bar.tpl.html',
  bindings: {
    limit: '@',
    organism: '@',
    genesets: '='
  },
  controller: ['$log', 'Genesets', 'Gene', 'errGen',
    function($log, Genesets, Gene, errGen) {
      var self = this;

      self.search = {};

      self.searchGenesets = function() {
        self.searchStatus = 'Searching for gene sets...';
        var qparams = {
          'query': self.search.query,
          'organism__scientific_name': self.organism,
          'limit': self.limit
        };

        Genesets.query(qparams,
          function success(data) {
            self.genesets = [];
            var returnedGenesets = data.objects;
            angular.forEach(returnedGenesets, function(geneset) {
              var entrezIds = geneset.tip.genes.join(',');
              Gene.get({'entrezid__in': entrezIds},
                function success(response) {
                  self.searchStatus = null;
                  geneset.geneObjs = response.objects;
                  self.genesets.push(geneset);
                },
                function error(errResponse) {
                  self.searchStatus = null;
                  var errMessage = errGen('Failed to get Gene information',
                                          errResponse);
                  $log.error(errMessage);
                  self.geneQueryStatus = errMessage +
                                         '. Please try again later.';
                }
              );
            });
          },
          function error(errResponse) {
            self.searchStatus = null;
            var errMessage = errGen('Failed to retrieve gene sets from Tribe',
                                    errResponse);
            $log.error(errMessage);
            self.genesetQueryStatus = errMessage + '. Please try again later.';
          }
        );
      };
    }
  ]
})

// Directive for table containing search results
.component('genesetResultTable', {
  templateUrl: 'tribe_client/geneset-result-table.tpl.html',
  bindings: {
    limit: '@',
    genesets: '=',
    selectedGeneset: '='
  },
  controller: ['CommonGeneFuncts', function(CommonGeneFuncts) {
    var self = this;
    // TODO: Implement pagination for geneset search results in
    // case the number of results ($scope.genesetResultCount above)
    // is greater than this 'limit' parameter (the maximum number of
    // geneset results that the Tribe API should return at once).

    self.selectedGeneset = {};

    self.getGeneLabelList = function(geneList) {
      var geneLabelList = geneList.map(function(gene) {
        return CommonGeneFuncts.getGeneLabel(gene);
      }).join(' ');
      return geneLabelList;
    };
  }]
})

;