diff --git a/notifications/inc/class.notifications_ajax.inc.php b/notifications/inc/class.notifications_ajax.inc.php index 8b965329b3..577da8ea09 100644 --- a/notifications/inc/class.notifications_ajax.inc.php +++ b/notifications/inc/class.notifications_ajax.inc.php @@ -158,6 +158,7 @@ class notifications_ajax { 'notify_type' => self::_type ),__LINE__,__FILE__,self::_appname); } + $this->response->data(['deleted'=>$notify_ids]); } /** @@ -250,38 +251,10 @@ class notifications_ajax { * * @return boolean true or false */ - private function get_egwpopup($browserNotify = false) { - $rs = $this->db->select(self::_notification_table, '*', array( - 'account_id' => $this->recipient->account_id, - 'notify_type' => self::_type - ), - __LINE__,__FILE__,0 ,'ORDER BY notify_id DESC',self::_appname, 100); - $result = array(); - if ($rs->NumRows() > 0) { - foreach ($rs as $notification) { - $actions = null; - $data = json_decode($notification['notify_data'], true); - if ($data['appname'] && $data['data']) - { - $_actions = Api\Hooks::process (array( - 'location' => 'notifications_actions', - 'data' => $data['data'] - ), $data['appname'], true); - $actions = $_actions[$data['appname']]; - } - $result[] = array( - 'id' => $notification['notify_id'], - 'message' => $notification['notify_message'], - 'status' => $notification['notify_status'], - 'created' => Api\DateTime::server2user($notification['notify_created']), - 'current' => new Api\DateTime('now'), - 'actions' => is_array($actions)?$actions:NULL, - 'extra_data' => ($data['data'] ? $data['data'] : array()) - ); - - } - $this->response->apply('app.notifications.append', array($result, $browserNotify)); - } + private function get_egwpopup($browserNotify = false) + { + $entries = notifications_popup::read($this->recipient->account_id); + $this->response->apply('app.notifications.append', array($entries['rows'], $browserNotify, $entries['total'])); return true; } diff --git a/notifications/inc/class.notifications_popup.inc.php b/notifications/inc/class.notifications_popup.inc.php index 007f280cfb..61723f261d 100644 --- a/notifications/inc/class.notifications_popup.inc.php +++ b/notifications/inc/class.notifications_popup.inc.php @@ -130,21 +130,31 @@ class notifications_popup implements notifications_iface { ), false,__LINE__,__FILE__,self::_appname); if ($result === false) throw new Exception("Can't save notification into SQL table"); $push = new Api\Json\Push($this->recipient->account_id); - $push->call('app.notifications.append', $this->read()); + $entries = self::read($this->recipient->account_id); + $push->call('app.notifications.append', [$entries['rows'], null, $entries['total']]); } /** - * read all notification messages for current recipient - * @return type + * read all notification messages for given recipient + * @param $_account_id + * @return array */ - private function read() + public static function read($_account_id) { - $rs = $this->db->select(self::_notification_table, '*', array( - 'account_id' => $this->recipient->account_id, + if (!$_account_id) return []; + + $rs = $GLOBALS['egw']->db->select(self::_notification_table, '*', array( + 'account_id' => $_account_id, 'notify_type' => self::_type ), __LINE__,__FILE__,0 ,'ORDER BY notify_id DESC',self::_appname, 100); + // Fetch the total + $total = $GLOBALS['egw']->db->select(self::_notification_table, 'COUNT(*)', array( + 'account_id' => $_account_id, + 'notify_type' => self::_type + ), + __LINE__,__FILE__,0 ,'',self::_appname)->fetchColumn(); $result = array(); if ($rs->NumRows() > 0) { foreach ($rs as $notification) { @@ -169,7 +179,7 @@ class notifications_popup implements notifications_iface { ); } - return $result; + return ['rows' => $result, 'total'=> $total]; } } diff --git a/notifications/js/notificationajaxpopup.js b/notifications/js/notificationajaxpopup.js index 406397d97a..3114cf5cb3 100644 --- a/notifications/js/notificationajaxpopup.js +++ b/notifications/js/notificationajaxpopup.js @@ -92,7 +92,8 @@ this.run_notifications(); this.filter = ''; - + // total number of notifications + this.total = 0; }; notifications.prototype.run_notifications = function () @@ -561,10 +562,13 @@ notifications.prototype.delete_all = function () { if (!notifymessages || Object.entries(notifymessages).length == 0) return false; - egw.json("notifications.notifications_ajax.delete_message", [notifymessages]).sendRequest(true); + var self = this; + egw.json("notifications.notifications_ajax.delete_message", [notifymessages], function(_data){ + if (_data && _data['deleted']) self.total -= Object.keys(_data['deleted']).length; + self.counterUpdate(); + }).sendRequest(true); notifymessages = {}; jQuery("#egwpopup_list").empty(); - this.counterUpdate(); egw.loading_prompt('popup_notifications', false); }; @@ -575,7 +579,11 @@ _event.stopPropagation(); var egwpopup_message = _node[0]; var id = egwpopup_message[0].id.replace(/egwpopup_message_/ig,''); - var request = egw.json("notifications.notifications_ajax.delete_message", [[notifymessages[id]]]); + var self = this; + var request = egw.json("notifications.notifications_ajax.delete_message", [[notifymessages[id]]],function(_data){ + if (_data && _data['deleted']) self.total -= Object.keys(_data['deleted']).length; + self.counterUpdate(); + }); request.sendRequest(true); var nextNode = egwpopup_message.next(); var keepLoadingPrompt = false; @@ -590,8 +598,6 @@ if (keepLoadingPrompt && !egwIsMobile()) egw.loading_prompt('popup_notifications', true); egwpopup_message.remove(); this.bell("inactive"); - this.counterUpdate(); - }; /** @@ -647,7 +653,7 @@ * @param _rowData * @param _browser_notify */ - notifications.prototype.append = function(_rawData, _browser_notify) { + notifications.prototype.append = function(_rawData, _browser_notify, _total) { var hasUnseen = []; // Dont process the data if they're the same as it could get very expensive to @@ -657,6 +663,7 @@ var old_notifymessages = notifymessages; notifymessages = {}; var browser_notify = _browser_notify || this.check_browser_notify(); + this.total = _total || 0; for (var i=0; i < _rawData.length; i++) { var data = this.getData(_rawData[i]['message'], _rawData[i]['extra_data']); @@ -841,6 +848,10 @@ var counter = 0; var apps = {}; + // set total number + document.getElementById("egwpopup_header").childNodes[0].textContent = (egw.lang("Notifications")+" ("+this.total+")"); + document.getElementById('topmenu_info_notifications').title = egw.lang('total')+":"+this.total; + for (var id in notifymessages) { if (typeof apps[notifymessages[id]['extra_data']['app']] == 'undefined')