Allow sysadmins to define static responses which are immutable for the user

pull/134/head
Thomas Bruederli 11 years ago
parent cc041fe11c
commit 9c41ba3c9e

@ -586,6 +586,12 @@ $config['upload_progress'] = false;
// Setting it to 0, disables the feature. // Setting it to 0, disables the feature.
$config['undo_timeout'] = 0; $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 // ADDRESSBOOK SETTINGS
// ---------------------------------- // ----------------------------------

@ -351,11 +351,24 @@ class rcmail extends rcube
* These are stored in local config and user preferences. * These are stored in local config and user preferences.
* *
* @param boolean True to sort the list alphabetically * @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 * @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(); $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) { foreach ($this->config->get('compose_responses', array()) as $response) {
if (empty($response['key'])) if (empty($response['key']))
$response['key'] = substr(md5($response['name']), 0, 16); $response['key'] = substr(md5($response['name']), 0, 16);

@ -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 = new rcube_list_widget(this.gui_objects.responseslist, {multiselect:false, draggable:false, keyboard:false});
this.responses_list.addEventListener('select', function(list){ this.responses_list.addEventListener('select', function(list){
var win, id = list.get_single_selection(); 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))) { if (id && (win = p.get_frame_window(p.env.contentframe))) {
p.set_busy(true); p.set_busy(true);
p.location_href({ _action:'edit-response', _key:id, _framed:1 }, win); p.location_href({ _action:'edit-response', _key:id, _framed:1 }, win);

@ -24,8 +24,6 @@ $responses = $RCMAIL->get_compose_responses();
// edit-response // edit-response
if (($key = get_input_value('_key', RCUBE_INPUT_GPC))) { if (($key = get_input_value('_key', RCUBE_INPUT_GPC))) {
foreach ($responses as $i => $response) { foreach ($responses as $i => $response) {
if (empty($response['key']))
$response['key'] = substr(md5($response['name']), 0, 16);
if ($response['key'] == $key) { if ($response['key'] == $key) {
$RESPONSE_RECORD = $response; $RESPONSE_RECORD = $response;
$RESPONSE_RECORD['index'] = $i; $RESPONSE_RECORD['index'] = $i;
@ -35,13 +33,10 @@ if (($key = get_input_value('_key', RCUBE_INPUT_GPC))) {
} }
// save response // 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)); $name = trim(get_input_value('_name', RCUBE_INPUT_POST));
$text = trim(get_input_value('_text', 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)) { if (!empty($name) && !empty($text)) {
$dupes = 0; $dupes = 0;
foreach ($responses as $i => $resp) { foreach ($responses as $i => $resp) {
@ -62,9 +57,11 @@ if ($RCMAIL->action == 'save-response' && isset($_POST['_name'])) {
$responses[] = $response; $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->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; $RESPONSE_RECORD = $response;
} }
} }
@ -79,6 +76,7 @@ function rcube_response_form($attrib)
global $RCMAIL, $OUTPUT, $RESPONSE_RECORD; global $RCMAIL, $OUTPUT, $RESPONSE_RECORD;
// Set form tags and hidden fields // Set form tags and hidden fields
$disabled = !empty($RESPONSE_RECORD['static']);
$key = $RESPONSE_RECORD['key']; $key = $RESPONSE_RECORD['key'];
list($form_start, $form_end) = get_form_tags($attrib, 'save-response', $key, array('name' => '_key', 'value' => $key)); list($form_start, $form_end) = get_form_tags($attrib, 'save-response', $key, array('name' => '_key', 'value' => $key));
unset($attrib['form'], $attrib['id']); unset($attrib['form'], $attrib['id']);
@ -90,10 +88,10 @@ function rcube_response_form($attrib)
$label = rcube_label('responsename'); $label = rcube_label('responsename');
$table->add('title', html::label('ffname', Q(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('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 .= $table->show($attrib);
$out .= $form_end; $out .= $form_end;
@ -101,6 +99,7 @@ function rcube_response_form($attrib)
return $out; return $out;
} }
$OUTPUT->set_env('readonly', !empty($RESPONSE_RECORD['static']));
$OUTPUT->add_handler('responseform', 'rcube_response_form'); $OUTPUT->add_handler('responseform', 'rcube_response_form');
$OUTPUT->set_pagetitle(rcube_label(($RCMAIL->action=='add-response' ? 'savenewresponse' : 'editresponse'))); $OUTPUT->set_pagetitle(rcube_label(($RCMAIL->action=='add-response' ? 'savenewresponse' : 'editresponse')));

@ -26,7 +26,7 @@ if (!empty($_POST['_insert'])) {
if (!empty($name) && !empty($text)) { if (!empty($name) && !empty($text)) {
$dupes = 0; $dupes = 0;
$responses = $RCMAIL->get_compose_responses(); $responses = $RCMAIL->get_compose_responses(false, true);
foreach ($responses as $resp) { foreach ($responses as $resp) {
if (strcasecmp($name, preg_replace('/\s\(\d+\)$/', '', $resp['name'])) == 0) if (strcasecmp($name, preg_replace('/\s\(\d+\)$/', '', $resp['name'])) == 0)
$dupes++; $dupes++;
@ -54,7 +54,7 @@ if (!empty($_POST['_insert'])) {
if ($RCMAIL->action == 'delete-response') { if ($RCMAIL->action == 'delete-response') {
if ($key = get_input_value('_key', RCUBE_INPUT_GPC)) { 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) { foreach ($responses as $i => $response) {
if (empty($response['key'])) if (empty($response['key']))
$response['key'] = substr(md5($response['name']), 0, 16); $response['key'] = substr(md5($response['name']), 0, 16);
@ -67,7 +67,7 @@ if ($RCMAIL->action == 'delete-response') {
} }
if ($deleted) { 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); $RCMAIL->output->command('remove_response', $key);
} }
@ -99,6 +99,8 @@ function rcmail_responses_list($attrib)
// set client env // set client env
$OUTPUT->add_gui_object('responseslist', $attrib['id']); $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; return $out;
} }

@ -34,6 +34,11 @@
height: 18px; height: 18px;
} }
#identities-table tbody tr.readonly td
{
font-style: italic;
}
#subscription-table tr.virtual td #subscription-table tr.virtual td
{ {
color: #666; color: #666;

@ -15,7 +15,7 @@
<div id="formfooter"> <div id="formfooter">
<div class="footerindent"> <div class="footerindent">
<roundcube:button command="save" type="input" class="button mainaction" label="save" /> <roundcube:button command="save" type="input" class="button mainaction" label="save" condition="!env:readonly" />
</div> </div>
</div> </div>
</div> </div>

@ -194,6 +194,10 @@
text-overflow: ellipsis; text-overflow: ellipsis;
} }
#identities-table tbody tr.readonly td {
font-style: italic;
}
#folder-details, #folder-details,
#identity-details { #identity-details {
position: absolute; position: absolute;

@ -13,7 +13,7 @@
</div> </div>
<div class="footerleft formbuttons"> <div class="footerleft formbuttons">
<roundcube:button command="save" type="input" class="button mainaction" label="save" /> <roundcube:button command="save" type="input" class="button mainaction" label="save" condition="!env:readonly" />
</div> </div>
<roundcube:include file="/includes/footer.html" /> <roundcube:include file="/includes/footer.html" />

Loading…
Cancel
Save