Skip to content
Snippets Groups Projects
EubopenCompoundReportCard.vue 6.03 KiB
Newer Older
  <EntityReportCard
    :report-card-structure="reportCardStructure"
    :item-i-d="itemID"
    :store-module-name="storeModuleName"
</template>

<script>
import { mapState } from 'vuex'
import RequestNotifications from '@/web-components-submodule/utils/RequestNotifications.js'
import EntityReportCard from '~/web-components-submodule/components/common/ReportCards/EntityReportCard.vue'
import CompoundReportCardGenerator from '~/report_cards_structure/CompoundReportCardGenerator.js'
import EntityNames from '~/web-components-submodule/standardisation/EntityNames.js'
import ESProxyService from '~/web-components-submodule/services/ESProxyService.js'
import IndexNames from '~/web-components-submodule/standardisation/IndexNames.js'
import ObjectPropertyAccess from '~/web-components-submodule/utils/ObjectPropertyAccess.js'
import ErrorTracking from '~/web-components-submodule/tracking/ErrorTracking.js'
export default {
  components: {
  props: {
    itemID: {
      type: String,
      default: () => undefined,
    },
  },
      storeModuleName: 'probeReportCard',
  computed: mapState({
    reportCardStructure(state) {
      return state[this.storeModuleName].reportCardStructure
    },
  async mounted() {
    try {
      const paramsFromCompound = await this.getOptionalSectionsParams()
      const chemblID = await this.getChEMBLID()
      const showCellHeatlhAndViabilityData = await this.hasCellHeatlhAndViabilityData(
        chemblID
      )
      const showQualityControlData = await this.hasQualityControlData(chemblID)
      const showActivityProfileData = await this.hasActivityProfileData(
        chemblID
      )
      const reportCardStructure = CompoundReportCardGenerator.generateReportCardStructure(
        {
          itemID: this.itemID,
          chemblID,
          prefName: paramsFromCompound.prefName,
          isChemicalProbe: paramsFromCompound.isChemicalProbe,
          isNegativeControl: paramsFromCompound.isNegativeControl,
          showCellHeatlhAndViabilityData,
      this.$store.dispatch(
        `${this.storeModuleName}/setReportCardStructure`,
        reportCardStructure
      )
      this.$store.dispatch(`${this.storeModuleName}/setStructureReady`, true)
    } catch (error) {
      ErrorTracking.trackError(error, this)
      RequestNotifications.dispatchRequestErrorNotification(
        error,
        this.$store.dispatch,
        `There was an error while loading the page structure`
      )
    }
  },
  methods: {
    async getOptionalSectionsParams() {
      const docSource = [
        'pref_name',
        '_metadata.eubopen.is_probe',
        '_metadata.eubopen.is_control',
      ]
      const entityID = EntityNames.EubopenCompound.entityID
      const indexName = IndexNames.getIndexNameFromEntityID(entityID)

      const compoundResponse = await ESProxyService.getESDocument(
      const compoundData = compoundResponse.data._source

      const prefName = ObjectPropertyAccess.getPropertyPalue(
        compoundData,
        'pref_name',
        ''
      )
      const isChemicalProbe = ObjectPropertyAccess.getPropertyPalue(
        compoundData,
        '_metadata.eubopen.is_probe',
        false
      )
      const isNegativeControl = ObjectPropertyAccess.getPropertyPalue(
        compoundData,
        '_metadata.eubopen.is_control',
        false
      )
      const chemblIDResponse = await ESProxyService.getESDocument(
        IndexNames.getIndexNameFromEntityID(
          EntityNames.EubopenCompound.entityID
        ),
        this.itemID,
        ['molecule_chembl_id']
      )

      return chemblIDResponse.data._source.molecule_chembl_id
    },
    async hasCellHeatlhAndViabilityData(chemblID) {
      const cellHeatlhAndViabilityDataPath = `/eubopen/visualisations/compound/cell_viability_and_health_data/${chemblID}`
      const cellHealthAndViabilityData = await ESProxyService.getGenericData(
        cellHeatlhAndViabilityDataPath
      )
      const numDataPoints = cellHealthAndViabilityData.data.num_datapoints
      return numDataPoints > 0
    },
    async hasQualityControlData(chemblID) {
      const entityID = EntityNames.EubopenActivity.entityID
      const indexName = IndexNames.getIndexNameFromEntityID(entityID)

      const query = {
        size: 0,
        query: {
          bool: {
            must: [
              { terms: { molecule_chembl_id: [chemblID] } },
              {
                terms: {
                  '_metadata.eubopen.assay_type.type.description': [
                    'Cell Health Data',
                    'Incucyte cell viability',
                    'Thermal shift assay QC Liability',
                },
              },
            ],
          },
        },
      }

      const qtData = await ESProxyService.getESData(indexName, query)
      const numHits = qtData.data.es_response.hits.total.value

      return numHits > 0
    },
    async hasActivityProfileData(chemblID) {
      const entityID = EntityNames.EubopenActivity.entityID
      const indexName = IndexNames.getIndexNameFromEntityID(entityID)

      const query = {
        size: 0,
        query: {
          bool: {
            must: [{ terms: { molecule_chembl_id: [chemblID] } }],
            must_not: [
                  '_metadata.eubopen.assay_type.type.description': [
                    'Cell Health Data',
                    'Incucyte cell viability',
                    'Thermal shift assay QC Liability',
                },
              },
            ],
          },
        },
      }

      const qtData = await ESProxyService.getESData(indexName, query)
      const numHits = qtData.data.es_response.hits.total.value
      return numHits > 0
    },