improving notifications management

revert-70aa11f8
Ace 7 years ago
parent b0e1608903
commit 855f294ed2

@ -209,4 +209,32 @@ public interface NotificationManagementService {
defaultValue = "1") defaultValue = "1")
@PathParam("id") @Max(45) @PathParam("id") @Max(45)
int id); int id);
@PUT
@Path("/clear-all")
@ApiOperation(
produces = MediaType.APPLICATION_JSON,
httpMethod = "PUT",
value = "Clear all notifications",
notes = "When a user needs to mark all the notifications as checked/read this " +
"function can be used to clear all notifications",
tags = "Device Notification Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = Constants.SCOPE, value = "perm:notifications:mark-checked")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK"),
@ApiResponse(
code = 500,
message = "Error occurred while clearing notifications.")
}
)
Response clearAllNotifications();
} }

@ -102,4 +102,16 @@ public class NotificationManagementServiceImpl implements NotificationManagement
} }
} }
@Override
public Response clearAllNotifications() {
Notification.Status status = Notification.Status.CHECKED;
try {
DeviceMgtAPIUtils.getNotificationManagementService().updateAllNotifications(status);
return Response.status(Response.Status.OK).build();
} catch (NotificationManagementException e) {
log.error("Error encountered while trying to clear all notifications.", e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
}
} }

@ -63,6 +63,16 @@ public interface NotificationManagementService {
boolean updateNotificationStatus(int notificationId, Notification.Status status) throws boolean updateNotificationStatus(int notificationId, Notification.Status status) throws
NotificationManagementException; NotificationManagementException;
/**
* Method for updating status all notifications.
*
* @return boolean status of the operation.
* @throws NotificationManagementException
* if something goes wrong while updating the Notification.
*/
boolean updateAllNotifications(Notification.Status status) throws
NotificationManagementException;
/** /**
* Method to fetch all the notifications in the database. * Method to fetch all the notifications in the database.
* *

@ -141,6 +141,27 @@ public class NotificationManagementServiceImpl implements NotificationManagement
return true; return true;
} }
@Override
public boolean updateAllNotifications(Notification.Status status) throws NotificationManagementException {
if (log.isDebugEnabled()) {
log.debug("Attempting to clear all notifications");
}
try {
NotificationManagementDAOFactory.beginTransaction();
notificationDAO.updateAllNotifications(status);
NotificationManagementDAOFactory.commitTransaction();
} catch (TransactionManagementException e) {
NotificationManagementDAOFactory.rollbackTransaction();
throw new NotificationManagementException("Error occurred while updating notification", e);
} finally {
NotificationManagementDAOFactory.closeConnection();
}
if (log.isDebugEnabled()) {
log.debug("All notifications updated successfully.");
}
return true;
}
@Override @Override
public List<Notification> getAllNotifications() throws NotificationManagementException { public List<Notification> getAllNotifications() throws NotificationManagementException {
try { try {

@ -61,6 +61,14 @@ public interface NotificationDAO {
int updateNotificationStatus(int notificationId, Notification.Status status) int updateNotificationStatus(int notificationId, Notification.Status status)
throws NotificationManagementException; throws NotificationManagementException;
/**
* Update status of all notifications.
*
* @return returns the no of updated records.
* @throws NotificationManagementException
*/
int updateAllNotifications(Notification.Status status) throws NotificationManagementException;
/** /**
* This method is used to get all notifications based on tenant-id. * This method is used to get all notifications based on tenant-id.
* *

@ -142,6 +142,27 @@ public abstract class AbstractNotificationDAOImpl implements NotificationDAO {
return rows; return rows;
} }
@Override
public int updateAllNotifications(Notification.Status status)
throws NotificationManagementException {
Connection conn;
PreparedStatement stmt = null;
int rows;
try {
conn = NotificationManagementDAOFactory.getConnection();
String sql = "UPDATE DM_NOTIFICATION SET STATUS = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, status.toString());
rows = stmt.executeUpdate();
} catch (Exception e) {
throw new NotificationManagementException("Error while trying to clear all " +
"notifications", e);
} finally {
NotificationDAOUtil.cleanupResources(stmt, null);
}
return rows;
}
@Override @Override
public List<Notification> getAllNotifications(int tenantId) throws NotificationManagementException { public List<Notification> getAllNotifications(int tenantId) throws NotificationManagementException {
Connection conn; Connection conn;

@ -158,7 +158,11 @@
data-side="right" data-width="320" data-sidebar-fixed="true" data-top="90" data-fixed-offset="90" data-offset-top="50" data-spy="affix"> data-side="right" data-width="320" data-sidebar-fixed="true" data-top="90" data-fixed-offset="90" data-offset-top="50" data-spy="affix">
<ul class="sidebar-messages"> <ul class="sidebar-messages">
</ul> </ul>
<div class="text-center"><a href="{{@app.context}}/notification-listing" class="btn btn-primary">Show All Notifications</a></div> <div class="text-center"><a href="{{@app.context}}/notification-listing" class="btn
btn-primary all-notifications">Show All Notifications</a></div>
<div class="text-center"><a class="btn btn-primary"
data-click-event="clear-notification">Clear All
Notifications</a></div>
</div> </div>
{{/zone}} {{/zone}}
{{#zone "bottomJs"}} {{#zone "bottomJs"}}

@ -425,18 +425,24 @@ $.fn.collapse_nav_sub = function () {
$(document).ready(function () { $(document).ready(function () {
loadNotificationsPanel(); loadNotificationsPanel();
$("#right-sidebar").on("click", ".new-notification", function () { $("#right-sidebar").on("click", ".new-notification", function (e) {
var notificationId = $(this).data("id"); e.preventDefault();
var notificationId = $(this).parents('li').find('h4 a').data('id');
var redirectUrl = $(this).data("url"); var redirectUrl = $(this).data("url");
var markAsReadNotificationsAPI = "/api/device-mgt/v1.0/notifications/" + notificationId + "/mark-checked"; var markAsReadNotificationsAPI = "/api/device-mgt/v1.0/notifications/" + notificationId + "/mark-checked";
var messageSideBar = ".sidebar-messages"; var messageSideBar = ".sidebar-messages";
var clickEvent = $(this).data('click-event');
var eventHandler = $(this);
invokerUtil.put( invokerUtil.put(
markAsReadNotificationsAPI, markAsReadNotificationsAPI,
null, null,
function (data) { function (data) {
data = JSON.parse(data); data = JSON.parse(data);
if (data.statusCode == responseCodes["ACCEPTED"]) { if(clickEvent && clickEvent === 'remove-notification'){
$(eventHandler).parents('li').slideUp();
$("#notification-bubble").html(parseInt($("#notification-bubble").text()) - 1);
}else {
location.href = redirectUrl; location.href = redirectUrl;
} }
}, function () { }, function () {
@ -448,6 +454,36 @@ $(document).ready(function () {
); );
}); });
$("#right-sidebar").on("click", ".btn", function (e) {
var clickEvent = $(this).data('click-event');
if(clickEvent == "clear-notification"){
e.preventDefault();
var markAsReadNotificationsAPI = "/api/device-mgt/v1.0/notifications/clear-all";
var messageSideBar = ".sidebar-messages";
var clickEvent = $(this).data('click-event');
var eventHandler = $(this);
console.log(clickEvent);
invokerUtil.put(
markAsReadNotificationsAPI,
null,
function (data) {
console.log(data);
$('.message').remove();
$("#notification-bubble").html(0);
}, function () {
var content = "<li class='message message-danger'><h4><i class='icon fw fw-error'></i>Warning</h4>" +
"<p>Unexpected error occurred while loading notification. Please refresh the page and" +
" try again</p></li>";
$(messageSideBar).html(content);
}
);
}
});
if (typeof $.fn.collapse == 'function') { if (typeof $.fn.collapse == 'function') {
$('.navbar-collapse.tiles').on('shown.bs.collapse', function () { $('.navbar-collapse.tiles').on('shown.bs.collapse', function () {
$(this).collapse_nav_sub(); $(this).collapse_nav_sub();

@ -1,14 +1,27 @@
{{#each notifications}} {{#each notifications}}
<li class="message message-info" data-type="selectable" > <li class="message message-info" data-type="selectable" >
<h4> <table>
<i class="icon fw fw-info"></i> <td>
<a href="{{../context}}/device/{{deviceType}}?id={{deviceIdentifier}}" <h4>
data-id="{{id}}" <i class="icon fw fw-info"></i>
data-url="device?type={{deviceType}}&id={{deviceIdentifier}}" <a href="{{../context}}/device/{{deviceType}}?id={{deviceIdentifier}}"
class="new-notification" data-click-event="remove-form"> data-id="{{id}}"
{{deviceType}} : {{deviceName}} data-url="device?type={{deviceType}}&id={{deviceIdentifier}}"
</a> class="new-notification" data-click-event="remove-form">
</h4> {{deviceType}} : {{deviceName}}
<p>{{description}}</p> </a>
</h4>
<p>{{description}}</p>
</td>
<td>
<a class="new-notification" data-click-event="remove-notification">
<span class="fw-stack">
<i class="fw fw-circle-outline fw-stack-2x"></i>
<i class="fw fw-delete fw-stack-1x"></i>
</span>
</a>
</a>
</td>
</table>
</li> </li>
{{/each}} {{/each}}

@ -1178,8 +1178,12 @@ header .fw-user:before{
right: 0; right: 0;
} }
.all-notifications{
margin-bottom: 10px !important;
}
.sidebar-wrapper.toggled a.btn{ .sidebar-wrapper.toggled a.btn{
margin-bottom: 70px; margin-bottom: 70px;
} }
.sidebar-wrapper-animation-fix { .sidebar-wrapper-animation-fix {

Loading…
Cancel
Save