W.I.P restructuring of Notifications actions

This commit is contained in:
Hadi Nategh 2018-01-24 19:02:35 +01:00
parent 670b74cf23
commit c2a3c19124
14 changed files with 96 additions and 61 deletions

View File

@ -1050,25 +1050,9 @@ class calendar_boupdate extends calendar_bo
if ($method =='REQUEST') if ($method =='REQUEST')
{ {
// Add ACCEPT|REHECT|TENTATIVE actions // Add ACCEPT|REHECT|TENTATIVE actions
$notification->set_popupactions(array( $notification->set_popupdata('calendar', array(
array( 'event_id' => $event['id'],
'id' => 'A', 'user_id' => $userid
'caption' => lang('Accept'),
'icon' => 'accepted',
'onExecute' => 'egw().json("calendar.calendar_uiforms.ajax_status",['.$event['id'].','.$userid.','.'"A"'.']).sendRequest(true);'
),
array(
'id' => 'R',
'caption' => lang('Reject'),
'icon' => 'rejected',
'onExecute' => 'egw().json("calendar.calendar_uiforms.ajax_status",['.$event['id'].','.$userid.','.'"R"'.']).sendRequest(true);'
),
array(
'id' => 'T',
'caption' => lang('Tentative'),
'icon' => 'tentative',
'onExecute' => 'egw().json("calendar.calendar_uiforms.ajax_status",['.$event['id'].','.$userid.','.'"T"'.']).sendRequest(true);'
)
)); ));
} }
$notification->set_popupmessage($subject."\n\n".$notify_body."\n\n".$details['description']."\n\n".$details_body."\n\n"); $notification->set_popupmessage($subject."\n\n".$notify_body."\n\n".$details['description']."\n\n".$details_body."\n\n");

View File

@ -864,6 +864,37 @@ END:VALARM';
'popup' => Link::get_registry('calendar', 'edit_popup') 'popup' => Link::get_registry('calendar', 'edit_popup')
); );
} }
/**
* Method to construct notifications actions
*
* @param type $params
* @return type
*/
public static function notifications_actions ($params)
{
Api\Translation::add_app('calendar');
return array(
array(
'id' => 'A',
'caption' => lang('Accept'),
'icon' => 'accepted',
'onExecute' => 'egw().json("calendar.calendar_uiforms.ajax_status",['.$params['data']['event_id'].','.$params['data']['user_id'].','.'"A"'.']).sendRequest(true);'
),
array(
'id' => 'R',
'caption' => lang('Reject'),
'icon' => 'rejected',
'onExecute' => 'egw().json("calendar.calendar_uiforms.ajax_status",['.$params['data']['event_id'].','.$params['data']['user_id'].','.'"R"'.']).sendRequest(true);'
),
array(
'id' => 'T',
'caption' => lang('Tentative'),
'icon' => 'tentative',
'onExecute' => 'egw().json("calendar.calendar_uiforms.ajax_status",['.$params['data']['event_id'].','.$params['data']['user_id'].','.'"T"'.']).sendRequest(true);'
)
);
}
} }
// Not part of the class, since config hooks are still using the old style // Not part of the class, since config hooks are still using the old style

View File

@ -46,6 +46,7 @@ $setup_info['calendar']['hooks']['export_limit'] = 'calendar_hooks::getAppExport
$setup_info['calendar']['hooks']['acl_rights'] = 'calendar_hooks::acl_rights'; $setup_info['calendar']['hooks']['acl_rights'] = 'calendar_hooks::acl_rights';
$setup_info['calendar']['hooks']['categories'] = 'calendar_hooks::categories'; $setup_info['calendar']['hooks']['categories'] = 'calendar_hooks::categories';
$setup_info['calendar']['hooks']['mail_import'] = 'calendar_hooks::mail_import'; $setup_info['calendar']['hooks']['mail_import'] = 'calendar_hooks::mail_import';
$setup_info['calendar']['hooks']['notifications_actions'] = 'calendar_hooks::notifications_actions';
/* Dependencies for this app to work */ /* Dependencies for this app to work */
$setup_info['calendar']['depends'][] = array( $setup_info['calendar']['depends'][] = array(

View File

@ -155,10 +155,10 @@ class notifications {
protected $popup_links = array(); protected $popup_links = array();
/** /**
* array with objects of actions * array with objects of data
* @var array * @var array
*/ */
protected $popup_actions = array(); protected $popup_data = array();
/** /**
* array with objects of attachments * array with objects of attachments
@ -327,7 +327,6 @@ class notifications {
public function set_popupmessage($_message) { public function set_popupmessage($_message) {
//popup requires html //popup requires html
if(strlen($_message) == strlen(strip_tags($_message))) $_message = self::plain2html($_message); if(strlen($_message) == strlen(strip_tags($_message))) $_message = self::plain2html($_message);
if ($this->popup_actions) $_message .= '<div data-actions='. json_encode($this->popup_actions).'></div>';
$this->message_popup = $_message; $this->message_popup = $_message;
return true; return true;
} }
@ -550,8 +549,9 @@ class notifications {
{ {
if (!empty($this->popupsubject)) $lsubject = $this->popupsubject; if (!empty($this->popupsubject)) $lsubject = $this->popupsubject;
if ($this->popup_links) $llinks = $this->popup_links; if ($this->popup_links) $llinks = $this->popup_links;
if (is_array($this->popup_data)) $popup_data = $this->popup_data;
} }
$obj->send($this->prepend_message($messages, $prepend_message), $lsubject, $llinks, $this->attachments); $obj->send($this->prepend_message($messages, $prepend_message), $lsubject, $llinks, $this->attachments, $popup_data);
} }
catch (Exception $exception) { catch (Exception $exception) {
$backend_errors[] = $notification_backend.' failed: '.$exception->getMessage(); $backend_errors[] = $notification_backend.' failed: '.$exception->getMessage();
@ -786,31 +786,20 @@ class notifications {
} }
} }
/**
* Add action button to popup message
* @param array $_action
*
* @return boolean
*/
public function add_popupaction($_action) {
if(!is_array($_action)) { return false; }
$this->popup_actions[] = (object)$_action;
return true;
}
/** /**
* Set popup actions * Set popup data
* *
* @param array $_actions * @param string $_appname
* @param array $_data
* @return boolean * @return boolean
*/ */
public function set_popupactions($_actions) { public function set_popupdata($_appname, $_data) {
$this->popup_actions = array(); $this->popup_data = array(
foreach($_actions as $action) { 'appname' => $_appname,
if(is_array($action)) { 'data' => $_data
$this->add_popupaction($action); );
}
}
return true; return true;
} }
} }

View File

@ -185,6 +185,15 @@ class notifications_ajax {
if ($rs->NumRows() > 0) { if ($rs->NumRows() > 0) {
foreach ($rs as $notification) { foreach ($rs as $notification) {
$message = null; $message = null;
$data = json_decode($notification['notify_data'], true);
if ($data['appname'])
{
$_actions = Api\Hooks::process (array(
'location' => 'notifications_actions',
'data' => $data['data']
), $data['appname'], true);
$actions = $_actions[$data['appname']];
}
if($browserNotify) if($browserNotify)
{ {
$message = $notification['notify_message']; $message = $notification['notify_message'];
@ -204,7 +213,8 @@ class notifications_ajax {
$message3, $message3,
$notification['notify_status'], $notification['notify_status'],
$notification['notify_created'], $notification['notify_created'],
new DateTime()) new DateTime(),
is_array($actions)?$actions:NULL)
); );
} }

View File

@ -86,9 +86,12 @@ class notifications_email implements notifications_iface {
* @param string $_subject * @param string $_subject
* @param array $_links * @param array $_links
* @param array $_attachments * @param array $_attachments
* @param array $_data
*/ */
public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false) public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false, $_data = false)
{ {
unset ($_data);
$body_plain = $_messages['plain'].$this->render_links($_links, false, $this->preferences->external_mailclient); $body_plain = $_messages['plain'].$this->render_links($_links, false, $this->preferences->external_mailclient);
$body_html = "<html><body>\n".$_messages['html'].$this->render_links($_links, true, $this->preferences->external_mailclient)."</body>\n</html>\n"; $body_html = "<html><body>\n".$_messages['html'].$this->render_links($_links, true, $this->preferences->external_mailclient)."</body>\n</html>\n";

View File

@ -33,6 +33,7 @@ interface notifications_iface {
* @param string $_subject * @param string $_subject
* @param array $_links * @param array $_links
* @param array $_attachments * @param array $_attachments
* @param array $_data
*/ */
public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false); public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false, $_data = false);
} }

View File

@ -91,10 +91,11 @@ class notifications_jpopup implements notifications_iface
* @param string $_subject * @param string $_subject
* @param array $_links * @param array $_links
* @param array $_attachments * @param array $_attachments
* @param array $_data
*/ */
public function send(array $_messages, $_subject=false, $_links=false, $_attachments=false) public function send(array $_messages, $_subject=false, $_links=false, $_attachments=false, $_data = false)
{ {
unset($_attachments); // not used unset($_attachments, $_data); // not used
$jmessage = array(); $jmessage = array();

View File

@ -99,8 +99,9 @@ class notifications_popup implements notifications_iface {
* @param string $_subject * @param string $_subject
* @param array $_links * @param array $_links
* @param array $_attachments * @param array $_attachments
* @param array $_data
*/ */
public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false) public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false, $_data = false)
{ {
unset($_attachments); // not used unset($_attachments); // not used
@ -109,7 +110,7 @@ class notifications_popup implements notifications_iface {
.(isset($_messages['popup'])&&!empty($_messages['popup'])?$_messages['popup']:$_messages['html']) .(isset($_messages['popup'])&&!empty($_messages['popup'])?$_messages['popup']:$_messages['html'])
.$this->render_links($_links); .$this->render_links($_links);
$this->save( $message ); $this->save($message, $_data);
} }
/** /**
@ -117,12 +118,14 @@ class notifications_popup implements notifications_iface {
* *
* @param string $_message * @param string $_message
* @param array $_user_sessions * @param array $_user_sessions
* @param array $_data
*/ */
private function save( $_message ) { private function save($_message, $_data) {
$result = $this->db->insert( self::_notification_table, array( $result = $this->db->insert( self::_notification_table, array(
'account_id' => $this->recipient->account_id, 'account_id' => $this->recipient->account_id,
'notify_message' => $_message, 'notify_message' => $_message,
'notify_type' => self::_type 'notify_type' => self::_type,
'notify_data' => is_array($_data) ? json_encode($_data) : NULL
), false,__LINE__,__FILE__,self::_appname); ), false,__LINE__,__FILE__,self::_appname);
if ($result === false) throw new Exception("Can't save notification into SQL table"); if ($result === false) throw new Exception("Can't save notification into SQL table");
} }

View File

@ -101,10 +101,11 @@ class notifications_winpopup implements notifications_iface {
* @param string $_subject * @param string $_subject
* @param array $_links * @param array $_links
* @param array $_attachments * @param array $_attachments
* @param array $_data
*/ */
public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false) public function send(array $_messages, $_subject = false, $_links = false, $_attachments = false, $_data = false)
{ {
unset($_links, $_attachments); // not used unset($_links, $_attachments, $_data); // not used
$user_sessions = array(); $user_sessions = array();
foreach (Api\Session::session_list(0, 'asc', 'session_dla', true) as $session) { foreach (Api\Session::session_list(0, 'asc', 'session_dla', true) as $session) {

View File

@ -243,7 +243,7 @@
} }
} }
).addClass('et2_link'); ).addClass('et2_link');
if (notifymessages[id]['data'] && notifymessages[id]['data']['actions']) if (notifymessages[id]['data'] && notifymessages[id]['data']['actions'] && notifymessages[id]['data']['actions'].length > 0)
{ {
var $actions_container = jQuery(document.createElement('div')).addClass('egwpopup_actions_container'); var $actions_container = jQuery(document.createElement('div')).addClass('egwpopup_actions_container');
for(var action in notifymessages[id].data.actions) for(var action in notifymessages[id].data.actions)
@ -322,7 +322,7 @@
*/ */
notifications.prototype.clickOnMessage = function (_node, _event){ notifications.prototype.clickOnMessage = function (_node, _event){
// Do not run the click handler if it's been already expanded // Do not run the click handler if it's been already expanded
if (_node[0].hasClass('egwpopup_expanded')) return; if (_node[0].hasClass('egwpopup_expanded') || jQuery(_event.target).hasClass('et2_button')) return;
this.message_seen(_node, _event); this.message_seen(_node, _event);
var $node = jQuery(_node[0][0].cloneNode()); var $node = jQuery(_node[0][0].cloneNode());
if ($node) if ($node)
@ -432,7 +432,7 @@
* @return undefined * @return undefined
*/ */
notifications.prototype.append = function(_id, _message, _browser_notify, notifications.prototype.append = function(_id, _message, _browser_notify,
_status, _created, _current) { _status, _created, _current, _actions) {
var data = this.getData(_message); var data = this.getData(_message);
// Prevent the same thing popping up multiple times // Prevent the same thing popping up multiple times
notifymessages[_id] = { notifymessages[_id] = {
@ -442,6 +442,7 @@
created: _created, created: _created,
current: _current current: _current
}; };
if (_actions && _actions.length > 0) notifymessages[_id]['data']['actions'] = _actions;
// Notification API // Notification API
if(_browser_notify && !_status) if(_browser_notify && !_status)
{ {
@ -488,14 +489,12 @@
notifications.prototype.getData = function (_message) { notifications.prototype.getData = function (_message) {
var dom = jQuery(document.createElement('div')).html(_message);; var dom = jQuery(document.createElement('div')).html(_message);;
var link = dom.find('div[data-id],div[data-url]'); var link = dom.find('div[data-id],div[data-url]');
var actions = dom.find('div[data-actions]');
var data = { var data = {
message: dom.text(), message: dom.text(),
title: link.text(), title: link.text(),
icon: link.find('img').attr('src') icon: link.find('img').attr('src')
}; };
jQuery.extend(data,link.data()); jQuery.extend(data,link.data());
if (actions.data()) jQuery.extend(data,actions.data());
return typeof data == 'object'? data: {}; return typeof data == 'object'? data: {};
}; };

View File

@ -14,7 +14,7 @@ if (!defined('NOTIFICATION_APP'))
} }
$setup_info[NOTIFICATION_APP]['name'] = NOTIFICATION_APP; $setup_info[NOTIFICATION_APP]['name'] = NOTIFICATION_APP;
$setup_info[NOTIFICATION_APP]['version'] = '17.1'; $setup_info[NOTIFICATION_APP]['version'] = '17.1.001';
$setup_info[NOTIFICATION_APP]['app_order'] = 1; $setup_info[NOTIFICATION_APP]['app_order'] = 1;
$setup_info[NOTIFICATION_APP]['tables'] = array('egw_notificationpopup'); $setup_info[NOTIFICATION_APP]['tables'] = array('egw_notificationpopup');
$setup_info[NOTIFICATION_APP]['enable'] = 2; $setup_info[NOTIFICATION_APP]['enable'] = 2;

View File

@ -17,7 +17,8 @@ $phpgw_baseline = array(
'notify_message' => array('type' => 'varchar','precision' => '16384','comment' => 'notification message'), 'notify_message' => array('type' => 'varchar','precision' => '16384','comment' => 'notification message'),
'notify_created' => array('type' => 'timestamp','meta' => 'timestamp','default' => 'current_timestamp','comment' => 'creation time of notification'), 'notify_created' => array('type' => 'timestamp','meta' => 'timestamp','default' => 'current_timestamp','comment' => 'creation time of notification'),
'notify_type' => array('type' => 'ascii','precision' => '32','comment' => 'notification type'), 'notify_type' => array('type' => 'ascii','precision' => '32','comment' => 'notification type'),
'notify_status' => array('type' => 'varchar','precision' => '32','comment' => 'notification status') 'notify_status' => array('type' => 'varchar','precision' => '32','comment' => 'notification status'),
'notify_data' => array('type' => 'varchar','precision' => '4096','comment' => 'notification data')
), ),
'pk' => array('notify_id'), 'pk' => array('notify_id'),
'fk' => array(), 'fk' => array(),

View File

@ -137,3 +137,14 @@ function notifications_upgrade16_1()
return $GLOBALS['setup_info']['notifications']['currentver'] = '17.1'; return $GLOBALS['setup_info']['notifications']['currentver'] = '17.1';
} }
function notifications_upgrade17_1()
{
$GLOBALS['egw_setup']->oProc->AddColumn('egw_notificationpopup','notify_data',array(
'type' => 'varchar',
'precision' => '4096',
'comment' => 'notification actions'
));
return $GLOBALS['setup_info']['notifications']['currentver'] = '17.1.001';
}