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

define([
    "jquery",
    "underscore",
    "backbone",
    "views/selectUI/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
     * @extends SearchableSelect
     * @constructor
     */
    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 dropdowns        
         * @type {boolean}
         */         
        allowAdditions: false,
        
        /**
         * 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;
  });