Get Calendar d-n-d working again

This commit is contained in:
Hadi Nategh 2013-12-13 18:18:56 +00:00
parent 374312be3c
commit f1da90887a
2 changed files with 151 additions and 49 deletions

View File

@ -102,12 +102,6 @@ class calendar_uiviews extends calendar_ui
*/ */
var $use_time_grid=true; var $use_time_grid=true;
/**
* Dragdrop Object
*
* @var dragdrop;
*/
var $dragdrop;
/** /**
* Can we display the whole day in a timeGrid of the size of the workday and just scroll to workday start * Can we display the whole day in a timeGrid of the size of the workday and just scroll to workday start
@ -179,13 +173,7 @@ class calendar_uiviews extends calendar_ui
$this->check_owners_access(); $this->check_owners_access();
if($GLOBALS['egw_info']['user']['preferences']['common']['enable_dragdrop'])
{
$this->dragdrop = new dragdrop();
// if the object would auto-disable itself unset object
// to avoid unneccesary dragdrop calls later
if(!$this->dragdrop->validateBrowser()) $this->dragdrop = false;
}
} }
@ -701,8 +689,6 @@ class calendar_uiviews extends calendar_ui
echo $content; echo $content;
} }
// make wz_dragdrop elements work
if(is_object($this->dragdrop)) { $this->dragdrop->setJSCode(); }
return $content; return $content;
} }
@ -890,8 +876,6 @@ class calendar_uiviews extends calendar_ui
echo $content; echo $content;
} }
// make wz_dragdrop elements work
if(is_object($this->dragdrop)) { $this->dragdrop->setJSCode(); }
return $content; return $content;
} }
@ -993,15 +977,12 @@ class calendar_uiviews extends calendar_ui
{ {
echo $cols[0]; echo $cols[0];
} }
// make wz_dragdrop elements work
if(is_object($this->dragdrop)) { $this->dragdrop->setJSCode(); }
} }
else else
{ {
$content = $this->timeGridWidget($this->bo->search($this->search_params),$this->cal_prefs['interval'],300); $content = $this->timeGridWidget($this->bo->search($this->search_params),$this->cal_prefs['interval'],300);
// make wz_dragdrop elements work
if(is_object($this->dragdrop)) { $this->dragdrop->setJSCode(); }
return $content; return $content;
} }
@ -1412,7 +1393,7 @@ class calendar_uiviews extends calendar_ui
if ($this->use_time_grid) if ($this->use_time_grid)
{ {
// drag and drop: check if the current user has EDIT permissions on the grid // drag and drop: check if the current user has EDIT permissions on the grid
if(is_object($this->dragdrop)) if($GLOBALS['egw_info']['user']['preferences']['common']['enable_dragdrop'])
{ {
if($owner) if($owner)
{ {
@ -1443,19 +1424,15 @@ class calendar_uiviews extends calendar_ui
'%;" class="calendar_calAddEvent"'; '%;" class="calendar_calAddEvent"';
if ($this->allowEdit) if ($this->allowEdit)
{ {
$html .= ' onclick="'.$this->popup($GLOBALS['egw']->link('/index.php',$linkData)).';return false;"'; $html .= ' data-date=' .$linkData['date'].'|'.$linkData['hour'].'|'.$linkData['minute'];
}
if($dropPermission && $owner)
{
$html .= ' data-owner ='.$owner;
} }
$html .= '></div>'."\n"; $html .= '></div>'."\n";
if(is_object($this->dragdrop) && $dropPermission)
{
$this->dragdrop->addDroppable(
$droppableID,
array(
'datetime'=>$droppableDateTime,
'owner'=>$owner ? $owner : $this->user,
)
);
}
} }
} }
@ -1822,7 +1799,7 @@ class calendar_uiviews extends calendar_ui
); );
} }
$draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner); $draggableID = $event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner);
$ttip_options = array( $ttip_options = array(
'BorderWidth' => 0, // as we use our round borders 'BorderWidth' => 0, // as we use our round borders
@ -1866,7 +1843,7 @@ class calendar_uiviews extends calendar_ui
// ATM we do not support whole day events or recurring events for dragdrop // ATM we do not support whole day events or recurring events for dragdrop
$dd_emulation = ""; $dd_emulation = "";
if (is_object($this->dragdrop) && if ($GLOBALS['egw_info']['user']['preferences']['common']['enable_dragdrop'] &&
$this->use_time_grid && $this->use_time_grid &&
(int)$event['id'] && $this->bo->check_perms(EGW_ACL_EDIT,$event)) (int)$event['id'] && $this->bo->check_perms(EGW_ACL_EDIT,$event))
{ {
@ -1874,23 +1851,12 @@ class calendar_uiviews extends calendar_ui
!$event['whole_day'] && !$event['whole_day'] &&
!$event['recur_type']) !$event['recur_type'])
{ {
// register event as draggable $draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner);
$this->dragdrop->addDraggable(
$draggableID,
array(
'eventId'=>$event['id'],
'eventOwner'=>$event['owner'],
'calendarOwner'=>$owner,
'errorImage'=>addslashes(html::image('phpgwapi','dialog_error',false,'style="width: 16px;"')),
'loaderImage'=>addslashes(html::image('phpgwapi','ajax-loader')),
),
'calendar.dragDropFunctions.dragEvent',
'calendar.dragDropFunctions.dropEvent',
'top center 2'
);
} }
else else
{ {
$draggableID = $event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner);
// If a event isn't drag-dropable, the drag drop event handling has to be fully disabled // If a event isn't drag-dropable, the drag drop event handling has to be fully disabled
// for that object. Clicking on it - however - should still bring it to the foreground. // for that object. Clicking on it - however - should still bring it to the foreground.
$dd_emulation = ' onmousedown="dd.z++; this.style.zIndex = dd.z; event.cancelBubble=true;"' $dd_emulation = ' onmousedown="dd.z++; this.style.zIndex = dd.z; event.cancelBubble=true;"'

View File

@ -40,6 +40,8 @@ app.classes.calendar = AppJS.extend(
{ {
window.top.app.calendar = this; window.top.app.calendar = this;
} }
//Drag_n_Drop
this.drag_n_drop();
}, },
/** /**
@ -101,7 +103,141 @@ app.classes.calendar = AppJS.extend(
this.set_enddate_visibility(); this.set_enddate_visibility();
} }
}, },
/**
* Drag and Drop
*
*
*/
drag_n_drop: function()
{
var that = this;
//Draggable
jQuery("div[id^='drag_']").draggable(
{
stack: jQuery("div[id^='drag_']"),
revert: "invalid",
delay: 50,
cursorAt:{top:0,left:0},
containment: ".egw_fw_content_browser_iframe",
scroll: true,
opacity: .6,
stop: function(ui,event){
event.helper.width(oldWidth);
event.helper[0].innerHTML = oldInnerHTML;
},
drag:function(ui, event){
//that.dragEvent();
},
start: function(ui, event){
oldInnerHTML = event.helper[0].innerHTML;
oldWidth = event.helper.width();
event.helper.width(jQuery("#calColumn").width());
},
});
//Droppable
jQuery("div[id^='drop_']").droppable(
{
accept:function(dg){
var id = dg[0].getAttribute('id');
var calOwner = id.substring(id.lastIndexOf("_O")+2,id.lastIndexOf("_C"));
var dpOwner = this.getAttribute('data-owner');
if (dpOwner == null) dpOwner = calOwner;
if (dg[0].getAttribute('id').match(/drag/g) && calOwner == dpOwner)
{
return true;
}
else
{
return false
}
},
tolerance:'pointer',
drop:function(id, event){
var dgId = event.draggable[0].getAttribute('id');
var dgOwner = dgId.substring(dgId.lastIndexOf("_C")+2,dgId.lastIndexOf(""));
var dpOwner = id.target.getAttribute('data-owner');
if (dpOwner == null) dpOwner = dgOwner;
if (dpOwner == dgOwner )
{
that.dropEvent(event.draggable[0].id, id.target.getAttribute('id').substring(id.target.getAttribute('id').lastIndexOf("drop_")+5, id.target.getAttribute('id').lastIndexOf("_O")));
}
else
{
}
},
over:function(ui, event){
var timeDemo = ui.target.id.substring(ui.target.id.lastIndexOf("T")+1,ui.target.id.lastIndexOf("_O"));
var dgId = event.draggable[0].getAttribute('id');
var dgOwner = dgId.substring(dgId.lastIndexOf("_C")+2,dgId.lastIndexOf(""));
var dpOwner = ui.target.getAttribute('data-owner');
if (dpOwner == null) dpOwner = dgOwner;
if (dpOwner == dgOwner )
{
event.helper[0].innerHTML = '<div style="font-size: 1.1em; font-weight: bold; text-align: center;">'+timeDemo+'</div>'
}
else
{
event.helper[0].innerHTML = '<div style="background-color: red; height: 100%; width: 100%; text-align: center;">' + 'Forbidden' + '</div>';
}
},
});
//onClick Handler for calendar cells
jQuery("div.calendar_calAddEvent").click(function(ev)
{
var timestamp = ev.target.getAttribute('data-date').split("|");
var owner = ev.target.getAttribute('id').split("_");
var ownerNum = owner[2].match( /Ogroup/g)?owner[2].replace( /Ogroup/g, '-'):owner[2].replace( /^\D+/g, '');
var date = timestamp[0];
var hour = timestamp[1];
var minute = timestamp[2];
if (ownerNum == 0)
{
egw.open_link('calendar.calendar_uiforms.edit&date='+date+'&hour='+hour+'&minute='+minute,'_blank','700x700');
}
else
{
egw.open_link('calendar.calendar_uiforms.edit&date='+date+'&hour='+hour+'&minute='+minute+'&owner='+ownerNum,'_blank','700x700');
}
});
},
/**
* DropEvent
*
* @param {string} _id dragged event id
* @param {array} _date array of date,hour, and minute of dropped cell
*
*/
dropEvent : function(_id, _date)
{
var eventId = _id.substring(_id.lastIndexOf("drag_")+5,_id.lastIndexOf("_O"));
var calOwner = _id.substring(_id.lastIndexOf("_O")+2,_id.lastIndexOf("_C"));
var eventOwner = _id.substring(_id.lastIndexOf("_C")+2,_id.lastIndexOf(""));
var date = _date;
xajax_doXMLHTTP(
'calendar.calendar_ajax.moveEvent',
eventId,
calOwner,
date,
eventOwner
);
},
/** /**
* open the freetime search popup * open the freetime search popup
* *