From 0ce2126ac91f634b0bc5bf7f3567acd2f87f9972 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 29 Aug 2013 17:29:18 +0200 Subject: New settings section to manage canned responses --- program/include/rcmail.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'program/include/rcmail.php') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 02287d312..9713cdb4e 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -346,6 +346,31 @@ class rcmail extends rcube return $list; } + /** + * Getter for compose responses. + * These are stored in local config and user preferences. + * + * @param boolean True to sort the list alphabetically + * @return array List of the current user's stored responses + */ + public function get_compose_responses($sorted = false) + { + foreach ($this->config->get('compose_responses', array()) as $response) { + if (empty($response['key'])) + $response['key'] = substr(md5($response['name']), 0, 16); + $k = $sorted ? strtolower($response['name']) : $response['key']; + $responses[$k] = $response; + } + + if ($sorted) { + // sort list by name + ksort($responses, SORT_LOCALE_STRING); + return array_values($responses); + } + + return $responses; + } + /** * Init output object for GUI and add common scripts. -- cgit v1.2.3 From 460a3eaaac0ec17d04df310b0a696e39559c9446 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 4 Sep 2013 11:19:34 +0200 Subject: Fix indentation --- program/include/rcmail.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'program/include/rcmail.php') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 9713cdb4e..62f6254b5 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -358,17 +358,17 @@ class rcmail extends rcube foreach ($this->config->get('compose_responses', array()) as $response) { if (empty($response['key'])) $response['key'] = substr(md5($response['name']), 0, 16); - $k = $sorted ? strtolower($response['name']) : $response['key']; - $responses[$k] = $response; - } + $k = $sorted ? strtolower($response['name']) : $response['key']; + $responses[$k] = $response; + } - if ($sorted) { - // sort list by name - ksort($responses, SORT_LOCALE_STRING); - return array_values($responses); - } + if ($sorted) { + // sort list by name + ksort($responses, SORT_LOCALE_STRING); + return array_values($responses); + } - return $responses; + return $responses; } -- cgit v1.2.3 From 4f432f880afeb078c2b60ce594872ec3eb1713e7 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 4 Sep 2013 12:07:58 +0200 Subject: Make result of rcmail::get_compose_responses() always an (indexed) array; add plugin hook for updating user prefs: 'preferences_update' --- program/include/rcmail.php | 6 +++--- program/lib/Roundcube/rcube_user.php | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'program/include/rcmail.php') diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 62f6254b5..f58235cbf 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -355,6 +355,7 @@ class rcmail extends rcube */ public function get_compose_responses($sorted = false) { + $responses = array(); foreach ($this->config->get('compose_responses', array()) as $response) { if (empty($response['key'])) $response['key'] = substr(md5($response['name']), 0, 16); @@ -362,13 +363,12 @@ class rcmail extends rcube $responses[$k] = $response; } + // sort list by name if ($sorted) { - // sort list by name ksort($responses, SORT_LOCALE_STRING); - return array_values($responses); } - return $responses; + return array_values($responses); } diff --git a/program/lib/Roundcube/rcube_user.php b/program/lib/Roundcube/rcube_user.php index 5e9c9af80..57f63361d 100644 --- a/program/lib/Roundcube/rcube_user.php +++ b/program/lib/Roundcube/rcube_user.php @@ -163,8 +163,16 @@ class rcube_user if (!$this->ID) return false; - $config = $this->rc->config; - $old_prefs = (array)$this->get_prefs(); + $plugin = $this->rc->plugins->exec_hook('preferences_update', array( + 'userid' => $this->ID, 'prefs' => $a_user_prefs, 'old' => (array)$this->get_prefs())); + + if (!empty($plugin['abort'])) { + return; + } + + $a_user_prefs = $plugin['prefs']; + $old_prefs = $plugin['old']; + $config = $this->rc->config; // merge (partial) prefs array with existing settings $save_prefs = $a_user_prefs + $old_prefs; -- cgit v1.2.3 From 9c41ba3c9ebbb14d01abe961c420f71f9463e61a Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 19 Sep 2013 17:56:14 +0200 Subject: Allow sysadmins to define static responses which are immutable for the user --- config/defaults.inc.php | 6 ++++++ program/include/rcmail.php | 15 ++++++++++++++- program/js/app.js | 2 +- program/steps/settings/edit_response.inc | 19 +++++++++---------- program/steps/settings/responses.inc | 8 +++++--- skins/classic/settings.css | 5 +++++ skins/classic/templates/responseedit.html | 2 +- skins/larry/settings.css | 4 ++++ skins/larry/templates/responseedit.html | 2 +- 9 files changed, 46 insertions(+), 17 deletions(-) (limited to 'program/include/rcmail.php') diff --git a/config/defaults.inc.php b/config/defaults.inc.php index 2a51b0805..a5bf34415 100644 --- a/config/defaults.inc.php +++ b/config/defaults.inc.php @@ -586,6 +586,12 @@ $config['upload_progress'] = false; // Setting it to 0, disables the feature. $config['undo_timeout'] = 0; +// A static list of canned responses which are immutable for the user +$config['compose_responses_static'] = array( +// array('name' => 'Canned Response 1', 'text' => 'Static Response One'), +// array('name' => 'Canned Response 2', 'text' => 'Static Response Two'), +); + // ---------------------------------- // ADDRESSBOOK SETTINGS // ---------------------------------- diff --git a/program/include/rcmail.php b/program/include/rcmail.php index f58235cbf..4a07e0b69 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -351,11 +351,24 @@ class rcmail extends rcube * These are stored in local config and user preferences. * * @param boolean True to sort the list alphabetically + * @param boolean True if only this user's responses shall be listed * @return array List of the current user's stored responses */ - public function get_compose_responses($sorted = false) + public function get_compose_responses($sorted = false, $user_only = false) { $responses = array(); + + if (!$user_only) { + foreach ($this->config->get('compose_responses_static', array()) as $response) { + if (empty($response['key'])) + $response['key'] = substr(md5($response['name']), 0, 16); + $response['static'] = true; + $response['class'] = 'readonly'; + $k = $sorted ? '0000-' . strtolower($response['name']) : $response['key']; + $responses[$k] = $response; + } + } + foreach ($this->config->get('compose_responses', array()) as $response) { if (empty($response['key'])) $response['key'] = substr(md5($response['name']), 0, 16); diff --git a/program/js/app.js b/program/js/app.js index abe267a6d..5943ad0fd 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -447,7 +447,7 @@ function rcube_webmail() this.responses_list = new rcube_list_widget(this.gui_objects.responseslist, {multiselect:false, draggable:false, keyboard:false}); this.responses_list.addEventListener('select', function(list){ var win, id = list.get_single_selection(); - p.enable_command('delete', !!id); + p.enable_command('delete', !!id && $.inArray(id, p.env.readonly_responses) < 0); if (id && (win = p.get_frame_window(p.env.contentframe))) { p.set_busy(true); p.location_href({ _action:'edit-response', _key:id, _framed:1 }, win); diff --git a/program/steps/settings/edit_response.inc b/program/steps/settings/edit_response.inc index 26f7e6e48..49856775a 100644 --- a/program/steps/settings/edit_response.inc +++ b/program/steps/settings/edit_response.inc @@ -24,8 +24,6 @@ $responses = $RCMAIL->get_compose_responses(); // edit-response if (($key = get_input_value('_key', RCUBE_INPUT_GPC))) { foreach ($responses as $i => $response) { - if (empty($response['key'])) - $response['key'] = substr(md5($response['name']), 0, 16); if ($response['key'] == $key) { $RESPONSE_RECORD = $response; $RESPONSE_RECORD['index'] = $i; @@ -35,13 +33,10 @@ if (($key = get_input_value('_key', RCUBE_INPUT_GPC))) { } // save response -if ($RCMAIL->action == 'save-response' && isset($_POST['_name'])) { +if ($RCMAIL->action == 'save-response' && isset($_POST['_name']) && !$RESPONSE_RECORD['static']) { $name = trim(get_input_value('_name', RCUBE_INPUT_POST)); $text = trim(get_input_value('_text', RCUBE_INPUT_POST)); - if (!empty($_REQUEST['_framed'])) - $RCMAIL->output->framed = 1; - if (!empty($name) && !empty($text)) { $dupes = 0; foreach ($responses as $i => $resp) { @@ -62,9 +57,11 @@ if ($RCMAIL->action == 'save-response' && isset($_POST['_name'])) { $responses[] = $response; } - if ($RCMAIL->user->save_prefs(array('compose_responses' => $responses))) { + $responses = array_filter($responses, function($item){ return empty($item['static']); }); + if ($RCMAIL->user->save_prefs(array('compose_responses' => array_values($responses)))) { $RCMAIL->output->show_message('successfullysaved', 'confirmation'); - $RCMAIL->output->command('update_response_row', $response, $key); + $RCMAIL->output->command('parent.update_response_row', $response, $key); + $RCMAIL->overwrite_action('edit-response'); $RESPONSE_RECORD = $response; } } @@ -79,6 +76,7 @@ function rcube_response_form($attrib) global $RCMAIL, $OUTPUT, $RESPONSE_RECORD; // Set form tags and hidden fields + $disabled = !empty($RESPONSE_RECORD['static']); $key = $RESPONSE_RECORD['key']; list($form_start, $form_end) = get_form_tags($attrib, 'save-response', $key, array('name' => '_key', 'value' => $key)); unset($attrib['form'], $attrib['id']); @@ -90,10 +88,10 @@ function rcube_response_form($attrib) $label = rcube_label('responsename'); $table->add('title', html::label('ffname', Q(rcube_label('responsename')))); - $table->add(null, rcube_output::get_edit_field('name', $RESPONSE_RECORD['name'], array('id' => 'ffname', 'size' => $attrib['size']), 'text')); + $table->add(null, rcube_output::get_edit_field('name', $RESPONSE_RECORD['name'], array('id' => 'ffname', 'size' => $attrib['size'], 'disabled' => $disabled), 'text')); $table->add('title', html::label('fftext', Q(rcube_label('responsetext')))); - $table->add(null, rcube_output::get_edit_field('text', $RESPONSE_RECORD['text'], array('id' => 'fftext', 'size' => $attrib['textareacols'], 'rows' => $attrib['textarearows']), 'textarea')); + $table->add(null, rcube_output::get_edit_field('text', $RESPONSE_RECORD['text'], array('id' => 'fftext', 'size' => $attrib['textareacols'], 'rows' => $attrib['textarearows'], 'disabled' => $disabled), 'textarea')); $out .= $table->show($attrib); $out .= $form_end; @@ -101,6 +99,7 @@ function rcube_response_form($attrib) return $out; } +$OUTPUT->set_env('readonly', !empty($RESPONSE_RECORD['static'])); $OUTPUT->add_handler('responseform', 'rcube_response_form'); $OUTPUT->set_pagetitle(rcube_label(($RCMAIL->action=='add-response' ? 'savenewresponse' : 'editresponse'))); diff --git a/program/steps/settings/responses.inc b/program/steps/settings/responses.inc index 330b4fde4..cfc4148c3 100644 --- a/program/steps/settings/responses.inc +++ b/program/steps/settings/responses.inc @@ -26,7 +26,7 @@ if (!empty($_POST['_insert'])) { if (!empty($name) && !empty($text)) { $dupes = 0; - $responses = $RCMAIL->get_compose_responses(); + $responses = $RCMAIL->get_compose_responses(false, true); foreach ($responses as $resp) { if (strcasecmp($name, preg_replace('/\s\(\d+\)$/', '', $resp['name'])) == 0) $dupes++; @@ -54,7 +54,7 @@ if (!empty($_POST['_insert'])) { if ($RCMAIL->action == 'delete-response') { if ($key = get_input_value('_key', RCUBE_INPUT_GPC)) { - $responses = $RCMAIL->get_compose_responses(); + $responses = $RCMAIL->get_compose_responses(false, true); foreach ($responses as $i => $response) { if (empty($response['key'])) $response['key'] = substr(md5($response['name']), 0, 16); @@ -67,7 +67,7 @@ if ($RCMAIL->action == 'delete-response') { } if ($deleted) { - $RCMAIL->output->command('display_message', rcube_label('successfullydeleted'), 'confirmation'); + $RCMAIL->output->command('display_message', rcube_label('deletedsuccessfully'), 'confirmation'); $RCMAIL->output->command('remove_response', $key); } @@ -99,6 +99,8 @@ function rcmail_responses_list($attrib) // set client env $OUTPUT->add_gui_object('responseslist', $attrib['id']); + $OUTPUT->set_env('readonly_responses', array_values(array_map(function($rec){ return $rec['key']; }, + array_filter($plugin['list'], function($item){ return !empty($item['static']); })))); return $out; } diff --git a/skins/classic/settings.css b/skins/classic/settings.css index 0e4f796a4..acd0b9fd0 100644 --- a/skins/classic/settings.css +++ b/skins/classic/settings.css @@ -34,6 +34,11 @@ height: 18px; } +#identities-table tbody tr.readonly td +{ + font-style: italic; +} + #subscription-table tr.virtual td { color: #666; diff --git a/skins/classic/templates/responseedit.html b/skins/classic/templates/responseedit.html index fbc5f663d..67ba35bac 100644 --- a/skins/classic/templates/responseedit.html +++ b/skins/classic/templates/responseedit.html @@ -15,7 +15,7 @@
- +
diff --git a/skins/larry/settings.css b/skins/larry/settings.css index 8deb24716..920376a96 100644 --- a/skins/larry/settings.css +++ b/skins/larry/settings.css @@ -194,6 +194,10 @@ text-overflow: ellipsis; } +#identities-table tbody tr.readonly td { + font-style: italic; +} + #folder-details, #identity-details { position: absolute; diff --git a/skins/larry/templates/responseedit.html b/skins/larry/templates/responseedit.html index d2f031b34..8f180fe7f 100644 --- a/skins/larry/templates/responseedit.html +++ b/skins/larry/templates/responseedit.html @@ -13,7 +13,7 @@
- +
-- cgit v1.2.3