Calendar: Drag & drop working for normal view

This commit is contained in:
nathan 2024-07-22 14:40:45 -06:00
parent ad972f73c3
commit b2132c089d
5 changed files with 79 additions and 42 deletions

View File

@ -38,11 +38,14 @@ export class EgwDropActionImplementation implements EgwActionImplementation {
}; };
const dragenter = function (event) { const dragenter = function (event) {
event.stopImmediatePropagation(); // don't trigger dragenter if we are entering the drag element
// don't trigger dragenter if we are entering the drag element
// don't go further if the dragged element is no there (happens when a none et2 dragged element is being dragged) // don't go further if the dragged element is no there (happens when a none et2 dragged element is being dragged)
if (!self.getTheDraggedDOM() || self.isTheDraggedDOM(this) || this == self.currentDropEl) return; if (!self.getTheDraggedDOM() || self.isTheDraggedDOM(this) || this == self.currentDropEl) return;
// stop the event from being fired for its children
event.stopPropagation();
event.preventDefault();
self.currentDropEl = event.currentTarget; self.currentDropEl = event.currentTarget;
event.dataTransfer.dropEffect = 'link'; event.dataTransfer.dropEffect = 'link';
@ -60,8 +63,6 @@ export class EgwDropActionImplementation implements EgwActionImplementation {
this.classList.add('drop-hover'); this.classList.add('drop-hover');
// stop the event from being fired for its children
event.preventDefault();
return false; return false;
}; };

View File

@ -287,6 +287,10 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
*/ */
onstart: function(event) onstart: function(event)
{ {
if(event.type == "resizestart")
{
event.target.removeAttribute("draggable");
}
if(timegrid.drag_create.start) if(timegrid.drag_create.start)
{ {
// Abort drag to create, we're dragging to resize // Abort drag to create, we're dragging to resize
@ -341,13 +345,14 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
*/ */
onmove: function(event) onmove: function(event)
{ {
event.preventDefault();
event.stopPropagation();
event.target.style.height = event.rect.height + "px"; event.target.style.height = event.rect.height + "px";
// Add a bit for better understanding - it will show _to_ the start, // Add a bit for better understanding - it will show _to_ the start,
// covering the 'actual' target // covering the 'actual' target
timegrid._get_time_from_position(event.target.getBoundingClientRect().left, event.target.getBoundingClientRect().bottom + 5); timegrid._get_time_from_position(event.target.getBoundingClientRect().left, event.target.getBoundingClientRect().bottom + 5);
timegrid.gridHover.hide();
var drop = timegrid._drag_helper(this, event.target); var drop = timegrid._drag_helper(this, event.target);
if(drop && !drop.is(':visible')) if(drop && !jQuery(drop).is(':visible'))
{ {
drop.get(0).scrollIntoView(false); drop.get(0).scrollIntoView(false);
} }
@ -357,20 +362,33 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
// Customize and override some draggable settings // Customize and override some draggable settings
this.div this.div
.on('dragstart', '.calendar_calEvent', function(event)
{
// Cancel drag to create, we're dragging an existing event
timegrid.drag_create.start = null;
timegrid._drag_create_end();
timegrid._get_time_from_position(event.clientX, event.clientY);
})
.on("dragend", () => .on("dragend", () =>
{ {
timegrid.div.off("drag.timegrid"); timegrid.div.off("drag.timegrid");
// Remove helper
document.body.querySelectorAll(".calendar_d-n-d_helper").forEach(n => n.remove());
}) })
.on('dragover', function(event) .on('dragover', function(event)
{ {
egw.tooltipDestroy();
// Allow drop to work
event.preventDefault();
timegrid._get_time_from_position(event.clientX, event.clientY); timegrid._get_time_from_position(event.clientX, event.clientY);
// Need to hide the hover marker or it will interfere with drop
timegrid.gridHover.addClass("hideme");
const helper = document.body.querySelector(".calendar_d-n-d_helper");
if(helper)
{
timegrid._drag_helper(helper, helper, null);
helper.style.top = event.clientY + "px";
helper.style.left = (event.clientX + 20) + "px";
}
}) })
.on('mousemove', function(event) .on('mousemove', function(event)
{ {
@ -380,7 +398,7 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
{ {
if(timegrid.div.has(event.relatedTarget).length === 0) if(timegrid.div.has(event.relatedTarget).length === 0)
{ {
timegrid.gridHover.hide(); timegrid.gridHover.addClass("hideme");
} }
}); });
@ -408,10 +426,11 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
if(!element) return; if(!element) return;
element.dropEnd = this.gridHover; element.dropEnd = this.gridHover;
element.style.zIndex = '';
if(element.dropEnd.length) if(element.dropEnd.length)
{ {
this._drop_data = jQuery.extend({},element.dropEnd[0].dataset || {}); this._drop_data = {...element.dropEnd[0].dataset};
} }
if (typeof element.dropEnd != 'undefined' && element.dropEnd.length) if (typeof element.dropEnd != 'undefined' && element.dropEnd.length)
@ -444,7 +463,7 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
// @ts-ignore // @ts-ignore
time = formatTime(parseTime(element.dropEnd.attr('data-hour') + ":" + element.dropEnd.attr('data-minute'))); time = formatTime(parseTime(element.dropEnd.attr('data-hour') + ":" + element.dropEnd.attr('data-minute')));
} }
element.innerHTML = '<div style="font-size: 1.1em; text-align:center; font-weight: bold; height:100%;"><span class="calendar_timeDemo" >'+time+'</span></div>'; element.innerHTML = '<div class="calendar_d-n-d_timeCounter"><span class="calendar_timeDemo" >' + time + '</span></div>';
} }
else else
{ {
@ -1312,25 +1331,31 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
} }
else else
{ {
jQuery(_data.ui.helper).prepend('<div class="calendar_d-n-d_timeCounter" data-count="1"><span></span></div>'); drag_listener(event);
} }
break; break;
// Triggered once, when something is dragged out of the timegrid // Triggered once, when something is dragged out of the timegrid
case EGW_AI_DRAG_OUT: case EGW_AI_DRAG_OUT:
// Stop listening const timegrid = aoi.getWidget();
jQuery(_data.ui.draggable).off('drag.et2_timegrid' + widget_object.id); if(!event.composedPath().includes(timegrid.getDOMNode()))
// Remove highlighted time square
var timegrid = aoi.getWidget();
timegrid.gridHover.hide();
timegrid.scrolling.scrollTop(timegrid._top_time);
// Out triggers after the over, count to not accidentally remove
time.data('count', time.data('count') - 1);
if(time.length && time.data('count') <= 0)
{ {
time.remove(); // Remove our custom helper
document.body.querySelectorAll(".calendar_d-n-d_helper").forEach(n => n.remove());
// Stop listening
//jQuery(_data.ui.draggable).off('drag.et2_timegrid' + widget_object.id);
// Remove highlighted time square
timegrid.gridHover.addClass("hideme");
timegrid.scrolling.scrollTop(timegrid._top_time);
// Out triggers after the over, count to not accidentally remove
time.data('count', time.data('count') - 1);
if(time.length && time.data('count') <= 0)
{
time.remove();
}
} }
break; break;
default: default:
@ -1584,11 +1609,14 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
{ {
// Create drag action that allows linking // Create drag action that allows linking
drag_action = mgr.addAction('drag', 'egw_link_drag', egw.lang('link'), 'link', function(action, selected) { drag_action = mgr.addAction('drag', 'egw_link_drag', egw.lang('link'), 'link', function(action, selected) {
// Drag helper - list titles. // Calendar drag helper - we update with time
// As we wanted to have a general defaul helper interface, we return null here and not using customize helper for links const helper = selected[0].iface.getWidget().getDOMNode().cloneNode();
// TODO: Need to decide if we need to create a customized helper interface for links anyway helper.classList.add("calendar_d-n-d_helper");
//return helper; self._drag_helper(helper, selected[0].iface.getDOMNode(), null);
return null; document.body.append(helper);
// System drag helper - empty span so we can update with the target time
return document.createElement("span");
},true); },true);
} }
// The timegrid itself is not draggable, so don't add a link. // The timegrid itself is not draggable, so don't add a link.
@ -2278,20 +2306,20 @@ export class et2_calendar_timegrid extends et2_calendar_view implements et2_IDet
} }
} }
if(!day)
{
return [];
}
this.gridHover
.show()
.css("position", "absolute")
.appendTo(day);
if(time) if(time)
{ {
this.gridHover this.gridHover
.height(this.rowHeight) .height(this.rowHeight)
.css("top", time.offsetTop + "px"); .css("top", time.offsetTop + "px");
} }
if(day)
{
this.gridHover
.css("position", "absolute")
.appendTo(day);
this.gridHover.removeClass("hideme");
}
this.gridHover.css('left',''); this.gridHover.css('left','');
return this.gridHover; return this.gridHover;
} }

View File

@ -1353,8 +1353,13 @@ Hide subsequent headers in week view with non-consolidated owners
} }
/** /**
* Calendar Drag and Drop * Calendar Drag and Drop
* Class for div to show forbiden drop
*/ */
.calendar_d-n-d_helper
{
position: absolute;
z-index:initial;
}
/* Class for div to show forbiden drop */
.calendar_d-n-d_timeCounter > span { .calendar_d-n-d_timeCounter > span {
position: absolute; position: absolute;
background-color: #808080; background-color: #808080;
@ -1391,6 +1396,7 @@ Hide subsequent headers in week view with non-consolidated owners
font-size: 1.1em; font-size: 1.1em;
font-weight: bold; font-weight: bold;
text-align: center; text-align: center;
min-width: 10em;
} }
.calendar_d-n-d_timeCounter .loading .calendar_d-n-d_timeCounter .loading
{ {

View File

@ -1364,6 +1364,7 @@ Hide subsequent headers in week view with non-consolidated owners
font-size: 1.1em; font-size: 1.1em;
font-weight: bold; font-weight: bold;
text-align: center; text-align: center;
min-width: 10em;
} }
.calendar_d-n-d_timeCounter .loading { .calendar_d-n-d_timeCounter .loading {
width: 16px; width: 16px;

View File

@ -1352,6 +1352,7 @@ Hide subsequent headers in week view with non-consolidated owners
font-size: 1.1em; font-size: 1.1em;
font-weight: bold; font-weight: bold;
text-align: center; text-align: center;
min-width: 10em;
} }
.calendar_d-n-d_timeCounter .loading { .calendar_d-n-d_timeCounter .loading {
width: 16px; width: 16px;