Source: src/js/views/portals/PortalsSearchView.js

define([
  "jquery",
  "underscore",
  "backbone",
  "collections/Filters",
  "views/portals/PortalListView",
], function ($, _, Backbone, Filters, PortalListView) {
  "use strict";

  /**
   * @class PortalsSearchView
   * @classdesc A view that shows a list of Portals in the main app window
   * @classcategory Views/Portals
   * @extends Backbone.View
   * @constructor
   * @since 2.16.0
   * @screenshot views/portals/PortalsSearchView.png
   */

  var PortalsSearchView = Backbone.View.extend(
    /** @lends PortalsSearchView.prototype */ {
      /**
       * The template for this view.
       */
      template: _.template(
        '<div id="portals-list-container"><div id="portals-list-user"/> <div id="portals-list-all"/> </div>',
      ),

      /**
       * Renders the list of portals
       */
      render: function () {
        try {
          //Set the header type
          MetacatUI.appModel.set("headerType", "default");

          //Insert the template
          this.$el.html(this.template());

          //Render the view after the user's authentication has been checked
          if (!MetacatUI.appUserModel.get("checked")) {
            this.listenToOnce(
              MetacatUI.appUserModel,
              "change:checked",
              this.render,
            );
            return;
          }

          let allPortalsView = new PortalListView();

          //Create titles for the My Portals and All Portals sections
          var title = $(document.createElement("h4")).addClass(
              "portals-list-title",
            ),
            allPortalsTitle = title
              .clone()
              .text("All " + MetacatUI.appModel.get("portalTermPlural"));

          // Filter datasets that the user has ownership of
          if (MetacatUI.appUserModel.get("loggedIn")) {
            let filters = new Filters();
            filters.addWritePermissionFilter();

            //Render My Portals list
            let myPortalsView = new PortalListView();
            myPortalsView.numPortals = 99999;
            myPortalsView.numPortalsPerPage = 5;
            myPortalsView.filters = filters;

            //Create titles for the My Portals section
            var myPortalsTitle = title
              .clone()
              .text("My " + MetacatUI.appModel.get("portalTermPlural"));

            this.$("#portals-list-user").append(
              myPortalsTitle,
              myPortalsView.el,
            );

            myPortalsView.render();

            //Exclude portals the user is an owner of from the All portals list
            let allPortalsFilters = new Filters();
            allPortalsFilters.addWritePermissionFilter();
            let permissionFilter = allPortalsFilters.at(
              allPortalsFilters.length - 1,
            );
            if (permissionFilter) {
              permissionFilter.set("exclude", true);
              allPortalsView.filters = allPortalsFilters;
            }
          }

          //Render All Portals
          allPortalsView.numPortals = 99999;
          allPortalsView.numPortalsPerPage = 10;
          allPortalsView.createBtnContainer = "#none";
          allPortalsView.noResultsMessage =
            "There are no " +
            MetacatUI.appModel.get("portalTermPlural") +
            " to show.";

          this.$("#portals-list-all").append(
            allPortalsTitle,
            allPortalsView.el,
          );

          allPortalsView.render();
        } catch (e) {
          console.error(e);
          this.showError();
        }
      },

      /**
       * Displays an error message when rendering this view has failed.
       */
      showError: function () {
        //Remove the loading elements
        this.$(".loading").remove();

        //Show an error message
        MetacatUI.appView.showAlert(
          "Something went wrong while getting this list of " +
            MetacatUI.appModel.get("portalTermPlural") +
            ".",
          "alert-error",
          this.$el,
        );
      },
    },
  );
  return PortalsSearchView;
});