Merge "Update the JavaScript Plugin API documentation" into stable-3.4
This commit is contained in:
@@ -504,10 +504,10 @@ the "Switch Account" link is displayed next to "Sign Out".
|
||||
+
|
||||
When `auth.type` does not normally enable this URL administrators may
|
||||
set this to `login/`, allowing users to begin a new web session. This value
|
||||
is used as an href in PolyGerrit, so absolute URLs like
|
||||
is used as an href in the Gerrit web app, so absolute URLs like
|
||||
`https://someotherhost/login` work as well.
|
||||
+
|
||||
If a ${path} parameter is included, then PolyGerrit will substitute the
|
||||
If a ${path} parameter is included, then the Gerrit web app will substitute the
|
||||
currently viewed path in the link. Be aware that this path will include
|
||||
a leading slash, so a value like this might be appropriate: `/login${path}`.
|
||||
|
||||
@@ -2340,11 +2340,11 @@ By default SAMEORIGIN.
|
||||
|
||||
[[gerrit.cdnPath]]gerrit.cdnPath::
|
||||
+
|
||||
Path prefix for PolyGerrit's static resources if using a CDN.
|
||||
Path prefix for Gerrit's static resources if using a CDN.
|
||||
|
||||
[[gerrit.faviconPath]]gerrit.faviconPath::
|
||||
+
|
||||
Path for PolyGerrit's favicon after link:#gerrit.canonicalWebUrl[default URL],
|
||||
Path for Gerrit's favicon after link:#gerrit.canonicalWebUrl[default URL],
|
||||
including icon name and extension (.ico should be used).
|
||||
|
||||
[[gerrit.instanceId]]gerrit.instanceId::
|
||||
|
||||
@@ -49,7 +49,7 @@ revision for the Gerrit version you are using.
|
||||
[[codemirror-editor]]
|
||||
=== codemirror-editor
|
||||
|
||||
CodeMirror plugin for polygerrit.
|
||||
CodeMirror JavaScript plugin for Gerrit.
|
||||
|
||||
link:https://gerrit-review.googlesource.com/admin/repos/plugins/codemirror-editor[
|
||||
Project,role=external,window=_blank] |
|
||||
|
||||
@@ -138,7 +138,7 @@ The output executable WAR will be placed in:
|
||||
[[release]]
|
||||
=== Gerrit Release WAR File
|
||||
|
||||
To build the Gerrit web application that includes the PolyGerrit UI,
|
||||
To build the Gerrit web application that includes the Gerrit UI,
|
||||
core plugins and documentation:
|
||||
|
||||
----
|
||||
@@ -153,8 +153,7 @@ The output executable WAR will be placed in:
|
||||
|
||||
=== Headless Mode
|
||||
|
||||
To build Gerrit in headless mode, i.e. without the PolyGerrit UI:
|
||||
Web UI:
|
||||
To build Gerrit in headless mode, i.e. without the Gerrit UI:
|
||||
|
||||
----
|
||||
bazel build headless
|
||||
@@ -559,10 +558,10 @@ necessary.
|
||||
[[npm-binary]]
|
||||
== NPM Binaries
|
||||
|
||||
Parts of the PolyGerrit build require running NPM-based JavaScript programs as
|
||||
"binaries". We don't attempt to resolve and download NPM dependencies at build
|
||||
time, but instead use pre-built bundles of the NPM binary along with all its
|
||||
dependencies. Some packages on
|
||||
Parts of the Gerrit web app build require running NPM-based JavaScript programs
|
||||
as "binaries". We don't attempt to resolve and download NPM dependencies at
|
||||
build time, but instead use pre-built bundles of the NPM binary along with all
|
||||
its dependencies. Some packages on
|
||||
link:https://docs.npmjs.com/misc/registry[registry.npmjs.org,role=external,window=_blank] come with their
|
||||
dependencies bundled, but this is the exception rather than the rule. More
|
||||
commonly, to add a new binary to this list, you will need to bundle the binary
|
||||
@@ -625,8 +624,8 @@ After the update, commit all changes to the repository (including `yarn.lock`).
|
||||
If a npm package has transitive dependencies (or just several files) with a not allowed
|
||||
license and you can't avoid use it in release, then you can add this package.
|
||||
For example some packages contain demo-code with a different license. Another example - optional
|
||||
dependencies, which are not needed to build polygerrit, but they are installed together with
|
||||
the package anyway.
|
||||
dependencies, which are not needed to build the Gerrit web app, but they are installed together
|
||||
with the package anyway.
|
||||
|
||||
In this case you should exclude all files and/or transitive dependencies with a not allowed license.
|
||||
Adding such package requires additional updates:
|
||||
|
||||
@@ -52,7 +52,7 @@ link:dev-cla.html[contributor's agreement] on file with the project.
|
||||
* link:dev-plugins-lifecycle.html[Plugin Lifecycle]
|
||||
* link:dev-plugins.html[Developing Plugins]
|
||||
* link:dev-build-plugins.html[Building Gerrit plugins]
|
||||
* link:js-api.html[JavaScript Plugin API]
|
||||
* link:pg-plugin-dev.html[JavaScript Plugin Development and API]
|
||||
* link:config-validation.html[Validation Interfaces]
|
||||
* link:dev-stars.html[Starring Changes]
|
||||
* link:quota.html[Quota Enforcement]
|
||||
|
||||
@@ -80,10 +80,10 @@ change.
|
||||
== Infrastructure
|
||||
|
||||
End-user web browsers make HTTP requests directly to Gerrit's
|
||||
HTTP server. As nearly all of the user interface is implemented
|
||||
through PolyGerrit, the majority of these requests are transmitting
|
||||
compressed JSON payloads, with all HTML being generated within the
|
||||
browser.
|
||||
HTTP server. As nearly all of the Gerrit user interface is implemented
|
||||
in a JavaScript based web app, the majority of these requests are
|
||||
transmitting compressed JSON payloads, with all HTML being generated
|
||||
within the browser.
|
||||
|
||||
Gerrit's HTTP server side component is implemented as a standard Java
|
||||
servlet, and thus runs within any link:install-j2ee.html[J2EE servlet
|
||||
|
||||
@@ -118,7 +118,7 @@ Developer Setup guide to configure a local site for testing.
|
||||
|
||||
== Testing
|
||||
|
||||
=== PolyGerrit UI is served by `server.go` process. To launch it,
|
||||
=== The Gerrit web app UI is served by `server.go` process. To launch it,
|
||||
run this command:
|
||||
|
||||
----
|
||||
|
||||
@@ -5,8 +5,8 @@ The Gerrit server functionality can be extended by installing plugins.
|
||||
This page describes how plugins for Gerrit can be developed and hosted
|
||||
on gerrit-review.googlesource.com.
|
||||
|
||||
For PolyGerrit-specific plugin development, consult with
|
||||
link:pg-plugin-dev.html[PolyGerrit Plugin Development] guide.
|
||||
For JavaScript plugin development, consult with
|
||||
link:pg-plugin-dev.html[JavaScript Plugin Development] guide.
|
||||
|
||||
Depending on how tightly the extension code is coupled with the Gerrit
|
||||
server code, there is a distinction between `plugins` and `extensions`.
|
||||
@@ -1456,141 +1456,7 @@ This is useful if certain approvals have a special meaning (e.g. custom logic
|
||||
that is implemented in Prolog submit rules, signal for triggering an action
|
||||
like running CI etc.), as it allows the plugin to tell users about this meaning
|
||||
in the change message. This makes the effect of a given approval more
|
||||
transparent to the user.
|
||||
|
||||
[[ui_extension]]
|
||||
== UI Extension
|
||||
|
||||
[[panels]]
|
||||
=== Panels
|
||||
|
||||
UI plugins can contribute panels to Gerrit screens.
|
||||
|
||||
Gerrit screens define extension points where plugins can add GWT
|
||||
panels with custom controls:
|
||||
|
||||
* Change Screen:
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_HEADER`:
|
||||
+
|
||||
Panel will be shown in the header bar to the right of the change
|
||||
status.
|
||||
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_BUTTONS`:
|
||||
+
|
||||
Panel will be shown in the header bar on the right side of the buttons.
|
||||
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_HEADER_RIGHT_OF_POP_DOWNS`:
|
||||
+
|
||||
Panel will be shown in the header bar on the right side of the pop down
|
||||
buttons.
|
||||
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK`:
|
||||
+
|
||||
Panel will be shown below the commit info block.
|
||||
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK`:
|
||||
+
|
||||
Panel will be shown below the change info block.
|
||||
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_RELATED_INFO_BLOCK`:
|
||||
+
|
||||
Panel will be shown below the related info block.
|
||||
|
||||
** `GerritUiExtensionPoint.CHANGE_SCREEN_HISTORY_RIGHT_OF_BUTTONS`:
|
||||
+
|
||||
Panel will be shown in the history bar on the right side of the buttons.
|
||||
|
||||
** The following parameters are provided:
|
||||
*** `GerritUiExtensionPoint.Key.CHANGE_INFO`:
|
||||
+
|
||||
The link:rest-api-changes.html#change-info[ChangeInfo] entity for the
|
||||
current change.
|
||||
+
|
||||
The link:rest-api-changes.html#revision-info[RevisionInfo] entity for
|
||||
the current patch set.
|
||||
|
||||
* Project Info Screen:
|
||||
** `GerritUiExtensionPoint.PROJECT_INFO_SCREEN_TOP`:
|
||||
+
|
||||
Panel will be shown at the top of the screen.
|
||||
|
||||
** `GerritUiExtensionPoint.PROJECT_INFO_SCREEN_BOTTOM`:
|
||||
+
|
||||
Panel will be shown at the bottom of the screen.
|
||||
|
||||
** The following parameters are provided:
|
||||
*** `GerritUiExtensionPoint.Key.PROJECT_NAME`:
|
||||
+
|
||||
The name of the project.
|
||||
|
||||
* User Password Screen:
|
||||
** `GerritUiExtensionPoint.PASSWORD_SCREEN_BOTTOM`:
|
||||
+
|
||||
Panel will be shown at the bottom of the screen.
|
||||
|
||||
** The following parameters are provided:
|
||||
*** `GerritUiExtensionPoint.Key.ACCOUNT_INFO`:
|
||||
+
|
||||
The link:rest-api-accounts.html#account-info[AccountInfo] entity for
|
||||
the current user.
|
||||
|
||||
* User Preferences Screen:
|
||||
** `GerritUiExtensionPoint.PREFERENCES_SCREEN_BOTTOM`:
|
||||
+
|
||||
Panel will be shown at the bottom of the screen.
|
||||
|
||||
** The following parameters are provided:
|
||||
*** `GerritUiExtensionPoint.Key.ACCOUNT_INFO`:
|
||||
+
|
||||
The link:rest-api-accounts.html#account-info[AccountInfo] entity for
|
||||
the current user.
|
||||
|
||||
* User Profile Screen:
|
||||
** `GerritUiExtensionPoint.PROFILE_SCREEN_BOTTOM`:
|
||||
+
|
||||
Panel will be shown at the bottom of the screen below the grid with the
|
||||
profile data.
|
||||
|
||||
** The following parameters are provided:
|
||||
*** `GerritUiExtensionPoint.Key.ACCOUNT_INFO`:
|
||||
+
|
||||
The link:rest-api-accounts.html#account-info[AccountInfo] entity for
|
||||
the current user.
|
||||
|
||||
Example panel:
|
||||
[source,java]
|
||||
----
|
||||
public class MyPlugin extends PluginEntryPoint {
|
||||
@Override
|
||||
public void onPluginLoad() {
|
||||
Plugin.get().panel(GerritUiExtensionPoint.CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK,
|
||||
"my_panel_name",
|
||||
new Panel.EntryPoint() {
|
||||
@Override
|
||||
public void onLoad(Panel panel) {
|
||||
panel.setWidget(new InlineLabel("My Panel for change "
|
||||
+ panel.getInt(GerritUiExtensionPoint.Key.CHANGE_ID, -1));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
Change Screen panel ordering may be specified in the
|
||||
project config. Values may be either "plugin name" or
|
||||
"plugin name"."panel name".
|
||||
Panels not specified in the config will be added
|
||||
to the end in load order. Panels specified in the config that
|
||||
are not found will be ignored.
|
||||
|
||||
Example config:
|
||||
----
|
||||
[extension-panels "CHANGE_SCREEN_BELOW_CHANGE_INFO_BLOCK"]
|
||||
panel = helloworld.change_id
|
||||
panel = myotherplugin
|
||||
panel = myplugin.my_panel_name
|
||||
----
|
||||
|
||||
transparent to the user.
|
||||
|
||||
|
||||
[[actions]]
|
||||
@@ -2557,11 +2423,7 @@ plugin name. For JAR plugins, the value of the `Gerrit-PluginName`
|
||||
manifest attribute will be used, if provided, otherwise the name of
|
||||
the file, minus the `.jar` extension, will be used.
|
||||
|
||||
For Web UI plugins, the plugin version is derived from the filename.
|
||||
If the filename contains one or more hyphens, the version is taken
|
||||
from the portion following the last hyphen. For example if the plugin
|
||||
filename is `my-plugin-1.0.js` the version will be `1.0`. For JAR
|
||||
plugins, the version is taken from the `Version` attribute in the
|
||||
For JAR plugins, the version is taken from the `Version` attribute in the
|
||||
manifest.
|
||||
|
||||
Unless disabled, servers periodically scan the `$site_path/plugins`
|
||||
@@ -2989,7 +2851,7 @@ invoked each time the server executes a request from a user.
|
||||
|
||||
== SEE ALSO
|
||||
|
||||
* link:js-api.html[JavaScript API]
|
||||
* link:pg-plugin-dev.html[JavaScript Plugin API]
|
||||
* link:dev-rest-api.html[REST API Developers' Notes]
|
||||
|
||||
GERRIT
|
||||
|
||||
@@ -634,9 +634,9 @@ Gerrit.
|
||||
The Gerrit functionality can be extended by plugins and there are many
|
||||
extension points, e.g. plugins can
|
||||
+
|
||||
** link:dev-plugins.html#top-menu-extensions[add new menu entries]
|
||||
** link:dev-plugins.html#ui_extension[extend existing screens] and
|
||||
link:dev-plugins.html#screen[add new screens]
|
||||
** link:pg-plugin-admin-api.html[add new menu entries]
|
||||
** link:pg-plugin-endpoints.html[hook into DOM elements] and
|
||||
link:pg-plugin-dev.html#plugin-screen[add new pages]
|
||||
** link:config-validation.html[do validation], e.g. of new commits
|
||||
** add new REST endpoints and link:dev-plugins.html#ssh[SSH commands]
|
||||
|
||||
|
||||
@@ -1,486 +0,0 @@
|
||||
= Gerrit Code Review - JavaScript API
|
||||
|
||||
Gerrit Code Review supports an API for JavaScript plugins to interact
|
||||
with the web UI and the server process.
|
||||
|
||||
== Entry Point
|
||||
|
||||
JavaScript is loaded using a standard `<script src='...'>` HTML tag.
|
||||
Plugins should protect the global namespace by defining their code
|
||||
within an anonymous function passed to `Gerrit.install()`. The plugin
|
||||
will be passed an object describing its registration with Gerrit:
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
Gerrit.install(function (self) {
|
||||
// ... plugin JavaScript code here ...
|
||||
});
|
||||
----
|
||||
|
||||
|
||||
[[self]]
|
||||
== Plugin Instance
|
||||
|
||||
The plugin instance is passed to the plugin's initialization function
|
||||
and provides a number of utility services to plugin authors.
|
||||
|
||||
[[self_getServerInfo]]
|
||||
=== self.getServerInfo()
|
||||
Returns the server's link:rest-api-config.html#server-info[ServerInfo]
|
||||
data.
|
||||
|
||||
[[self_getPluginName]]
|
||||
=== self.getPluginName()
|
||||
Returns the name this plugin was installed as by the server
|
||||
administrator. The plugin name is required to access REST API
|
||||
views installed by the plugin, or to access resources.
|
||||
|
||||
[[self_on]]
|
||||
=== self.on()
|
||||
Register a JavaScript callback to be invoked when events occur within
|
||||
the web interface.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
self.on(event, callback);
|
||||
----
|
||||
|
||||
* event: A supported event type. See below for description.
|
||||
|
||||
* callback: JavaScript function to be invoked when event happens.
|
||||
Arguments may be passed to this function, depending on the event.
|
||||
|
||||
Supported events:
|
||||
|
||||
* `history`: Invoked when the view is changed to a new screen within
|
||||
the Gerrit web application. The token after "#" is passed as the
|
||||
argument to the callback function, for example "/c/42/" while
|
||||
showing change 42.
|
||||
|
||||
* `showchange`: Invoked when a change is made visible. A
|
||||
link:rest-api-changes.html#change-info[ChangeInfo] and
|
||||
link:rest-api-changes.html#revision-info[RevisionInfo]
|
||||
are passed as arguments. PolyGerrit provides a third parameter which
|
||||
is an object with a `mergeable` boolean.
|
||||
|
||||
* `submitchange`: Invoked when the submit button is clicked
|
||||
on a change. A link:rest-api-changes.html#change-info[ChangeInfo]
|
||||
and link:rest-api-changes.html#revision-info[RevisionInfo] are
|
||||
passed as arguments. Similar to a form submit validation, the
|
||||
function must return true to allow the operation to continue, or
|
||||
false to prevent it. The function may be called multiple times, for
|
||||
example, if submitting a change shows a confirmation dialog, this
|
||||
event may be called to validate that the check whether dialog can be
|
||||
shown, and called again when the submit is confirmed to check whether
|
||||
the actual submission action can proceed.
|
||||
|
||||
* `comment`: Invoked when a DOM element that represents a comment is
|
||||
created. This DOM element is passed as argument. This DOM element
|
||||
contains nested elements that Gerrit uses to format the comment. The
|
||||
DOM structure may differ between comment types such as inline
|
||||
comments, file-level comments and summary comments, and it may change
|
||||
with new Gerrit versions.
|
||||
|
||||
* `highlightjs-loaded`: Invoked when the highlight.js library has
|
||||
finished loading. The global `hljs` object (also now accessible via
|
||||
`window.hljs`) is passed as an argument to the callback function.
|
||||
This event can be used to register a new language highlighter with
|
||||
the highlight.js library before syntax highlighting begins.
|
||||
|
||||
[[self_changeActions]]
|
||||
=== self.changeActions()
|
||||
Returns an instance of ChangeActions API.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
self.changeActions();
|
||||
----
|
||||
|
||||
[[self_screen]]
|
||||
=== self.screen()
|
||||
Register a module to be attached when the user navigates
|
||||
to an extension screen provided by the plugin. Extension screens are
|
||||
usually linked from the link:dev-plugins.html#top-menu-extensions[top menu].
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
self.screen(pattern, opt_moduleName);
|
||||
----
|
||||
|
||||
* pattern: URL token pattern to identify the screen. Argument can be
|
||||
either a string (`'index'`) or a RegExp object (`/list\/(.*)/`).
|
||||
If a RegExp is used the matching groups will be available inside of
|
||||
the context as `token_match`.
|
||||
|
||||
* opt_moduleName: The module to load when the user navigates to
|
||||
the screen. The function will be passed a link:#ScreenContext[screen context].
|
||||
|
||||
[[self_settings]]
|
||||
=== self.settings()
|
||||
Returns the Settings API.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
self.settings();
|
||||
----
|
||||
|
||||
[[self_registerCustomComponent]]
|
||||
=== self.registerCustomComponent()
|
||||
Register a custom component to a specific endpoint.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
self.registerCustomComponent(endpointName, opt_moduleName, opt_options);
|
||||
----
|
||||
|
||||
* endpointName: The endpoint this plugin should be reigistered to.
|
||||
|
||||
* opt_moduleName: The module name the custom component will use.
|
||||
|
||||
* opt_options: Options to register this custom component.
|
||||
|
||||
[[self_url]]
|
||||
=== self.url()
|
||||
Returns a URL within the plugin's URL space. If invoked with no
|
||||
parameter the URL of the plugin is returned. If passed a string
|
||||
the argument is appended to the plugin URL.
|
||||
|
||||
A plugin's URL is where this plugin is loaded, it doesn't
|
||||
necessary to be the same as the Gerrit host. Use `window.location`
|
||||
if you need to access the Gerrit host info.
|
||||
|
||||
For preloaded plugins, the plugin url is based on a global
|
||||
configuration of where to load all plugins, default to current host.
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
self.url(); // "https://gerrit-review.googlesource.com/plugins/demo/"
|
||||
self.url('/static/icon.png'); // "https://gerrit-review.googlesource.com/plugins/demo/static/icon.png"
|
||||
----
|
||||
|
||||
[[self_restApi]]
|
||||
=== self.restApi()
|
||||
Returns an instance of the Plugin REST API.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
self.restApi(prefix_url)
|
||||
----
|
||||
|
||||
* prefix_url: Base url for subsequent .get(), .post() etc requests.
|
||||
|
||||
[[PluginRestAPI]]
|
||||
== Plugin Rest API
|
||||
|
||||
[[plugin_rest_delete]]
|
||||
=== restApi.delete()
|
||||
Issues a DELETE REST API request to the Gerrit server.
|
||||
Returns a promise with the response of the request.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
restApi.delete(url)
|
||||
----
|
||||
|
||||
* url: URL relative to the base url.
|
||||
|
||||
[[plugin_rest_get]]
|
||||
=== restApi.get()
|
||||
Issues a GET REST API request to the Gerrit server.
|
||||
Returns a promise with the response of the request.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
restApi.get(url)
|
||||
----
|
||||
|
||||
* url: URL relative to the base url.
|
||||
|
||||
[[plugin_rest_post]]
|
||||
=== restApi.post()
|
||||
Issues a POST REST API request to the Gerrit server.
|
||||
Returns a promise with the response of the request.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
restApi.post(url, opt_payload, opt_errFn, opt_contentType)
|
||||
----
|
||||
|
||||
* url: URL relative to the base url.
|
||||
|
||||
* opt_payload: JavaScript object to serialize as the request payload.
|
||||
|
||||
* opt_errFn: JavaScript function to be invoked when error occured.
|
||||
|
||||
* opt_contentType: Content-Type to be sent along with the request.
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
restApi.post(
|
||||
'/my-servlet',
|
||||
{start_build: true, platform_type: 'Linux'});
|
||||
----
|
||||
|
||||
[[plugin_rest_put]]
|
||||
=== restApi.put()
|
||||
Issues a PUT REST API request to the Gerrit server.
|
||||
Returns a promise with the response of the request.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
restApi.put(url, opt_payload, opt_errFn, opt_contentType)
|
||||
----
|
||||
|
||||
* url: URL relative to the base url.
|
||||
|
||||
* opt_payload: JavaScript object to serialize as the request payload.
|
||||
|
||||
* opt_errFn: JavaScript function to be invoked when error occured.
|
||||
|
||||
* opt_contentType: Content-Type to be sent along with the request.
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
restApi.put(
|
||||
'/builds',
|
||||
{start_build: true, platform_type: 'Linux'});
|
||||
----
|
||||
|
||||
[[ChangeActions]]
|
||||
== Change Actions API
|
||||
A new Change Actions API instance will be created when `changeActions()`
|
||||
is invoked.
|
||||
|
||||
[[change_actions_add]]
|
||||
=== changeActions.add()
|
||||
Adds a new action to the change actions section.
|
||||
Returns the key of the newly added action.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.add(type, label)
|
||||
----
|
||||
|
||||
* type: The type of the action, either `change` or `revision`.
|
||||
|
||||
* label: The label to be used in UI for this action.
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.add("change", "test")
|
||||
----
|
||||
|
||||
[[change_actions_remove]]
|
||||
=== changeActions.remove()
|
||||
Removes an action from the change actions section.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.remove(key)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
[[change_actions_addTapListener]]
|
||||
=== changeActions.addTapListener()
|
||||
Adds a tap listener to an action that will be invoked when the action
|
||||
is tapped.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.addTapListener(key, callback)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* callback: JavaScript function to be invoked when action tapped.
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.addTapListener("__key_for_my_action__", () => {
|
||||
// do something when my action gets clicked
|
||||
})
|
||||
----
|
||||
|
||||
[[change_actions_removeTapListener]]
|
||||
=== changeActions.removeTapListener()
|
||||
Removes an existing tap listener on an action.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.removeTapListener(key, callback)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* callback: JavaScript function to be removed.
|
||||
|
||||
[[change_actions_setLabel]]
|
||||
=== changeActions.setLabel()
|
||||
Sets the label for an action.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.setLabel(key, label)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* label: The label of the action.
|
||||
|
||||
[[change_actions_setTitle]]
|
||||
=== changeActions.setTitle()
|
||||
Sets the title for an action.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.setTitle(key, title)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* title: The title of the action.
|
||||
|
||||
[[change_actions_setIcon]]
|
||||
=== changeActions.setIcon()
|
||||
Sets an icon for an action.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.setIcon(key, icon)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* icon: The name of the icon.
|
||||
|
||||
[[change_actions_setEnabled]]
|
||||
=== changeActions.setEnabled()
|
||||
Sets an action to enabled or disabled.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.setEnabled(key, enabled)
|
||||
----
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* enabled: The status of the action, true to enable.
|
||||
|
||||
[[change_actions_setActionHidden]]
|
||||
=== changeActions.setActionHidden()
|
||||
Sets an action to be hidden.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.setActionHidden(type, key, hidden)
|
||||
----
|
||||
|
||||
* type: The type of the action.
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* hidden: True to hide the action, false to show the action.
|
||||
|
||||
[[change_actions_setActionOverflow]]
|
||||
=== changeActions.setActionOverflow()
|
||||
Sets an action to show in overflow menu.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
changeActions.setActionOverflow(type, key, overflow)
|
||||
----
|
||||
|
||||
* type: The type of the action.
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* overflow: True to move the action to overflow menu, false to move
|
||||
the action out of the overflow menu.
|
||||
|
||||
[[PanelContext]]
|
||||
== Panel Context
|
||||
A new panel context is passed to the `panel` callback function each
|
||||
time a screen with the given extension point is loaded.
|
||||
|
||||
[[panel_body]]
|
||||
=== panel.body
|
||||
Empty HTML `<div>` node the plugin should add the panel content to.
|
||||
The node is already attached to the document.
|
||||
|
||||
[[PanelProperties]]
|
||||
=== Properties
|
||||
|
||||
The extension panel parameters that are described in the
|
||||
link:dev-plugins.html#panels[plugin development documentation] are
|
||||
contained in the context as properties. Which properties are available
|
||||
depends on the extension point.
|
||||
|
||||
[[Gerrit]]
|
||||
== Gerrit
|
||||
|
||||
The `Gerrit` object is the only symbol provided into the global
|
||||
namespace by Gerrit Code Review. All top-level functions can be
|
||||
accessed through this name.
|
||||
|
||||
[[Gerrit_css]]
|
||||
=== Gerrit.css()
|
||||
[WARNING]
|
||||
This method is deprecated. It doesn't work with Shadow DOM and
|
||||
will be removed in the future. Please, use link:pg-plugin-dev.html#plugin-styles[plugin.styles] instead.
|
||||
|
||||
Creates a new unique CSS class and injects it into the document.
|
||||
The name of the class is returned and can be used by the plugin.
|
||||
|
||||
Classes created with this function should be created once at install
|
||||
time and reused throughout the plugin. Repeatedly creating the same
|
||||
class will explode the global stylesheet.
|
||||
|
||||
.Signature
|
||||
[source,javascript]
|
||||
----
|
||||
Gerrit.install(function(self)) {
|
||||
var style = {
|
||||
name: Gerrit.css('background: #fff; color: #000;'),
|
||||
};
|
||||
});
|
||||
----
|
||||
|
||||
[[Gerrit_install]]
|
||||
=== Gerrit.install()
|
||||
Registers a new plugin by invoking the supplied initialization
|
||||
function. The function is passed the link:#self[plugin instance].
|
||||
|
||||
[source,javascript]
|
||||
----
|
||||
Gerrit.install(function (self) {
|
||||
// ... plugin JavaScript code here ...
|
||||
});
|
||||
----
|
||||
|
||||
GERRIT
|
||||
------
|
||||
Part of link:index.html[Gerrit Code Review]
|
||||
|
||||
SEARCHBOX
|
||||
---------
|
||||
@@ -1,4 +1,4 @@
|
||||
= Gerrit Code Review - Admin customization API
|
||||
= Gerrit Code Review - JavaScript Plugin Admin API
|
||||
|
||||
This API is provided by link:pg-plugin-dev.html#plugin-admin[plugin.admin()]
|
||||
and provides customization of the admin menu.
|
||||
@@ -18,4 +18,4 @@ a non-external link should be relative beginning with a slash. For example, to
|
||||
create a link to open changes, use the value `/q/status:open`.
|
||||
|
||||
See more about capability from
|
||||
link:rest-api-accounts.html#list-account-capabilities[List Account Capabilities].
|
||||
link:rest-api-accounts.html#list-account-capabilities[List Account Capabilities].
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
= Gerrit Code Review - Change metadata plugin API
|
||||
|
||||
This API is provided by
|
||||
link:pg-plugin-dev.html#change-metadata[plugin.changeMetadata()] and provides
|
||||
interface for customization and data updates of change metadata.
|
||||
|
||||
== onLabelsChanged
|
||||
`changeMetadataApi.onLabelsChanged(callback)`
|
||||
|
||||
.Params
|
||||
- *callback* function that's executed when labels changed on the server.
|
||||
Callback receives labels with scores applied to the change, map of the label
|
||||
names to link:rest-api-changes.html#label-info[LabelInfo] entries
|
||||
|
||||
.Returns
|
||||
- `GrChangeMetadataApi` for chaining.
|
||||
@@ -1,35 +1,30 @@
|
||||
:linkattrs:
|
||||
= Gerrit Code Review - PolyGerrit Plugin Development
|
||||
= Gerrit Code Review - JavaScript Plugin Development and API
|
||||
|
||||
CAUTION: Work in progress. Hard hat area. Please
|
||||
link:https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20plugins[send
|
||||
feedback,role=external,window=_blank] if something's not right.
|
||||
|
||||
For migrating existing GWT UI plugins, please check out the
|
||||
link:pg-plugin-migration.html#migration[migration guide].
|
||||
Gerrit Code Review supports an API for JavaScript plugins to interact
|
||||
with the web UI and the server process.
|
||||
|
||||
[[loading]]
|
||||
== Plugin loading and initialization
|
||||
|
||||
link:js-api.html#_entry_point[Entry point] for the plugin.
|
||||
JavaScript is loaded using a standard `<script src='...'>` HTML tag.
|
||||
Plugins should protect the global namespace by defining their code
|
||||
within an anonymous function passed to `Gerrit.install()`. The plugin
|
||||
will be passed an object describing its registration with Gerrit.
|
||||
|
||||
* The plugin provides pluginname.js, and can be a standalone file or a static
|
||||
asset in a jar as a link:dev-plugins.html#deployment[Web UI plugin].
|
||||
* pluginname.js contains a call to `Gerrit.install()`. There should
|
||||
only be single `Gerrit.install()` per file.
|
||||
* PolyGerrit imports pluginname.js.
|
||||
only be a single `Gerrit.install()` call per file.
|
||||
* The Gerrit web app imports pluginname.js.
|
||||
* For standalone plugins, the entry point file is a `pluginname.js` file
|
||||
located in `gerrit-site/plugins` folder, where `pluginname` is an alphanumeric
|
||||
plugin name.
|
||||
|
||||
Note: Code examples target modern browsers (Chrome, Firefox, Safari, Edge).
|
||||
|
||||
Here's a recommended starter `myplugin.js`:
|
||||
|
||||
``` js
|
||||
Gerrit.install(plugin => {
|
||||
'use strict';
|
||||
|
||||
// Your code here.
|
||||
});
|
||||
```
|
||||
@@ -41,7 +36,7 @@ Basically, the DOM is the API surface. Low-level API provides methods for
|
||||
decorating, replacing, and styling DOM elements exposed through a set of
|
||||
link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
PolyGerrit provides a simple way for accessing the DOM via DOM hooks API. A DOM
|
||||
Gerrit provides a simple way for accessing the DOM via DOM hooks API. A DOM
|
||||
hook is a custom element that is instantiated for the plugin endpoint. In the
|
||||
decoration case, a hook is set with a `content` attribute that points to the DOM
|
||||
element.
|
||||
@@ -64,7 +59,7 @@ Gerrit.install(plugin => {
|
||||
[[low-level-decorating]]
|
||||
=== Decorating DOM Elements
|
||||
|
||||
For each endpoint, PolyGerrit provides a list of DOM properties (such as
|
||||
For each endpoint, Gerrit provides a list of DOM properties (such as
|
||||
attributes and events) that are supported in the long-term.
|
||||
|
||||
``` js
|
||||
@@ -149,42 +144,83 @@ attribute changes to callbacks.
|
||||
See `samples/bind-parameters.js` for examples on both Polymer data bindings
|
||||
and `attibuteHelper` usage.
|
||||
|
||||
=== eventHelper
|
||||
`plugin.eventHelper(element)`
|
||||
|
||||
Note: TODO
|
||||
|
||||
=== hook
|
||||
`plugin.hook(endpointName, opt_options)`
|
||||
|
||||
See list of supported link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
Note: TODO
|
||||
See link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
=== registerCustomComponent
|
||||
`plugin.registerCustomComponent(endpointName, opt_moduleName, opt_options)`
|
||||
|
||||
See list of supported link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
Note: TODO
|
||||
See link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
=== registerDynamicCustomComponent
|
||||
`plugin.registerDynamicCustomComponent(dynamicEndpointName, opt_moduleName,
|
||||
opt_options)`
|
||||
|
||||
See list of supported link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
Note: TODO
|
||||
See link:pg-plugin-endpoints.html[endpoints].
|
||||
|
||||
=== registerStyleModule
|
||||
`plugin.registerStyleModule(endpointName, moduleName)`
|
||||
|
||||
Note: TODO
|
||||
See link:#low-level-style[above].
|
||||
|
||||
=== on
|
||||
Register a JavaScript callback to be invoked when events occur within
|
||||
the web interface. Signature
|
||||
|
||||
``` js
|
||||
self.on(event, callback);
|
||||
```
|
||||
|
||||
Parameters
|
||||
|
||||
* event: A supported event type. See below for description.
|
||||
|
||||
* callback: JavaScript function to be invoked when event happens.
|
||||
Arguments may be passed to this function, depending on the event.
|
||||
|
||||
Supported events:
|
||||
|
||||
* `history`: Invoked when the view is changed to a new screen within
|
||||
the Gerrit web application. The token after "#" is passed as the
|
||||
argument to the callback function, for example "/c/42/" while
|
||||
showing change 42.
|
||||
|
||||
* `showchange`: Invoked when a change is made visible. A
|
||||
link:rest-api-changes.html#change-info[ChangeInfo] and
|
||||
link:rest-api-changes.html#revision-info[RevisionInfo]
|
||||
are passed as arguments. Gerrit provides a third parameter which
|
||||
is an object with a `mergeable` boolean.
|
||||
|
||||
* `submitchange`: Invoked when the submit button is clicked
|
||||
on a change. A link:rest-api-changes.html#change-info[ChangeInfo]
|
||||
and link:rest-api-changes.html#revision-info[RevisionInfo] are
|
||||
passed as arguments. Similar to a form submit validation, the
|
||||
function must return true to allow the operation to continue, or
|
||||
false to prevent it. The function may be called multiple times, for
|
||||
example, if submitting a change shows a confirmation dialog, this
|
||||
event may be called to validate that the check whether dialog can be
|
||||
shown, and called again when the submit is confirmed to check whether
|
||||
the actual submission action can proceed.
|
||||
|
||||
* `comment`: Invoked when a DOM element that represents a comment is
|
||||
created. This DOM element is passed as argument. This DOM element
|
||||
contains nested elements that Gerrit uses to format the comment. The
|
||||
DOM structure may differ between comment types such as inline
|
||||
comments, file-level comments and summary comments, and it may change
|
||||
with new Gerrit versions.
|
||||
|
||||
* `highlightjs-loaded`: Invoked when the highlight.js library has
|
||||
finished loading. The global `hljs` object (also now accessible via
|
||||
`window.hljs`) is passed as an argument to the callback function.
|
||||
This event can be used to register a new language highlighter with
|
||||
the highlight.js library before syntax highlighting begins.
|
||||
|
||||
[[high-level-api]]
|
||||
== High-level API
|
||||
|
||||
Plugin instance provides access to number of more specific APIs and methods
|
||||
Plugin instance provides access to a number of more specific APIs and methods
|
||||
to be used by plugin authors.
|
||||
|
||||
=== admin
|
||||
@@ -196,95 +232,161 @@ to be used by plugin authors.
|
||||
.Returns:
|
||||
- Instance of link:pg-plugin-admin-api.html[GrAdminApi].
|
||||
|
||||
=== changeActions
|
||||
`self.changeActions()`
|
||||
|
||||
Returns an instance of the
|
||||
link:https://gerrit.googlesource.com/gerrit/+/master/polygerrit-ui/app/api/change-actions.ts[ChangeActionsPluginApi].
|
||||
|
||||
==== changeActions.add()
|
||||
Adds a new action to the change actions section. Returns the key of the newly
|
||||
added action.
|
||||
|
||||
``` js
|
||||
changeActions.add(type, label)
|
||||
```
|
||||
|
||||
* type: The type of the action, either `change` or `revision`.
|
||||
|
||||
* label: The label to be used in UI for this action.
|
||||
|
||||
|
||||
==== changeActions.remove()
|
||||
Removes an action from the change actions section.
|
||||
|
||||
``` js
|
||||
changeActions.remove(key)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
|
||||
==== changeActions.addTapListener()
|
||||
Adds a tap listener to an action that will be invoked when the action
|
||||
is tapped.
|
||||
|
||||
``` js
|
||||
changeActions.addTapListener(key, callback)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* callback: JavaScript function to be invoked when action tapped.
|
||||
|
||||
|
||||
==== changeActions.removeTapListener()
|
||||
Removes an existing tap listener on an action.
|
||||
|
||||
``` js
|
||||
changeActions.removeTapListener(key, callback)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* callback: JavaScript function to be removed.
|
||||
|
||||
|
||||
==== changeActions.setLabel()
|
||||
Sets the label for an action.
|
||||
|
||||
``` js
|
||||
changeActions.setLabel(key, label)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* label: The label of the action.
|
||||
|
||||
|
||||
==== changeActions.setTitle()
|
||||
Sets the title for an action.
|
||||
|
||||
``` js
|
||||
changeActions.setTitle(key, title)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* title: The title of the action.
|
||||
|
||||
|
||||
==== changeActions.setIcon()
|
||||
Sets an icon for an action.
|
||||
|
||||
``` js
|
||||
changeActions.setIcon(key, icon)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* icon: The name of the icon.
|
||||
|
||||
|
||||
==== changeActions.setEnabled()
|
||||
Sets an action to enabled or disabled.
|
||||
|
||||
``` js
|
||||
changeActions.setEnabled(key, enabled)
|
||||
```
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* enabled: The status of the action, true to enable.
|
||||
|
||||
|
||||
==== changeActions.setActionHidden()
|
||||
Sets an action to be hidden.
|
||||
|
||||
``` js
|
||||
changeActions.setActionHidden(type, key, hidden)
|
||||
```
|
||||
|
||||
* type: The type of the action.
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* hidden: True to hide the action, false to show the action.
|
||||
|
||||
|
||||
==== changeActions.setActionOverflow()
|
||||
Sets an action to show in overflow menu.
|
||||
|
||||
``` js
|
||||
changeActions.setActionOverflow(type, key, overflow)
|
||||
```
|
||||
|
||||
* type: The type of the action.
|
||||
|
||||
* key: The key of the action.
|
||||
|
||||
* overflow: True to move the action to overflow menu, false to move
|
||||
the action out of the overflow menu.
|
||||
|
||||
|
||||
=== changeReply
|
||||
`plugin.changeReply()`
|
||||
|
||||
Note: TODO
|
||||
|
||||
=== delete
|
||||
`plugin.delete(url, opt_callback)`
|
||||
|
||||
Note: TODO
|
||||
|
||||
=== get
|
||||
`plugin.get(url, opt_callback)`
|
||||
|
||||
Note: TODO
|
||||
Returns an instance of the
|
||||
link:https://gerrit.googlesource.com/gerrit/+/master/polygerrit-ui/app/api/change-reply.ts[ChangeReplyPluginApi].
|
||||
|
||||
=== getPluginName
|
||||
`plugin.getPluginName()`
|
||||
|
||||
Note: TODO
|
||||
Returns the name this plugin was installed as by the server
|
||||
administrator. The plugin name is required to access REST API
|
||||
views installed by the plugin, or to access resources.
|
||||
|
||||
=== getServerInfo
|
||||
`plugin.getServerInfo()`
|
||||
|
||||
Note: TODO
|
||||
|
||||
=== on
|
||||
`plugin.on(eventName, callback)`
|
||||
|
||||
Note: TODO
|
||||
|
||||
=== panel
|
||||
`plugin.panel(extensionpoint, callback)`
|
||||
|
||||
Deprecated. Use `plugin.registerCustomComponent()` instead.
|
||||
|
||||
``` js
|
||||
Gerrit.install(function(self) {
|
||||
self.panel('CHANGE_SCREEN_BELOW_COMMIT_INFO_BLOCK', function(context) {
|
||||
context.body.innerHTML =
|
||||
'Sample link: <a href="http://some.com/foo">Foo</a>';
|
||||
context.show();
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
Here's the recommended approach that uses Polymer for generating custom elements:
|
||||
|
||||
``` js
|
||||
class SomeCiModule extends Polymer.Element {
|
||||
static get is() {
|
||||
return "some-ci-module";
|
||||
}
|
||||
static get template() {
|
||||
return Polymer.html`
|
||||
Sample link: <a href="http://some.com/foo">Foo</a>
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
// Register this element
|
||||
customElements.define(SomeCiModule.is, SomeCiModule);
|
||||
|
||||
// Install the plugin
|
||||
Gerrit.install(plugin => {
|
||||
plugin.registerCustomComponent('change-view-integration', 'some-ci-module');
|
||||
});
|
||||
```
|
||||
|
||||
See `samples/` for more examples.
|
||||
|
||||
Here's a minimal example that uses low-level DOM Hooks API for the same purpose:
|
||||
|
||||
``` js
|
||||
Gerrit.install(plugin => {
|
||||
plugin.hook('change-view-integration', el => {
|
||||
el.innerHTML = 'Sample link: <a href="http://some.com/foo">Foo</a>';
|
||||
});
|
||||
});
|
||||
```
|
||||
Returns the host config as a link:rest-api-config.html#server-info[ServerInfo]
|
||||
object.
|
||||
|
||||
=== popup
|
||||
`plugin.popup(moduleName)`
|
||||
|
||||
Note: TODO
|
||||
|
||||
=== post
|
||||
`plugin.post(url, payload, opt_callback)`
|
||||
|
||||
Note: TODO
|
||||
Creates a popup that contains the given web components. Can be controlled with
|
||||
calling `open()` and `close()` on the return value.
|
||||
|
||||
[[plugin-rest-api]]
|
||||
=== restApi
|
||||
@@ -295,26 +397,17 @@ Note: TODO
|
||||
e.g. `changes/1/revisions/1/cookbook~say-hello`
|
||||
|
||||
.Returns:
|
||||
- Instance of link:pg-plugin-rest-api.html[GrPluginRestApi].
|
||||
|
||||
[[plugin-repo]]
|
||||
=== repo
|
||||
`plugin.repo()`
|
||||
|
||||
.Params:
|
||||
- none
|
||||
|
||||
.Returns:
|
||||
- Instance of link:pg-plugin-repo-api.html[GrRepoApi].
|
||||
|
||||
=== put
|
||||
`plugin.put(url, payload, opt_callback)`
|
||||
|
||||
Note: TODO
|
||||
- Instance of link:pg-plugin-rest-api.html[RestPluginApi].
|
||||
|
||||
[[plugin-screen]]
|
||||
=== screen
|
||||
`plugin.screen(screenName, opt_moduleName)`
|
||||
|
||||
Registers a web component as a dedicated top-level page that the router
|
||||
understands and that has a URL (/x/pluginname/screenname) that can be navigated
|
||||
to. Extension screens are usually linked from the
|
||||
link:dev-plugins.html#top-menu-extensions[top menu].
|
||||
|
||||
.Params:
|
||||
- `*string* screenName` URL path fragment of the screen, e.g.
|
||||
`/x/pluginname/*screenname*`
|
||||
@@ -322,57 +415,20 @@ Note: TODO
|
||||
screen.
|
||||
|
||||
.Returns:
|
||||
- Instance of GrDomHook.
|
||||
|
||||
=== screenUrl
|
||||
`plugin.url(opt_screenName)`
|
||||
|
||||
.Params:
|
||||
- `*string* screenName` (optional) URL path fragment of the screen, e.g.
|
||||
`/x/pluginname/*screenname*`
|
||||
|
||||
.Returns:
|
||||
- Absolute URL for the screen, e.g. `http://localhost/base/x/pluginname/screenname`
|
||||
|
||||
[[plugin-settings]]
|
||||
=== settings
|
||||
`plugin.settings()`
|
||||
|
||||
.Params:
|
||||
- none
|
||||
|
||||
.Returns:
|
||||
- Instance of link:pg-plugin-settings-api.html[GrSettingsApi].
|
||||
|
||||
=== settingsScreen
|
||||
`plugin.settingsScreen(path, menu, callback)`
|
||||
|
||||
Deprecated. Use link:#plugin-settings[`plugin.settings()`] instead.
|
||||
|
||||
[[plugin-styles]]
|
||||
=== styles
|
||||
`plugin.styles()`
|
||||
|
||||
.Params:
|
||||
- none
|
||||
|
||||
.Returns:
|
||||
- Instance of link:pg-plugin-styles-api.html[GrStylesApi]
|
||||
|
||||
=== changeMetadata
|
||||
`plugin.changeMetadata()`
|
||||
|
||||
.Params:
|
||||
- none
|
||||
|
||||
.Returns:
|
||||
- Instance of link:pg-plugin-change-metadata-api.html[GrChangeMetadataApi].
|
||||
|
||||
=== theme
|
||||
`plugin.theme()`
|
||||
|
||||
|
||||
Note: TODO
|
||||
- Instance of HookApi.
|
||||
|
||||
=== url
|
||||
`plugin.url(opt_path)`
|
||||
`plugin.url(opt_path)`
|
||||
|
||||
Returns a URL within the plugin's URL space. If invoked with no
|
||||
parameter the URL of the plugin is returned. If passed a string
|
||||
the argument is appended to the plugin URL.
|
||||
|
||||
A plugin's URL is where this plugin is loaded, it doesn't
|
||||
necessary to be the same as the Gerrit host. Use `window.location`
|
||||
if you need to access the Gerrit host info.
|
||||
|
||||
``` js
|
||||
self.url(); // "https://gerrit-review.googlesource.com/plugins/demo/"
|
||||
self.url('/static/icon.png'); // "https://gerrit-review.googlesource.com/plugins/demo/static/icon.png"
|
||||
```
|
||||
|
||||
@@ -1,16 +1,24 @@
|
||||
= Gerrit Code Review - PolyGerrit Plugin Styling
|
||||
= Gerrit Code Review - JavaScript Plugin Endpoints
|
||||
|
||||
Plugins should be html-based and imported following PolyGerrit's
|
||||
link:pg-plugin-dev.html#loading[dev guide].
|
||||
This document describes Gerrit JavaScript plugin endpoints that you can hook
|
||||
into for customizing the UI. It is assumed that you are familiar with
|
||||
link:pg-plugin-dev.html#loading[the general dev guide].
|
||||
|
||||
Sample code for testing endpoints:
|
||||
You can either hook into an endpoint by calling `plugin.hook(endpoint)` and
|
||||
then interact with the returned `HookApi`, which has `onAttached(callback)` and
|
||||
`onDetached(callback)` methods.
|
||||
|
||||
Or you can define a
|
||||
link:https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements[Web Component,role=external,window=_blank]
|
||||
and register it directly using
|
||||
`plugin.registerCustomComponent(endpoint, elementName)`.
|
||||
|
||||
Sample code for using an endpoint:
|
||||
|
||||
``` 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;';
|
||||
@@ -42,9 +50,8 @@ 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 Log` section on the change view page, and it may take full page's
|
||||
width.
|
||||
|
||||
* `change`
|
||||
+
|
||||
@@ -174,7 +181,8 @@ link:rest-api-changes.html#revision-info[RevisionInfo]
|
||||
|
||||
== Dynamic Plugin endpoints
|
||||
|
||||
The following endpoints are available to plugins.
|
||||
The following dynamic endpoints are available to plugins by calling
|
||||
`plugin.registerDynamicCustomComponent(endpoint, elementName)`.
|
||||
|
||||
=== change-list-header
|
||||
The `change-list-header` extension point adds a header to the change list view.
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
:linkattrs:
|
||||
= Gerrit Code Review - PolyGerrit Plugin Development
|
||||
|
||||
CAUTION: Work in progress. Hard hat area. Please
|
||||
link:https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20plugins[send
|
||||
feedback,role=external,window=_blank] if something's not right.
|
||||
|
||||
[[migration]]
|
||||
== Incremental migration of existing GWT UI plugins
|
||||
|
||||
link:pg-plugin-dev.html[PolyGerrit plugin API] is based on different concepts and
|
||||
provides a different type of API compared to the one available to GWT
|
||||
plugins. Depending on the plugin, it might require significant modifications to
|
||||
existing UI scripts to fully take advantage of the benefits provided by the PolyGerrit API.
|
||||
|
||||
To make migration easier, PolyGerrit recommends an incremental migration
|
||||
strategy. Starting with a .js file that works for GWT UI, plugin author can
|
||||
incrementally migrate deprecated APIs to the new plugin API.
|
||||
|
||||
The goal for this guide is to provide a migration path from .js-based UI script to
|
||||
a html based implementation
|
||||
|
||||
NOTE: Web UI plugins distributed as a single .js file are not covered in this
|
||||
guide.
|
||||
|
||||
Let's start with a basic plugin that has an UI module. Commonly, file tree
|
||||
should look like this:
|
||||
|
||||
├── BUILD
|
||||
├── LICENSE
|
||||
└── src
|
||||
└── main
|
||||
├── java
|
||||
│ └── com
|
||||
│ └── foo
|
||||
│ └── SamplePluginModule.java
|
||||
└── resources
|
||||
└── static
|
||||
└── sampleplugin.js
|
||||
|
||||
For simplicity's sake, let's assume SamplePluginModule.java has following
|
||||
content:
|
||||
|
||||
``` java
|
||||
public class SamplePluginModule extends AbstractModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
DynamicSet.bind(binder(), WebUiPlugin.class)
|
||||
.toInstance(new JavaScriptPlugin("sampleplugin.js"));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
=== Step 1: Create `sampleplugin.html`
|
||||
|
||||
As a first step, create `sampleplugin.html` and include the UI script in the
|
||||
module file.
|
||||
|
||||
NOTE: GWT UI ignores html files which it doesn't support.
|
||||
|
||||
``` java
|
||||
@Override
|
||||
protected void configure() {
|
||||
DynamicSet.bind(binder(), WebUiPlugin.class)
|
||||
.toInstance(new JavaScriptPlugin("sampleplugin.js"));
|
||||
DynamicSet.bind(binder(), WebUiPlugin.class)
|
||||
.toInstance(new JavaScriptPlugin("sampleplugin.html"));
|
||||
}
|
||||
```
|
||||
|
||||
Here's recommended starter code for `sampleplugin.html`:
|
||||
|
||||
NOTE: By specification, the `id` attribute of `dom-module` *must* contain a dash
|
||||
(-).
|
||||
|
||||
``` html
|
||||
<dom-module id="sample-plugin">
|
||||
<script>
|
||||
Gerrit.install(plugin => {
|
||||
// Setup block, is executed before sampleplugin.js
|
||||
});
|
||||
</script>
|
||||
|
||||
<script src="./sampleplugin.js"></script>
|
||||
|
||||
<script>
|
||||
Gerrit.install(plugin => {
|
||||
// Cleanup block, is executed after sampleplugin.js
|
||||
});
|
||||
</script>
|
||||
</dom-module>
|
||||
```
|
||||
|
||||
Here's how this works:
|
||||
|
||||
- PolyGerrit detects migration scenario because UI scripts have same filename
|
||||
and different extensions
|
||||
* PolyGerrit will load `sampleplugin.html` and skip `sampleplugin.js`
|
||||
* PolyGerrit will reuse `plugin` (aka `self`) instance for `Gerrit.install()`
|
||||
callbacks
|
||||
- `sampleplugin.js` is loaded since it's referenced in `sampleplugin.html`
|
||||
- setup script tag code is executed before `sampleplugin.js`
|
||||
- cleanup script tag code is executed after `sampleplugin.js`
|
||||
|
||||
This means the plugin instance is shared between .html-based and .js-based
|
||||
code. This allows to gradually and incrementally transfer code to the new API.
|
||||
|
||||
=== Step 2: Create cut-off marker in `sampleplugin.js`
|
||||
|
||||
Commonly, window.Polymer is being used to detect in GWT UI script if it's being
|
||||
executed inside PolyGerrit. This could be used to separate code that was already
|
||||
migrated to new APIs from old not yet migrated code.
|
||||
|
||||
During incremental migration, some of the UI code will be reimplemented using
|
||||
the PolyGerrit plugin API. However, old code still could be required for the plugin
|
||||
to work in GWT UI.
|
||||
|
||||
To handle this case, add the following code at the end of the installation
|
||||
callback in `sampleplugin.js`
|
||||
|
||||
``` js
|
||||
Gerrit.install(function(self) {
|
||||
|
||||
// Existing code here, not modified.
|
||||
|
||||
if (window.Polymer) { return; } // Cut-off marker
|
||||
|
||||
// Everything below was migrated to PolyGerrit plugin API.
|
||||
// Code below is still needed for the plugin to work in GWT UI.
|
||||
});
|
||||
```
|
||||
|
||||
=== Step 3: Migrate!
|
||||
|
||||
The code that uses deprecated APIs should be eventually rewritten using
|
||||
non-deprecated counterparts. Duplicated pieces could be kept under cut-off
|
||||
marker to work in GWT UI.
|
||||
|
||||
If some data or functions needs to be shared between code in .html and .js, it
|
||||
could be stored in the `plugin` (aka `self`) object that's shared between both
|
||||
|
||||
=== Step 4: Cleanup
|
||||
|
||||
Once deprecated APIs are migrated, `sampleplugin.js` will only contain
|
||||
duplicated code that's required for GWT UI to work. As soon as GWT support is removed from Gerrit
|
||||
that file can be simply deleted, along with the script tag loading it.
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
= Gerrit Code Review - Repo admin customization API
|
||||
|
||||
This API is provided by link:pg-plugin-dev.html#plugin-repo[plugin.repo()]
|
||||
and provides customization to admin page.
|
||||
|
||||
== createCommand
|
||||
`repoApi.createCommand(title, checkVisibleCallback)`
|
||||
|
||||
Create a repo command in the admin panel.
|
||||
|
||||
.Params
|
||||
- *title* String title.
|
||||
- *checkVisibleCallback* function to configure command visibility.
|
||||
|
||||
.Returns
|
||||
- GrRepoApi for chaining.
|
||||
|
||||
`checkVisibleCallback(repoName, repoConfig)`
|
||||
|
||||
.Params
|
||||
- *repoName* String project name.
|
||||
- *repoConfig* Object REST API response for repo config.
|
||||
|
||||
.Returns
|
||||
- `false` to hide the command for the specific project.
|
||||
|
||||
== onTap
|
||||
`repoApi.onTap(tapCalback)`
|
||||
|
||||
Add a command tap callback.
|
||||
|
||||
.Params
|
||||
- *tapCallback* function that's excuted on command tap.
|
||||
|
||||
.Returns
|
||||
- Nothing
|
||||
@@ -1,4 +1,4 @@
|
||||
= Gerrit Code Review - Repo admin customization API
|
||||
= Gerrit Code Review - JavaScript Plugin Rest API
|
||||
|
||||
This API is provided by link:pg-plugin-dev.html#plugin-rest-api[plugin.restApi()]
|
||||
and provides interface for Gerrit REST API.
|
||||
@@ -28,13 +28,14 @@ Get server version.
|
||||
== getConfig
|
||||
`repoApi.getConfig()`
|
||||
|
||||
Get server config.
|
||||
Returns the host config as a link:rest-api-config.html#server-info[ServerInfo]
|
||||
object.
|
||||
|
||||
.Params
|
||||
- None
|
||||
|
||||
.Returns
|
||||
- Promise<Object>
|
||||
- Promise<ServerInfo>
|
||||
|
||||
== get
|
||||
`repoApi.get(url)`
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
= Gerrit Code Review - Settings admin customization API
|
||||
|
||||
This API is provided by link:pg-plugin-dev.html#plugin-settings[plugin.settings()]
|
||||
and provides customization to settings page.
|
||||
|
||||
== title
|
||||
`settingsApi.title(title)`
|
||||
|
||||
.Params
|
||||
- `*string* title` Menu item and settings section title
|
||||
|
||||
.Returns
|
||||
- `GrSettingsApi` for chaining.
|
||||
|
||||
== token
|
||||
`settingsApi.token(token)`
|
||||
|
||||
.Params
|
||||
- `*string* token` URL path fragment of the screen for direct link, e.g.
|
||||
`settings/#x/some-plugin/*token*`
|
||||
|
||||
.Returns
|
||||
- `GrSettingsApi` for chaining.
|
||||
|
||||
== module
|
||||
`settingsApi.module(token)`
|
||||
|
||||
.Params
|
||||
- `*string* module` Custom element name for instantiating in the settings plugin
|
||||
area.
|
||||
|
||||
.Returns
|
||||
- `GrSettingsApi` for chaining.
|
||||
|
||||
== build
|
||||
|
||||
.Params
|
||||
- none
|
||||
|
||||
Apply all other configuration parameters and create required UI elements.
|
||||
@@ -1,33 +0,0 @@
|
||||
= Gerrit Code Review - GrStyleObject
|
||||
|
||||
Store information about css style properties. You can't create this object
|
||||
directly. Instead you should use the link:pg-plugin-styles-api.html#css[css] method.
|
||||
This object allows to apply style correctly to elements within different shadow
|
||||
subtree.
|
||||
|
||||
[[get-class-name]]
|
||||
== getClassName
|
||||
`styleObject.getClassName(element)`
|
||||
|
||||
.Params
|
||||
- `element` - an HTMLElement.
|
||||
|
||||
.Returns
|
||||
- `string` - class name. The class name is valid only within the shadow root of `element`.
|
||||
|
||||
Creates a new unique CSS class and injects it into the appropriate place
|
||||
in DOM (it can be document or shadow root for element). This class can be later
|
||||
added to the element or to any other element in the same shadow root. It is guarantee,
|
||||
that method adds CSS class only once for each shadow root.
|
||||
|
||||
== apply
|
||||
`styleObject.apply(element)`
|
||||
|
||||
.Params
|
||||
- `element` - element to apply style.
|
||||
|
||||
Create a new unique CSS class (see link:#get-class-name[getClassName]) and
|
||||
adds class to the element.
|
||||
|
||||
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
= Gerrit Code Review - Plugin styles API
|
||||
|
||||
This API is provided by link:pg-plugin-dev.html#plugin-styles[plugin.styles()]
|
||||
and provides a way to apply dynamically created styles to elements in a
|
||||
document.
|
||||
|
||||
[[css]]
|
||||
== css
|
||||
`styles.css(rulesStr)`
|
||||
|
||||
.Params
|
||||
- `*string* rulesStr` string with CSS styling declarations.
|
||||
|
||||
Example:
|
||||
----
|
||||
const styleObject = plugin.styles().css('background: black; color: white;');
|
||||
...
|
||||
const className = styleObject.getClassName(element)
|
||||
...
|
||||
element.classList.add(className);
|
||||
...
|
||||
styleObject.apply(someOtherElement);
|
||||
----
|
||||
|
||||
.Returns
|
||||
- Instance of link:pg-plugin-style-object.html[GrStyleObject].
|
||||
|
||||
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
:linkattrs:
|
||||
= Gerrit Code Review - PolyGerrit Plugin Styling
|
||||
|
||||
== Plugin styles
|
||||
|
||||
Plugins may provide
|
||||
link:https://www.polymer-project.org/2.0/docs/devguide/style-shadow-dom#style-modules[Polymer
|
||||
style modules,role=external,window=_blank] for UI CSS-based customization.
|
||||
|
||||
PolyGerrit UI implements number of styling endpoints, which apply CSS mixins
|
||||
link:https://tabatkins.github.io/specs/css-apply-rule/[using @apply,role=external,window=_blank] to its
|
||||
direct contents.
|
||||
|
||||
NOTE: Only items (i.e. CSS properties and mixin targets) documented here are
|
||||
guaranteed to work in the long term, since they are covered by integration
|
||||
tests. + When there is a need to add new property or endpoint, please
|
||||
link:https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20Issue[file
|
||||
a bug,role=external,window=_blank] stating your use case to track and maintain for future releases.
|
||||
|
||||
Plugins should be html-based and imported following PolyGerrit's
|
||||
link:pg-plugin-dev.html#loading[dev guide].
|
||||
|
||||
Plugins should provide Style Module, for example:
|
||||
|
||||
``` html
|
||||
<dom-module id="some-style">
|
||||
<template>
|
||||
<style>
|
||||
html {
|
||||
--css-mixin-name: {
|
||||
property: value;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</template>
|
||||
</dom-module>
|
||||
```
|
||||
|
||||
Plugins should register style module with a styling endpoint using
|
||||
`Plugin.prototype.registerStyleModule(endpointName, styleModuleName)`, for
|
||||
example:
|
||||
|
||||
``` js
|
||||
Gerrit.install(function(plugin) {
|
||||
plugin.registerStyleModule('some-endpoint', 'some-style');
|
||||
});
|
||||
```
|
||||
|
||||
== Available styling endpoints
|
||||
=== change-metadata
|
||||
Following custom CSS mixins are recognized:
|
||||
|
||||
* `--change-metadata-assignee`
|
||||
+
|
||||
is applied to `gr-change-metadata section.assignee`
|
||||
* `--change-metadata-label-status`
|
||||
+
|
||||
is applied to `gr-change-metadata section.labelStatus`
|
||||
* `--change-metadata-strategy`
|
||||
+
|
||||
is applied to `gr-change-metadata section.strategy`
|
||||
* `--change-metadata-topic`
|
||||
+
|
||||
is applied to `gr-change-metadata section.topic`
|
||||
|
||||
Following CSS properties have
|
||||
link:https://gerrit.googlesource.com/gerrit/+/master/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata-it_test.html[long-term
|
||||
support via integration test,role=external,window=_blank]:
|
||||
|
||||
* `display`
|
||||
+
|
||||
can be set to `none` to hide a section.
|
||||
@@ -2773,7 +2773,7 @@ Which theme to use.
|
||||
Allowed values are `DARK` or `LIGHT`.
|
||||
|`expand_inline_diffs` |not set if `false`|
|
||||
Whether to expand diffs inline instead of opening as separate page
|
||||
(PolyGerrit only).
|
||||
(Gerrit web app UI only).
|
||||
|`download_scheme` |optional|
|
||||
The type of download URL the user prefers to use. May be any key from
|
||||
the `schemes` map in
|
||||
@@ -2802,8 +2802,8 @@ inline edit feature.
|
||||
The menu items of the `MY` top menu as a list of
|
||||
link:rest-api-config.html#top-menu-item-info[TopMenuItemInfo] entities.
|
||||
|`change_table` ||
|
||||
The columns to display in the change table (PolyGerrit only). The default is
|
||||
empty, which will default columns as determined by the frontend.
|
||||
The columns to display in the change table (Gerrit web app UI only). The
|
||||
default is empty, which will default columns as determined by the frontend.
|
||||
|`email_strategy` ||
|
||||
The type of email strategy to use. On `ENABLED`, the user will receive emails
|
||||
from Gerrit. On `CC_ON_OWN_COMMENTS` the user will also receive emails for
|
||||
@@ -2842,7 +2842,7 @@ Which theme to use.
|
||||
Allowed values are `DARK` or `LIGHT`.
|
||||
|`expand_inline_diffs` |not set if `false`|
|
||||
Whether to expand diffs inline instead of opening as separate page
|
||||
(PolyGerrit only).
|
||||
(Gerrit web app UI only).
|
||||
|`download_scheme` |optional|
|
||||
The type of download URL the user prefers to use.
|
||||
|`date_format` |optional|
|
||||
@@ -2869,8 +2869,8 @@ inline edit feature.
|
||||
The menu items of the `MY` top menu as a list of
|
||||
link:rest-api-config.html#top-menu-item-info[TopMenuItemInfo] entities.
|
||||
|`change_table` ||
|
||||
The columns to display in the change table (PolyGerrit only). The default is
|
||||
empty, which will default columns as determined by the frontend.
|
||||
The columns to display in the change table (Gerrit web app UI only). The
|
||||
default is empty, which will default columns as determined by the frontend.
|
||||
|`email_strategy` |optional|
|
||||
The type of email strategy to use. On `ENABLED`, the user will receive emails
|
||||
from Gerrit. On `CC_ON_OWN_COMMENTS` the user will also receive emails for
|
||||
|
||||
@@ -2012,7 +2012,7 @@ Information about the configuration from the
|
||||
link:config-gerrit.html#user[user] section as link:#user-config-info[
|
||||
UserConfigInfo] entity.
|
||||
|`default_theme` |optional|
|
||||
URL to a default PolyGerrit UI theme plugin, if available.
|
||||
URL to a default Gerrit UI theme plugin, if available.
|
||||
Located in `/static/gerrit-theme.js` by default.
|
||||
|=======================================
|
||||
|
||||
|
||||
@@ -46,10 +46,6 @@ results.
|
||||
"title": "Gerrit Code Review - REST API",
|
||||
"url": "Documentation/rest-api.html"
|
||||
},
|
||||
{
|
||||
"title": "Gerrit Code Review - JavaScript API",
|
||||
"url": "Documentation/js-api.html"
|
||||
},
|
||||
{
|
||||
"title": "Gerrit Code Review - /plugins/ REST API",
|
||||
"url": "Documentation/rest-api-plugins.html"
|
||||
@@ -67,9 +63,13 @@ results.
|
||||
"url": "Documentation/rest-api-access.html"
|
||||
},
|
||||
{
|
||||
"title": "Gerrit Code Review - Plugin Development",
|
||||
"title": "Gerrit Code Review - Java Plugin Development",
|
||||
"url": "Documentation/dev-plugins.html"
|
||||
},
|
||||
{
|
||||
"title": "Gerrit Code Review - JavaScript Plugin Development and API",
|
||||
"url": "Documentation/pg-plugin-dev.html"
|
||||
},
|
||||
{
|
||||
"title": "Gerrit Code Review - Developer Setup",
|
||||
"url": "Documentation/dev-readme.html"
|
||||
|
||||
Reference in New Issue
Block a user