Compare commits

...

3 Commits

Author SHA1 Message Date
Kenn Jacobsen 9865596dcc V7: Change the priority of the tree node annotations for contai… (#6083)
(cherry picked from commit 7393d9c372)
2019-08-09 16:47:14 +02:00
Kenn Jacobsen dc44a7a3a7 Fix the disabled upload button in media picker
(cherry picked from commit 79c4d7797c)
2019-08-09 16:41:13 +02:00
Peter Keating ff595df7ca Fix notifications not sending when user has multiple of same type
When a user has multiple notifications of the same type, the user may
not receive the notification depending on the order which the
notification was setup. To fix this the notification logic has changed
from looping over users to looping over notifications.

Fixes #4713.

(cherry picked from commit 01a895bbf7)
2019-08-08 19:49:59 +02:00
3 changed files with 69 additions and 55 deletions
@@ -124,40 +124,52 @@ namespace Umbraco.Core.Services
var notifications = GetUsersNotifications(users.Select(x => x.Id), action, Enumerable.Empty<int>(), Constants.ObjectTypes.DocumentGuid).ToList();
if (notifications.Count == 0) break;
var i = 0;
foreach (var user in users)
{
// continue if there's no notification for this user
if (notifications[i].UserId != user.Id) continue; // next user
for (var j = 0; j < entitiesL.Count; j++)
{
var content = entitiesL[j];
var path = paths[j];
// test if the notification applies to the path ie to this entity
if (path.Contains(notifications[i].EntityId) == false) continue; // next entity
if (prevVersionDictionary.ContainsKey(content.Id) == false)
{
prevVersionDictionary[content.Id] = GetPreviousVersion(content.Id);
}
// queue notification
var req = CreateNotificationRequest(operatingUser, user, content, prevVersionDictionary[content.Id], actionName, http, createSubject, createBody);
Enqueue(req);
}
// skip other notifications for this user, essentially this means moving i to the next index of notifications
// for the next user.
do
{
i++;
} while (i < notifications.Count && notifications[i].UserId == user.Id);
if (i >= notifications.Count) break; // break if no more notifications
}
while (notifications.Count > 0)
{
var notification = notifications[0];
var isMatched = false;
// grab user whose associated to the notification
var user = users.Where(x => x.Id == notification.UserId).FirstOrDefault();
if (user == null)
{
notifications.RemoveAll(x => x.UserId == notification.UserId);
}
for (var j = 0; j < entitiesL.Count; j++)
{
var content = entitiesL[j];
var path = paths[j];
// test if the notification applies to the path ie to this entity
if (path.Contains(notification.EntityId) == false) continue; // next entity
isMatched = true;
if (prevVersionDictionary.ContainsKey(content.Id) == false)
{
prevVersionDictionary[content.Id] = GetPreviousVersion(content.Id);
}
// queue notification
var req = CreateNotificationRequest(operatingUser, user, content, prevVersionDictionary[content.Id], actionName, http, createSubject, createBody);
Enqueue(req);
// don't process any further entities as a notification has been sent
break;
}
// when a match has been found, skip other notifications for user.
if (isMatched)
{
notifications.RemoveAll(x => x.UserId == notification.UserId);
continue;
}
notifications.Remove(notification);
}
// load more users if any
id = users.Count == pagesz ? users.Last().Id + 1 : -1;
+23 -21
View File
@@ -327,27 +327,6 @@ li.root > div > a.umb-options {
div.not-published > i.icon,div.not-published > a{
opacity: 0.6;
}
div.protected:before{
content:"\e256";
font-family: 'icomoon';
color: @red;
position: absolute;
font-size: 20px;
padding-left: 7px;
padding-top: 7px;
bottom: 0;
}
div.has-unpublished-version:before{
content:"\e25a";
font-family: 'icomoon';
color: @green;
position: absolute;
font-size: 20px;
padding-left: 7px;
padding-top: 7px;
bottom: 0;
}
div.not-allowed > i.icon,div.not-allowed > a{
cursor: not-allowed;
@@ -380,6 +359,29 @@ div.locked:before{
bottom: 0;
}
div.has-unpublished-version:before {
content: "\e25a";
font-family: 'icomoon';
color: @green;
position: absolute;
font-size: 20px;
padding-left: 7px;
padding-top: 7px;
bottom: 0;
}
div.protected:before {
content: "\e256";
font-family: 'icomoon';
color: @red;
position: absolute;
font-size: 20px;
padding-left: 7px;
padding-top: 7px;
bottom: 0;
}
.umb-tree li div.no-access .umb-tree-icon,
.umb-tree li div.no-access .root-link,
.umb-tree li div.no-access .umb-tree-item__label {
@@ -267,7 +267,7 @@ angular.module("umbraco")
// also make sure the node is not trashed
if (nodePath.indexOf($scope.startNodeId.toString()) !== -1 && node.trashed === false) {
$scope.gotoFolder({ id: $scope.lastOpenedNode, name: "Media", icon: "icon-folder" });
$scope.gotoFolder({ id: $scope.lastOpenedNode, name: "Media", icon: "icon-folder", path: node.path });
return true;
} else {
$scope.gotoFolder({ id: $scope.startNodeId, name: "Media", icon: "icon-folder" });