.. sectnum::

Project Pages Feature
=====================

This document provides an overview architecture for incorporating the project pages feature into the MetacatUI web application. The goal is to support the display of project-specific metadata that is configurable by a project owner.  The four envisioned views currently include a project home, project metrics, project people, and project visualizations.

Architecture
------------

Project View
~~~~~~~~~~~~

Each scientific project is rendered as a customizable ``ProjectView`` object, and is shown when the application router routes to ``/projects/:id/(:section)`` where the required ``id`` is an identifier reference to the project definition instance file stored in the repository (for example a ``seriesId`` like ``urn:uuid:xxxx-xxxx-xxxx-xxxx``). These project definition files will be indexed and searchable in the future, but for the MVP release, we will associate each document's ``seriesId`` with a URL-friendly proxy name (like ``SASAP``).  The following wireframe shows how the ``ProjectView`` is rendered inside of the application ``#Content`` area.  Note that the ``NavbarView`` and the ``FooterView`` are rendered by the ``AppView`` parent container.

.. image:: images/project-view-wireframe.png
    :width: 50%

The router instantiates a ``ProjectView`` object, which has an associated ``ProjectModel`` object as its Backbone model.  The ``ProjectModel`` is a subclass of a ``CollectionModel``.

..
  @startuml images/project-model-view-design.png
  
    !include ../plantuml-styles.txt
    
    package metacatui {
      class ProjectModel {
      }
      class CollectionModel {
      }
      class ProjectView {
      }
    }
    
    CollectionModel <|-down- ProjectModel: "subclassOf"
    ProjectView -left-o ProjectModel: listensTo
    
  @enduml
  
.. image:: images/project-model-view-design.png

The ``ProjectView`` contains three subviews: a ``ProjectHeaderView`` for the main branding, a ``TOCView`` for the table of contents, and a ``ProjectSectionView`` for the main project content.

..
  @startuml images/project-view-design.png
  
    !include ../plantuml-styles.txt
    
    package metacatui {
      class ProjectView {
      }
      class ProjectHeaderView {
      }
      class TOCView {
      
      }
      class ProjectSectionView {
      }
    }
    
    ProjectView --o TOCView : "                  subview               "
    ProjectView --o ProjectSectionView : "subview"
    ProjectView --o ProjectHeaderView : "subview"
  @enduml
  
.. image:: images/project-view-design.png

The ``ProjectSectionView`` is an abstract generic view with a simple ``MarkdownView`` subview that will be rendered if the ``ProjectSectionView`` is not overridden by a subclass.  The ``ProjectSectionView`` is extended with specific specialty views, including a ``ProjectHomeView``, ``ProjectMetricsView``, ``ProjectMembersView``, and ``ProjectVisualizationsView``.  These four views visually translate to the four tabs of a ``ProjectView``.

..
  @startuml images/project-section-view-design.png
  
    !include ../plantuml-styles.txt
    
    package metacatui {
      class ProjectSectionView {
      }
      class ProjectHomeView {
      }
      class ProjectMetricsView {
      }
      class ProjectMembersView {
      }
      class ProjectVisualizationsView {
      }
      class MarkdownView {
      }
    }
    
    ProjectSectionView -left-o MarkdownView : "subview"
    ProjectSectionView <|-down- ProjectHomeView : subclassOf
    ProjectSectionView <|-down- ProjectMetricsView : subclassOf
    ProjectSectionView <|-down- ProjectMembersView : subclassOf
    ProjectSectionView <|-down- ProjectVisualizationsView : subclassOf
  @enduml
  
.. image:: images/project-section-view-design.png

Project Home View
~~~~~~~~~~~~~~~~~
As stated above, a ``ProjectHomeView`` is a specialized ``ProjectSectionView``. The wireframe on the left shows the subview layouts, based on the example on the right.

.. image:: images/project-home-view-wireframe-mockup.png
    :width: 100%

The ``ProjectHomeView`` contains a number of subviews, including a ``ProjectFiltersView``, a ``SearchResultsView``, a ``MapView``, a ``MarkdownView``, and a ``ProjectLogosView``.

..
  @startuml images/project-home-view-design.png
  
    !include ../plantuml-styles.txt
    
    package metacatui {
      class ProjectHomeView {
      }
      class ProjectFiltersView {
      }
      class SearchResultsView {
      }
      class MapView {
      }
      class MarkdownView {
      }
      class ProjectLogosView {
      }
    }
    
    ProjectHomeView --o ProjectFiltersView : contains
    ProjectHomeView --o SearchResultsView : contains
    ProjectHomeView --o MapView : contains
    ProjectHomeView --o MarkdownView : contains
    ProjectHomeView --o ProjectLogosView : contains
  @enduml
  
.. image:: images/project-home-view-design.png
