mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-26 03:40:56 +08:00
Merge branch '1.9.x' into 1.10.x
Conflicts: src/Orchard.Specs/MultiTenancy.feature src/Orchard.Web/Config/HostComponents.config src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/TermAdminController.cs src/Orchard/Environment/DefaultOrchardHost.cs src/Rebracer.xml
This commit is contained in:
@@ -25,6 +25,7 @@ Scenario: A new tenant is created
|
|||||||
And I fill in
|
And I fill in
|
||||||
| name | value |
|
| name | value |
|
||||||
| Name | Scott |
|
| Name | Scott |
|
||||||
|
| RequestUrlPrefix | scott |
|
||||||
And I hit "Save"
|
And I hit "Save"
|
||||||
And I am redirected
|
And I am redirected
|
||||||
Then I should see "<h3>Scott\s*</h3>"
|
Then I should see "<h3>Scott\s*</h3>"
|
||||||
@@ -37,6 +38,7 @@ Scenario: A new tenant is created with uninitialized state
|
|||||||
And I fill in
|
And I fill in
|
||||||
| name | value |
|
| name | value |
|
||||||
| Name | Scott |
|
| Name | Scott |
|
||||||
|
| RequestUrlPrefix | scott |
|
||||||
And I hit "Save"
|
And I hit "Save"
|
||||||
And I am redirected
|
And I am redirected
|
||||||
Then I should see "<li class="tenant Uninitialized">"
|
Then I should see "<li class="tenant Uninitialized">"
|
||||||
@@ -199,4 +201,4 @@ Scenario: Listing tenants from command line
|
|||||||
And I have tenant "Alpha" on "example.org" as "New-site-name"
|
And I have tenant "Alpha" on "example.org" as "New-site-name"
|
||||||
When I execute >tenant list
|
When I execute >tenant list
|
||||||
Then I should see "Name: Alpha"
|
Then I should see "Name: Alpha"
|
||||||
And I should see "Request URL host: example.org"
|
And I should see "Request URL host: example.org"
|
||||||
|
|||||||
6
src/Orchard.Specs/MultiTenancy.feature.cs
generated
6
src/Orchard.Specs/MultiTenancy.feature.cs
generated
@@ -129,6 +129,9 @@ this.ScenarioSetup(scenarioInfo);
|
|||||||
table1.AddRow(new string[] {
|
table1.AddRow(new string[] {
|
||||||
"Name",
|
"Name",
|
||||||
"Scott"});
|
"Scott"});
|
||||||
|
table1.AddRow(new string[] {
|
||||||
|
"RequestUrlPrefix",
|
||||||
|
"scott"});
|
||||||
#line 25
|
#line 25
|
||||||
testRunner.And("I fill in", ((string)(null)), table1, "And ");
|
testRunner.And("I fill in", ((string)(null)), table1, "And ");
|
||||||
#line 28
|
#line 28
|
||||||
@@ -163,6 +166,9 @@ this.ScenarioSetup(scenarioInfo);
|
|||||||
table2.AddRow(new string[] {
|
table2.AddRow(new string[] {
|
||||||
"Name",
|
"Name",
|
||||||
"Scott"});
|
"Scott"});
|
||||||
|
table2.AddRow(new string[] {
|
||||||
|
"RequestUrlPrefix",
|
||||||
|
"scott"});
|
||||||
#line 37
|
#line 37
|
||||||
testRunner.And("I fill in", ((string)(null)), table2, "And ");
|
testRunner.And("I fill in", ((string)(null)), table2, "And ");
|
||||||
#line 40
|
#line 40
|
||||||
|
|||||||
@@ -120,5 +120,13 @@
|
|||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
|
|
||||||
|
<Component Type="Orchard.Environment.DefaultOrchardHost">
|
||||||
|
<Properties>
|
||||||
|
<!-- The number of retries when a tenant can't be loaded -->
|
||||||
|
<Property Name="Retries" Value="1"/>
|
||||||
|
<Property Name="DelayRetries" Value="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
|
||||||
</Components>
|
</Components>
|
||||||
</HostComponents>
|
</HostComponents>
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Orchard.DynamicForms.Drivers {
|
|||||||
|
|
||||||
var bindingsEditor = context.ShapeFactory.EditorTemplate(TemplateName: "FormBindings", Model: viewModel);
|
var bindingsEditor = context.ShapeFactory.EditorTemplate(TemplateName: "FormBindings", Model: viewModel);
|
||||||
|
|
||||||
bindingsEditor.Metadata.Position = "Bindings:10";
|
bindingsEditor.Metadata.Position = "Bindings:20";
|
||||||
|
|
||||||
return Editor(context, bindingsEditor);
|
return Editor(context, bindingsEditor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ namespace Orchard.DynamicForms.Drivers {
|
|||||||
_IsRequired: shape.Checkbox(
|
_IsRequired: shape.Checkbox(
|
||||||
Id: "IsMandatory",
|
Id: "IsMandatory",
|
||||||
Name: "IsMandatory",
|
Name: "IsMandatory",
|
||||||
Title: "Mandatory",
|
Title: "Required",
|
||||||
Value: "true",
|
Value: "true",
|
||||||
Description: T("Tick this checkbox to make this check box element mandatory.")),
|
Description: T("Tick this checkbox to make this check box element required.")),
|
||||||
_CustomValidationMessage: shape.Textbox(
|
_CustomValidationMessage: shape.Textbox(
|
||||||
Id: "CustomValidationMessage",
|
Id: "CustomValidationMessage",
|
||||||
Name: "CustomValidationMessage",
|
Name: "CustomValidationMessage",
|
||||||
|
|||||||
@@ -82,7 +82,6 @@ namespace Orchard.DynamicForms.Drivers {
|
|||||||
Name: "HtmlEncode",
|
Name: "HtmlEncode",
|
||||||
Title: "Html Encode",
|
Title: "Html Encode",
|
||||||
Value: "true",
|
Value: "true",
|
||||||
Checked: true,
|
|
||||||
Description: T("Check this option to automatically HTML encode submitted values to prevent code injection.")),
|
Description: T("Check this option to automatically HTML encode submitted values to prevent code injection.")),
|
||||||
_CreateContent: shape.Checkbox(
|
_CreateContent: shape.Checkbox(
|
||||||
Id: "CreateContent",
|
Id: "CreateContent",
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace Orchard.DynamicForms.Elements {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public bool HtmlEncode {
|
public bool HtmlEncode {
|
||||||
get { return this.Retrieve(x => x.HtmlEncode, () => true); }
|
get { return this.Retrieve(x => x.HtmlEncode); }
|
||||||
set { this.Store(x => x.HtmlEncode, value); }
|
set { this.Store(x => x.HtmlEncode, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace Orchard.DynamicForms.ValidationRules {
|
|||||||
|
|
||||||
private LocalizedString GetValidationMessage(ValidationContext context) {
|
private LocalizedString GetValidationMessage(ValidationContext context) {
|
||||||
return String.IsNullOrWhiteSpace(ErrorMessage)
|
return String.IsNullOrWhiteSpace(ErrorMessage)
|
||||||
? T("{0} is a mandatory field.", context.FieldName)
|
? T("{0} is a required field.", context.FieldName)
|
||||||
: T(ErrorMessage);
|
: T(ErrorMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ namespace Orchard.Lists {
|
|||||||
builder.Describe("ListNavigation").OnDisplaying(context => {
|
builder.Describe("ListNavigation").OnDisplaying(context => {
|
||||||
var containable = (ContainablePart) context.Shape.ContainablePart;
|
var containable = (ContainablePart) context.Shape.ContainablePart;
|
||||||
var container = _containerService.Value.GetContainer(containable, VersionOptions.Latest);
|
var container = _containerService.Value.GetContainer(containable, VersionOptions.Latest);
|
||||||
|
if (container == null) return;
|
||||||
|
|
||||||
var previous = _containerService.Value.Previous(container.Id, containable);
|
var previous = _containerService.Value.Previous(container.Id, containable);
|
||||||
var next = _containerService.Value.Next(container.Id, containable);
|
var next = _containerService.Value.Next(container.Id, containable);
|
||||||
|
|
||||||
@@ -32,4 +34,4 @@ namespace Orchard.Lists {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
@using Orchard.ContentManagement;
|
@using Orchard.ContentManagement;
|
||||||
@{
|
@{
|
||||||
Style.Require("jQueryColorBox");
|
Style.Require("jQueryColorBox");
|
||||||
Style.Include("nprogress.css", "nprogress.min.css");
|
Style.Include("nprogress.css");
|
||||||
Style.Include("common-admin.css", "common-admin.min.css");
|
Style.Include("common-admin.css", "common-admin.min.css");
|
||||||
Style.Include("list-admin.css", "list-admin.min.css");
|
Style.Include("list-admin.css", "list-admin.min.css");
|
||||||
Script.Require("ContentPicker").AtFoot();
|
Script.Require("ContentPicker").AtFoot();
|
||||||
@@ -39,4 +39,4 @@
|
|||||||
</div>
|
</div>
|
||||||
@if (Model.ListNavigation != null) {
|
@if (Model.ListNavigation != null) {
|
||||||
@Display(Model.ListNavigation)
|
@Display(Model.ListNavigation)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,18 +6,21 @@ html.dyn #main ul.features button { display:none; }
|
|||||||
.features.detail-view .category > ul {
|
.features.detail-view .category > ul {
|
||||||
border:1px solid #EAEAEA;
|
border:1px solid #EAEAEA;
|
||||||
margin-bottom:2em;
|
margin-bottom:2em;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
.features.summary-view .category {
|
.features.summary-view .category {
|
||||||
overflow:hidden;
|
|
||||||
padding-bottom:1em;
|
padding-bottom:1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.features.summary-view .category > ul {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
.features.summary-view .feature {
|
.features.summary-view .feature {
|
||||||
border:1px solid #EAEAEA;
|
border:1px solid #EAEAEA;
|
||||||
display:block;
|
|
||||||
float:left;
|
|
||||||
height:6em;
|
|
||||||
margin:0 .5% 1% .5%;
|
margin:0 .5% 1% .5%;
|
||||||
position:relative;
|
|
||||||
width:32%;
|
width:32%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,10 @@ namespace Orchard.MultiTenancy.Controllers {
|
|||||||
ModelState.AddModelError("Name", T("Invalid tenant name. Must contain characters only and no spaces.").Text);
|
ModelState.AddModelError("Name", T("Invalid tenant name. Must contain characters only and no spaces.").Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!string.Equals(viewModel.Name, "default", StringComparison.OrdinalIgnoreCase) && string.IsNullOrWhiteSpace( viewModel.RequestUrlHost) && string.IsNullOrWhiteSpace(viewModel.RequestUrlPrefix)) {
|
||||||
|
ModelState.AddModelError("RequestUrlHostRequestUrlPrefix", T("RequestUrlHost and RequestUrlPrefix can not be empty at the same time.").Text);
|
||||||
|
}
|
||||||
|
|
||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
return View(viewModel);
|
return View(viewModel);
|
||||||
}
|
}
|
||||||
@@ -143,6 +147,10 @@ namespace Orchard.MultiTenancy.Controllers {
|
|||||||
if (tenant == null)
|
if (tenant == null)
|
||||||
return HttpNotFound();
|
return HttpNotFound();
|
||||||
|
|
||||||
|
if (!string.Equals(viewModel.Name, "default", StringComparison.OrdinalIgnoreCase) && string.IsNullOrWhiteSpace(viewModel.RequestUrlHost) && string.IsNullOrWhiteSpace(viewModel.RequestUrlPrefix)) {
|
||||||
|
ModelState.AddModelError("RequestUrlHostRequestUrlPrefix", T("RequestUrlHost and RequestUrlPrefix can not be empty at the same time.").Text);
|
||||||
|
}
|
||||||
|
|
||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
return View(viewModel);
|
return View(viewModel);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
|
|
||||||
// State.
|
// State.
|
||||||
private CacheSettings _cacheSettings;
|
private CacheSettings _cacheSettings;
|
||||||
|
private CacheRouteConfig _cacheRouteConfig;
|
||||||
private DateTime _now;
|
private DateTime _now;
|
||||||
private WorkContext _workContext;
|
private WorkContext _workContext;
|
||||||
private string _cacheKey;
|
private string _cacheKey;
|
||||||
@@ -94,6 +95,13 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
_now = _clock.UtcNow;
|
_now = _clock.UtcNow;
|
||||||
_workContext = _workContextAccessor.GetContext();
|
_workContext = _workContextAccessor.GetContext();
|
||||||
|
|
||||||
|
var configurations = _cacheService.GetRouteConfigs();
|
||||||
|
if (configurations.Any()) {
|
||||||
|
var route = filterContext.Controller.ControllerContext.RouteData.Route;
|
||||||
|
var key = _cacheService.GetRouteDescriptorKey(filterContext.HttpContext, route);
|
||||||
|
_cacheRouteConfig = configurations.FirstOrDefault(c => c.RouteKey == key);
|
||||||
|
}
|
||||||
|
|
||||||
if (!RequestIsCacheable(filterContext))
|
if (!RequestIsCacheable(filterContext))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -182,16 +190,8 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
|
|
||||||
Logger.Debug("Item '{0}' was rendered.", _cacheKey);
|
Logger.Debug("Item '{0}' was rendered.", _cacheKey);
|
||||||
|
|
||||||
// Obtain individual route configuration, if any.
|
|
||||||
CacheRouteConfig configuration = null;
|
if (!ResponseIsCacheable(filterContext)) {
|
||||||
var configurations = _cacheService.GetRouteConfigs();
|
|
||||||
if (configurations.Any()) {
|
|
||||||
var route = filterContext.Controller.ControllerContext.RouteData.Route;
|
|
||||||
var key = _cacheService.GetRouteDescriptorKey(filterContext.HttpContext, route);
|
|
||||||
configuration = configurations.FirstOrDefault(c => c.RouteKey == key);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ResponseIsCacheable(filterContext, configuration)) {
|
|
||||||
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
|
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
|
||||||
filterContext.HttpContext.Response.Cache.SetNoStore();
|
filterContext.HttpContext.Response.Cache.SetNoStore();
|
||||||
filterContext.HttpContext.Response.Cache.SetMaxAge(new TimeSpan(0));
|
filterContext.HttpContext.Response.Cache.SetMaxAge(new TimeSpan(0));
|
||||||
@@ -199,8 +199,8 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine duration and grace time.
|
// Determine duration and grace time.
|
||||||
var cacheDuration = configuration != null && configuration.Duration.HasValue ? configuration.Duration.Value : CacheSettings.DefaultCacheDuration;
|
var cacheDuration = _cacheRouteConfig != null && _cacheRouteConfig.Duration.HasValue ? _cacheRouteConfig.Duration.Value : CacheSettings.DefaultCacheDuration;
|
||||||
var cacheGraceTime = configuration != null && configuration.GraceTime.HasValue ? configuration.GraceTime.Value : CacheSettings.DefaultCacheGraceTime;
|
var cacheGraceTime = _cacheRouteConfig != null && _cacheRouteConfig.GraceTime.HasValue ? _cacheRouteConfig.GraceTime.Value : CacheSettings.DefaultCacheGraceTime;
|
||||||
|
|
||||||
// Include each content item ID as tags for the cache entry.
|
// Include each content item ID as tags for the cache entry.
|
||||||
var contentItemIds = _displayedContentItemHandler.GetDisplayed().Select(x => x.ToString(CultureInfo.InvariantCulture)).ToArray();
|
var contentItemIds = _displayedContentItemHandler.GetDisplayed().Select(x => x.ToString(CultureInfo.InvariantCulture)).ToArray();
|
||||||
@@ -209,6 +209,15 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
var response = filterContext.HttpContext.Response;
|
var response = filterContext.HttpContext.Response;
|
||||||
var captureStream = new CaptureStream(response.Filter);
|
var captureStream = new CaptureStream(response.Filter);
|
||||||
response.Filter = captureStream;
|
response.Filter = captureStream;
|
||||||
|
|
||||||
|
// Add ETag header for the newly created item
|
||||||
|
var etag = Guid.NewGuid().ToString("n");
|
||||||
|
if (HttpRuntime.UsingIntegratedPipeline) {
|
||||||
|
if (response.Headers.Get("ETag") == null) {
|
||||||
|
response.Headers["ETag"] = etag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
captureStream.Captured += (output) => {
|
captureStream.Captured += (output) => {
|
||||||
try {
|
try {
|
||||||
// Since this is a callback any call to injected dependencies can result in an Autofac exception: "Instances
|
// Since this is a callback any call to injected dependencies can result in an Autofac exception: "Instances
|
||||||
@@ -229,12 +238,12 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
Url = filterContext.HttpContext.Request.Url.AbsolutePath,
|
Url = filterContext.HttpContext.Request.Url.AbsolutePath,
|
||||||
Tenant = scope.Resolve<ShellSettings>().Name,
|
Tenant = scope.Resolve<ShellSettings>().Name,
|
||||||
StatusCode = response.StatusCode,
|
StatusCode = response.StatusCode,
|
||||||
Tags = new[] { _invariantCacheKey }.Union(contentItemIds).ToArray()
|
Tags = new[] { _invariantCacheKey }.Union(contentItemIds).ToArray(),
|
||||||
|
ETag = etag
|
||||||
};
|
};
|
||||||
|
|
||||||
// Write the rendered item to the cache.
|
// Write the rendered item to the cache.
|
||||||
var cacheStorageProvider = scope.Resolve<IOutputCacheStorageProvider>();
|
var cacheStorageProvider = scope.Resolve<IOutputCacheStorageProvider>();
|
||||||
cacheStorageProvider.Remove(_cacheKey);
|
|
||||||
cacheStorageProvider.Set(_cacheKey, cacheItem);
|
cacheStorageProvider.Set(_cacheKey, cacheItem);
|
||||||
|
|
||||||
Logger.Debug("Item '{0}' was written to cache.", _cacheKey);
|
Logger.Debug("Item '{0}' was written to cache.", _cacheKey);
|
||||||
@@ -314,6 +323,12 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Don't cache if individual route configuration says no.
|
||||||
|
if (_cacheRouteConfig != null && _cacheRouteConfig.Duration == 0) {
|
||||||
|
Logger.Debug("Request for item '{0}' ignored because route is configured to not be cached.", itemDescriptor);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Ignore requests with the refresh key on the query string.
|
// Ignore requests with the refresh key on the query string.
|
||||||
foreach (var key in filterContext.RequestContext.HttpContext.Request.QueryString.AllKeys) {
|
foreach (var key in filterContext.RequestContext.HttpContext.Request.QueryString.AllKeys) {
|
||||||
if (String.Equals(_refreshKey, key, StringComparison.OrdinalIgnoreCase)) {
|
if (String.Equals(_refreshKey, key, StringComparison.OrdinalIgnoreCase)) {
|
||||||
@@ -325,7 +340,7 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual bool ResponseIsCacheable(ResultExecutedContext filterContext, CacheRouteConfig configuration) {
|
protected virtual bool ResponseIsCacheable(ResultExecutedContext filterContext) {
|
||||||
|
|
||||||
if (filterContext.HttpContext.Request.Url == null) {
|
if (filterContext.HttpContext.Request.Url == null) {
|
||||||
return false;
|
return false;
|
||||||
@@ -337,12 +352,6 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't cache in individual route configuration says no.
|
|
||||||
if (configuration != null && configuration.Duration == 0) {
|
|
||||||
Logger.Debug("Response for item '{0}' will not be cached because route is configured to not be cached.", _cacheKey);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't cache if request created notifications.
|
// Don't cache if request created notifications.
|
||||||
var hasNotifications = !String.IsNullOrEmpty(Convert.ToString(filterContext.Controller.TempData["messages"]));
|
var hasNotifications = !String.IsNullOrEmpty(Convert.ToString(filterContext.Controller.TempData["messages"]));
|
||||||
if (hasNotifications) {
|
if (hasNotifications) {
|
||||||
@@ -467,6 +476,7 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
|
|
||||||
private void ServeCachedItem(ActionExecutingContext filterContext, CacheItem cacheItem) {
|
private void ServeCachedItem(ActionExecutingContext filterContext, CacheItem cacheItem) {
|
||||||
var response = filterContext.HttpContext.Response;
|
var response = filterContext.HttpContext.Response;
|
||||||
|
var request = filterContext.HttpContext.Request;
|
||||||
|
|
||||||
// Fix for missing charset in response headers
|
// Fix for missing charset in response headers
|
||||||
response.Charset = response.Charset;
|
response.Charset = response.Charset;
|
||||||
@@ -476,12 +486,27 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
response.AddHeader("X-Cached-On", cacheItem.CachedOnUtc.ToString("r"));
|
response.AddHeader("X-Cached-On", cacheItem.CachedOnUtc.ToString("r"));
|
||||||
response.AddHeader("X-Cached-Until", cacheItem.ValidUntilUtc.ToString("r"));
|
response.AddHeader("X-Cached-Until", cacheItem.ValidUntilUtc.ToString("r"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shorcut action execution.
|
// Shorcut action execution.
|
||||||
filterContext.Result = new FileContentResult(cacheItem.Output, cacheItem.ContentType);
|
filterContext.Result = new FileContentResult(cacheItem.Output, cacheItem.ContentType);
|
||||||
|
|
||||||
response.StatusCode = cacheItem.StatusCode;
|
response.StatusCode = cacheItem.StatusCode;
|
||||||
|
|
||||||
|
// Add ETag header
|
||||||
|
if (HttpRuntime.UsingIntegratedPipeline && response.Headers.Get("ETag") == null) {
|
||||||
|
response.Headers["ETag"] = cacheItem.ETag;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check ETag in request
|
||||||
|
// https://www.w3.org/2005/MWI/BPWG/techs/CachingWithETag.html
|
||||||
|
var etag = request.Headers["If-None-Match"];
|
||||||
|
if (!String.IsNullOrEmpty(etag)) {
|
||||||
|
if (String.Equals(etag, cacheItem.ETag, StringComparison.Ordinal)) {
|
||||||
|
// ETag matches the cached item, we return a 304
|
||||||
|
filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.NotModified);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ApplyCacheControl(response);
|
ApplyCacheControl(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,15 +536,6 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
// response.DisableKernelCache();
|
// response.DisableKernelCache();
|
||||||
// response.Cache.SetOmitVaryStar(true);
|
// response.Cache.SetOmitVaryStar(true);
|
||||||
|
|
||||||
// An ETag is a string that uniquely identifies a specific version of a component.
|
|
||||||
// We use the cache item to detect if it's a new one.
|
|
||||||
if (HttpRuntime.UsingIntegratedPipeline) {
|
|
||||||
if (response.Headers.Get("ETag") == null) {
|
|
||||||
// What is the point of GetHashCode() of a newly generated item? /DanielStolt
|
|
||||||
response.Cache.SetETag(new CacheItem().GetHashCode().ToString(CultureInfo.InvariantCulture));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CacheSettings.VaryByQueryStringParameters == null) {
|
if (CacheSettings.VaryByQueryStringParameters == null) {
|
||||||
response.Cache.VaryByParams["*"] = true;
|
response.Cache.VaryByParams["*"] = true;
|
||||||
}
|
}
|
||||||
@@ -628,4 +644,4 @@ namespace Orchard.OutputCache.Filters {
|
|||||||
public class ViewDataContainer : IViewDataContainer {
|
public class ViewDataContainer : IViewDataContainer {
|
||||||
public ViewDataDictionary ViewData { get; set; }
|
public ViewDataDictionary ViewData { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ namespace Orchard.OutputCache.Models {
|
|||||||
[Serializable]
|
[Serializable]
|
||||||
public class CacheItem {
|
public class CacheItem {
|
||||||
// used for serialization compatibility
|
// used for serialization compatibility
|
||||||
public static readonly string Version = "1";
|
public static readonly string Version = "2";
|
||||||
|
|
||||||
public DateTime CachedOnUtc { get; set; }
|
public DateTime CachedOnUtc { get; set; }
|
||||||
public int Duration { get; set; }
|
public int Duration { get; set; }
|
||||||
@@ -18,6 +18,7 @@ namespace Orchard.OutputCache.Models {
|
|||||||
public string Tenant { get; set; }
|
public string Tenant { get; set; }
|
||||||
public int StatusCode { get; set; }
|
public int StatusCode { get; set; }
|
||||||
public string[] Tags { get; set; }
|
public string[] Tags { get; set; }
|
||||||
|
public string ETag { get; set; }
|
||||||
|
|
||||||
public int ValidFor {
|
public int ValidFor {
|
||||||
get { return Duration; }
|
get { return Duration; }
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ namespace Orchard.OutputCache.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void Set(string key, CacheItem cacheItem) {
|
public void Set(string key, CacheItem cacheItem) {
|
||||||
|
_workContext.HttpContext.Cache.Remove(key);
|
||||||
_workContext.HttpContext.Cache.Add(
|
_workContext.HttpContext.Cache.Add(
|
||||||
key,
|
key,
|
||||||
cacheItem,
|
cacheItem,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
float:left;
|
float:left;
|
||||||
}
|
}
|
||||||
.extensionName.installed {
|
.extensionName.installed {
|
||||||
background: url("images/installed.gif") no-repeat 0px 8px #fff;
|
background: url("images/installed.gif") no-repeat 0px 8px;
|
||||||
padding:0 0 0 60px;
|
padding:0 0 0 60px;
|
||||||
}
|
}
|
||||||
.contentItems .related {
|
.contentItems .related {
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ namespace Orchard.Projections.FilterEditors.Forms {
|
|||||||
case DateTimeOperator.LessThan:
|
case DateTimeOperator.LessThan:
|
||||||
return T("{0} is less than {1}{2}", fieldName, value, T(valueUnit));
|
return T("{0} is less than {1}{2}", fieldName, value, T(valueUnit));
|
||||||
case DateTimeOperator.LessThanEquals:
|
case DateTimeOperator.LessThanEquals:
|
||||||
return T("{0} is less or equal than {1}{2}", fieldName, value, T(valueUnit));
|
return T("{0} is less than or equal to {1}{2}", fieldName, value, T(valueUnit));
|
||||||
case DateTimeOperator.Equals:
|
case DateTimeOperator.Equals:
|
||||||
return T("{0} equals {1}{2}", fieldName, value, T(valueUnit));
|
return T("{0} equals {1}{2}", fieldName, value, T(valueUnit));
|
||||||
case DateTimeOperator.NotEquals:
|
case DateTimeOperator.NotEquals:
|
||||||
@@ -259,7 +259,7 @@ namespace Orchard.Projections.FilterEditors.Forms {
|
|||||||
case DateTimeOperator.GreaterThan:
|
case DateTimeOperator.GreaterThan:
|
||||||
return T("{0} is greater than {1}{2}", fieldName, value, T(valueUnit));
|
return T("{0} is greater than {1}{2}", fieldName, value, T(valueUnit));
|
||||||
case DateTimeOperator.GreaterThanEquals:
|
case DateTimeOperator.GreaterThanEquals:
|
||||||
return T("{0} is greater or equal than {1}{2}", fieldName, value, T(valueUnit));
|
return T("{0} is greater than or equal to {1}{2}", fieldName, value, T(valueUnit));
|
||||||
case DateTimeOperator.Between:
|
case DateTimeOperator.Between:
|
||||||
return T("{0} is between {1}{2} and {3}{4}", fieldName, min, T(minUnit), max, T(maxUnit));
|
return T("{0} is between {1}{2} and {3}{4}", fieldName, min, T(minUnit), max, T(maxUnit));
|
||||||
case DateTimeOperator.NotBetween:
|
case DateTimeOperator.NotBetween:
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ namespace Orchard.Projections.FilterEditors.Forms {
|
|||||||
case NumericOperator.LessThan:
|
case NumericOperator.LessThan:
|
||||||
return T("{0} is less than {1}", fieldName, value);
|
return T("{0} is less than {1}", fieldName, value);
|
||||||
case NumericOperator.LessThanEquals:
|
case NumericOperator.LessThanEquals:
|
||||||
return T("{0} is less or equal than {1}", fieldName, value);
|
return T("{0} is less than or equal to {1}", fieldName, value);
|
||||||
case NumericOperator.Equals:
|
case NumericOperator.Equals:
|
||||||
return T("{0} equals {1}", fieldName, value);
|
return T("{0} equals {1}", fieldName, value);
|
||||||
case NumericOperator.NotEquals:
|
case NumericOperator.NotEquals:
|
||||||
@@ -136,7 +136,7 @@ namespace Orchard.Projections.FilterEditors.Forms {
|
|||||||
case NumericOperator.GreaterThan:
|
case NumericOperator.GreaterThan:
|
||||||
return T("{0} is greater than {1}", fieldName, value);
|
return T("{0} is greater than {1}", fieldName, value);
|
||||||
case NumericOperator.GreaterThanEquals:
|
case NumericOperator.GreaterThanEquals:
|
||||||
return T("{0} is greater or equal than {1}", fieldName, value);
|
return T("{0} is greater than or equal to {1}", fieldName, value);
|
||||||
case NumericOperator.Between:
|
case NumericOperator.Between:
|
||||||
return T("{0} is between {1} and {2}", fieldName, min, max);
|
return T("{0} is between {1} and {2}", fieldName, min, max);
|
||||||
case NumericOperator.NotBetween:
|
case NumericOperator.NotBetween:
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ namespace Orchard.Taxonomies.Controllers {
|
|||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public ActionResult Delete(int id) {
|
public ActionResult Delete(int id) {
|
||||||
if (!Services.Authorizer.Authorize(Permissions.CreateTaxonomy, T("Couldn't delete taxonomy")))
|
if (!Services.Authorizer.Authorize(Permissions.ManageTaxonomies, T("Couldn't delete taxonomy")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|
||||||
var taxonomy = _taxonomyService.GetTaxonomy(id);
|
var taxonomy = _taxonomyService.GetTaxonomy(id);
|
||||||
|
|||||||
@@ -70,15 +70,24 @@ namespace Orchard.Taxonomies.Controllers {
|
|||||||
var checkedEntries = viewModel.Terms.Where(t => t.IsChecked).ToList();
|
var checkedEntries = viewModel.Terms.Where(t => t.IsChecked).ToList();
|
||||||
switch (viewModel.BulkAction) {
|
switch (viewModel.BulkAction) {
|
||||||
case TermsAdminIndexBulkAction.None:
|
case TermsAdminIndexBulkAction.None:
|
||||||
|
Services.Notifier.Information(T("No action selected."));
|
||||||
break;
|
break;
|
||||||
case TermsAdminIndexBulkAction.Delete:
|
case TermsAdminIndexBulkAction.Delete:
|
||||||
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Couldn't delete term")))
|
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Couldn't delete term")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|
||||||
|
if(!checkedEntries.Any()) {
|
||||||
|
Services.Notifier.Information(T("No terms selected."));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var entry in checkedEntries) {
|
foreach (var entry in checkedEntries) {
|
||||||
var term = _taxonomyService.GetTerm(entry.Id);
|
var term = _taxonomyService.GetTerm(entry.Id);
|
||||||
_taxonomyService.DeleteTerm(term);
|
_taxonomyService.DeleteTerm(term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Services.Notifier.Information(T.Plural("{0} term has been removed.", "{0} terms have been removed.", checkedEntries.Count));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case TermsAdminIndexBulkAction.Merge:
|
case TermsAdminIndexBulkAction.Merge:
|
||||||
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Couldn't delete term")))
|
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Couldn't delete term")))
|
||||||
@@ -100,8 +109,6 @@ namespace Orchard.Taxonomies.Controllers {
|
|||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
Services.Notifier.Information(T("{0} term have been removed.", checkedEntries.Count));
|
|
||||||
|
|
||||||
return RedirectToAction("Index", new { taxonomyId = viewModel.TaxonomyId });
|
return RedirectToAction("Index", new { taxonomyId = viewModel.TaxonomyId });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,7 +214,7 @@ namespace Orchard.Taxonomies.Controllers {
|
|||||||
|
|
||||||
public ActionResult Edit(int id) {
|
public ActionResult Edit(int id) {
|
||||||
|
|
||||||
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Not allowed to manage taxonomies")))
|
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Not allowed to manage terms")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|
||||||
var term = _taxonomyService.GetTerm(id);
|
var term = _taxonomyService.GetTerm(id);
|
||||||
@@ -220,7 +227,7 @@ namespace Orchard.Taxonomies.Controllers {
|
|||||||
|
|
||||||
[HttpPost, ActionName("Edit")]
|
[HttpPost, ActionName("Edit")]
|
||||||
public ActionResult EditPost(int id) {
|
public ActionResult EditPost(int id) {
|
||||||
if (!Services.Authorizer.Authorize(Permissions.ManageTaxonomies, T("Couldn't edit taxonomy")))
|
if (!Services.Authorizer.Authorize(Permissions.ManageTerms, T("Couldn't edit term")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|
||||||
var term = _taxonomyService.GetTerm(id);
|
var term = _taxonomyService.GetTerm(id);
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
using Orchard.ContentManagement;
|
||||||
|
using Orchard.ContentManagement.Drivers;
|
||||||
|
using Orchard.Core.Title.Models;
|
||||||
|
using Orchard.Localization;
|
||||||
|
using Orchard.Templates.Models;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Orchard.Templates.Drivers {
|
||||||
|
public class TitlePartDriver : ContentPartDriver<TitlePart> {
|
||||||
|
private readonly IContentManager _contentManager;
|
||||||
|
|
||||||
|
public Localizer T { get; set; }
|
||||||
|
|
||||||
|
public TitlePartDriver(IContentManager contentManager) {
|
||||||
|
_contentManager = contentManager;
|
||||||
|
|
||||||
|
T = NullLocalizer.Instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override DriverResult Editor(TitlePart part, IUpdateModel updater, dynamic shapeHelper) {
|
||||||
|
if (!part.ContentItem.Has<ShapePart>()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
updater.TryUpdateModel(part, Prefix, null, null);
|
||||||
|
|
||||||
|
// We need to query for the content type names because querying for content parts has no effect on the database side.
|
||||||
|
var contentTypesWithShapePart = _contentManager
|
||||||
|
.GetContentTypeDefinitions()
|
||||||
|
.Where(typeDefinition => typeDefinition.Parts.Any(partDefinition => partDefinition.PartDefinition.Name == "ShapePart"))
|
||||||
|
.Select(typeDefinition => typeDefinition.Name);
|
||||||
|
|
||||||
|
// If ShapePart is only dynamically added to this content type or even this content item then we won't find
|
||||||
|
// a corresponding content type definition, so using the current content type too.
|
||||||
|
contentTypesWithShapePart = contentTypesWithShapePart.Union(new[] { part.ContentItem.ContentType });
|
||||||
|
|
||||||
|
var existingShapeCount = _contentManager
|
||||||
|
.Query(VersionOptions.Latest, contentTypesWithShapePart.ToArray())
|
||||||
|
.Where<TitlePartRecord>(record => record.Title == part.Title && record.ContentItemRecord.Id != part.ContentItem.Id)
|
||||||
|
.Count();
|
||||||
|
|
||||||
|
if (existingShapeCount > 0) {
|
||||||
|
updater.AddModelError("ShapeNameAlreadyExists", T("A template with the given name already exists."));
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -180,6 +180,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="AdminMenu.cs" />
|
<Compile Include="AdminMenu.cs" />
|
||||||
<Compile Include="Controllers\AdminController.cs" />
|
<Compile Include="Controllers\AdminController.cs" />
|
||||||
|
<Compile Include="Drivers\TitlePartDriver.cs" />
|
||||||
<Compile Include="Helpers\StringExtensions.cs" />
|
<Compile Include="Helpers\StringExtensions.cs" />
|
||||||
<Compile Include="Handlers\ShapePartHandler.cs" />
|
<Compile Include="Handlers\ShapePartHandler.cs" />
|
||||||
<Compile Include="Drivers\ShapePartDriver.cs" />
|
<Compile Include="Drivers\ShapePartDriver.cs" />
|
||||||
|
|||||||
@@ -60,12 +60,18 @@ namespace Orchard.DisplayManagement.Descriptors.ShapeAttributeStrategy {
|
|||||||
var output = new HtmlStringWriter();
|
var output = new HtmlStringWriter();
|
||||||
var arguments = methodInfo.GetParameters()
|
var arguments = methodInfo.GetParameters()
|
||||||
.Select(parameter => BindParameter(displayContext, parameter, output));
|
.Select(parameter => BindParameter(displayContext, parameter, output));
|
||||||
|
try {
|
||||||
var returnValue = methodInfo.Invoke(serviceInstance, arguments.ToArray());
|
var returnValue = methodInfo.Invoke(serviceInstance, arguments.ToArray());
|
||||||
if (methodInfo.ReturnType != typeof(void)) {
|
if (methodInfo.ReturnType != typeof(void)) {
|
||||||
output.Write(CoerceHtmlString(returnValue));
|
output.Write(CoerceHtmlString(returnValue));
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
catch(TargetInvocationException e) {
|
||||||
|
// Throwing a TIE here will probably kill the web process
|
||||||
|
// in Azure. For unknown reasons.
|
||||||
|
throw e.InnerException;
|
||||||
}
|
}
|
||||||
return output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IHtmlString CoerceHtmlString(object invoke) {
|
private static IHtmlString CoerceHtmlString(object invoke) {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ using Orchard.Mvc;
|
|||||||
using Orchard.Mvc.Extensions;
|
using Orchard.Mvc.Extensions;
|
||||||
using Orchard.Utility.Extensions;
|
using Orchard.Utility.Extensions;
|
||||||
using Orchard.Exceptions;
|
using Orchard.Exceptions;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Orchard.Environment {
|
namespace Orchard.Environment {
|
||||||
// All the event handlers that DefaultOrchardHost implements have to be declared in OrchardStarter.
|
// All the event handlers that DefaultOrchardHost implements have to be declared in OrchardStarter.
|
||||||
@@ -34,6 +35,9 @@ namespace Orchard.Environment {
|
|||||||
private IEnumerable<ShellContext> _shellContexts;
|
private IEnumerable<ShellContext> _shellContexts;
|
||||||
private readonly ContextState<IList<ShellSettings>> _tenantsToRestart;
|
private readonly ContextState<IList<ShellSettings>> _tenantsToRestart;
|
||||||
|
|
||||||
|
|
||||||
|
public bool DelayRetries { get; set; }
|
||||||
|
|
||||||
public DefaultOrchardHost(
|
public DefaultOrchardHost(
|
||||||
IShellSettingsManager shellSettingsManager,
|
IShellSettingsManager shellSettingsManager,
|
||||||
IShellContextFactory shellContextFactory,
|
IShellContextFactory shellContextFactory,
|
||||||
@@ -142,16 +146,34 @@ namespace Orchard.Environment {
|
|||||||
// Load all tenants, and activate their shell.
|
// Load all tenants, and activate their shell.
|
||||||
if (allSettings.Any()) {
|
if (allSettings.Any()) {
|
||||||
Parallel.ForEach(allSettings, settings => {
|
Parallel.ForEach(allSettings, settings => {
|
||||||
try {
|
for (var i = 0; i <= Retries; i++) {
|
||||||
var context = CreateShellContext(settings);
|
|
||||||
ActivateShell(context);
|
// Not the first attempt, wait for a while ...
|
||||||
}
|
if (DelayRetries && i > 0) {
|
||||||
catch (Exception ex) {
|
|
||||||
if (ex.IsFatal()) {
|
// Wait for i^2 which means 1, 2, 4, 8 ... seconds
|
||||||
throw;
|
Thread.Sleep(TimeSpan.FromSeconds(Math.Pow(i, 2)));
|
||||||
}
|
}
|
||||||
Logger.Error(ex, "A tenant could not be started: " + settings.Name);
|
|
||||||
|
try {
|
||||||
|
var context = CreateShellContext(settings);
|
||||||
|
ActivateShell(context);
|
||||||
|
|
||||||
|
// If everything went well, return to stop the retry loop
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
if (i == Retries) {
|
||||||
|
Logger.Fatal("A tenant could not be started: {0} after {1} retries.", settings.Name, Retries);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Logger.Error(ex, "A tenant could not be started: " + settings.Name + " Attempt number: " + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (_processingEngine.AreTasksPending()) {
|
while (_processingEngine.AreTasksPending()) {
|
||||||
Logger.Debug("Processing pending task after activate Shell");
|
Logger.Debug("Processing pending task after activate Shell");
|
||||||
_processingEngine.ExecuteNextTask();
|
_processingEngine.ExecuteNextTask();
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ namespace Orchard.Environment {
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Error(ex, "An unexcepted error occured while terminating the Shell");
|
Logger.Error(ex, "An unexpected error occured while terminating the Shell");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,6 +130,7 @@
|
|||||||
<PropertyValue name="AutoIndentOnTab">false</PropertyValue>
|
<PropertyValue name="AutoIndentOnTab">false</PropertyValue>
|
||||||
<PropertyValue name="ColorizeInactiveBlocksDifferently">true</PropertyValue>
|
<PropertyValue name="ColorizeInactiveBlocksDifferently">true</PropertyValue>
|
||||||
<PropertyValue name="DisableBrowsingUpToDateCheck">true</PropertyValue>
|
<PropertyValue name="DisableBrowsingUpToDateCheck">true</PropertyValue>
|
||||||
|
<PropertyValue name="DisableCreateDeclDefnScan">false</PropertyValue>
|
||||||
<PropertyValue name="DisableErrorReporting">false</PropertyValue>
|
<PropertyValue name="DisableErrorReporting">false</PropertyValue>
|
||||||
<PropertyValue name="DisableIntelliSenseErrorsInErrorList">false</PropertyValue>
|
<PropertyValue name="DisableIntelliSenseErrorsInErrorList">false</PropertyValue>
|
||||||
<PropertyValue name="EnableChangeSignature">false</PropertyValue>
|
<PropertyValue name="EnableChangeSignature">false</PropertyValue>
|
||||||
@@ -154,6 +155,7 @@
|
|||||||
<PropertyValue name="IndentPreprocessor">2</PropertyValue>
|
<PropertyValue name="IndentPreprocessor">2</PropertyValue>
|
||||||
<PropertyValue name="IndentationReference">2</PropertyValue>
|
<PropertyValue name="IndentationReference">2</PropertyValue>
|
||||||
<PropertyValue name="MemberListDotToArrow">false</PropertyValue>
|
<PropertyValue name="MemberListDotToArrow">false</PropertyValue>
|
||||||
|
<PropertyValue name="MemberListFilterHeuristic">false</PropertyValue>
|
||||||
<PropertyValue name="NewlineControlBlockBrace">0</PropertyValue>
|
<PropertyValue name="NewlineControlBlockBrace">0</PropertyValue>
|
||||||
<PropertyValue name="NewlineEmptyFunctionCloseBrace">true</PropertyValue>
|
<PropertyValue name="NewlineEmptyFunctionCloseBrace">true</PropertyValue>
|
||||||
<PropertyValue name="NewlineEmptyTypeCloseBrace">true</PropertyValue>
|
<PropertyValue name="NewlineEmptyTypeCloseBrace">true</PropertyValue>
|
||||||
@@ -235,6 +237,7 @@
|
|||||||
<PropertyValue name="ShowVirtualProjectsInSolutionExplorerWhenSolutionOpen">false</PropertyValue>
|
<PropertyValue name="ShowVirtualProjectsInSolutionExplorerWhenSolutionOpen">false</PropertyValue>
|
||||||
<PropertyValue name="UseAMDCodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
<PropertyValue name="UseAMDCodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
||||||
<PropertyValue name="UseCommonJSCodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
<PropertyValue name="UseCommonJSCodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
||||||
|
<PropertyValue name="UseES2015CodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
||||||
<PropertyValue name="UseJsxPreserveForFilesThatAreNotPartOfAProject">false</PropertyValue>
|
<PropertyValue name="UseJsxPreserveForFilesThatAreNotPartOfAProject">false</PropertyValue>
|
||||||
<PropertyValue name="UseJsxReactForFilesThatAreNotPartOfAProject">false</PropertyValue>
|
<PropertyValue name="UseJsxReactForFilesThatAreNotPartOfAProject">false</PropertyValue>
|
||||||
<PropertyValue name="UseSystemCodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
<PropertyValue name="UseSystemCodeGenerationForModulesThatAreNotPartOfAProject">false</PropertyValue>
|
||||||
@@ -245,6 +248,7 @@
|
|||||||
<PropertyValue name="EnableValidation">true</PropertyValue>
|
<PropertyValue name="EnableValidation">true</PropertyValue>
|
||||||
<PropertyValue name="ErrorsAsWarnings">true</PropertyValue>
|
<PropertyValue name="ErrorsAsWarnings">true</PropertyValue>
|
||||||
<PropertyValue name="FormatOnPaste">true</PropertyValue>
|
<PropertyValue name="FormatOnPaste">true</PropertyValue>
|
||||||
|
<PropertyValue name="IdentifyHelpfulExtensions">true</PropertyValue>
|
||||||
<PropertyValue name="InsertAttributeValueQuotes">true</PropertyValue>
|
<PropertyValue name="InsertAttributeValueQuotes">true</PropertyValue>
|
||||||
<PropertyValue name="InsertClosingTag">true</PropertyValue>
|
<PropertyValue name="InsertClosingTag">true</PropertyValue>
|
||||||
<PropertyValue name="SuggestHelpfulExtensions">false</PropertyValue>
|
<PropertyValue name="SuggestHelpfulExtensions">false</PropertyValue>
|
||||||
|
|||||||
Reference in New Issue
Block a user