datacite/bracco

View on GitHub
app/components/doi-subject.js

Summary

Maintainability
A
0 mins
Test Coverage
import Component from '@ember/component';
import { isBlank } from '@ember/utils';
import fosMapping from '../utils/fos-mappings';

const completeSubjectList = fosMapping.allLabels();

export default Component.extend({
  attributeBindings: ['simple'],
  completeSubjectList,
  subjects: completeSubjectList,
  oecdSelected: false,

  init(...args) {
    this._super(...args);
    this.selected = this.selected || [];
  },

  setSchemeUri(value) {
    this.fragment.set('subjectSchemeUri', value);
    this.fragment.set('schemeUri', value);
    this.set('schemeUri', value);
  },
  setScheme(value) {
    this.fragment.set('subjectScheme', value);
    this.set('subjectScheme', value);
  },
  setClassificationCode(value) {
    this.fragment.set('classificationCode', value);
    this.set('classificationCode', value);
  },
  didReceiveAttrs() {
    this._super(...arguments);

    if (
      this.fragment.get('subject') &&
      completeSubjectList.includes(
        this.fragment.get('subject').replace('FOS: ', '')
      )
    ) {
      this.set('oecdSelected', true);
    } else {
      this.set('oecdSelected', false);
    }
  },
  subjectText(value) {
    if (this.simple) {
      return value;
    }
    return 'FOS: ' + value;
  },

  actions: {
    createOnEnter(select, e) {
      if (
        e.keyCode === 13 &&
        select.isOpen &&
        !select.highlighted &&
        !isBlank(select.searchText)
      ) {
        if (!this.selected.includes(select.searchText)) {
          this.subjects.push(select.searchText);
          select.actions.choose(select.searchText);
          this.fragment.set('subject', select.searchText);
          this.set('subjects', completeSubjectList);
        }
      }
    },
    updateSubject(value) {
      var fos = fosMapping.findSubjectByLabel(value);
      if (fos) {
        this.fragment.set('subject', this.subjectText(fos.subject));
        this.setScheme(fos.subjectScheme);
        this.setSchemeUri(fos.schemeUri);
        this.setClassificationCode(fos.classificationCode);
        this.set('oecdSelected', true);
      } else {
        this.fragment.set('subject', value);
        this.setScheme(null);
        this.setSchemeUri(null);
        this.setClassificationCode(null);
        this.set('oecdSelected', false);
      }
    },
    updateSubjectScheme(value) {
      this.fragment.set('subjectScheme', value);
    },
    updateSubjectSchemeUri(value) {
      this.setSchemeUri(value);
    },
    updateClassificationCode(value) {
      this.setClassificationCode(value);
    },
    deleteSubject() {
      this.model.get('subjects').removeObject(this.fragment);
    },
    searchSubject(query) {
      let subjects = completeSubjectList.filter(function (subject) {
        return subject.toLowerCase().startsWith(query.toLowerCase());
      });
      this.set('subjects', subjects);
    }
  }
});