Compare commits

..

86 Commits

Author SHA1 Message Date
Shannon e4e7c18460 Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-02-11 18:07:42 +01:00
Shannon 5f246c533c Fixes issue when there are zero instructions in the db table and we've never synced before, in this case it will always cold boot because it will never saved the last synced, in this scenario also the indexes will not build because we've cleared the collection before they can run. 2016-02-11 18:07:31 +01:00
Sebastiaan Janssen 5323543ec0 Merge pull request #1115 from abryukhov/patch-3
Update UI language ru.xml
2016-02-11 17:36:28 +01:00
Shannon d44542694b Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-02-11 17:31:49 +01:00
Shannon 016a14e5c7 Fixes the image cropper where if you don't have any crops, save an image to a content item, then when you go create a new crop in the data type it wouldn't show up on the front-end or in the back office. 2016-02-11 17:31:37 +01:00
Alexander Bryukhov 52f4dfec80 Update UI language ru.xml
According new keys added to the 7.4.0 nightly build 164 (models builder keys)
2016-02-11 22:29:33 +06:00
Sebastiaan Janssen 4f6e023d77 Make sure that everybody working on the source actually gets these assembly references in web.config 2016-02-11 17:11:02 +01:00
Shannon 5e46750cc4 nuspec and version 2016-02-11 16:34:15 +01:00
Shannon d028b133f5 nuspec updated with MB 2016-02-11 16:27:58 +01:00
Shannon ca6821104b updated to MB 3.0.0 final 2016-02-11 16:26:21 +01:00
Shannon 1ea8c8280c Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-02-11 15:54:10 +01:00
Shannon 17ff952b52 Fixes the URL creating for media in the back office to use an IMedia instead of published media (since it's not published yet at the time) 2016-02-11 15:54:00 +01:00
Sebastiaan Janssen b4f64975a2 Merge pull request #1113 from umbraco/temp-U4-7936
U4-7936 Clicking the Recycle Bin shows "Session expired" login screen
2016-02-11 15:48:24 +01:00
Sebastiaan Janssen 1d8a5cf795 Merge pull request #1114 from umbraco/temp-u4-7729
U4-7729 7.4.0-Beta Cannot drag and Drop PDF on Media Section
2016-02-11 15:34:41 +01:00
Shannon dccee93700 fixes up some null checks and fixes up some string null checks - casting XElement to (string) explicitly avoids null reference exceptions when the XElement isn't actually present. 2016-02-11 15:11:11 +01:00
Per Ploug efeafb4471 U4-7729 7.4.0-Beta Cannot drag and Drop PDF on Media Section 2016-02-11 14:42:47 +01:00
Shannon Deminick 496efde5b3 Merge pull request #1093 from jonrandahl/patch-1
Update PackagingService.cs
2016-02-11 14:18:23 +01:00
Shannon Deminick 2b56854652 Merge pull request #1112 from umbraco/temp-U4-7939
U4-7939 - fix routes cache
2016-02-11 14:15:13 +01:00
Shannon 04e1d8c2bd U4-7936 Clicking the Recycle Bin shows "Session expired" login screen 2016-02-11 14:04:14 +01:00
Simon Busborg c7a7dd6ed5 Fixed disabled buttons 2016-02-11 13:12:13 +01:00
Sebastiaan Janssen 1eedbba97a Merge pull request #920 from darrenferguson/dev-v7
change the text "Reload nodes" to just "Reload" my editors don't know…
2016-02-11 12:04:45 +01:00
Stephan d6b46e7e78 U4-7939 - fix routes cache 2016-02-11 11:53:03 +01:00
Shannon 1b03a8f06c Merge branch 'dev-v7' of https://github.com/umbraco/Umbraco-CMS into dev-v7 2016-02-11 11:51:11 +01:00
Shannon 726bef1edf adds notes 2016-02-11 11:50:59 +01:00
Sebastiaan Janssen 33aa04bb2f Updates ImageProcessor.Web 2016-02-11 10:35:52 +01:00
Rune Hem Strand a79333080a Merge pull request #1111 from umbraco/U4-7933
Fixes issue U4-7933
2016-02-11 09:49:09 +01:00
Sebastiaan Janssen d1f513df69 Updates ImageProcessor 2016-02-10 17:09:40 +01:00
Shannon 54ddbc264d Fixes U4-7906 2016-02-10 16:39:05 +01:00
Shannon 89f6089f8e U4-7873 - fix GetCulture issue with languages 2016-02-10 16:22:06 +01:00
Shannon Deminick cf0b72fd77 Merge pull request #1026 from christofur/U4-7763
U4-7763 Fix - added mock and references required for 'dev' Grunt task
2016-02-10 15:54:59 +01:00
Niels Hartvig 2c32530701 Too fast, removed the extra amp 2016-02-10 15:47:52 +01:00
Niels Hartvig d6d945a96e Adds animationprocessmode=false to avoid issues with anim gifs 2016-02-10 15:46:18 +01:00
Shannon Deminick 4b6aee7fd9 Merge pull request #1109 from abryukhov/patch-3
Update UI language ru.xml
2016-02-10 15:44:42 +01:00
Niels Hartvig 8bbeeb2eaf Fixes issue 7933 2016-02-10 15:38:49 +01:00
Shannon Deminick 5648617809 Merge pull request #1098 from umbraco/temp-U4-7891
U4-7891 Image Cropper needs a property value converter to return a strongly typed model, json or a string when requested.
2016-02-10 15:32:55 +01:00
Shannon 0a33b37f2d Fixes issue with U4-7695 and not merging crop values with pre-values properly 2016-02-10 15:31:04 +01:00
Sebastiaan Janssen 157bf0d1eb Include modelsbuilder App_Plugins files in csproj so that the build actually includes them 2016-02-10 14:57:41 +01:00
Shannon 2721c5cb12 adds dynamic caseinsensitive support for the image cropper model 2016-02-10 14:54:00 +01:00
Shannon fd984bd613 Ensures media.Url works properly 2016-02-10 14:53:58 +01:00
Shannon fe0ed2ceea Adds some notes and ensures that the ImageCropperValueConverter shadows the correct one. 2016-02-10 14:53:57 +01:00
Shannon 0829bae5b2 Fixes TextStringValueConverter to include the text box and multi-textbox (since it's like that in the Core one that this overrides), adds new converter for Image cropper including ToString converter & custom type converter to convert from the strongly typed object to JObject, adds test to support this, adds equatable methods for the strongly typed model so it can be easily compared. Ensures that the webboot manager does not include the core value converter for image cropper. 2016-02-10 14:53:56 +01:00
Stephan c3c1567c2e Merge pull request #1100 from umbraco/temp-U4-7881
U4-7881 - fix errors with compositions
2016-02-10 14:53:45 +01:00
Shannon 4a8b59bdfa putting back in ContentTypeId on PropertyTypeDisplay, turns out this IS used when we remove a composition, we need to know which properties are related to which type. have also fixed another potential bug regarding compositions + generic properties, before we were not setting the ContentTypeId correct for a composition property type on the generic properties tab. 2016-02-10 14:34:33 +01:00
Shannon af543c56ec moves model to correct namespace 2016-02-10 13:31:36 +01:00
Claus 4113def0b6 Fixes: U4-7881 version 7.4 beta - cannot add composition doctype to a doctype that has already been saved 2016-02-10 13:08:36 +01:00
Shannon Deminick c346e62176 Merge pull request #1108 from umbraco/temp-U4-7799
Fixes: U4-7799 ModelsBuilder button in Content Type Editor should sav…
2016-02-10 13:05:38 +01:00
Sebastiaan Janssen 94fdbb1983 U4-7669 Update Newtonsoft.Json dependency to v8.0.1 from v6.0.5 2016-02-10 13:04:50 +01:00
Shannon f32e688c1a Fixes the MB re-generate button - this will only be shown when the models are out of date. 2016-02-10 13:04:04 +01:00
Mads Rasmussen 0303196f42 show Ulog error message when models builder fails 2016-02-10 11:47:01 +01:00
Mads Rasmussen c8faf17017 Fixes: U4-7799 ModelsBuilder button in Content Type Editor should save the current content type 2016-02-10 11:47:00 +01:00
Sebastiaan Janssen b2cba310b9 U4-7720 Media grid doesn't display preview for animated gif
In preparation of an updated ImageProcessor build, everything that displays animated gifs in the backoffice can run into this issue, so we show the first frame only everywhere (better than just a broken image)
2016-02-10 11:39:00 +01:00
Sebastiaan Janssen 95522afda8 Merge pull request #1110 from umbraco/temp-U4-7925
U4-7925 Add dependency injection to Umbraco.Web.Trees.TreeController*
2016-02-10 10:57:15 +01:00
Shannon 1b84e33392 reinstall the RC2 version 2016-02-10 10:43:41 +01:00
Shannon 065ed5ed78 updates nuspec 2016-02-10 10:28:57 +01:00
Shannon 9e931b84db U4-7925 Add dependency injection to Umbraco.Web.Trees.TreeController* 2016-02-10 10:26:09 +01:00
Shannon be449a96f7 updates to MB rc2 2016-02-10 10:26:08 +01:00
Alexander Bryukhov a22bfb927a Update UI language ru.xml
According new keys added to the 7.4.0 nightly build 162
2016-02-09 22:18:11 +06:00
Sebastiaan Janssen 5b92b30f64 Don't include the uninstall file in nuspec, it's missing so the package won't build 2016-02-09 17:16:04 +01:00
Sebastiaan Janssen 5e8200ecb2 U4-7909 7.4-rc1 is missing references because it's using portable class libraries now
#U4-7909 Fixed
2016-02-09 17:10:43 +01:00
Sebastiaan Janssen 9b5ea3da21 Can't have an uninstall as it runs during Update-Package, removing configuration settings like umbracoConfigurationStatus triggering the fresh install screen all user settings are also reverted :/ 2016-02-09 17:10:14 +01:00
Sebastiaan Janssen d495b96434 U4-7924 NuGet web.config transform changes targetFramework 2016-02-09 16:29:20 +01:00
Sebastiaan Janssen 79edf81434 Just whitespace, formatting document 2016-02-09 16:00:02 +01:00
Sebastiaan Janssen b3620f1ca4 U4-7924 NuGet web.config transform removes <codedom>
#U4-7924 Fixed
2016-02-09 15:39:48 +01:00
Stephan b6a9734755 Fix ModelsBuilder integration 2016-02-09 11:46:26 +01:00
Shannon c4cedaddd2 Merge remote-tracking branch 'origin/master-v7' into dev-v7 2016-02-09 11:00:57 +01:00
Shannon b5a2b3dbbd U4-7922 Preview is not working 2016-02-09 10:56:15 +01:00
Mads Rasmussen dc4266852f Fixes: U4-7915 7.4 RC1: Cannot change grid background 2016-02-09 09:57:41 +01:00
Simon Busborg 881e8daafd Merge pull request #1104 from abryukhov/patch-3
Update UI language ru.xml
2016-02-08 18:51:20 +01:00
Claus 54c1d25296 Fixes: U4-6407 Change Document Type feature on a node doesn't support compositions 2016-02-08 14:39:16 +01:00
Mads Rasmussen 624d3a9b82 fixes: U4-7905 val-highlight directive not highlighting error fields (red border) in 7.4.0 2016-02-08 13:35:59 +01:00
Mads Rasmussen d46d23b372 Fixes: U4-7732 Grid changes do not trigger Unsaved Changes notification 2016-02-08 12:07:45 +01:00
Mads Rasmussen aeba68782c fixes: U4-7903 Using shortcut for "add property" removes "add property"-field for other tabs in document type editor && U4-7904 Add property using shortcut - submit button text is missing 2016-02-08 10:54:58 +01:00
Mads Rasmussen ac60c63104 Fixes: U4-7900 The new content type editor: If you hit save while it generates an alias, the alias will be generatingAlias 2016-02-08 10:20:09 +01:00
Claus 6e0e48b6e4 Merge pull request #1103 from arknu/U4-7819
U4-7819: Use correct messages when saving Media and Member types
2016-02-08 09:24:42 +01:00
Alexander Bryukhov 0ea15ae22e Update UI language ru.xml
According new / changed keys of 7.4 nightly build 161
2016-02-07 11:37:06 +06:00
Asbjørn Riis-Knudsen 54548ffc68 U4-7819: Use correct messages when saving Media and Member types 2016-02-06 17:34:36 +01:00
Claus fdc50f0635 Merge pull request #1101 from KevinJump/dev-v7-GetContent/MediaContainer-Fix
Fix GetContentTypeContainer and GetMediaTypeContainer
2016-02-05 15:15:56 +01:00
Kevin Jump 11743ea322 Fix GetContentTypeContainer and GetMediaTypeContainer to use correct guid
updated to use DocumentTypeContainerGuid,  MediaTypeContainerGuid
contstants in calls.
2016-02-05 13:20:10 +00:00
Simon Busborg 4d74ec7785 Makes editor types tabs accessible. 2016-02-05 11:49:41 +01:00
Sebastiaan Janssen aa704a2065 Umbraco.ModelsBuilder.AspNet.dll is no longer needed 2016-02-05 11:28:12 +01:00
Mads Rasmussen 08844ea098 close user dialog when clicking on edit, history links and logout 2016-02-05 11:08:34 +01:00
Claus 3449b1efd3 Toggle password fields after successfully changing the password. 2016-02-05 10:43:37 +01:00
Claus 00d012162f Added a bunch of missing translations in user overlay. 2016-02-05 10:38:15 +01:00
Jon R. Humphrey 8b4d34a1e8 Update PackagingService.cs
I've made the changes to the code after running into the "sequence contains no matching element" error in my Starter Kit package install. We knew that there were no calls to .First()., .Last(), or .Single() in our code based on search results and checking for this call, however we were able to deduce that the issue was that we were including a new ImageCropper DataType without values based on Jeavon's [example:] [https://umbraco.com/follow-us/blog-archive/2014/5/30/developing-a-website-with-responsive-images-using-the-umbraco-v714-image-cropper/]

I know it's a simple fix but if it helps anyone else not run into the same thing then that's perfect!

Thank you for all your hard work on Umbraco, maybe someday I can do more!
2016-02-03 13:21:36 +00:00
Chris Perks 698617dc60 Added mock for externalLoginInfo, and dependency references required to run 'dev' Grunt task 2016-01-18 14:41:35 +00:00
Darren Ferguson 1cd00cb6f6 change the text "Reload nodes" to just "Reload" my editors don't know what a node is! 2015-11-20 18:11:13 +00:00
110 changed files with 2469 additions and 746 deletions
+2 -2
View File
@@ -32,8 +32,8 @@
<dependency id="AutoMapper" version="[3.0.0, 3.1.0)" />
<dependency id="Newtonsoft.Json" version="[6.0.8, 9.0.0)" />
<dependency id="Examine" version="[0.1.68, 1.0.0)" />
<dependency id="ImageProcessor" version="[2.3.2, 3.0.0)" />
<dependency id="ImageProcessor.Web" version="[4.5.1, 5.0.0)" />
<dependency id="ImageProcessor" version="[2.3.3, 3.0.0)" />
<dependency id="ImageProcessor.Web" version="[4.5.3, 5.0.0)" />
<dependency id="semver" version="[1.1.2, 2.0.0)" />
<dependency id="UrlRewritingNet" version="[2.0.7, 3.0.0)" />
<dependency id="Markdown" version="[1.14.4, 2.0.0)" />
+2 -3
View File
@@ -16,8 +16,8 @@
<tags>umbraco</tags>
<dependencies>
<dependency id="UmbracoCms.Core" version="[$version$]" />
<dependency id="Newtonsoft.Json" version="[6.0.5, 7.0.0)" />
<dependency id="Umbraco.ModelsBuilder" version="[3.0.0-RC1, 3.0.0)" />
<dependency id="Newtonsoft.Json" version="[6.0.8, 9.0.0)" />
<dependency id="Umbraco.ModelsBuilder" version="[3.0.0, 4.0.0)" />
</dependencies>
</metadata>
<files>
@@ -37,7 +37,6 @@
<file src="tools\Readme.txt" target="tools\Readme.txt" />
<file src="tools\ReadmeUpgrade.txt" target="tools\ReadmeUpgrade.txt" />
<file src="tools\Web.config.install.xdt" target="Content\Web.config.install.xdt" />
<file src="tools\Web.config.uninstall.xdt" target="Content\Web.config.uninstall.xdt" />
<file src="tools\applications.config.install.xdt" target="Content\config\applications.config.install.xdt" />
<file src="tools\ClientDependency.config.install.xdt" target="Content\config\ClientDependency.config.install.xdt" />
<file src="tools\Dashboard.config.install.xdt" target="Content\config\Dashboard.config.install.xdt" />
+178 -25
View File
@@ -7,8 +7,8 @@
<section name="ExamineLuceneIndexSets" type="Examine.LuceneEngine.Config.IndexSets, Examine" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="SetAttributes(type,requirePermission)" />
<sectionGroup name="applicationSettings" xdt:Locator="Match(name)">
<section name="umbraco.presentation.Properties.Settings" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</sectionGroup>
<section name="umbraco.presentation.Properties.Settings" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</sectionGroup>
<sectionGroup name="system.web.webPages.razor" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<sectionGroup name="umbracoConfiguration" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing">
<section name="settings" type="Umbraco.Core.Configuration.UmbracoSettings.UmbracoSettingsSection, Umbraco.Core" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
@@ -22,7 +22,7 @@
<appSettings>
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
</appSettings>
<umbracoConfiguration xdt:Transform="InsertIfMissing">
<settings configSource="config\umbracoSettings.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
<BaseRestExtensions configSource="config\BaseRestExtensions.config" xdt:Locator="Match(configSource)" xdt:Transform="InsertIfMissing" />
@@ -37,7 +37,7 @@
<DbProviderFactories xdt:Transform="InsertIfMissing">
<remove invariant="System.Data.SqlServerCe.4.0" xdt:Locator="Match(invariant)" xdt:Transform="InsertIfMissing" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe" xdt:Locator="Match(invariant)" xdt:Transform="SetAttributes(invariant,description,type)" />
<remove invariant="MySql.Data.MySqlClient" xdt:Locator="Match(invariant)" xdt:Transform="InsertIfMissing" />
<remove invariant="MySql.Data.MySqlClient" xdt:Locator="Match(invariant)" xdt:Transform="InsertIfMissing" />
<add invariant="MySql.Data.MySqlClient" xdt:Locator="Match(invariant)" xdt:Transform="Remove" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" xdt:Locator="Match(invariant)" xdt:Transform="InsertIfMissing" />
<add invariant="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" xdt:Locator="Match(invariant)" xdt:Transform="SetAttributes(type)" />
@@ -48,13 +48,15 @@
<system.web xdt:Transform="InsertIfMissing" />
<system.web>
<siteMap xdt:Transform="Remove" />
<siteMap xdt:Transform="InsertIfMissing">
<siteMap xdt:Transform="InsertIfMissing">
<providers xdt:Transform="InsertIfMissing">
<remove name="MySqlSiteMapProvider" xdt:Transform="InsertIfMissing" />
</providers>
</siteMap>
</siteMap>
<httpRuntime xdt:Transform="InsertIfMissing" />
<httpRuntime targetFramework="4.5" maxRequestLength="51200" fcnMode="Single" xdt:Transform="SetAttributes(targetFramework,fcnMode,maxRequestLength)" />
<httpRuntime maxRequestLength="51200" fcnMode="Single" xdt:Transform="SetAttributes(fcnMode,maxRequestLength)" />
<httpRuntime targetFramework="4.5" xdt:Locator="Condition(count(@targetFramework) != 1)" xdt:Transform="SetAttributes(targetFramework)" />
<membership defaultProvider="DefaultMembershipProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove" />
<roleManager defaultProvider="DefaultRoleProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>
<profile defaultProvider="DefaultProfileProvider" xdt:Locator="Match(defaultProvider)" xdt:Transform="Remove"/>>
@@ -63,8 +65,7 @@
<compilation>
<assemblies xdt:Transform="InsertIfMissing" />
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)"
xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
@@ -78,6 +79,56 @@
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Collections.Concurrent, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel.Annotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel.EventBasedAsync, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Contracts, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Debug, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Tools, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Globalization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Queryable, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.NetworkInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Requests, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ObjectModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit.ILGeneration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit.Lightweight, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Resources.ResourceManager, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.InteropServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.InteropServices.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Json, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Security.Principal, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Duplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.NetTcp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.Encoding.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading.Tasks.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.ReaderWriter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.XDocument, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.XmlSerializer, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
</assemblies>
</compilation>
@@ -86,11 +137,113 @@
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Collections" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Collections.Concurrent" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel.Annotations" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel.EventBasedAsync" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Contracts" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Debug" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Tools" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Tracing" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Dynamic.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Globalization" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.IO" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Expressions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Queryable" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.NetworkInformation" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Requests" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ObjectModel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit.ILGeneration" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit.Lightweight" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Resources.ResourceManager" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.InteropServices" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Numerics" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Json" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Xml" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Security.Principal" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Duplex" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.NetTcp" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Security" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.Encoding" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.Encoding.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.RegularExpressions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading.Tasks" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading.Tasks.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.ReaderWriter" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.XDocument" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.XmlSerializer" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
</assemblies>
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Collections" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Collections.Concurrent" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel.Annotations" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel.EventBasedAsync" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Contracts" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Debug" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Tools" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Tracing" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Dynamic.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Globalization" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.IO" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Expressions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Queryable" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.NetworkInformation" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Requests" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ObjectModel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit.ILGeneration" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit.Lightweight" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Resources.ResourceManager" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.InteropServices" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Numerics" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Json" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Xml" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Security.Principal" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Duplex" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.NetTcp" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Security" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.Encoding" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.Encoding.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.RegularExpressions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading.Tasks" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading.Tasks.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.ReaderWriter" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.XDocument" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.XmlSerializer" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
</assemblies>
</compilation>
@@ -125,6 +278,8 @@
<add name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="umbracoBaseRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<!-- Note, we're removing the one that starts with a space here, don't correct it -->
<!-- This to fix a quirk we for a lot of releases where we added it with the space by default -->
<add name=" UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="UmbracoModule" type="Umbraco.Web.UmbracoModule,umbraco" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
</modules>
@@ -149,16 +304,14 @@
<requestLimits maxAllowedContentLength="52428800" xdt:Transform="InsertIfMissing" />
</requestFiltering>
</security>
</system.webServer>
<system.codedom xdt:Transform="Remove" />
</system.webServer>
<runtime xdt:Transform="InsertIfMissing" />
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" xdt:Transform="InsertIfMissing" />
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='HtmlAgilityPack')" xdt:Transform="Remove" />
@@ -171,7 +324,7 @@
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin.Security.OAuth')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin.Security')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='Microsoft.Owin.Security.Cookies')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http.Formatting')" xdt:Transform="Remove" />
<dependentAssembly xdt:Locator="Condition(./_defaultNamespace:assemblyIdentity/@name='System.Net.Http.Formatting')" xdt:Transform="Remove" />
</assemblyBinding>
</runtime>
@@ -180,7 +333,7 @@
<dependentAssembly>
<assemblyIdentity name="HtmlAgilityPack" publicKeyToken="bd319b19eaf3b43a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.4.9.0" newVersion="1.4.9.0" />
</dependentAssembly>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
@@ -196,7 +349,7 @@
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
@@ -208,16 +361,16 @@
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
</dependentAssembly>
<dependentAssembly xdt:Transform="Insert">
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
@@ -225,19 +378,19 @@
</runtime>
<system.web.webPages.razor xdt:Transform="Remove" />
<location path="umbraco" xdt:Locator="Match(path)" xdt:Transform="InsertIfMissing" />
<location path="umbraco" xdt:Locator="Match(path)">
<system.webServer xdt:Transform="InsertIfMissing">
<urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" xdt:Transform="SetAttributes(doStaticCompression,doDynamicCompression,dynamicCompressionBeforeCache)" />
<urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" xdt:Transform="SetAttributes(doStaticCompression,doDynamicCompression,dynamicCompressionBeforeCache)" />
</system.webServer>
</location>
<location path="App_Plugins" xdt:Locator="Match(path)" xdt:Transform="InsertIfMissing" />
<location path="App_Plugins" xdt:Locator="Match(path)">
<system.webServer xdt:Transform="InsertIfMissing">
<urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" xdt:Transform="SetAttributes(doStaticCompression,doDynamicCompression,dynamicCompressionBeforeCache)" />
<urlCompression doStaticCompression="false" doDynamicCompression="false" dynamicCompressionBeforeCache="false" xdt:Transform="SetAttributes(doStaticCompression,doDynamicCompression,dynamicCompressionBeforeCache)" />
</system.webServer>
</location>
</configuration>
@@ -1,90 +0,0 @@
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<configSections xdt:Transform="InsertIfMissing" />
<configSections>
<section name="BaseRestExtensions" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="FileSystemProviders" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<section name="ExamineLuceneIndexSets" type="Examine.LuceneEngine.Config.IndexSets, Examine" requirePermission="false" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<sectionGroup name="applicationSettings" xdt:Locator="Match(name)">
<section name="umbraco.presentation.Properties.Settings" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</sectionGroup>
<sectionGroup name="system.web.webPages.razor" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<sectionGroup name="umbracoConfiguration" xdt:Locator="Match(name)" xdt:Transform="Remove"/>
</configSections>
<ExamineLuceneIndexSets xdt:Transform="Remove"/>
<urlrewritingnet xdt:Transform="Remove"/>
<microsoft.scripting xdt:Transform="Remove"/>
<clientDependency xdt:Transform="Remove"/>
<Examine xdt:Transform="Remove"/>
<log4net xdt:Transform="Remove"/>
<appSettings>
<add key="umbracoConfigurationStatus" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoReservedUrls" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoReservedPaths" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoPath" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoHideTopLevelNodeFromPath" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoUseDirectoryUrls" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoTimeOutInMinutes" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoDefaultUILanguage" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="umbracoUseSSL" xdt:Locator="Match(key)" xdt:Transform="Remove"/>
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" xdt:Locator="Match(key,value)" xdt:Transform="Remove" />
</appSettings>
<umbracoConfiguration xdt:Transform="Remove"/>
<FileSystemProviders xdt:Transform="Remove" />
<BaseRestExtensions xdt:Transform="Remove" />
<connectionStrings>
<remove name="umbracoDbDSN" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="umbracoDbDSN" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</connectionStrings>
<system.web>
<pages>
<controls>
<add tagPrefix="umbraco" xdt:Locator="Match(tagPrefix)" xdt:Transform="Remove" />
</controls>
</pages>
<httpModules>
<add name="UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</httpModules>
<httpHandlers>
<add type="umbraco.presentation.channels.api, umbraco" xdt:Locator="Match(type)" xdt:Transform="Remove" />
<add type="umbraco.presentation.channels.wordApi, umbraco" xdt:Locator="Match(type)" xdt:Transform="Remove" />
</httpHandlers>
<compilation>
<buildProviders>
<add type="umbraco.MacroEngines.RazorBuildProvider, umbraco.MacroEngines" xdt:Locator="Match(type)" xdt:Transform="Remove" />
<add type="umbraco.MacroEngines.RazorBuildProvider, umbraco.MacroEngines" xdt:Locator="Match(type)" xdt:Transform="Remove" />
<add type="umbraco.MacroEngines.RazorBuildProvider, umbraco.MacroEngines" xdt:Locator="Match(type)" xdt:Transform="Remove" />
</buildProviders>
</compilation>
<membership>
<providers>
<add name="UmbracoMembershipProvider" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="UsersMembershipProvider" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</providers>
</membership>
<roleManager>
<providers>
<add name="UmbracoRoleProvider" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</providers>
</roleManager>
</system.web>
<system.webServer>
<modules>
<remove name="UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</modules>
<handlers>
<remove name="Channels" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<remove name="Channels_Word" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="Channels" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="Channels_Word" xdt:Locator="Match(name)" xdt:Transform="Remove" />
</handlers>
</system.webServer>
<location path="umbraco" xdt:Locator="Match(path)" xdt:Transform="Remove" />/>
<location path="App_Plugins" xdt:Locator="Match(path)" xdt:Transform="Remove" />/>
</configuration>
+1
View File
@@ -49,6 +49,7 @@ if ($project) {
if(Test-Path $umbracoBinFolder\umbraco.editorControls.dll) { Remove-Item $umbracoBinFolder\umbraco.editorControls.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.MacroEngines.dll) { Remove-Item $umbracoBinFolder\umbraco.MacroEngines.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.ModelsBuilder.dll) { Remove-Item $umbracoBinFolder\Umbraco.ModelsBuilder.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.ModelsBuilder.AspNet.dll) { Remove-Item $umbracoBinFolder\Umbraco.ModelsBuilder.AspNet.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\umbraco.providers.dll) { Remove-Item $umbracoBinFolder\umbraco.providers.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\Umbraco.Web.UI.dll) { Remove-Item $umbracoBinFolder\Umbraco.Web.UI.dll -Force -Confirm:$false }
if(Test-Path $umbracoBinFolder\UmbracoExamine.dll) { Remove-Item $umbracoBinFolder\UmbracoExamine.dll -Force -Confirm:$false }
+1 -2
View File
@@ -1,3 +1,2 @@
# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
7.4.0
RC1
7.4.0
+1 -1
View File
@@ -12,4 +12,4 @@ using System.Resources;
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0-RC1")]
[assembly: AssemblyInformationalVersion("7.4.0")]
@@ -24,7 +24,7 @@ namespace Umbraco.Core.Configuration
/// Gets the version comment (like beta or RC).
/// </summary>
/// <value>The version comment.</value>
public static string CurrentComment { get { return "RC1"; } }
public static string CurrentComment { get { return ""; } }
// Get the version of the umbraco.dll by looking at a class in that dll
// Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx
@@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Reflection;
namespace Umbraco.Core.Dynamics
{
/// <summary>
/// This will check enable dynamic access to properties and methods in a case insensitive manner
/// </summary>
/// <typeparam name="T"></typeparam>
/// <remarks>
/// This works by using reflection on the type - the reflection lookup is lazy so it will not execute unless a dynamic method needs to be accessed
/// </remarks>
public abstract class CaseInsensitiveDynamicObject<T> : DynamicObject
where T: class
{
/// <summary>
/// Used for dynamic access for case insensitive property access
/// </summary>`
private static readonly Lazy<IDictionary<string, Func<T, object>>> CaseInsensitivePropertyAccess = new Lazy<IDictionary<string, Func<T, object>>>(() =>
{
var props = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public)
.DistinctBy(x => x.Name);
return props.Select(propInfo =>
{
var name = propInfo.Name.ToLowerInvariant();
Func<T, object> getVal = propInfo.GetValue;
return new KeyValuePair<string, Func<T, object>>(name, getVal);
}).ToDictionary(x => x.Key, x => x.Value);
});
/// <summary>
/// Used for dynamic access for case insensitive property access
/// </summary>
private static readonly Lazy<IDictionary<string, Tuple<ParameterInfo[], Func<T, object[], object>>>> CaseInsensitiveMethodAccess
= new Lazy<IDictionary<string, Tuple<ParameterInfo[], Func<T, object[], object>>>>(() =>
{
var props = typeof(T).GetMethods(BindingFlags.Instance | BindingFlags.Public)
.Where(x => x.IsSpecialName == false && x.IsVirtual == false)
.DistinctBy(x => x.Name);
return props.Select(methodInfo =>
{
var name = methodInfo.Name.ToLowerInvariant();
Func<T, object[], object> getVal = methodInfo.Invoke;
var val = new Tuple<ParameterInfo[], Func<T, object[], object>>(methodInfo.GetParameters(), getVal);
return new KeyValuePair<string, Tuple<ParameterInfo[], Func<T, object[], object>>>(name, val);
}).ToDictionary(x => x.Key, x => x.Value);
});
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var name = binder.Name.ToLowerInvariant();
if (CaseInsensitiveMethodAccess.Value.ContainsKey(name) == false)
return base.TryInvokeMember(binder, args, out result);
var val = CaseInsensitiveMethodAccess.Value[name];
var parameters = val.Item1;
var callback = val.Item2;
var fullArgs = new List<object>(args);
if (args.Length <= parameters.Length)
{
//need to fill them up if they're optional
for (var i = args.Length; i < parameters.Length; i++)
{
if (parameters[i].IsOptional)
{
fullArgs.Add(parameters[i].DefaultValue);
}
}
if (fullArgs.Count == parameters.Length)
{
result = callback((T)(object)this, fullArgs.ToArray());
return true;
}
}
return base.TryInvokeMember(binder, args, out result);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var name = binder.Name.ToLowerInvariant();
if (CaseInsensitivePropertyAccess.Value.ContainsKey(name) == false)
return base.TryGetMember(binder, out result);
result = CaseInsensitivePropertyAccess.Value[name]((T)(object)this);
return true;
}
}
}
@@ -64,7 +64,7 @@ namespace Umbraco.Core.Dynamics
/// </summary>
public class DynamicXmlConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType)
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
var convertableTypes = new[]
{
@@ -78,8 +78,8 @@ namespace Umbraco.Core.Dynamics
typeof(RawXmlDocument)
};
return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, sourceType))
|| base.CanConvertFrom(context, sourceType);
return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, destinationType))
|| base.CanConvertFrom(context, destinationType);
}
public override object ConvertTo(
@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
using Umbraco.Core.PropertyEditors.ValueConverters;
namespace Umbraco.Core.Models
{
internal static class MediaExtensions
{
/// <summary>
/// Hack: we need to put this in a real place, this is currently just used to render the urls for a media item in the back office
/// </summary>
/// <returns></returns>
public static string GetUrl(this IMedia media, string propertyAlias, ILogger logger)
{
var propertyType = media.PropertyTypes.FirstOrDefault(x => x.Alias.InvariantEquals(propertyAlias));
if (propertyType != null)
{
var val = media.Properties[propertyType];
if (val != null)
{
var jsonString = val.Value as string;
if (jsonString != null)
{
if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.ImageCropperAlias)
{
if (jsonString.DetectIsJson())
{
try
{
var json = JsonConvert.DeserializeObject<JObject>(jsonString);
if (json["src"] != null)
{
return json["src"].Value<string>();
}
}
catch (Exception ex)
{
logger.Error<ImageCropperValueConverter>("Could not parse the string " + jsonString + " to a json object", ex);
return string.Empty;
}
}
else
{
return jsonString;
}
}
else if (propertyType.PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias)
{
return jsonString;
}
//hrm, without knowing what it is, just adding a string here might not be very nice
}
}
}
return string.Empty;
}
/// <summary>
/// Hack: we need to put this in a real place, this is currently just used to render the urls for a media item in the back office
/// </summary>
/// <returns></returns>
public static string[] GetUrls(this IMedia media, IContentSection contentSection, ILogger logger)
{
var links = new List<string>();
var autoFillProperties = contentSection.ImageAutoFillProperties.ToArray();
if (autoFillProperties.Any())
{
links.AddRange(
autoFillProperties
.Select(field => media.GetUrl(field.Alias, logger))
.Where(link => link.IsNullOrWhiteSpace() == false));
}
return links.ToArray();
}
}
}
@@ -164,6 +164,9 @@ namespace Umbraco.Core.Models.PublishedContent
private void InitializeConverters()
{
//TODO: Look at optimizing this method, it gets run for every property type for the document being rendered at startup,
// every precious second counts!
var converters = PropertyValueConvertersResolver.Current.Converters.ToArray();
var defaultConvertersWithAttributes = PropertyValueConvertersResolver.Current.DefaultConverters;
@@ -8,6 +8,7 @@ namespace Umbraco.Core.PropertyEditors
/// <summary>
/// Manages the list of IPropertyEditorValueConverter's
/// </summary>
[Obsolete("IPropertyEditorValueConverter is obsolete, but we need to support them until v8, to resolve the correct converter types use: PropertyValueConvertersResolver")]
internal sealed class PropertyEditorValueConvertersResolver : ManyObjectsResolverBase<PropertyEditorValueConvertersResolver, IPropertyEditorValueConverter>
{
/// <summary>
@@ -1,8 +1,11 @@
using System;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Services;
namespace Umbraco.Core.PropertyEditors.ValueConverters
{
@@ -14,11 +17,80 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
[PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)]
public class ImageCropperValueConverter : JsonValueConverter
{
private readonly IDataTypeService _dataTypeService;
public ImageCropperValueConverter()
{
_dataTypeService = ApplicationContext.Current.Services.DataTypeService;
}
public ImageCropperValueConverter(IDataTypeService dataTypeService)
{
if (dataTypeService == null) throw new ArgumentNullException("dataTypeService");
_dataTypeService = dataTypeService;
}
public override bool IsConverter(PublishedPropertyType propertyType)
{
return propertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.ImageCropperAlias);
}
internal static void MergePreValues(JObject currentValue, IDataTypeService dataTypeService, int dataTypeId)
{
//need to lookup the pre-values for this data type
//TODO: Change all singleton access to use ctor injection in v8!!!
var dt = dataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeId);
if (dt != null && dt.IsDictionaryBased && dt.PreValuesAsDictionary.ContainsKey("crops"))
{
var cropsString = dt.PreValuesAsDictionary["crops"].Value;
JArray preValueCrops;
try
{
preValueCrops = JsonConvert.DeserializeObject<JArray>(cropsString);
}
catch (Exception ex)
{
LogHelper.Error<ImageCropperValueConverter>("Could not parse the string " + cropsString + " to a json object", ex);
return;
}
//now we need to merge the crop values - the alias + width + height comes from pre-configured pre-values,
// however, each crop can store it's own coordinates
JArray existingCropsArray;
if (currentValue["crops"] != null)
{
existingCropsArray = (JArray)currentValue["crops"];
}
else
{
currentValue["crops"] = existingCropsArray = new JArray();
}
foreach (var preValueCrop in preValueCrops.Where(x => x.HasValues))
{
var found = existingCropsArray.FirstOrDefault(x =>
{
if (x.HasValues && x["alias"] != null)
{
return x["alias"].Value<string>() == preValueCrop["alias"].Value<string>();
}
return false;
});
if (found != null)
{
found["width"] = preValueCrop["width"];
found["height"] = preValueCrop["height"];
}
else
{
existingCropsArray.Add(preValueCrop);
}
}
}
}
public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview)
{
if (source == null) return null;
@@ -29,7 +101,11 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
JObject obj;
try
{
obj = JsonConvert.DeserializeObject<JObject>(sourceString);
obj = JsonConvert.DeserializeObject<JObject>(sourceString, new JsonSerializerSettings
{
Culture = CultureInfo.InvariantCulture,
FloatParseHandling = FloatParseHandling.Decimal
});
}
catch (Exception ex)
{
@@ -37,26 +113,8 @@ namespace Umbraco.Core.PropertyEditors.ValueConverters
return sourceString;
}
//need to lookup the pre-values for this data type
//TODO: Change all singleton access to use ctor injection in v8!!!
var dt = ApplicationContext.Current.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(propertyType.DataTypeId);
MergePreValues(obj, _dataTypeService, propertyType.DataTypeId);
if (dt != null && dt.IsDictionaryBased && dt.PreValuesAsDictionary.ContainsKey("crops"))
{
var cropsString = dt.PreValuesAsDictionary["crops"].Value;
JArray crops;
try
{
crops = JsonConvert.DeserializeObject<JArray>(cropsString);
}
catch (Exception ex)
{
LogHelper.Error<ImageCropperValueConverter>("Could not parse the string " + cropsString + " to a json object", ex);
return sourceString;
}
obj["crops"] = crops;
}
return obj;
}
@@ -0,0 +1,52 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
namespace Umbraco.Core.Serialization
{
/// <summary>
/// This is required if we want to force JSON.Net to not use .Net TypeConverters during serialization/deserialization
/// </summary>
/// <typeparam name="T"></typeparam>
/// <remarks>
/// In some cases thsi is required if your model has an explicit type converter, see: http://stackoverflow.com/a/31328131/694494
///
/// NOTE: I was going to use this for the ImageCropDataSetConverter to convert to String, which would have worked by putting this attribute:
/// [JsonConverter(typeof(NoTypeConverterJsonConverter{ImageCropDataSet}))] on top of the ImageCropDataSet class, however it turns out we
/// don't require this because to convert to string, we just override ToString().
/// I'll leave this class here for the future though.
/// </remarks>
internal class NoTypeConverterJsonConverter<T> : JsonConverter
{
static readonly IContractResolver resolver = new NoTypeConverterContractResolver();
private class NoTypeConverterContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
if (typeof(T).IsAssignableFrom(objectType))
{
var contract = this.CreateObjectContract(objectType);
contract.Converter = null; // Also null out the converter to prevent infinite recursion.
return contract;
}
return base.CreateContract(objectType);
}
}
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = resolver }).Deserialize(reader, objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
JsonSerializer.CreateDefault(new JsonSerializerSettings { ContractResolver = resolver }).Serialize(writer, value);
}
}
}
@@ -229,7 +229,7 @@ namespace Umbraco.Core.Services
public EntityContainer GetContentTypeContainer(Guid containerId)
{
return GetContainer(containerId, Constants.ObjectTypes.DocumentTypeGuid);
return GetContainer(containerId, Constants.ObjectTypes.DocumentTypeContainerGuid);
}
public IEnumerable<EntityContainer> GetContentTypeContainers(int[] containerIds)
@@ -258,7 +258,7 @@ namespace Umbraco.Core.Services
public EntityContainer GetMediaTypeContainer(Guid containerId)
{
return GetContainer(containerId, Constants.ObjectTypes.MediaTypeGuid);
return GetContainer(containerId, Constants.ObjectTypes.MediaTypeContainerGuid);
}
private EntityContainer GetContainer(Guid containerId, Guid containerObjectType)
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
+46 -43
View File
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
@@ -365,8 +365,7 @@ namespace Umbraco.Core.Services
var dependencies = new HashSet<string>();
//Add the Master as a dependency
if (infoElement.Element("Master") != null &&
string.IsNullOrEmpty(infoElement.Element("Master").Value) == false)
if (string.IsNullOrEmpty((string)infoElement.Element("Master")) == false)
{
dependencies.Add(infoElement.Element("Master").Value);
}
@@ -627,7 +626,7 @@ namespace Umbraco.Core.Services
contentType.AllowedTemplates = allowedTemplates;
}
if (string.IsNullOrEmpty(defaultTemplateElement.Value) == false)
if (string.IsNullOrEmpty((string)defaultTemplateElement) == false)
{
var defaultTemplate = _fileService.GetTemplate(defaultTemplateElement.Value.ToSafeAlias());
if (defaultTemplate != null)
@@ -698,7 +697,7 @@ namespace Umbraco.Core.Services
: _dataTypeService.GetDataTypeDefinitionByPropertyEditorAlias(propertyEditorAlias);
if (dataTypeDefinitions != null && dataTypeDefinitions.Any())
{
dataTypeDefinition = dataTypeDefinitions.First();
dataTypeDefinition = dataTypeDefinitions.FirstOrDefault();
}
}
else if (legacyPropertyEditorId != Guid.Empty && dataTypeDefinition.ControlId != legacyPropertyEditorId)
@@ -706,7 +705,7 @@ namespace Umbraco.Core.Services
var dataTypeDefinitions = _dataTypeService.GetDataTypeDefinitionByControlId(legacyPropertyEditorId);
if (dataTypeDefinitions != null && dataTypeDefinitions.Any())
{
dataTypeDefinition = dataTypeDefinitions.First();
dataTypeDefinition = dataTypeDefinitions.FirstOrDefault();
}
}
else if (dataTypeDefinition.PropertyEditorAlias != propertyEditorAlias)
@@ -714,7 +713,7 @@ namespace Umbraco.Core.Services
var dataTypeDefinitions = _dataTypeService.GetDataTypeDefinitionByPropertyEditorAlias(propertyEditorAlias);
if (dataTypeDefinitions != null && dataTypeDefinitions.Any())
{
dataTypeDefinition = dataTypeDefinitions.First();
dataTypeDefinition = dataTypeDefinitions.FirstOrDefault();
}
}
@@ -741,13 +740,13 @@ namespace Umbraco.Core.Services
var propertyType = new PropertyType(dataTypeDefinition, property.Element("Alias").Value)
{
Name = property.Element("Name").Value,
Description = property.Element("Description") != null ? property.Element("Description").Value : null,
Description = (string)property.Element("Description"),
Mandatory = property.Element("Mandatory") != null ? property.Element("Mandatory").Value.ToLowerInvariant().Equals("true") : false,
ValidationRegExp = property.Element("Validation") != null ? property.Element("Validation").Value : null,
ValidationRegExp = (string)property.Element("Validation"),
SortOrder = sortOrder
};
var tab = property.Element("Tab").Value;
var tab = (string)property.Element("Tab");
if (string.IsNullOrEmpty(tab))
{
contentType.AddPropertyType(propertyType);
@@ -797,14 +796,14 @@ namespace Umbraco.Core.Services
using (var repository = _repositoryFactory.CreateContentTypeRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IContentType>.Builder.Where(x => x.Alias == contentTypeAlias);
var types = repository.GetByQuery(query);
var types = repository.GetByQuery(query).ToArray();
if (!types.Any())
if (types.Any() == false)
throw new Exception(
string.Format("No ContentType matching the passed in Alias: '{0}' was found",
contentTypeAlias));
var contentType = types.First();
var contentType = types.FirstOrDefault();
if (contentType == null)
throw new Exception(string.Format("ContentType matching the passed in Alias: '{0}' was null",
@@ -889,7 +888,7 @@ namespace Umbraco.Core.Services
{
var dataTypeDefinitionName = dataTypeElement.Attribute("Name").Value;
var legacyPropertyEditorId = Guid.Empty;
Guid legacyPropertyEditorId;
Guid.TryParse(dataTypeElement.Attribute("Id").Value, out legacyPropertyEditorId);
var dataTypeDefinitionId = new Guid(dataTypeElement.Attribute("Definition").Value);
@@ -1026,23 +1025,30 @@ namespace Umbraco.Core.Services
if (prevaluesElement == null) continue;
var dataTypeDefinitionName = dataTypeElement.Attribute("Name").Value;
var dataTypeDefinition = dataTypes.First(x => x.Name == dataTypeDefinitionName);
var dataTypeDefinition = dataTypes.FirstOrDefault(x => x.Name == dataTypeDefinitionName);
var valuesWithoutKeys = prevaluesElement.Elements("PreValue")
.Where(x => ((string)x.Attribute("Alias")).IsNullOrWhiteSpace())
.Select(x => x.Attribute("Value").Value);
if (dataTypeDefinition != null)
{
var valuesWithoutKeys = prevaluesElement.Elements("PreValue")
.Where(x => ((string) x.Attribute("Alias")).IsNullOrWhiteSpace())
.Select(x => x.Attribute("Value").Value);
var valuesWithKeys = prevaluesElement.Elements("PreValue")
.Where(x => ((string)x.Attribute("Alias")).IsNullOrWhiteSpace() == false)
.ToDictionary(
key => (string)key.Attribute("Alias"),
val => new PreValue((string)val.Attribute("Value")));
var valuesWithKeys = prevaluesElement.Elements("PreValue")
.Where(x => ((string) x.Attribute("Alias")).IsNullOrWhiteSpace() == false)
.ToDictionary(
key => (string) key.Attribute("Alias"),
val => new PreValue((string) val.Attribute("Value")));
//save the values with keys
_dataTypeService.SavePreValues(dataTypeDefinition, valuesWithKeys);
//save the values with keys
_dataTypeService.SavePreValues(dataTypeDefinition, valuesWithKeys);
//save the values without keys (this is legacy)
_dataTypeService.SavePreValues(dataTypeDefinition.Id, valuesWithoutKeys);
//save the values without keys (this is legacy)
_dataTypeService.SavePreValues(dataTypeDefinition.Id, valuesWithoutKeys);
}
else
{
_logger.Warn<PackagingService>("No data type found with name " + dataTypeDefinitionName + " data type pre-values will not be saved");
}
}
}
@@ -1329,31 +1335,31 @@ namespace Umbraco.Core.Services
//Following xml elements are treated as nullable properties
var useInEditorElement = macroElement.Element("useInEditor");
var useInEditor = false;
if (useInEditorElement != null && string.IsNullOrEmpty(useInEditorElement.Value) == false)
if (useInEditorElement != null && string.IsNullOrEmpty((string)useInEditorElement) == false)
{
useInEditor = bool.Parse(useInEditorElement.Value);
}
var cacheDurationElement = macroElement.Element("refreshRate");
var cacheDuration = 0;
if (cacheDurationElement != null && string.IsNullOrEmpty(cacheDurationElement.Value) == false)
if (cacheDurationElement != null && string.IsNullOrEmpty((string)cacheDurationElement) == false)
{
cacheDuration = int.Parse(cacheDurationElement.Value);
}
var cacheByMemberElement = macroElement.Element("cacheByMember");
var cacheByMember = false;
if (cacheByMemberElement != null && string.IsNullOrEmpty(cacheByMemberElement.Value) == false)
if (cacheByMemberElement != null && string.IsNullOrEmpty((string)cacheByMemberElement) == false)
{
cacheByMember = bool.Parse(cacheByMemberElement.Value);
}
var cacheByPageElement = macroElement.Element("cacheByPage");
var cacheByPage = false;
if (cacheByPageElement != null && string.IsNullOrEmpty(cacheByPageElement.Value) == false)
if (cacheByPageElement != null && string.IsNullOrEmpty((string)cacheByPageElement) == false)
{
cacheByPage = bool.Parse(cacheByPageElement.Value);
}
var dontRenderElement = macroElement.Element("dontRender");
var dontRender = true;
if (dontRenderElement != null && string.IsNullOrEmpty(dontRenderElement.Value) == false)
if (dontRenderElement != null && string.IsNullOrEmpty((string)dontRenderElement) == false)
{
dontRender = bool.Parse(dontRenderElement.Value);
}
@@ -1526,23 +1532,20 @@ namespace Umbraco.Core.Services
var dependencies = new List<string>();
var elementCopy = tempElement;
//Ensure that the Master of the current template is part of the import, otherwise we ignore this dependency as part of the dependency sorting.
if (elementCopy.Element("Master") != null &&
string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false &&
templateElements.Any(x => x.Element("Alias").Value == elementCopy.Element("Master").Value))
if (string.IsNullOrEmpty((string)elementCopy.Element("Master")) == false &&
templateElements.Any(x => (string)x.Element("Alias") == (string)elementCopy.Element("Master")))
{
dependencies.Add(elementCopy.Element("Master").Value);
dependencies.Add((string)elementCopy.Element("Master"));
}
else if (elementCopy.Element("Master") != null &&
string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false &&
templateElements.Any(x => x.Element("Alias").Value == elementCopy.Element("Master").Value) ==
false)
else if (string.IsNullOrEmpty((string)elementCopy.Element("Master")) == false &&
templateElements.Any(x => (string)x.Element("Alias") == (string)elementCopy.Element("Master")) == false)
{
_logger.Info<PackagingService>(string.Format("Template '{0}' has an invalid Master '{1}', so the reference has been ignored.", elementCopy.Element("Alias").Value, elementCopy.Element("Master").Value));
_logger.Info<PackagingService>(string.Format("Template '{0}' has an invalid Master '{1}', so the reference has been ignored.", (string)elementCopy.Element("Alias"), (string)elementCopy.Element("Master")));
}
var field = new TopologicalSorter.DependencyField<XElement>
{
Alias = elementCopy.Element("Alias").Value,
Alias = (string)elementCopy.Element("Alias"),
Item = new Lazy<XElement>(() => elementCopy),
DependsOn = dependencies.ToArray()
};
@@ -1564,7 +1567,7 @@ namespace Umbraco.Core.Services
var existingTemplate = _fileService.GetTemplate(alias) as Template;
var template = existingTemplate ?? new Template(path, templateName, alias);
template.Content = design;
if (masterElement != null && string.IsNullOrEmpty(masterElement.Value) == false)
if (masterElement != null && string.IsNullOrEmpty((string)masterElement) == false)
{
template.MasterTemplateAlias = masterElement.Value;
var masterTemplate = templates.FirstOrDefault(x => x.Alias == masterElement.Value);
@@ -171,9 +171,11 @@ namespace Umbraco.Core.Sync
// go get the last id in the db and store it
// note: do it BEFORE initializing otherwise some instructions might get lost
// when doing it before, some instructions might run twice - not an issue
var lastId = _appContext.DatabaseContext.Database.ExecuteScalar<int>("SELECT MAX(id) FROM umbracoCacheInstruction");
if (lastId > 0)
SaveLastSynced(lastId);
var maxId = _appContext.DatabaseContext.Database.ExecuteScalar<int>("SELECT MAX(id) FROM umbracoCacheInstruction");
//if there is a max currently, or if we've never synced
if (maxId > 0 || _lastId < 0)
SaveLastSynced(maxId);
// execute initializing callbacks
if (_options.InitializingCallbacks != null)
+3
View File
@@ -309,6 +309,7 @@
<Compile Include="DictionaryExtensions.cs" />
<Compile Include="Dictionary\CultureDictionaryFactoryResolver.cs" />
<Compile Include="Dictionary\ICultureDictionaryFactory.cs" />
<Compile Include="Dynamics\CaseInsensitiveDynamicObject.cs" />
<Compile Include="Dynamics\DynamicInstanceHelper.cs" />
<Compile Include="Dynamics\DynamicXmlConverter.cs" />
<Compile Include="Events\CancellableEventArgs.cs" />
@@ -489,6 +490,7 @@
<Compile Include="Security\IBackOfficeUserPasswordChecker.cs" />
<Compile Include="Security\MembershipPasswordHasher.cs" />
<Compile Include="SemVersionExtensions.cs" />
<Compile Include="Serialization\NoTypeConverterJsonConverter.cs" />
<Compile Include="ServiceProviderExtensions.cs" />
<Compile Include="IO\ResizedImage.cs" />
<Compile Include="IO\UmbracoMediaFile.cs" />
@@ -511,6 +513,7 @@
<Compile Include="Services\IServerRegistrationService.cs" />
<Compile Include="Services\ITaskService.cs" />
<Compile Include="Services\LocalizedTextServiceSupplementaryFileSource.cs" />
<Compile Include="Models\MediaExtensions.cs" />
<Compile Include="Services\MigrationEntryService.cs" />
<Compile Include="Services\MoveOperationStatusType.cs" />
<Compile Include="Services\PublicAccessService.cs" />
@@ -73,5 +73,47 @@ namespace Umbraco.Tests.Integration
content.Id, content.Path, new Uri("http://domain1.fr/"));
Assert.AreEqual("de-DE", culture.Name);
}
[Test]
public void GetCultureWithWildcard()
{
var contentTypeService = ServiceContext.ContentTypeService;
var contentType = MockedContentTypes.CreateSimpleContentType("umbBlah", "test Doc Type");
contentTypeService.Save(contentType);
var contentService = ServiceContext.ContentService;
var c1 = contentService.CreateContentWithIdentity("content", -1, "umbBlah");
var c2 = contentService.CreateContentWithIdentity("content", c1, "umbBlah");
var c3 = contentService.CreateContentWithIdentity("content", c1, "umbBlah");
var c4 = contentService.CreateContentWithIdentity("content", c3, "umbBlah");
foreach (var l in ServiceContext.LocalizationService.GetAllLanguages().Where(x => x.CultureName != "en-US").ToArray())
ServiceContext.LocalizationService.Delete(l);
var l0 = ServiceContext.LocalizationService.GetLanguageByIsoCode("en-US");
var l1 = new Core.Models.Language("fr-FR");
var l2 = new Core.Models.Language("de-DE");
ServiceContext.LocalizationService.Save(l1);
ServiceContext.LocalizationService.Save(l2);
foreach (var d in ServiceContext.DomainService.GetAll(true).ToArray())
ServiceContext.DomainService.Delete(d);
ServiceContext.DomainService.Save(new UmbracoDomain("*0000") { DomainName = "*0000", RootContentId = c1.Id, LanguageId = l2.Id });
ServiceContext.DomainService.Save(new UmbracoDomain("*0001") { DomainName = "*0001", RootContentId = c3.Id, LanguageId = l1.Id });
//ServiceContext.DomainService.Save(new UmbracoDomain("*100112") { DomainName = "*100112", RootContentId = c3.Id, LanguageId = l2.Id });
var content = c2;
var culture = Web.Models.ContentExtensions.GetCulture(null,
ServiceContext.DomainService, ServiceContext.LocalizationService, ServiceContext.ContentService,
content.Id, content.Path, new Uri("http://domain1.com/"));
Assert.AreEqual("de-DE", culture.Name);
content = c4;
culture = Web.Models.ContentExtensions.GetCulture(null,
ServiceContext.DomainService, ServiceContext.LocalizationService, ServiceContext.ContentService,
content.Id, content.Path, new Uri("http://domain1.fr/"));
Assert.AreEqual("fr-FR", culture.Name);
}
}
}
@@ -1,6 +1,17 @@
using System.Linq;
using System;
using System.Globalization;
using System.Linq;
using Moq;
using Newtonsoft.Json;
using NUnit.Framework;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Services;
using Umbraco.Web.Models;
using Umbraco.Web.PropertyEditors;
using Umbraco.Web;
@@ -10,14 +21,155 @@ namespace Umbraco.Tests.PropertyEditors
[TestFixture]
public class ImageCropperTest
{
private const string cropperJson = "{\"focalPoint\": {\"left\": 0.96,\"top\": 0.80827067669172936},\"src\": \"/media/1005/img_0671.jpg\",\"crops\": [{\"alias\":\"thumb\",\"width\": 100,\"height\": 100,\"coordinates\": {\"x1\": 0.58729977382575338,\"y1\": 0.055768992440203169,\"x2\": 0,\"y2\": 0.32457553600198386}}]}";
private const string cropperJson1 = "{\"focalPoint\": {\"left\": 0.96,\"top\": 0.80827067669172936},\"src\": \"/media/1005/img_0671.jpg\",\"crops\": [{\"alias\":\"thumb\",\"width\": 100,\"height\": 100,\"coordinates\": {\"x1\": 0.58729977382575338,\"y1\": 0.055768992440203169,\"x2\": 0,\"y2\": 0.32457553600198386}}]}";
private const string cropperJson2 = "{\"focalPoint\": {\"left\": 0.98,\"top\": 0.80827067669172936},\"src\": \"/media/1005/img_0672.jpg\",\"crops\": [{\"alias\":\"thumb\",\"width\": 100,\"height\": 100,\"coordinates\": {\"x1\": 0.58729977382575338,\"y1\": 0.055768992440203169,\"x2\": 0,\"y2\": 0.32457553600198386}}]}";
private const string cropperJson3 = "{\"focalPoint\": {\"left\": 0.98,\"top\": 0.80827067669172936},\"src\": \"/media/1005/img_0672.jpg\",\"crops\": []}";
private const string mediaPath = "/media/1005/img_0671.jpg";
[Test]
public void ImageCropData_Properties_As_Dynamic()
{
var sourceObj = cropperJson1.SerializeToCropDataSet();
dynamic d = sourceObj;
var index = 0;
foreach (var crop in d.crops)
{
var realObjCrop = sourceObj.Crops.ElementAt(index);
Assert.AreEqual(realObjCrop.Alias, crop.Alias);
Assert.AreEqual(realObjCrop.Alias, crop.alias);
Assert.AreEqual(realObjCrop.Height, crop.Height);
Assert.AreEqual(realObjCrop.Height, crop.height);
Assert.AreEqual(realObjCrop.Coordinates.X1, crop.Coordinates.X1);
Assert.AreEqual(realObjCrop.Coordinates.X1, crop.coordinates.x1);
Assert.AreEqual(realObjCrop.Coordinates.X2, crop.Coordinates.X2);
Assert.AreEqual(realObjCrop.Coordinates.X2, crop.coordinates.x2);
Assert.AreEqual(realObjCrop.Coordinates.Y1, crop.Coordinates.Y1);
Assert.AreEqual(realObjCrop.Coordinates.Y1, crop.coordinates.y1);
Assert.AreEqual(realObjCrop.Coordinates.Y2, crop.Coordinates.Y2);
Assert.AreEqual(realObjCrop.Coordinates.Y2, crop.coordinates.y2);
index++;
}
Assert.AreEqual(index, 1);
}
[Test]
public void ImageCropFocalPoint_Properties_As_Dynamic()
{
var sourceObj = cropperJson1.SerializeToCropDataSet();
dynamic d = sourceObj;
Assert.AreEqual(sourceObj.FocalPoint.Left, d.FocalPoint.Left);
Assert.AreEqual(sourceObj.FocalPoint.Left, d.focalPoint.left);
Assert.AreEqual(sourceObj.FocalPoint.Top, d.FocalPoint.Top);
Assert.AreEqual(sourceObj.FocalPoint.Top, d.focalPoint.top);
}
[Test]
public void ImageCropDataSet_Properties_As_Dynamic()
{
var sourceObj = cropperJson1.SerializeToCropDataSet();
dynamic d = sourceObj;
Assert.AreEqual(sourceObj.Src, d.Src);
Assert.AreEqual(sourceObj.Src, d.src);
Assert.AreEqual(sourceObj.FocalPoint, d.FocalPoint);
Assert.AreEqual(sourceObj.FocalPoint, d.focalPoint);
Assert.AreEqual(sourceObj.Crops, d.Crops);
Assert.AreEqual(sourceObj.Crops, d.crops);
}
[Test]
public void ImageCropDataSet_Methods_As_Dynamic()
{
var sourceObj = cropperJson1.SerializeToCropDataSet();
dynamic d = sourceObj;
Assert.AreEqual(sourceObj.HasCrop("thumb"), d.HasCrop("thumb"));
Assert.AreEqual(sourceObj.HasCrop("thumb"), d.hasCrop("thumb"));
Assert.AreEqual(sourceObj.GetCropUrl("thumb"), d.GetCropUrl("thumb"));
Assert.AreEqual(sourceObj.GetCropUrl("thumb"), d.getCropUrl("thumb"));
Assert.AreEqual(sourceObj.HasFocalPoint(), d.HasFocalPoint());
Assert.AreEqual(sourceObj.HasFocalPoint(), d.hasFocalPoint());
}
[Test]
public void CanConvertImageCropperDataSetSrcToString()
{
//cropperJson3 - has not crops
var sourceObj = cropperJson3.SerializeToCropDataSet();
var destObj = sourceObj.TryConvertTo<string>();
Assert.IsTrue(destObj.Success);
Assert.AreEqual(destObj.Result, "/media/1005/img_0672.jpg");
}
[Test]
public void CanConvertImageCropperDataSetJObject()
{
//cropperJson3 - has not crops
var sourceObj = cropperJson3.SerializeToCropDataSet();
var destObj = sourceObj.TryConvertTo<JObject>();
Assert.IsTrue(destObj.Success);
Assert.AreEqual(sourceObj, destObj.Result.ToObject<ImageCropDataSet>());
}
[Test]
public void CanConvertImageCropperDataSetJsonToString()
{
var sourceObj = cropperJson1.SerializeToCropDataSet();
var destObj = sourceObj.TryConvertTo<string>();
Assert.IsTrue(destObj.Success);
Assert.IsTrue(destObj.Result.DetectIsJson());
var obj = JsonConvert.DeserializeObject<ImageCropDataSet>(cropperJson1, new JsonSerializerSettings {Culture = CultureInfo.InvariantCulture, FloatParseHandling = FloatParseHandling.Decimal});
Assert.AreEqual(sourceObj, obj);
}
[TestCase(cropperJson1, cropperJson1, true)]
[TestCase(cropperJson1, cropperJson2, false)]
public void CanConvertImageCropperPropertyEditor(string val1, string val2, bool expected)
{
try
{
PropertyValueConvertersResolver.Current = new PropertyValueConvertersResolver(new ActivatorServiceProvider(), Mock.Of<ILogger>());
Resolution.Freeze();
var dataTypeService = new Mock<IDataTypeService>();
dataTypeService.Setup(x => x.GetPreValuesCollectionByDataTypeId(It.IsAny<int>())).Returns(new PreValueCollection(Enumerable.Empty<PreValue>()));
var converter = new Web.PropertyEditors.ValueConverters.ImageCropperValueConverter(dataTypeService.Object);
var result = converter.ConvertDataToSource(new PublishedPropertyType("test", 0, "test"), val1, false); // does not use type for conversion
var resultShouldMatch = val2.SerializeToCropDataSet();
if (expected)
{
Assert.AreEqual(resultShouldMatch, result);
}
else
{
Assert.AreNotEqual(resultShouldMatch, result);
}
}
finally
{
PropertyValueConvertersResolver.Reset(true);
}
}
[Test]
public void GetCropUrl_CropAliasTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, cropAlias: "Thumb", useCropDimensions: true);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, cropAlias: "Thumb", useCropDimensions: true);
Assert.AreEqual(mediaPath + "?crop=0.58729977382575338,0.055768992440203169,0,0.32457553600198386&cropmode=percentage&width=100&height=100", urlString);
}
@@ -27,28 +179,28 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetCropUrl_CropAliasIgnoreWidthHeightTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, cropAlias: "Thumb", useCropDimensions: true, width: 50, height: 50);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, cropAlias: "Thumb", useCropDimensions: true, width: 50, height: 50);
Assert.AreEqual(mediaPath + "?crop=0.58729977382575338,0.055768992440203169,0,0.32457553600198386&cropmode=percentage&width=100&height=100", urlString);
}
[Test]
public void GetCropUrl_WidthHeightTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, width: 200, height: 300);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, width: 200, height: 300);
Assert.AreEqual(mediaPath + "?center=0.80827067669172936,0.96&mode=crop&width=200&height=300", urlString);
}
[Test]
public void GetCropUrl_FocalPointTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, cropAlias: "thumb", preferFocalPoint: true, useCropDimensions: true);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, cropAlias: "thumb", preferFocalPoint: true, useCropDimensions: true);
Assert.AreEqual(mediaPath + "?center=0.80827067669172936,0.96&mode=crop&width=100&height=100", urlString);
}
[Test]
public void GetCropUrlFurtherOptionsTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, width: 200, height: 300, furtherOptions: "&filter=comic&roundedcorners=radius-26|bgcolor-fff");
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, width: 200, height: 300, furtherOptions: "&filter=comic&roundedcorners=radius-26|bgcolor-fff");
Assert.AreEqual(mediaPath + "?center=0.80827067669172936,0.96&mode=crop&width=200&height=300&filter=comic&roundedcorners=radius-26|bgcolor-fff", urlString);
}
@@ -58,7 +210,7 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetCropUrlNullTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, cropAlias: "Banner", useCropDimensions: true);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, cropAlias: "Banner", useCropDimensions: true);
Assert.AreEqual(null, urlString);
}
@@ -68,7 +220,7 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetBaseCropUrlFromModelTest()
{
var cropDataSet = cropperJson.SerializeToCropDataSet();
var cropDataSet = cropperJson1.SerializeToCropDataSet();
var urlString = cropDataSet.GetCropUrl("thumb");
Assert.AreEqual("?crop=0.58729977382575338,0.055768992440203169,0,0.32457553600198386&cropmode=percentage&width=100&height=100", urlString);
}
@@ -79,7 +231,7 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetCropUrl_CropAliasHeightRatioModeTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, cropAlias: "Thumb", useCropDimensions: true, ratioMode:ImageCropRatioMode.Height);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, cropAlias: "Thumb", useCropDimensions: true, ratioMode:ImageCropRatioMode.Height);
Assert.AreEqual(mediaPath + "?crop=0.58729977382575338,0.055768992440203169,0,0.32457553600198386&cropmode=percentage&width=100&heightratio=1", urlString);
}
@@ -89,7 +241,7 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetCropUrl_WidthHeightRatioModeTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, width: 300, height: 150, ratioMode:ImageCropRatioMode.Height);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, width: 300, height: 150, ratioMode:ImageCropRatioMode.Height);
Assert.AreEqual(mediaPath + "?center=0.80827067669172936,0.96&mode=crop&width=300&heightratio=0.5", urlString);
}
@@ -99,7 +251,7 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetCropUrl_HeightWidthRatioModeTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, width: 300, height: 150, ratioMode: ImageCropRatioMode.Width);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, width: 300, height: 150, ratioMode: ImageCropRatioMode.Width);
Assert.AreEqual(mediaPath + "?center=0.80827067669172936,0.96&mode=crop&height=150&widthratio=2", urlString);
}
@@ -109,7 +261,7 @@ namespace Umbraco.Tests.PropertyEditors
[Test]
public void GetCropUrl_SpecifiedCropModeTest()
{
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson, width: 300, height: 150, imageCropMode:ImageCropMode.Max);
var urlString = mediaPath.GetCropUrl(imageCropperValue: cropperJson1, width: 300, height: 150, imageCropMode:ImageCropMode.Max);
Assert.AreEqual(mediaPath + "?mode=max&width=300&height=150", urlString);
}
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
using Umbraco.Tests.TestHelpers;
using Umbraco.Web.PublishedCache.XmlPublishedCache;
namespace Umbraco.Tests.Routing
{
[DatabaseTestBehavior(DatabaseBehavior.NewDbFileAndSchemaPerFixture)]
[TestFixture]
public class RoutesCacheTests : BaseRoutingTest
{
[Test]
public void U4_7939()
{
//var routingContext = GetRoutingContext("/test", 1111);
var umbracoContext = GetUmbracoContext("/test", 0);
var cache = umbracoContext.ContentCache.InnerCache as PublishedContentCache;
if (cache == null) throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported.");
PublishedContentCache.UnitTesting = false; // else does not write to routes cache
Assert.IsFalse(PublishedContentCache.UnitTesting);
var z = cache.GetByRoute(umbracoContext, false, "/home/sub1");
Assert.IsNotNull(z);
Assert.AreEqual(1173, z.Id);
var routes = cache.RoutesCache.GetCachedRoutes();
Assert.AreEqual(1, routes.Count);
// before the fix, the following assert would fail because the route would
// have been stored as { 0, "/home/sub1" } - essentially meaning we were NOT
// storing anything in the route cache!
Assert.AreEqual(1173, routes.Keys.First());
Assert.AreEqual("/home/sub1", routes.Values.First());
}
}
}
+1
View File
@@ -193,6 +193,7 @@
<Compile Include="Persistence\Repositories\TaskRepositoryTest.cs" />
<Compile Include="Persistence\Repositories\TaskTypeRepositoryTest.cs" />
<Compile Include="Resolvers\ResolverBaseTest.cs" />
<Compile Include="Routing\RoutesCacheTests.cs" />
<Compile Include="Routing\UrlRoutingTestBase.cs" />
<Compile Include="Security\UmbracoBackOfficeIdentityTests.cs" />
<Compile Include="Services\ContentTypeServiceExtensionsTests.cs" />
@@ -15,45 +15,55 @@ angular.module("umbraco.directives")
keyCombo = scope.$eval(attrs["hotkey"]);
}
// disable shortcuts in input fields if keycombo is 1 character
if (keyCombo) {
function activate() {
if (keyCombo.length === 1) {
options = {
inputDisabled: true
};
}
if (keyCombo) {
keyboardService.bind(keyCombo, function() {
var element = $(el);
var activeElementType = document.activeElement.tagName;
var clickableElements = ["A", "BUTTON"];
if (element.is("a,div,button,input[type='button'],input[type='submit'],input[type='checkbox']") && !element.is(':disabled')) {
if (element.is(':visible') || attrs.hotkeyWhenHidden) {
// when keycombo is enter and a link or button has focus - click the link or button instead of using the hotkey
if (keyCombo === "enter" && clickableElements.indexOf(activeElementType) === 0) {
document.activeElement.click();
} else {
element.click();
}
}
} else {
element.focus();
// disable shortcuts in input fields if keycombo is 1 character
if (keyCombo.length === 1) {
options = {
inputDisabled: true
};
}
}, options);
keyboardService.bind(keyCombo, function() {
el.on('$destroy', function() {
keyboardService.unbind(keyCombo);
});
var element = $(el);
var activeElementType = document.activeElement.tagName;
var clickableElements = ["A", "BUTTON"];
if (element.is("a,div,button,input[type='button'],input[type='submit'],input[type='checkbox']") && !element.is(':disabled')) {
if (element.is(':visible') || attrs.hotkeyWhenHidden) {
if (attrs.hotkeyWhen && attrs.hotkeyWhen === "false") {
return;
}
// when keycombo is enter and a link or button has focus - click the link or button instead of using the hotkey
if (keyCombo === "enter" && clickableElements.indexOf(activeElementType) === 0) {
document.activeElement.click();
} else {
element.click();
}
}
} else {
element.focus();
}
}, options);
el.on('$destroy', function() {
keyboardService.unbind(keyCombo);
});
}
}
activate();
};
});
@@ -28,7 +28,8 @@ angular.module("umbraco.directives")
if( value !== undefined && value !== "" && value !== null) {
scope.alias = "Generating Alias...";
scope.alias = "";
scope.placeholderText = "Generating Alias...";
generateAliasTimeout = $timeout(function () {
updateAlias = true;
@@ -28,6 +28,8 @@
// add init tab
addInitGroup(scope.model.groups);
activateFirstGroup(scope.model.groups);
// localize texts
localizationService.localize("validation_validation").then(function(value) {
validationTranslated = value;
@@ -153,14 +155,14 @@
return resourceLookup(scope.model.id, selectedContentTypeAliases, propAliasesExisting).then(function (filteredAvailableCompositeTypes) {
_.each(scope.compositionsDialogModel.availableCompositeContentTypes, function (current) {
//reset first
//reset first
current.allowed = true;
//see if this list item is found in the response (allowed) list
var found = _.find(filteredAvailableCompositeTypes, function (f) {
return current.contentType.alias === f.contentType.alias;
});
//allow if the item was found in the response (allowed) list -
//allow if the item was found in the response (allowed) list -
// and ensure its set to allowed if it is currently checked,
// DO not allow if it's a locked content type.
current.allowed = scope.model.lockedCompositeContentTypes.indexOf(current.contentType.alias) === -1 &&
@@ -181,7 +183,7 @@
}
function setupAvailableContentTypesModel(result) {
scope.compositionsDialogModel.availableCompositeContentTypes = result;
scope.compositionsDialogModel.availableCompositeContentTypes = result;
//iterate each one and set it up
_.each(scope.compositionsDialogModel.availableCompositeContentTypes, function (c) {
//enable it if it's part of the selected model
@@ -276,7 +278,7 @@
// submit overlay if no compositions has been removed
// or the action has been confirmed
} else {
// make sure that all tabs has an init property
if (scope.model.groups.length !== 0) {
angular.forEach(scope.model.groups, function(group) {
@@ -454,6 +456,15 @@
return groups;
}
function activateFirstGroup(groups) {
if (groups && groups.length > 0) {
var firstGroup = groups[0];
if(!firstGroup.tabState || firstGroup.tabState === "inActive") {
firstGroup.tabState = "active";
}
}
}
/* ---------- PROPERTIES ---------- */
scope.addProperty = function(property, group) {
@@ -0,0 +1,29 @@
(function() {
'use strict';
function SetDirtyOnChange() {
function link(scope, el, attr, ctrl) {
var initValue = attr.umbSetDirtyOnChange;
attr.$observe("umbSetDirtyOnChange", function (newValue) {
if(newValue !== initValue) {
ctrl.$setDirty();
}
});
}
var directive = {
require: "^form",
restrict: 'A',
link: link
};
return directive;
}
angular.module('umbraco.directives').directive('umbSetDirtyOnChange', SetDirtyOnChange);
})();
@@ -8,9 +8,9 @@ function valHighlight($timeout) {
return {
restrict: "A",
link: function (scope, element, attrs, ctrl) {
attrs.$observe("valHighlight", function (newVal) {
if (newVal === true) {
if (newVal === "true") {
element.addClass("highlight-error");
$timeout(function () {
//set the bound scope property to false
@@ -25,4 +25,4 @@ function valHighlight($timeout) {
}
};
}
angular.module('umbraco.directives.validation').directive("valHighlight", valHighlight);
angular.module('umbraco.directives.validation').directive("valHighlight", valHighlight);
@@ -0,0 +1,8 @@
angular.module("umbraco.mocks").factory('externalLoginInfo',
function () {
return {
errors: [],
providers: []
};
}
);
@@ -716,7 +716,7 @@ angular.module('umbraco.mocks').
"user_administrators": "Administrator",
"user_categoryField": "Category field",
"user_changePassword": "Change Your Password",
"user_newPassword": "Change Your Password",
"user_newPassword": "New password",
"user_confirmNewPassword": "Confirm new password",
"user_changePasswordDescription": "You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button",
"user_contentChannel": "Content Channel",
@@ -730,6 +730,7 @@ angular.module('umbraco.mocks').
"user_mediastartnode": "Start Node in Media Library",
"user_modules": "Sections",
"user_noConsole": "Disable Umbraco Access",
"user_oldPassword": "Old password",
"user_password": "Password",
"user_resetPassword": "Reset password",
"user_passwordChanged": "Your password has been changed!",
@@ -42,6 +42,15 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
return {
getRecycleBin: function() {
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
"contentApiBaseUrl",
"GetRecycleBin")),
'Failed to retrieve data for content recycle bin');
},
/**
* @ngdoc method
* @name umbraco.resources.contentResource#sort
@@ -24,29 +24,18 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
filterPropertyTypes = [];
}
var query = "";
_.each(filterContentTypes, function (item) {
query += "filterContentTypes=" + item + "&";
});
// if filterContentTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
if (filterContentTypes.length === 0) {
query += "filterContentTypes=&";
}
_.each(filterPropertyTypes, function (item) {
query += "filterPropertyTypes=" + item + "&";
});
// if filterPropertyTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
if (filterPropertyTypes.length === 0) {
query += "filterPropertyTypes=&";
}
query += "contentTypeId=" + contentTypeId;
var query = {
contentTypeId: contentTypeId,
filterContentTypes: filterContentTypes,
filterPropertyTypes: filterPropertyTypes
};
return umbRequestHelper.resourcePromise(
$http.get(
$http.post(
umbRequestHelper.getApiUrl(
"contentTypeApiBaseUrl",
"GetAvailableCompositeContentTypes",
query)),
"GetAvailableCompositeContentTypes"),
query),
'Failed to retrieve data for content type id ' + contentTypeId);
},
@@ -22,6 +22,15 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
return {
getRecycleBin: function () {
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
"mediaApiBaseUrl",
"GetRecycleBin")),
'Failed to retrieve data for media recycle bin');
},
/**
* @ngdoc method
* @name umbraco.resources.mediaResource#sort
@@ -24,29 +24,18 @@ function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
filterPropertyTypes = [];
}
var query = "";
_.each(filterContentTypes, function (item) {
query += "filterContentTypes=" + item + "&";
});
// if filterContentTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
if (filterContentTypes.length === 0) {
query += "filterContentTypes=&";
}
_.each(filterPropertyTypes, function (item) {
query += "filterPropertyTypes=" + item + "&";
});
// if filterPropertyTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
if (filterPropertyTypes.length === 0) {
query += "filterPropertyTypes=&";
}
query += "contentTypeId=" + contentTypeId;
var query = {
contentTypeId: contentTypeId,
filterContentTypes: filterContentTypes,
filterPropertyTypes: filterPropertyTypes
};
return umbRequestHelper.resourcePromise(
$http.get(
$http.post(
umbRequestHelper.getApiUrl(
"mediaTypeApiBaseUrl",
"GetAvailableCompositeMediaTypes",
query)),
"GetAvailableCompositeMediaTypes"),
query),
'Failed to retrieve data for content type id ' + contentTypeId);
},
@@ -53,8 +53,8 @@ function contentTypeHelper(contentTypeResource, dataTypeResource, $filter, $inje
if (modelsBuilderEnabled && modelsResource) {
modelsResource.getModelsOutOfDateStatus().then(function(result) {
//Generate models buttons should be enabled if its not 100
deferred.resolve(result.status !== 100);
//Generate models buttons should be enabled if it is 0
deferred.resolve(result.status === 0);
});
}
else {
@@ -49,9 +49,10 @@
// Disabled state
&.disabled,
&[disabled] {
&[disabled],
&:disabled:hover {
cursor: default;
background-image: none;
border-color: @btnBorder;
.opacity(65);
.box-shadow(none);
}
@@ -88,8 +88,7 @@
display: flex;
flex-flow: row wrap;
justify-content: flex-start;
}
}
.umb-card-grid li {
padding: 5px;
@@ -98,31 +97,42 @@
text-align: center;
width: 100px;
height: 100px;
height: 105px;
box-sizing: border-box;
}
}
.umb-card-grid li.-four-in-row {
flex: 0 0 25%;
}
.umb-card-grid li.-four-in-row {
flex: 0 0 25%;
}
.umb-card-grid li.-three-in-row {
flex: 0 0 33.33%;
}
.umb-card-grid li.-three-in-row {
flex: 0 0 33.33%;
}
.umb-card-grid li:hover, .umb-card-grid li:hover * {
background: @blue;
color: white;
cursor: pointer;
}
.umb-card-grid .umb-card-grid-item {
display: block;
width: 100%;
height: 100%;
}
.umb-card-grid .umb-card-grid-item:hover,
.umb-card-grid .umb-card-grid-item:focus,
.umb-card-grid .umb-card-grid-item:hover > *,
.umb-card-grid .umb-card-grid-item:focus > * {
background: @blue;
color: white;
cursor: pointer;
outline: none;
}
.umb-card-grid a {
color: #222;
text-decoration: none;
}
.umb-card-grid i{
.umb-card-grid i {
font-size: 30px;
line-height: 50px;
display: block;
@@ -200,6 +200,13 @@ ul.color-picker li a {
border: 1px solid #f8f8f8;
}
.umb-sortable-thumbnails li:hover a {
display: flex;
justify-content: center;
align-items: center;
}
.umb-sortable-thumbnails li img {
max-width:100%;
max-height:100%;
@@ -12,6 +12,10 @@ LazyLoad.js(
'lib/angular/angular-ui-sortable.js',
'lib/angular/1.1.5/angular-mocks.js',
'lib/angular/1.1.5/angular-mobile.min.js',
'lib/underscore/underscore-min.js',
'lib/angular-dynamic-locale/tmhDynamicLocale.min.js',
'lib/bootstrap/js/bootstrap.2.3.2.min.js',
@@ -3,5 +3,5 @@
<p>Are you sure you want to navigate away from this page? - you have unsaved changes</p>
<button class="btn btn-warning" ng-click="discard(notification)">Discard changes</button>
<button class="btn" ng-click="stay(notification)">Stay</button>
</div>
<button class="btn" ng-click="stay(notification)" umb-auto-focus>Stay</button>
</div>
@@ -34,7 +34,7 @@
ng-mouseover="vm.showDetailsOverlay(systemDataType)"
ng-click="vm.pickEditor(systemDataType)"
class="-four-in-row">
<a href="" title="{{ systemDataType.name }}">
<a class="umb-card-grid-item" href="" title="{{ systemDataType.name }}">
<i class="{{ systemDataType.icon }}" ng-class="{'icon-autofill': systemDataType.icon == null}"></i>
{{ systemDataType.name }}
</a>
@@ -51,7 +51,7 @@
ng-mouseover="vm.showDetailsOverlay(dataType)"
ng-click="vm.pickDataType(dataType)"
class="-four-in-row">
<a href="" title="{{ dataType.name }}">
<a class="umb-card-grid-item" href="" title="{{ dataType.name }}">
<i class="{{ dataType.icon }}" ng-class="{'icon-autofill': dataType.icon == null}"></i>
{{ dataType.name }}
</a>
@@ -78,7 +78,7 @@
ng-mouseover="vm.showDetailsOverlay(dataType)"
ng-click="vm.pickDataType(dataType)"
class="-four-in-row">
<a href="" title="{{ dataType.name }}">
<a class="umb-card-grid-item" href="" title="{{ dataType.name }}">
<i class="{{ dataType.icon }}" ng-class="{'icon-autofill': dataType.icon == null}"></i>
{{ dataType.name }}
</a>
@@ -96,7 +96,7 @@
ng-mouseover="vm.showDetailsOverlay(systemDataType)"
ng-click="vm.pickEditor(systemDataType)"
class="-four-in-row">
<a href="" title="{{ systemDataType.name }}">
<a class="umb-card-grid-item" href="" title="{{ systemDataType.name }}">
<i class="{{ systemDataType.icon }}" ng-class="{'icon-autofill': systemDataType.icon == null}"></i>
{{ systemDataType.name }}
</a>
@@ -16,7 +16,7 @@
ng-repeat="availableItem in model.availableItems | compareArrays:model.selectedItems:'alias' | orderBy:'name' | filter:searchTerm"
ng-click="selectItem(availableItem)"
class="-three-in-row">
<a href="" title="{{ availableItem.name }}">
<a class="umb-card-grid-item" href="" title="{{ availableItem.name }}">
<i class="{{ availableItem.icon }}"></i>
{{ availableItem.name }}
</a>
@@ -30,18 +30,18 @@ angular.module("umbraco")
var pendingChangeEvent = eventsService.on("valFormManager.pendingChanges", function (e, args) {
//one time listener, remove the event
pendingChangeEvent();
$scope.closeOverLay();
$scope.model.close();
});
//perform the path change, if it is successful then the promise will resolve otherwise it will fail
$scope.closeOverLay();
$scope.model.close();
$location.path("/logout");
};
$scope.gotoHistory = function (link) {
$location.path(link);
$scope.closeOverLay();
$scope.model.close();
};
//Manually update the remaining timeout seconds
@@ -147,6 +147,9 @@ angular.module("umbraco")
formHelper.resetForm({ scope: $scope, notifications: data.notifications });
$scope.changePasswordButtonState = "success";
$timeout(function() {
$scope.togglePasswordFields();
}, 2000);
}, function (err) {
@@ -10,23 +10,32 @@
</small>
</p>
<a href="#/users/framed/%252Fumbraco%252Fusers%252Fedituser.aspx%253Fid%253D{{user.id}}"
class="btn btn-primary"
ng-click="closeOverLay()"
ng-if="canEditProfile">
<localize key="general_edit">Edit</localize>
</a>
<umb-button
type="button"
action="togglePasswordFields()"
label="Change password"
button-style="success">
<umb-button
type="link"
href="#/users/framed/%252Fumbraco%252Fusers%252Fedituser.aspx%253Fid%253D{{user.id}}"
action="model.close()"
button-style="primary"
label="Edit"
label-key="general_edit"
ng-if="canEditProfile">
</umb-button>
<button ng-click="logout()" hotkey="ctrl+shift+l" class="btn btn-warning">
<localize key="general_logout">Log out</localize>
</button>
<umb-button
type="button"
action="togglePasswordFields()"
label="Change password"
label-key="general_changePassword"
button-style="success">
</umb-button>
<umb-button
type="button"
action="logout()"
shortcut="ctrl+shift+l"
button-style="warning"
label="Log out"
label-key="general_logout">
</umb-button>
</div>
@@ -91,19 +100,21 @@
<umb-editor model="changePasswordModel"></umb-editor>
<umb-button
type="button"
action="togglePasswordFields()"
label="Back"
button-style="Cancel">
<umb-button
type="button"
action="togglePasswordFields()"
label="Back"
label-key="general_back"
button-style="cancel">
</umb-button>
<umb-button
type="submit"
label="Change password"
state="changePasswordButtonState"
button-style="success">
</umb-button>
<umb-button
type="submit"
label="Change password"
label-key="general_changePassword"
state="changePasswordButtonState"
button-style="success">
</umb-button>
</form>
@@ -8,7 +8,7 @@
<div ng-if="state !== 'init'" class="umb-button__overlay"></div>
<a ng-if="type === 'link'" href="{{href}}" class="btn umb-button__button {{style}}" hotkey="{{shortcut}}" hotkey-when-hidden="{{shortcutWhenHidden}}">
<a ng-if="type === 'link'" href="{{href}}" class="btn umb-button__button {{style}}" ng-click="action(model)" hotkey="{{shortcut}}" hotkey-when-hidden="{{shortcutWhenHidden}}">
<span class="umb-button__content" ng-class="{'-hidden': state !== 'init'}">
<i ng-if="icon && buttonStyle==='link'" class="{{icon}} umb-button__icon"></i>
<localize ng-if="labelKey" key="{{labelKey}}">{{label}}</localize>
@@ -6,7 +6,7 @@
<p class="umb-overlay__subtitle">{{model.subtitle}}</p>
</div>
<div class="umb-overlay-container" ng-transclude>
<div class="umb-overlay-container form-horizontal" ng-transclude>
<div ng-if="view" ng-include="view"></div>
</div>
@@ -75,6 +75,7 @@
ng-disabled="tab.inherited"
umb-auto-focus
umb-auto-resize
on-focus="activateGroup(tab)"
required
val-server-field="{{'Groups[' + $index + '].Name'}}" />
@@ -109,7 +110,15 @@
<li ng-class="{'umb-group-builder__property-sortable': sortingMode && !property.inherited && !property.locked}" ng-repeat="property in tab.properties">
<!-- Init property / Property placeholder / add new property -->
<a href="" class="umb-group-builder__property -placeholder" ng-if="property.propertyState=='init' && !sortingMode" ng-class="{'-placeholder': property.propertyState=='init'}" hotkey="alt+shift+p" ng-click="addProperty(property, tab)" focus-when="{{property.focus}}">
<a href=""
class="umb-group-builder__property -placeholder"
ng-if="property.propertyState=='init' && !sortingMode"
ng-class="{'-placeholder': property.propertyState=='init'}"
hotkey="alt+shift+p"
hotkey-when="{{tab.tabState === 'active' && property.propertyState=='init'}}"
ng-click="addProperty(property, tab)"
on-focus="activateGroup(tab)"
focus-when="{{property.focus}}">
<div class="umb-group-builder__property-meta">
<div class="umb-group-builder__placeholder-box -input-small"></div>
@@ -8,7 +8,7 @@
*
*/
function ContentRecycleBinController($scope, $routeParams, dataTypeResource, navigationService, localizationService) {
function ContentRecycleBinController($scope, $routeParams, contentResource, navigationService, localizationService) {
//ensures the list view doesn't actually load until we query for the list view config
// for the section
@@ -16,17 +16,23 @@ function ContentRecycleBinController($scope, $routeParams, dataTypeResource, nav
$scope.page.name = "Recycle Bin";
$scope.page.nameLocked = true;
//ensures the list view doesn't actually load until we query for the list view config
// for the section
$scope.listViewPath = null;
$routeParams.id = "-20";
dataTypeResource.getById(-95).then(function (result) {
_.each(result.preValues, function (i) {
$scope.model.config[i.key] = i.value;
contentResource.getRecycleBin().then(function (result) {
//we'll get the 'content item' for the recycle bin, we know that it will contain a single tab and a
// single property, so we'll extract that property (list view) and use it's data.
var listproperty = result.tabs[0].properties[0];
_.each(listproperty.config, function (val, key) {
$scope.model.config[key] = val;
});
$scope.listViewPath = 'views/propertyeditors/listview/listview.html';
});
$scope.model = { config: { entityType: $routeParams.section } };
$scope.model = { config: { entityType: $routeParams.section, layouts: [] } };
// sync tree node
navigationService.syncTree({ tree: "content", path: ["-1", $routeParams.id], forceReload: false });
@@ -35,11 +41,11 @@ function ContentRecycleBinController($scope, $routeParams, dataTypeResource, nav
function localizePageName() {
var pageName = "general_recycleBin";
var pageName = "general_recycleBin";
localizationService.localize(pageName).then(function(value) {
$scope.page.name = value;
});
localizationService.localize(pageName).then(function (value) {
$scope.page.name = value;
});
}
}
@@ -1,17 +1,16 @@
<umb-editor-view ng-controller="Umbraco.Editors.Content.RecycleBinController">
<form>
<umb-editor-header name="page.name"
name-locked="page.nameLocked"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-header
name="page.name"
name-locked="page.nameLocked"
hide-icon="true"
hide-description="true"
hide-alias="true" >
</umb-editor-header>
<umb-editor-container>
<umb-editor-container>
<div ng-include="listViewPath"></div>
<div ng-include="listViewPath"></div>
</umb-editor-container>
</umb-editor-view>
</umb-editor-container>
</form>
</umb-editor-view>
@@ -118,6 +118,7 @@
//Models builder mode:
vm.page.defaultButton = {
hotKey: "ctrl+s",
hotKeyWhenHidden: true,
labelKey: "buttons_save",
letter: "S",
type: "submit",
@@ -125,21 +126,54 @@
};
vm.page.subButtons = [{
hotKey: "ctrl+g",
labelKey: "buttons_generateModels",
hotKeyWhenHidden: true,
labelKey: "buttons_saveAndGenerateModels",
letter: "G",
handler: function () {
vm.page.saveButtonState = "busy";
notificationsService.info("Building models", "this can take abit of time, don't worry");
contentTypeHelper.generateModels().then(function (result) {
vm.page.saveButtonState = "init";
//clear and add success
notificationsService.success("Models Generated");
}, function () {
notificationsService.error("Models could not be generated");
vm.page.saveButtonState = "error";
vm.save().then(function (result) {
vm.page.saveButtonState = "busy";
localizationService.localize("modelsBuilder_buildingModels").then(function (headerValue) {
localizationService.localize("modelsBuilder_waitingMessage").then(function(msgValue) {
notificationsService.info(headerValue, msgValue);
});
});
contentTypeHelper.generateModels().then(function (result) {
if (result.success) {
//re-check model status
contentTypeHelper.checkModelsBuilderStatus().then(function(statusResult) {
vm.page.modelsBuilder = statusResult;
});
//clear and add success
vm.page.saveButtonState = "init";
localizationService.localize("modelsBuilder_modelsGenerated").then(function(value) {
notificationsService.success(value);
});
} else {
vm.page.saveButtonState = "error";
localizationService.localize("modelsBuilder_modelsExceptionInUlog").then(function(value) {
notificationsService.error(value);
});
}
}, function () {
vm.page.saveButtonState = "error";
localizationService.localize("modelsBuilder_modelsGeneratedError").then(function(value) {
notificationsService.error(value);
});
});
});
}
}];
}
@@ -264,7 +298,7 @@
}
function init(contentType) {
// set all tab to inactive
if (contentType.groups.length !== 0) {
angular.forEach(contentType.groups, function (group) {
@@ -8,8 +8,10 @@
*
*/
function MediaRecycleBinController($scope, $routeParams, dataTypeResource, navigationService, localizationService) {
function MediaRecycleBinController($scope, $routeParams, mediaResource, navigationService, localizationService) {
//ensures the list view doesn't actually load until we query for the list view config
// for the section
$scope.page = {};
$scope.page.name = "Recycle Bin";
$scope.page.nameLocked = true;
@@ -19,14 +21,18 @@ function MediaRecycleBinController($scope, $routeParams, dataTypeResource, navig
$scope.listViewPath = null;
$routeParams.id = "-21";
dataTypeResource.getById(-96).then(function (result) {
_.each(result.preValues, function (i) {
$scope.model.config[i.key] = i.value;
mediaResource.getRecycleBin().then(function (result) {
//we'll get the 'content item' for the recycle bin, we know that it will contain a single tab and a
// single property, so we'll extract that property (list view) and use it's data.
var listproperty = result.tabs[0].properties[0];
_.each(listproperty.config, function (val, key) {
$scope.model.config[key] = val;
});
$scope.listViewPath = 'views/propertyeditors/listview/listview.html';
});
$scope.model = { config: { entityType: $routeParams.section } };
$scope.model = { config: { entityType: $routeParams.section, layouts: [] } };
// sync tree node
navigationService.syncTree({ tree: "media", path: ["-1", $routeParams.id], forceReload: false });
@@ -35,14 +41,13 @@ function MediaRecycleBinController($scope, $routeParams, dataTypeResource, navig
function localizePageName() {
var pageName = "general_recycleBin";
var pageName = "general_recycleBin";
localizationService.localize(pageName).then(function(value) {
$scope.page.name = value;
});
localizationService.localize(pageName).then(function (value) {
$scope.page.name = value;
});
}
}
angular.module('umbraco').controller("Umbraco.Editors.Media.RecycleBinController", MediaRecycleBinController);
@@ -1,17 +1,16 @@
<umb-editor-view ng-controller="Umbraco.Editors.Media.RecycleBinController">
<form>
<umb-editor-header name="page.name"
name-locked="page.nameLocked"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-header
name="page.name"
name-locked="page.nameLocked"
hide-icon="true"
hide-description="true"
hide-alias="true">
</umb-editor-header>
<umb-editor-container>
<umb-editor-container>
<div ng-include="listViewPath"></div>
</umb-editor-container>
<div ng-include="listViewPath"></div>
</umb-editor-container>
</form>
</umb-editor-view>
@@ -103,6 +103,7 @@
//Models builder mode:
vm.page.defaultButton = {
hotKey: "ctrl+s",
hotKeyWhenHidden: true,
labelKey: "buttons_save",
letter: "S",
type: "submit",
@@ -110,21 +111,54 @@
};
vm.page.subButtons = [{
hotKey: "ctrl+g",
labelKey: "buttons_generateModels",
hotKeyWhenHidden: true,
labelKey: "buttons_saveAndGenerateModels",
letter: "G",
handler: function () {
vm.page.saveButtonState = "busy";
notificationsService.info("Building models", "this can take abit of time, don't worry");
contentTypeHelper.generateModels().then(function(result) {
vm.page.saveButtonState = "init";
//clear and add success
notificationsService.success("Models Generated");
}, function() {
notificationsService.error("Models could not be generated");
vm.page.saveButtonState = "error";
vm.save().then(function (result) {
vm.page.saveButtonState = "busy";
localizationService.localize("modelsBuilder_buildingModels").then(function (headerValue) {
localizationService.localize("modelsBuilder_waitingMessage").then(function(msgValue) {
notificationsService.info(headerValue, msgValue);
});
});
contentTypeHelper.generateModels().then(function (result) {
if (result.success) {
//re-check model status
contentTypeHelper.checkModelsBuilderStatus().then(function (statusResult) {
vm.page.modelsBuilder = statusResult;
});
//clear and add success
vm.page.saveButtonState = "init";
localizationService.localize("modelsBuilder_modelsGenerated").then(function(value) {
notificationsService.success(value);
});
} else {
vm.page.saveButtonState = "error";
localizationService.localize("modelsBuilder_modelsExceptionInUlog").then(function(value) {
notificationsService.error(value);
});
}
}, function () {
vm.page.saveButtonState = "error";
localizationService.localize("modelsBuilder_modelsGeneratedError").then(function(value) {
notificationsService.error(value);
});
});
});
}
}];
}
@@ -243,7 +277,7 @@
}
function init(contentType) {
// set all tab to inactive
if (contentType.groups.length !== 0) {
angular.forEach(contentType.groups, function (group) {
@@ -60,6 +60,7 @@
//Models builder mode:
vm.page.defaultButton = {
hotKey: "ctrl+s",
hotKeyWhenHidden: true,
labelKey: "buttons_save",
letter: "S",
type: "submit",
@@ -67,21 +68,55 @@
};
vm.page.subButtons = [{
hotKey: "ctrl+g",
labelKey: "buttons_generateModels",
hotKeyWhenHidden: true,
labelKey: "buttons_saveAndGenerateModels",
letter: "G",
handler: function () {
vm.page.saveButtonState = "busy";
notificationsService.info("Building models", "this can take abit of time, don't worry");
contentTypeHelper.generateModels().then(function (result) {
vm.page.saveButtonState = "init";
//clear and add success
notificationsService.success("Models Generated");
}, function () {
notificationsService.error("Models could not be generated");
vm.page.saveButtonState = "error";
vm.save().then(function (result) {
vm.page.saveButtonState = "busy";
localizationService.localize("modelsBuilder_buildingModels").then(function (headerValue) {
localizationService.localize("modelsBuilder_waitingMessage").then(function(msgValue) {
notificationsService.info(headerValue, msgValue);
});
});
contentTypeHelper.generateModels().then(function (result) {
if (result.success) {
//re-check model status
contentTypeHelper.checkModelsBuilderStatus().then(function (statusResult) {
vm.page.modelsBuilder = statusResult;
});
//clear and add success
vm.page.saveButtonState = "init";
localizationService.localize("modelsBuilder_modelsGenerated").then(function(value) {
notificationsService.success(value);
});
} else {
vm.page.saveButtonState = "error";
localizationService.localize("modelsBuilder_modelsExceptionInUlog").then(function(value) {
notificationsService.error(value);
});
}
}, function () {
vm.page.saveButtonState = "error";
localizationService.localize("modelsBuilder_modelsGeneratedError").then(function(value) {
notificationsService.error(value);
});
});
});
}
}];
}
@@ -1,13 +1,13 @@
<div class="umb-editor" ng-controller="Umbraco.PrevalueEditors.MultiValuesController">
<div class="control-group">
<input name="newItem" type="text" ng-model="newItem" val-highlight="hasError" />
<button class="btn btn-small" ng-click="add($event)">Add</button>
<input name="newItem" type="text" ng-model="newItem" val-highlight="{{hasError}}" />
<button class="btn" ng-click="add($event)">Add</button>
</div>
<div ui-sortable="sortableOptions">
<div class="control-group" ng-repeat="item in model.value">
<i class="icon icon-navigation handle"></i>
<input type="text" ng-model="item.value" val-server="item_{{$index}}" required />
<button class="btn btn-small btn-danger" ng-click="remove(item, $event)">Remove</button>
<button class="btn btn-danger" ng-click="remove(item, $event)">Remove</button>
</div>
</div>
</div>
@@ -5,12 +5,14 @@
<strong>{{model.value.generatedPassword}}</strong>
</div>
<div ng-switch="changing">
<div ng-switch-when="false">
<a href="" ng-click="doChange()" class="btn btn-small">Change password</a>
<div ng-switch-when="false">
<a href="" ng-click="doChange()" class="btn btn-small">
<localize key="general_changePassword">Change password</localize>
</a>
</div>
<div ng-switch-when="true">
<umb-control-group alias="resetPassword" label="Reset password?" ng-show="$parent.showReset()">
<umb-control-group alias="resetPassword" label="@user_resetPassword" ng-show="$parent.showReset()">
<input type="checkbox" ng-model="$parent.model.value.reset"
id="Checkbox1"
name="resetPassword"
@@ -19,7 +21,7 @@
</umb-control-group>
<!-- we need to show the old pass field when the provider cannot retrieve the password -->
<umb-control-group alias="oldPassword" label="Old password" ng-show="$parent.showOldPass()">
<umb-control-group alias="oldPassword" label="@user_oldPassword" ng-show="$parent.showOldPass()">
<input type="password" name="oldPassword" ng-model="$parent.model.value.oldPassword"
class="input-large umb-textstring textstring"
ng-required="$parent.showOldPass()"
@@ -29,7 +31,7 @@
<span class="help-inline" val-msg-for="oldPassword" val-toggle-msg="valServer"></span>
</umb-control-group>
<umb-control-group alias="password" label="New password" ng-show="$parent.showNewPass()">
<umb-control-group alias="password" label="@user_newPassword" ng-show="$parent.showNewPass()">
<input type="password" name="password" ng-model="$parent.model.value.newPassword"
class="input-large umb-textstring textstring"
ng-required="!$parent.model.value.reset"
@@ -41,16 +43,20 @@
<span class="help-inline" val-msg-for="password" val-toggle-msg="valServer"></span>
</umb-control-group>
<umb-control-group alias="confirmpassword" label="Confirm password" ng-show="$parent.showConfirmPass()">
<umb-control-group alias="confirmpassword" label="@user_confirmNewPassword" ng-show="$parent.showConfirmPass()">
<input type="password" name="confirmpassword" ng-model="$parent.model.confirm"
class="input-large umb-textstring textstring"
val-compare="password" no-dirty-check
autocomplete="off" />
autocomplete="off"/>
<span class="help-inline" val-msg-for="confirmpassword" val-toggle-msg="valCompare">Passwords must match</span>
</umb-control-group>
<span class="help-inline" val-msg-for="confirmpassword" val-toggle-msg="valCompare">
<localize key="user_passwordMismatch">The confirmed password doesn't match the new password!</localize>
</span>
</umb-control-group>
<a href="" ng-click="cancelChange()" ng-show="showCancelBtn()" class="btn btn-small">Cancel</a>
<a href="" ng-click="cancelChange()" ng-show="showCancelBtn()" class="btn btn-small">
<localize key="general_cancel">Cancel</localize>
</a>
</div>
</div>
</div>
@@ -1,12 +1,12 @@
<div ng-controller="Umbraco.PrevalueEditors.MultiColorPickerController">
<div class="control-group color-picker-preval">
<input name="newColor" type="hidden" />
<button class="btn add" ng-click="add($event)">Add</button>
<label for="newColor" val-highlight="hasError">{{newColor}}</label>
<button class="btn btn-small add" ng-click="add($event)">Add</button>
</div>
<div class="control-group color-picker-preval" ng-repeat="item in model.value">
<div class="thumbnail span1" hex-bg-color="{{item.value}}" bg-orig="transparent"></div>
<pre>{{item.value}}</pre>
<button class="btn btn-small btn-danger" ng-click="remove(item, $event)">Remove</button>
<button class="btn btn-danger" ng-click="remove(item, $event)">Remove</button>
</div>
</div>
</div>
@@ -159,7 +159,7 @@ angular.module("umbraco")
if (thumbnail) {
if (mediaHelper.detectIfImageByExtension(property.value)) {
//get default big thumbnail from image processor
var thumbnailUrl = property.value + "?rnd=" + moment(entity.updateDate).format("YYYYMMDDHHmmss") + "&width=500";
var thumbnailUrl = property.value + "?rnd=" + moment(entity.updateDate).format("YYYYMMDDHHmmss") + "&width=500&animationprocessmode=first";
return thumbnailUrl;
}
else {
@@ -41,6 +41,7 @@ angular.module("umbraco")
if($scope.control.editor.config && $scope.control.editor.config.size){
url += "?width=" + $scope.control.editor.config.size.width;
url += "&height=" + $scope.control.editor.config.size.height;
url += "&animationprocessmode=first";
if($scope.control.value.focalPoint){
url += "&center=" + $scope.control.value.focalPoint.top +"," + $scope.control.value.focalPoint.left;
@@ -48,6 +49,11 @@ angular.module("umbraco")
}
}
// set default size if no crop present (moved from the view)
if (url.indexOf('?') == -1)
{
url += "?width=800&upscale=false&animationprocessmode=false"
}
$scope.url = url;
}
};
@@ -9,7 +9,7 @@
<img
ng-if="url"
ng-click="setImage()"
ng-src="{{url}}?width=800&upscale=false"
ng-src="{{url}}"
class="fullSizeImage" />
<input type="text" class="caption" ng-model="control.value.caption" localize="placeholder" placeholder="@grid_placeholderImageCaption" />
</div>
@@ -1,9 +1,11 @@
angular.module("umbraco")
.controller("Umbraco.PropertyEditors.GridController",
function ($scope, $http, assetsService, localizationService, $rootScope, dialogService, gridService, mediaResource, imageHelper, $timeout, umbRequestHelper) {
function ($scope, $http, assetsService, localizationService, $rootScope, dialogService, gridService, mediaResource, imageHelper, $timeout, umbRequestHelper, angularHelper) {
// Grid status variables
var placeHolder = "";
var currentForm = angularHelper.getCurrentForm($scope);
$scope.currentRow = null;
$scope.currentCell = null;
$scope.currentToolsControl = null;
@@ -73,6 +75,7 @@ angular.module("umbraco")
tinyMCE.execCommand("mceRemoveEditor", false, id);
tinyMCE.init(draggedRteSettings[id]);
});
currentForm.$setDirty();
}
};
@@ -160,6 +163,7 @@ angular.module("umbraco")
}
});
}
currentForm.$setDirty();
},
start: function (e, ui) {
@@ -320,6 +324,8 @@ angular.module("umbraco")
section.rows.push(row);
}
currentForm.$setDirty();
$scope.showRowConfigurations = false;
};
@@ -329,8 +335,7 @@ angular.module("umbraco")
section.rows.splice($index, 1);
$scope.currentRow = null;
$scope.openRTEToolbarId = null;
//$scope.initContent();
currentForm.$setDirty();
}
if(section.rows.length === 0) {
@@ -397,6 +402,8 @@ angular.module("umbraco")
gridItem.config = configObject;
gridItem.hasConfig = gridItemHasConfig(styleObject, configObject);
currentForm.$setDirty();
$scope.gridItemSettingsDialog.show = false;
$scope.gridItemSettingsDialog = null;
};
@@ -407,7 +414,7 @@ angular.module("umbraco")
};
};
function stripModifier(val, modifier) {
if (!val || !modifier || modifier.indexOf(placeHolder) < 0) {
return val;
@@ -174,7 +174,8 @@
ng-click="clickControl($index, area.controls, area)"
ng-class="{'-active': control.active}"
on-outside-click="clickOutsideControl($index, area.controls, area)"
bind-click-on="{{control.active}}">
bind-click-on="{{control.active}}"
umb-set-dirty-on-change="{{control.value}}">
<div class="umb-control-click-overlay" ng-show="!control.active && !sortMode"></div>
@@ -116,7 +116,7 @@ angular.module('umbraco')
if (property.value.src) {
if (thumbnail === true) {
return property.value.src + "?width=500&mode=max";
return property.value.src + "?width=500&mode=max&animationprocessmode=first";
}
else {
return property.value.src;
@@ -24,26 +24,26 @@
<div class="control-group">
<label>Alias</label>
<input name="newItem.alias" type="text"
ng-model="newItem.alias" val-highlight="hasError" />
ng-model="newItem.alias" val-highlight="{{hasError}}" />
</div>
<div class="control-group">
<label>Size</label>
<input name="newItem.width" type="number" placeholder="Width"
ng-model="newItem.width" class="umb-editor-tiny" val-highlight="hasError" />
ng-model="newItem.width" class="umb-editor-tiny" val-highlight="{{hasError}}" />
&times;
<input name="newItem.height" type="number" placeholder="Height"
ng-model="newItem.height" class="umb-editor-tiny" val-highlight="hasError" />
ng-model="newItem.height" class="umb-editor-tiny" val-highlight="{{hasError}}" />
</div>
<div class="control-group">
<button class="btn btn-small" ng-click="add($event)">Save crop</button>
<a href class="btn btn-small btn-link" ng-click="cancel($event)">Cancel</a>
<button class="btn" ng-click="add($event)">Save crop</button>
<a href class="btn btn-link" ng-click="cancel($event)">Cancel</a>
</div>
</div>
<div class="control-group" ng-hide="newItem">
<button class="btn btn-small" ng-click="newItem = {}" prevent-default>Add new crop</button>
<button class="btn" ng-click="newItem = {}" prevent-default>Add new crop</button>
</div>
</div>
</div>
@@ -14,7 +14,10 @@
var vm = this;
vm.nodeId = $scope.contentId;
vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
//vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
//instead of passing in a whitelist, we pass in a blacklist by adding ! to the ext
vm.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles).replace(/./g, "!.");
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
vm.activeDrag = false;
vm.mediaDetailsTooltip = {};
@@ -54,7 +54,7 @@
<tfoot>
<tr>
<td></td>
<td><input type="text" ng-model="newCaption" localize="placeholder" placeholder="@relatedlinks_captionPlaceholder" val-highlight="hasError" /></td>
<td><input type="text" ng-model="newCaption" localize="placeholder" placeholder="@relatedlinks_captionPlaceholder" val-highlight="{{hasError}}" /></td>
<td>
<div ng-show="addExternal">
<input type="text" ng-model="newLink" localize="placeholder" placeholder="@relatedlinks_externalLinkPlaceholder" />
@@ -0,0 +1,23 @@
function modelsBuilderResource($q, $http, umbRequestHelper) {
return {
getModelsOutOfDateStatus: function () {
return umbRequestHelper.resourcePromise(
$http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetModelsOutOfDateStatus")),
"Failed to get models out-of-date status");
},
buildModels: function () {
return umbRequestHelper.resourcePromise(
$http.post(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "BuildModels")),
"Failed to build models");
},
getDashboard: function () {
return umbRequestHelper.resourcePromise(
$http.get(umbRequestHelper.getApiUrl("modelsBuilderBaseUrl", "GetDashboard")),
"Failed to get dashboard");
}
};
}
angular.module("umbraco.resources").factory("modelsBuilderResource", modelsBuilderResource);
+10 -7
View File
@@ -136,12 +136,12 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="ImageProcessor, Version=2.3.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.2.3.2.0\lib\net45\ImageProcessor.dll</HintPath>
<Reference Include="ImageProcessor, Version=2.3.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.2.3.3.0\lib\net45\ImageProcessor.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ImageProcessor.Web, Version=4.5.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.Web.4.5.1.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Reference Include="ImageProcessor.Web, Version=4.5.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ImageProcessor.Web.4.5.3.0\lib\net45\ImageProcessor.Web.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="log4net, Version=1.2.11.0, Culture=neutral, processorArchitecture=MSIL">
@@ -350,8 +350,8 @@
<Name>umbraco.providers</Name>
</ProjectReference>
<Reference Include="System.Xml.Linq" />
<Reference Include="Umbraco.ModelsBuilder, Version=3.0.0.80, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Umbraco.ModelsBuilder.3.0.0-RC1\lib\Umbraco.ModelsBuilder.dll</HintPath>
<Reference Include="Umbraco.ModelsBuilder, Version=3.0.0.90, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Umbraco.ModelsBuilder.3.0.0\lib\Umbraco.ModelsBuilder.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="UrlRewritingNet.UrlRewriter, Version=2.0.7.0, Culture=neutral, processorArchitecture=MSIL">
@@ -578,6 +578,9 @@
<Compile Include="Umbraco\TreeInit.aspx.designer.cs">
<DependentUpon>treeInit.aspx</DependentUpon>
</Compile>
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.controller.js" />
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.htm" />
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.resource.js" />
<Content Include="Config\grid.editors.config.js" />
<Content Include="Config\Lang\cs-CZ.user.xml" />
<Content Include="Config\Lang\da-DK.user.xml" />
@@ -636,6 +639,7 @@
</SubType>
</Content>
<Content Include="Umbraco\Install\Views\Web.config" />
<Content Include="App_Plugins\ModelsBuilder\package.manifest" />
<None Include="Config\404handlers.Release.config">
<DependentUpon>404handlers.config</DependentUpon>
</None>
@@ -2383,7 +2387,6 @@
</ItemGroup>
<ItemGroup>
<Folder Include="App_Data\" />
<Folder Include="App_Plugins\" />
<Folder Include="Media\" />
<Folder Include="Umbraco\preview\" />
<Folder Include="Umbraco_Client\FolderBrowser\Images\" />
@@ -22,7 +22,7 @@
</control>
</tab>
</section>
<section alias="StartupDeveloperDashboardSection">
<areas>
<area>developer</area>
@@ -72,7 +72,7 @@
views/dashboard/default/startupdashboardintro.html
</control>
</tab>
</tab>
</section>
<section alias="StartupMemberDashboardSection">
@@ -85,4 +85,16 @@
</control>
</tab>
</section>
<section alias="UmbracoModelsBuilder">
<areas>
<area>developer</area>
</areas>
<tab caption="Models Builder">
<control>
/App_Plugins/ModelsBuilder/modelsbuilder.htm
</control>
</tab>
</section>
</dashBoard>
+3 -3
View File
@@ -5,8 +5,8 @@
<package id="ClientDependency-Mvc5" version="1.8.0.0" targetFramework="net45" />
<package id="dotless" version="1.4.1.0" targetFramework="net45" />
<package id="Examine" version="0.1.68.0" targetFramework="net45" />
<package id="ImageProcessor" version="2.3.2.0" targetFramework="net45" />
<package id="ImageProcessor.Web" version="4.5.1.0" targetFramework="net45" />
<package id="ImageProcessor" version="2.3.3.0" targetFramework="net45" />
<package id="ImageProcessor.Web" version="4.5.3.0" targetFramework="net45" />
<package id="log4net-mediumtrust" version="2.0.0" targetFramework="net45" />
<package id="Lucene.Net" version="2.9.4.1" targetFramework="net45" />
<package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net45" />
@@ -35,6 +35,6 @@
<package id="SqlServerCE" version="4.0.0.0" targetFramework="net45" />
<package id="System.Collections.Immutable" version="1.1.36" targetFramework="net45" />
<package id="System.Reflection.Metadata" version="1.0.21" targetFramework="net45" />
<package id="Umbraco.ModelsBuilder" version="3.0.0-RC1" targetFramework="net45" />
<package id="Umbraco.ModelsBuilder" version="3.0.0" targetFramework="net45" />
<package id="UrlRewritingNet.UrlRewriter" version="2.0.7" targetFramework="net45" />
</packages>
@@ -319,6 +319,7 @@
<key alias="add">Tilføj</key>
<key alias="alias">Alias</key>
<key alias="areyousure">Er du sikker?</key>
<key alias="back">Tilbage</key>
<key alias="border">Kant</key>
<key alias="by">af</key>
<key alias="cancel">Fortryd</key>
@@ -870,6 +871,8 @@ Mange hilsner fra Umbraco robotten
<key alias="fileSavedHeader">Fil gemt</key>
<key alias="fileSavedText">Fil gemt uden fejl</key>
<key alias="languageSaved">Sprog gemt</key>
<key alias="mediaTypeSavedHeader">Medietype gemt</key>
<key alias="memberTypeSavedHeader">Medlemstype gemt</key>
<key alias="pythonErrorHeader">Python script ikke gemt</key>
<key alias="pythonErrorText">Python-script kunne ikke gemmes pga. fejl</key>
<key alias="pythonSavedHeader">Python-script gemt</key>
@@ -1007,7 +1010,7 @@ Mange hilsner fra Umbraco robotten
<key alias="administrators">Administrator</key>
<key alias="categoryField">Kategorifelt</key>
<key alias="changePassword">Skift dit kodeord</key>
<key alias="newPassword">Skift dit kodeord</key>
<key alias="newPassword">Nyt kodeord</key>
<key alias="confirmNewPassword">Gentag dit nye kodeord</key>
<key alias="changePasswordDescription">Du kan ændre dit kodeord, som giver dig adgang til Umbraco Back Office ved at udfylde formularen og klikke på knappen 'Skift dit kodeord'</key>
<key alias="contentChannel">Indholdskanal</key>
@@ -1021,6 +1024,7 @@ Mange hilsner fra Umbraco robotten
<key alias="mediastartnode">Startnode i mediearkivet</key>
<key alias="modules">Moduler</key>
<key alias="noConsole">Deaktivér adgang til Umbraco</key>
<key alias="oldPassword">Gammelt kodeord</key>
<key alias="password">Adgangskode</key>
<key alias="resetPassword">Nulstil kodeord</key>
<key alias="passwordChanged">Dit kodeord er blevet ændret!</key>
@@ -25,7 +25,7 @@
<key alias="protect">Public access</key>
<key alias="publish">Publish</key>
<key alias="unpublish">Unpublish</key>
<key alias="refreshNode">Reload nodes</key>
<key alias="refreshNode">Reload</key>
<key alias="republish">Republish entire site</key>
<key alias="restore" version="7.3.0">Restore</key>
<key alias="rights">Permissions</key>
@@ -374,6 +374,7 @@
<key alias="alias">Alias</key>
<key alias="all">All</key>
<key alias="areyousure">Are you sure?</key>
<key alias="back">Back</key>
<key alias="border">Border</key>
<key alias="by">by</key>
<key alias="cancel">Cancel</key>
@@ -926,6 +927,8 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="fileSavedHeader">File saved</key>
<key alias="fileSavedText">File saved without any errors</key>
<key alias="languageSaved">Language saved</key>
<key alias="mediaTypeSavedHeader">Media Type saved</key>
<key alias="memberTypeSavedHeader">Member Type saved</key>
<key alias="pythonErrorHeader">Python script not saved</key>
<key alias="pythonErrorText">Python script could not be saved due to error</key>
<key alias="pythonSavedHeader">Python script saved</key>
@@ -1193,7 +1196,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="administrators">Administrator</key>
<key alias="categoryField">Category field</key>
<key alias="changePassword">Change Your Password</key>
<key alias="newPassword">Change Your Password</key>
<key alias="newPassword">New password</key>
<key alias="confirmNewPassword">Confirm new password</key>
<key alias="changePasswordDescription">You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button</key>
<key alias="contentChannel">Content Channel</key>
@@ -1207,6 +1210,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="mediastartnode">Start Node in Media Library</key>
<key alias="modules">Sections</key>
<key alias="noConsole">Disable Umbraco Access</key>
<key alias="oldPassword">Old password</key>
<key alias="password">Password</key>
<key alias="resetPassword">Reset password</key>
<key alias="passwordChanged">Your password has been changed!</key>
@@ -25,7 +25,7 @@
<key alias="protect">Public access</key>
<key alias="publish">Publish</key>
<key alias="unpublish">Unpublish</key>
<key alias="refreshNode">Reload nodes</key>
<key alias="refreshNode">Reload</key>
<key alias="republish">Republish entire site</key>
<key alias="restore" version="7.3.0">Restore</key>
<key alias="rights">Permissions</key>
@@ -96,6 +96,7 @@
<key alias="styleShow">Show styles</key>
<key alias="tableInsert">Insert table</key>
<key alias="generateModels">Generate models</key>
<key alias="saveAndGenerateModels">Save and generate models</key>
</area>
<area alias="changeDocType">
<key alias="changeDocTypeInstruction">To change the document type for the selected content, first select from the list of valid types for this location.</key>
@@ -164,7 +165,7 @@
<key alias="uploadClear">Remove file(s)</key>
<key alias="urls">Link to document</key>
<key alias="memberof">Member of group(s)</key>
<key alias="notmemberof">Not a member of group(s)</key>
<key alias="notmemberof">Not a member of group(s)</key>
<key alias="childItems" version="7.0">Child items</key>
<key alias="target" version="7.0">Target</key>
</area>
@@ -245,18 +246,18 @@
<key alias="treepicker">Pick item</key>
<key alias="viewCacheItem">View Cache Item</key>
<key alias="createFolder">Create folder...</key>
<key alias="relateToOriginalLabel">Relate to original</key>
<key alias="theFriendliestCommunity">The friendliest community</key>
<key alias="linkToPage">Link to page</key>
<key alias="openInNewWindow">Opens the linked document in a new window or tab</key>
<key alias="openInFullBody">Opens the linked document in the full body of the window</key>
<key alias="openInParentFrame">Opens the linked document in the parent frame</key>
<key alias="linkToMedia">Link to media</key>
<key alias="selectMedia">Select media</key>
<key alias="selectIcon">Select icon</key>
<key alias="selectItem">Select item</key>
@@ -265,18 +266,18 @@
<key alias="selectContent">Select content</key>
<key alias="selectMember">Select member</key>
<key alias="selectMemberGroup">Select member group</key>
<key alias="noMacroParams">There are no parameters for this macro</key>
<key alias="externalLoginProviders">External login providers</key>
<key alias="exceptionDetail">Exception Details</key>
<key alias="stracktrace">Stacktrace</key>
<key alias="linkYour">Link your</key>
<key alias="unLinkYour">Un-Link your</key>
<key alias="account">account</key>
<key alias="selectEditor">Select editor</key>
</area>
<area alias="dictionaryItem">
@@ -352,7 +353,7 @@
<key alias="macroErrorLoadingCustomControl">Error loading customControl (Assembly: %0%, Type: '%1%')</key>
<key alias="macroErrorLoadingMacroEngineScript">Error loading MacroEngine script (file: %0%)</key>
<key alias="macroErrorParsingXSLTFile">"Error parsing XSLT file: %0%</key>
<key alias="macroErrorReadingXSLTFile">"Error reading XSLT file: %0%</key>
<key alias="macroErrorReadingXSLTFile">"Error reading XSLT file: %0%</key>
<key alias="missingTitle">Please enter a title</key>
<key alias="missingType">Please choose a type</key>
<key alias="pictureResizeBiggerThanOrg">You're about to make the picture larger than the original size. Are you sure that you want to proceed?</key>
@@ -375,6 +376,7 @@
<key alias="alias">Alias</key>
<key alias="all">All</key>
<key alias="areyousure">Are you sure?</key>
<key alias="back">Back</key>
<key alias="border">Border</key>
<key alias="by">by</key>
<key alias="cancel">Cancel</key>
@@ -497,14 +499,14 @@
<key alias="addTemplate">Add template</key>
<key alias="addChildNode">Add child node</key>
<key alias="addChild">Add child</key>
<key alias="editDataType">Edit data type</key>
<key alias="navigateSections">Navigate sections</key>
<key alias="shortcut">Shortcuts</key>
<key alias="showShortcuts">show shortcuts</key>
<key alias="toggleListView">Toggle list view</key>
<key alias="toggleAllowAsRoot">Toggle allow as root</key>
</area>
@@ -541,7 +543,7 @@
Press the <strong>upgrade</strong> button to upgrade your database to Umbraco %0%</p>
<p>
Don't worry - no content will be deleted and everything will continue working afterwards!
</p>
</p>
]]></key>
<key alias="databaseUpgradeDone">
<![CDATA[Your database has been upgraded to the final version %0%.<br/>Press <strong>Next</strong> to
@@ -553,7 +555,7 @@
<key alias="defaultUserPassChanged"><![CDATA[<strong>The Default user's password has been successfully changed since the installation!</strong></p><p>No further actions needs to be taken. Click <strong>Next</strong> to proceed.]]></key>
<key alias="defaultUserPasswordChanged">The password is changed!</key>
<key alias="defaultUserText">
<![CDATA[Umbraco creates a default user with a login <strong>('admin')</strong> and password <strong> ('default')</strong>. It's <strong>important</strong> that the password is changed to something unique.
<![CDATA[Umbraco creates a default user with a login <strong>('admin')</strong> and password <strong> ('default')</strong>. It's <strong>important</strong> that the password is changed to something unique.
]]></key>
<key alias="greatStart">Get a great start, watch our introduction videos</key>
<key alias="licenseText">By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI.</key>
@@ -621,9 +623,9 @@ You installed Runway, so why not see how your new website looks.]]></key>
<key alias="theEndFurtherHelp"><![CDATA[<h3>Further help and information</h3>
Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]></key>
<key alias="theEndHeader">Umbraco %0% is installed and ready for use</key>
<key alias="theEndInstallFailed"><![CDATA[To finish the installation, you'll need to
<key alias="theEndInstallFailed"><![CDATA[To finish the installation, you'll need to
manually edit the <strong>/web.config file</strong> and update the AppSetting key <strong>UmbracoConfigurationStatus</strong> in the bottom to the value of <strong>'%0%'</strong>.]]></key>
<key alias="theEndInstallSuccess"><![CDATA[You can get <strong>started instantly</strong> by clicking the "Launch Umbraco" button below. <br />If you are <strong>new to Umbraco</strong>,
<key alias="theEndInstallSuccess"><![CDATA[You can get <strong>started instantly</strong> by clicking the "Launch Umbraco" button below. <br />If you are <strong>new to Umbraco</strong>,
you can find plenty of resources on our getting started pages.]]></key>
<key alias="theEndOpenUmbraco"><![CDATA[<h3>Launch Umbraco</h3>
To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]></key>
@@ -653,7 +655,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="greeting6">Happy Caturday</key>
<key alias="instruction">Log in below</key>
<key alias="timeout">Session timed out</key>
<key alias="bottomText"><![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">Umbraco.com</a></p> ]]></key>
<key alias="bottomText"><![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="http://umbraco.com" style="text-decoration: none" target="_blank">Umbraco.com</a></p> ]]></key>
</area>
<area alias="main">
<key alias="dashboard">Dashboard</key>
@@ -692,7 +694,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="mailBodyHtml">
<![CDATA[<p>Hi %0%</p>
<p>This is an automated mail to inform you that the task <strong>'%1%'</strong>
<p>This is an automated mail to inform you that the task <strong>'%1%'</strong>
has been performed on the page <a href="http://%4%/#/content/content/edit/%5%"><strong>'%2%'</strong></a>
by the user <strong>'%3%'</strong>
</p>
@@ -710,7 +712,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<div style="margin: 8px 0; padding: 8px; display: block;">
<br />
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/#/content/content/edit/%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EDIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp;
<a style="color: white; font-weight: bold; background-color: #5372c3; text-decoration : none; margin-right: 20px; border: 8px solid #5372c3; width: 150px;" href="http://%4%/#/content/content/edit/%5%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EDIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a> &nbsp;
<br />
</div>
@@ -784,7 +786,7 @@ To manage your website, simply open the Umbraco back office and start adding con
</key>
<key alias="contentPublishedFailedExpired"><![CDATA[
%0% could not be published because the item has expired.
]]></key>
]]></key>
<key alias="contentPublishedFailedInvalid"><![CDATA[
%0% could not be published because these properties: %1% did not pass validation rules.
]]></key>
@@ -883,8 +885,8 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="sortPleaseWait"><![CDATA[ Please wait. Items are being sorted, this can take a while.<br/> <br/> Do not close this window during sorting]]></key>
</area>
<area alias="speechBubbles">
<key alias="validationFailedHeader">Validation</key>
<key alias="validationFailedMessage">Validation errors must be fixed before the item can be saved</key>
<key alias="validationFailedHeader">Validation</key>
<key alias="validationFailedMessage">Validation errors must be fixed before the item can be saved</key>
<key alias="operationFailedHeader">Failed</key>
<key alias="invalidUserPermissionsText">Insufficient user permissions, could not complete the operation</key>
<key alias="operationCancelledHeader">Cancelled</key>
@@ -924,6 +926,8 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="fileSavedHeader">File saved</key>
<key alias="fileSavedText">File saved without any errors</key>
<key alias="languageSaved">Language saved</key>
<key alias="mediaTypeSavedHeader">Media Type saved</key>
<key alias="memberTypeSavedHeader">Member Type saved</key>
<key alias="pythonErrorHeader">Python script not saved</key>
<key alias="pythonErrorText">Python script could not be saved due to error</key>
<key alias="pythonSavedHeader">Python script saved</key>
@@ -1020,10 +1024,10 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="inheritedFrom">Inherited from</key>
<key alias="addProperty">Add property</key>
<key alias="requiredLabel">Required label</key>
<key alias="enableListViewHeading">Enable list view</key>
<key alias="enableListViewDescription">Configures the content item to show a sortable and searchable list of its children, the children will not be shown in the tree</key>
<key alias="allowedTemplatesHeading">Allowed Templates</key>
<key alias="allowedTemplatesDescription">Choose which templates editors are allowed to use on content of this type</key>
<key alias="allowAsRootHeading">Allow as root</key>
@@ -1069,6 +1073,14 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="tabHasNoSortOrder">tab has no sort order</key>
</area>
<area alias="modelsBuilder">
<key alias="buildingModels">Building models</key>
<key alias="waitingMessage">this can take abit of time, don't worry</key>
<key alias="modelsGenerated">Models generated</key>
<key alias="modelsGeneratedError">Models could not be generated</key>
<key alias="modelsExceptionInUlog">Models generation has failed, see exception in U log</key>
</area>
<area alias="templateEditor">
<key alias="alternativeField">Alternative field</key>
<key alias="alternativeText">Alternative Text</key>
@@ -1101,7 +1113,7 @@ To manage your website, simply open the Umbraco back office and start adding con
</area>
<area alias="translation">
<key alias="assignedTasks">Tasks assigned to you</key>
<key alias="assignedTasksHelp"><![CDATA[ The list below shows translation tasks <strong>assigned to you</strong>. To see a detailed view including comments, click on "Details" or just the page name.
<key alias="assignedTasksHelp"><![CDATA[ The list below shows translation tasks <strong>assigned to you</strong>. To see a detailed view including comments, click on "Details" or just the page name.
You can also download the page as XML directly by clicking the "Download Xml" link. <br/>
To close a translation task, please go to the Details view and click the "Close" button.
]]></key>
@@ -1130,8 +1142,8 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="mailSubject">[%0%] Translation task for %1%</key>
<key alias="noTranslators">No translator users found. Please create a translator user before you start sending content to translation</key>
<key alias="ownedTasks">Tasks created by you</key>
<key alias="ownedTasksHelp"><![CDATA[ The list below shows pages <strong>created by you</strong>. To see a detailed view including comments,
click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link.
<key alias="ownedTasksHelp"><![CDATA[ The list below shows pages <strong>created by you</strong>. To see a detailed view including comments,
click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link.
To close a translation task, please go to the Details view and click the "Close" button.
]]></key>
<key alias="pageHasBeenSendToTranslation">The page '%0%' has been send to translation</key>
@@ -1189,7 +1201,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="administrators">Administrator</key>
<key alias="categoryField">Category field</key>
<key alias="changePassword">Change Your Password</key>
<key alias="newPassword">Change Your Password</key>
<key alias="newPassword">New password</key>
<key alias="confirmNewPassword">Confirm new password</key>
<key alias="changePasswordDescription">You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button</key>
<key alias="contentChannel">Content Channel</key>
@@ -1203,6 +1215,7 @@ To manage your website, simply open the Umbraco back office and start adding con
<key alias="mediastartnode">Start Node in Media Library</key>
<key alias="modules">Sections</key>
<key alias="noConsole">Disable Umbraco Access</key>
<key alias="oldPassword">Old password</key>
<key alias="password">Password</key>
<key alias="resetPassword">Reset password</key>
<key alias="passwordChanged">Your password has been changed!</key>
@@ -85,6 +85,7 @@
<key alias="relations">Править связи</key>
<key alias="returnToList">Вернуться к списку</key>
<key alias="save">Сохранить</key>
<key alias="saveAndGenerateModels">Сохранить и построить модели</key>
<key alias="saveAndPublish">Сохранить и опубликовать</key>
<key alias="saveToPublish">Сохранить и направить на публикацию</key>
<key alias="saveListView">Сохранить список</key>
@@ -234,6 +235,7 @@
<key alias="memberCanEdit">Участник может изменить</key>
<key alias="showOnMemberProfile">Показать в профиле участника</key>
<key alias="tabHasNoSortOrder">для вкладки не указан порядок сортировки</key>
</area>
<area alias="create">
<key alias="chooseNode">Где вы хотите создать новый %0%</key>
@@ -418,6 +420,7 @@
<key alias="alias">Алиас</key>
<key alias="all">Все</key>
<key alias="areyousure">Вы уверены?</key>
<key alias="back">Назад</key>
<key alias="border">Границы</key>
<key alias="by">пользователем</key>
<key alias="cancel">Отмена</key>
@@ -731,6 +734,13 @@
<key alias="createNewMember">Создать нового участника</key>
<key alias="allMembers">Все участники</key>
</area>
<area alias="modelsBuilder">
<key alias="buildingModels">Построение моделей</key>
<key alias="waitingMessage">это может занять некоторое время, пожалуйста, подождите</key>
<key alias="modelsGenerated">Модели построены</key>
<key alias="modelsGeneratedError">Модели не могут быть построены</key>
<key alias="modelsExceptionInUlog">Процесс построения моделей завершился ошибкой, подробности в системном журнале Umbraco</key>
</area>
<area alias="moveOrCopy">
<key alias="choose">Выберите страницу...</key>
<key alias="copyDone">Узел %0% был скопирован в %1%</key>
@@ -1004,6 +1014,8 @@
<key alias="fileSavedHeader">Файл сохранен</key>
<key alias="fileSavedText">Файл сохранен без ошибок</key>
<key alias="languageSaved">Язык сохранен</key>
<key alias="mediaTypeSavedHeader">Тип медиа сохранен</key>
<key alias="memberTypeSavedHeader">Тип участника сохранен</key>
<key alias="partialViewErrorHeader">Представление не сохранено</key>
<key alias="partialViewErrorText">Произошла ошибка при сохранении файла</key>
<key alias="partialViewSavedHeader">Представление сохранено</key>
@@ -1174,6 +1186,7 @@
<key alias="modules">Разделы</key>
<key alias="newPassword">Новый пароль</key>
<key alias="noConsole">Отключить доступ к административной панели Umbraco</key>
<key alias="oldPassword">Прежний пароль</key>
<key alias="password">Пароль</key>
<key alias="passwordChanged">Ваш пароль доступа изменен!</key>
<key alias="passwordConfirm">Подвердите новый пароль</key>
@@ -193,14 +193,7 @@ namespace Umbraco.Web.UI.Umbraco.Dialogs
private IEnumerable<PropertyType> GetPropertiesOfContentType(IContentType contentType)
{
var properties = contentType.PropertyTypes.ToList();
while (contentType.ParentId > -1 && contentType.CompositionAliases().Any())
{
contentType = Services.ContentTypeService.GetContentType(contentType.ParentId);
properties.AddRange(contentType.PropertyTypes);
}
return properties.OrderBy(x => x.Name);
return contentType.CompositionPropertyTypes;
}
private void DisplayNotAvailable()
+205 -8
View File
@@ -4,15 +4,15 @@
<!--
CAREFUL!
========
ONLY edit this if a certain change NEEDS to go into the config file of EVERYBODY contributing to the project.
After first build you will get your own web.config, which is no included in source control.
In the web.config you can edit all you want, it won't be overwritten, but it WILL be altered by this transform file.
The transforms in this file only apply to debugging, not to the web.config that will be released, see web.Template.Release.config for that
-->
@@ -62,8 +62,6 @@
<add key="autoFormsAuthentication" value="false" />
<add key="log4net.Config" value="config\log4net.config" />
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
<add key="Zbu.ModelsBuilder.EnableDllModels" value="true" />
</appSettings>
<connectionStrings xdt:Transform="Remove" xdt:Locator="Condition(@configSource != '')" />
@@ -107,7 +105,206 @@
<add path="GoogleSpellChecker.ashx" xdt:Transform="Remove" xdt:Locator="Match(path)" />
</httpHandlers>
</system.web>
<system.web>
<compilation xdt:Transform="InsertIfMissing" />
<compilation>
<assemblies xdt:Transform="InsertIfMissing" />
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<add assembly="System.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Collections.Concurrent, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel.Annotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ComponentModel.EventBasedAsync, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Contracts, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Debug, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Tools, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Globalization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Linq.Queryable, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.NetworkInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Net.Requests, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ObjectModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit.ILGeneration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Emit.Lightweight, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Reflection.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Resources.ResourceManager, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.InteropServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.InteropServices.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Json, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Runtime.Serialization.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Security.Principal, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Duplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.NetTcp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.ServiceModel.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.Encoding.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Text.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Threading.Tasks.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.ReaderWriter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.XDocument, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
<add assembly="System.Xml.XmlSerializer, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" xdt:Locator="Match(assembly)" xdt:Transform="InsertIfMissing" />
</assemblies>
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Collections" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Collections.Concurrent" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel.Annotations" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ComponentModel.EventBasedAsync" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Contracts" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Debug" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Tools" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Diagnostics.Tracing" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Dynamic.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Globalization" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.IO" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Expressions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Linq.Queryable" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.NetworkInformation" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Net.Requests" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ObjectModel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit.ILGeneration" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Emit.Lightweight" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Reflection.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Resources.ResourceManager" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.InteropServices" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Numerics" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Json" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Runtime.Serialization.Xml" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Security.Principal" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Duplex" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Http" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.NetTcp" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.ServiceModel.Security" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.Encoding" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.Encoding.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Text.RegularExpressions" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading.Tasks" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Threading.Tasks.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.ReaderWriter" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.XDocument" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
<remove assembly="System.Xml.XmlSerializer" xdt:Locator="Match(assembly)" xdt:Transform="Remove" />
</assemblies>
</compilation>
<compilation>
<assemblies>
<remove assembly="System.Web.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Collections" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Collections.Concurrent" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel.Annotations" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ComponentModel.EventBasedAsync" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Contracts" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Debug" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Tools" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Diagnostics.Tracing" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Dynamic.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Globalization" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.IO" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Expressions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Linq.Queryable" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.NetworkInformation" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Net.Requests" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ObjectModel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit.ILGeneration" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Emit.Lightweight" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Reflection.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Resources.ResourceManager" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.InteropServices" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Numerics" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Json" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Runtime.Serialization.Xml" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Security.Principal" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Duplex" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Http" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.NetTcp" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Primitives" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.ServiceModel.Security" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.Encoding" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.Encoding.Extensions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Text.RegularExpressions" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading.Tasks" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Threading.Tasks.Parallel" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.ReaderWriter" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.XDocument" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
<remove assembly="System.Xml.XmlSerializer" xdt:Locator="Match(assembly)" xdt:Transform="InsertBefore(/configuration/system.web/compilation/assemblies/add)" />
</assemblies>
</compilation>
<httpModules xdt:Transform="InsertIfMissing" />
<httpModules>
<add name="umbracoRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="umbracoBaseRequestModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="viewstateMoverModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name=" UmbracoModule" xdt:Locator="Match(name)" xdt:Transform="Remove" />
<add name="UmbracoModule" type="Umbraco.Web.UmbracoModule,umbraco" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
</httpModules>
</system.web>
<system.web.extensions xdt:Transform="Remove" />
<system.codedom xdt:Transform="Remove" />
@@ -124,7 +321,7 @@
<requestLimits maxAllowedContentLength="1073741824" xdt:Transform="InsertIfMissing" />
</requestFiltering>
</security>
</system.webServer>
<runtime>
+103 -6
View File
@@ -31,8 +31,8 @@
<log4net configSource="config\log4net.config" />
<appSettings>
<!--
Umbraco web.config configuration documentation can be found here:
<!--
Umbraco web.config configuration documentation can be found here:
http://our.umbraco.org/documentation/using-umbraco/config-files/#webconfig
-->
<add key="umbracoConfigurationStatus" value="" />
@@ -55,7 +55,7 @@
<add key="Umbraco.ModelsBuilder.Enable" value="true"/>
<add key="Umbraco.ModelsBuilder.ModelsMode" value="PureLive" />
</appSettings>
<connectionStrings>
<remove name="umbracoDbDSN" />
@@ -123,18 +123,115 @@
<assemblies>
<remove assembly="System.Web.Http" />
<remove assembly="System.Net.Http" />
<remove assembly="System.Runtime" />
<remove assembly="Umbraco.ModelsBuilder" />
<remove assembly="System.Collections" />
<remove assembly="System.Collections.Concurrent" />
<remove assembly="System.ComponentModel" />
<remove assembly="System.ComponentModel.Annotations" />
<remove assembly="System.ComponentModel.EventBasedAsync" />
<remove assembly="System.Diagnostics.Contracts" />
<remove assembly="System.Diagnostics.Debug" />
<remove assembly="System.Diagnostics.Tools" />
<remove assembly="System.Diagnostics.Tracing" />
<remove assembly="System.Dynamic.Runtime" />
<remove assembly="System.Globalization" />
<remove assembly="System.IO" />
<remove assembly="System.Linq" />
<remove assembly="System.Linq.Expressions" />
<remove assembly="System.Linq.Parallel" />
<remove assembly="System.Linq.Queryable" />
<remove assembly="System.Net.NetworkInformation" />
<remove assembly="System.Net.Primitives" />
<remove assembly="System.Net.Requests" />
<remove assembly="System.ObjectModel" />
<remove assembly="System.Reflection" />
<remove assembly="System.Reflection.Emit" />
<remove assembly="System.Reflection.Emit.ILGeneration" />
<remove assembly="System.Reflection.Emit.Lightweight" />
<remove assembly="System.Reflection.Extensions" />
<remove assembly="System.Reflection.Primitives" />
<remove assembly="System.Resources.ResourceManager" />
<remove assembly="System.Runtime" />
<remove assembly="System.Runtime.Extensions" />
<remove assembly="System.Runtime.InteropServices" />
<remove assembly="System.Runtime.InteropServices.WindowsRuntime" />
<remove assembly="System.Runtime.Numerics" />
<remove assembly="System.Runtime.Serialization.Json" />
<remove assembly="System.Runtime.Serialization.Primitives" />
<remove assembly="System.Runtime.Serialization.Xml" />
<remove assembly="System.Security.Principal" />
<remove assembly="System.ServiceModel.Duplex" />
<remove assembly="System.ServiceModel.Http" />
<remove assembly="System.ServiceModel.NetTcp" />
<remove assembly="System.ServiceModel.Primitives" />
<remove assembly="System.ServiceModel.Security" />
<remove assembly="System.Text.Encoding" />
<remove assembly="System.Text.Encoding.Extensions" />
<remove assembly="System.Text.RegularExpressions" />
<remove assembly="System.Threading" />
<remove assembly="System.Threading.Tasks" />
<remove assembly="System.Threading.Tasks.Parallel" />
<remove assembly="System.Xml.ReaderWriter" />
<remove assembly="System.Xml.XDocument" />
<remove assembly="System.Xml.XmlSerializer" />
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Web.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<add assembly="Umbraco.ModelsBuilder"/>
<add assembly="System.Collections, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Collections.Concurrent, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ComponentModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ComponentModel.Annotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ComponentModel.EventBasedAsync, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Diagnostics.Contracts, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Diagnostics.Debug, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Diagnostics.Tools, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Diagnostics.Tracing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Globalization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.IO, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Linq.Expressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Linq.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Linq.Queryable, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Net.NetworkInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Net.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Net.Requests, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ObjectModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Reflection, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Reflection.Emit, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Reflection.Emit.ILGeneration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Reflection.Emit.Lightweight, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Reflection.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Reflection.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Resources.ResourceManager, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.InteropServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.InteropServices.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.Serialization.Json, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.Serialization.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Runtime.Serialization.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Security.Principal, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ServiceModel.Duplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ServiceModel.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ServiceModel.NetTcp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ServiceModel.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.ServiceModel.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Text.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Text.Encoding.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Text.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Threading, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Threading.Tasks, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Threading.Tasks.Parallel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Xml.ReaderWriter, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Xml.XDocument, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Xml.XmlSerializer, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</assemblies>
<buildProviders>
<add extension=".cshtml" type="umbraco.MacroEngines.RazorBuildProvider, umbraco.MacroEngines" />
<add extension=".vbhtml" type="umbraco.MacroEngines.RazorBuildProvider, umbraco.MacroEngines" />
<add extension=".razor" type="umbraco.MacroEngines.RazorBuildProvider, umbraco.MacroEngines" />
<add extension=".models" type="Umbraco.ModelsBuilder.AspNet.ModelsBuildProvider, Umbraco.ModelsBuilder.AspNet" />
</buildProviders>
</compilation>
@@ -351,6 +351,10 @@ namespace Umbraco.Web.Editors
"imageFileTypes",
string.Join(",", UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes)
},
{
"disallowedUploadFiles",
string.Join(",", UmbracoConfig.For.UmbracoSettings().Content.DisallowedUploadFiles)
},
{
"maxFileSize",
GetMaxRequestLength()
+25 -1
View File
@@ -30,6 +30,7 @@ using Umbraco.Core.Dynamics;
using umbraco.BusinessLogic.Actions;
using umbraco.cms.businesslogic.web;
using umbraco.presentation.preview;
using Umbraco.Core.PropertyEditors;
using Umbraco.Web.UI;
using Constants = Umbraco.Core.Constants;
using Notification = Umbraco.Web.Models.ContentEditing.Notification;
@@ -76,13 +77,36 @@ namespace Umbraco.Web.Editors
return foundContent.Select(Mapper.Map<IContent, ContentItemDisplay>);
}
/// <summary>
/// Returns an item to be used to display the recycle bin for content
/// </summary>
/// <returns></returns>
public ContentItemDisplay GetRecycleBin()
{
var display = new ContentItemDisplay
{
Id = Constants.System.RecycleBinContent,
Alias = "recycleBin",
ParentId = -1,
Name = Services.TextService.Localize("general/recycleBin"),
ContentTypeAlias = "recycleBin",
CreateDate = DateTime.Now,
IsContainer = true,
Path = "-1," + Constants.System.RecycleBinContent
};
TabsAndPropertiesResolver.AddListView(display, "content", Services.DataTypeService, Services.TextService);
return display;
}
/// <summary>
/// Gets the content json for the content id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[OutgoingEditorModelEvent]
[EnsureUserPermissionForContent("id")]
[EnsureUserPermissionForContent("id")]
public ContentItemDisplay GetById(int id)
{
var foundContent = GetObjectFromRequest(() => Services.ContentService.GetById(id));
@@ -18,6 +18,7 @@ using Umbraco.Core.Strings;
using Umbraco.Web.WebApi;
using Umbraco.Web.WebApi.Filters;
using Umbraco.Core.Logging;
using Umbraco.Web.Models;
namespace Umbraco.Web.Editors
{
@@ -102,6 +103,7 @@ namespace Umbraco.Web.Editors
/// <summary>
/// Returns the avilable compositions for this content type
/// This has been wrapped in a dto instead of simple parameters to support having multiple parameters in post request body
/// </summary>
/// <param name="contentTypeId"></param>
/// <param name="filterContentTypes">
@@ -114,11 +116,10 @@ namespace Umbraco.Web.Editors
/// be looked up via the db, they need to be passed in.
/// </param>
/// <returns></returns>
public HttpResponseMessage GetAvailableCompositeContentTypes(int contentTypeId,
[FromUri]string[] filterContentTypes,
[FromUri]string[] filterPropertyTypes)
[HttpPost]
public HttpResponseMessage GetAvailableCompositeContentTypes(GetAvailableCompositionsFilter filter)
{
var result = PerformGetAvailableCompositeContentTypes(contentTypeId, UmbracoObjectTypes.DocumentType, filterContentTypes, filterPropertyTypes)
var result = PerformGetAvailableCompositeContentTypes(filter.ContentTypeId, UmbracoObjectTypes.DocumentType, filter.FilterContentTypes, filter.FilterPropertyTypes)
.Select(x => new
{
contentType = x.Item1,
+36 -3
View File
@@ -88,6 +88,29 @@ namespace Umbraco.Web.Editors
return mapped;
}
/// <summary>
/// Returns an item to be used to display the recycle bin for media
/// </summary>
/// <returns></returns>
public ContentItemDisplay GetRecycleBin()
{
var display = new ContentItemDisplay
{
Id = Constants.System.RecycleBinMedia,
Alias = "recycleBin",
ParentId = -1,
Name = Services.TextService.Localize("general/recycleBin"),
ContentTypeAlias = "recycleBin",
CreateDate = DateTime.Now,
IsContainer = true,
Path = "-1," + Constants.System.RecycleBinMedia
};
TabsAndPropertiesResolver.AddListView(display, "media", Services.DataTypeService, Services.TextService);
return display;
}
/// <summary>
/// Gets the content json for the content id
/// </summary>
@@ -123,7 +146,7 @@ namespace Umbraco.Web.Editors
/// <summary>
/// Returns media items known to be a container of other media items
/// </summary>
/// <param name="ids"></param>
/// <param name="id"></param>
/// <returns></returns>
[FilterAllowedOutgoingMedia(typeof(IEnumerable<ContentItemBasic<ContentPropertyBasic, IMedia>>))]
public IEnumerable<ContentItemBasic<ContentPropertyBasic, IMedia>> GetChildFolders(int id = -1)
@@ -507,7 +530,17 @@ namespace Umbraco.Web.Editors
if (UmbracoConfig.For.UmbracoSettings().Content.ImageFileTypes.Contains(ext))
mediaType = Constants.Conventions.MediaTypes.Image;
var f = mediaService.CreateMedia(fileName, parentId, mediaType, Security.CurrentUser.Id);
//TODO: make the media item name "nice" since file names could be pretty ugly, we have
// string extensions to do much of this but we'll need:
// * Pascalcase the name (use string extensions)
// * strip the file extension
// * underscores to spaces
// * probably remove 'ugly' characters - let's discuss
// All of this logic should exist in a string extensions method and be unit tested
// http://issues.umbraco.org/issue/U4-5572
var mediaItemName = fileName;
var f = mediaService.CreateMedia(mediaItemName, parentId, mediaType, Security.CurrentUser.Id);
var fileInfo = new FileInfo(file.LocalFileName);
var fs = fileInfo.OpenReadWithRetry();
@@ -521,7 +554,7 @@ namespace Umbraco.Web.Editors
if (saveResult == false)
{
AddCancelMessage(tempFiles,
message: Services.TextService.Localize("speechBubbles/operationCancelledText") + " -- " + fileName,
message: Services.TextService.Localize("speechBubbles/operationCancelledText") + " -- " + mediaItemName,
localizeMessage: false);
}
else
@@ -18,6 +18,7 @@ using System.Text;
using Umbraco.Web.WebApi;
using ContentType = System.Net.Mime.ContentType;
using Umbraco.Core.Services;
using Umbraco.Web.Models;
namespace Umbraco.Web.Editors
{
@@ -89,6 +90,7 @@ namespace Umbraco.Web.Editors
/// <summary>
/// Returns the avilable compositions for this content type
/// This has been wrapped in a dto instead of simple parameters to support having multiple parameters in post request body
/// </summary>
/// <param name="contentTypeId"></param>
/// <param name="filterContentTypes">
@@ -101,11 +103,10 @@ namespace Umbraco.Web.Editors
/// be looked up via the db, they need to be passed in.
/// </param>
/// <returns></returns>
public HttpResponseMessage GetAvailableCompositeMediaTypes(int contentTypeId,
[FromUri]string[] filterContentTypes,
[FromUri]string[] filterPropertyTypes)
[HttpPost]
public HttpResponseMessage GetAvailableCompositeMediaTypes(GetAvailableCompositionsFilter filter)
{
var result = PerformGetAvailableCompositeContentTypes(contentTypeId, UmbracoObjectTypes.MediaType, filterContentTypes, filterPropertyTypes)
var result = PerformGetAvailableCompositeContentTypes(filter.ContentTypeId, UmbracoObjectTypes.MediaType, filter.FilterContentTypes, filter.FilterPropertyTypes)
.Select(x => new
{
contentType = x.Item1,
@@ -167,7 +168,7 @@ namespace Umbraco.Web.Editors
var display = Mapper.Map<MediaTypeDisplay>(savedCt);
display.AddSuccessNotification(
Services.TextService.Localize("speechBubbles/contentTypeSavedHeader"),
Services.TextService.Localize("speechBubbles/mediaTypeSavedHeader"),
string.Empty);
return display;
@@ -139,7 +139,7 @@ namespace Umbraco.Web.Editors
var display = Mapper.Map<MemberTypeDisplay>(savedCt);
display.AddSuccessNotification(
Services.TextService.Localize("speechBubbles/contentTypeSavedHeader"),
Services.TextService.Localize("speechBubbles/memberTypeSavedHeader"),
string.Empty);
return display;
+21 -36
View File
@@ -1,38 +1,18 @@
namespace Umbraco.Web
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Web.Models;
namespace Umbraco.Web
{
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Web.Models;
internal static class ImageCropperBaseExtensions
{
internal static ImageCropData GetImageCrop(this string json, string id)
{
var ic = new ImageCropData();
if (json.DetectIsJson())
{
try
{
var imageCropperSettings = JsonConvert.DeserializeObject<List<ImageCropData>>(json);
ic = imageCropperSettings.GetCrop(id);
}
catch (Exception ex)
{
LogHelper.Error(typeof(ImageCropperBaseExtensions), "Could not parse the json string: " + json, ex);
}
}
return ic;
}
internal static ImageCropDataSet SerializeToCropDataSet(this string json)
{
var imageCrops = new ImageCropDataSet();
@@ -40,7 +20,11 @@
{
try
{
imageCrops = JsonConvert.DeserializeObject<ImageCropDataSet>(json);
imageCrops = JsonConvert.DeserializeObject<ImageCropDataSet>(json, new JsonSerializerSettings
{
Culture = CultureInfo.InvariantCulture,
FloatParseHandling = FloatParseHandling.Decimal
});
}
catch (Exception ex)
{
@@ -61,13 +45,14 @@
internal static ImageCropData GetCrop(this IEnumerable<ImageCropData> dataset, string cropAlias)
{
if (dataset == null || !dataset.Any())
var imageCropDatas = dataset.ToArray();
if (dataset == null || imageCropDatas.Any() == false)
return null;
if (string.IsNullOrEmpty(cropAlias))
return dataset.FirstOrDefault();
return imageCropDatas.FirstOrDefault();
return dataset.FirstOrDefault(x => x.Alias.ToLowerInvariant() == cropAlias.ToLowerInvariant());
return imageCropDatas.FirstOrDefault(x => x.Alias.ToLowerInvariant() == cropAlias.ToLowerInvariant());
}
internal static string GetCropBaseUrl(this ImageCropDataSet cropDataSet, string cropAlias, bool preferFocalPoint)
+101 -68
View File
@@ -1,12 +1,13 @@
namespace Umbraco.Web
using System;
using Newtonsoft.Json.Linq;
using System.Globalization;
using System.Text;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Web.Models;
namespace Umbraco.Web
{
using System.Globalization;
using System.Text;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Web.Models;
/// <summary>
/// Provides extension methods for getting ImageProcessor Url from the core Image Cropper property editor
/// </summary>
@@ -113,35 +114,43 @@
ImageCropRatioMode? ratioMode = null,
bool upScale = true)
{
string imageCropperValue = null;
string mediaItemUrl;
if (mediaItem.HasProperty(propertyAlias) && mediaItem.HasValue(propertyAlias))
{
//TODO: We should change this, the default value is JObject now, this means we are ToString() ing the value,
// then re-deserializing it back to json and then to a strongly typed model.
// With a tiny bit of work we can make this more efficient since it's already a JObject.
imageCropperValue = mediaItem.GetPropertyValue<string>(propertyAlias);
// get the raw value (this will be json)
var urlValue = mediaItem.GetPropertyValue<string>(propertyAlias);
mediaItemUrl = urlValue.DetectIsJson()
? urlValue.SerializeToCropDataSet().Src
: urlValue;
}
else
{
mediaItemUrl = mediaItem.Url;
}
if (mediaItem == null) throw new ArgumentNullException("mediaItem");
var cacheBusterValue = cacheBuster ? mediaItem.UpdateDate.ToFileTimeUtc().ToString(CultureInfo.InvariantCulture) : null;
return mediaItemUrl != null
? GetCropUrl(mediaItemUrl, width, height, imageCropperValue, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBusterValue, furtherOptions, ratioMode, upScale)
: string.Empty;
if (mediaItem.HasProperty(propertyAlias) == false || mediaItem.HasValue(propertyAlias) == false)
return string.Empty;
//get the default obj from the value converter
var cropperValue = mediaItem.GetPropertyValue(propertyAlias);
//is it strongly typed?
var stronglyTyped = cropperValue as ImageCropDataSet;
string mediaItemUrl;
if (stronglyTyped != null)
{
mediaItemUrl = stronglyTyped.Src;
return GetCropUrl(
mediaItemUrl, stronglyTyped, width, height, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions,
cacheBusterValue, furtherOptions, ratioMode, upScale);
}
//this shouldn't be the case but we'll check
var jobj = cropperValue as JObject;
if (jobj != null)
{
stronglyTyped = jobj.ToObject<ImageCropDataSet>();
mediaItemUrl = stronglyTyped.Src;
return GetCropUrl(
mediaItemUrl, stronglyTyped, width, height, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions,
cacheBusterValue, furtherOptions, ratioMode, upScale);
}
//it's a single string
mediaItemUrl = cropperValue.ToString();
return GetCropUrl(
mediaItemUrl, width, height, mediaItemUrl, cropAlias, quality, imageCropMode, imageCropAnchor, preferFocalPoint, useCropDimensions,
cacheBusterValue, furtherOptions, ratioMode, upScale);
}
/// <summary>
@@ -207,49 +216,73 @@
string furtherOptions = null,
ImageCropRatioMode? ratioMode = null,
bool upScale = true)
{
if (string.IsNullOrEmpty(imageUrl)) return string.Empty;
ImageCropDataSet cropDataSet = null;
if (string.IsNullOrEmpty(imageCropperValue) == false && imageCropperValue.DetectIsJson() && (imageCropMode == ImageCropMode.Crop || imageCropMode == null))
{
cropDataSet = imageCropperValue.SerializeToCropDataSet();
}
return GetCropUrl(
imageUrl, cropDataSet, width, height, cropAlias, quality, imageCropMode,
imageCropAnchor, preferFocalPoint, useCropDimensions, cacheBusterValue, furtherOptions, ratioMode, upScale);
}
public static string GetCropUrl(
this string imageUrl,
ImageCropDataSet cropDataSet,
int? width = null,
int? height = null,
string cropAlias = null,
int? quality = null,
ImageCropMode? imageCropMode = null,
ImageCropAnchor? imageCropAnchor = null,
bool preferFocalPoint = false,
bool useCropDimensions = false,
string cacheBusterValue = null,
string furtherOptions = null,
ImageCropRatioMode? ratioMode = null,
bool upScale = true)
{
if (string.IsNullOrEmpty(imageUrl) == false)
{
var imageProcessorUrl = new StringBuilder();
if (string.IsNullOrEmpty(imageCropperValue) == false && imageCropperValue.DetectIsJson() && (imageCropMode == ImageCropMode.Crop || imageCropMode == null))
if (cropDataSet != null && (imageCropMode == ImageCropMode.Crop || imageCropMode == null))
{
var cropDataSet = imageCropperValue.SerializeToCropDataSet();
if (cropDataSet != null)
var crop = cropDataSet.GetCrop(cropAlias);
imageProcessorUrl.Append(cropDataSet.Src);
var cropBaseUrl = cropDataSet.GetCropBaseUrl(cropAlias, preferFocalPoint);
if (cropBaseUrl != null)
{
var crop = cropDataSet.GetCrop(cropAlias);
imageProcessorUrl.Append(cropBaseUrl);
}
else
{
return null;
}
imageProcessorUrl.Append(cropDataSet.Src);
if (crop != null & useCropDimensions)
{
width = crop.Width;
height = crop.Height;
}
var cropBaseUrl = cropDataSet.GetCropBaseUrl(cropAlias, preferFocalPoint);
if (cropBaseUrl != null)
{
imageProcessorUrl.Append(cropBaseUrl);
}
else
{
return null;
}
// If a predefined crop has been specified & there are no coordinates & no ratio mode, but a width parameter has been passed we can get the crop ratio for the height
if (crop != null && string.IsNullOrEmpty(cropAlias) == false && crop.Coordinates == null && ratioMode == null && width != null && height == null)
{
var heightRatio = (decimal)crop.Height / (decimal)crop.Width;
imageProcessorUrl.Append("&heightratio=" + heightRatio.ToString(CultureInfo.InvariantCulture));
}
if (crop != null & useCropDimensions)
{
width = crop.Width;
height = crop.Height;
}
// If a predefined crop has been specified & there are no coordinates & no ratio mode, but a width parameter has been passed we can get the crop ratio for the height
if (crop != null && string.IsNullOrEmpty(cropAlias) == false && crop.Coordinates == null && ratioMode == null && width != null && height == null)
{
var heightRatio = (decimal)crop.Height / (decimal)crop.Width;
imageProcessorUrl.Append("&heightratio=" + heightRatio.ToString(CultureInfo.InvariantCulture));
}
// If a predefined crop has been specified & there are no coordinates & no ratio mode, but a height parameter has been passed we can get the crop ratio for the width
if (crop != null && string.IsNullOrEmpty(cropAlias) == false && crop.Coordinates == null && ratioMode == null && width == null && height != null)
{
var widthRatio = (decimal)crop.Width / (decimal)crop.Height;
imageProcessorUrl.Append("&widthratio=" + widthRatio.ToString(CultureInfo.InvariantCulture));
}
// If a predefined crop has been specified & there are no coordinates & no ratio mode, but a height parameter has been passed we can get the crop ratio for the width
if (crop != null && string.IsNullOrEmpty(cropAlias) == false && crop.Coordinates == null && ratioMode == null && width == null && height != null)
{
var widthRatio = (decimal)crop.Width / (decimal)crop.Height;
imageProcessorUrl.Append("&widthratio=" + widthRatio.ToString(CultureInfo.InvariantCulture));
}
}
else
@@ -310,7 +343,7 @@
if (upScale == false)
{
imageProcessorUrl.Append("&upscale=false");
imageProcessorUrl.Append("&upscale=false");
}
if (furtherOptions != null)
@@ -0,0 +1,9 @@
namespace Umbraco.Web.Models.ContentEditing
{
public class GetAvailableCompositionsFilter
{
public int ContentTypeId { get; set; }
public string[] FilterPropertyTypes { get; set; }
public string[] FilterContentTypes { get; set; }
}
}
@@ -27,5 +27,14 @@ namespace Umbraco.Web.Models.ContentEditing
[DataMember(Name = "locked")]
[ReadOnly(true)]
public bool Locked { get; set; }
/// <summary>
/// This is required for the UI editor to know if this particular property belongs to
/// an inherited item or the current item.
/// </summary>
[DataMember(Name = "contentTypeId")]
[ReadOnly(true)]
public int ContentTypeId { get; set; }
}
}
+6 -8
View File
@@ -78,16 +78,14 @@ namespace Umbraco.Web.Models
domain = pos == 0
? null
: domainHelper.DomainForNode(int.Parse(route.Substring(0, pos)), current).UmbracoDomain;
}
}
if (domain == null || domain.LanguageIsoCode.IsNullOrWhiteSpace())
return GetDefaultCulture(localizationService);
var rootContentId = domain == null ? -1 : domain.RootContentId;
var wcDomain = DomainHelper.FindWildcardDomainInPath(domainService.GetAll(true), contentPath, rootContentId);
var wcDomain = DomainHelper.FindWildcardDomainInPath(domainService.GetAll(true), contentPath, domain.RootContentId);
return wcDomain == null
? new CultureInfo(domain.LanguageIsoCode)
: new CultureInfo(wcDomain.LanguageIsoCode);
if (wcDomain != null) return new CultureInfo(wcDomain.LanguageIsoCode);
if (domain != null) return new CultureInfo(domain.LanguageIsoCode);
return GetDefaultCulture(localizationService);
}
private static CultureInfo GetDefaultCulture(ILocalizationService localizationService)
+60 -1
View File
@@ -1,9 +1,11 @@
using System;
using System.Runtime.Serialization;
using Umbraco.Core.Dynamics;
namespace Umbraco.Web.Models
{
[DataContract(Name = "imageCropCoordinates")]
public class ImageCropCoordinates
public class ImageCropCoordinates : CaseInsensitiveDynamicObject<ImageCropCoordinates>, IEquatable<ImageCropCoordinates>
{
[DataMember(Name = "x1")]
public decimal X1 { get; set; }
@@ -16,5 +18,62 @@ namespace Umbraco.Web.Models
[DataMember(Name = "y2")]
public decimal Y2 { get; set; }
/// <summary>
/// Indicates whether the current object is equal to another object of the same type.
/// </summary>
/// <returns>
/// true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false.
/// </returns>
/// <param name="other">An object to compare with this object.</param>
public bool Equals(ImageCropCoordinates other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return X1 == other.X1 && Y1 == other.Y1 && X2 == other.X2 && Y2 == other.Y2;
}
/// <summary>
/// Determines whether the specified object is equal to the current object.
/// </summary>
/// <returns>
/// true if the specified object is equal to the current object; otherwise, false.
/// </returns>
/// <param name="obj">The object to compare with the current object. </param>
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ImageCropCoordinates) obj);
}
/// <summary>
/// Serves as the default hash function.
/// </summary>
/// <returns>
/// A hash code for the current object.
/// </returns>
public override int GetHashCode()
{
unchecked
{
var hashCode = X1.GetHashCode();
hashCode = (hashCode*397) ^ Y1.GetHashCode();
hashCode = (hashCode*397) ^ X2.GetHashCode();
hashCode = (hashCode*397) ^ Y2.GetHashCode();
return hashCode;
}
}
public static bool operator ==(ImageCropCoordinates left, ImageCropCoordinates right)
{
return Equals(left, right);
}
public static bool operator !=(ImageCropCoordinates left, ImageCropCoordinates right)
{
return !Equals(left, right);
}
}
}
+62 -6
View File
@@ -1,17 +1,16 @@
using System.Runtime.Serialization;
using System;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using Umbraco.Core.Dynamics;
namespace Umbraco.Web.Models
{
[DataContract(Name = "imageCropData")]
public class ImageCropData
public class ImageCropData : CaseInsensitiveDynamicObject<ImageCropData>, IEquatable<ImageCropData>
{
[DataMember(Name = "alias")]
public string Alias { get; set; }
//[DataMember(Name = "name")]
//public string Name { get; set; }
[DataMember(Name = "width")]
public int Width { get; set; }
@@ -20,6 +19,63 @@ namespace Umbraco.Web.Models
[DataMember(Name = "coordinates")]
public ImageCropCoordinates Coordinates { get; set; }
/// <summary>
/// Indicates whether the current object is equal to another object of the same type.
/// </summary>
/// <returns>
/// true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false.
/// </returns>
/// <param name="other">An object to compare with this object.</param>
public bool Equals(ImageCropData other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return string.Equals(Alias, other.Alias) && Width == other.Width && Height == other.Height && Equals(Coordinates, other.Coordinates);
}
/// <summary>
/// Determines whether the specified object is equal to the current object.
/// </summary>
/// <returns>
/// true if the specified object is equal to the current object; otherwise, false.
/// </returns>
/// <param name="obj">The object to compare with the current object. </param>
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ImageCropData) obj);
}
/// <summary>
/// Serves as the default hash function.
/// </summary>
/// <returns>
/// A hash code for the current object.
/// </returns>
public override int GetHashCode()
{
unchecked
{
var hashCode = (Alias != null ? Alias.GetHashCode() : 0);
hashCode = (hashCode*397) ^ Width;
hashCode = (hashCode*397) ^ Height;
hashCode = (hashCode*397) ^ (Coordinates != null ? Coordinates.GetHashCode() : 0);
return hashCode;
}
}
public static bool operator ==(ImageCropData left, ImageCropData right)
{
return Equals(left, right);
}
public static bool operator !=(ImageCropData left, ImageCropData right)
{
return !Equals(left, right);
}
}
}
+83 -3
View File
@@ -1,15 +1,27 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;
using System.Web;
using Newtonsoft.Json;
using Umbraco.Core;
using Umbraco.Core.Dynamics;
using Umbraco.Core.Serialization;
using Umbraco.Web.PropertyEditors.ValueConverters;
namespace Umbraco.Web.Models
{
[JsonConverter(typeof(NoTypeConverterJsonConverter<ImageCropDataSet>))]
[TypeConverter(typeof(ImageCropDataSetConverter))]
[DataContract(Name="imageCropDataSet")]
public class ImageCropDataSet : IHtmlString
{
public class ImageCropDataSet : CaseInsensitiveDynamicObject<ImageCropDataSet>, IHtmlString, IEquatable<ImageCropDataSet>
{
[DataMember(Name="src")]
public string Src { get; set;}
@@ -19,7 +31,6 @@ namespace Umbraco.Web.Models
[DataMember(Name = "crops")]
public IEnumerable<ImageCropData> Crops { get; set; }
public string GetCropUrl(string alias, bool useCropDimensions = true, bool useFocalPoint = false, string cacheBusterValue = null)
{
@@ -72,5 +83,74 @@ namespace Umbraco.Web.Models
{
return this.Src;
}
/// <summary>
/// Returns a string that represents the current object.
/// </summary>
/// <returns>
/// If there are crops defined, it will return the JSON value, otherwise it will just return the Src value
/// </returns>
public override string ToString()
{
return Crops.Any() ? JsonConvert.SerializeObject(this) : Src;
}
/// <summary>
/// Indicates whether the current object is equal to another object of the same type.
/// </summary>
/// <returns>
/// true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false.
/// </returns>
/// <param name="other">An object to compare with this object.</param>
public bool Equals(ImageCropDataSet other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return string.Equals(Src, other.Src) && Equals(FocalPoint, other.FocalPoint)
&& Crops.SequenceEqual(other.Crops);
}
/// <summary>
/// Determines whether the specified object is equal to the current object.
/// </summary>
/// <returns>
/// true if the specified object is equal to the current object; otherwise, false.
/// </returns>
/// <param name="obj">The object to compare with the current object. </param>
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ImageCropDataSet) obj);
}
/// <summary>
/// Serves as the default hash function.
/// </summary>
/// <returns>
/// A hash code for the current object.
/// </returns>
public override int GetHashCode()
{
unchecked
{
var hashCode = (Src != null ? Src.GetHashCode() : 0);
hashCode = (hashCode*397) ^ (FocalPoint != null ? FocalPoint.GetHashCode() : 0);
hashCode = (hashCode*397) ^ (Crops != null ? Crops.GetHashCode() : 0);
return hashCode;
}
}
public static bool operator ==(ImageCropDataSet left, ImageCropDataSet right)
{
return Equals(left, right);
}
public static bool operator !=(ImageCropDataSet left, ImageCropDataSet right)
{
return !Equals(left, right);
}
}
}
+57 -2
View File
@@ -1,14 +1,69 @@
using System;
using System.Runtime.Serialization;
using Umbraco.Core.Dynamics;
namespace Umbraco.Web.Models
{
[DataContract(Name = "imageCropFocalPoint")]
public class ImageCropFocalPoint{
public class ImageCropFocalPoint : CaseInsensitiveDynamicObject<ImageCropFocalPoint>, IEquatable<ImageCropFocalPoint>
{
[DataMember(Name = "left")]
public decimal Left { get; set; }
[DataMember(Name = "top")]
public decimal Top { get; set; }
/// <summary>
/// Indicates whether the current object is equal to another object of the same type.
/// </summary>
/// <returns>
/// true if the current object is equal to the <paramref name="other"/> parameter; otherwise, false.
/// </returns>
/// <param name="other">An object to compare with this object.</param>
public bool Equals(ImageCropFocalPoint other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Left == other.Left && Top == other.Top;
}
/// <summary>
/// Determines whether the specified object is equal to the current object.
/// </summary>
/// <returns>
/// true if the specified object is equal to the current object; otherwise, false.
/// </returns>
/// <param name="obj">The object to compare with the current object. </param>
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ImageCropFocalPoint) obj);
}
/// <summary>
/// Serves as the default hash function.
/// </summary>
/// <returns>
/// A hash code for the current object.
/// </returns>
public override int GetHashCode()
{
unchecked
{
return (Left.GetHashCode()*397) ^ Top.GetHashCode();
}
}
public static bool operator ==(ImageCropFocalPoint left, ImageCropFocalPoint right)
{
return Equals(left, right);
}
public static bool operator !=(ImageCropFocalPoint left, ImageCropFocalPoint right)
{
return !Equals(left, right);
}
}
}
@@ -255,12 +255,14 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(g => g.Editor, expression => expression.Ignore())
.ForMember(g => g.View, expression => expression.Ignore())
.ForMember(g => g.Config, expression => expression.Ignore())
.ForMember(g => g.ContentTypeId, expression => expression.Ignore())
.ForMember(g => g.Locked, exp => exp.Ignore());
config.CreateMap<MemberPropertyTypeBasic, MemberPropertyTypeDisplay>()
.ForMember(g => g.Editor, expression => expression.Ignore())
.ForMember(g => g.View, expression => expression.Ignore())
.ForMember(g => g.Config, expression => expression.Ignore())
.ForMember(g => g.ContentTypeId, expression => expression.Ignore())
.ForMember(g => g.Locked, exp => exp.Ignore());
#endregion
@@ -10,6 +10,7 @@ using AutoMapper;
using umbraco;
using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Mapping;
using Umbraco.Core.PropertyEditors;
@@ -53,7 +54,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(display => display.Alias, expression => expression.Ignore())
.ForMember(display => display.IsContainer, expression => expression.Ignore())
.ForMember(display => display.Tabs, expression => expression.ResolveUsing(new TabsAndPropertiesResolver(applicationContext.Services.TextService)))
.AfterMap((media, display) => AfterMap(media, display, applicationContext.Services.DataTypeService, applicationContext.Services.TextService));
.AfterMap((media, display) => AfterMap(media, display, applicationContext.Services.DataTypeService, applicationContext.Services.TextService, applicationContext.ProfilingLogger.Logger));
//FROM IMedia TO ContentItemBasic<ContentPropertyBasic, IMedia>
config.CreateMap<IMedia, ContentItemBasic<ContentPropertyBasic, IMedia>>()
@@ -84,7 +85,7 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.Alias, expression => expression.Ignore());
}
private static void AfterMap(IMedia media, MediaItemDisplay display, IDataTypeService dataTypeService, ILocalizedTextService localizedText)
private static void AfterMap(IMedia media, MediaItemDisplay display, IDataTypeService dataTypeService, ILocalizedTextService localizedText, ILogger logger)
{
// Adapted from ContentModelMapper
//map the IsChildOfListView (this is actually if it is a descendant of a list view!)
@@ -137,35 +138,18 @@ namespace Umbraco.Web.Models.Mapping
}
};
var helper = new UmbracoHelper(UmbracoContext.Current);
var mediaItem = helper.TypedMedia(media.Id);
if (mediaItem != null)
var links = media.GetUrls(UmbracoConfig.For.UmbracoSettings().Content, logger);
if (links.Any())
{
var crops = new List<string>();
var autoFillProperties = UmbracoConfig.For.UmbracoSettings().Content.ImageAutoFillProperties.ToArray();
if (autoFillProperties.Any())
var link = new ContentPropertyDisplay
{
foreach (var field in autoFillProperties)
{
var crop = mediaItem.GetCropUrl(field.Alias, string.Empty);
if (string.IsNullOrWhiteSpace(crop) == false)
crops.Add(crop.Split('?')[0]);
}
if (crops.Any())
{
var link = new ContentPropertyDisplay
{
Alias = string.Format("{0}urls", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = localizedText.Localize("media/urls"),
// don't add the querystring, split on the "?" will also work if there is no "?"
Value = string.Join(",", crops),
View = "urllist"
};
genericProperties.Add(link);
}
}
Alias = string.Format("{0}urls", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
Label = localizedText.Localize("media/urls"),
Value = string.Join(",", links),
View = "urllist"
};
genericProperties.Add(link);
}
TabsAndPropertiesResolver.MapGenericProperties(media, display, localizedText, genericProperties);
@@ -41,6 +41,26 @@ namespace Umbraco.Web.Models.Mapping
.FirstOrDefault(x => x != null);
}
/// <summary>
/// Gets the content type that defines a property group, within a composition.
/// </summary>
/// <param name="contentType">The composition.</param>
/// <param name="propertyTypeId">The identifier of the property type.</param>
/// <returns>The composition content type that defines the specified property group.</returns>
private static IContentTypeComposition GetContentTypeForPropertyType(IContentTypeComposition contentType, int propertyTypeId)
{
// test local property types
if (contentType.PropertyTypes.Any(x => x.Id == propertyTypeId))
return contentType;
// test composition property types
// .ContentTypeComposition is just the local ones, not recursive,
// so we have to recurse here
return contentType.ContentTypeComposition
.Select(x => GetContentTypeForPropertyType(x, propertyTypeId))
.FirstOrDefault(x => x != null);
}
protected override IEnumerable<PropertyGroupDisplay<TPropertyType>> ResolveCore(IContentTypeComposition source)
{
// deal with groups
@@ -58,7 +78,7 @@ namespace Umbraco.Web.Models.Mapping
ContentTypeId = source.Id
};
group.Properties = MapProperties(tab.PropertyTypes, tab.Id, false);
group.Properties = MapProperties(tab.PropertyTypes, source, tab.Id, false);
groups.Add(group);
}
@@ -85,7 +105,7 @@ namespace Umbraco.Web.Models.Mapping
ParentTabContentTypeNames = new[] { definingContentType.Name }
};
group.Properties = MapProperties(tab.PropertyTypes, tab.Id, true);
group.Properties = MapProperties(tab.PropertyTypes, definingContentType, tab.Id, true);
groups.Add(group);
}
@@ -94,14 +114,20 @@ namespace Umbraco.Web.Models.Mapping
// add generic properties local to this content type
var entityGenericProperties = source.PropertyTypes.Where(x => x.PropertyGroupId == null);
genericProperties.AddRange(MapProperties(entityGenericProperties, PropertyGroupBasic.GenericPropertiesGroupId, false));
genericProperties.AddRange(MapProperties(entityGenericProperties, source, PropertyGroupBasic.GenericPropertiesGroupId, false));
// add generic properties inherited through compositions
var localGenericPropertyIds = genericProperties.Select(x => x.Id).ToArray();
var compositionGenericProperties = source.CompositionPropertyTypes
.Where(x => x.PropertyGroupId == null // generic
&& localGenericPropertyIds.Contains(x.Id) == false); // skip those that are local
genericProperties.AddRange(MapProperties(compositionGenericProperties, PropertyGroupBasic.GenericPropertiesGroupId, true));
foreach (var compositionGenericProperty in compositionGenericProperties)
{
var definingContentType = GetContentTypeForPropertyType(source, compositionGenericProperty.Id);
if (definingContentType == null)
throw new Exception("PropertyType with id=" + compositionGenericProperty.Id + " was not found on any of the content type's compositions.");
genericProperties.AddRange(MapProperties(new [] { compositionGenericProperty }, definingContentType, PropertyGroupBasic.GenericPropertiesGroupId, true));
}
// if there are any generic properties, add the corresponding tab
if (genericProperties.Any())
@@ -165,7 +191,7 @@ namespace Umbraco.Web.Models.Mapping
return groups.OrderBy(x => x.SortOrder);
}
private IEnumerable<TPropertyType> MapProperties(IEnumerable<PropertyType> properties, int groupId, bool inherited)
private IEnumerable<TPropertyType> MapProperties(IEnumerable<PropertyType> properties, IContentTypeBase contentType, int groupId, bool inherited)
{
var mappedProperties = new List<TPropertyType>();
@@ -179,20 +205,21 @@ namespace Umbraco.Web.Models.Mapping
mappedProperties.Add(new TPropertyType
{
Id = p.Id,
Alias = p.Alias,
Description = p.Description,
Editor = p.PropertyEditorAlias,
Validation = new PropertyTypeValidation { Mandatory = p.Mandatory, Pattern = p.ValidationRegExp },
Label = p.Name,
View = propertyEditor.ValueEditor.View,
Config = propertyEditor.PreValueEditor.ConvertDbToEditor(propertyEditor.DefaultPreValues, preValues) ,
//Value = "",
GroupId = groupId,
Inherited = inherited,
DataTypeId = p.DataTypeDefinitionId,
SortOrder = p.SortOrder
});
Id = p.Id,
Alias = p.Alias,
Description = p.Description,
Editor = p.PropertyEditorAlias,
Validation = new PropertyTypeValidation {Mandatory = p.Mandatory, Pattern = p.ValidationRegExp},
Label = p.Name,
View = propertyEditor.ValueEditor.View,
Config = propertyEditor.PreValueEditor.ConvertDbToEditor(propertyEditor.DefaultPreValues, preValues),
//Value = "",
GroupId = groupId,
Inherited = inherited,
DataTypeId = p.DataTypeDefinitionId,
SortOrder = p.SortOrder,
ContentTypeId = contentType.Id
});
}
return mappedProperties;
@@ -126,6 +126,7 @@ namespace Umbraco.Web.Models.Mapping
/// <param name="display"></param>
/// <param name="entityType">This must be either 'content' or 'media'</param>
/// <param name="dataTypeService"></param>
/// <param name="localizedTextService"></param>
internal static void AddListView<TPersisted>(TabbedContentItem<ContentPropertyDisplay, TPersisted> display, string entityType, IDataTypeService dataTypeService, ILocalizedTextService localizedTextService)
where TPersisted : IContentBase
{
+19 -3
View File
@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
using Umbraco.Core.Models;
using Umbraco.Core.Models.PublishedContent;
@@ -64,9 +67,22 @@ namespace Umbraco.Web.Models
break;
case Constants.PropertyEditors.ImageCropperAlias:
//get the url from the json format
var val = prop.Value.ToString();
var crops = val.SerializeToCropDataSet();
_url = crops != null ? crops.Src : string.Empty;
var stronglyTyped = prop.Value as ImageCropDataSet;
if (stronglyTyped != null)
{
_url = stronglyTyped.Src;
break;
}
var json = prop.Value as JObject;
if (json != null)
{
_url = json.ToObject<ImageCropDataSet>(new JsonSerializer { Culture = CultureInfo.InvariantCulture, FloatParseHandling = FloatParseHandling.Decimal }).Src;
break;
}
_url = prop.Value.ToString();
break;
}
break;
@@ -15,6 +15,8 @@ using Umbraco.Core.Media;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Editors;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.PropertyEditors.ValueConverters;
using Umbraco.Core.Services;
using Umbraco.Web.Models.ContentEditing;
namespace Umbraco.Web.PropertyEditors
@@ -26,6 +28,23 @@ namespace Umbraco.Web.PropertyEditors
}
/// <summary>
/// This is called to merge in the prevalue crops with the value that is saved - similar to the property value converter for the front-end
/// </summary>
public override object ConvertDbToEditor(Property property, PropertyType propertyType, IDataTypeService dataTypeService)
{
var val = base.ConvertDbToEditor(property, propertyType, dataTypeService);
var json = val as JObject;
if (json != null)
{
ImageCropperValueConverter.MergePreValues(json, dataTypeService, propertyType.DataTypeDefinitionId);
return json;
}
return val;
}
/// <summary>
/// Overrides the deserialize value so that we can save the file accordingly
@@ -0,0 +1,46 @@
using System;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json.Linq;
using Umbraco.Core;
using Umbraco.Web.Models;
namespace Umbraco.Web.PropertyEditors.ValueConverters
{
/// <summary>
/// Used to do some type conversions from ImageCropDataSet to string and JObject
/// </summary>
public class ImageCropDataSetConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
var convertableTypes = new[]
{
typeof(JObject)
};
return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, destinationType))
|| base.CanConvertFrom(context, destinationType);
}
public override object ConvertTo(
ITypeDescriptorContext context,
CultureInfo culture,
object value,
Type destinationType)
{
var cropDataSet = value as ImageCropDataSet;
if (cropDataSet == null)
return null;
//JObject
if (TypeHelper.IsTypeAssignableFrom<JObject>(destinationType))
{
return JObject.FromObject(cropDataSet);
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
}

Some files were not shown because too many files have changed in this diff Show More