Source: src/js/views/searchSelect/NodeSelectView.js

define([
  "jquery",
  "underscore",
  "backbone",
  "views/searchSelect/SearchableSelectView",
  "models/NodeModel",
], function ($, _, Backbone, SearchableSelect, NodeModel) {
  /**
   * @class NodeSelect
   * @classdesc A select interface that allows the user to search for and
   * select a member node
   * @classcategory Views/SearchSelect
   * @extends SearchableSelect
   * @constructor
   * @since 2.14.0
   * @screenshot views/searchSelect/NodeSelectView.png
   */
  var NodeSelect = SearchableSelect.extend(
    /** @lends NodeSelectView.prototype */
    {
      /**
       * The type of View this is
       * @type {string}
       */
      type: "NodeSelect",

      /**
       * className - Returns the class names for this view element
       *
       * @return {string}  class names
       */
      className: SearchableSelect.prototype.className + " node-select",

      /**
       * Text to show in the input field before any value has been entered
       * @type {string}
       */
      placeholderText: "Select a DataONE repository",

      /**
       * Label for the input element
       * @type {string}
       */
      inputLabel: "Select a DataONE repository",

      /**
       * Whether to allow users to select more than one value
       * @type {boolean}
       */
      allowMulti: true,

      /**
       * Setting to true gives users the ability to add their own options that
       * are not listed in this.options. This can work with either single
       * or multiple search select dropxdowns
       * @type {boolean}
       * @default true
       */
      allowAdditions: true,

      /**
       * Creates a new NodeSelectView
       * @param {Object} options - A literal object with options to pass to the view
       */
      initialize: function (options) {
        try {
          // Ensure the query fields are cached
          if (typeof MetacatUI.nodeModel === "undefined") {
            MetacatUI.nodeModel = new NodeModel();
          }

          var members = MetacatUI.nodeModel.get("members");

          // Maps the nodeModel member attributes (keys) to the searchSelect
          // dropdown options properties (values)
          var map = Object.entries({
            logo: "image",
            name: "label",
            description: "description",
            identifier: "value",
          });

          this.options = [];

          // Convert nodeModel members to options of searchSelect
          members.forEach((member, i) => {
            this.options[i] = {};
            for (const [oldName, newName] of map) {
              this.options[i][newName] = member[oldName];
            }
          });

          SearchableSelect.prototype.initialize.call(this, options);
        } catch (e) {
          console.log(
            "Failed to initialize a Node Select View, error message: " + e,
          );
        }
      },
    },
  );
  return NodeSelect;
});