diff --git a/src/Umbraco.Web.BackOffice/Controllers/TrackedReferencesController.cs b/src/Umbraco.Web.BackOffice/Controllers/TrackedReferencesController.cs index 322b1f83bef5..554a741f26ce 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/TrackedReferencesController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/TrackedReferencesController.cs @@ -33,70 +33,38 @@ public ActionResult> GetPagedReferences(int id, string return BadRequest("Both pageNumber and pageSize must be greater than zero"); } - var objectType = ObjectTypes.GetUmbracoObjectType(entityType); - var udiType = ObjectTypes.GetUdiType(objectType); var relationTypes = new string[] { Constants.Conventions.RelationTypes.RelatedDocumentAlias, Constants.Conventions.RelationTypes.RelatedMediaAlias }; - var relations = _relationService.GetPagedParentEntitiesByChildId(id, pageNumber - 1, pageSize, out var totalRecords, relationTypes, objectType); + UmbracoObjectTypes objectType = ObjectTypes.GetUmbracoObjectType(entityType); + IEnumerable relations = _relationService.GetPagedParentEntitiesByChildId(id, pageNumber - 1, pageSize, out var totalRecords, relationTypes, objectType); - return new PagedResult(totalRecords, pageNumber, pageSize) - { - Items = relations.Cast().Select(rel => new EntityBasic - { - Id = rel.Id, - Key = rel.Key, - Udi = Udi.Create(udiType, rel.Key), - Icon = rel.ContentTypeIcon, - Name = rel.Name, - Alias = rel.ContentTypeAlias - }) - }; + return GetRelationsPagedResult(totalRecords, pageNumber, pageSize, objectType, relations); } - [HttpGet] - public ActionResult HasReferencesInDescendants(int id, string entityType) + public ActionResult> GetPagedDescendantsInReferences(int parentId, string entityType, int pageNumber = 1, int pageSize = 100) { - var currentEntity = _entityService.Get(id); - - if (currentEntity != null) + if (pageNumber <= 0 || pageSize <= 0) { - var currentObjectType = ObjectTypes.GetUmbracoObjectType(currentEntity.NodeObjectType); - - var objectType = ObjectTypes.GetUmbracoObjectType(entityType); - var relationTypes = new string[] - { - Constants.Conventions.RelationTypes.RelatedDocumentAlias, - Constants.Conventions.RelationTypes.RelatedMediaAlias - }; - - var pageSize = 1000; - var currentPage = 0; - - var entities = new List(); - - do - { - entities = _entityService.GetPagedDescendants(id, currentObjectType, currentPage, pageSize, out _).ToList(); - - var ids = entities.Select(x => x.Id).ToArray(); - - var relations = _relationService.GetPagedParentEntitiesByChildIds(ids, 0, int.MaxValue, out _, relationTypes, objectType); + return BadRequest("Both pageNumber and pageSize must be greater than zero"); + } - if (relations.Any()) - { - return true; - } + IEntitySlim currentEntity = _entityService.Get(parentId); + if (currentEntity is null) + { + return NotFound(); + } - currentPage++; + IEnumerable entities = _entityService.GetDescendants(currentEntity.Id); + var ids = entities.Select(x => x.Id).ToArray(); - } while (entities.Count == pageSize); - } + UmbracoObjectTypes objectType = ObjectTypes.GetUmbracoObjectType(entityType); + IEnumerable relations = _relationService.GetPagedEntitiesForItemsInRelation(ids, pageNumber - 1, pageSize, out var totalRecords, objectType); - return false; + return GetRelationsPagedResult(totalRecords, pageNumber, pageSize, objectType, relations); } /// @@ -119,10 +87,15 @@ public ActionResult> CheckLinkedItems([FromJsonPath] in return BadRequest("Both pageNumber and pageSize must be greater than zero"); } - var objectType = ObjectTypes.GetUmbracoObjectType(entityType); - var udiType = ObjectTypes.GetUdiType(objectType); + UmbracoObjectTypes objectType = ObjectTypes.GetUmbracoObjectType(entityType); + IEnumerable relations = _relationService.GetPagedEntitiesForItemsInRelation(ids, pageNumber - 1, pageSize, out var totalRecords, objectType); - var relations = _relationService.GetPagedEntitiesForItemsInRelation(ids, pageNumber - 1, pageSize, out var totalRecords, objectType); + return GetRelationsPagedResult(totalRecords, pageNumber, pageSize, objectType, relations); + } + + private PagedResult GetRelationsPagedResult(long totalRecords, int pageNumber, int pageSize, UmbracoObjectTypes objectType, IEnumerable relations) + { + var udiType = ObjectTypes.GetUdiType(objectType); return new PagedResult(totalRecords, pageNumber, pageSize) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferences.component.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferences.component.js index ad9d16fa2855..9f276a4206da 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferences.component.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferences.component.js @@ -12,6 +12,7 @@ vm.contentReferencesTitle = "Used in Documents"; vm.memberReferencesTitle = "Used in Members"; vm.mediaReferencesTitle = "Used in Media"; + vm.referencedDescendantsTitle = "Descendants in use"; localizationService.localize("references_labelUsedByDocuments").then(function (value) { vm.contentReferencesTitle = value; @@ -24,14 +25,20 @@ localizationService.localize("references_labelUsedByMedia").then(function (value) { vm.mediaReferencesTitle = value; }); + + localizationService.localize("references_labelUsedDescendants").then(function (value) { + vm.referencedDescendantsTitle = value; + }); vm.changeContentPageNumber = changeContentPageNumber; + vm.changeContentDescendantsPageNumber = changeContentDescendantsPageNumber; vm.contentOptions = {}; vm.contentOptions.entityType = "DOCUMENT"; vm.hasContentReferences = false; vm.hasContentReferencesInDescendants = false; vm.changeMediaPageNumber = changeMediaPageNumber; + vm.changeMediaDescendantsPageNumber = changeMediaDescendantsPageNumber; vm.mediaOptions = {}; vm.mediaOptions.entityType = "MEDIA"; vm.hasMediaReferences = false; @@ -41,7 +48,6 @@ vm.memberOptions = {}; vm.memberOptions.entityType = "MEMBER"; vm.hasMemberReferences = false; - vm.hasMemberReferencesInDescendants = false; vm.$onInit = onInit; @@ -60,18 +66,18 @@ } else { var descendantsPromises = []; - if (!vm.hasContentReferences) { + // when vm.id == 0 it means that this is a new item, so it has no references yet + // therefore we don't need to check for descendants + if (!vm.hasContentReferences && vm.id != 0) { descendantsPromises.push(checkContentDescendantsUsage()); } - if (!vm.hasMediaReferences) { + // when vm.id == 0 it means that this is a new item, so it has no references yet + // therefore we don't need to check for descendants + if (!vm.hasMediaReferences && vm.id != 0) { descendantsPromises.push(checkMediaDescendantsUsage()); } - if (!vm.hasMemberReferences) { - descendantsPromises.push(checkMemberDescendantsUsage()); - } - $q.all(descendantsPromises).then(function() { vm.loading = false; if(vm.onLoadingComplete) { @@ -97,6 +103,16 @@ loadMemberRelations(); } + function changeContentDescendantsPageNumber(pageNumber) { + vm.contentOptions.pageNumber = pageNumber; + checkContentDescendantsUsage(); + } + + function changeMediaDescendantsPageNumber(pageNumber) { + vm.mediaOptions.pageNumber = pageNumber; + checkMediaDescendantsUsage(); + } + function loadContentRelations() { return trackedReferencesResource.getPagedReferences(vm.id, vm.contentOptions) .then(function (data) { @@ -134,33 +150,24 @@ } function checkContentDescendantsUsage() { - return trackedReferencesResource.hasReferencesInDescendants(vm.id, vm.contentOptions.entityType) + return trackedReferencesResource.getPagedDescendantsInReferences(vm.id, vm.contentOptions) .then(function (data) { - vm.hasContentReferencesInDescendants = data; + vm.referencedContentDescendants = data; - if (vm.hasContentReferencesInDescendants) { + if (data.items.length > 0) { + vm.hasContentReferencesInDescendants = data.items.length > 0; activateWarning(); } }); } function checkMediaDescendantsUsage() { - return trackedReferencesResource.hasReferencesInDescendants(vm.id, vm.mediaOptions.entityType) + return trackedReferencesResource.getPagedDescendantsInReferences(vm.id, vm.mediaOptions) .then(function (data) { - vm.hasMediaReferencesInDescendants = data; + vm.referencedMediaDescendants = data; - if (vm.hasMediaReferencesInDescendants) { - activateWarning(); - } - }); - } - - function checkMemberDescendantsUsage() { - return trackedReferencesResource.hasReferencesInDescendants(vm.id, vm.memberOptions.entityType) - .then(function (data) { - vm.hasMemberReferencesInDescendants = data; - - if (vm.hasMemberReferencesInDescendants) { + if (data.items.length > 0) { + vm.hasMediaReferencesInDescendants = data.items.length > 0; activateWarning(); } }); diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/trackedreferences.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/trackedreferences.resource.js index d4e71aece574..11a9dc4e2c67 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/trackedreferences.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/trackedreferences.resource.js @@ -67,38 +67,60 @@ function trackedReferencesResource($q, $http, umbRequestHelper) { /** * @ngdoc method - * @name umbraco.resources.trackedReferencesResource#hasReferencesInDescendants + * @name umbraco.resources.trackedReferencesResource#getPagedDescendantsInReferences * @methodOf umbraco.resources.trackedReferencesResource * * @description - * Checks if there are any tracked references for the child nodes of the current item + * Gets a page list of the child nodes of the current item used in any kind of relation * * ##usage - *
         
-         * trackedReferencesResource.hasReferencesInDescendants(1,'MEDIA')
+         * 
+         * var options = {
+         *      pageSize : 25,
+         *      pageNumber : 1,
+         *      entityType : 'DOCUMENT'
+         *  };
+         * trackedReferencesResource.getPagedDescendantsInReferences(1, options)
          *    .then(function(data) {
          *        console.log(data);
          *    });
          * 
* - * @param {int} id Id of the item to query for tracked references - * @param {String} entityType the type of tracked entity (default : DOCUMENT). Possible values DOCUMENT, MEDIA + * @param {int} id Id of the item to query for child nodes used in relation + * @param {Object} args optional args object + * @param {Int} args.pageSize the pagesize of the returned list (default 25) + * @param {Int} args.pageNumber the current page index (default 1) + * @param {String} args.entityType the type of tracked entity (default : DOCUMENT). Possible values DOCUMENT, MEDIA * @returns {Promise} resourcePromise object. * */ - hasReferencesInDescendants: function (id, entityType) { + getPagedDescendantsInReferences: function (id, args) { + + var defaults = { + pageSize: 10, + pageNumber: 1, + entityType: "DOCUMENT" + }; + if (args === undefined) { + args = {}; + } + + //overwrite the defaults if there are any specified + var options = Utilities.extend(defaults, args); return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( "trackedReferencesApiBaseUrl", - "HasReferencesInDescendants", + "GetPagedDescendantsInReferences", { - id: id, - entityType: entityType + parentId: id, + entityType: options.entityType, + pageNumber: options.pageNumber, + pageSize: options.pageSize } )), - "Failed to check for references in child nodes"); + "Failed to retrieve usages for descendants of parent with id " + id); }, /** diff --git a/src/Umbraco.Web.UI.Client/src/views/components/references/umb-tracked-references.html b/src/Umbraco.Web.UI.Client/src/views/components/references/umb-tracked-references.html index ad6b585add87..cf3c563b3c70 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/references/umb-tracked-references.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/references/umb-tracked-references.html @@ -1,6 +1,6 @@ - + @@ -21,16 +21,13 @@ -
-
- Used in Documents -
- - - - One or more of this item's descendants is being used in a content item. - - +
+ +
@@ -43,18 +40,6 @@
-
-
- Used in Members -
- - - - One or more of this item's descendants is being used in a a member - - -
-
-
-
- Used in Media -
- - - - One or more of this item's descendants is being used in a media item. - - +
+ +
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 4aa9ec6c7516..6a0187227948 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -2468,6 +2468,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Used in Members Used in Media Items in use + Descendants in use One or more of this item's descendants is being used in a media item. One or more of this item's descendants is being used in a content item. One or more of this item's descendants is being used in a member. diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index d0e8ff9e354e..d083512b45cb 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -2551,6 +2551,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Used in Members Used in Media Items in use + Descendants in use One or more of this item's descendants is being used in a media item. One or more of this item's descendants is being used in a content item. One or more of this item's descendants is being used in a member.