From 8773d644aade2a8b488a10eccd081843e6eacaf6 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Fri, 15 Nov 2019 12:50:44 +0000 Subject: [PATCH] Implement paging for the three entity types that media can be related to --- .../media/umbmedianodeinfo.directive.js | 72 ++++++++-- .../src/common/resources/media.resource.js | 90 ++++++++++--- .../components/media/umb-media-node-info.html | 44 +++++-- src/Umbraco.Web/Editors/MediaController.cs | 123 +++++++++--------- .../Models/ContentEditing/MediaReferences.cs | 21 +-- 5 files changed, 234 insertions(+), 116 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js index 18aa457862..6f1dde18a0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js @@ -1,16 +1,31 @@ (function () { 'use strict'; - function MediaNodeInfoDirective($timeout, $location, eventsService, userService, dateHelper, editorService, mediaHelper, mediaResource, $routeParams) { + function MediaNodeInfoDirective($timeout, $location, eventsService, userService, dateHelper, editorService, mediaHelper, mediaResource, $routeParams, $q) { function link(scope, element, attrs, ctrl) { var evts = []; - var referencesLoaded = false; scope.allowChangeMediaType = false; scope.loading = true; + scope.changeContentPageNumber = changeContentPageNumber; + scope.contentOptions = {}; + scope.contentOptions.pageSize = 1; + scope.hasContentReferences = false; + + scope.changeMediaPageNumber = changeMediaPageNumber; + scope.mediaOptions = {}; + scope.mediaOptions.pageSize = 1; + scope.hasMediaReferences = false; + + scope.changeMemberPageNumber = changeMemberPageNumber; + scope.memberOptions = {}; + scope.memberOptions.pageSize = 1; + scope.hasMemberReferences = false; + + function onInit() { userService.getCurrentUser().then(function(user){ @@ -96,17 +111,43 @@ setMediaExtension(); }); - /** Loads in the media references one time */ - function loadRelations() { - if (!referencesLoaded) { - referencesLoaded = true; - mediaResource.getReferences($routeParams.id) - .then(function (data) { - scope.loading = false; - scope.references = data; - scope.hasReferences = data.content.length > 0 || data.members.length > 0; - }); - } + function changeContentPageNumber(pageNumber) { + scope.contentOptions.pageNumber = pageNumber; + loadContentRelations(); + } + + function changeMediaPageNumber(pageNumber) { + scope.mediaOptions.pageNumber = pageNumber; + loadMediaRelations(); + } + + function changeMemberPageNumber(pageNumber) { + scope.memberOptions.pageNumber = pageNumber; + loadMemberRelations(); + } + + function loadContentRelations() { + return mediaResource.getPagedContentReferences($routeParams.id, scope.contentOptions) + .then(function (data) { + scope.contentReferences = data; + scope.hasContentReferences = data.items.length > 0; + }); + } + + function loadMediaRelations() { + return mediaResource.getPagedMediaReferences($routeParams.id, scope.mediaOptions) + .then(function (data) { + scope.mediaReferences = data; + scope.hasMediaReferences = data.items.length > 0; + }); + } + + function loadMemberRelations() { + return mediaResource.getPagedMemberReferences($routeParams.id, scope.memberOptions) + .then(function (data) { + scope.memberReferences = data; + scope.hasMemberReferences = data.items.length > 0; + }); } //ensure to unregister from all events! @@ -122,7 +163,10 @@ evts.push(eventsService.on("app.tabChange", function (event, args) { $timeout(function () { if (args.alias === "umbInfo") { - loadRelations(); + + $q.all([loadContentRelations(), loadMediaRelations(), loadMemberRelations()]).then(function () { + scope.loading = false; + }); } }); })); diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js index 58c02b55df..cb8c883bb9 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js @@ -554,28 +554,88 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to retrieve media items for search: ' + query); }, - /** - * @ngdoc method - * @name umbraco.resources.mediaResource#getReferences - * @methodOf umbraco.resources.mediaResource - * - * @description - * Retrieves references of a given media item. - * - * @param {Int} id id of media node to retrieve references for - * @returns {Promise} resourcePromise object. - * - */ - getReferences: function (id) { + getPagedContentReferences: function (id, options) { + + var defaults = { + pageSize: 25, + pageNumber: 1 + }; + if (options === undefined) { + options = {}; + } + //overwrite the defaults if there are any specified + angular.extend(defaults, options); + //now copy back to the options we will use + options = defaults; return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( "mediaApiBaseUrl", - "GetReferences", - { id: id })), + "GetPagedContentReferences", + { + id: id, + pageNumber: options.pageNumber, + pageSize: options.pageSize + } + )), "Failed to retrieve usages for media of id " + id); + }, + getPagedMemberReferences: function (id, options) { + + var defaults = { + pageSize: 25, + pageNumber: 1 + }; + if (options === undefined) { + options = {}; + } + //overwrite the defaults if there are any specified + angular.extend(defaults, options); + //now copy back to the options we will use + options = defaults; + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "mediaApiBaseUrl", + "GetPagedMemberReferences", + { + id: id, + pageNumber: options.pageNumber, + pageSize: options.pageSize + } + )), + "Failed to retrieve usages for media of id " + id); + }, + + getPagedMediaReferences: function (id, options) { + + var defaults = { + pageSize: 25, + pageNumber: 1 + }; + if (options === undefined) { + options = {}; + } + //overwrite the defaults if there are any specified + angular.extend(defaults, options); + //now copy back to the options we will use + options = defaults; + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "mediaApiBaseUrl", + "GetPagedMediaReferences", + { + id: id, + pageNumber: options.pageNumber, + pageSize: options.pageSize + } + )), + "Failed to retrieve usages for media of id " + id); } }; } diff --git a/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html index a82e1897a1..21a28a905f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/media/umb-media-node-info.html @@ -29,7 +29,7 @@ - + @@ -39,10 +39,9 @@ -
- +
-
+
Used in Documents @@ -58,7 +57,7 @@
-
+
{{::reference.name}}
{{::reference.alias}}
@@ -66,10 +65,19 @@
+ + +
+ + +
-
+
Used in Members @@ -85,7 +93,7 @@
-
+
{{::reference.name}}
{{::reference.alias}}
@@ -93,10 +101,19 @@
+ + +
+ + +
-
+
Used in Media @@ -112,7 +129,7 @@
-
+
{{::reference.name}}
{{::reference.alias}}
@@ -120,6 +137,15 @@
+ + +
+ + +
diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 36750d74ec..22a546ad7d 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -945,70 +945,73 @@ namespace Umbraco.Web.Editors return hasPathAccess; } - /// - /// Returns the references (usages) for the media item - /// - /// - /// - public MediaReferences GetReferences(int id) + public PagedResult GetPagedContentReferences(int id, int pageNumber = 1, int pageSize = 100) { - var result = new MediaReferences(); - - var relations = Services.RelationService.GetByChildId(id, Constants.Conventions.RelationTypes.RelatedMediaAlias).ToList(); - var relationEntities = Services.RelationService.GetParentEntitiesFromRelations(relations).ToList(); - - var documents = new List(); - var members = new List(); - var media = new List(); - - foreach (var item in relationEntities) + if (pageNumber <= 0 || pageSize <= 0) { - switch (item) - { - case DocumentEntitySlim doc: - documents.Add(new MediaReferences.EntityTypeReferences { - Id = doc.Id, - Key = doc.Key, - Udi = Udi.Create(Constants.UdiEntityType.Document, doc.Key), - Icon = doc.ContentTypeIcon, - Name = doc.Name, - Alias = doc.ContentTypeAlias - }); - break; - - case MemberEntitySlim memb: - members.Add(new MediaReferences.EntityTypeReferences - { - Id = memb.Id, - Key = memb.Key, - Udi = Udi.Create(Constants.UdiEntityType.Member, memb.Key), - Icon = memb.ContentTypeIcon, - Name = memb.Name, - Alias = memb.ContentTypeAlias - }); - break; - - case MediaEntitySlim med: - media.Add(new MediaReferences.EntityTypeReferences - { - Id = med.Id, - Key = med.Key, - Udi = Udi.Create(Constants.UdiEntityType.Media, med.Key), - Icon = med.ContentTypeIcon, - Name = med.Name, - Alias = med.ContentTypeAlias - }); - break; - - default: - break; - } + throw new NotSupportedException("Both pageNumber and pageSize must be greater than zero"); } - result.Content = documents; - result.Members = members; - result.Media = media; - return result; + var relations = Services.RelationService.GetPagedParentEntitiesByChildId(id, pageNumber - 1, pageSize, out long totalRecords, UmbracoObjectTypes.Document); + + return new PagedResult(totalRecords, pageNumber, pageSize) + { + Items = relations.Cast().Select(doc => new EntityTypeReferences + { + Id = doc.Id, + Key = doc.Key, + Udi = Udi.Create(Constants.UdiEntityType.Document, doc.Key), + Icon = doc.ContentTypeIcon, + Name = doc.Name, + Alias = doc.ContentTypeAlias + }) + }; + } + + public PagedResult GetPagedMemberReferences(int id, int pageNumber = 1, int pageSize = 100) + { + if (pageNumber <= 0 || pageSize <= 0) + { + throw new NotSupportedException("Both pageNumber and pageSize must be greater than zero"); + } + + var relations = Services.RelationService.GetPagedParentEntitiesByChildId(id, pageNumber - 1, pageSize, out long totalRecords, UmbracoObjectTypes.Member); + + return new PagedResult(totalRecords, pageNumber, pageSize) + { + Items = relations.Cast().Select(memb => new EntityTypeReferences + { + Id = memb.Id, + Key = memb.Key, + Udi = Udi.Create(Constants.UdiEntityType.Member, memb.Key), + Icon = memb.ContentTypeIcon, + Name = memb.Name, + Alias = memb.ContentTypeAlias + }) + }; + } + + public PagedResult GetPagedMediaReferences(int id, int pageNumber = 1, int pageSize = 100) + { + if (pageNumber <= 0 || pageSize <= 0) + { + throw new NotSupportedException("Both pageNumber and pageSize must be greater than zero"); + } + + var relations = Services.RelationService.GetPagedParentEntitiesByChildId(id, pageNumber - 1, pageSize, out long totalRecords, UmbracoObjectTypes.Media); + + return new PagedResult(totalRecords, pageNumber, pageSize) + { + Items = relations.Cast().Select(med => new EntityTypeReferences + { + Id = med.Id, + Key = med.Key, + Udi = Udi.Create(Constants.UdiEntityType.Media, med.Key), + Icon = med.ContentTypeIcon, + Name = med.Name, + Alias = med.ContentTypeAlias + }) + }; } } } diff --git a/src/Umbraco.Web/Models/ContentEditing/MediaReferences.cs b/src/Umbraco.Web/Models/ContentEditing/MediaReferences.cs index b10022b105..a1fbdfa1e1 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MediaReferences.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MediaReferences.cs @@ -1,24 +1,9 @@ -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; +using System.Runtime.Serialization; namespace Umbraco.Web.Models.ContentEditing { - [DataContract(Name = "mediaReferences", Namespace = "")] - public class MediaReferences + [DataContract(Name = "entityType", Namespace = "")] + public class EntityTypeReferences : EntityBasic { - [DataMember(Name = "content")] - public IEnumerable Content { get; set; } = Enumerable.Empty(); - - [DataMember(Name = "members")] - public IEnumerable Members { get; set; } = Enumerable.Empty(); - - [DataMember(Name = "media")] - public IEnumerable Media { get; set; } = Enumerable.Empty(); - - [DataContract(Name = "entityType", Namespace = "")] - public class EntityTypeReferences : EntityBasic - { - } } }