Merge remote-tracking branch 'origin/dev-v7' into temp8
# Conflicts: # src/Umbraco.Core/Models/UserExtensions.cs # src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs # src/Umbraco.Core/Persistence/Repositories/RepositoryBase.cs # src/Umbraco.Core/Services/ContentService.cs # src/Umbraco.Core/StringExtensions.cs # src/Umbraco.Tests/Migrations/Upgrades/SqlCeUpgradeTest.cs # src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs # src/Umbraco.Web.UI.Client/package-lock.json # src/Umbraco.Web.UI.Client/package.json # src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js # src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js # src/Umbraco.Web.UI.Client/src/views/common/overlays/linkpicker/linkpicker.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/checkboxlist/checkboxlist.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js # src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html # src/Umbraco.Web.UI.Client/src/views/propertyeditors/radiobuttons/radiobuttons.html # src/Umbraco.Web.UI/Umbraco/config/lang/da.xml # src/Umbraco.Web.UI/Umbraco/config/lang/fr.xml # src/Umbraco.Web.UI/Umbraco/config/lang/ru.xml # src/Umbraco.Web.UI/Umbraco/developer/RelationTypes/EditRelationType.aspx # src/Umbraco.Web.UI/umbraco/config/lang/en.xml # src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml # src/Umbraco.Web.UI/umbraco/config/lang/es.xml # src/Umbraco.Web/Editors/ContentController.cs # src/Umbraco.Web/HealthCheck/Checks/DataIntegrity/XmlDataIntegrityHealthCheck.cs # src/Umbraco.Web/HealthCheck/NotificationMethods/EmailNotificationMethod.cs # src/Umbraco.Web/Routing/ContentFinderByRedirectUrl.cs # src/Umbraco.Web/Trees/ContentTreeControllerBase.cs # src/Umbraco.Web/umbraco.presentation/umbraco/create/language.ascx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx # src/Umbraco.Web/umbraco.presentation/umbraco/developer/RelationTypes/EditRelationType.aspx.cs # src/Umbraco.Web/umbraco.presentation/umbraco/settings/editLanguage.aspx.cs # src/umbraco.cms/businesslogic/language/Language.cs
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
/// </returns>
|
||||
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];
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ namespace Umbraco.Core
|
||||
return new string(outputArray);
|
||||
}
|
||||
|
||||
private static readonly char[] CleanForXssChars = "*?(){}[];:%<>/\\|&'\"".ToCharArray();
|
||||
private static readonly char[] CleanForXssChars = "*?(){}[];:%<>/\\|&'+\"".ToCharArray();
|
||||
|
||||
/// <summary>
|
||||
/// Cleans string to aid in preventing xss attacks.
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,8 +33,10 @@
|
||||
<umb-property-editor model="preValue" is-pre-value="true"></umb-property-editor>
|
||||
</umb-property>
|
||||
|
||||
<button type="button" class="btn" ng-click="toggleEditListViewDataTypeSettings()"><localize key="general_close">Close</localize></button>
|
||||
<button type="button" class="btn btn-success" ng-click="saveListViewDataType()"><localize key="buttons_saveListView"></localize></button>
|
||||
<div class="text-right">
|
||||
<button type="button" class="btn btn-link" ng-click="toggleEditListViewDataTypeSettings()"><localize key="general_close">Close</localize></button>
|
||||
<button type="button" class="btn btn-success" ng-click="saveListViewDataType()"><localize key="buttons_saveListView"></localize></button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<select ng-model="model.value">
|
||||
<select ng-model="model.value" required>
|
||||
<option value="STRING">String</option>
|
||||
<option value="DECIMAL">Decimal</option>
|
||||
<option value="DATETIME">Date/time</option>
|
||||
<option value="INT">Integer</option>
|
||||
<option value="TEXT">Long string</option>
|
||||
</select>
|
||||
</select>
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
<input type="checkbox" name="checkboxlist"
|
||||
value="{{item.key}}"
|
||||
ng-model="item.checked"
|
||||
ng-change="changed(item)" />
|
||||
ng-change="changed(item)"
|
||||
ng-required="model.validation.mandatory && !model.value.length" />
|
||||
{{item.val}}
|
||||
</label>
|
||||
</li>
|
||||
|
||||
+9
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
+4
-2
@@ -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">
|
||||
<option></option>
|
||||
</select>
|
||||
|
||||
@@ -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"></select>
|
||||
ng-options="item.value as item.value for item in model.config.items"
|
||||
ng-required="model.validation.mandatory"></select>
|
||||
</div>
|
||||
|
||||
+4
@@ -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'
|
||||
}
|
||||
});
|
||||
|
||||
+1
-1
@@ -58,7 +58,7 @@
|
||||
|
||||
</div>
|
||||
|
||||
<div ui-sortable="sortableOptions" class="umb-cropsizes__sortable">
|
||||
<div ui-sortable="sortableOptions" class="umb-cropsizes__sortable" ng-model="model.value">
|
||||
<div class="control-group umb-prevalues-multivalues__listitem" ng-repeat="item in model.value">
|
||||
<i class="icon icon-navigation handle"></i>
|
||||
<div class="umb-prevalues-multivalues__left">
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@
|
||||
</div>
|
||||
|
||||
<div class="umb-nested-content__footer-bar" ng-hide="nodes.length >= maxItems">
|
||||
<a class="umb-nested-content__icon" ng-click="openNodeTypePicker($event)" prevent-default>
|
||||
<a href class="umb-nested-content__icon" ng-click="openNodeTypePicker($event)" prevent-default>
|
||||
<i class="icon icon-add"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -1,17 +1,12 @@
|
||||
<div class="umb-property-editor umb-radiobuttons" ng-controller="Umbraco.PropertyEditors.RadioButtonsController">
|
||||
<ul class="unstyled">
|
||||
<li ng-repeat="item in configItems track by item.id">
|
||||
<label class="radio umb-radiobuttons__label">
|
||||
<label class="radio">
|
||||
<input type="radio" name="{{htmlId}}"
|
||||
value="{{item.id}}"
|
||||
ng-model="model.value"
|
||||
class="umb-radiobuttons__input" />
|
||||
|
||||
<div class="umb-radiobuttons__state">
|
||||
<i class="umb-radiobuttons__icon icon-check" aria-hidden="true"></i>
|
||||
<span class="umb-radiobuttons__label-text">{{item.value}}</span>
|
||||
</div>
|
||||
ng-model="model.value" />
|
||||
{{item.value}}
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
/Umbraco/**
|
||||
/Umbraco_Client/**
|
||||
@@ -231,6 +231,7 @@
|
||||
<Content Include="Config\Splashes\noNodes.aspx" />
|
||||
<Content Include="Umbraco\Install\Views\Web.config" />
|
||||
<Content Include="App_Plugins\ModelsBuilder\package.manifest" />
|
||||
<Content Include=".eslintignore" />
|
||||
<None Include="Config\404handlers.Release.config">
|
||||
<DependentUpon>404handlers.config</DependentUpon>
|
||||
</None>
|
||||
|
||||
@@ -1001,8 +1001,10 @@ Mange hilsner fra Umbraco robotten
|
||||
<key alias="dictionaryItemSaved">Ordbogsnøgle gemt</key>
|
||||
<key alias="editContentPublishedHeader">Indhold publiceret</key>
|
||||
<key alias="editContentPublishedText">og nu synligt for besøgende</key>
|
||||
<key alias="editContentPublishedWithExpireDateText">og nu synligt for besøgende indtil {0}</key>
|
||||
<key alias="editContentSavedHeader">Indhold gemt</key>
|
||||
<key alias="editContentSavedText">Husk at publicere for at gøre det synligt for besøgende</key>
|
||||
<key alias="editContentSavedWithReleaseDateText">Ændringerne bliver publiceret den {0}</key>
|
||||
<key alias="editContentSendToPublish">Send til Godkendelse</key>
|
||||
<key alias="editContentSendToPublishText">Rettelser er blevet sendt til godkendelse</key>
|
||||
<key alias="editMediaSaved">Medie gemt</key>
|
||||
|
||||
@@ -1861,7 +1861,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à
|
||||
<key alias="notificationEmailsCheckSuccessMessage"><![CDATA[Un email de notification a été envoyé à <strong>%0%</strong>.]]></key>
|
||||
<key alias="notificationEmailsCheckErrorMessage"><![CDATA[L'adresse email de notification est toujours à sa valeur par défaut : <strong>%0%</strong>.]]></key>
|
||||
<key alias="scheduledHealthCheckEmailBody"><![CDATA[<html><body><p>Les résultats de l'exécution du Umbraco Health Checks planifiée le %0% à %1% sont les suivants :</p>%2%</body></html>]]></key>
|
||||
<key alias="scheduledHealthCheckEmailSubject">Statut du Umbraco Health Check</key>
|
||||
<key alias="scheduledHealthCheckEmailSubject">Statut du Umbraco Health Check: %0%</key>
|
||||
</area>
|
||||
<area alias="redirectUrls">
|
||||
<key alias="disableUrlTracker">Désactiver URL tracker</key>
|
||||
|
||||
@@ -781,7 +781,7 @@
|
||||
<key alias="notificationEmailsCheckSuccessMessage"><![CDATA[Адрес для отправки уведомлений установлен в <strong>%0%</strong>.]]></key>
|
||||
<key alias="notificationEmailsCheckErrorMessage"><![CDATA[Адрес для отправки уведомлений все еще установлен в значение по-умолчанию <strong>%0%</strong>.]]></key>
|
||||
<key alias="scheduledHealthCheckEmailBody"><![CDATA[<html><body><p>Зафиксированы следующие результаты автоматической проверки состояния Umbraco по расписанию, запущенной на %0% в %1%:</p>%2%</body></html>]]></key>
|
||||
<key alias="scheduledHealthCheckEmailSubject">Результат проверки состояния Umbraco</key>
|
||||
<key alias="scheduledHealthCheckEmailSubject">Результат проверки состояния Umbraco: %0%</key>
|
||||
</area>
|
||||
<area alias="help">
|
||||
<key alias="theBestUmbracoVideoTutorials">Лучшие обучающие видео-курсы по Umbraco</key>
|
||||
|
||||
@@ -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 @@
|
||||
<ItemTemplate>
|
||||
<tr>
|
||||
<td class="<%= this.ParentObjectType %>"> </td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "ParentText") %></td>
|
||||
<td><a href="<%# GetEditUrl(this.ParentObjectType, (int)DataBinder.Eval(Container.DataItem, "ParentId")) %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %></a></td>
|
||||
<td class="<%= this.RelationTypeDirection %>"> </td>
|
||||
<td class="<%= this.ChildObjectType %>"> </td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "ChildText") %></td>
|
||||
<td><a href="<%# GetEditUrl(this.ChildObjectType, (int)DataBinder.Eval(Container.DataItem, "ChildId")) %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %></a></td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "DateTime") %></td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "Comment") %></td>
|
||||
</tr>
|
||||
|
||||
@@ -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<EmailNotificationMethod>($"umbracoApplicationUrl {umbracoApplicationUrl} appears to be invalid");
|
||||
|
||||
var subject = _textService.Localize("healthcheck/scheduledHealthCheckEmailSubject", new[] { host });
|
||||
|
||||
var mailSender = new EmailSender();
|
||||
using (var mailMessage = CreateMailMessage(subject, message))
|
||||
|
||||
@@ -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<string> { "no-store, must-revalidate" };
|
||||
frequest.Headers = new Dictionary<string, string> { { "Pragma", "no-cache" }, { "Expires", "0" } };
|
||||
|
||||
if (redirectUrl == null)
|
||||
{
|
||||
_logger.Debug<ContentFinderByRedirectUrl>("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<ContentFinderByRedirectUrl>("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<string> { "no-store, must-revalidate" };
|
||||
frequest.Headers = new Dictionary<string, string> { { "Pragma", "no-cache" }, { "Expires", "0" } };
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-3
@@ -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 @@
|
||||
<ItemTemplate>
|
||||
<tr>
|
||||
<td class="<%= this.ParentObjectType %>"> </td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "ParentText") %></td>
|
||||
<td><a href="<%# GetEditUrl(this.ParentObjectType, (int)DataBinder.Eval(Container.DataItem, "ParentId")) %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "ParentText") %></a></td>
|
||||
<td class="<%= this.RelationTypeDirection %>"> </td>
|
||||
<td class="<%= this.ChildObjectType %>"> </td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "ChildText") %></td>
|
||||
<td><a href="<%# GetEditUrl(this.ChildObjectType, (int)DataBinder.Eval(Container.DataItem, "ChildId")) %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "ChildText") %></a></td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "DateTime") %></td>
|
||||
<td><%# DataBinder.Eval(Container.DataItem, "Comment") %></td>
|
||||
</tr>
|
||||
@@ -143,4 +145,4 @@
|
||||
</umb:Pane>
|
||||
|
||||
|
||||
</asp:Content>
|
||||
</asp:Content>
|
||||
|
||||
Reference in New Issue
Block a user