Kaynağa Gözat

Merge pull request #4222 from raintank/pluginSettingEditHooks

Add support for pre/post update hooks in the PluginEditCtrl.
Torkel Ödegaard 9 yıl önce
ebeveyn
işleme
bfce379471
1 değiştirilmiş dosya ile 47 ekleme ve 10 silme
  1. 47 10
      public/app/features/plugins/edit_ctrl.ts

+ 47 - 10
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,
-    }, {});
-
-    this.backendSrv.post(`/api/org/plugins/${this.pluginId}/settings`, updateCmd).then(function() {
+    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());
+      });
+    }
+
+    // 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();
   }