= Gerrit Code Review - PolyGerrit Plugin Styling

Plugins should be html-based and imported following PolyGerrit's
link:pg-plugin-dev.html#loading[dev guide].

Sample code for testing endpoints:

``` js
Gerrit.install(plugin => {
  // Change endpoint below
  const endpoint = 'change-metadata-item';
  plugin.hook(endpoint).onAttached(element => {
    console.log(endpoint, element);
    const el = element.appendChild(document.createElement('div'));
    el.textContent = 'Ah, there it is. Lovely.';
    el.style = 'background: pink; line-height: 4em; text-align: center;';
  });
});
```

== Default parameters
All endpoints receive the following parameters, set as attributes to custom
components that are instantiated at the endpoint:

* `plugin`
+
the current plugin instance, the one that is used by `Gerrit.install()`.

* `content`
+
decorated DOM Element, is only set for registrations that decorate existing
components.

== Plugin endpoints

The following endpoints are available to plugins.

=== banner
The `banner` extension point is located at the top of all pages. The purpose
is to allow plugins to show outage information and important announcements to
all users.

=== change-view-integration
The `change-view-integration` extension point is located between `Files` and
`Messages` section on the change view page, and it may take full page's
width. Primary purpose is to enable plugins to display custom CI-related
information (build status, etc).

* `change`
+
current change displayed, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

* `revision`
+
current revision displayed, an instance of
link:rest-api-changes.html#revision-info[RevisionInfo]

=== change-metadata-item
The `change-metadata-item` extension point is located on the bottom of the
change view left panel, under the `Label Status` and `Links` sections. Its width
is equal to the left panel's, and its primary purpose is to allow plugins to add
sections of metadata to the left panel.

In addition to default parameters, the following are available:

* `change`
+
current change displayed, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

* `revision`
+
current revision displayed, an instance of
link:rest-api-changes.html#revision-info[RevisionInfo]

* `labels`
+
labels with scores applied to the change, map of the label names to
link:rest-api-changes.html#label-info[LabelInfo] entries

=== robot-comment-controls
The `robot-comment-controls` extension point is located inside each comment
rendered on the diff page, and is only visible when the comment is a robot
comment, specifically if the comment has a `robot_id` property.

In addition to default parameters, the following are available:

* `comment`
+
current comment displayed, an instance of
link:rest-api-changes.html#comment-info[CommentInfo]

=== repo-command
This endpoint is situated among the repository commands.

In addition to default parameters, the following are available:

* `repoName`
+
String name of the repository currently being configured.

* `config`
+
The object representing the repo config.

=== repo-config
The `repo-config` extension point is located at the bottom of the repository
configuration settings screen.

In addition to default parameters, the following are available:

* `repoName`
+
String name of the repository currently being configured.

* `readOnly`
+
Boolean whether the repository configuration is read only by the logged in user.

=== settings-menu-item
This endpoint is situated at the end of the navigation menu in the settings
screen.

=== settings-screen
This endpoint is situated at the end of the body of the settings screen.

=== reply-text
This endpoint wraps the textarea in the reply dialog.

=== reply-label-scores
This endpoint decorator wraps the voting buttons in the reply dialog.

=== header-title
This endpoint wraps the title-text in the application header.

=== confirm-revert-change
This endpoint is inside the confirm revert dialog. By default it displays a
generic confirmation message regarding reverting the change. Plugins may add
content to this message or replace it entirely.

=== confirm-submit-change
This endpoint is inside the confirm submit dialog. By default it displays a
generic confirmation message regarding submission of the change. Plugins may add
content to this message or replace it entirely.

In addition to default parameters, the following are available:

* `change`
+
The change beinng potentially submitted, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

* `action`
+
The submit action, including the title and label, an instance of
link:rest-api-changes.html#action-info[ActionInfo]

=== commit-container
The `commit-container` extension point adds content at the end of the commit
message to the change view.

In addition to default parameters, the following are available:

* `change`
+
current change displayed, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

* `revision`
+
current revision displayed, an instance of
link:rest-api-changes.html#revision-info[RevisionInfo]

== Dynamic Plugin endpoints

The following endpoints are available to plugins.

=== change-list-header
The `change-list-header` extension point adds a header to the change list view.

=== change-list-item-cell
The `change-list-item-cell` extension point adds a cell to the change list item.

In addition to default parameters, the following are available:

* `change`
+
current change of the row, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

=== change-view-tab-header
The `change-view-tab-header` extension point adds a primary tab to the change
view. This must be used in conjunction with `change-view-tab-content`.

In addition to default parameters, the following are available:

* `change`
+
current change displayed, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

* `revision`
+
current revision displayed, an instance of
link:rest-api-changes.html#revision-info[RevisionInfo]

=== change-view-tab-content
The `change-view-tab-content` extension point adds primary tab content to
the change view. This must be used in conjunction with `change-view-tab-header`.

In addition to default parameters, the following are available:

* `change`
+
current change displayed, an instance of
link:rest-api-changes.html#change-info[ChangeInfo]

* `revision`
+
current revision displayed, an instance of
link:rest-api-changes.html#revision-info[RevisionInfo]
