Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,70 +33,38 @@ public ActionResult<PagedResult<EntityBasic>> 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<IUmbracoEntity> relations = _relationService.GetPagedParentEntitiesByChildId(id, pageNumber - 1, pageSize, out var totalRecords, relationTypes, objectType);

return new PagedResult<EntityBasic>(totalRecords, pageNumber, pageSize)
{
Items = relations.Cast<ContentEntitySlim>().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<bool> HasReferencesInDescendants(int id, string entityType)
public ActionResult<PagedResult<EntityBasic>> 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<IEntitySlim>();

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<IEntitySlim> entities = _entityService.GetDescendants(currentEntity.Id);
var ids = entities.Select(x => x.Id).ToArray();

} while (entities.Count == pageSize);
}
UmbracoObjectTypes objectType = ObjectTypes.GetUmbracoObjectType(entityType);
IEnumerable<IUmbracoEntity> relations = _relationService.GetPagedEntitiesForItemsInRelation(ids, pageNumber - 1, pageSize, out var totalRecords, objectType);

return false;
return GetRelationsPagedResult(totalRecords, pageNumber, pageSize, objectType, relations);
}

/// <summary>
Expand All @@ -119,10 +87,15 @@ public ActionResult<PagedResult<EntityBasic>> 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<IUmbracoEntity> 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<EntityBasic> GetRelationsPagedResult(long totalRecords, int pageNumber, int pageSize, UmbracoObjectTypes objectType, IEnumerable<IUmbracoEntity> relations)
{
var udiType = ObjectTypes.GetUdiType(objectType);

return new PagedResult<EntityBasic>(totalRecords, pageNumber, pageSize)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -41,7 +48,6 @@
vm.memberOptions = {};
vm.memberOptions.entityType = "MEMBER";
vm.hasMemberReferences = false;
vm.hasMemberReferencesInDescendants = false;

vm.$onInit = onInit;

Expand All @@ -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) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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();
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
* <pre>
* trackedReferencesResource.hasReferencesInDescendants(1,'MEDIA')
* <pre>
* var options = {
* pageSize : 25,
* pageNumber : 1,
* entityType : 'DOCUMENT'
* };
* trackedReferencesResource.getPagedDescendantsInReferences(1, options)
* .then(function(data) {
* console.log(data);
* });
* </pre>
*
* @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);
},

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<umb-load-indicator ng-if="vm.loading === true"></umb-load-indicator>

<umb-box ng-if="(vm.hasContentReferences === false) && (vm.hasContentReferencesInDescendants === false) && (vm.hasMediaReferences === false) && (vm.hasMediaReferencesInDescendants === false) && (vm.hasMemberReferences === false) && (vm.hasMemberReferencesInDescendants === false) && (vm.loading === false) && (vm.hideNoResult === false)">
<umb-box ng-if="(vm.hasContentReferences === false) && (vm.hasContentReferencesInDescendants === false) && (vm.hasMediaReferences === false) && (vm.hasMediaReferencesInDescendants === false) && (vm.hasMemberReferences === false) && (vm.loading === false) && (vm.hideNoResult === false)">
<umb-box-header title-key="references_tabName"></umb-box-header>
<umb-box-content>
<umb-empty-state size="small">
Expand All @@ -21,16 +21,13 @@
</umb-tracked-references-table>
</div>

<div ng-if="vm.hasContentReferencesInDescendants">
<h5 class="mt0" style="margin-bottom: 20px;">
<localize key="references_labelUsedByDocuments">Used in Documents</localize>
</h5>

<umb-box>
<umb-box-content>
<localize key="references_labelUsedInContentDescendants">One or more of this item's descendants is being used in a content item.</localize>
</umb-box-content>
</umb-box>
<div ng-if="vm.hasContentReferencesInDescendants"> <!-- TODO: RENAME this table -->
<umb-tracked-references-listview-table items="vm.referencedContentDescendants.items"
total-pages="vm.referencedContentDescendants.totalPages"
page-number="vm.referencedContentDescendants.pageNumber"
title="vm.referencedDescendantsTitle"
on-page-changed="vm.changeContentDescendantsPageNumber(pageNumber)">
</umb-tracked-references-listview-table>
</div>

<!-- Members -->
Expand All @@ -43,18 +40,6 @@ <h5 class="mt0" style="margin-bottom: 20px;">
</umb-tracked-references-table>
</div>

<div ng-if="vm.hasMemberReferencesInDescendants">
<h5 class="mt0" style="margin-bottom: 20px;">
<localize key="references_labelUsedByMembers">Used in Members</localize>
</h5>

<umb-box>
<umb-box-content>
<localize key="references_labelUsedInMemberDescendants">One or more of this item's descendants is being used in a a member</localize>
</umb-box-content>
</umb-box>
</div>

<!-- Media -->
<div ng-if="vm.hasMediaReferences">
<umb-tracked-references-table items="vm.mediaReferences.items"
Expand All @@ -65,15 +50,12 @@ <h5 class="mt0" style="margin-bottom: 20px;">
</umb-tracked-references-table>
</div>

<div ng-if="vm.hasMediaReferencesInDescendants">
<h5 class="mt0" style="margin-bottom: 20px;">
<localize key="references_labelUsedByMedia">Used in Media</localize>
</h5>

<umb-box>
<umb-box-content>
<localize key="references_labelUsedInMediaDescendants">One or more of this item's descendants is being used in a media item.</localize>
</umb-box-content>
</umb-box>
<div ng-if="vm.hasMediaReferencesInDescendants"> <!-- TODO: RENAME this table -->
<umb-tracked-references-listview-table items="vm.referencedMediaDescendants.items"
total-pages="vm.referencedMediaDescendants.totalPages"
page-number="vm.referencedMediaDescendants.pageNumber"
title="vm.referencedDescendantsTitle"
on-page-changed="vm.changeMediaDescendantsPageNumber(pageNumber)">
</umb-tracked-references-listview-table>
</div>
</div>
1 change: 1 addition & 0 deletions src/Umbraco.Web.UI/umbraco/config/lang/en.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2468,6 +2468,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="labelUsedByMembers">Used in Members</key>
<key alias="labelUsedByMedia">Used in Media</key>
<key alias="labelUsedItems">Items in use</key>
<key alias="labelUsedDescendants">Descendants in use</key>
<key alias="labelUsedInMediaDescendants">One or more of this item's descendants is being used in a media item.</key>
<key alias="labelUsedInContentDescendants">One or more of this item's descendants is being used in a content item.</key>
<key alias="labelUsedInMemberDescendants">One or more of this item's descendants is being used in a member.</key>
Expand Down
1 change: 1 addition & 0 deletions src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2551,6 +2551,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="labelUsedByMembers">Used in Members</key>
<key alias="labelUsedByMedia">Used in Media</key>
<key alias="labelUsedItems">Items in use</key>
<key alias="labelUsedDescendants">Descendants in use</key>
<key alias="labelUsedInMediaDescendants">One or more of this item's descendants is being used in a media item.</key>
<key alias="labelUsedInContentDescendants">One or more of this item's descendants is being used in a content item.</key>
<key alias="labelUsedInMemberDescendants">One or more of this item's descendants is being used in a member.</key>
Expand Down