Global Metrics

path: .metrics.halstead.time
old: 51368.66431056631
new: 51478.2072227886

path: .metrics.halstead.volume
old: 13320.202543623189
new: 13327.586247915664

path: .metrics.halstead.length
old: 1804.0
new: 1805.0

path: .metrics.halstead.bugs
old: 3.1636803537138993
new: 3.1681764242091472

path: .metrics.halstead.purity_ratio
old: 0.6206414153180974
new: 0.6202975696586414

path: .metrics.halstead.difficulty
old: 69.41605839416059
new: 69.52554744525547

path: .metrics.halstead.effort
old: 924635.9575901936
new: 926607.7300101948

path: .metrics.halstead.N2
old: 634.0
new: 635.0

path: .metrics.halstead.level
old: 0.014405888538380651
new: 0.014383202099737534

path: .metrics.mi.mi_original
old: -5.571622460680572
new: -5.5745041454315185

path: .metrics.mi.mi_sei
old: -42.19648578434857
new: -42.20064317664816

Spaces Data

Minimal test - lines (19, 43)

path: .spaces[0].spaces[1].metrics.halstead.volume
old: 411.6441380011882
new: 416.1676999572452

path: .spaces[0].spaces[1].metrics.halstead.length
old: 91.0
new: 92.0

path: .spaces[0].spaces[1].metrics.halstead.effort
old: 11191.575001907304
new: 11704.71656129752

path: .spaces[0].spaces[1].metrics.halstead.purity_ratio
old: 0.9077292190563492
new: 0.8978625971100846

path: .spaces[0].spaces[1].metrics.halstead.N2
old: 29.0
new: 30.0

path: .spaces[0].spaces[1].metrics.halstead.bugs
old: 0.1667783034392754
new: 0.17183805414837336

path: .spaces[0].spaces[1].metrics.halstead.time
old: 621.754166772628
new: 650.2620311831956

path: .spaces[0].spaces[1].metrics.halstead.level
old: 0.0367816091954023
new: 0.035555555555555556

path: .spaces[0].spaces[1].metrics.halstead.difficulty
old: 27.1875
new: 28.125

path: .spaces[0].spaces[1].metrics.mi.mi_original
old: 85.93938362349006
new: 85.88255245672265

path: .spaces[0].spaces[1].metrics.mi.mi_visual_studio
old: 50.25694948742109
new: 50.2237148869723

path: .spaces[0].spaces[1].metrics.mi.mi_sei
old: 74.55947034070917
new: 74.47748029824592

Code

  loadRecord(record = {}) {
    for (let field of this._elements.form.elements) {
      let value = record[field.id];
      value = typeof value == "undefined" ? "" : value;

      if (record.guid) {
        field.value = value;
      } else if (field.localName == "select") {
        this.setDefaultSelectedOptionByValue(field, value);
      } else {
        // Use .defaultValue instead of .value to avoid setting the `dirty` flag
        // which triggers form validation UI.
        field.defaultValue = value;
      }
    }
    if (!record.guid) {
      // Reset the dirty value flag and validity state.
      this._elements.form.reset();
    } else {
      for (let field of this._elements.form.elements) {
        this.updatePopulatedState(field);
        this.updateCustomValidity(field);
      }
    }
  }

Minimal test - lines (10, 137)

path: .spaces[0].metrics.mi.mi_sei
old: 35.86232383748923
new: 35.833960801010264

path: .spaces[0].metrics.mi.mi_original
old: 48.99525513093292
new: 48.97559537216543

path: .spaces[0].metrics.mi.mi_visual_studio
old: 28.652195983001707
new: 28.640699048049957

path: .spaces[0].metrics.halstead.level
old: 0.032667876588021776
new: 0.03229665071770335

path: .spaces[0].metrics.halstead.time
old: 2479.874741900856
new: 2517.88048507175

path: .spaces[0].metrics.halstead.effort
old: 44637.74535421541
new: 45321.8487312915

path: .spaces[0].metrics.halstead.volume
old: 1458.2203563990515
new: 1463.7439183551085

path: .spaces[0].metrics.halstead.bugs
old: 0.419450045172249
new: 0.423724741326362

path: .spaces[0].metrics.halstead.purity_ratio
old: 0.792017368613037
new: 0.789028623825818

path: .spaces[0].metrics.halstead.length
old: 264.0
new: 265.0

path: .spaces[0].metrics.halstead.difficulty
old: 30.61111111111111
new: 30.96296296296296

path: .spaces[0].metrics.halstead.N2
old: 87.0
new: 88.0

Code

class EditAutofillForm {
  constructor(elements) {
    this._elements = elements;
  }

  /**
   * Fill the form with a record object.
   * @param  {object} [record = {}]
   */
  loadRecord(record = {}) {
    for (let field of this._elements.form.elements) {
      let value = record[field.id];
      value = typeof value == "undefined" ? "" : value;

      if (record.guid) {
        field.value = value;
      } else if (field.localName == "select") {
        this.setDefaultSelectedOptionByValue(field, value);
      } else {
        // Use .defaultValue instead of .value to avoid setting the `dirty` flag
        // which triggers form validation UI.
        field.defaultValue = value;
      }
    }
    if (!record.guid) {
      // Reset the dirty value flag and validity state.
      this._elements.form.reset();
    } else {
      for (let field of this._elements.form.elements) {
        this.updatePopulatedState(field);
        this.updateCustomValidity(field);
      }
    }
  }

  setDefaultSelectedOptionByValue(select, value) {
    for (let option of select.options) {
      option.defaultSelected = option.value == value;
    }
  }

  /**
   * Get a record from the form suitable for a save/update in storage.
   * @returns {object}
   */
  buildFormObject() {
    let initialObject = {};
    if (this.hasMailingAddressFields) {
      // Start with an empty string for each mailing-address field so that any
      // fields hidden for the current country are blanked in the return value.
      initialObject = {
        "street-address": "",
        "address-level3": "",
        "address-level2": "",
        "address-level1": "",
        "postal-code": "",
      };
    }

    return Array.from(this._elements.form.elements).reduce((obj, input) => {
      if (!input.disabled) {
        obj[input.id] = input.value;
      }
      return obj;
    }, initialObject);
  }

  /**
   * Handle events
   *
   * @param  {DOMEvent} event
   */
  handleEvent(event) {
    switch (event.type) {
      case "change": {
        this.handleChange(event);
        break;
      }
      case "input": {
        this.handleInput(event);
        break;
      }
    }
  }

  /**
   * Handle change events
   *
   * @param  {DOMEvent} event
   */
  handleChange(event) {
    this.updatePopulatedState(event.target);
  }

  /**
   * Handle input events
   *
   * @param  {DOMEvent} event
   */
  handleInput(event) {}

  /**
   * Attach event listener
   */
  attachEventListeners() {
    this._elements.form.addEventListener("input", this);
  }

  /**
   * Set the field-populated attribute if the field has a value.
   *
   * @param {DOMElement} field The field that will be checked for a value.
   */
  updatePopulatedState(field) {
    let span = field.parentNode.querySelector(".label-text");
    if (!span) {
      return;
    }
    span.toggleAttribute("field-populated", !!field.value.trim());
  }

  /**
   * Run custom validity routines specific to the field and type of form.
   *
   * @param {DOMElement} field The field that will be validated.
   */
  updateCustomValidity(field) {}
}