Elastic skin support for managesieve (part II)

pull/6040/head
Aleksander Machniak 7 years ago
parent 944013207c
commit 9d1c8aff83

@ -1342,18 +1342,16 @@ class rcube_sieve_engine
function filterset_form($attrib)
{
if (!$attrib['id'])
if (!$attrib['id']) {
$attrib['id'] = 'rcmfiltersetform';
}
$out = '<form name="filtersetform" action="./" method="post" enctype="multipart/form-data">'."\n";
$table = new html_table(array('cols' => 2, 'class' => 'propform'));
$hiddenfields = new html_hiddenfield(array('name' => '_task', 'value' => $this->rc->task));
$hiddenfields->add(array('name' => '_action', 'value' => 'plugin.managesieve-save'));
$hiddenfields->add(array('name' => '_framed', 'value' => ($_POST['_framed'] || $_GET['_framed'] ? 1 : 0)));
$hiddenfields->add(array('name' => '_newset', 'value' => 1));
$out .= $hiddenfields->show();
$name = rcube_utils::get_input_value('_name', rcube_utils::INPUT_POST);
$copy = rcube_utils::get_input_value('_copy', rcube_utils::INPUT_POST);
$selected = rcube_utils::get_input_value('_from', rcube_utils::INPUT_POST);
@ -1362,18 +1360,17 @@ class rcube_sieve_engine
$input_name = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30,
'class' => ($this->errors['name'] ? 'error' : '')));
$out .= sprintf('<label for="%s"><b>%s:</b></label> %s<br><br>',
'_name', rcube::Q($this->plugin->gettext('filtersetname')), $input_name->show($name));
$table->add('title', html::label('_name', rcube::Q($this->plugin->gettext('filtersetname'))));
$table->add(null, $input_name->show($name));
$out .="\n<fieldset class=\"itemlist\"><legend>" . $this->plugin->gettext('filters') . ":</legend>\n";
$out .= html::tag('input', array(
$filters = '<ul class="proplist">';
$filters .= '<li>' . html::label('from_none', html::tag('input', array(
'type' => 'radio',
'id' => 'from_none',
'name' => '_from',
'value' => 'none',
'checked' => !$selected || $selected == 'none'
));
$out .= html::label('from_none', rcube::Q($this->plugin->gettext('none')));
)) . rcube::Q($this->plugin->gettext('none'))) . '</li>';
// filters set list
$list = $this->list_scripts();
@ -1389,33 +1386,34 @@ class rcube_sieve_engine
$select->add($set, $set);
}
$out .= '<br>';
$out .= html::tag('input', array(
$filters .= '<li>' . html::label('from_set', html::tag('input', array(
'type' => 'radio',
'id' => 'from_set',
'name' => '_from',
'value' => 'set',
'checked' => $selected == 'set',
));
$out .= html::label('from_set', rcube::Q($this->plugin->gettext('fromset')));
$out .= $select->show($copy);
)) . rcube::Q($this->plugin->gettext('fromset')) . ' ' . $select->show($copy)) . '</li>';
}
// script upload box
$upload = new html_inputfield(array('name' => '_file', 'id' => '_file', 'size' => 30,
'type' => 'file', 'class' => ($this->errors['file'] ? 'error' : '')));
$out .= '<br>';
$out .= html::tag('input', array(
$filters .= '<li>' . html::label('from_file', html::tag('input', array(
'type' => 'radio',
'id' => 'from_file',
'name' => '_from',
'value' => 'file',
'checked' => $selected == 'file',
));
$out .= html::label('from_file', rcube::Q($this->plugin->gettext('fromfile')));
$out .= $upload->show();
$out .= '</fieldset>';
)) . rcube::Q($this->plugin->gettext('fromfile')) . ' ' . $upload->show()) . '</li>';
$filters .= '</ul>';
$table->add('title', html::label('from_none', rcube::Q($this->plugin->gettext('filters'))));
$table->add('', $filters);
$out = '<form name="filtersetform" action="./" method="post" enctype="multipart/form-data">'
. "\n" . $hiddenfields->show() . "\n" . $table->show();
$this->rc->output->add_gui_object('sieveform', 'filtersetform');
@ -1432,14 +1430,15 @@ class rcube_sieve_engine
function filter_form($attrib)
{
if (!$attrib['id'])
if (!$attrib['id']) {
$attrib['id'] = 'rcmfilterform';
}
$fid = rcube_utils::get_input_value('_fid', rcube_utils::INPUT_GPC);
$scr = isset($this->form) ? $this->form : $this->script[$fid];
$compact = !empty($attrib['compact-form']);
$_SESSION['managesieve-compact-form'] = true;
$_SESSION['managesieve-compact-form'] = $compact;
// do not allow creation of new rules
if ($fid == null && in_array('new_rule', $this->disabled_actions)) {
@ -1782,7 +1781,7 @@ class rcube_sieve_engine
'size' => 10,
'class' => $this->error_class($id, 'test', 'sizetarget', 'rule_size_i'),
));
$tout .= $select_size_item->show($sizeitem);
$tout .= "\n" . $select_size_item->show($sizeitem);
$tout .= '</div>';
$tout .= '</div>';
@ -1806,13 +1805,13 @@ class rcube_sieve_engine
$need_mod = !in_array($rule['test'], array('size', 'body', 'date', 'currentdate', 'duplicate', 'string'));
$mout = '<div id="rule_mod' .$id. '" class="adv input-group"' . (!$need_mod ? ' style="display:none"' : '') . '>';
$mout .= ' <span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('modifier')) . ' </span>';
$mout .= '<span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('modifier')) . ' </span>';
$mout .= $select_mod->show($rule['test']);
$mout .= ' <span id="rule_mod_type' . $id . '" class="input-group-addon"';
$mout .= ' style="display:' . (in_array($rule['test'], array('address', 'envelope')) ? 'inline' : 'none') .'">';
$mout .= rcube::Q($this->plugin->gettext('modtype')) . ' ';
$mout .= '</div>';
$mout .= '<div id="rule_mod_type' . $id . '" class="adv input-group"';
$mout .= (!in_array($rule['test'], array('address', 'envelope')) ? ' style="display:none' : '') . '">';
$mout .= '<span class="label input-group-addon">' . rcube::Q($this->plugin->gettext('modtype')) . ' </span>';
$mout .= $select_type->show($rule['part']);
$mout .= '</span>';
$mout .= '</div>';
// Advanced modifiers (body transformations)
@ -2160,7 +2159,7 @@ class rcube_sieve_engine
$out .= $interval_select->show(isset($action['seconds']) ? 'seconds' : 'days');
}
else {
$out .= html::span('input-group-addon', $this->plugin->gettext('days'));
$out .= "\n" . html::span('input-group-addon', $this->plugin->gettext('days'));
}
$out .= '</div></div>';
@ -2176,18 +2175,18 @@ class rcube_sieve_engine
$flout = '';
foreach ($flags as $fidx => $flag) {
$flout .= html::tag('input', array(
$flout .= html::label(null, html::tag('input', array(
'type' => 'checkbox',
'name' => '_action_flags[' .$id .'][]',
'value' => $flag,
'checked' => in_array_nocase($flag, $flags_target),
))
. rcube::Q($this->plugin->gettext('flag'.$fidx)) .'<br>';
. rcube::Q($this->plugin->gettext('flag'.$fidx))) . '<br>';
}
$out .= html::div(array(
'id' => 'action_flags' . $id,
'style' => 'display:' . (preg_match('/^(set|add|remove)flag$/', $action['type']) ? 'inline' : 'none'),
'class' => $this->error_class($id, 'action', 'flags', 'action_flags'),
'class' => trim('checklist ' . $this->error_class($id, 'action', 'flags', 'action_flags')),
), $flout);
// set variable
@ -2381,10 +2380,10 @@ class rcube_sieve_engine
protected function add_tip($id, $str, $error=false)
{
if ($error) {
$str = html::span('sieve error', $str);
$class = 'sieve error';
}
$this->tips[] = array($id, $str);
$this->tips[] = array($id, $class ?: '', $str);
}
protected function print_tips()

@ -395,7 +395,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine
$interval_txt .= $interval_select->show(isset($this->vacation['seconds']) ? 'seconds' : 'days');
}
else {
$interval_txt .= html::span('input-group-addon', $this->plugin->gettext('days'));
$interval_txt .= "\n" . html::span('input-group-addon', $this->plugin->gettext('days'));
}
if ($date_extension || $regex_extension) {

@ -72,10 +72,11 @@ $labels['enable'] = 'Enable/Disable';
$labels['filterset'] = 'Filters set';
$labels['filtersets'] = 'Filter sets';
$labels['filtersetadd'] = 'Add filters set';
$labels['filtersetdel'] = 'Delete current filters set';
$labels['filtersetdel'] = 'Delete filters set';
$labels['filtersetact'] = 'Activate current filters set';
$labels['filtersetdeact'] = 'Deactivate current filters set';
$labels['filterseteditraw'] = 'Edit filter set';
$labels['filtersetswitch'] = 'Enable/disable filters set';
$labels['filterdef'] = 'Filter definition';
$labels['filtersetname'] = 'Filters set name';
$labels['newfilterset'] = 'New filters set';

@ -84,6 +84,7 @@ if (window.rcmail) {
rcmail.filtersets_list.init().focus();
if (set != null) {
$('#filterset-name').text(set);
set = rcmail.managesieve_setid(set);
rcmail.filtersets_list.select(set);
}
@ -163,8 +164,10 @@ rcube_webmail.prototype.managesieve_setselect = function(list)
this.enable_command('plugin.managesieve-seteditraw', list.rowcount > 0 && this.env.raw_sieve_editor);
var id = list.get_single_selection();
if (id != null)
if (id != null) {
this.managesieve_list(this.env.filtersets[id]);
$('#filterset-name').text(this.env.filtersets[id]);
}
};
rcube_webmail.prototype.managesieve_rowid = function(id)
@ -355,13 +358,13 @@ rcube_webmail.prototype.managesieve_updatelist = function(action, o)
case 'setdel':
var id = this.managesieve_setid(o.name);
this.filtersets_list.remove_row(id);
this.filters_list.clear();
this.show_contentframe(false);
this.enable_command('plugin.managesieve-setdel', 'plugin.managesieve-setact', 'plugin.managesieve-setget', false);
this.enable_command('plugin.managesieve-setdel', 'plugin.managesieve-setact',
'plugin.managesieve-setget', 'plugin.managesieve-seteditraw', false);
this.filtersets_list.remove_row(id, true);
delete this.env.filtersets[id];
break;
// Create set row
@ -695,7 +698,7 @@ function rule_mod_select(id, header)
if (!header)
header = document.getElementById('header' + id).value;
target.style.display = obj.value != 'address' && obj.value != 'envelope' ? 'none' : 'inline';
target.style.display = obj.value != 'address' && obj.value != 'envelope' ? 'none' : '';
if (index)
index.style.display = !header.match(/^(body|currentdate|size|message|string)$/) && obj.value != 'envelope' ? '' : 'none';
@ -802,7 +805,7 @@ function smart_field_init(field)
if (field.hasClass('error')) {
area.addClass('error');
rcmail.managesieve_tip_register([[id, field.data('tip')]]);
rcmail.managesieve_tip_register([[id, field.data('tip-class'), field.data('tip-msg')]]);
}
};
@ -880,19 +883,25 @@ function smart_field_reset(field, data)
// Register onmouse(leave/enter) events for tips on specified form element
rcube_webmail.prototype.managesieve_tip_register = function(tips)
{
if (window.UI && UI.form_errors)
return UI.form_errors(tips);
var n, framed = parent.rcmail,
tip = framed ? parent.rcmail.env.ms_tip_layer : rcmail.env.ms_tip_layer;
for (n in tips) {
console.log(tips[n]);
$('#'+tips[n][0])
.data('tip', tips[n][1])
.data('tip-class', tips[n][1])
.data('tip-msg', tips[n][2])
.mouseleave(function(e) { tip.hide(); })
.mouseenter(function(e) {
var elem = $(this),
offset = elem.offset(),
left = offset.left,
top = offset.top - 12,
minwidth = elem.width();
minwidth = elem.width(),
span = $('<span>').addClass(elem.data('tip-class')).text(elem.data('tip-msg'));
if (framed) {
offset = $((rcmail.env.task == 'mail' ? '#sievefilterform > iframe' : '#filter-box'), parent.document).offset();
@ -900,7 +909,7 @@ rcube_webmail.prototype.managesieve_tip_register = function(tips)
left += offset.left;
}
tip.html(elem.data('tip'));
tip.html('').append(span);
top -= tip.height();
tip.css({left: left, top: top, minWidth: (minwidth-2) + 'px'}).show();

@ -392,7 +392,7 @@ td.rowtargets > span.listarea
.listarea.error .listelement
{
background-color: #FFFFC4;
background-color: #FFFF88;
}
.listelement:first-child

@ -4,38 +4,35 @@
<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="managesieve.filters" /></h1>
<!--
<div id="settings-right" role="main">
<roundcube:if condition="!env:managesieve_no_set_list" />
<div id="filtersetslistbox" class="uibox listbox" aria-labelledby="aria-label-filtersets">
<h2 class="boxtitle" id="aria-label-filtersets"><roundcube:label name="managesieve.filtersets" /></h2>
<div class="scroller withfooter">
<roundcube:object name="filtersetslist" id="filtersetslist" class="listing" summary="managesieve.ariasummaryfiltersetslist" type="list" noheader="true" role="listbox" />
</div>
<div class="boxfooter">
<roundcube:button command="plugin.managesieve-setadd" type="link" title="managesieve.filtersetadd" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="filtersetmenulink" id="filtersetmenulink" type="link" title="moreactions" class="listbutton groupactions" onclick="return UI.toggle_popup('filtersetmenu', event)" innerClass="inner" content="&#9881;" aria-haspopup="true" aria-expanded="false" aria-owns="filtersetmenu-menu" />
</div>
</div>
<div id="filtersscreen">
<roundcube:else />
<div id="filtersscreen" class="nosetlist">
<roundcube:endif />
</div>
-->
<!-- filters list -->
<div class="list listbox selected" aria-labelledby="aria-label-filters">
<div class="list listbox selected">
<div class="header">
<a class="button icon menu-button" href="#menu"><span class="inner"><roundcube:label name="menu" /></span></a>
<a class="button icon back-sidebar-button" href="#sidebar"><span class="inner"><roundcube:label name="settings" /></span></a>
<span id="aria-label-responseslist" class="header-title"><roundcube:label name="managesieve.filters" /></span>
<span id="aria-label-filterslist" class="header-title"><roundcube:label name="managesieve.filters" /></span>
<a class="button icon toolbar-menu-button" href="#list-menu"><span class="inner"><roundcube:label name="menu" /></span></a>
</div>
<div class="scroller">
<roundcube:if condition="!env:managesieve_no_set_list" />
<div class="pagenav pagenav-list toolbar" onclick="UI.switch_nav_list(this)">
<a class="button icon expand" href="#filtersetslistbox"><span class="inner"></span></a>
<span id="filterset-name" class="pagenav-text"></span>
<h2 class="voice" id="aria-label-filtersets"><roundcube:label name="managesieve.filtersets" /></h2>
</div>
<div id="filtersetslistbox" class="navlist scroller" aria-labelledby="aria-label-filtersets">
<roundcube:object name="filtersetslist" id="filtersetslist" class="listing"
summary="managesieve.ariasummaryfiltersetslist" type="list" noheader="true" role="listbox" />
</div>
<roundcube:endif />
<div class="scroller" aria-labelledby="aria-label-filterslist">
<roundcube:object name="filterslist" id="filterslist" class="listing" noheader="true"
role="listbox" data-list="filters_list" />
</div>
<div class="footer"></div>
<roundcube:if condition="!env:managesieve_no_set_list" />
<div class="footer toolbar">
<roundcube:button name="filtersetactions" type="link" title="managesieve.arialabelfiltersetactions" label="actions"
class="button actions" innerclass="inner" data-popup="filterset-menu" />
</div>
<roundcube:endif />
</div>
<!-- filter details frame -->
@ -47,29 +44,29 @@
<!-- toolbar -->
<div id="responsestoolbar" class="toolbar">
<roundcube:button command="plugin.managesieve-add" type="link"
label="create" title="managesieve.filteradd"
class="button create disabled" classAct="button create" innerClass="inner" />
label="create" title="managesieve.filteradd" innerClass="inner"
class="button create disabled" classAct="button create" />
<roundcube:button command="plugin.managesieve-del" type="link"
label="delete" title="delete" innerClass="inner"
class="button delete disabled" classAct="button delete" />
</div>
</div>
<h2 id="aria-label-filterframe" class="voice"><roundcube:label name="managesieve.arialabelfilterform" /></h2>
<roundcube:object name="filterframe" id="filter-frame" src="/watermark.html" title="managesieve.arialabelfilterform"
<roundcube:object name="filterframe" id="filter-box" src="/watermark.html" title="managesieve.arialabelfilterform"
aria-labelledby="aria-label-filterform" />
</div>
<div id="filterset-menu" class="popupmenu">
<h3 id="aria-label-setactions" class="voice"><roundcube:label name="managesieve.arialabelfiltersetactions" /></h3>
<ul class="toolbarmenu" id="filtersetmenu-menu" role="menu" aria-labelledby="aria-label-setactions">
<roundcube:button type="link-menuitem" command="plugin.managesieve-setact" label="managesieve.enable" classAct="active" /></li>
<roundcube:button type="link-menuitem" command="plugin.managesieve-setdel" label="delete" classAct="active" /></li>
<ul class="toolbarmenu listing" id="filtersetmenu-menu" role="menu" aria-labelledby="aria-label-setactions">
<roundcube:button type="link-menuitem" command="plugin.managesieve-setadd" label="managesieve.filtersetadd" class="create" classAct="create active" />
<roundcube:if condition="env:raw_sieve_editor != false" />
<roundcube:button type="link-menuitem" command="plugin.managesieve-seteditraw" label="managesieve.filterseteditraw" classAct="active" /></li>
<roundcube:button type="link-menuitem" command="plugin.managesieve-seteditraw" label="managesieve.filterseteditraw" class="edit" classAct="edit active" data-hidden="small" />
<roundcube:endif />
<li role="menuitem" class="separator_above">
<roundcube:button type="link-menuitem" command="plugin.managesieve-setget" label="download" classAct="active" /></li>
<roundcube:container name="filtersetoptions" id="filterset-menu" />
<roundcube:button type="link-menuitem" command="plugin.managesieve-setact" label="managesieve.filtersetswitch" class="status" classAct="status active" />
<roundcube:button type="link-menuitem" command="plugin.managesieve-setdel" label="managesieve.filtersetdel" class="delete" classAct="delete active" />
<roundcube:button type="link-menuitem" command="plugin.managesieve-setget" label="download" class="download" classAct="download active" />
<roundcube:container name="filtersetoptions" id="filtersetmenu-menu" />
</ul>
</div>

@ -7,7 +7,7 @@
</div>
<div class="formbuttons">
<roundcube:button command="plugin-managesieve-save" class="primary button save" label="save" />
<roundcube:button command="plugin.managesieve-save" class="btn btn-primary save" label="save" />
</div>
<roundcube:include file="includes/footer.html" />

@ -101,6 +101,10 @@ body.iframe
vertical-align: middle;
}
#filter-form li {
border: none;
}
#filter-form .col-form-label {
display: inline-block;
min-width: 75px;

@ -931,7 +931,7 @@ get_first_row: function()
var i, uid, rows = this.tbody.childNodes;
for (i=0; i<rows.length; i++)
if (rows[i].id && (uid = this.get_row_uid(rows[i])))
if (rows[i].id && (uid = this.get_row_uid(rows[i])) && this.rows[uid])
return uid;
}
@ -944,7 +944,7 @@ get_last_row: function()
var i, uid, rows = this.tbody.childNodes;
for (i=rows.length-1; i>=0; i--)
if (rows[i].id && (uid = this.get_row_uid(rows[i])))
if (rows[i].id && (uid = this.get_row_uid(rows[i])) && this.rows[uid])
return uid;
}

Loading…
Cancel
Save