KarrLab/datanator_frontend

View on GitHub
src/scenes/BiochemicalEntityDetails/Metabolite/ReactionSearchResultsList.js

Summary

Maintainability
F
4 days
Test Coverage
A
97%
import React, { Component } from "react";
import SearchResultsList from "./SearchResultsList.js";
import { naturalSort } from "~/utils/utils";

export default class ReactionSearchResultsList extends Component {
  getResultsUrl(query, pageCount, pageSize) {
    const indexQueryArg = "sabio_reaction_entries";
    return (
      "ftx/text_search/num_of_index/" +
      "?query_message=" +
      query +
      "&index=" +
      indexQueryArg +
      "&from_=" +
      pageCount * pageSize +
      "&size=" +
      pageSize +
      "&fields=rxn_id&fields=ec-code&fields=enzyme_names&fields=product_names&fields=products&fields=substrate_names&fields=substrates&fields=in_metabolites"
    );
  }

  formatResults(data, organism) {
    const results = data["sabio_reaction_entries"];
    const numResults = data["sabio_reaction_entries_total"]["value"];

    const formattedResults = [];
    for (const result of results) {
      const formattedResult = {};

      // title and description
      let name = result["enzyme_names"][0];
      if (!name || name.toUpperCase() === "NULL") {
        name = null;
      }

      const substrateNames = getParticipant(result["substrate_names"]);
      const productNames = getParticipant(result["product_names"]);
      substrateNames.sort(naturalSort);
      productNames.sort(naturalSort);
      const equation =
        formatSide(substrateNames) + " → " + formatSide(productNames);
      const ecCode = result["ec-code"];

      if (name) {
        formattedResult["title"] =
          name[0].toUpperCase() + name.substring(1, name.length);
      } else {
        formattedResult["title"] = equation;
      }
      formattedResult["description"] = <div>{equation}</div>;
      if (!ecCode.startsWith("-")) {
        formattedResult["description"] = (
          <div>
            {name ? <div>{equation}</div> : null}
            <div>
              EC:{" "}
              <a
                href={"https://enzyme.expasy.org/EC/" + ecCode}
                target="_blank"
                rel="noopener noreferrer"
              >
                {ecCode}
              </a>
            </div>
          </div>
        );
      }

      if (
        !("substrates" in result) ||
        !("products" in result) ||
        !Array.isArray(result.substrates) ||
        !Array.isArray(result.products)
      ) {
        continue;
      }

      // route
      formattedResult["route"] =
        "/reaction/" +
        result["substrates"].join(",") +
        "-->" +
        result["products"].join(",") +
        "/";
      if (organism) {
        formattedResult["route"] += organism + "/";
      }

      // append to array of formatted results
      formattedResults.push(formattedResult);
    }

    return {
      results: formattedResults,
      numResults: numResults,
    };
  }

  render() {
    return (
      <SearchResultsList
        get-results-url={this.getResultsUrl}
        get-results={this.getResults}
        get-num-results={this.getNumResults}
        format-results={this.formatResults}
        html-anchor-id="reactions"
        title="Reaction classes"
      />
    );
  }
}

function formatSide(parts) {
  return parts.join(" + ");
}

function getParticipant(participants) {
  const partNames = [];
  for (const participant of participants) {
    partNames.push(participant[0]);
  }
  return partNames;
}