diff --git a/CHANGELOG b/CHANGELOG index 94529ffc0..d4c0a9328 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -17,6 +17,7 @@ CHANGELOG Roundcube Webmail - Change folders sorting so shared/other users namespaces are listed last (#5012) - Display a warning and do not try to open empty attachments (#7332) - Elastic: Dark mode (#6709) +- Elastic: Minimize forms/colors blink on page load - Elastic: Improve mail header "detailed mode" (#7224) - Elastic: Moving single recipients between recipient inputs with drag-n-drop (#5069) - Elastic: Display a special icon for other users and shared namespace roots (#5012) diff --git a/plugins/acl/acl.php b/plugins/acl/acl.php index a7e43369d..6b42f025c 100644 --- a/plugins/acl/acl.php +++ b/plugins/acl/acl.php @@ -312,9 +312,9 @@ class acl extends rcube_plugin function templ_user($attrib) { // Create username input - $attrib['name'] = 'acluser'; $class = $attrib['class']; - unset($attrib['class']); + $attrib['name'] = 'acluser'; + $attrib['class'] = 'form-control'; $textfield = new html_inputfield($attrib); diff --git a/plugins/archive/archive.php b/plugins/archive/archive.php index 661ab5427..bb081b24e 100644 --- a/plugins/archive/archive.php +++ b/plugins/archive/archive.php @@ -403,6 +403,7 @@ class archive extends rcube_plugin 'folder_filter' => 'mail', 'folder_rights' => 'w', 'onchange' => "if ($(this).val() == 'INBOX') $(this).val('')", + 'class' => 'custom-select', )); } else { @@ -418,7 +419,7 @@ class archive extends rcube_plugin // we do not allow archive splitting, for simplicity (#5057) if ($rcmail->get_storage()->get_capability(rcube_storage::DUAL_USE_FOLDERS)) { // add option for structuring the archive folder - $archive_type = new html_select(array('name' => '_archive_type', 'id' => 'ff_archive_type')); + $archive_type = new html_select(array('name' => '_archive_type', 'id' => 'ff_archive_type', 'class' => 'custom-select')); $archive_type->add($this->gettext('none'), ''); $archive_type->add($this->gettext('archivetypeyear'), 'year'); $archive_type->add($this->gettext('archivetypemonth'), 'month'); diff --git a/plugins/enigma/enigma.php b/plugins/enigma/enigma.php index 0ccdc50f4..853bb0aae 100644 --- a/plugins/enigma/enigma.php +++ b/plugins/enigma/enigma.php @@ -371,7 +371,7 @@ class enigma extends rcube_plugin } $field_id = 'rcmfd_enigma_password_time'; - $select = new html_select(array('name' => '_enigma_password_time', 'id' => $field_id)); + $select = new html_select(array('name' => '_enigma_password_time', 'id' => $field_id, 'class' => 'custom-select')); foreach (array(1, 5, 10, 15, 30) as $m) { $label = $this->gettext(array('name' => 'nminutes', 'vars' => array('m' => $m))); diff --git a/plugins/enigma/lib/enigma_ui.php b/plugins/enigma/lib/enigma_ui.php index d7095c420..0d896c225 100644 --- a/plugins/enigma/lib/enigma_ui.php +++ b/plugins/enigma/lib/enigma_ui.php @@ -609,8 +609,13 @@ class enigma_ui if (empty($attrib['part']) || $attrib['part'] == 'import') { $title = $this->enigma->gettext('keyimportlabel'); - $upload = new html_inputfield(array('type' => 'file', 'name' => '_file', - 'id' => 'rcmimportfile', 'size' => 30)); + $upload = new html_inputfield(array( + 'type' => 'file', + 'name' => '_file', + 'id' => 'rcmimportfile', + 'size' => 30, + 'class' => 'form-control' + )); $max_filesize = $this->rc->upload_init(); $upload_button = new html_button(array( @@ -635,7 +640,7 @@ class enigma_ui if (empty($attrib['part']) || $attrib['part'] == 'search') { $title = $this->enigma->gettext('keyimportsearchlabel'); $search = new html_inputfield(array('type' => 'text', 'name' => '_search', - 'id' => 'rcmimportsearch', 'size' => 30)); + 'id' => 'rcmimportsearch', 'size' => 30, 'class' => 'form-control')); $search_button = new html_button(array( 'class' => 'button search', @@ -760,7 +765,7 @@ class enigma_ui $table->add(null, html::tag('ul', 'proplist', implode("\n", $identities))); // Key size - $select = new html_select(array('name' => 'size', 'id' => 'key-size')); + $select = new html_select(array('name' => 'size', 'id' => 'key-size', 'class' => 'custom-select')); $select->add($this->enigma->gettext('key2048'), '2048'); $select->add($this->enigma->gettext('key4096'), '4096'); diff --git a/plugins/hide_blockquote/hide_blockquote.php b/plugins/hide_blockquote/hide_blockquote.php index c29047115..43add71dd 100644 --- a/plugins/hide_blockquote/hide_blockquote.php +++ b/plugins/hide_blockquote/hide_blockquote.php @@ -55,7 +55,12 @@ class hide_blockquote extends rcube_plugin $rcmail = rcmail::get_instance(); $limit = (int) $rcmail->config->get('hide_blockquote_limit'); $field_id = 'hide_blockquote_limit'; - $input = new html_inputfield(array('name' => '_'.$field_id, 'id' => $field_id, 'size' => 5)); + $input = new html_inputfield(array( + 'name' => '_' . $field_id, + 'id' => $field_id, + 'size' => 5, + 'class' => 'form-control' + )); $args['blocks']['main']['options']['hide_blockquote_limit'] = array( 'title' => html::label($field_id, $this->gettext('quotelimit')), @@ -73,5 +78,4 @@ class hide_blockquote extends rcube_plugin return $args; } - } diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php index e64b74189..321e753e1 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php @@ -1344,8 +1344,12 @@ class rcube_sieve_engine $this->rc->output->include_script('list.js'); } else { - $select = new html_select(array('name' => '_set', 'id' => $attrib['id'], - 'onchange' => $this->rc->task != 'mail' ? 'rcmail.managesieve_set()' : '')); + $select = new html_select(array( + 'name' => '_set', + 'id' => $attrib['id'], + 'class' => 'custom-select', + 'onchange' => $this->rc->task != 'mail' ? 'rcmail.managesieve_set()' : '' + )); if ($list) { foreach ($list as $set) @@ -1427,7 +1431,7 @@ class rcube_sieve_engine // filter set name input $input_name = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30, - 'class' => ($this->errors['name'] ? 'error' : ''))); + 'class' => ($this->errors['name'] ? 'error form-control' : 'form-control'))); $table->add('title', html::label('_name', rcube::Q($this->plugin->gettext('filtersetname')))); $table->add(null, $input_name->show($name)); @@ -1443,7 +1447,7 @@ class rcube_sieve_engine // filters set list $list = $this->list_scripts(); - $select = new html_select(array('name' => '_copy', 'id' => '_copy')); + $select = new html_select(array('name' => '_copy', 'id' => '_copy', 'class' => 'custom-select')); if (is_array($list)) { asort($list, SORT_LOCALE_STRING); @@ -1466,7 +1470,7 @@ class rcube_sieve_engine // script upload box $upload = new html_inputfield(array('name' => '_file', 'id' => '_file', 'size' => 30, - 'type' => 'file', 'class' => ($this->errors['file'] ? 'error' : ''))); + 'type' => 'file', 'class' => ($this->errors['file'] ? 'error form-control' : 'form-control'))); $filters .= '
  • ' . html::label('from_file', html::tag('input', array( 'type' => 'radio', @@ -1534,7 +1538,7 @@ class rcube_sieve_engine 'name' => '_name', 'id' => '_name', 'size' => 30, - 'class' => ($this->errors['name'] ? ' error' : '') + 'class' => ($this->errors['name'] ? 'form-control error' : 'form-control') )); if ($this->errors['name']) { @@ -1567,7 +1571,7 @@ class rcube_sieve_engine rcube::Q($this->plugin->gettext('filterenabled'))); if ($compact) { - $select = new html_select(array('name' => '_join', 'id' => '_join', + $select = new html_select(array('name' => '_join', 'id' => '_join', 'class' => 'custom-select', 'onchange' => 'rule_join_radio(this.value)')); foreach (array('allof', 'anyof', 'any') as $val) { @@ -1683,7 +1687,7 @@ class rcube_sieve_engine // headers select $select_header = new html_select(array('name' => "_header[$id]", 'id' => 'header'.$id, - 'onchange' => 'rule_header_select(' .$id .')')); + 'onchange' => 'rule_header_select(' .$id .')', 'class' => 'custom-select')); foreach ($this->headers as $index => $header) { $header = $this->rc->text_exists($index) ? $this->plugin->gettext($index) : $header; @@ -1794,9 +1798,11 @@ class rcube_sieve_engine if (in_array('date', $this->exts) || in_array('currentdate', $this->exts)) { $date_parts = array('date', 'iso8601', 'std11', 'julian', 'time', 'year', 'month', 'day', 'hour', 'minute', 'second', 'weekday', 'zone'); - $select_dp = new html_select(array('name' => "_rule_date_part[$id]", 'id' => 'rule_date_part'.$id, - 'style' => in_array($rule['test'], array('currentdate', 'date')) && !preg_match('/^(notcount|count)-/', $test) ? '' : 'display:none', - 'class' => 'datepart_selector', + $select_dp = new html_select(array( + 'name' => "_rule_date_part[$id]", + 'id' => 'rule_date_part'.$id, + 'style' => in_array($rule['test'], array('currentdate', 'date')) && !preg_match('/^(notcount|count)-/', $test) ? '' : 'display:none', + 'class' => 'datepart_selector custom-select', )); foreach ($date_parts as $part) { @@ -1808,9 +1814,11 @@ class rcube_sieve_engine // message test select (e.g. duplicate) if (in_array('duplicate', $this->exts)) { - $select_msg = new html_select(array('name' => "_rule_message[$id]", 'id' => 'rule_message'.$id, - 'style' => in_array($rule['test'], array('duplicate')) ? '' : 'display:none', - 'class' => 'message_selector', + $select_msg = new html_select(array( + 'name' => "_rule_message[$id]", + 'id' => 'rule_message'.$id, + 'style' => in_array($rule['test'], array('duplicate')) ? '' : 'display:none', + 'class' => 'message_selector custom-select', )); $select_msg->add(rcube::Q($this->plugin->gettext('duplicate')), 'duplicate'); @@ -1825,11 +1833,19 @@ class rcube_sieve_engine 'class' => $this->error_class($id, 'test', 'target', 'rule_target') )) . "\n"; - $select_size_op = new html_select(array('name' => "_rule_size_op[$id]", 'id' => 'rule_size_op'.$id, 'class' => 'input-group-prepend')); + $select_size_op = new html_select(array( + 'name' => "_rule_size_op[$id]", + 'id' => 'rule_size_op'.$id, + 'class' => 'input-group-prepend custom-select' + )); $select_size_op->add(rcube::Q($this->plugin->gettext('filterover')), 'over'); $select_size_op->add(rcube::Q($this->plugin->gettext('filterunder')), 'under'); - $select_size_item = new html_select(array('name' => "_rule_size_item[$id]", 'id' => 'rule_size_item'.$id, 'class' => 'input-group-append')); + $select_size_item = new html_select(array( + 'name' => "_rule_size_item[$id]", + 'id' => 'rule_size_item'.$id, + 'class' => 'input-group-append custom-select' + )); foreach (array('', 'K', 'M', 'G') as $unit) { $select_size_item->add($this->plugin->gettext($unit . 'B'), $unit); } @@ -1849,15 +1865,23 @@ class rcube_sieve_engine $tout .= ''; // Advanced modifiers (address, envelope) - $select_mod = new html_select(array('name' => "_rule_mod[$id]", 'id' => 'rule_mod_op'.$id, - 'onchange' => 'rule_mod_select(' .$id .')')); + $select_mod = new html_select(array( + 'name' => "_rule_mod[$id]", + 'id' => 'rule_mod_op' . $id, + 'class' => 'custom-select', + 'onchange' => 'rule_mod_select(' .$id .')' + )); $select_mod->add(rcube::Q($this->plugin->gettext('none')), ''); $select_mod->add(rcube::Q($this->plugin->gettext('address')), 'address'); if (in_array('envelope', $this->exts)) { $select_mod->add(rcube::Q($this->plugin->gettext('envelope')), 'envelope'); } - $select_type = new html_select(array('name' => "_rule_mod_type[$id]", 'id' => 'rule_mod_type'.$id)); + $select_type = new html_select(array( + 'name' => "_rule_mod_type[$id]", + 'id' => 'rule_mod_type' . $id, + 'class' => 'custom-select', + )); $select_type->add(rcube::Q($this->plugin->gettext('allparts')), 'all'); $select_type->add(rcube::Q($this->plugin->gettext('domain')), 'domain'); $select_type->add(rcube::Q($this->plugin->gettext('localpart')), 'localpart'); @@ -1888,8 +1912,12 @@ class rcube_sieve_engine if (in_array('mime', $this->exts)) { $need_mime = !$rule || in_array($rule['test'], array('header', 'address', 'exists')); $mime_type = ''; - $select_mime = new html_select(array('name' => "_rule_mime_type[$id]", 'id' => 'rule_mime_type' . $id, - 'style' => 'min-width:8em', 'onchange' => 'rule_mime_select(' . $id . ')')); + $select_mime = new html_select(array( + 'name' => "_rule_mime_type[$id]", + 'id' => 'rule_mime_type' . $id, + 'style' => 'min-width:8em', 'onchange' => 'rule_mime_select(' . $id . ')', + 'class' => 'custom-select', + )); $select_mime->add('-', ''); foreach (array('contenttype', 'type', 'subtype', 'param') as $val) { @@ -1900,7 +1928,11 @@ class rcube_sieve_engine $select_mime->add(rcube::Q($this->plugin->gettext('mime-' . $val)), $val); } - $select_mime_part = new html_select(array('name' => "_rule_mime_part[$id]", 'id' => 'rule_mime_part' . $id)); + $select_mime_part = new html_select(array( + 'name' => "_rule_mime_part[$id]", + 'id' => 'rule_mime_part' . $id, + 'class' => 'custom-select', + )); $select_mime_part->add(rcube::Q($this->plugin->gettext('mime-message')), ''); $select_mime_part->add(rcube::Q($this->plugin->gettext('mime-anychild')), 'anychild'); @@ -1918,8 +1950,12 @@ class rcube_sieve_engine } // Advanced modifiers (body transformations) - $select_mod = new html_select(array('name' => "_rule_trans[$id]", 'id' => 'rule_trans_op'.$id, - 'onchange' => 'rule_trans_select(' .$id .')')); + $select_mod = new html_select(array( + 'name' => "_rule_trans[$id]", + 'id' => 'rule_trans_op' . $id, + 'class' => 'custom-select', + 'onchange' => 'rule_trans_select(' .$id .')' + )); $select_mod->add(rcube::Q($this->plugin->gettext('text')), 'text'); $select_mod->add(rcube::Q($this->plugin->gettext('undecoded')), 'raw'); $select_mod->add(rcube::Q($this->plugin->gettext('contenttype')), 'content'); @@ -2110,8 +2146,12 @@ class rcube_sieve_engine $out .= '
    '; // action select - $select_action = new html_select(array('name' => "_action_type[$id]", 'id' => 'action_type'.$id, - 'onchange' => 'action_type_select(' .$id .')')); + $select_action = new html_select(array( + 'name' => "_action_type[$id]", + 'id' => 'action_type' . $id, + 'class' => 'custom-select', + 'onchange' => 'action_type_select(' . $id . ')' + )); if (in_array('fileinto', $this->exts)) $select_action->add($this->plugin->gettext('messagemoveto'), 'fileinto'); if (in_array('fileinto', $this->exts) && in_array('copy', $this->exts)) @@ -2160,7 +2200,11 @@ class rcube_sieve_engine if (!empty($domains)) { sort($domains); - $domain_select = new html_select(array('name' => "_action_target_domain[$id]", 'id' => 'action_target_domain'.$id)); + $domain_select = new html_select(array( + 'name' => "_action_target_domain[$id]", + 'id' => 'action_target_domain' . $id, + 'class' => 'custom-select', + )); $domain_select->add(array_combine($domains, $domains)); if ($action['type'] == 'redirect') { @@ -2263,7 +2307,10 @@ class rcube_sieve_engine 'class' => $this->error_class($id, 'action', 'interval', 'action_interval'), )); if ($vsec) { - $interval_select = new html_select(array('name' => '_action_interval_type[' . $id . ']', 'class' => 'input-group-append')); + $interval_select = new html_select(array( + 'name' => '_action_interval_type[' . $id . ']', + 'class' => 'input-group-append custom-select' + )); $interval_select->add($this->plugin->gettext('days'), 'days'); $interval_select->add($this->plugin->gettext('seconds'), 'seconds'); $out .= $interval_select->show(isset($action['seconds']) ? 'seconds' : 'days'); @@ -2370,7 +2417,7 @@ class rcube_sieve_engine $select_method = new html_select(array( 'name' => "_action_notifymethod[$id]", 'id' => "_action_notifymethod$id", - 'class' => 'input-group-prepend ' . $this->error_class($id, 'action', 'method', 'action_notifymethod'), + 'class' => 'input-group-prepend custom-select ' . $this->error_class($id, 'action', 'method', 'action_notifymethod'), )); foreach ($notify_methods as $m_n) { $select_method->add(rcube::Q($this->rc->text_exists('managesieve.notifymethod'.$m_n) ? $this->plugin->gettext('managesieve.notifymethod'.$m_n) : $m_n), $m_n); @@ -2379,7 +2426,7 @@ class rcube_sieve_engine $select_importance = new html_select(array( 'name' => "_action_notifyimportance[$id]", 'id' => "_action_notifyimportance$id", - 'class' => $this->error_class($id, 'action', 'importance', 'action_notifyimportance') + 'class' => 'custom-select ' . $this->error_class($id, 'action', 'importance', 'action_notifyimportance') )); foreach ($importance_options as $io_v => $io_n) { $select_importance->add(rcube::Q($this->plugin->gettext($io_n)), $io_v); @@ -2432,14 +2479,14 @@ class rcube_sieve_engine $pos1_selector = new html_select(array( 'name' => "_action_addheader_pos[$id]", 'id' => "action_addheader_pos$id", - 'class' => $this->error_class($id, 'action', 'pos', 'action_addheader_pos') + 'class' => 'custom-select ' . $this->error_class($id, 'action', 'pos', 'action_addheader_pos') )); $pos1_selector->add($this->plugin->gettext('headeratstart'), ''); $pos1_selector->add($this->plugin->gettext('headeratend'), 'last'); $pos2_selector = new html_select(array( 'name' => "_action_delheader_pos[$id]", 'id' => "action_delheader_pos$id", - 'class' => $this->error_class($id, 'action', 'pos', 'action_delheader_pos') + 'class' => 'custom-select ' . $this->error_class($id, 'action', 'pos', 'action_delheader_pos') )); $pos2_selector->add($this->plugin->gettext('headerfromstart'), ''); $pos2_selector->add($this->plugin->gettext('headerfromend'), 'last'); @@ -3062,7 +3109,7 @@ class rcube_sieve_engine 'name' => "_{$name}[$id]", 'id' => "{$name}{$id}", 'style' => 'display:' .(!in_array($rule, array('size', 'duplicate')) ? 'inline' : 'none'), - 'class' => 'operator_selector col-6', + 'class' => 'operator_selector col-6 custom-select', 'onchange' => "{$name}_select(this, '{$id}')", )); @@ -3100,7 +3147,11 @@ class rcube_sieve_engine protected function comparator_selector($comparator, $name, $id) { - $select_comp = new html_select(array('name' => "_{$name}[$id]", 'id' => "{$name}_op{$id}")); + $select_comp = new html_select(array( + 'name' => "_{$name}[$id]", + 'id' => "{$name}_op{$id}", + 'class' => 'custom-select' + )); $select_comp->add(rcube::Q($this->plugin->gettext('default')), ''); $select_comp->add(rcube::Q($this->plugin->gettext('octet')), 'i;octet'); $select_comp->add(rcube::Q($this->plugin->gettext('asciicasemap')), 'i;ascii-casemap'); diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_forward.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_forward.php index a42c5bcc9..6a1966c1c 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_forward.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_forward.php @@ -256,8 +256,8 @@ class rcube_sieve_forward extends rcube_sieve_engine // form elements - $status = new html_select(array('name' => 'forward_status', 'id' => 'forward_status')); - $action = new html_select(array('name' => 'forward_action', 'id' => 'forward_action')); + $status = new html_select(array('name' => 'forward_status', 'id' => 'forward_status', 'class' => 'custom-select')); + $action = new html_select(array('name' => 'forward_action', 'id' => 'forward_action', 'class' => 'custom-select')); $status->add($this->plugin->gettext('forward.on'), 'on'); $status->add($this->plugin->gettext('forward.off'), 'off'); @@ -274,7 +274,7 @@ class rcube_sieve_forward extends rcube_sieve_engine if (!empty($domains)) { sort($domains); - $domain_select = new html_select(array('name' => 'action_domain', 'id' => 'action_domain')); + $domain_select = new html_select(array('name' => 'action_domain', 'id' => 'action_domain', 'class' => 'custom-select')); $domain_select->add(array_combine($domains, $domains)); if ($redirect && $this->forward['target']) { diff --git a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php index 8716f4eb4..3e6b9bcf1 100644 --- a/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php +++ b/plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php @@ -383,14 +383,14 @@ class rcube_sieve_vacation extends rcube_sieve_engine } // form elements - $from = new html_inputfield(array('name' => 'vacation_from', 'id' => 'vacation_from', 'size' => 50)); - $subject = new html_inputfield(array('name' => 'vacation_subject', 'id' => 'vacation_subject', 'size' => 50)); + $from = new html_inputfield(array('name' => 'vacation_from', 'id' => 'vacation_from', 'size' => 50, 'class' => 'form-control')); + $subject = new html_inputfield(array('name' => 'vacation_subject', 'id' => 'vacation_subject', 'size' => 50, 'class' => 'form-control')); $reason = new html_textarea(array('name' => 'vacation_reason', 'id' => 'vacation_reason', 'cols' => 60, 'rows' => 8)); - $interval = new html_inputfield(array('name' => 'vacation_interval', 'id' => 'vacation_interval', 'size' => 5)); + $interval = new html_inputfield(array('name' => 'vacation_interval', 'id' => 'vacation_interval', 'size' => 5, 'class' => 'form-control')); $addresses = ''; - $status = new html_select(array('name' => 'vacation_status', 'id' => 'vacation_status')); - $action = new html_select(array('name' => 'vacation_action', 'id' => 'vacation_action', 'onchange' => 'vacation_action_select()')); + $status = new html_select(array('name' => 'vacation_status', 'id' => 'vacation_status', 'class' => 'custom-select')); + $action = new html_select(array('name' => 'vacation_action', 'id' => 'vacation_action', 'class' => 'custom-select', 'onchange' => 'vacation_action_select()')); $addresses_link = new html_inputfield(array( 'type' => 'button', 'href' => '#', @@ -413,7 +413,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine && !empty($this->vacation['list']) && in_array($this->script_name, $this->active) ) { - $after = new html_select(array('name' => 'vacation_after', 'id' => 'vacation_after')); + $after = new html_select(array('name' => 'vacation_after', 'id' => 'vacation_after', 'class' => 'custom-select')); $after->add('---', ''); foreach ($this->vacation['list'] as $idx => $rule) { @@ -423,7 +423,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine $interval_txt = $interval->show(self::vacation_interval($this->vacation, $this->exts)); if ($seconds_extension) { - $interval_select = new html_select(array('name' => 'vacation_interval_type')); + $interval_select = new html_select(array('name' => 'vacation_interval_type', 'class' => 'custom-select')); $interval_select->add($this->plugin->gettext('days'), 'days'); $interval_select->add($this->plugin->gettext('seconds'), 'seconds'); $interval_txt .= $interval_select->show(isset($this->vacation['seconds']) ? 'seconds' : 'days'); @@ -434,14 +434,14 @@ class rcube_sieve_vacation extends rcube_sieve_engine } if ($date_extension || $regex_extension) { - $date_from = new html_inputfield(array('name' => 'vacation_datefrom', 'id' => 'vacation_datefrom', 'class' => 'datepicker', 'size' => 12)); - $date_to = new html_inputfield(array('name' => 'vacation_dateto', 'id' => 'vacation_dateto', 'class' => 'datepicker', 'size' => 12)); + $date_from = new html_inputfield(array('name' => 'vacation_datefrom', 'id' => 'vacation_datefrom', 'class' => 'datepicker form-control', 'size' => 12)); + $date_to = new html_inputfield(array('name' => 'vacation_dateto', 'id' => 'vacation_dateto', 'class' => 'datepicker form-control', 'size' => 12)); $date_format = $this->rc->config->get('date_format', 'Y-m-d'); } if ($date_extension) { - $time_from = new html_inputfield(array('name' => 'vacation_timefrom', 'id' => 'vacation_timefrom', 'size' => 7)); - $time_to = new html_inputfield(array('name' => 'vacation_timeto', 'id' => 'vacation_timeto', 'size' => 7)); + $time_from = new html_inputfield(array('name' => 'vacation_timefrom', 'id' => 'vacation_timefrom', 'size' => 7, 'class' => 'form-control')); + $time_to = new html_inputfield(array('name' => 'vacation_timeto', 'id' => 'vacation_timeto', 'size' => 7, 'class' => 'form-control')); $time_format = $this->rc->config->get('time_format', 'H:i'); $date_value = array(); @@ -482,7 +482,7 @@ class rcube_sieve_vacation extends rcube_sieve_engine if (!empty($domains)) { sort($domains); - $domain_select = new html_select(array('name' => 'action_domain', 'id' => 'action_domain')); + $domain_select = new html_select(array('name' => 'action_domain', 'id' => 'action_domain', 'class' => 'custom-select')); $domain_select->add(array_combine($domains, $domains)); if ($redirect && $this->vacation['target']) { diff --git a/plugins/newmail_notifier/newmail_notifier.php b/plugins/newmail_notifier/newmail_notifier.php index 80aaebf3d..5feb2b9c0 100644 --- a/plugins/newmail_notifier/newmail_notifier.php +++ b/plugins/newmail_notifier/newmail_notifier.php @@ -124,7 +124,7 @@ class newmail_notifier extends rcube_plugin $key = 'newmail_notifier_' . $type; if (!in_array($key, $dont_override)) { $field_id = '_' . $key; - $select = new html_select(array('name' => $field_id, 'id' => $field_id)); + $select = new html_select(array('name' => $field_id, 'id' => $field_id, 'class' => 'custom-select')); foreach (array(5, 10, 15, 30, 45, 60) as $sec) { $label = $this->rc->gettext(array('name' => 'afternseconds', 'vars' => array('n' => $sec))); diff --git a/program/include/rcmail.php b/program/include/rcmail.php index f80c55491..2d5ee594e 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -2262,6 +2262,7 @@ class rcmail extends rcube 'id' => $attrib['id'] . 'Input', 'type' => 'file', 'name' => '_attachments[]', + 'class' => 'form-control', ); $form_attr = array( diff --git a/program/include/rcmail_output_html.php b/program/include/rcmail_output_html.php index 8d40e3771..5a7b2c21e 100644 --- a/program/include/rcmail_output_html.php +++ b/program/include/rcmail_output_html.php @@ -2186,7 +2186,7 @@ EOF; $hide_host = false; if (is_array($default_host) && count($default_host) > 1) { - $input_host = new html_select(array('name' => '_host', 'id' => 'rcmloginhost')); + $input_host = new html_select(array('name' => '_host', 'id' => 'rcmloginhost', 'class' => 'custom-select')); foreach ($default_host as $key => $value) { if (!is_array($value)) { @@ -2204,7 +2204,7 @@ EOF; 'name' => '_host', 'id' => 'rcmloginhost', 'value' => is_numeric($host) ? $default_host[$host] : $host) + $attrib); } else if (empty($default_host)) { - $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost') + $input_host = new html_inputfield(array('name' => '_host', 'id' => 'rcmloginhost', 'class' => 'form-control') + $attrib + $host_attrib); } diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc index 8cbf8af43..70c2192d1 100644 --- a/program/steps/addressbook/func.inc +++ b/program/steps/addressbook/func.inc @@ -572,7 +572,11 @@ function rcmail_contact_form($form, $record, $attrib = null) continue; } - $select_add = new html_select(array('class' => 'addfieldmenu', 'rel' => $section, 'data-compact' => $compact ? "true" : null)); + $select_add = new html_select(array( + 'class' => 'addfieldmenu custom-select', + 'rel' => $section, + 'data-compact' => $compact ? "true" : null + )); $select_add->add($RCMAIL->gettext('addfield'), ''); // render head section with name fields (not a regular list of rows) diff --git a/program/steps/addressbook/import.inc b/program/steps/addressbook/import.inc index 347cf7f69..830817b38 100644 --- a/program/steps/addressbook/import.inc +++ b/program/steps/addressbook/import.inc @@ -225,7 +225,7 @@ function rcmail_import_form($attrib) // addressbook selector if (count($writable_books) > 1) { - $select = new html_select(array('name' => '_target', 'id' => 'rcmimporttarget', 'is_escaped' => true)); + $select = new html_select(array('name' => '_target', 'id' => 'rcmimporttarget', 'is_escaped' => true, 'class' => 'custom-select')); foreach ($writable_books as $book) { $select->add($book['name'], $book['id']); diff --git a/program/steps/settings/edit_folder.inc b/program/steps/settings/edit_folder.inc index 52e7b626f..bfcf8aca5 100644 --- a/program/steps/settings/edit_folder.inc +++ b/program/steps/settings/edit_folder.inc @@ -95,7 +95,7 @@ function rcmail_folder_form($attrib) $folder = trim(rcube_utils::get_input_value('_name', rcube_utils::INPUT_POST, true)); } - $foldername = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30)); + $foldername = new html_inputfield(array('name' => '_name', 'id' => '_name', 'size' => 30, 'class' => 'form-control')); $foldername = '' . $foldername->show($folder); if ($options['special'] && ($sname = $RCMAIL->localize_foldername($mbox, false, true)) != $folder) { diff --git a/program/steps/settings/func.inc b/program/steps/settings/func.inc index eb82d3c85..05312ada1 100644 --- a/program/steps/settings/func.inc +++ b/program/steps/settings/func.inc @@ -184,7 +184,7 @@ function rcmail_user_prefs($current = null) asort($a_lang); $field_id = 'rcmfd_lang'; - $select = new html_select(array('name' => '_language', 'id' => $field_id)); + $select = new html_select(array('name' => '_language', 'id' => $field_id, 'class' => 'custom-select')); $select->add(array_values($a_lang), array_keys($a_lang)); $blocks['main']['options']['language'] = array( @@ -200,7 +200,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_timezone'; - $select = new html_select(array('name' => '_timezone', 'id' => $field_id)); + $select = new html_select(array('name' => '_timezone', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('autodetect'), 'auto'); $zones = array(); @@ -233,7 +233,7 @@ function rcmail_user_prefs($current = null) $defaults = array('G:i', 'H:i', 'g:i a', 'h:i A'); $formats = (array)$RCMAIL->config->get('time_formats', $defaults); $field_id = 'rcmfd_time_format'; - $select = new html_select(array('name' => '_time_format', 'id' => $field_id)); + $select = new html_select(array('name' => '_time_format', 'id' => $field_id, 'class' => 'custom-select')); foreach ($formats as $choice) { $select->add(date($choice, $reftime), $choice); @@ -254,7 +254,7 @@ function rcmail_user_prefs($current = null) $defaults = array('Y-m-d','d-m-Y','Y/m/d','m/d/Y','d/m/Y','d.m.Y','j.n.Y'); $formats = (array)$RCMAIL->config->get('date_formats', $defaults); $field_id = 'rcmfd_date_format'; - $select = new html_select(array('name' => '_date_format', 'id' => $field_id)); + $select = new html_select(array('name' => '_date_format', 'id' => $field_id, 'class' => 'custom-select')); foreach ($formats as $choice) { $select->add(date($choice, $refdate), $choice); @@ -302,7 +302,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_refresh_interval'; - $select = new html_select(array('name' => '_refresh_interval', 'id' => $field_id)); + $select = new html_select(array('name' => '_refresh_interval', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('never'), 0); foreach (array(1, 3, 5, 10, 15, 30, 60) as $min) { @@ -410,7 +410,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_layout'; - $select = new html_select(array('name' => '_layout', 'id' => $field_id)); + $select = new html_select(array('name' => '_layout', 'id' => $field_id, 'class' => 'custom-select')); $layouts = array( 'widescreen' => 'layoutwidescreendesc', @@ -439,7 +439,7 @@ function rcmail_user_prefs($current = null) $config['mail_read_time'] = intval($RCMAIL->config->get('mail_read_time')); $field_id = 'rcmfd_mail_read_time'; - $select = new html_select(array('name' => '_mail_read_time', 'id' => $field_id)); + $select = new html_select(array('name' => '_mail_read_time', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('never'), -1); $select->add($RCMAIL->gettext('immediately'), 0); @@ -461,7 +461,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_mdn_requests'; - $select = new html_select(array('name' => '_mdn_requests', 'id' => $field_id)); + $select = new html_select(array('name' => '_mdn_requests', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('askuser'), 0); $select->add($RCMAIL->gettext('autosend'), 1); $select->add($RCMAIL->gettext('autosendknown'), 3); @@ -484,7 +484,7 @@ function rcmail_user_prefs($current = null) if ($supported) { $field_id = 'rcmfd_autoexpand_threads'; - $select = new html_select(array('name' => '_autoexpand_threads', 'id' => $field_id)); + $select = new html_select(array('name' => '_autoexpand_threads', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('never'), 0); $select->add($RCMAIL->gettext('do_expand'), 1); $select->add($RCMAIL->gettext('expand_only_unread'), 2); @@ -503,7 +503,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_mail_pagesize'; - $input = new html_inputfield(array('name' => '_mail_pagesize', 'id' => $field_id, 'size' => 5)); + $input = new html_inputfield(array('name' => '_mail_pagesize', 'id' => $field_id, 'size' => 5, 'class' => 'form-control')); $size = intval($config['mail_pagesize'] ?: $config['pagesize']); $blocks['main']['options']['pagesize'] = array( @@ -590,8 +590,12 @@ function rcmail_user_prefs($current = null) $blocks['advanced']['options']['default_charset'] = array( 'title' => html::label($field_id, rcube::Q($RCMAIL->gettext('defaultcharset'))), 'content' => $RCMAIL->output->charset_selector(array( - 'id' => $field_id, 'name' => '_default_charset', 'selected' => $config['default_charset'] - ))); + 'id' => $field_id, + 'name' => '_default_charset', + 'selected' => $config['default_charset'], + 'class' => 'custom-select', + )) + ); } if (!isset($no_override['show_images'])) { @@ -600,8 +604,12 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_show_images'; - $input = new html_select(array('name' => '_show_images', 'id' => $field_id, - 'disabled' => !$config['prefer_html'])); + $input = new html_select(array( + 'name' => '_show_images', + 'id' => $field_id, + 'class' => 'custom-select', + 'disabled' => !$config['prefer_html'] + )); $input->add($RCMAIL->gettext('never'), 0); $input->add($RCMAIL->gettext('fromknownsenders'), 1); @@ -658,7 +666,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_htmleditor'; - $select = new html_select(array('name' => '_htmleditor', 'id' => $field_id)); + $select = new html_select(array('name' => '_htmleditor', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('never'), 0); $select->add($RCMAIL->gettext('htmlonreply'), 2); @@ -678,7 +686,12 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_autosave'; - $select = new html_select(array('name' => '_draft_autosave', 'id' => $field_id, 'disabled' => empty($config['drafts_mbox']))); + $select = new html_select(array( + 'name' => '_draft_autosave', + 'id' => $field_id, + 'class' => 'custom-select', + 'disabled' => empty($config['drafts_mbox']) + )); $select->add($RCMAIL->gettext('never'), 0); foreach (array(1, 3, 5, 10) as $i => $min) { @@ -698,7 +711,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_param_folding'; - $select = new html_select(array('name' => '_mime_param_folding', 'id' => $field_id)); + $select = new html_select(array('name' => '_mime_param_folding', 'id' => $field_id, 'class' => 'custom-select',)); $select->add($RCMAIL->gettext('2231folding'), 0); $select->add($RCMAIL->gettext('miscfolding'), 1); @@ -772,7 +785,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_reply_mode'; - $select = new html_select(array('name' => '_reply_mode', 'id' => $field_id)); + $select = new html_select(array('name' => '_reply_mode', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('replyempty'), -1); $select->add($RCMAIL->gettext('replybottomposting'), 0); @@ -823,7 +836,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_show_sig'; - $select = new html_select(array('name' => '_show_sig', 'id' => $field_id)); + $select = new html_select(array('name' => '_show_sig', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('never'), 0); $select->add($RCMAIL->gettext('always'), 1); @@ -884,7 +897,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_forward_attachment'; - $select = new html_select(array('name' => '_forward_attachment', 'id' => $field_id)); + $select = new html_select(array('name' => '_forward_attachment', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('inline'), 0); $select->add($RCMAIL->gettext('asattachment'), 1); @@ -902,27 +915,29 @@ function rcmail_user_prefs($current = null) // Default font size $field_id = 'rcmfd_default_font_size'; - $select_default_font_size = new html_select(array('name' => '_default_font_size', 'id' => $field_id)); + $select_size = new html_select(array('name' => '_default_font_size', 'id' => $field_id, 'class' => 'custom-select')); $fontsizes = array('', '8pt', '9pt', '10pt', '11pt', '12pt', '14pt', '18pt', '24pt', '36pt'); foreach ($fontsizes as $size) { - $select_default_font_size->add($size, $size); + $select_size->add($size, $size); } // Default font $field_id = 'rcmfd_default_font'; - $select_default_font = new html_select(array('name' => '_default_font', 'id' => $field_id)); - $select_default_font->add('', ''); + $select_font = new html_select(array('name' => '_default_font', 'id' => $field_id, 'class' => 'custom-select')); + $select_font->add('', ''); $fonts = rcmail::font_defs(); foreach (array_keys($fonts) as $fname) { - $select_default_font->add($fname, $fname); + $select_font->add($fname, $fname); } $blocks['main']['options']['default_font'] = array( 'title' => html::label($field_id, rcube::Q($RCMAIL->gettext('defaultfont'))), - 'content' => html::div('input-group', $select_default_font->show($RCMAIL->config->get('default_font', 1)) . - $select_default_font_size->show($RCMAIL->config->get('default_font_size', 1))) + 'content' => html::div('input-group', + $select_font->show($RCMAIL->config->get('default_font', 1)) . + $select_size->show($RCMAIL->config->get('default_font_size', 1)) + ) ); } @@ -932,7 +947,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_reply_all_mode'; - $select = new html_select(array('name' => '_reply_all_mode', 'id' => $field_id)); + $select = new html_select(array('name' => '_reply_all_mode', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('replyalldefault'), 0); $select->add($RCMAIL->gettext('replyalllist'), 1); @@ -974,7 +989,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_default_addressbook'; - $select = new html_select(array('name' => '_default_addressbook', 'id' => $field_id)); + $select = new html_select(array('name' => '_default_addressbook', 'id' => $field_id, 'class' => 'custom-select')); foreach ($books as $book) { $select->add(html_entity_decode($book['name'], ENT_COMPAT, 'UTF-8'), $book['id']); @@ -993,7 +1008,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_addressbook_name_listing'; - $select = new html_select(array('name' => '_addressbook_name_listing', 'id' => $field_id)); + $select = new html_select(array('name' => '_addressbook_name_listing', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('name'), 0); $select->add($RCMAIL->gettext('firstname') . ' ' . $RCMAIL->gettext('surname'), 1); @@ -1013,7 +1028,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_addressbook_sort_col'; - $select = new html_select(array('name' => '_addressbook_sort_col', 'id' => $field_id)); + $select = new html_select(array('name' => '_addressbook_sort_col', 'id' => $field_id, 'class' => 'custom-select')); $select->add($RCMAIL->gettext('name'), 'name'); $select->add($RCMAIL->gettext('firstname'), 'firstname'); @@ -1032,7 +1047,7 @@ function rcmail_user_prefs($current = null) } $field_id = 'rcmfd_addressbook_pagesize'; - $input = new html_inputfield(array('name' => '_addressbook_pagesize', 'id' => $field_id, 'size' => 5)); + $input = new html_inputfield(array('name' => '_addressbook_pagesize', 'id' => $field_id, 'size' => 5, 'class' => 'form-control')); $size = intval($config['addressbook_pagesize'] ?: $config['pagesize']); $blocks['main']['options']['pagesize'] = array( @@ -1086,6 +1101,7 @@ function rcmail_user_prefs($current = null) 'maxlength' => 30, 'folder_filter' => 'mail', 'folder_rights' => 'w', + 'class' => 'custom-select', )); // #1486114, #1488279, #1489219 diff --git a/skins/elastic/templates/compose.html b/skins/elastic/templates/compose.html index f8fb2f7ee..de7a54836 100644 --- a/skins/elastic/templates/compose.html +++ b/skins/elastic/templates/compose.html @@ -49,14 +49,14 @@
    - +
    - +
    diff --git a/skins/elastic/templates/includes/layout.html b/skins/elastic/templates/includes/layout.html index d0fbb7bd6..b3495b8ef 100644 --- a/skins/elastic/templates/includes/layout.html +++ b/skins/elastic/templates/includes/layout.html @@ -28,6 +28,17 @@ + + + action-"> diff --git a/skins/elastic/templates/login.html b/skins/elastic/templates/login.html index af1a1a8ef..17e8f5054 100644 --- a/skins/elastic/templates/login.html +++ b/skins/elastic/templates/login.html @@ -5,7 +5,7 @@
    - +
    diff --git a/skins/elastic/templates/mail.html b/skins/elastic/templates/mail.html index f19934591..f8a114881 100644 --- a/skins/elastic/templates/mail.html +++ b/skins/elastic/templates/mail.html @@ -62,19 +62,19 @@
    - +
    - +
    - diff --git a/skins/elastic/ui.js b/skins/elastic/ui.js index aae3e002d..c5acc5343 100644 --- a/skins/elastic/ui.js +++ b/skins/elastic/ui.js @@ -809,22 +809,23 @@ function rcube_elastic_ui() $('#taskmenu a.theme').on('click', function() { color_mode = $(this).is('.dark') ? 'dark' : 'light'; switch_color_mode(); - save_pref('color.mode', color_mode); + rcmail.set_cookie('colorMode', color_mode); }); // Note: this does not work in IE and Safari color_scheme.addListener(function(e) { color_mode = e.matches ? 'dark' : 'light'; switch_color_mode(); - save_pref('color.mode', null); + rcmail.set_cookie('colorMode', null); }); - if (color_scheme.matches) { - color_mode = 'dark'; - } - else if (pref = get_pref('color.mode')) { + // We deliberately use only cookies here, not local storage + if (pref = rcmail.get_cookie('colorMode')) { color_mode = pref; } + else if (color_scheme.matches) { + color_mode = 'dark'; + } switch_color_mode(); diff --git a/skins/elastic/watermark.html b/skins/elastic/watermark.html index 1370cfc77..4765caf31 100644 --- a/skins/elastic/watermark.html +++ b/skins/elastic/watermark.html @@ -24,6 +24,15 @@ html.dark-mode > body { background-blend-mode: soft-light; } +