diff --git a/src/Umbraco.Core/Models/Entities/IMemberEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IMemberEntitySlim.cs
new file mode 100644
index 0000000000..050a999cc2
--- /dev/null
+++ b/src/Umbraco.Core/Models/Entities/IMemberEntitySlim.cs
@@ -0,0 +1,7 @@
+namespace Umbraco.Core.Models.Entities
+{
+ public interface IMemberEntitySlim : IContentEntitySlim
+ {
+
+ }
+}
diff --git a/src/Umbraco.Core/Models/Entities/MemberEntitySlim.cs b/src/Umbraco.Core/Models/Entities/MemberEntitySlim.cs
new file mode 100644
index 0000000000..335e269467
--- /dev/null
+++ b/src/Umbraco.Core/Models/Entities/MemberEntitySlim.cs
@@ -0,0 +1,13 @@
+namespace Umbraco.Core.Models.Entities
+{
+ public class MemberEntitySlim : EntitySlim, IMemberEntitySlim
+ {
+ public string ContentTypeAlias { get; set; }
+
+ ///
+ public string ContentTypeIcon { get; set; }
+
+ ///
+ public string ContentTypeThumbnail { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs
index b6d39fe54f..161db543ba 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs
@@ -42,8 +42,9 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
var isContent = objectType == Constants.ObjectTypes.Document || objectType == Constants.ObjectTypes.DocumentBlueprint;
var isMedia = objectType == Constants.ObjectTypes.Media;
+ var isMember = objectType == Constants.ObjectTypes.Member;
- var sql = GetBaseWhere(isContent, isMedia, false, x =>
+ var sql = GetBaseWhere(isContent, isMedia, isMember, false, x =>
{
if (filter == null) return;
foreach (var filterClause in filter.GetWhereClauses())
@@ -54,7 +55,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
var translator = new SqlTranslator(sql, query);
sql = translator.Translate();
- sql = AddGroupBy(isContent, isMedia, sql, ordering.IsEmpty);
+ sql = AddGroupBy(isContent, isMedia, isMember, sql, ordering.IsEmpty);
if (!ordering.IsEmpty)
{
@@ -81,6 +82,12 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
dtos = page.Items;
totalRecords = page.TotalItems;
}
+ else if (isMember)
+ {
+ var page = Database.Page(pageIndexToFetch, pageSize, sql);
+ dtos = page.Items;
+ totalRecords = page.TotalItems;
+ }
else
{
var page = Database.Page(pageIndexToFetch, pageSize, sql);
@@ -88,7 +95,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
totalRecords = page.TotalItems;
}
- var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray();
+ var entities = dtos.Select(x => BuildEntity(isContent, isMedia, isMember, x)).ToArray();
if (isContent)
BuildVariants(entities.Cast());
@@ -98,13 +105,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
public IEntitySlim Get(Guid key)
{
- var sql = GetBaseWhere(false, false, false, key);
+ var sql = GetBaseWhere(false, false, false, false, key);
var dto = Database.FirstOrDefault(sql);
- return dto == null ? null : BuildEntity(false, false, dto);
+ return dto == null ? null : BuildEntity(false, false, false, dto);
}
- private IEntitySlim GetEntity(Sql sql, bool isContent, bool isMedia)
+ private IEntitySlim GetEntity(Sql sql, bool isContent, bool isMedia, bool isMember)
{
//isContent is going to return a 1:M result now with the variants so we need to do different things
if (isContent)
@@ -120,7 +127,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (dto == null) return null;
- var entity = BuildEntity(false, isMedia, dto);
+ var entity = BuildEntity(false, isMedia, isMember, dto);
return entity;
}
@@ -129,25 +136,27 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
var isContent = objectTypeId == Constants.ObjectTypes.Document || objectTypeId == Constants.ObjectTypes.DocumentBlueprint;
var isMedia = objectTypeId == Constants.ObjectTypes.Media;
+ var isMember = objectTypeId == Constants.ObjectTypes.Member;
- var sql = GetFullSqlForEntityType(isContent, isMedia, objectTypeId, key);
- return GetEntity(sql, isContent, isMedia);
+ var sql = GetFullSqlForEntityType(isContent, isMedia, isMember, objectTypeId, key);
+ return GetEntity(sql, isContent, isMedia, isMember);
}
public IEntitySlim Get(int id)
{
- var sql = GetBaseWhere(false, false, false, id);
+ var sql = GetBaseWhere(false, false, false, false, id);
var dto = Database.FirstOrDefault(sql);
- return dto == null ? null : BuildEntity(false, false, dto);
+ return dto == null ? null : BuildEntity(false, false, false, dto);
}
public IEntitySlim Get(int id, Guid objectTypeId)
{
var isContent = objectTypeId == Constants.ObjectTypes.Document || objectTypeId == Constants.ObjectTypes.DocumentBlueprint;
var isMedia = objectTypeId == Constants.ObjectTypes.Media;
+ var isMember = objectTypeId == Constants.ObjectTypes.Member;
- var sql = GetFullSqlForEntityType(isContent, isMedia, objectTypeId, id);
- return GetEntity(sql, isContent, isMedia);
+ var sql = GetFullSqlForEntityType(isContent, isMedia, isMember, objectTypeId, id);
+ return GetEntity(sql, isContent, isMedia, isMember);
}
public IEnumerable GetAll(Guid objectType, params int[] ids)
@@ -164,7 +173,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
: PerformGetAll(objectType);
}
- private IEnumerable GetEntities(Sql sql, bool isContent, bool isMedia)
+ private IEnumerable GetEntities(Sql sql, bool isContent, bool isMedia, bool isMember)
{
//isContent is going to return a 1:M result now with the variants so we need to do different things
if (isContent)
@@ -180,7 +189,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
? (IEnumerable)Database.Fetch(sql)
: Database.Fetch(sql);
- var entities = dtos.Select(x => BuildEntity(false, isMedia, x)).ToArray();
+ var entities = dtos.Select(x => BuildEntity(false, isMedia, isMember, x)).ToArray();
return entities;
}
@@ -189,9 +198,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
var isContent = objectType == Constants.ObjectTypes.Document || objectType == Constants.ObjectTypes.DocumentBlueprint;
var isMedia = objectType == Constants.ObjectTypes.Media;
+ var isMember = objectType == Constants.ObjectTypes.Member;
- var sql = GetFullSqlForEntityType(isContent, isMedia, objectType, filter);
- return GetEntities(sql, isContent, isMedia);
+ var sql = GetFullSqlForEntityType(isContent, isMedia, isMember, objectType, filter);
+ return GetEntities(sql, isContent, isMedia, isMember);
}
public IEnumerable GetAllPaths(Guid objectType, params int[] ids)
@@ -218,26 +228,27 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
public IEnumerable GetByQuery(IQuery query)
{
- var sqlClause = GetBase(false, false, null);
+ var sqlClause = GetBase(false, false, false, null);
var translator = new SqlTranslator(sqlClause, query);
var sql = translator.Translate();
- sql = AddGroupBy(false, false, sql, true);
+ sql = AddGroupBy(false, false, false, sql, true);
var dtos = Database.Fetch(sql);
- return dtos.Select(x => BuildEntity(false, false, x)).ToList();
+ return dtos.Select(x => BuildEntity(false, false, false, x)).ToList();
}
public IEnumerable GetByQuery(IQuery query, Guid objectType)
{
var isContent = objectType == Constants.ObjectTypes.Document || objectType == Constants.ObjectTypes.DocumentBlueprint;
var isMedia = objectType == Constants.ObjectTypes.Media;
+ var isMember = objectType == Constants.ObjectTypes.Member;
- var sql = GetBaseWhere(isContent, isMedia, false, null, objectType);
+ var sql = GetBaseWhere(isContent, isMedia, isMember, false, null, objectType);
var translator = new SqlTranslator(sql, query);
sql = translator.Translate();
- sql = AddGroupBy(isContent, isMedia, sql, true);
+ sql = AddGroupBy(isContent, isMedia, isMember, sql, true);
- return GetEntities(sql, isContent, isMedia);
+ return GetEntities(sql, isContent, isMedia, isMember);
}
public UmbracoObjectTypes GetObjectType(int id)
@@ -329,29 +340,29 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
// gets the full sql for a given object type and a given unique id
- protected Sql GetFullSqlForEntityType(bool isContent, bool isMedia, Guid objectType, Guid uniqueId)
+ protected Sql GetFullSqlForEntityType(bool isContent, bool isMedia, bool isMember, Guid objectType, Guid uniqueId)
{
- var sql = GetBaseWhere(isContent, isMedia, false, objectType, uniqueId);
- return AddGroupBy(isContent, isMedia, sql, true);
+ var sql = GetBaseWhere(isContent, isMedia, isMember, false, objectType, uniqueId);
+ return AddGroupBy(isContent, isMedia, isMember, sql, true);
}
// gets the full sql for a given object type and a given node id
- protected Sql GetFullSqlForEntityType(bool isContent, bool isMedia, Guid objectType, int nodeId)
+ protected Sql GetFullSqlForEntityType(bool isContent, bool isMedia, bool isMember, Guid objectType, int nodeId)
{
- var sql = GetBaseWhere(isContent, isMedia, false, objectType, nodeId);
- return AddGroupBy(isContent, isMedia, sql, true);
+ var sql = GetBaseWhere(isContent, isMedia, isMember, false, objectType, nodeId);
+ return AddGroupBy(isContent, isMedia, isMember, sql, true);
}
// gets the full sql for a given object type, with a given filter
- protected Sql GetFullSqlForEntityType(bool isContent, bool isMedia, Guid objectType, Action> filter)
+ protected Sql GetFullSqlForEntityType(bool isContent, bool isMedia, bool isMember, Guid objectType, Action> filter)
{
- var sql = GetBaseWhere(isContent, isMedia, false, filter, objectType);
- return AddGroupBy(isContent, isMedia, sql, true);
+ var sql = GetBaseWhere(isContent, isMedia, isMember, false, filter, objectType);
+ return AddGroupBy(isContent, isMedia, isMember, sql, true);
}
// gets the base SELECT + FROM [+ filter] sql
// always from the 'current' content version
- protected Sql GetBase(bool isContent, bool isMedia, Action> filter, bool isCount = false)
+ protected Sql GetBase(bool isContent, bool isMedia, bool isMember, Action> filter, bool isCount = false)
{
var sql = Sql();
@@ -366,7 +377,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
.AndSelect(x => x.SortOrder, x => x.UniqueId, x => x.Text, x => x.NodeObjectType, x => x.CreateDate)
.Append(", COUNT(child.id) AS children");
- if (isContent || isMedia)
+ if (isContent || isMedia || isMember)
sql
.AndSelect(x => Alias(x.Id, "versionId"))
.AndSelect(x => x.Alias, x => x.Icon, x => x.Thumbnail, x => x.IsContainer, x => x.Variations);
@@ -387,7 +398,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
sql
.From();
- if (isContent || isMedia)
+ if (isContent || isMedia || isMember)
{
sql
.InnerJoin().On((left, right) => left.NodeId == right.NodeId && right.Current)
@@ -422,49 +433,49 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
// gets the base SELECT + FROM [+ filter] + WHERE sql
// for a given object type, with a given filter
- protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isCount, Action> filter, Guid objectType)
+ protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isMember, bool isCount, Action> filter, Guid objectType)
{
- return GetBase(isContent, isMedia, filter, isCount)
+ return GetBase(isContent, isMedia, isMember, filter, isCount)
.Where(x => x.NodeObjectType == objectType);
}
// gets the base SELECT + FROM + WHERE sql
// for a given node id
- protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isCount, int id)
+ protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isMember, bool isCount, int id)
{
- var sql = GetBase(isContent, isMedia, null, isCount)
+ var sql = GetBase(isContent, isMedia, isMember, null, isCount)
.Where(x => x.NodeId == id);
- return AddGroupBy(isContent, isMedia, sql, true);
+ return AddGroupBy(isContent, isMedia, isMember, sql, true);
}
// gets the base SELECT + FROM + WHERE sql
// for a given unique id
- protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isCount, Guid uniqueId)
+ protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isMember, bool isCount, Guid uniqueId)
{
- var sql = GetBase(isContent, isMedia, null, isCount)
+ var sql = GetBase(isContent, isMedia, isMember, null, isCount)
.Where(x => x.UniqueId == uniqueId);
- return AddGroupBy(isContent, isMedia, sql, true);
+ return AddGroupBy(isContent, isMedia, isMember, sql, true);
}
// gets the base SELECT + FROM + WHERE sql
// for a given object type and node id
- protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isCount, Guid objectType, int nodeId)
+ protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isMember, bool isCount, Guid objectType, int nodeId)
{
- return GetBase(isContent, isMedia, null, isCount)
+ return GetBase(isContent, isMedia, isMember, null, isCount)
.Where(x => x.NodeId == nodeId && x.NodeObjectType == objectType);
}
// gets the base SELECT + FROM + WHERE sql
// for a given object type and unique id
- protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isCount, Guid objectType, Guid uniqueId)
+ protected Sql GetBaseWhere(bool isContent, bool isMedia, bool isMember, bool isCount, Guid objectType, Guid uniqueId)
{
- return GetBase(isContent, isMedia, null, isCount)
+ return GetBase(isContent, isMedia, isMember, null, isCount)
.Where(x => x.UniqueId == uniqueId && x.NodeObjectType == objectType);
}
// gets the GROUP BY / ORDER BY sql
// required in order to count children
- protected Sql AddGroupBy(bool isContent, bool isMedia, Sql sql, bool defaultSort)
+ protected Sql AddGroupBy(bool isContent, bool isMedia, bool isMember, Sql sql, bool defaultSort)
{
sql
.GroupBy(x => x.NodeId, x => x.Trashed, x => x.ParentId, x => x.UserId, x => x.Level, x => x.Path)
@@ -483,7 +494,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
}
- if (isContent || isMedia)
+ if (isContent || isMedia || isMember)
sql
.AndBy(x => x.Id)
.AndBy(x => x.Alias, x => x.Icon, x => x.Thumbnail, x => x.IsContainer, x => x.Variations);
@@ -528,6 +539,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
public string MediaPath { get; set; }
}
+ private class MemberEntityDto : BaseDto
+ {
+ }
+
public class VariantInfoDto
{
public int NodeId { get; set; }
@@ -574,12 +589,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
#region Factory
- private EntitySlim BuildEntity(bool isContent, bool isMedia, BaseDto dto)
+ private EntitySlim BuildEntity(bool isContent, bool isMedia, bool isMember, BaseDto dto)
{
if (isContent)
return BuildDocumentEntity(dto);
if (isMedia)
return BuildMediaEntity(dto);
+ if (isMember)
+ return BuildMemberEntity(dto);
// EntitySlim does not track changes
var entity = new EntitySlim();
@@ -644,6 +661,19 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
return entity;
}
+ private MemberEntitySlim BuildMemberEntity(BaseDto dto)
+ {
+ // EntitySlim does not track changes
+ var entity = new MemberEntitySlim();
+ BuildEntity(entity, dto);
+
+ entity.ContentTypeAlias = dto.Alias;
+ entity.ContentTypeIcon = dto.Icon;
+ entity.ContentTypeThumbnail = dto.Thumbnail;
+
+ return entity;
+ }
+
#endregion
}
}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index a0d0fad6d9..43d168f442 100755
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -263,7 +263,9 @@
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js
index 9c140d572e..1142863bd0 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js
@@ -77,8 +77,7 @@
}
}
- // filter items if there is a filter and it's not advanced
- // ** ignores advanced filter at the moment
+ // filter items if there is a filter and it's not advanced (advanced filtering is handled below)
if (scope.entityTypeFilter && scope.entityTypeFilter.filter && !scope.entityTypeFilter.filterAdvanced) {
var a = scope.entityTypeFilter.filter.toLowerCase().replace(/\s/g, '').split(',');
var found = a.indexOf(c.metaData.ContentTypeAlias.toLowerCase()) >= 0;
@@ -88,6 +87,15 @@
}
}
});
+
+ // advanced item filtering is handled here
+ if (scope.entityTypeFilter && scope.entityTypeFilter.filter && scope.entityTypeFilter.filterAdvanced) {
+ var filtered = angular.isFunction(scope.entityTypeFilter.filter)
+ ? _.filter(miniListView.children, scope.entityTypeFilter.filter)
+ : _.where(miniListView.children, scope.entityTypeFilter.filter);
+ _.each(filtered, (node) => node.allowed = false);
+ }
+
// update pagination
miniListView.pagination.totalItems = data.totalItems;
miniListView.pagination.totalPages = data.totalPages;
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
index 0c8d77eabb..5df324c60f 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
@@ -203,7 +203,9 @@ function contentPickerController($scope, entityResource, editorState, iconHelper
//now we need to filter based on what is stored in the pre-vals, this logic duplicates what is in the treepicker.controller,
// but not much we can do about that since members require special filtering.
var filterItem = currFilter.toLowerCase().split(',');
- var found = filterItem.indexOf(i.metaData.contentType.toLowerCase()) >= 0;
+ // NOTE: when used in a mini list view, the item content type alias is metaData.ContentTypeAlias (in regular views it's metaData.contentType)
+ var itemContentType = i.metaData.contentType || i.metaData.ContentTypeAlias;
+ var found = filterItem.indexOf(itemContentType.toLowerCase()) >= 0;
if (!currFilter.startsWith("!") && !found || currFilter.startsWith("!") && found) {
return true;
}