allow integration apps to delete their entries through calendar

This commit is contained in:
Ralf Becker 2021-03-12 21:34:07 +02:00
parent 46c4e0e118
commit c18e1107dd
4 changed files with 52 additions and 9 deletions

View File

@ -731,15 +731,16 @@ class calendar_bo
* *
* @param string $app * @param string $app
* @param string $part * @param string $part
* @param boole $try_load=false true: load if not yet loaded
* @return array * @return array
*/ */
static function integration_get_data($app,$part=null) static function integration_get_data($app, $part=null, $try_load=false)
{ {
static $integration_data=null; static $integration_data=null;
if (!isset($integration_data)) if (!isset($integration_data))
{ {
$integration_data = calendar_so::get_integration_data(); $integration_data = calendar_so::get_integration_data($try_load);
} }
if (!isset($integration_data[$app])) return null; if (!isset($integration_data[$app])) return null;
@ -747,6 +748,25 @@ class calendar_bo
return $part ? $integration_data[$app][$part] : $integration_data[$app]; return $part ? $integration_data[$app][$part] : $integration_data[$app];
} }
/**
* Check if an integration event is deletable
*
* @param string $app
* @param array $event
* @return bool
*/
static function integration_deletable($app, array $event)
{
$app_data = self::integration_get_data($app,'deletable');
if (empty($app_data) || is_bool($app_data))
{
return (bool)$app_data;
}
return (bool)(is_callable($app_data) ? $app_data($event) : ExecMethod2($app_data, $event));
}
/** /**
* Get private attribute for an integration event * Get private attribute for an integration event
* *

View File

@ -1244,10 +1244,16 @@ class calendar_so
/** /**
* Get data from last 'calendar_search_union' hook call * Get data from last 'calendar_search_union' hook call
* *
* @return array * @param boole $try_load=false true: load if not yet loaded
* @return ?array
*/ */
public static function get_integration_data() public static function get_integration_data($try_load=false)
{ {
if (!isset(self::$integration_data) && $try_load)
{
$selects = [];
self::get_union_selects($selects, 0, 0, [$GLOBALS['egw_info']['user']['account_id']], 0, [], '', [$GLOBALS['egw_info']['user']['account_id']]);
}
return self::$integration_data; return self::$integration_data;
} }

View File

@ -731,13 +731,12 @@ class calendar_ui
static $sent_groups = array(); static $sent_groups = array();
if (!$this->bo->check_perms(Acl::EDIT,$event)) if (!is_numeric($event['id']) || !$this->bo->check_perms(Acl::EDIT,$event))
{ {
$event['class'] .= 'rowNoEdit '; $event['class'] .= 'rowNoEdit ';
} }
// Delete disabled for other applications if (is_numeric($event['id']) && !$this->bo->check_perms(Acl::DELETE, $event))
if (!$this->bo->check_perms(Acl::DELETE,$event) || !is_numeric($event['id']))
{ {
$event['class'] .= 'rowNoDelete '; $event['class'] .= 'rowNoDelete ';
} }
@ -772,6 +771,11 @@ class calendar_ui
} }
$event['app'] = $app; $event['app'] = $app;
$event['app_id'] = $app_id; $event['app_id'] = $app_id;
// check if integration-app allows/supports delete
if (!calendar_bo::integration_deletable($app, $event))
{
$event['class'] .= 'rowNoDelete';
}
} }
else else
{ {

View File

@ -3261,9 +3261,22 @@ class calendar_uiforms extends calendar_ui
*/ */
public function ajax_delete($eventId) public function ajax_delete($eventId)
{ {
list($id, $date) = explode(':',$eventId);
$event=$this->bo->read($id);
$response = Api\Json\Response::get(); $response = Api\Json\Response::get();
list($id, $date) = explode(':',$eventId);
// let integration take care of delete for integration-events
if (!is_numeric($id) && preg_match('/^([^\d]+)(\d+)$/', $id, $matches) &&
!empty($app_data = calendar_bo::integration_get_data($matches[1], 'delete', true)))
{
try {
$msg = is_callable($app_data) ? $app_data($matches[2]) : ExecMethod2($app_data, $matches[2]);
$response->call('egw.refresh', $msg, 'calendar', $eventId, 'delete');
}
catch (\Exception $e) {
$response->apply('egw.message', $e->getMessage(), 'error');
}
return;
}
$event=$this->bo->read($id);
if ($this->bo->delete($event['id'], (int)$date)) if ($this->bo->delete($event['id'], (int)$date))
{ {