AssessmentChanger

by david_i_smith

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.radio/1.0.5/backbone.radio.min.js"></script>

JavaScript

/**
 * Config =====================================================================================
 */

var constants = {
  PSAT_NMSQT_ADMIN_CUTOFF_DATE: '2016-01-01',
  REPORT_CONFIG: {
    psatnmsqt: {
      current: {
        attrs: {
          p_asmt_id: '100_4',
          p_scr_tier: 'TOT'
        }
      },
      historical: {
        attrs: {
          p_asmt_id: '76_-2',
          p_scr_tier: 'CR'
        }
      }
    },
    sat: {
      attrs: {
        p_asmt_id: null
      }
    }
  },
  PSAT_NMSQT_SCORE_REPORT_COHORT_CUTOFF_DATES_BY_GRADE: {
    '1': '2021', // 7th grade
    '2': '2020', // 8th grade
    '4': '2019', // 9th grade
    '5': '2018', // 10th grade
    '6': '2017', // 11th grade
    '7': '2016' // 12th grade
  }
};

/**
 * Classes =====================================================================================
 */

/**
 * AssessmentChanger
 */

var AssessmentChanger = function(options) {
  this.eventType = options.eventType;
  this.eventObj = options.eventObj;
  this.reportConfig = options.reportConfig;
};

AssessmentChanger.prototype.handleAttributeChange = function() {
  var getCallbackName = _.bind(function() {
    return 'handle' + this.charAt(0).toUpperCase() + this.slice(1) + 'Change';
  }, this.eventType);
  var reportConfig = this[getCallbackName()](this.eventObj);
  if (_.isObject(reportConfig)) {
    this.updateReport.call(this.eventObj.report, reportConfig);
  } else {
    throw new Error('no configuration data for ' + getCallbackName());
  }
};

AssessmentChanger.prototype.updateReport = function(reportConfig) {
  this.attributes.p_asmt_id = reportConfig.attrs.p_asmt_id;
};

AssessmentChanger.prototype.handleAdminDateChange = function() {
  throw new Error('must be implemented by subclass');
};

AssessmentChanger.prototype.handleCohortYearChange = function() {
  throw new Error('must be implemented by subclass');
};

AssessmentChanger.prototype.handleGradeLevelChange = function() {
  throw new Error('must be implemented...