SpeciesFileGroup/taxonworks

View on GitHub
app/assets/javascripts/views/tasks/nomenclature/browse.js

Summary

Maintainability
C
1 day
Test Coverage
var TW = TW || {}
TW.views = TW.views || {}
TW.views.tasks = TW.views.tasks || {}
TW.views.tasks.nomenclature = TW.views.tasks.nomenclature || {}
TW.views.tasks.nomenclature.browse = TW.views.tasks.nomenclature.browse || {}

Object.assign(TW.views.tasks.nomenclature.browse, {
  init: function () {
    const taxonId = document
      .querySelector('#browse-nomenclature')
      .getAttribute('data-taxon-id')
    const nomenclatureTaxonElement = document.querySelector(
      '#browse-nomenclature-taxon-name'
    )
    const taxonTypeElement = document.querySelector('[data-taxon-type]')
    const taxonStatusElement = document.querySelector('[data-status]')
    const taxonType = taxonTypeElement?.getAttribute('data-taxon-type')
    const taxonStatus = taxonStatusElement?.getAttribute('data-status')
    const platformKey = navigator.platform.indexOf('Mac') > -1 ? 'ctrl' : 'alt'
    const editTaskUrl =
      taxonType === 'Combination'
        ? `/tasks/nomenclature/new_combination?taxon_name_id=${taxonId}`
        : `/tasks/nomenclature/new_taxon_name?taxon_name_id=${taxonId}`

    if (taxonType === 'Invalid' || taxonStatus === 'invalid') {
      nomenclatureTaxonElement.classList.add('feedback-warning')
    }

    if (taxonType === 'Combination') {
      nomenclatureTaxonElement.classList.add('bg-combination')
    }

    if (
      !document.querySelector('#browse-collection-object') &&
      /^\d+$/.test(taxonId)
    ) {
      TW.workbench.keyboard.createShortcut(
        platformKey + '+t',
        'Edit taxon name',
        'Browse nomenclature',
        () => {
          window.open(editTaskUrl, '_self')
        }
      )

      TW.workbench.keyboard.createShortcut(
        platformKey + '+m',
        'New type specimen',
        'Browse nomenclature',
        () => {
          window.open(
            `/tasks/nomenclature/new_taxon_name?taxon_name_id=${taxonId}`,
            '_self'
          )
        }
      )

      TW.workbench.keyboard.createShortcut(
        platformKey + '+e',
        'Comprehensive specimen digitization',
        'Browse nomenclature',
        () => {
          window.open(
            `/tasks/accessions/comprehensive?taxon_name_id=${taxonId}`,
            '_self'
          )
        }
      )

      TW.workbench.keyboard.createShortcut(
        platformKey + '+o',
        'Browse OTU',
        'Browse nomenclature',
        () => {
          window.open(`/tasks/otus/browse?taxon_name_id=${taxonId}`, '_self')
        }
      )
    }

    document.querySelector('.edit-taxon-name').setAttribute('href', editTaskUrl)

    document.querySelector('.filter .open').addEventListener('click', (e) => {
      e.target.classList.toggle('filter-button-open')
    })

    function toggleElementState(element, isVisible) {
      if (isVisible) {
        element.classList.add('d-none')
      } else {
        element.classList.remove('d-none')
      }
    }

    if (
      document.querySelector('#browse-nomenclature').getAttribute('loaded') !==
      'true'
    ) {
      const validElements = [
        ...document.querySelectorAll('[data-history-valid-name="true"]')
      ]
      const originElements = [
        ...document.querySelectorAll('[data-history-origin]')
      ]

      validElements.forEach((element) => {
        if (!element.querySelector('[data-icon="ok"]')) {
          const icon = document.createElement('span')

          icon.setAttribute('data-icon', 'ok')
          element.prepend(icon)
        }
      })

      originElements.forEach((element) => {
        const type = element.getAttribute('data-history-origin')
        const typeElement = document.createElement('span')

        typeElement.classList.add(
          'capitalize',
          'd-none',
          'history__origin',
          type
        )
        typeElement.textContent = type.replaceAll('_', ' ')

        element.prepend(typeElement)
      })
    }

    const validationElements = [
      ...document.querySelectorAll('[data-icon="attention"][data-global-id]')
    ]

    validationElements.forEach((element) => {
      element.classList.add('d-none')
    })

    document
      .querySelector('#filterBrowse_button')
      .addEventListener('click', () => {
        document.querySelector('#filterBrowse').classList.toggle('active')
      })

    const filterButtons = [
      ...document.querySelectorAll(
        '#filterBrowse [data-filter], #filterBrowse [data-filter-row]'
      )
    ]
    const resetButton = document.querySelector(
      '#filterBrowse [data-filter-reset]'
    )

    resetButton.addEventListener('click', () => {
      filterButtons.forEach((filterElement) => {
        const elements = [
          ...document.querySelectorAll(
            filterElement.getAttribute('data-filter')
          ),
          ...document.querySelectorAll(
            filterElement.getAttribute('data-filter-row')
          )
        ]

        filterElement.classList.remove('active')
        filterElement.children[0].setAttribute('data-icon', 'show')

        elements.forEach((element) => {
          element.classList.remove('d-none')
        })
      })
    })

    filterButtons.forEach((element) => {
      element.addEventListener('click', () => {
        const childElement = element.children[0]
        const isVisible = childElement.getAttribute('data-icon') === 'show'
        const filterSelector =
          element.getAttribute('data-filter') ||
          element.getAttribute('data-filter-row')
        const filterElements = [...document.querySelectorAll(filterSelector)]

        element.classList.toggle('active')
        childElement.setAttribute('data-icon', isVisible ? 'hide' : 'show')

        filterElements.forEach((node) => {
          toggleElementState(node, isVisible)
        })
      })
    })

    document.querySelector('#browse-nomenclature').setAttribute('loaded', true)
  }
})

document.addEventListener('turbolinks:load', () => {
  if (document.querySelector('#browse-nomenclature')) {
    TW.views.tasks.nomenclature.browse.init()
  }
})