add hooks for other plugins to interact with

dev_contacts
PhilW 7 years ago
parent 01bebe2ed4
commit 77a88d218b

@ -1,6 +1,7 @@
Roundcube Webmail Swipe Roundcube Webmail Swipe
======================= =======================
* Add hooks for other plugins to interact with
* Respect dont_override config * Respect dont_override config
* Respect disabled_actions config * Respect disabled_actions config
* Created plugin * Created plugin

@ -70,6 +70,28 @@ The following actions are available for down swipe:
* `checkmail` - Check for new messages in the current folder * `checkmail` - Check for new messages in the current folder
* `none` - Swipe disabled * `none` - Swipe disabled
Interaction with other plugins
------------------------------
The `swipe_actions_list` triggered when listing the available actions on the
list options menu.
*Arguments:*
* actions
* axis
*Return values:*
* actions
The `swipe-action` JS event is triggered when a swipe action is performed.
Return `false` to abort the action or return a JSON object like this to assign
an action:
```js
{
'class': '<class name for the action box>',
'text': '<text displayed in the action box>',
'callback': function(p) { <your action here> }
};
```
[rcplugrepo]: https://plugins.roundcube.net/packages/johndoh/swipe [rcplugrepo]: https://plugins.roundcube.net/packages/johndoh/swipe
[releases]: https://github.com/johndoh/roundcube-swipe/releases [releases]: https://github.com/johndoh/roundcube-swipe/releases
[gpl]: https://www.gnu.org/licenses/gpl.html [gpl]: https://www.gnu.org/licenses/gpl.html

@ -32,26 +32,26 @@ rcube_webmail.prototype.swipe_list_selection = function(uid, show, prev_sel) {
// make the system think no preview pane exists while we do some fake message selects // make the system think no preview pane exists while we do some fake message selects
// to enable/disable relevant commands for current selection // to enable/disable relevant commands for current selection
var prev_contentframe = rcmail.env.contentframe, i; var prev_contentframe = rcmail.env.contentframe, i;
rcmail.env.contentframe = null; this.env.contentframe = null;
if (show) { if (show) {
if (rcmail.message_list.selection.length == 0 || !rcmail.message_list.in_selection(uid)) { if (this.message_list.selection.length == 0 || !this.message_list.in_selection(uid)) {
prev_sel = prev_sel ? prev_sel : rcmail.message_list.get_selection(); prev_sel = prev_sel ? prev_sel : this.message_list.get_selection();
rcmail.message_list.clear_selection(); this.message_list.clear_selection();
rcmail.message_list.highlight_row(uid, true); this.message_list.highlight_row(uid, true);
} }
} }
else if (prev_sel) { else if (prev_sel) {
rcmail.message_list.clear_selection(); this.message_list.clear_selection();
for (i in prev_sel) for (i in prev_sel)
rcmail[this.list_object].highlight_row(prev_sel[i], true); rcmail[this.list_object].highlight_row(prev_sel[i], true);
} }
else { else {
rcmail.message_list.clear_selection(); this.message_list.clear_selection();
} }
rcmail.env.contentframe = prev_contentframe; this.env.contentframe = prev_contentframe;
return prev_sel; return prev_sel;
}; };
@ -61,42 +61,42 @@ rcube_webmail.prototype.swipe_action_callback = function(command, type, props) {
return; return;
if (type == 'mark') { if (type == 'mark') {
rcmail.mark_message(command, props.uid); this.mark_message(command, props.uid);
} }
else if (type == 'compose') { else if (type == 'compose') {
rcmail.enable_command(command, true); this.enable_command(command, true);
rcmail.env.uid = props.uid; this.env.uid = props.uid;
rcmail.command(command, '', props.obj, props.originalEvent); this.command(command, '', props.obj, props.originalEvent);
} }
else if (type == 'select') { else if (type == 'select') {
rcmail.message_list.highlight_row(props.uid, true); this.message_list.highlight_row(props.uid, true);
var select_class = ''; var select_class = '';
if (select_class = $('#swipeoptions-menu').data('listselection-class')) { if (select_class = $('#swipeoptions-menu').data('listselection-class')) {
if (command == 'deselect' && rcmail.message_list.get_selection().length == 0) if (command == 'deselect' && this.message_list.get_selection().length == 0)
$(rcmail.gui_objects.messagelist).removeClass(select_class); $(this.gui_objects.messagelist).removeClass(select_class);
else else
$(rcmail.gui_objects.messagelist).addClass(select_class); $(this.gui_objects.messagelist).addClass(select_class);
} }
} }
else { else {
var prev_sel = rcmail.swipe_list_selection(props.uid, true); var prev_sel = this.swipe_list_selection(props.uid, true);
// enable command // enable command
var prev_command = rcmail.commands[command]; var prev_command = this.commands[command];
rcmail.enable_command(command, true); this.enable_command(command, true);
// some actions require a button click in the UI to trigger things like popovers // some actions require a button click in the UI to trigger things like popovers
// rather than a direct command call // rather than a direct command call
$('#' + rcmail.buttons[command][0].id).trigger('click'); $('#' + this.buttons[command][0].id).trigger('click');
if (props.delay_disable) { if (props.delay_disable) {
return {'prev_command': prev_command, 'prev_sel': prev_sel}; return {'prev_command': prev_command, 'prev_sel': prev_sel};
} }
else { else {
// restore original state // restore original state
rcmail.enable_command(command, prev_command); this.enable_command(command, prev_command);
rcmail.swipe_list_selection(props.uid, false, prev_sel); this.swipe_list_selection(props.uid, false, prev_sel);
} }
} }
}; };
@ -108,27 +108,36 @@ rcube_webmail.prototype.swipe_select_action = function(direction, obj) {
'callback': null 'callback': null
}; };
if (rcmail.env.swipe_actions[direction] == 'archive' && rcmail.env.archive_folder) { ret = this.triggerEvent('swipe-action', {'direction': direction, 'obj': obj});
if (ret !== undefined) {
// abort if one of the handlers returned false
if (ret === false)
return action;
else
return ret;
}
if (this.env.swipe_actions[direction] == 'archive' && this.env.archive_folder) {
action.class = 'archive'; action.class = 'archive';
action.text = 'archive.buttontext'; action.text = 'archive.buttontext';
action.callback = function(p) { rcmail.swipe_action_callback('plugin.archive', null, p); }; action.callback = function(p) { rcmail.swipe_action_callback('plugin.archive', null, p); };
} }
else if (rcmail.env.swipe_actions[direction] == 'checkmail') { else if (this.env.swipe_actions[direction] == 'checkmail') {
action.class = 'checkmail'; action.class = 'checkmail';
action.text = 'refresh'; action.text = 'refresh';
action.callback = function(p) { rcmail.command('checkmail'); }; action.callback = function(p) { rcmail.command('checkmail'); };
} }
else if (rcmail.env.swipe_actions[direction] == 'delete') { else if (this.env.swipe_actions[direction] == 'delete') {
action.class = 'delete'; action.class = 'delete';
action.text = 'delete'; action.text = 'delete';
action.callback = function(p) { rcmail.swipe_action_callback('delete', null, p); }; action.callback = function(p) { rcmail.swipe_action_callback('delete', null, p); };
} }
else if (rcmail.env.swipe_actions[direction] == 'forward') { else if (this.env.swipe_actions[direction] == 'forward') {
action.class = 'forward'; action.class = 'forward';
action.text = 'forward'; action.text = 'forward';
action.callback = function(p) { rcmail.swipe_action_callback('forward', 'compose', p); }; action.callback = function(p) { rcmail.swipe_action_callback('forward', 'compose', p); };
} }
else if (rcmail.env.swipe_actions[direction] == 'move') { else if (this.env.swipe_actions[direction] == 'move') {
action.class = 'move'; action.class = 'move';
action.text = 'moveto'; action.text = 'moveto';
action.callback = function(p) { action.callback = function(p) {
@ -146,17 +155,17 @@ rcube_webmail.prototype.swipe_select_action = function(direction, obj) {
}; };
}; };
} }
else if (rcmail.env.swipe_actions[direction] == 'reply') { else if (this.env.swipe_actions[direction] == 'reply') {
action.class = 'reply'; action.class = 'reply';
action.text = 'reply'; action.text = 'reply';
action.callback = function(p) { rcmail.swipe_action_callback('reply', 'compose', p); }; action.callback = function(p) { rcmail.swipe_action_callback('reply', 'compose', p); };
} }
else if (rcmail.env.swipe_actions[direction] == 'reply-all') { else if (this.env.swipe_actions[direction] == 'reply-all') {
action.class = 'replyall'; action.class = 'replyall';
action.text = 'replyall'; action.text = 'replyall';
action.callback = function(p) { rcmail.swipe_action_callback('reply-all', 'compose', p); }; action.callback = function(p) { rcmail.swipe_action_callback('reply-all', 'compose', p); };
} }
else if (rcmail.env.swipe_actions[direction] == 'swipe-read') { else if (this.env.swipe_actions[direction] == 'swipe-read') {
if (obj.hasClass('unread')) { if (obj.hasClass('unread')) {
action.class = 'read'; action.class = 'read';
action.text = 'swipe.markasread'; action.text = 'swipe.markasread';
@ -168,7 +177,7 @@ rcube_webmail.prototype.swipe_select_action = function(direction, obj) {
action.callback = function(p) { rcmail.swipe_action_callback('unread', 'mark', p); }; action.callback = function(p) { rcmail.swipe_action_callback('unread', 'mark', p); };
} }
} }
else if (rcmail.env.swipe_actions[direction] == 'swipe-flagged') { else if (this.env.swipe_actions[direction] == 'swipe-flagged') {
if (obj.hasClass('flagged')) { if (obj.hasClass('flagged')) {
action.class = 'unflagged'; action.class = 'unflagged';
action.text = 'swipe.markasunflagged'; action.text = 'swipe.markasunflagged';
@ -180,7 +189,7 @@ rcube_webmail.prototype.swipe_select_action = function(direction, obj) {
action.callback = function(p) { rcmail.swipe_action_callback('flagged', 'mark', p); }; action.callback = function(p) { rcmail.swipe_action_callback('flagged', 'mark', p); };
} }
} }
else if (rcmail.env.swipe_actions[direction] == 'swipe-select') { else if (this.env.swipe_actions[direction] == 'swipe-select') {
if (obj.hasClass('selected')) { if (obj.hasClass('selected')) {
action.class = 'deselect'; action.class = 'deselect';
action.text = 'swipe.deselect'; action.text = 'swipe.deselect';

@ -85,11 +85,15 @@ class swipe extends rcube_plugin
public function options_list($args) public function options_list($args)
{ {
$disabled_actions = (array) rcube::get_instance()->config->get('disabled_actions'); $disabled_actions = (array) rcube::get_instance()->config->get('disabled_actions');
$swipe_actions = $this->actions[$args['axis']];
$args['name'] = $args['fieldname']; $args['name'] = $args['fieldname'];
// Allow other plugins to interact with the action list
$data = rcube::get_instance()->plugins->exec_hook('swipe_actions_list', array('actions' => $swipe_actions, 'axis' => $args['axis']));
$select = new html_select($args); $select = new html_select($args);
$select->add($this->gettext('none'), 'none'); $select->add($this->gettext('none'), 'none');
foreach ($this->actions[$args['axis']] as $action => $text) { foreach ($data['actions'] as $action => $text) {
// Skip the action if it is in disabled_actions config option // Skip the action if it is in disabled_actions config option
// Skip the archive option if the plugin is not active and configured // Skip the archive option if the plugin is not active and configured
if (in_array($action, $disabled_actions) || in_array('mail.' . $action, $disabled_actions) || $action == 'archive' && !$this->api->output->env['archive_folder']) { if (in_array($action, $disabled_actions) || in_array('mail.' . $action, $disabled_actions) || $action == 'archive' && !$this->api->output->env['archive_folder']) {

Loading…
Cancel
Save