action-">
diff -urN ../roundcubemail-1.6.2.orig/skins/elastic/ui.js ./skins/elastic/ui.js
--- ../roundcubemail-1.6.2.orig/skins/elastic/ui.js 2023-07-01 14:29:36.000000000 +0300
+++ ./skins/elastic/ui.js 2023-07-03 22:33:58.944355000 +0300
@@ -760,8 +760,127 @@
$('input.datepicker').each(function() { func(this); });
rcmail.addEventListener('insert-edit-field', func);
}
+
+ // scroll toolbar
+ var toolbarmenu = document.getElementById('toolbar-menu');
+ if (toolbarmenu) {
+ if (toolbarmenu.addEventListener) {
+ // scroll toolbar by mousewheel
+ if ('onwheel' in document) {
+ toolbarmenu.addEventListener('wheel', toolbarmenuOnWheel); // IE9+, Firefox17+, Chrome31+
+ } else if ('onmousewheel' in document) {
+ toolbarmenu.addEventListener('mousewheel', toolbarmenuOnWheel); // old variant
+ } else {
+ toolbarmenu.addEventListener('MozMousePixelScroll', toolbarmenuOnWheel); // Firefox17-
+ }
+ toolbarmenu.addEventListener('scroll', toolbarmenuOnScroll, { passive: true }); // for Edge
+
+ // scroll toolbar by drag
+ toolbarmenu.addEventListener('mousedown', toolbarmenuOnMouseDown);
+ toolbarmenu.addEventListener('mouseenter', toolbarmenuOnMouseEnter);
+ document.addEventListener('mousemove', toolbarmenuOnMouseMove)
+ document.addEventListener('mouseup', toolbarmenuOnMouseUp);
+ } else {
+ // IE8-
+
+ // scroll toolbar by mousewheel
+ toolbarmenu.attachEvent('onmousewheel', toolbarmenuOnWheel);
+
+ // scroll toolbar by drag
+ toolbarmenu.attachEvent('onmousedown', toolbarmenuOnMouseDown);
+ toolbarmenu.attachEvent('onmouseenter', toolbarmenuOnMouseEnter);
+ document.attachEvent('onmousemove', toolbarmenuOnMouseMove)
+ document.attachEvent('onmouseup', toolbarmenuOnMouseUp);
+ }
+ $(toolbarmenu).find('li a').on('dragstart', function() { return(false); });
+ }
};
+ var tbMouseX, tbMouseClicked = false, tbMouseMoved = false, tbScrollLeft;
+ function toolbarmenuOnMouseDown(e) {
+ e = e || window.event;
+ var toolbarmenu = document.getElementById('toolbar-menu');
+ if (toolbarmenu) {
+ tbMouseMoved = false;
+ tbMouseClicked = true;
+ tbMouseX = e.pageX;
+ tbScrollLeft = toolbarmenu.scrollLeft;
+ }
+ }
+ function toolbarmenuOnMouseMove(e) {
+ e = e || window.event;
+ if (tbMouseClicked) {
+ var toolbarmenu = document.getElementById('toolbar-menu');
+ if (toolbarmenu) {
+ if (!tbMouseMoved && (Math.abs(tbMouseX - e.pageX) > 2)) {
+ tbMouseMoved = true;
+ $(toolbarmenu).find('li a').each(function() {
+ if (!$(this).hasClass('disabled')) {
+ $(this).data('wasDisabled', 'false').addClass('disabled');
+ }
+ });
+ }
+ if (toolbarmenu.scrollLeft != tbScrollLeft + tbMouseX - e.pageX) {
+ toolbarmenu.scrollLeft = tbScrollLeft + tbMouseX - e.pageX;
+ }
+ e.preventDefault ? e.preventDefault() : (e.returnValue = false);
+ }
+ }
+ }
+ function toolbarEnableButtons() {
+ var toolbarmenu = document.getElementById('toolbar-menu');
+ if (toolbarmenu) {
+ $(toolbarmenu).find('li a').each(function() {
+ if (($(this).hasClass('disabled')) && ($(this).data('wasDisabled') == 'false')) {
+ $(this).data('wasDisabled', 'true').removeClass('disabled').data('wasDisabled', '');
+ }
+ });
+ }
+ }
+ function toolbarmenuOnMouseUp(e) {
+ e = e || window.event;
+ if (tbMouseClicked) {
+ tbMouseClicked = false;
+ if (tbMouseMoved) {
+ tbMouseMoved = false;
+ toolbarEnableButtons();
+ e.preventDefault ? e.preventDefault() : (e.returnValue = false);
+ }
+ }
+ }
+ function toolbarmenuOnMouseEnter(e) {
+ e = e || window.event;
+ if (tbMouseClicked && e.buttons == 0) {
+ tbMouseClicked = false;
+ if (tbMouseMoved) {
+ tbMouseMoved = false;
+ toolbarEnableButtons();
+ }
+ }
+ }
+ function toolbarmenuOnWheel(e) {
+ e = e || window.event;
+ var delta = e.deltaY || e.detail || e.wheelDelta;
+ if ((navigator.appVersion.toUpperCase().indexOf("TRIDENT") != -1) || (navigator.appVersion.toUpperCase().indexOf("MSIE") != -1)) delta=-delta;
+ if (delta >= 200 || delta <= -200) delta /= 25
+ else if (delta >= 100 || delta <= -100) delta /= 15;
+ else if (delta < 10 || delta > -10) delta *= 3;
+ var toolbarmenu = document.getElementById('toolbar-menu');
+ if (toolbarmenu) {
+ toolbarmenu.scrollLeft += delta;
+ e.preventDefault ? e.preventDefault() : (e.returnValue = false);
+ }
+ }
+ function toolbarmenuOnScroll(e) {
+ var toolbarmenu = document.getElementById('toolbar-menu');
+ if (toolbarmenu) {
+ if (toolbarmenu.scrollTop > 0) {
+ toolbarmenu.scrollTop = 0;
+ e.preventDefault ? e.preventDefault() : (e.returnValue = false);
+ }
+ }
+ }
+
/**
* Initializes light/dark mode
*/
@@ -4140,6 +4259,46 @@
$('
')
.addClass(inverted ? 'inverted' : null)
.appendTo(node)
+ .on('touchstart', function(e) {
+ var ts, splitter = $(this), offset = node.position().left;
+
+ // Makes col-resize cursor follow the touch position on dragging
+ // and fixes issues related to iframes
+ splitter.width(10000).css(reverted ? 'left' : 'right', -5000);
+
+ // Disable selection on document while dragging
+ // It can happen when you move touch out of window, on top
+ document.body.style.userSelect = 'none';
+
+ // Start listening to touchmove events
+ $(document)
+ .on('touchmove.resizer', function(e) {
+ // Use of timeouts makes the move more smooth in Chrome
+ clearTimeout(ts);
+ ts = setTimeout(function() {
+ // For left-side-splitter we need the current offset
+ if (reverted) {
+ offset = node.position().left;
+ }
+ var cursor_position = rcube_event.get_touch_pos(e).x,
+ width = reverted ? node.width() + (offset - cursor_position) : cursor_position - offset;
+
+ set_width(width);
+ }, 5);
+ })
+ .on('touchend.resizer', function() {
+ // Remove registered events
+ $(document).off('.resizer');
+ $('iframe').off('.resizer');
+ document.body.style.userSelect = 'auto';
+
+ // Set back the splitter width to normal
+ splitter.width(6).css(reverted ? 'left' : 'right', -3);
+
+ // Save the current position (width)
+ save_pref(key, node.width());
+ });
+ })
.on('mousedown', function(e) {
var ts, splitter = $(this), offset = node.position().left;
diff -urN ../roundcubemail-1.6.2.orig/skins/elastic/ui.min.js ./skins/elastic/ui.min.js
--- ../roundcubemail-1.6.2.orig/skins/elastic/ui.min.js 2023-07-01 14:29:36.000000000 +0300
+++ ./skins/elastic/ui.min.js 2023-07-03 22:34:20.312919000 +0300
@@ -1,13 +1 @@
-/**
- * Roundcube webmail functions for the Elastic skin
- *
- * Copyright (c) The Roundcube Dev Team
- *
- * The contents are subject to the Creative Commons Attribution-ShareAlike
- * License. It is allowed to copy, distribute, transmit and to adapt the work
- * by keeping credits to the original autors in the README file.
- * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
- *
- * @license magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt CC0-1.0
- */
-"use strict";function rcube_elastic_ui(){var a,n,t,i,o,s,r,e,l,c,d,u,p,m,h,f,v=this,g="normal",b="light",_=!1,k=!1,w=rcmail.is_framed(),x={config:{standard_windows:rcmail.env.standard_windows,message_extwin:rcmail.env.message_extwin,compose_extwin:rcmail.env.compose_extwin,help_open_extwin:rcmail.env.help_open_extwin},checkboxes:0,small_screen_config:{standard_windows:!0,message_extwin:!1,compose_extwin:!1,help_open_extwin:!1}},C={},y=[],E=[],T={menu:$("#layout-menu"),sidebar:$("#layout-sidebar"),list:$("#layout-list"),content:$("#layout-content")},L={menu:$("a.task-menu-button"),back_sidebar:$("a.back-sidebar-button"),back_list:$("a.back-list-button"),back_content:$("a.back-content-button")};function j(t,e,a,n){var i=!0,o=$(""),s=t.attr("id")||(new Date).getTime(),r=s+"-clone",l=t[0].className+(a?" "+a:"");return e?(a=t.data("popup"))&&(o.data({popup:a,"toggle-button":t.data("toggle-button")}),G(o[0]),i=!1,rcmail.register_menu_button(o[0],a)):(l=l.replace("btn-primary","primary").replace(/(btn[a-z-]*|button|disabled)/g,"").trim(),l+=" button"+(n?"":" disabled")),o.attr({id:r,href:"#",class:l}).append($('').text(t.text())),i&&o.on("click",function(e){t.click()}),w&&!e?(o.data("target",t),E.push($.extend({button_id:r},z(t[0].id)))):(s=s,r=r,l=l.replace(" disabled",""),(s=z(s))&&rcmail.register_button(s.command,r,s.data.type,l,s.data.sel)),o}function z(e){var t,a,n;for(n in rcmail.buttons)for(t=0;t").attr({class:"button selection disabled",role:"button",title:rcmail.gettext("select")}).on("click",function(){UI.toggle_list_selection(this,o.attr("id"))}).append($('').text(rcmail.gettext("select"))),a.is(".menu")?(i.prependTo(a).wrap('