diff --git a/.github/CONTRIBUTING_DETAILED.md b/.github/CONTRIBUTING_DETAILED.md index b3e34ef55d..8c2bfffd87 100644 --- a/.github/CONTRIBUTING_DETAILED.md +++ b/.github/CONTRIBUTING_DETAILED.md @@ -19,7 +19,7 @@ When contributing code to Umbraco there's plenty of things you'll want to know, * [What branch should I target for my contributions?](#what-branch-should-i-target-for-my-contributions) * [Building Umbraco from source code](#building-umbraco-from-source-code) * [Keeping your Umbraco fork in sync with the main repository](#keeping-your-umbraco-fork-in-sync-with-the-main-repository) - + ## How Can I Contribute? ### Reporting Bugs @@ -52,7 +52,7 @@ Provide more context by answering these questions: Include details about your configuration and environment: - * **Which version of Umbraco are you using?** + * **Which version of Umbraco are you using?** * **What is the environment you're using Umbraco in?** Is this a problem on your local machine or on a server. Tell us about your configuration: Windows version, IIS/IISExpress, database type, etc. * **Which packages do you have installed?** @@ -80,7 +80,7 @@ The most successful pull requests usually look a like this: * Unit tests, while optional are awesome, thank you! * New code is commented with documentation from which [the reference documentation](https://our.umbraco.com/documentation/Reference/) is generated -Again, these are guidelines, not strict requirements. +Again, these are guidelines, not strict requirements. ## Making changes after the PR was opened @@ -90,7 +90,7 @@ If you make the corrections we ask for in the same branch and push them to your To be honest, we don't like rules very much. We trust you have the best of intentions and we encourage you to create working code. If it doesn't look perfect then we'll happily help clean it up. -That said, the Umbraco development team likes to follow the hints that ReSharper gives us (no problem if you don't have this installed) and we've added a `.editorconfig` file so that Visual Studio knows what to do with whitespace, line endings, etc. +That said, the Umbraco development team likes to follow the hints that ReSharper gives us (no problem if you don't have this installed) and we've added a `.editorconfig` file so that Visual Studio knows what to do with whitespace, line endings, etc. ## What should I know before I get started? @@ -125,6 +125,12 @@ We like to use [Gitflow as much as possible](https://jeffkreeftmeijer.com/git-fl ### Building Umbraco from source code +In order to build the Umbraco source code locally, first make sure you have the following installed. + + * Visual Studio 2017 v15.3+ + * Node v10+ (Installed via `build.bat` script. If you already have it installed, make sure you're running at least v10) + * npm v6.4.1+ (Installed via `build.bat` script. If you already have it installed, make sure you're running at least v6.4.1) + The easiest way to get started is to run `build.bat` which will build both the backoffice (also known as "Belle") and the Umbraco core. You can then easily start debugging from Visual Studio, or if you need to debug Belle you can run `gulp dev` in `src\Umbraco.Web.UI.Client`. See [this page](BUILD.md) for more details. Alternatively, you can open `src\umbraco.sln` in Visual Studio 2017 (version 15.3 or higher, [the community edition is free](https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15) for you to use to contribute to Open Source projects). In Visual Studio, find the Task Runner Explorer (in the View menu under Other Windows) and run the build task under the gulpfile. diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs index ea61228864..6733eea500 100644 --- a/src/Umbraco.Core/Models/UserExtensions.cs +++ b/src/Umbraco.Core/Models/UserExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net; +using System.Security.Cryptography; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Composing; @@ -55,8 +56,11 @@ namespace Umbraco.Core.Models /// internal static string[] GetUserAvatarUrls(this IUser user, ICacheProvider staticCache) { - //check if the user has explicitly removed all avatars including a gravatar, this will be possible and the value will be "none" - if (user.Avatar == "none") + // If FIPS is required, never check the Gravatar service as it only supports MD5 hashing. + // Unfortunately, if the FIPS setting is enabled on Windows, using MD5 will throw an exception + // and the website will not run. + // Also, check if the user has explicitly removed all avatars including a gravatar, this will be possible and the value will be "none" + if (user.Avatar == "none" || CryptoConfig.AllowOnlyFipsAlgorithms) { return new string[0]; } diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index 461b1d3c1e..b1e0b70ca5 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -188,7 +188,7 @@ namespace Umbraco.Core return new string(outputArray); } - private static readonly char[] CleanForXssChars = "*?(){}[];:%<>/\\|&'\"".ToCharArray(); + private static readonly char[] CleanForXssChars = "*?(){}[];:%<>/\\|&'+\"".ToCharArray(); /// /// Cleans string to aid in preventing xss attacks. diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index a4ea212ece..0974432a15 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -44,7 +44,7 @@ "autoprefixer": "9.3.1", "gulp-clean-css": "4.0.0", "cssnano": "4.1.7", - "gulp": "3.9.1", + "gulp-connect": "5.6.1", "gulp-babel": "8.0.0", "gulp-concat": "2.6.1", "gulp-connect": "5.6.1", @@ -60,13 +60,14 @@ "gulp-wrap": "0.14.0", "gulp-wrap-js": "0.4.1", "jasmine-core": "3.3.0", - "karma": "3.1.1", + "karma": "^3.1.3", "karma-jasmine": "2.0.1", "karma-phantomjs-launcher": "1.0.4", - "less": "3.9.0", + "less": "^3.9.0", "lodash": "4.17.11", "merge-stream": "1.0.1", - "run-sequence": "2.2.1", - "marked": "^0.5.2" + "run-sequence": "^2.2.1", + "marked": "^0.5.2", + "event-stream": "3.3.4" } } diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index 3f39c5c13f..a28c128706 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -116,7 +116,6 @@ @import "components/umb-confirm-action.less"; @import "components/umb-keyboard-shortcuts-overview.less"; @import "components/umb-checkbox-list.less"; -@import "components/umb-radiobuttons-list.less"; @import "components/umb-locked-field.less"; @import "components/umb-tabs.less"; @import "components/umb-load-indicator.less"; 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 6538a751f9..b2d6cda9b1 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less @@ -204,6 +204,7 @@ box-sizing: border-box; background: @gray-10; border-bottom: 1px solid @purple-l3; + pointer-events: none; } .umb-overlay__item-details-title-wrapper { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-radiobuttons-list.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-radiobuttons-list.less deleted file mode 100644 index 2fe3487a8f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-radiobuttons-list.less +++ /dev/null @@ -1,80 +0,0 @@ -.umb-radiobuttons{ - &__label{ - position: relative; - padding: 0; - - &-text{ - margin: 0 0 0 32px; - position: relative; - top: 1px; - } - } - - &__input{ - position: absolute; - top: 0; - left: 0; - opacity: 0; - - &:focus ~ .umb-radiobuttons__state{ - box-shadow: 0 1px 3px fade(@black, 12%), 0 1px 2px fade(@black, 24%); - } - - &:focus:checked ~ .umb-radiobuttons__state{ - box-shadow: none; - } - - &:checked ~ .umb-radiobuttons__state{ - &:before{ - width: 100%; - height: 100%; - } - } - - &:checked ~ .umb-radiobuttons__state .umb-radiobuttons__icon{ - opacity: 1; - } - } - - &__state{ - display: flex; - flex-wrap: wrap; - border: 1px solid @gray-8; - border-radius: 100%; - width: 22px; - height: 22px; - position: relative; - - &:before{ - content: ""; - background: @green; - width: 0; - height: 0; - transition: .1s ease-out; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - border-radius: 100%; - } - } - - &__icon{ - color: @white; - text-align: center; - font-size: 15px; - opacity: 0; - transition: .3s ease-out; - - &:before{ - position: absolute; - top: 2px; - right: 0; - left: 0; - bottom: 0; - margin: auto; - } - } -} diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html index 941ebd596e..5e291cfc14 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-list-view-settings.html @@ -33,8 +33,10 @@ - - +
+ + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html index 59b7c55c19..4146ba0763 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/valuetype.html @@ -1,7 +1,7 @@ - - \ No newline at end of file + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html index b287b0b58e..29760e3f5b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html @@ -6,7 +6,8 @@ + ng-change="changed(item)" + ng-required="model.validation.mandatory && !model.value.length" /> {{item.val}} diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js index f8e02a240a..3b341f7ac0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js @@ -77,8 +77,16 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo // if we run in single mode we'll store the value in a local variable // so we can pass an array as the model as our PropertyValueEditor expects that $scope.model.singleDropdownValue = ""; - if (!Object.toBoolean($scope.model.config.multiple)) { + if (!Object.toBoolean($scope.model.config.multiple) && $scope.model.value) { $scope.model.singleDropdownValue = Array.isArray($scope.model.value) ? $scope.model.value[0] : $scope.model.value; } + // if we run in multiple mode, make sure the model is an array (in case the property was previously saved in single mode) + // also explicitly set the model to null if it's an empty array, so mandatory validation works on the client + if ($scope.model.config.multiple === "1" && $scope.model.value) { + $scope.model.value = !Array.isArray($scope.model.value) ? [$scope.model.value] : $scope.model.value; + if ($scope.model.value.length === 0) { + $scope.model.value = null; + } + } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html index 3239e64acc..5f873e9e43 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html @@ -5,7 +5,8 @@ ng-switch-default ng-change="updateSingleDropdownValue()" ng-model="model.singleDropdownValue" - ng-options="item.value as item.value for item in model.config.items"> + ng-options="item.value as item.value for item in model.config.items" + ng-required="model.validation.mandatory"> @@ -15,5 +16,6 @@ ng-switch-when="true" multiple ng-model="model.value" - ng-options="item.value as item.value for item in model.config.items"> + ng-options="item.value as item.value for item in model.config.items" + ng-required="model.validation.mandatory"> diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js index 5a0b43d105..de56442239 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.controller.js @@ -69,4 +69,8 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.CropSizesControlle //there was an error, do the highlight (will be set back by the directive) $scope.hasError = true; }; + + $scope.sortableOptions = { + axis: 'y' + } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html index 86804fddb0..d11e176c2b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.prevalues.html @@ -58,7 +58,7 @@ -
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html index 0117bac92d..1ff6666907 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html @@ -37,7 +37,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html index a5fc2bfb39..7b9805d664 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html @@ -1,17 +1,12 @@ 
  • -
-
+
\ No newline at end of file diff --git a/src/Umbraco.Web.UI/.eslintignore b/src/Umbraco.Web.UI/.eslintignore new file mode 100644 index 0000000000..6cac59fac0 --- /dev/null +++ b/src/Umbraco.Web.UI/.eslintignore @@ -0,0 +1,3 @@ + +/Umbraco/** +/Umbraco_Client/** diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index b87bcb2b23..9d05272b4c 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -231,6 +231,7 @@ + 404handlers.config diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml index 7864d3baae..1289db1c0f 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml @@ -1001,8 +1001,10 @@ Mange hilsner fra Umbraco robotten Ordbogsnøgle gemt Indhold publiceret og nu synligt for besøgende + og nu synligt for besøgende indtil {0} Indhold gemt Husk at publicere for at gøre det synligt for besøgende + Ændringerne bliver publiceret den {0} Send til Godkendelse Rettelser er blevet sendt til godkendelse Medie gemt diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/fr.xml index 73f213b8bc..88d05d85ce 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/fr.xml @@ -1861,7 +1861,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à %0%.]]> %0%.]]>

Les résultats de l'exécution du Umbraco Health Checks planifiée le %0% à %1% sont les suivants :

%2%]]>
- Statut du Umbraco Health Check + Statut du Umbraco Health Check: %0% Désactiver URL tracker diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml index 3280d99997..94c00c3d1c 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml @@ -781,7 +781,7 @@ %0%.]]> %0%.]]>

Зафиксированы следующие результаты автоматической проверки состояния Umbraco по расписанию, запущенной на %0% в %1%:

%2%]]>
- Результат проверки состояния Umbraco + Результат проверки состояния Umbraco: %0% Лучшие обучающие видео-курсы по Umbraco diff --git a/src/Umbraco.Web.UI/Umbraco/developer/RelationTypes/EditRelationType.aspx b/src/Umbraco.Web.UI/Umbraco/developer/RelationTypes/EditRelationType.aspx index da2aed25cb..f93f4c0920 100644 --- a/src/Umbraco.Web.UI/Umbraco/developer/RelationTypes/EditRelationType.aspx +++ b/src/Umbraco.Web.UI/Umbraco/developer/RelationTypes/EditRelationType.aspx @@ -11,6 +11,8 @@ table.relations td { background: transparent none no-repeat scroll center center } + table.relations td a { text-decoration: underline; } + /* objectType icons */ table.relations td.ContentItemType {} table.relations td.ROOT {} @@ -122,10 +124,10 @@   - <%# DataBinder.Eval(Container.DataItem, "ParentText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %>     - <%# DataBinder.Eval(Container.DataItem, "ChildText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %> <%# DataBinder.Eval(Container.DataItem, "DateTime") %> <%# DataBinder.Eval(Container.DataItem, "Comment") %> diff --git a/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs b/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs index a38a15608d..26fd8b3720 100644 --- a/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs +++ b/src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs @@ -1,9 +1,11 @@ using System; +using System.Collections.Generic; using System.Net.Mail; using System.Threading; using System.Threading.Tasks; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; using Umbraco.Core.Services; namespace Umbraco.Web.HealthCheck.NotificationMethods @@ -48,7 +50,17 @@ namespace Umbraco.Web.HealthCheck.NotificationMethods results.ResultsAsHtml(Verbosity) }); - var subject = _textService.Localize("healthcheck/scheduledHealthCheckEmailSubject"); + // Include the umbraco Application URL host in the message subject so that + // you can identify the site that these results are for. + var umbracoApplicationUrl = ApplicationContext.Current.UmbracoApplicationUrl; + var host = umbracoApplicationUrl; + + if (Uri.TryCreate(umbracoApplicationUrl, UriKind.Absolute, out var umbracoApplicationUri)) + host = umbracoApplicationUri.Host; + else + LogHelper.Debug($"umbracoApplicationUrl {umbracoApplicationUrl} appears to be invalid"); + + var subject = _textService.Localize("healthcheck/scheduledHealthCheckEmailSubject", new[] { host }); var mailSender = new EmailSender(); using (var mailMessage = CreateMailMessage(subject, message)) diff --git a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs b/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs index ee495b6d7d..c36b2fded1 100644 --- a/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs +++ b/src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs @@ -38,14 +38,6 @@ namespace Umbraco.Web.Routing var redirectUrl = _redirectUrlService.GetMostRecentRedirectUrl(route); - // From: http://stackoverflow.com/a/22468386/5018 - // See http://issues.umbraco.org/issue/U4-8361#comment=67-30532 - // Setting automatic 301 redirects to not be cached because browsers cache these very aggressively which then leads - // to problems if you rename a page back to it's original name or create a new page with the original name - frequest.Cacheability = HttpCacheability.NoCache; - frequest.CacheExtensions = new List { "no-store, must-revalidate" }; - frequest.Headers = new Dictionary { { "Pragma", "no-cache" }, { "Expires", "0" } }; - if (redirectUrl == null) { _logger.Debug("No match for route: {Route}", route); @@ -60,8 +52,21 @@ namespace Umbraco.Web.Routing return false; } + // Apending any querystring from the incoming request to the redirect url. + url = string.IsNullOrEmpty(contentRequest.Uri.Query) ? url : url + contentRequest.Uri.Query; + _logger.Debug("Route {Route} matches content {ContentId} with url '{Url}', redirecting.", route, content.Id, url); frequest.SetRedirectPermanent(url); + + + // From: http://stackoverflow.com/a/22468386/5018 + // See http://issues.umbraco.org/issue/U4-8361#comment=67-30532 + // Setting automatic 301 redirects to not be cached because browsers cache these very aggressively which then leads + // to problems if you rename a page back to it's original name or create a new page with the original name + frequest.Cacheability = HttpCacheability.NoCache; + frequest.CacheExtensions = new List { "no-store, must-revalidate" }; + frequest.Headers = new Dictionary { { "Pragma", "no-cache" }, { "Expires", "0" } }; + return true; } } diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index 0788b36d42..e98f723501 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -391,6 +391,11 @@ namespace Umbraco.Web.Trees foreach (var m in notAllowed) { menuWithAllItems.Items.Remove(m); + // if the disallowed action is set as default action, make sure to reset the default action as well + if (menuWithAllItems.DefaultMenuAlias == m.Alias) + { + menuWithAllItems.DefaultMenuAlias = null; + } } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx index b81a8c4e5f..aa7e92d598 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx @@ -11,6 +11,8 @@ table.relations td { background: transparent none no-repeat scroll center center } + table.relations td a { text-decoration: underline; } + /* objectType icons */ table.relations td.ContentItemType {} table.relations td.ROOT {} @@ -123,10 +125,10 @@   - <%# DataBinder.Eval(Container.DataItem, "ParentText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %>     - <%# DataBinder.Eval(Container.DataItem, "ChildText") %> + " target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %> <%# DataBinder.Eval(Container.DataItem, "DateTime") %> <%# DataBinder.Eval(Container.DataItem, "Comment") %> @@ -143,4 +145,4 @@ - \ No newline at end of file +