Source: src/js/models/filters/BooleanFilter.js

define(["jquery", "underscore", "backbone", "models/filters/Filter"], function (
  $,
  _,
  Backbone,
  Filter,
) {
  /**
   * @class BooleanFilter
   * @classdesc A search filter that only has `true` or `false` as a search term
   * @classcategory Models/Filters
   * @name BooleanFilter
   * @extends Filter
   * @constructs
   */
  var BooleanFilter = Filter.extend(
    /** @lends BooleanFilter.prototype */
    {
      /** @inheritdoc */
      type: "BooleanFilter",

      /** @inheritdoc */
      defaults: function () {
        return _.extend(Filter.prototype.defaults(), {
          //Boolean filters can't match substrings
          matchSubstring: false,
          nodeName: "booleanFilter",
        });
      },

      /**
       * Parses the booleanFilter XML node into JSON
       *
       * @param {Element} xml - The XML Element that contains all the BooleanFilter elements
       * @return {JSON} - The JSON object literal to be set on the model
       */
      parse: function (xml) {
        var modelJSON = Filter.prototype.parse.call(this, xml);

        //If this Filter is in a filter group, don't parse the value
        if (!this.get("isUIFilterType")) {
          //Parse the boolean value
          modelJSON.values = this.parseTextNode(xml, "value");

          if (modelJSON.values === "true") {
            modelJSON.values = [true];
          } else if (modelJSON.values === "false") {
            modelJSON.values = [false];
          }
        }

        return modelJSON;
      },

      /**
       * Updates the XML DOM with the new values from the model
       *  @inheritdoc
       *  @return {Element} An updated booleanFilter XML element from a portal document
       */
      updateDOM: function (options) {
        if (typeof options == "undefined") {
          var options = {};
        }

        //Update the DOM using the parent Filter model
        var objectDOM = Filter.prototype.updateDOM.call(this);

        //Boolean Filters don't use matchSubstring and operator nodes
        $(objectDOM).children("matchSubstring, operator").remove();

        // Get the new boolean value
        var value = this.get("value");

        // Make a <value> node with the new boolean value and append it to DOM
        if (value || value === false) {
          var valueSerialized = objectDOM.ownerDocument.createElement("value");
          $(valueSerialized).text(value);
          $(objectDOM).append(valueSerialized);
        }

        if (this.get("isUIFilterType")) {
          //Make sure the filterOptions are listed last
          //Get the filterOptions element
          var filterOptions = $(objectDOM).children("filterOptions");
          //If the filterOptions exist
          if (filterOptions.length) {
            //Detach from their current position and append to the end
            filterOptions.detach();
            $(objectDOM).append(filterOptions);
          }
        }
        //Remove filter options if this is for a collection definition
        else {
          $(objectDOM).children("filterOptions").remove();
        }

        return objectDOM;
      },
    },
  );

  return BooleanFilter;
});