summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--program/include/rcube_json_output.php13
-rwxr-xr-xprogram/include/rcube_template.php4
-rw-r--r--program/js/app.js6
-rw-r--r--program/js/common.js8
4 files changed, 24 insertions, 7 deletions
diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php
index 2fbf9c0c5..cedc6bf6c 100644
--- a/program/include/rcube_json_output.php
+++ b/program/include/rcube_json_output.php
@@ -33,6 +33,7 @@ class rcube_json_output
private $env = array();
private $texts = array();
private $commands = array();
+ private $callbacks = array();
private $message = null;
public $type = 'js';
@@ -122,7 +123,12 @@ class rcube_json_output
*/
public function command()
{
- $this->commands[] = func_get_args();
+ $cmd = func_get_args();
+
+ if (strpos($cmd[0], 'plugin.') === 0)
+ $this->callbacks[] = $cmd;
+ else
+ $this->commands[] = $cmd;
}
@@ -227,8 +233,11 @@ class rcube_json_output
if (!empty($this->texts))
$response['texts'] = $this->texts;
- // send response code
+ // send function calls
$response['exec'] = $this->get_js_commands() . $add;
+
+ if (!empty($this->callbacks))
+ $response['callbacks'] = $this->callbacks;
echo json_serialize($response);
}
diff --git a/program/include/rcube_template.php b/program/include/rcube_template.php
index 42b642a25..a358d0cfe 100755
--- a/program/include/rcube_template.php
+++ b/program/include/rcube_template.php
@@ -201,7 +201,9 @@ class rcube_template extends rcube_html_page
*/
public function command()
{
- $this->js_commands[] = func_get_args();
+ $cmd = func_get_args();
+ if (strpos($cmd[0], 'plugin.') === false)
+ $this->js_commands[] = $cmd;
}
diff --git a/program/js/app.js b/program/js/app.js
index 5e323e229..4f12e808a 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3923,6 +3923,12 @@ function rcube_webmail()
console.log(response.exec);
eval(response.exec);
}
+
+ // execute callback functions of plugins
+ if (response.callbacks && response.callbacks.length) {
+ for (var i=0; i < response.callbacks.length; i++)
+ this.triggerEvent(response.callbacks[i][0], response.callbacks[i][1]);
+ }
// process the response data according to the sent action
switch (response.action) {
diff --git a/program/js/common.js b/program/js/common.js
index 25b654612..1fd10c255 100644
--- a/program/js/common.js
+++ b/program/js/common.js
@@ -288,8 +288,8 @@ triggerEvent: function(evt, e)
{
var ret, h;
if (typeof e == 'undefined')
- e = {};
- if (typeof e == 'object')
+ e = this;
+ else if (typeof e == 'object')
e.event = evt;
if (this._events && this._events[evt] && !this._event_exec) {
@@ -297,9 +297,9 @@ triggerEvent: function(evt, e)
for (var i=0; i < this._events[evt].length; i++) {
if ((h = this._events[evt][i])) {
if (typeof h.func == 'function')
- ret = h.func.call ? h.func.call(h.obj, this, e) : h.func(this, e);
+ ret = h.func.call ? h.func.call(h.obj, e) : h.func(e);
else if (typeof h.obj[h.func] == 'function')
- ret = h.obj[h.func](this, e);
+ ret = h.obj[h.func](e);
// cancel event execution
if (typeof ret != 'undefined' && !ret)