diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 5e99db71bdf..e88b5ec4237 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -86,7 +86,10 @@ pages: - ['http_api/snapshot.md', 'API', 'Snapshot API'] - ['http_api/other.md', 'API', 'Other API'] -- ['plugins/plugins.md', 'Plugins', 'Plugins'] +- ['plugins/overview.md', 'Plugins', 'Overview'] +- ['plugins/installation.md', 'Plugins', 'Installation'] +- ['plugins/datasources.md', 'Plugins', 'Datasource plugins'] +- ['plugins/panels.md', 'Plugins', 'Panel plugins'] - ['tutorials/index.md', 'Tutorials', 'Tutorials'] - ['tutorials/hubot_howto.md', 'Tutorials', 'How To integrate Hubot and Grafana'] diff --git a/docs/sources/plugins/installation.md b/docs/sources/plugins/installation.md index c8bc9e813eb..b6db0e82b2c 100644 --- a/docs/sources/plugins/installation.md +++ b/docs/sources/plugins/installation.md @@ -8,37 +8,39 @@ page_keywords: grafana, plugins, documentation ## Installing plugins -The easiest way to install plugins is by using the CLI tool grafana-cli which is bundled with grafana. +The easiest way to install plugins is by using the CLI tool grafana-cli which is bundled with grafana. Before any modification take place after modifieng plugins, grafana-server need to be restarted. ### Grafana plugin directory On Linux systems the grafana-cli will assume that the grafana plugin directory is "/var/lib/grafana/plugins". Its possible to override the directory which grafana-cli will operate on by specifing the --path flag. On Windows systems this parameter have to be specified for every call. -### List available plugins +### Grafana-cli commands + +List available plugins ``` grafana-cli list-remove ``` -### Install a plugin type +Install a plugin type ``` grafana-cli install ``` -### List installed plugins +List installed plugins ``` grafana-cli ls ``` -### Upgrade all installed plugins +Upgrade all installed plugins ``` grafana-cli upgrade-all ``` -### Upgrade one plugin +Upgrade one plugin ``` grafana-cli upgrade ``` -### Remove one plugin +Remove one plugin ``` grafana-cli remove ``` diff --git a/public/app/features/plugins/edit_ctrl.ts b/public/app/features/plugins/edit_ctrl.ts index 3d1e724e0c4..6d693c19a4e 100644 --- a/public/app/features/plugins/edit_ctrl.ts +++ b/public/app/features/plugins/edit_ctrl.ts @@ -9,6 +9,8 @@ export class PluginEditCtrl { includedPanels: any; includedDatasources: any; tabIndex: number; + preUpdateHook: () => any; + postUpdateHook: () => any; /** @ngInject */ constructor(private backendSrv: any, private $routeParams: any) { @@ -24,20 +26,55 @@ export class PluginEditCtrl { } update() { - var updateCmd = _.extend({ - pluginId: this.model.pluginId, - orgId: this.model.orgId, - enabled: this.model.enabled, - pinned: this.model.pinned, - jsonData: this.model.jsonData, - secureJsonData: this.model.secureJsonData, - }, {}); + var chain = Promise.resolve(); + var self = this; + // if set, handle the preUpdateHook. If this returns a promise, + // the next step of execution will block until the promise resolves. + // if the promise is rejected, this update will be aborted. + if (this.preUpdateHook != null) { + chain = chain.then(function() { + return Promise.resolve(self.preUpdateHook()); + }); + } - this.backendSrv.post(`/api/org/plugins/${this.pluginId}/settings`, updateCmd).then(function() { + // Perform the core update procedure + chain = chain.then(function() { + var updateCmd = _.extend({ + pluginId: self.model.pluginId, + orgId: self.model.orgId, + enabled: self.model.enabled, + pinned: self.model.pinned, + jsonData: self.model.jsonData, + secureJsonData: self.model.secureJsonData, + }, {}); + + return self.backendSrv.post(`/api/org/plugins/${self.pluginId}/settings`, updateCmd); + }); + + // if set, performt he postUpdate hook. If a promise is returned it will block + // the final step of the update procedure (reloading the page) until the promise + // resolves. If the promise is rejected the page will not be reloaded. + if (this.postUpdateHook != null) { + chain = chain.then(function() { + return Promise.resolve(this.postUpdateHook()); + }); + } + + // all stesp in the update procedure are complete, so reload the page to make changes + // take effect. + chain.then(function() { window.location.href = window.location.href; }); } + setPreUpdateHook(callback: () => any) { + this.preUpdateHook = callback; + } + + setPOstUpdateHook(callback: () => any) { + this.postUpdateHook = callback; + } + toggleEnabled() { this.update(); }