diff --git a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs index 93a97355d9b4..e6e5c7006fe7 100644 --- a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs @@ -157,6 +157,8 @@ @keyframes umbraco-preview-badge--effect {{ internal const string StaticLoginBackgroundImage = "assets/img/login.jpg"; internal const string StaticLoginLogoImage = "assets/img/application/umbraco_logo_white.svg"; internal const bool StaticHideBackOfficeLogo = false; + internal const bool StaticDisableDeleteWhenReferenced = false; + internal const bool StaticDisableUnpublishWhenReferenced = false; /// /// Gets or sets a value for the content notification settings. @@ -226,6 +228,18 @@ @keyframes umbraco-preview-badge--effect {{ [DefaultValue(StaticHideBackOfficeLogo)] public bool HideBackOfficeLogo { get; set; } = StaticHideBackOfficeLogo; + /// + /// Gets or sets a value indicating whether to disable the deletion of items referenced by other items. + /// + [DefaultValue(StaticDisableDeleteWhenReferenced)] + public bool DisableDeleteWhenReferenced { get; set; } = StaticDisableDeleteWhenReferenced; + + /// + /// Gets or sets a value indicating whether to disable the unpublishing of items referenced by other items. + /// + [DefaultValue(StaticDisableUnpublishWhenReferenced)] + public bool DisableUnpublishWhenReferenced { get; set; } = StaticDisableUnpublishWhenReferenced; + /// /// Get or sets the model representing the global content version cleanup policy /// diff --git a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs index de49bf2f4dfd..02421c1deb10 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs @@ -100,7 +100,7 @@ internal async Task> BareMinimumServerVariablesAsync( var keepOnlyKeys = new Dictionary { {"umbracoUrls", new[] {"authenticationApiBaseUrl", "serverVarsJs", "externalLoginsUrl", "currentUserApiBaseUrl", "previewHubUrl", "iconApiBaseUrl"}}, - {"umbracoSettings", new[] {"allowPasswordReset", "imageFileTypes", "maxFileSize", "loginBackgroundImage", "loginLogoImage", "canSendRequiredEmail", "usernameIsEmail", "minimumPasswordLength", "minimumPasswordNonAlphaNum", "hideBackofficeLogo"}}, + {"umbracoSettings", new[] {"allowPasswordReset", "imageFileTypes", "maxFileSize", "loginBackgroundImage", "loginLogoImage", "canSendRequiredEmail", "usernameIsEmail", "minimumPasswordLength", "minimumPasswordNonAlphaNum", "hideBackofficeLogo", "disableDeleteWhenReferenced", "disableUnpublishWhenReferenced"}}, {"application", new[] {"applicationPath", "cacheBuster"}}, {"isDebuggingEnabled", new string[] { }}, {"features", new [] {"disabledFeatures"}} @@ -413,6 +413,8 @@ internal async Task> GetServerVariablesAsync() {"loginBackgroundImage", _contentSettings.LoginBackgroundImage}, {"loginLogoImage", _contentSettings.LoginLogoImage }, {"hideBackofficeLogo", _contentSettings.HideBackOfficeLogo }, + {"disableDeleteWhenReferenced", _contentSettings.DisableDeleteWhenReferenced }, + {"disableUnpublishWhenReferenced", _contentSettings.DisableUnpublishWhenReferenced }, {"showUserInvite", _emailSender.CanSendRequiredEmail()}, {"canSendRequiredEmail", _emailSender.CanSendRequiredEmail()}, {"showAllowSegmentationForDocumentTypes", false}, diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js index 5976d6810af3..771d1b928058 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js @@ -19,6 +19,7 @@ function ContentDeleteController($scope, $timeout, contentResource, treeService, $scope.checkingReferences = true; $scope.warningText = null; + $scope.disableDelete = false; $scope.performDelete = function() { @@ -85,9 +86,20 @@ function ContentDeleteController($scope, $timeout, contentResource, treeService, }; $scope.onReferencesWarning = () => { - localizationService.localize("references_deleteWarning").then((value) => { - $scope.warningText = value; - }); + // check if the deletion of items that have references has been disabled + if (Umbraco.Sys.ServerVariables.umbracoSettings.disableDeleteWhenReferenced) { + // this will only be set to true if we have a warning, indicating that this item or its descendants have reference + $scope.disableDelete = true; + + localizationService.localize("references_deleteDisabledWarning").then((value) => { + $scope.warningText = value; + }); + } + else { + localizationService.localize("references_deleteWarning").then((value) => { + $scope.warningText = value; + }); + } }; $scope.cancel = function() { diff --git a/src/Umbraco.Web.UI.Client/src/views/content/delete.html b/src/Umbraco.Web.UI.Client/src/views/content/delete.html index bb4558e0f54a..0100123e22c2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/delete.html @@ -10,7 +10,7 @@
-

+

Are you sure you want to delete {{currentNode.name}}?

@@ -28,7 +28,9 @@ When items are deleted from the recycle bin, they will be gone forever.
- + + + diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/unpublish.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/unpublish.controller.js index d739a8d3dc14..f6c0ea67f9e3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/unpublish.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/unpublish.controller.js @@ -117,6 +117,13 @@ vm.onReferencesWarning = () => { $scope.model.submitButtonStyle = "danger"; + + // check if the unpublishing of items that have references has been disabled + if (Umbraco.Sys.ServerVariables.umbracoSettings.disableUnpublishWhenReferenced) { + // this will only be disabled if we have a warning, indicating that this item or its descendants have reference + $scope.model.disableSubmitButton = true; + } + localizationService.localize("references_unpublishWarning").then((value) => { vm.warningText = value; }); diff --git a/src/Umbraco.Web.UI.Client/src/views/media/delete.html b/src/Umbraco.Web.UI.Client/src/views/media/delete.html index 2c817e8cb942..91c20bbb3aaa 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/delete.html @@ -10,7 +10,7 @@
-

+

Are you sure you want to delete {{currentNode.name}}?

@@ -24,7 +24,9 @@ When items are deleted from the recycle bin, they will be gone forever.
- + + + diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.delete.controller.js index ecaf9d32bbae..0761504b6bd8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/media.delete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/media.delete.controller.js @@ -10,6 +10,7 @@ function MediaDeleteController($scope, mediaResource, treeService, navigationSer $scope.checkingReferences = true; $scope.warningText = null; + $scope.disableDelete = false; $scope.performDelete = function() { @@ -73,9 +74,20 @@ function MediaDeleteController($scope, mediaResource, treeService, navigationSer }; $scope.onReferencesWarning = () => { - localizationService.localize("references_deleteWarning").then((value) => { - $scope.warningText = value; - }); + // check if the deletion of items that have references has been disabled + if (Umbraco.Sys.ServerVariables.umbracoSettings.disableDeleteWhenReferenced) { + // this will only be set to true if we have a warning, indicating that this item or its descendants have reference + $scope.disableDelete = true; + + localizationService.localize("references_deleteDisabledWarning").then((value) => { + $scope.warningText = value; + }); + } + else { + localizationService.localize("references_deleteWarning").then((value) => { + $scope.warningText = value; + }); + } }; $scope.close = function() { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.controller.js index 56a1e6032f06..85c8b8262080 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.controller.js @@ -5,6 +5,7 @@ var vm = this; vm.loading = true; + vm.disableDelete = false; function onInit() { $scope.model.hideSubmitButton = true; @@ -17,6 +18,13 @@ vm.onReferencesWarning = () => { $scope.model.submitButtonStyle = "danger"; + // check if the deletion of items that have references has been disabled + if (Umbraco.Sys.ServerVariables.umbracoSettings.disableDeleteWhenReferenced) { + // this will only be set to true if we have a warning, indicating that this item or its descendants have reference + vm.disableDelete = true; + $scope.model.disableSubmitButton = true; + } + localizationService.localize("general_delete").then(function (action) { localizationService.localize("references_listViewDialogWarning", [action.toLowerCase()]).then((value) => { vm.warningText = value; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.html index 7f5cb7b4cc51..698d0f570880 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/delete.html @@ -1,6 +1,6 @@
-

+

Are you sure you want to delete?

diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js index 7279223eef77..cf432c031876 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js @@ -75,6 +75,12 @@ vm.onReferencesWarning = () => { $scope.model.submitButtonStyle = "danger"; + // check if the unpublishing of items that have references has been disabled + if (Umbraco.Sys.ServerVariables.umbracoSettings.disableUnpublishWhenReferenced) { + // this will only be disabled if we have a warning, indicating that this item or its descendants have reference + $scope.model.disableSubmitButton = true; + } + localizationService.localize("content_unpublish").then(function (action) { localizationService.localize("references_listViewDialogWarning", [action.toLowerCase()]).then((value) => { vm.warningText = value; diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 4aa9ec6c7516..c5a1b2dedc10 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -2473,6 +2473,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont 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. 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..6679bc214eb1 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -2556,6 +2556,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont 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.