> GetPagedReferencedItems([FromJsonPath] int[] ids, int pageNumber = 1, int pageSize = 100, bool filterMustBeIsDependency = true)
+ {
+ if (pageNumber <= 0 || pageSize <= 0)
+ {
+ return BadRequest("Both pageNumber and pageSize must be greater than zero");
+ }
+
+ return _relationService.GetPagedItemsWithRelations(ids, pageNumber - 1, pageSize, filterMustBeIsDependency);
+
+ }
+ }
+
+}
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 c07777ca60c3..2a65c67a8d34 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
@@ -8,22 +8,6 @@
var evts = [];
scope.allowChangeMediaType = false;
- scope.loading = true;
-
- scope.changeContentPageNumber = changeContentPageNumber;
- scope.contentOptions = {};
- scope.contentOptions.entityType = "DOCUMENT";
- scope.hasContentReferences = false;
-
- scope.changeMediaPageNumber = changeMediaPageNumber;
- scope.mediaOptions = {};
- scope.mediaOptions.entityType = "MEDIA";
- scope.hasMediaReferences = false;
-
- scope.changeMemberPageNumber = changeMemberPageNumber;
- scope.memberOptions = {};
- scope.memberOptions.entityType = "MEMBER";
- scope.hasMemberReferences = false;
function onInit() {
@@ -110,45 +94,6 @@
setMediaExtension();
});
- 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.getPagedReferences(scope.node.id, scope.contentOptions)
- .then(function (data) {
- scope.contentReferences = data;
- scope.hasContentReferences = data.items.length > 0;
- });
- }
-
- function loadMediaRelations() {
- return mediaResource.getPagedReferences(scope.node.id, scope.mediaOptions)
- .then(data => {
- scope.mediaReferences = data;
- scope.hasMediaReferences = data.items.length > 0;
- });
- }
-
- function loadMemberRelations() {
- return mediaResource.getPagedReferences(scope.node.id, scope.memberOptions)
- .then(data => {
- scope.memberReferences = data;
- scope.hasMemberReferences = data.items.length > 0;
- });
- }
-
//ensure to unregister from all events!
scope.$on('$destroy', function () {
for (var e in evts) {
@@ -157,18 +102,6 @@
});
onInit();
-
- // load media type references when the 'info' tab is first activated/switched to
- evts.push(eventsService.on("app.tabChange", function (event, args) {
- $timeout(function () {
- if (args.alias === "umbInfo") {
-
- $q.all([loadContentRelations(), loadMediaRelations(), loadMemberRelations()]).then(function () {
- scope.loading = false;
- });
- }
- });
- }));
}
var directive = {
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
new file mode 100644
index 000000000000..000e87146cd7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferences.component.js
@@ -0,0 +1,125 @@
+(function () {
+ 'use strict';
+
+ /**
+ * A component to render the tracked references of an item
+ */
+
+ function umbTrackedReferencesController($q, trackedReferencesResource, localizationService) {
+
+ var vm = this;
+
+ vm.changeReferencesPageNumber = changeReferencesPageNumber;
+ vm.changeDescendantsPageNumber = changeDescendantsPageNumber;
+
+ vm.$onInit = onInit;
+
+ function onInit() {
+
+ vm.referencesTitle = this.hideNoneDependencies ? "The following items depends on this" : "Referenced by the following items";
+ vm.referencedDescendantsTitle = this.hideNoneDependencies ? "The following descending items has dependencies" : "The following descending items are referenced";
+
+ localizationService.localize(this.hideNoneDependencies ? "references_labelDependsOnThis" : "references_labelUsedByItems").then(function (value) {
+ vm.referencesTitle = value;
+ });
+
+ localizationService.localize(this.hideNoneDependencies ? "references_labelDependentDescendants" : "references_labelUsedDescendants").then(function (value) {
+ vm.referencedDescendantsTitle = value;
+ });
+
+ vm.descendantsOptions = {};
+ vm.descendantsOptions.filterMustBeIsDependency = this.hideNoneDependencies;
+ vm.hasReferencesInDescendants = false;
+
+ vm.referencesOptions = {};
+ vm.referencesOptions.filterMustBeIsDependency = this.hideNoneDependencies;
+ vm.hasReferences = false;
+
+ this.loading = true;
+ this.hideNoResult = this.hideNoResult || false;
+
+ // when vm.id == 0 it means that this is a new item, so it has no references yet
+ if (vm.id === 0) {
+ vm.loading = false;
+ if(vm.onLoadingComplete) {
+ vm.onLoadingComplete();
+ }
+ return;
+ }
+
+ // Make array of promises to load:
+ var promises = [loadReferencesRelations()];
+
+ // only load descendants if we want to show them.
+ if (vm.showDescendants) {
+ promises.push(loadDescendantsUsage());
+ }
+
+ $q.all(promises).then(function () {
+ vm.loading = false;
+ if(vm.onLoadingComplete) {
+ vm.onLoadingComplete();
+ }
+ });
+ }
+
+ function changeReferencesPageNumber(pageNumber) {
+ vm.referencesOptions.pageNumber = pageNumber;
+ loadReferencesRelations();
+ }
+
+ function changeDescendantsPageNumber(pageNumber) {
+ vm.descendantsOptions.pageNumber = pageNumber;
+ loadDescendantsUsage();
+ }
+
+ function loadReferencesRelations() {
+ return trackedReferencesResource.getPagedReferences(vm.id, vm.referencesOptions)
+ .then(function (data) {
+ vm.references = data;
+
+ if (data.items.length > 0) {
+ vm.hasReferences = data.items.length > 0;
+ activateWarning();
+ }
+ });
+ }
+
+ function loadDescendantsUsage() {
+ return trackedReferencesResource.getPagedDescendantsInReferences(vm.id, vm.descendantsOptions)
+ .then(function (data) {
+ vm.referencedDescendants = data;
+
+ if (data.items.length > 0) {
+ vm.hasReferencesInDescendants = data.items.length > 0;
+ activateWarning();
+ }
+ });
+ }
+
+ function activateWarning() {
+ if (vm.onWarning) {
+ vm.onWarning();
+ }
+ }
+ }
+
+ var umbTrackedReferencesComponent = {
+ templateUrl: 'views/components/references/umb-tracked-references.html',
+ transclude: true,
+ bindings: {
+ id: "<",
+ hideNoResult: "",
+ onWarning: "&?",
+ onLoadingComplete: "&?",
+ compact: "",
+ showDescendants: "",
+ hideNoneDependencies: ""
+ },
+ controllerAs: 'vm',
+ controller: umbTrackedReferencesController
+ };
+
+ angular.module('umbraco.directives').component('umbTrackedReferences', umbTrackedReferencesComponent);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferencesbulkaction.component.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferencesbulkaction.component.js
new file mode 100644
index 000000000000..4059a803deda
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferencesbulkaction.component.js
@@ -0,0 +1,79 @@
+(function () {
+ 'use strict';
+
+ /**
+ * A component to render the items from a selection which are used in a relation
+ */
+
+ function umbTrackedReferencesBulkActionController($q, trackedReferencesResource, localizationService)
+ {
+ var vm = this;
+
+ vm.referencedItemsTitle = "These items are referenced";
+
+ localizationService.localize("references_labelUsedItems").then(function (value) {
+ vm.referencedItemsTitle = value;
+ });
+
+ vm.changeReferencesPageNumber = changeReferencesPageNumber;
+ vm.referencesOptions = {};
+ vm.referencesOptions.filterMustBeIsDependency = true;
+ vm.hasReferences = false;
+
+ vm.$onInit = onInit;
+
+ function onInit() {
+
+ this.loading = true;
+ this.hideNoResult = this.hideNoResult || false;
+
+ loadContentBulkActionUsage().then(function () {
+ vm.loading = false;
+ if(vm.onLoadingComplete) {
+ vm.onLoadingComplete();
+ }
+ });
+ }
+
+ function changeReferencesPageNumber(pageNumber) {
+ vm.referencesOptions.pageNumber = pageNumber;
+ loadContentBulkActionUsage();
+ }
+
+ function loadContentBulkActionUsage() {
+ var ids = vm.selection.map(s => s.id);
+
+ return trackedReferencesResource.getPagedReferencedItems(ids, vm.referencesOptions)
+ .then(function (data) {
+ vm.referencedItems = data;
+
+ if (data.items.length > 0) {
+ vm.hasReferences = data.items.length > 0;
+ activateWarning();
+ }
+ });
+ }
+
+ function activateWarning() {
+ if (vm.onWarning) {
+ vm.onWarning();
+ }
+ }
+ }
+
+ var umbTrackedReferencesBulkActionComponent = {
+ templateUrl: 'views/components/references/umb-tracked-references-bulk-action.html',
+ transclude: true,
+ bindings: {
+ selection: "<",
+ hideNoResult: "",
+ onWarning: "&?",
+ onLoadingComplete: "&?"
+ },
+ controllerAs: 'vm',
+ controller: umbTrackedReferencesBulkActionController
+ };
+
+ angular.module('umbraco.directives').component('umbTrackedReferencesBulkAction', umbTrackedReferencesBulkActionComponent);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferencestable.component.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferencestable.component.js
new file mode 100644
index 000000000000..4709a9a500e2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/references/umbtrackedreferencestable.component.js
@@ -0,0 +1,106 @@
+(function () {
+ 'use strict';
+
+ /**
+ * A component to render a table for the tracked references of an item
+ */
+
+ function umbTrackedReferencesTableController(editorService, udiParser, navigationService, overlayService)
+ {
+ var vm = this;
+
+ vm.changePageNumber = changePageNumber;
+ vm.getUrl = getUrl;
+ vm.referenceAnchorClicked = referenceAnchorClicked;
+
+ function changePageNumber(pageNumber) {
+ vm.onPageChanged({ 'pageNumber' : pageNumber });
+ }
+
+ function getUrl(itemUdi, itemId) {
+ // extract the entity type from the udi
+ var udi = udiParser.parse(itemUdi);
+
+ if (udi) {
+ var entityType = udi.entityType;
+
+ if(udi.entityType === "document") {
+ entityType = "content";
+ }
+ return "#/" + entityType + "/" + entityType + "/edit/" + itemId;
+ }
+ return "#";
+ }
+
+ function close() {
+ navigationService.hideMenu(); // close menu
+ overlayService.close(); // close overlay
+ }
+
+ function referenceAnchorClicked($event, reference) {
+
+
+ if ($event.shiftKey || $event.ctrlKey || $event.metaKey) {
+ // we will let the browser take over here.
+ return;
+ }
+
+ $event.preventDefault();
+ close();
+
+ var editorModel = {
+ id: reference.id,
+ submit: function (model) {
+ editorService.close();
+ },
+ close: function () {
+ editorService.close();
+ }
+ };
+
+ overlayService.close();
+
+ // extract the entity type from the udi
+ var udi = udiParser.parse(reference.udi);
+
+ if (udi && udi.entityType === "document")
+ {
+ editorService.contentEditor(editorModel);
+ return;
+ }
+
+ if (udi && udi.entityType === "media")
+ {
+ editorService.mediaEditor(editorModel);
+ return;
+ }
+
+ if (udi && udi.entityType === "member")
+ {
+ editorModel.id = reference.key;
+ editorService.memberEditor(editorModel);
+ return;
+ }
+ }
+ }
+
+ var umbTrackedReferencesTableComponent = {
+ templateUrl: 'views/components/references/umb-tracked-references-table.html',
+ transclude: true,
+ bindings: {
+ pageNumber: "<",
+ totalPages: "<",
+ headline: "<",
+ items: "<",
+ showType: "",
+ showTypeName: "",
+ showRelationTypeName: "",
+ onPageChanged: "&"
+ },
+ controllerAs: 'vm',
+ controller: umbTrackedReferencesTableController
+ };
+
+ angular.module('umbraco.directives').component('umbTrackedReferencesTable', umbTrackedReferencesTableComponent);
+
+})();
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 87ba05467523..d426dcd5162b 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
@@ -3,7 +3,7 @@
* @name umbraco.resources.mediaResource
* @description Loads in data for media
**/
-function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
+function mediaResource($q, $http, umbDataFormatter, umbRequestHelper, trackedReferencesResource) {
/** internal method process the saving of data and post processing the result */
function saveMediaItem(content, action, files) {
@@ -552,36 +552,41 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
'Failed to retrieve media items for search: ' + query);
},
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#getPagedReferences
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Gets a page list of tracked references for the current item, so you can see where an item is being used
+ *
+ * @deprecated
+ * Use umbraco.resources.trackedReferencesResource#getPagedReferences instead
+ *
+ * ##usage
+ *
+ * var options = {
+ * pageSize : 25,
+ * pageNumber : 1,
+ * entityType : 'DOCUMENT'
+ * };
+ * trackedReferencesResource.getPagedReferences(1, options)
+ * .then(function(data) {
+ * console.log(data);
+ * });
+ *
+ *
+ * @param {int} id Id of the item to query for tracked references
+ * @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 {Int} args.entityType the type of tracked entity (default : DOCUMENT). Possible values DOCUMENT, MEDIA
+ * @returns {Promise} resourcePromise object.
+ *
+ */
getPagedReferences: function (id, options) {
-
- var defaults = {
- pageSize: 25,
- pageNumber: 1,
- entityType: "DOCUMENT"
- };
- if (options === undefined) {
- options = {};
- }
- //overwrite the defaults if there are any specified
- Utilities.extend(defaults, options);
- //now copy back to the options we will use
- options = defaults;
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetPagedReferences",
- {
- id: id,
- entityType: options.entityType,
- pageNumber: options.pageNumber,
- pageSize: options.pageSize
- }
- )),
- "Failed to retrieve usages for media of id " + id);
+ return trackedReferencesResource.getPagedReferences(id, options);
}
-
};
}
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
new file mode 100644
index 000000000000..cd64c89589ec
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/trackedreferences.resource.js
@@ -0,0 +1,178 @@
+/**
+ * @ngdoc service
+ * @name umbraco.resources.trackedReferencesResource
+ * @description Loads in data for tracked references
+ **/
+function trackedReferencesResource($q, $http, umbRequestHelper) {
+
+ return {
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.trackedReferencesResource#getPagedReferences
+ * @methodOf umbraco.resources.trackedReferencesResource
+ *
+ * @description
+ * Gets a page list of tracked references for the current item, so you can see where an item is being used
+ *
+ * ##usage
+ *
+ * var options = {
+ * pageSize : 25,
+ * pageNumber : 1,
+ * entityType : 'DOCUMENT'
+ * };
+ * trackedReferencesResource.getPagedReferences(1, options)
+ * .then(function(data) {
+ * console.log(data);
+ * });
+ *
+ *
+ * @param {int} id Id of the item to query for tracked references
+ * @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.
+ *
+ */
+ getPagedReferences: 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",
+ "GetPagedReferences",
+ {
+ id: id,
+ entityType: options.entityType,
+ pageNumber: options.pageNumber,
+ pageSize: options.pageSize,
+ filterMustBeIsDependency: options.filterMustBeIsDependency
+ }
+ )),
+ "Failed to retrieve usages for entity of id " + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.trackedReferencesResource#getPagedDescendantsInReferences
+ * @methodOf umbraco.resources.trackedReferencesResource
+ *
+ * @description
+ * Gets a page list of the child nodes of the current item used in any kind of relation
+ *
+ * ##usage
+ *
+ * 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 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.
+ *
+ */
+ 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",
+ "GetPagedDescendantsInReferences",
+ {
+ parentId: id,
+ entityType: options.entityType,
+ pageNumber: options.pageNumber,
+ pageSize: options.pageSize
+ }
+ )),
+ "Failed to retrieve usages for descendants of parent with id " + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.trackedReferencesResource#getPagedReferencedItems
+ * @methodOf umbraco.resources.trackedReferencesResource
+ *
+ * @description
+ * Checks if any of the items are used in a relation and returns a page list, so you can see which items are being used
+ *
+ * ##usage
+ *
+ * var ids = [123,3453,2334,2343];
+ * var options = {
+ * pageSize : 25,
+ * pageNumber : 1,
+ * entityType : 'DOCUMENT'
+ * };
+ *
+ * trackedReferencesResource.getPagedReferencedItems(ids, options)
+ * .then(function(data) {
+ * console.log(data);
+ * });
+ *
+ *
+ * @param {Array} ids array of the selected items ids to query for references
+ * @param {Object} options optional options object
+ * @param {Int} options.pageSize the pagesize of the returned list (default 25)
+ * @param {Int} options.pageNumber the current page index (default 1)
+ * @param {String} options.entityType the type of tracked entity (default : DOCUMENT). Possible values DOCUMENT, MEDIA
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getPagedReferencedItems: function (ids, options) {
+ var query = `entityType=${options.entityType}&pageNumber=${options.pageNumber}&pageSize=${options.pageSize}`;
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "trackedReferencesApiBaseUrl",
+ "getPagedReferencedItems",
+ query),
+ {
+ ids: ids,
+ entityType: options.entityType,
+ pageNumber: options.pageNumber,
+ pageSize: options.pageSize
+ }),
+ "Failed to check for references of nodes with ids " + ids);
+ }
+ }
+}
+
+angular.module('umbraco.resources').factory('trackedReferencesResource', trackedReferencesResource);
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js
index a8f62dca4b6d..38b56b766110 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js
@@ -461,6 +461,7 @@
alias: relationType.alias,
key: relationType.key,
isBidirectional: relationType.isBidirectional,
+ isDependency: relationType.isDependency,
parentObjectType: relationType.parentObjectType,
childObjectType: relationType.childObjectType
};
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less
index 12cce286d6d7..60020066c0e1 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less
@@ -10,6 +10,10 @@
.scoped-view{
display: none;
}
+
+ .abstract {
+ margin-bottom : 20px;
+ }
}
.umb-overlay__form {
@@ -51,7 +55,7 @@
}
.umb-overlay__title {
- font-size: 16px;
+ font-size: 20px;
color: @black;
line-height: 16px;
font-weight: bold;
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
index 6c1e5058d267..73ef47133caa 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
@@ -162,6 +162,7 @@ input.umb-table__input {
font-size: 14px;
font-weight: bold;
text-decoration: none;
+ cursor: pointer;
&:hover {
color: @ui-option-type-hover;
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
index 381880da2ee7..6429e39db629 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
@@ -20,6 +20,9 @@
+
+
+
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 1e72950410f2..010102b920af 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
@@ -3,7 +3,7 @@
-
+
@@ -27,131 +27,11 @@
-
-
-
-
-
- This Media item has no references.
-
-
-
-
-
-
-
-
-
-
- Used in Documents
-
-
-
-
-
-
-
Name
-
Alias
-
Open
-
-
-
-
-
-
{{::reference.name}}
-
{{::reference.alias}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Used in Members
-
-
-
-
-
-
-
Name
-
Alias
-
Open
-
-
-
-
-
-
{{::reference.name}}
-
{{::reference.alias}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Used in Media
-
-
-
-
-
-
-
Name
-
Alias
-
Open
-
-
-
-
-
-
{{::reference.name}}
-
{{::reference.alias}}
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/relationTypes/views/relationType.settings.controller.js b/src/Umbraco.Web.UI.Client/src/views/relationTypes/views/relationType.settings.controller.js
index c8e0af0aa9da..01b5367eabc7 100644
--- a/src/Umbraco.Web.UI.Client/src/views/relationTypes/views/relationType.settings.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/relationTypes/views/relationType.settings.controller.js
@@ -16,12 +16,17 @@ function RelationTypeSettingsController($scope, localizationService) {
var labelKeys = [
"relationType_parentToChild",
- "relationType_bidirectional"
+ "relationType_bidirectional",
+ "relationType_dependency",
+ "relationType_noDependency"
+
];
localizationService.localizeMany(labelKeys).then(function (data) {
vm.labels.parentToChild = data[0];
vm.labels.bidirectional = data[1];
+ vm.labels.dependency = data[2];
+ vm.labels.noDependency = data[3];
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
index 684ce6d2f0fd..79164a245757 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
@@ -374,7 +374,7 @@
}
function enableUser() {
- vm.enableUserButtonState = "busy";
+ vm.enableUserButtonState = "busfy";
usersResource.enableUsers([vm.user.id]).then(function (data) {
vm.user.userState = "Active";
setUserDisplayState();
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml
index 6364d58b5dca..d4d0d3ad4b6c 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml
@@ -2390,6 +2390,9 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
No relations for this Relation Type
Relation Type
Relations
+ Is Dependency
+ Yes
+ No
Getting Started
@@ -2467,6 +2470,15 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
Used in Documents
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.
+ This item or its descendants is being used. Deletion can lead to broken links on your website.
+ This item or its descendants is being used. Unpublishing can lead to broken links on your website. Please take the appropriate actions.
+ This item or its descendants is being used. Therefore, deletion has been disabled.
+ The following items you are trying to %0% are used by other content.
Delete Saved Search
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 e46e917a85cf..8e1396170e99 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
@@ -808,6 +808,7 @@
New
Next
No
+ Node Name
of
Off
OK
@@ -848,6 +849,7 @@
Submit
Success
Type
+ Type Name
Type to search...
under
Up
@@ -2466,6 +2468,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
Parent
Child
Count
+ Relation
Relations
Created
Comment
@@ -2473,6 +2476,9 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
No relations for this Relation Type
Relation Type
Relations
+ Is Dependency
+ Yes
+ No
Getting Started
@@ -2543,13 +2549,26 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
References
This Data Type has no references.
- Used in Document Types
- Used in Media Types
- Used in Member Types
- Used by
- Used in Documents
- Used in Members
- Used in Media
+ This item has no references.
+ Referenced by the following Document Types
+ Referenced by the following Media Types
+ Referenced by the following Member Types
+ Referenced by
+ Referenced by the following items
+ The following items depends on this
+ Referenced by the following Documents
+ Referenced by the following Members
+ Referenced by the following Media
+ The following items are referenced
+ The following descending items are referenced
+ The following descending items has dependencies
+ One or more of this item's descendants is being referenced in a media item.
+ One or more of this item's descendants is being referenced in a content item.
+ One or more of this item's descendants is being referenced in a member.
+ This item or its descendants is being referenced. Deletion can lead to broken links on your website.
+ This item or its descendants is being referenced. Unpublishing can lead to broken links on your website. Please take the appropriate actions.
+ This item or its descendants is being referenced. Therefore, deletion has been disabled.
+ The following items you are trying to %0% are referenced by other content.
Delete Saved Search
diff --git a/tests/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs b/tests/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs
index 2bd9dc124d31..bb16cadd78f9 100644
--- a/tests/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs
+++ b/tests/Umbraco.Tests.Common/Builders/RelationTypeBuilder.cs
@@ -8,7 +8,7 @@
namespace Umbraco.Cms.Tests.Common.Builders
{
public class RelationTypeBuilder
- : ChildBuilderBase,
+ : ChildBuilderBase,
IWithIdBuilder,
IWithAliasBuilder,
IWithNameBuilder,
@@ -23,6 +23,7 @@ public class RelationTypeBuilder
private DateTime? _deleteDate;
private int? _id;
private bool? _isBidirectional;
+ private bool? _isDependency;
private Guid? _key;
private string _name;
private Guid? _parentObjectType;
@@ -42,6 +43,12 @@ public RelationTypeBuilder WithIsBidirectional(bool isBidirectional)
{
_isBidirectional = isBidirectional;
return this;
+ }
+
+ public RelationTypeBuilder WithIsDependency(bool isDependency)
+ {
+ _isDependency = isDependency;
+ return this;
}
public RelationTypeBuilder WithChildObjectType(Guid childObjectType)
@@ -56,7 +63,7 @@ public RelationTypeBuilder WithParentObjectType(Guid parentObjectType)
return this;
}
- public override IRelationType Build()
+ public override IRelationTypeWithIsDependency Build()
{
var alias = _alias ?? Guid.NewGuid().ToString();
var name = _name ?? Guid.NewGuid().ToString();
@@ -65,11 +72,12 @@ public override IRelationType Build()
var id = _id ?? 0;
Guid key = _key ?? Guid.NewGuid();
var isBidirectional = _isBidirectional ?? false;
+ var isDependency = _isDependency ?? false;
DateTime createDate = _createDate ?? DateTime.Now;
DateTime updateDate = _updateDate ?? DateTime.Now;
DateTime? deleteDate = _deleteDate ?? null;
- return new RelationType(name, alias, isBidirectional, parentObjectType, childObjectType)
+ return new RelationType(name, alias, isBidirectional, parentObjectType, childObjectType, isDependency)
{
Id = id,
Key = key,
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationRepositoryTest.cs
index ee01816f09bc..bdd5257b452c 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationRepositoryTest.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationRepositoryTest.cs
@@ -189,23 +189,23 @@ public void Get_Paged_Parent_Entities_By_Child_Id()
// Get parent entities for child id
var parents = repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 11, out long totalRecords).ToList();
- Assert.AreEqual(6, totalRecords);
- Assert.AreEqual(6, parents.Count);
+ Assert.AreEqual(9, totalRecords);
+ Assert.AreEqual(9, parents.Count);
- // add the next page
+ // Add the next page
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 1, 11, out totalRecords));
- Assert.AreEqual(6, totalRecords);
- Assert.AreEqual(6, parents.Count);
+ Assert.AreEqual(9, totalRecords);
+ Assert.AreEqual(9, parents.Count);
var contentEntities = parents.OfType().ToList();
var mediaEntities = parents.OfType().ToList();
var memberEntities = parents.OfType().ToList();
Assert.AreEqual(3, contentEntities.Count);
- Assert.AreEqual(0, mediaEntities.Count);
+ Assert.AreEqual(3, mediaEntities.Count);
Assert.AreEqual(3, memberEntities.Count);
- // only of a certain type
+ // Only of a certain type
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Document.GetGuid()));
Assert.AreEqual(3, totalRecords);
@@ -213,7 +213,32 @@ public void Get_Paged_Parent_Entities_By_Child_Id()
Assert.AreEqual(3, totalRecords);
parents.AddRange(repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Media.GetGuid()));
- Assert.AreEqual(0, totalRecords);
+ Assert.AreEqual(3, totalRecords);
+
+ // Test relations on content
+ var contentParents = repository.GetPagedParentEntitiesByChildId(createdContent[0].Id, 0, int.MaxValue, out totalRecords).ToList();
+ Assert.AreEqual(6, totalRecords);
+ Assert.AreEqual(6, contentParents.Count);
+
+ // Test getting relations of specified relation types
+ var relatedMediaRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
+ var relatedContentRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedDocumentAlias);
+
+ parents = repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 0, 11, out totalRecords, new int[] { relatedContentRelType.Id, relatedMediaRelType.Id }).ToList();
+ Assert.AreEqual(6, totalRecords);
+ Assert.AreEqual(6, parents.Count);
+
+ parents = repository.GetPagedParentEntitiesByChildId(createdMedia[0].Id, 1, 11, out totalRecords, new int[] { relatedContentRelType.Id, relatedMediaRelType.Id }).ToList();
+ Assert.AreEqual(6, totalRecords);
+ Assert.AreEqual(0, parents.Count);
+
+ parents = repository.GetPagedParentEntitiesByChildId(createdContent[0].Id, 0, 6, out totalRecords, new int[] { relatedContentRelType.Id, relatedMediaRelType.Id }).ToList();
+ Assert.AreEqual(3, totalRecords);
+ Assert.AreEqual(3, parents.Count);
+
+ parents = repository.GetPagedParentEntitiesByChildId(createdContent[0].Id, 1, 6, out totalRecords, new int[] { relatedContentRelType.Id, relatedMediaRelType.Id }).ToList();
+ Assert.AreEqual(3, totalRecords);
+ Assert.AreEqual(0, parents.Count);
}
}
@@ -255,19 +280,19 @@ public void Get_Paged_Child_Entities_By_Parent_Id()
// Get parent entities for child id
var parents = repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 6, out long totalRecords).ToList();
- Assert.AreEqual(3, totalRecords);
- Assert.AreEqual(3, parents.Count);
+ Assert.AreEqual(6, totalRecords);
+ Assert.AreEqual(6, parents.Count);
- // add the next page
+ // Add the next page
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 1, 6, out totalRecords));
- Assert.AreEqual(3, totalRecords);
- Assert.AreEqual(3, parents.Count);
+ Assert.AreEqual(6, totalRecords);
+ Assert.AreEqual(6, parents.Count);
var contentEntities = parents.OfType().ToList();
var mediaEntities = parents.OfType().ToList();
var memberEntities = parents.OfType().ToList();
- Assert.AreEqual(0, contentEntities.Count);
+ Assert.AreEqual(3, contentEntities.Count);
Assert.AreEqual(3, mediaEntities.Count);
Assert.AreEqual(0, memberEntities.Count);
@@ -280,6 +305,18 @@ public void Get_Paged_Child_Entities_By_Parent_Id()
parents.AddRange(repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 100, out totalRecords, UmbracoObjectTypes.Member.GetGuid()));
Assert.AreEqual(0, totalRecords);
+
+ // Test getting relations of specified relation types
+ IRelationType relatedMediaRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
+ IRelationType relatedContentRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedDocumentAlias);
+
+ parents = repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 0, 6, out totalRecords, new int[] { relatedContentRelType.Id, relatedMediaRelType.Id }).ToList();
+ Assert.AreEqual(3, totalRecords);
+ Assert.AreEqual(3, parents.Count);
+
+ parents = repository.GetPagedChildEntitiesByParentId(createdContent[0].Id, 1, 6, out totalRecords, new int[] { relatedContentRelType.Id, relatedMediaRelType.Id }).ToList();
+ Assert.AreEqual(3, totalRecords);
+ Assert.AreEqual(0, parents.Count);
}
}
@@ -296,6 +333,15 @@ private void CreateTestDataForPagingTests(out List createdContent, out
createdContent.Add(c1);
}
+ // Create related content
+ var relatedContent = new List();
+ for (int i = 0; i < 3; i++)
+ {
+ Content c1 = ContentBuilder.CreateBasicContent(contentType);
+ ContentService.Save(c1);
+ relatedContent.Add(c1);
+ }
+
// Create media
createdMedia = new List();
MediaType imageType = MediaTypeBuilder.CreateImageMediaType("myImage");
@@ -313,14 +359,24 @@ private void CreateTestDataForPagingTests(out List createdContent, out
createdMembers = MemberBuilder.CreateSimpleMembers(memberType, 3).ToList();
GetMemberService().Save(createdMembers);
- IRelationType relType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
+ IRelationType relatedMediaRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedMediaAlias);
+ IRelationType relatedContentRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelatedDocumentAlias);
// Relate content to media
foreach (IContent content in createdContent)
{
foreach (IMedia media in createdMedia)
{
- RelationService.Relate(content.Id, media.Id, relType);
+ RelationService.Relate(content.Id, media.Id, relatedMediaRelType);
+ }
+ }
+
+ // Relate content to content
+ foreach (IContent relContent in relatedContent)
+ {
+ foreach (IContent content in createdContent)
+ {
+ RelationService.Relate(relContent.Id, content.Id, relatedContentRelType);
}
}
@@ -329,7 +385,67 @@ private void CreateTestDataForPagingTests(out List createdContent, out
{
foreach (IMedia media in createdMedia)
{
- RelationService.Relate(member.Id, media.Id, relType);
+ RelationService.Relate(member.Id, media.Id, relatedMediaRelType);
+ }
+ }
+
+ // Create copied content
+ var copiedContent = new List();
+ for (int i = 0; i < 3; i++)
+ {
+ Content c1 = ContentBuilder.CreateBasicContent(contentType);
+ ContentService.Save(c1);
+ copiedContent.Add(c1);
+ }
+
+ IRelationType copiedContentRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelateDocumentOnCopyAlias);
+
+ // Relate content to content (mimics copy)
+ foreach (IContent content in createdContent)
+ {
+ foreach (IContent cpContent in copiedContent)
+ {
+ RelationService.Relate(content.Id, cpContent.Id, copiedContentRelType);
+ }
+ }
+
+ // Create trashed content
+ var trashedContent = new List();
+ for (int i = 0; i < 3; i++)
+ {
+ Content c1 = ContentBuilder.CreateBasicContent(contentType);
+ ContentService.Save(c1);
+ trashedContent.Add(c1);
+ }
+
+ IRelationType trashedRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias);
+
+ // Relate to trashed content
+ foreach (IContent trContent in trashedContent)
+ {
+ foreach (IContent content in createdContent)
+ {
+ RelationService.Relate(trContent.Id, content.Id, trashedRelType);
+ }
+ }
+
+ // Create trashed media
+ var trashedMedia = new List();
+ for (int i = 0; i < 3; i++)
+ {
+ Media m1 = MediaBuilder.CreateMediaImage(imageType, -1);
+ MediaService.Save(m1);
+ trashedMedia.Add(m1);
+ }
+
+ IRelationType trashedMediaRelType = RelationService.GetRelationTypeByAlias(Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias);
+
+ // Relate to trashed media
+ foreach (IMedia trMedia in trashedMedia)
+ {
+ foreach (IMedia media in createdMedia)
+ {
+ RelationService.Relate(trMedia.Id, media.Id, trashedMediaRelType);
}
}
}
@@ -417,14 +533,16 @@ public void CreateTestData()
"relateContentOnCopy",
true,
Constants.ObjectTypes.Document,
- new Guid("C66BA18E-EAF3-4CFF-8A22-41B16D66A972"));
+ new Guid("C66BA18E-EAF3-4CFF-8A22-41B16D66A972"),
+ false);
_relateContentType = new RelationType(
"Relate ContentType on Copy",
"relateContentTypeOnCopy",
true,
Constants.ObjectTypes.DocumentType,
- new Guid("A2CB7800-F571-4787-9638-BC48539A0EFB"));
+ new Guid("A2CB7800-F571-4787-9638-BC48539A0EFB"),
+ false);
using (IScope scope = ScopeProvider.CreateScope())
{
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationTypeRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationTypeRepositoryTest.cs
index 4b0a23464f38..16c88e7cf9d3 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationTypeRepositoryTest.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/RelationTypeRepositoryTest.cs
@@ -36,7 +36,7 @@ public void Can_Perform_Add_On_RelationTypeRepository()
RelationTypeRepository repository = CreateRepository(provider);
// Act
- var relateMemberToContent = new RelationType("Relate Member to Content", "relateMemberToContent", true, Constants.ObjectTypes.Member, Constants.ObjectTypes.Document);
+ var relateMemberToContent = new RelationType("Relate Member to Content", "relateMemberToContent", true, Constants.ObjectTypes.Member, Constants.ObjectTypes.Document, true);
repository.Save(relateMemberToContent);
@@ -101,12 +101,13 @@ public void Can_Perform_Get_On_RelationTypeRepository()
RelationTypeRepository repository = CreateRepository(provider);
// Act
- IRelationType relationType = repository.Get(8);
+ var relationType = repository.Get(8) as IRelationTypeWithIsDependency;
// Assert
Assert.That(relationType, Is.Not.Null);
Assert.That(relationType.HasIdentity, Is.True);
Assert.That(relationType.IsBidirectional, Is.True);
+ Assert.That(relationType.IsDependency, Is.True);
Assert.That(relationType.Alias, Is.EqualTo("relateContentToMedia"));
Assert.That(relationType.Name, Is.EqualTo("Relate Content to Media"));
Assert.That(relationType.ChildObjectType, Is.EqualTo(Constants.ObjectTypes.Media));
@@ -215,9 +216,9 @@ public void Can_Perform_GetByQuery_On_RelationTypeRepository()
public void CreateTestData()
{
- var relateContent = new RelationType("Relate Content on Copy", "relateContentOnCopy", true, Constants.ObjectTypes.Document, Constants.ObjectTypes.Document);
- var relateContentType = new RelationType("Relate ContentType on Copy", "relateContentTypeOnCopy", true, Constants.ObjectTypes.DocumentType, Constants.ObjectTypes.DocumentType);
- var relateContentMedia = new RelationType("Relate Content to Media", "relateContentToMedia", true, Constants.ObjectTypes.Document, Constants.ObjectTypes.Media);
+ var relateContent = new RelationType("Relate Content on Copy", "relateContentOnCopy", true, Constants.ObjectTypes.Document, Constants.ObjectTypes.Document, false);
+ var relateContentType = new RelationType("Relate ContentType on Copy", "relateContentTypeOnCopy", true, Constants.ObjectTypes.DocumentType, Constants.ObjectTypes.DocumentType, false);
+ var relateContentMedia = new RelationType("Relate Content to Media", "relateContentToMedia", true, Constants.ObjectTypes.Document, Constants.ObjectTypes.Media, true);
IScopeProvider provider = ScopeProvider;
using (IScope scope = provider.CreateScope())
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceTests.cs
index 5b033fcd4269..4f0c489516bc 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceTests.cs
@@ -1970,7 +1970,7 @@ public void Can_Empty_RecycleBin_With_Content_That_Has_All_Related_Data()
UserService.Save(admin);
RelationService.Save(new RelationType("test", "test", false, Constants.ObjectTypes.Document,
- Constants.ObjectTypes.Document));
+ Constants.ObjectTypes.Document, false));
Assert.IsNotNull(RelationService.Relate(content1, content2, "test"));
PublicAccessService.Save(new PublicAccessEntry(content1, content2, content2,
diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/RelationServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/RelationServiceTests.cs
index 3edba867601b..0156100f0ae5 100644
--- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/RelationServiceTests.cs
+++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/RelationServiceTests.cs
@@ -266,4 +266,4 @@ private IEnumerable CreateRelations(int count)
// TODO: Create a relation for entities of the wrong Entity Type (GUID) based on the Relation Type's defined parent/child object types
}
-}
+}
\ No newline at end of file
diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationBuilderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationBuilderTests.cs
index 67f887d123dc..bde8b8f09281 100644
--- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationBuilderTests.cs
+++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationBuilderTests.cs
@@ -44,6 +44,7 @@ public void Is_Built_Correctly()
.WithAlias(relationTypeAlias)
.WithName(relationTypeName)
.WithIsBidirectional(false)
+ .WithIsDependency(true)
.WithParentObjectType(parentObjectType)
.WithChildObjectType(childObjectType)
.Done()
@@ -61,6 +62,8 @@ public void Is_Built_Correctly()
Assert.AreEqual(relationTypeAlias, relation.RelationType.Alias);
Assert.AreEqual(relationTypeName, relation.RelationType.Name);
Assert.IsFalse(relation.RelationType.IsBidirectional);
+
+ Assert.IsTrue((relation.RelationType as IRelationTypeWithIsDependency).IsDependency);
Assert.AreEqual(parentObjectType, relation.RelationType.ParentObjectType);
Assert.AreEqual(childObjectType, relation.RelationType.ChildObjectType);
}
diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationTypeBuilderTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationTypeBuilderTests.cs
index 877023f82f70..e99f5ae273a1 100644
--- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationTypeBuilderTests.cs
+++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.Common/Builders/RelationTypeBuilderTests.cs
@@ -26,11 +26,12 @@ public void Is_Built_Correctly()
var parentObjectType = Guid.NewGuid();
var childObjectType = Guid.NewGuid();
const bool isBidirectional = true;
+ const bool isDependency = true;
var builder = new RelationTypeBuilder();
// Act
- IRelationType relationType = builder
+ var relationType = builder
.WithId(id)
.WithAlias(alias)
.WithName(name)
@@ -41,6 +42,7 @@ public void Is_Built_Correctly()
.WithParentObjectType(parentObjectType)
.WithChildObjectType(childObjectType)
.WithIsBidirectional(isBidirectional)
+ .WithIsDependency(isDependency)
.Build();
// Assert
@@ -54,6 +56,7 @@ public void Is_Built_Correctly()
Assert.AreEqual(parentObjectType, relationType.ParentObjectType);
Assert.AreEqual(childObjectType, relationType.ChildObjectType);
Assert.AreEqual(isBidirectional, relationType.IsBidirectional);
+ Assert.AreEqual(isDependency, relationType.IsDependency);
}
}
}