Compare commits
62 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fcaa4ad8d6 | |||
| bf70e208ad | |||
| 26f705b129 | |||
| 9e3941e8e1 | |||
| 7886b7814d | |||
| cf7756a96d | |||
| 20347c1ccd | |||
| 36255709e6 | |||
| 506ed9f866 | |||
| f87bec398d | |||
| 1e5b6a6a0f | |||
| a2f8e92098 | |||
| 9d5af4ad5e | |||
| ae154885e4 | |||
| 2c29e422bc | |||
| 2d6b8712d5 | |||
| 81aad6fc64 | |||
| 58280e7d63 | |||
| c856795cb7 | |||
| 2d514ac09e | |||
| 8e8b8bdea1 | |||
| d8c781f97f | |||
| 6502470708 | |||
| 680396daab | |||
| 4e4ea59433 | |||
| 40f7e87e04 | |||
| fbce20d0c3 | |||
| 982fa26b7e | |||
| c3055ca43f | |||
| 4cca364511 | |||
| 9e0ed94d77 | |||
| 374147a1a0 | |||
| 5f0fe69c82 | |||
| e325e06efc | |||
| 5e7db1047b | |||
| 61fe0a4a93 | |||
| aa1aabef3a | |||
| d1c865480f | |||
| c427c51053 | |||
| 08070e319a | |||
| ac2ebc4071 | |||
| d4c79a0915 | |||
| 61f9845db0 | |||
| 43e23829ae | |||
| 5774ce68c7 | |||
| b9af6f631a | |||
| cd401f5e37 | |||
| effe7c1669 | |||
| 87667ec2d1 | |||
| 4bcee1df71 | |||
| 8e2716d300 | |||
| b8c7b09d25 | |||
| 741057b7d6 | |||
| 769b74afef | |||
| 6d4364a8b9 | |||
| efb7bc7689 | |||
| 6536286ffa | |||
| 6f07898979 | |||
| 7cf4c33d15 | |||
| d75ebed53d | |||
| 3136981043 | |||
| 893ca14859 |
+135
-134
@@ -1,134 +1,135 @@
|
||||
*.obj
|
||||
*.pdb
|
||||
*.user
|
||||
*.aps
|
||||
*.pch
|
||||
*.vspscc
|
||||
.DS_Store
|
||||
._.DS_Store
|
||||
[Bb]in
|
||||
[Db]ebug*/
|
||||
obj/
|
||||
[Rr]elease*/
|
||||
_ReSharper*/
|
||||
_NCrunch_*/
|
||||
*.ncrunchsolution
|
||||
*.ncrunchsolution.user
|
||||
*.ncrunchproject
|
||||
*.crunchsolution.cache
|
||||
[Tt]est[Rr]esult*
|
||||
[Bb]uild[Ll]og.*
|
||||
*.[Pp]ublish.xml
|
||||
*.suo
|
||||
[sS]ource
|
||||
[sS]andbox
|
||||
umbraco.config
|
||||
*.vs10x
|
||||
App_Data/TEMP/*
|
||||
[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/*
|
||||
[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/*
|
||||
[Uu]mbraco/[Pp]resentation/[Ss]cripts/*
|
||||
[Uu]mbraco/[Pp]resentation/[Ff]onts/*
|
||||
[Uu]mbraco/[Pp]resentation/[Cc]ss/*
|
||||
|
||||
src/Umbraco.Web.UI/[Cc]ss/*
|
||||
src/Umbraco.Web.UI/App_Code/*
|
||||
src/Umbraco.Web.UI/App_Data/*
|
||||
src/Umbraco.Tests/App_Data/*
|
||||
src/Umbraco.Web.UI/[Mm]edia/*
|
||||
src/Umbraco.Web.UI/[Mm]aster[Pp]ages/*
|
||||
src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/*
|
||||
!src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/[Ww]eb.[Cc]onfig
|
||||
src/Umbraco.Web.UI/[Xx]slt/*
|
||||
src/Umbraco.Web.UI/[Ii]mages/*
|
||||
src/Umbraco.Web.UI/[Ss]cripts/*
|
||||
src/Umbraco.Web.UI/Web.*.config.transformed
|
||||
|
||||
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
|
||||
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
|
||||
_BuildOutput/*
|
||||
*.ncrunchsolution
|
||||
build/UmbracoCms.AllBinaries*zip
|
||||
build/UmbracoCms.WebPI*zip
|
||||
build/UmbracoCms*zip
|
||||
build/UmbracoExamine.PDF*zip
|
||||
build/*.nupkg
|
||||
src/Umbraco.Tests/config/applications.config
|
||||
src/Umbraco.Tests/config/trees.config
|
||||
src/Umbraco.Web.UI/web.config
|
||||
*.orig
|
||||
src/Umbraco.Tests/config/404handlers.config
|
||||
src/Umbraco.Web.UI/[Vv]iews/*.cshtml
|
||||
src/Umbraco.Web.UI/[Vv]iews/*.vbhtml
|
||||
src/Umbraco.Tests/[Cc]onfig/umbracoSettings.config
|
||||
src/Umbraco.Web.UI/[Vv]iews/*
|
||||
src/packages/
|
||||
src/packages/repositories.config
|
||||
|
||||
src/Umbraco.Web.UI/[Ww]eb.config
|
||||
*.transformed
|
||||
webpihash.txt
|
||||
|
||||
node_modules
|
||||
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.dev.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.dev.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/main.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.js
|
||||
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.panel.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.palettes.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.loader.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.front.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.config.js
|
||||
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.css
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
|
||||
src/Umbraco.Web.UI.Client/[Bb]uild/*
|
||||
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
|
||||
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
|
||||
build/_BuildOutput/
|
||||
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
|
||||
tools/NDepend/
|
||||
|
||||
src/Umbraco.Web.UI/App_Plugins/*
|
||||
src/*.psess
|
||||
src/*.vspx
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js.*
|
||||
NDependOut/*
|
||||
*.ndproj
|
||||
QueryResult.htm
|
||||
*.ndproj
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
|
||||
|
||||
src/Umbraco.Web.UI/[Cc]onfig/appSettings.config
|
||||
src/Umbraco.Web.UI/[Cc]onfig/connectionStrings.config
|
||||
src/Umbraco.Web.UI/umbraco/plugins/*
|
||||
src/Umbraco.Web.UI/umbraco/js/init.js
|
||||
build/ApiDocs/*
|
||||
build/ApiDocs/Output/*
|
||||
src/Umbraco.Web.UI.Client/bower_components/*
|
||||
/src/Umbraco.Web.UI/Umbraco/preview
|
||||
|
||||
#Ignore Rule for output of generated documentation files from Grunt docserve
|
||||
src/Umbraco.Web.UI.Client/docs/api
|
||||
src/*.boltdata/
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.loader.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.palettes.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.panel.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.config.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.front.js
|
||||
src/umbraco.sln.ide/*
|
||||
build/UmbracoCms.*/
|
||||
src/.vs/
|
||||
src/Umbraco.Web.UI/umbraco/js/install.loader.js
|
||||
*.obj
|
||||
*.pdb
|
||||
*.user
|
||||
*.aps
|
||||
*.pch
|
||||
*.vspscc
|
||||
.DS_Store
|
||||
._.DS_Store
|
||||
[Bb]in
|
||||
[Db]ebug*/
|
||||
obj/
|
||||
[Rr]elease*/
|
||||
_ReSharper*/
|
||||
_NCrunch_*/
|
||||
*.ncrunchsolution
|
||||
*.ncrunchsolution.user
|
||||
*.ncrunchproject
|
||||
*.crunchsolution.cache
|
||||
[Tt]est[Rr]esult*
|
||||
[Bb]uild[Ll]og.*
|
||||
*.[Pp]ublish.xml
|
||||
*.suo
|
||||
[sS]ource
|
||||
[sS]andbox
|
||||
umbraco.config
|
||||
*.vs10x
|
||||
App_Data/TEMP/*
|
||||
[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/*
|
||||
[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/*
|
||||
[Uu]mbraco/[Pp]resentation/[Ss]cripts/*
|
||||
[Uu]mbraco/[Pp]resentation/[Ff]onts/*
|
||||
[Uu]mbraco/[Pp]resentation/[Cc]ss/*
|
||||
|
||||
src/Umbraco.Web.UI/[Cc]ss/*
|
||||
src/Umbraco.Web.UI/App_Code/*
|
||||
src/Umbraco.Web.UI/App_Data/*
|
||||
src/Umbraco.Tests/App_Data/*
|
||||
src/Umbraco.Web.UI/[Mm]edia/*
|
||||
src/Umbraco.Web.UI/[Mm]aster[Pp]ages/*
|
||||
src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/*
|
||||
!src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/[Ww]eb.[Cc]onfig
|
||||
src/Umbraco.Web.UI/[Xx]slt/*
|
||||
src/Umbraco.Web.UI/[Ii]mages/*
|
||||
src/Umbraco.Web.UI/[Ss]cripts/*
|
||||
src/Umbraco.Web.UI/Web.*.config.transformed
|
||||
|
||||
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
|
||||
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
|
||||
_BuildOutput/*
|
||||
*.ncrunchsolution
|
||||
build/UmbracoCms.AllBinaries*zip
|
||||
build/UmbracoCms.WebPI*zip
|
||||
build/UmbracoCms*zip
|
||||
build/UmbracoExamine.PDF*zip
|
||||
build/*.nupkg
|
||||
src/Umbraco.Tests/config/applications.config
|
||||
src/Umbraco.Tests/config/trees.config
|
||||
src/Umbraco.Web.UI/web.config
|
||||
*.orig
|
||||
src/Umbraco.Tests/config/404handlers.config
|
||||
src/Umbraco.Web.UI/[Vv]iews/*.cshtml
|
||||
src/Umbraco.Web.UI/[Vv]iews/*.vbhtml
|
||||
src/Umbraco.Tests/[Cc]onfig/umbracoSettings.config
|
||||
src/Umbraco.Web.UI/[Vv]iews/*
|
||||
src/packages/
|
||||
src/packages/repositories.config
|
||||
|
||||
src/Umbraco.Web.UI/[Ww]eb.config
|
||||
*.transformed
|
||||
webpihash.txt
|
||||
|
||||
node_modules
|
||||
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.dev.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/loader.dev.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/main.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.js
|
||||
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.panel.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.palettes.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.loader.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.front.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/tuning.config.js
|
||||
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.css
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
|
||||
src/Umbraco.Web.UI.Client/[Bb]uild/*
|
||||
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
|
||||
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
|
||||
build/_BuildOutput/
|
||||
src/Umbraco.Web.UI.Client/src/[Ll]ess/*.css
|
||||
tools/NDepend/
|
||||
|
||||
src/Umbraco.Web.UI/App_Plugins/*
|
||||
src/*.psess
|
||||
src/*.vspx
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js.*
|
||||
NDependOut/*
|
||||
*.ndproj
|
||||
QueryResult.htm
|
||||
*.ndproj
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
|
||||
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
|
||||
|
||||
src/Umbraco.Web.UI/[Cc]onfig/appSettings.config
|
||||
src/Umbraco.Web.UI/[Cc]onfig/connectionStrings.config
|
||||
src/Umbraco.Web.UI/umbraco/plugins/*
|
||||
src/Umbraco.Web.UI/umbraco/js/init.js
|
||||
build/ApiDocs/*
|
||||
build/ApiDocs/Output/*
|
||||
src/Umbraco.Web.UI.Client/bower_components/*
|
||||
/src/Umbraco.Web.UI/Umbraco/preview
|
||||
|
||||
#Ignore Rule for output of generated documentation files from Grunt docserve
|
||||
src/Umbraco.Web.UI.Client/docs/api
|
||||
src/*.boltdata/
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.loader.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.palettes.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.panel.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.config.js
|
||||
/src/Umbraco.Web.UI/Umbraco/Js/canvasdesigner.front.js
|
||||
src/umbraco.sln.ide/*
|
||||
build/UmbracoCms.*/
|
||||
src/.vs/
|
||||
src/Umbraco.Web.UI/umbraco/js/install.loader.js
|
||||
src/Umbraco.Tests/media
|
||||
@@ -13,11 +13,11 @@ If you're interested in making changes to Belle make sure to read the [Belle Rea
|
||||
|
||||
## Umbraco - the simple, flexible and friendly ASP.NET CMS ##
|
||||
|
||||
**More than 177,000 sites trust Umbraco**
|
||||
**More than 350,000 sites trust Umbraco**
|
||||
|
||||
For the first time on the Microsoft platform, there is a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports ASP.NET MVC or Web Forms, including User and Custom Controls, out of the box. It's a developer's dream and your users will love it too.
|
||||
|
||||
Used by more than 177,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)), you can be sure that the technology is proven, stable and scales.
|
||||
Used by more than 350,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)), you can be sure that the technology is proven, stable and scales.
|
||||
|
||||
To view more examples, please visit [http://umbraco.com/why-umbraco/#caseStudies](http://umbraco.com/why-umbraco/#caseStudies)
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
# Usage: on line 2 put the release version, on line 3 put the version comment (example: beta)
|
||||
7.4.2
|
||||
7.4.3
|
||||
+2
-2
@@ -11,5 +11,5 @@ using System.Resources;
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyFileVersion("7.4.2")]
|
||||
[assembly: AssemblyInformationalVersion("7.4.2")]
|
||||
[assembly: AssemblyFileVersion("7.4.3")]
|
||||
[assembly: AssemblyInformationalVersion("7.4.3")]
|
||||
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration
|
||||
{
|
||||
public class UmbracoVersion
|
||||
{
|
||||
private static readonly Version Version = new Version("7.4.2");
|
||||
private static readonly Version Version = new Version("7.4.3");
|
||||
|
||||
/// <summary>
|
||||
/// Gets the current version of Umbraco.
|
||||
|
||||
@@ -1380,6 +1380,30 @@ namespace Umbraco.Core
|
||||
*/
|
||||
}
|
||||
|
||||
public static string EscapeRegexSpecialCharacters(this string text)
|
||||
{
|
||||
var regexSpecialCharacters = new Dictionary<string, string>
|
||||
{
|
||||
{".", @"\."},
|
||||
{"(", @"\("},
|
||||
{")", @"\)"},
|
||||
{"]", @"\]"},
|
||||
{"[", @"\["},
|
||||
{"{", @"\{"},
|
||||
{"}", @"\}"},
|
||||
{"?", @"\?"},
|
||||
{"!", @"\!"},
|
||||
{"$", @"\$"},
|
||||
{"^", @"\^"},
|
||||
{"+", @"\+"},
|
||||
{"*", @"\*"},
|
||||
{"|", @"\|"},
|
||||
{"<", @"\<"},
|
||||
{">", @"\>"}
|
||||
};
|
||||
return ReplaceMany(text, regexSpecialCharacters);
|
||||
}
|
||||
|
||||
public static bool ContainsAny(this string haystack, IEnumerable<string> needles, StringComparison comparison = StringComparison.CurrentCulture)
|
||||
{
|
||||
if (haystack == null) throw new ArgumentNullException("haystack");
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace Umbraco.Core.Strings.Css
|
||||
public static string ReplaceRule(string input, string oldRuleName, StylesheetRule rule)
|
||||
{
|
||||
var contents = input;
|
||||
var ruleRegex = new Regex(string.Format(RuleRegexFormat, oldRuleName), RegexOptions.IgnoreCase | RegexOptions.Singleline);
|
||||
var ruleRegex = new Regex(string.Format(RuleRegexFormat, oldRuleName.EscapeRegexSpecialCharacters()), RegexOptions.IgnoreCase | RegexOptions.Singleline);
|
||||
contents = ruleRegex.Replace(contents, rule != null ? rule.ToString() : "");
|
||||
return contents;
|
||||
}
|
||||
|
||||
@@ -72,6 +72,11 @@ namespace Umbraco.Core
|
||||
/// <summary>
|
||||
/// Override init and raise the event
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// DID YOU KNOW? The Global.asax Init call is the thing that initializes all of the httpmodules, ties up a bunch of stuff with IIS, etc...
|
||||
/// Therefore, since OWIN is an HttpModule when running in IIS/ASP.Net the OWIN startup is not executed until this method fires and by that
|
||||
/// time, Umbraco has performed it's bootup sequence.
|
||||
/// </remarks>
|
||||
public override void Init()
|
||||
{
|
||||
base.Init();
|
||||
|
||||
@@ -20,18 +20,22 @@ namespace Umbraco.Tests.Web.Mvc
|
||||
{
|
||||
var binder = new RenderModelBinder();
|
||||
var found = binder.GetBinder(typeof (IPublishedContent));
|
||||
Assert.IsNotNull(found);
|
||||
found = binder.GetBinder(typeof(IRenderModel));
|
||||
Assert.IsNotNull(found);
|
||||
Assert.IsNotNull(found);
|
||||
found = binder.GetBinder(typeof(RenderModel));
|
||||
Assert.IsNotNull(found);
|
||||
found = binder.GetBinder(typeof(DynamicPublishedContent));
|
||||
Assert.IsNotNull(found);
|
||||
found = binder.GetBinder(typeof(MyContent));
|
||||
Assert.IsNotNull(found);
|
||||
found = binder.GetBinder(typeof(RenderModel<MyContent>));
|
||||
Assert.IsNotNull(found);
|
||||
|
||||
found = binder.GetBinder(typeof(MyOtherContent));
|
||||
Assert.IsNull(found);
|
||||
found = binder.GetBinder(typeof(MyCustomRenderModel));
|
||||
Assert.IsNull(found);
|
||||
found = binder.GetBinder(typeof(IRenderModel));
|
||||
Assert.IsNull(found);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -142,6 +146,16 @@ namespace Umbraco.Tests.Web.Mvc
|
||||
Assert.AreEqual(content, result);
|
||||
}
|
||||
|
||||
public class MyCustomRenderModel : RenderModel
|
||||
{
|
||||
public MyCustomRenderModel(IPublishedContent content, CultureInfo culture) : base(content, culture)
|
||||
{
|
||||
}
|
||||
public MyCustomRenderModel(IPublishedContent content) : base(content)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public class MyOtherContent
|
||||
{
|
||||
|
||||
|
||||
+9
-1
@@ -118,6 +118,13 @@ Use this directive to generate a thumbnail grid of media items.
|
||||
var item = scope.items[i];
|
||||
setItemData(item);
|
||||
setOriginalSize(item, itemMaxHeight);
|
||||
|
||||
// remove non images when onlyImages is set to true
|
||||
if(scope.onlyImages === "true" && !item.isFolder && !item.thumbnail){
|
||||
scope.items.splice(i, 1);
|
||||
i--;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (scope.items.length > 0) {
|
||||
@@ -265,7 +272,8 @@ Use this directive to generate a thumbnail grid of media items.
|
||||
itemMaxWidth: "@",
|
||||
itemMaxHeight: "@",
|
||||
itemMinWidth: "@",
|
||||
itemMinHeight: "@"
|
||||
itemMinHeight: "@",
|
||||
onlyImages: "@"
|
||||
},
|
||||
link: link
|
||||
};
|
||||
|
||||
@@ -1,3 +1,47 @@
|
||||
/**
|
||||
@ngdoc service
|
||||
* @name umbraco.services.listViewHelper
|
||||
*
|
||||
*
|
||||
* @description
|
||||
* Service for performing operations against items in the list view UI. Used by the built-in internal listviews
|
||||
* as well as custom listview.
|
||||
*
|
||||
* A custom listview is always used inside a wrapper listview, so there are a number of inherited values on its
|
||||
* scope by default:
|
||||
*
|
||||
* **$scope.selection**: Array containing all items currently selected in the listview
|
||||
*
|
||||
* **$scope.items**: Array containing all items currently displayed in the listview
|
||||
*
|
||||
* **$scope.folders**: Array containing all folders in the current listview (only for media)
|
||||
*
|
||||
* **$scope.options**: configuration object containing information such as pagesize, permissions, order direction etc.
|
||||
*
|
||||
* **$scope.model.config.layouts**: array of available layouts to apply to the listview (grid, list or custom layout)
|
||||
*
|
||||
* ##Usage##
|
||||
* To use, inject listViewHelper into custom listview controller, listviewhelper expects you
|
||||
* to pass in the full collection of items in the listview in several of its methods
|
||||
* this collection is inherited from the parent controller and is available on $scope.selection
|
||||
*
|
||||
* <pre>
|
||||
* angular.module("umbraco").controller("my.listVieweditor". function($scope, listViewHelper){
|
||||
*
|
||||
* //current items in the listview
|
||||
* var items = $scope.items;
|
||||
*
|
||||
* //current selection
|
||||
* var selection = $scope.selection;
|
||||
*
|
||||
* //deselect an item , $scope.selection is inherited, item is picked from inherited $scope.items
|
||||
* listViewHelper.deselectItem(item, $scope.selection);
|
||||
*
|
||||
* //test if all items are selected, $scope.items + $scope.selection are inherited
|
||||
* listViewhelper.isSelectedAll($scope.items, $scope.selection);
|
||||
* });
|
||||
* </pre>
|
||||
*/
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
@@ -6,6 +50,19 @@
|
||||
var firstSelectedIndex = 0;
|
||||
var localStorageKey = "umblistViewLayout";
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#getLayout
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Method for internal use, based on the collection of layouts passed, the method selects either
|
||||
* any previous layout from local storage, or picks the first allowed layout
|
||||
*
|
||||
* @param {Number} nodeId The id of the current node displayed in the content editor
|
||||
* @param {Array} availableLayouts Array of all allowed layouts, available from $scope.model.config.layouts
|
||||
*/
|
||||
|
||||
function getLayout(nodeId, availableLayouts) {
|
||||
|
||||
var storedLayouts = [];
|
||||
@@ -28,6 +85,19 @@
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#setLayout
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Changes the current layout used by the listview to the layout passed in. Stores selection in localstorage
|
||||
*
|
||||
* @param {Number} nodeID Id of the current node displayed in the content editor
|
||||
* @param {Object} selectedLayout Layout selected as the layout to set as the current layout
|
||||
* @param {Array} availableLayouts Array of all allowed layouts, available from $scope.model.config.layouts
|
||||
*/
|
||||
|
||||
function setLayout(nodeId, selectedLayout, availableLayouts) {
|
||||
|
||||
var activeLayout = {};
|
||||
@@ -54,6 +124,18 @@
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#saveLayoutInLocalStorage
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Stores a given layout as the current default selection in local storage
|
||||
*
|
||||
* @param {Number} nodeId Id of the current node displayed in the content editor
|
||||
* @param {Object} selectedLayout Layout selected as the layout to set as the current layout
|
||||
*/
|
||||
|
||||
function saveLayoutInLocalStorage(nodeId, selectedLayout) {
|
||||
var layoutFound = false;
|
||||
var storedLayouts = [];
|
||||
@@ -84,6 +166,17 @@
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#getFirstAllowedLayout
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Returns currently selected layout, or alternatively the first layout in the available layouts collection
|
||||
*
|
||||
* @param {Array} layouts Array of all allowed layouts, available from $scope.model.config.layouts
|
||||
*/
|
||||
|
||||
function getFirstAllowedLayout(layouts) {
|
||||
|
||||
var firstAllowedLayout = {};
|
||||
@@ -99,6 +192,23 @@
|
||||
return firstAllowedLayout;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#selectHandler
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Helper method for working with item selection via a checkbox, internally it uses selectItem and deselectItem.
|
||||
* Working with this method, requires its triggered via a checkbox which can then pass in its triggered $event
|
||||
* When the checkbox is clicked, this method will toggle selection of the associated item so it matches the state of the checkbox
|
||||
*
|
||||
* @param {Object} selectedItem Item being selected or deselected by the checkbox
|
||||
* @param {Number} selectedIndex Index of item being selected/deselected, usually passed as $index
|
||||
* @param {Array} items All items in the current listview, available as $scope.items
|
||||
* @param {Array} selection All selected items in the current listview, available as $scope.selection
|
||||
* @param {Event} $event Event triggered by the checkbox being checked to select / deselect an item
|
||||
*/
|
||||
|
||||
function selectHandler(selectedItem, selectedIndex, items, selection, $event) {
|
||||
|
||||
var start = 0;
|
||||
@@ -143,6 +253,18 @@
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#selectItem
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Selects a given item to the listview selection array, requires you pass in the inherited $scope.selection collection
|
||||
*
|
||||
* @param {Object} item Item to select
|
||||
* @param {Array} selection Listview selection, available as $scope.selection
|
||||
*/
|
||||
|
||||
function selectItem(item, selection) {
|
||||
var isSelected = false;
|
||||
for (var i = 0; selection.length > i; i++) {
|
||||
@@ -157,6 +279,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#deselectItem
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Deselects a given item from the listviews selection array, requires you pass in the inherited $scope.selection collection
|
||||
*
|
||||
* @param {Object} item Item to deselect
|
||||
* @param {Array} selection Listview selection, available as $scope.selection
|
||||
*/
|
||||
|
||||
function deselectItem(item, selection) {
|
||||
for (var i = 0; selection.length > i; i++) {
|
||||
var selectedItem = selection[i];
|
||||
@@ -167,6 +301,20 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#clearSelection
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Removes a given number of items and folders from the listviews selection array
|
||||
* Folders can only be passed in if the listview is used in the media section which has a concept of folders.
|
||||
*
|
||||
* @param {Array} items Items to remove, can be null
|
||||
* @param {Array} folders Folders to remove, can be null
|
||||
* @param {Array} selection Listview selection, available as $scope.selection
|
||||
*/
|
||||
|
||||
function clearSelection(items, folders, selection) {
|
||||
|
||||
var i = 0;
|
||||
@@ -180,7 +328,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (angular.isArray(items)) {
|
||||
if(angular.isArray(folders)) {
|
||||
for (i = 0; folders.length > i; i++) {
|
||||
var folder = folders[i];
|
||||
folder.selected = false;
|
||||
@@ -188,6 +336,20 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#selectAllItems
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Helper method for toggling the select state on all items in the active listview
|
||||
* Can only be used from a checkbox as a checkbox $event is required to pass in.
|
||||
*
|
||||
* @param {Array} items Items to toggle selection on, should be $scope.items
|
||||
* @param {Array} selection Listview selection, available as $scope.selection
|
||||
* @param {$event} $event Event passed from the checkbox being toggled
|
||||
*/
|
||||
|
||||
function selectAllItems(items, selection, $event) {
|
||||
|
||||
var checkbox = $event.target;
|
||||
@@ -219,6 +381,20 @@
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#isSelectedAll
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Method to determine if all items on the current page in the list has been selected
|
||||
* Given the current items in the view, and the current selection, it will return true/false
|
||||
*
|
||||
* @param {Array} items Items to test if all are selected, should be $scope.items
|
||||
* @param {Array} selection Listview selection, available as $scope.selection
|
||||
* @returns {Boolean} boolean indicate if all items in the listview have been selected
|
||||
*/
|
||||
|
||||
function isSelectedAll(items, selection) {
|
||||
|
||||
var numberOfSelectedItem = 0;
|
||||
@@ -242,10 +418,35 @@
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#setSortingDirection
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* *Internal* method for changing sort order icon
|
||||
* @param {String} col Column alias to order after
|
||||
* @param {String} direction Order direction `asc` or `desc`
|
||||
* @param {Object} options object passed from the parent listview available as $scope.options
|
||||
*/
|
||||
|
||||
function setSortingDirection(col, direction, options) {
|
||||
return options.orderBy.toUpperCase() === col.toUpperCase() && options.orderDirection === direction;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ngdoc method
|
||||
* @name umbraco.services.listViewHelper#setSorting
|
||||
* @methodOf umbraco.services.listViewHelper
|
||||
*
|
||||
* @description
|
||||
* Method for setting the field on which the listview will order its items after.
|
||||
*
|
||||
* @param {String} field Field alias to order after
|
||||
* @param {Boolean} allow Determines if the user is allowed to set this field, normally true
|
||||
* @param {Object} options Options object passed from the parent listview available as $scope.options
|
||||
*/
|
||||
|
||||
function setSorting(field, allow, options) {
|
||||
if (allow) {
|
||||
options.orderBy = field;
|
||||
@@ -257,12 +458,12 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//This takes in a dictionary of Ids with Permissions and determines
|
||||
// the intersect of all permissions to return an object representing the
|
||||
// listview button permissions
|
||||
function getButtonPermissions(unmergedPermissions, currentIdsWithPermissions) {
|
||||
|
||||
|
||||
if (currentIdsWithPermissions == null) {
|
||||
currentIdsWithPermissions = {};
|
||||
}
|
||||
@@ -286,26 +487,28 @@
|
||||
canCopy: _.contains(intersectPermissions, 'O'), //Magic Char = O
|
||||
canCreate: _.contains(intersectPermissions, 'C'), //Magic Char = C
|
||||
canDelete: _.contains(intersectPermissions, 'D'), //Magic Char = D
|
||||
canMove: _.contains(intersectPermissions, 'M'), //Magic Char = M
|
||||
canMove: _.contains(intersectPermissions, 'M'), //Magic Char = M
|
||||
canPublish: _.contains(intersectPermissions, 'U'), //Magic Char = U
|
||||
canUnpublish: _.contains(intersectPermissions, 'U'), //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish)
|
||||
canUnpublish: _.contains(intersectPermissions, 'U'), //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish)
|
||||
};
|
||||
}
|
||||
|
||||
var service = {
|
||||
getLayout: getLayout,
|
||||
getFirstAllowedLayout: getFirstAllowedLayout,
|
||||
setLayout: setLayout,
|
||||
saveLayoutInLocalStorage: saveLayoutInLocalStorage,
|
||||
selectHandler: selectHandler,
|
||||
selectItem: selectItem,
|
||||
deselectItem: deselectItem,
|
||||
clearSelection: clearSelection,
|
||||
selectAllItems: selectAllItems,
|
||||
isSelectedAll: isSelectedAll,
|
||||
setSortingDirection: setSortingDirection,
|
||||
setSorting: setSorting,
|
||||
getButtonPermissions: getButtonPermissions
|
||||
|
||||
getLayout: getLayout,
|
||||
getFirstAllowedLayout: getFirstAllowedLayout,
|
||||
setLayout: setLayout,
|
||||
saveLayoutInLocalStorage: saveLayoutInLocalStorage,
|
||||
selectHandler: selectHandler,
|
||||
selectItem: selectItem,
|
||||
deselectItem: deselectItem,
|
||||
clearSelection: clearSelection,
|
||||
selectAllItems: selectAllItems,
|
||||
isSelectedAll: isSelectedAll,
|
||||
setSortingDirection: setSortingDirection,
|
||||
setSorting: setSorting,
|
||||
getButtonPermissions: getButtonPermissions
|
||||
|
||||
};
|
||||
|
||||
return service;
|
||||
|
||||
@@ -26,7 +26,9 @@
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.umb-content-grid__icon {
|
||||
.umb-content-grid__icon,
|
||||
.umb-content-grid__icon[class^="icon-"],
|
||||
.umb-content-grid__icon[class*=" icon-"] {
|
||||
font-size: 40px;
|
||||
color: lighten(@gray, 20%);
|
||||
}
|
||||
|
||||
@@ -37,7 +37,9 @@
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.umb-folder-grid__folder-icon {
|
||||
.umb-folder-grid__folder-icon,
|
||||
.umb-folder-grid__folder-icon[class^="icon-"],
|
||||
.umb-folder-grid__folder-icon[class*=" icon-"] {
|
||||
font-size: 20px;
|
||||
margin-right: 15px;
|
||||
color: @black;
|
||||
|
||||
@@ -51,7 +51,9 @@
|
||||
border: 1px solid @blue;
|
||||
}
|
||||
|
||||
.umb-layout-selector__dropdown-item-icon {
|
||||
.umb-layout-selector__dropdown-item-icon,
|
||||
.umb-layout-selector__dropdown-item-icon[class^="icon-"],
|
||||
.umb-layout-selector__dropdown-item-icon[class*=" icon-"] {
|
||||
font-size: 20px;
|
||||
color: @gray;
|
||||
text-align: center;
|
||||
|
||||
@@ -85,7 +85,7 @@ input.umb-table__input {
|
||||
.umb-table-body .umb-table-row {
|
||||
color: fade(@gray, 75%);
|
||||
border-top: 1px solid @grayLight;
|
||||
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
|
||||
&:hover {
|
||||
@@ -101,16 +101,21 @@ input.umb-table__input {
|
||||
}
|
||||
}
|
||||
|
||||
.umb-table-body__icon {
|
||||
.umb-table-body__icon,
|
||||
.umb-table-body__icon[class^="icon-"],
|
||||
.umb-table-body__icon[class*=" icon-"] {
|
||||
margin: 0 auto;
|
||||
|
||||
font-size: 22px;
|
||||
line-height: 22px;
|
||||
color: @blueDark;
|
||||
}
|
||||
|
||||
.umb-table-body__checkicon {
|
||||
.umb-table-body__checkicon,
|
||||
.umb-table-body__checkicon[class^="icon-"],
|
||||
.umb-table-body__checkicon[class*=" icon-"] {
|
||||
display: none;
|
||||
font-size: 16px;
|
||||
line-height: 22px;
|
||||
}
|
||||
|
||||
.umb-table-body .umb-table__name {
|
||||
@@ -205,8 +210,6 @@ input.umb-table__input {
|
||||
overflow: hidden;
|
||||
white-space: nowrap; //NOTE Disable/Enable this to keep textstring on one line
|
||||
text-overflow: ellipsis;
|
||||
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.umb-table-cell:first-of-type {
|
||||
|
||||
@@ -243,7 +243,8 @@
|
||||
background-color: @grayLighter
|
||||
}
|
||||
|
||||
.table-striped tbody i:hover {
|
||||
/* don't hide all icons, e.g. for a sortable handle */
|
||||
.umb-listview .table-striped tbody i:not(.handle):hover {
|
||||
display: none !important
|
||||
}
|
||||
|
||||
|
||||
@@ -714,7 +714,45 @@ ul.color-picker li a {
|
||||
}
|
||||
|
||||
//
|
||||
// tags
|
||||
// Related links
|
||||
// --------------------------------------------------
|
||||
.umb-relatedlinks table > tr > td { word-wrap:break-word; word-break: break-all; border-bottom: 1px solid transparent; }
|
||||
.umb-relatedlinks .handle { cursor:move; }
|
||||
.umb-relatedlinks table > tbody > tr.unsortable .handle { cursor:default; }
|
||||
|
||||
.umb-relatedlinks table td.col-sort { width: 20px; }
|
||||
.umb-relatedlinks table td.col-caption { min-width: 200px; }
|
||||
.umb-relatedlinks table td.col-link { min-width: 200px; }
|
||||
.umb-relatedlinks table td.col-actions { min-width: 120px; }
|
||||
|
||||
.umb-relatedlinks table td.col-caption .control-wrapper,
|
||||
.umb-relatedlinks table td.col-link .control-wrapper { display: flex; }
|
||||
|
||||
.umb-relatedlinks table td.col-caption .control-wrapper input[type="text"],
|
||||
.umb-relatedlinks table td.col-link .control-wrapper input[type="text"] { width: auto; flex: 1; }
|
||||
|
||||
/* sortable placeholder */
|
||||
.umb-relatedlinks .sortable-placeholder {
|
||||
background-color: @tableBackgroundAccent;
|
||||
display: table-row;
|
||||
}
|
||||
.umb-relatedlinks .sortable-placeholder > td {
|
||||
display: table-cell;
|
||||
padding: 8px;
|
||||
}
|
||||
.umb-relatedlinks .ui-sortable-helper {
|
||||
display: table-row;
|
||||
background-color: @white;
|
||||
opacity: 0.7;
|
||||
}
|
||||
.umb-relatedlinks .ui-sortable-helper > td {
|
||||
display: table-cell;
|
||||
border-bottom: 1px solid @tableBorder;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Tags
|
||||
// --------------------------------------------------
|
||||
.umb-tags{border: @grayLighter solid 1px; padding: 10px; font-size: 13px; text-shadow: none;}
|
||||
.umb-tags .tag{cursor: pointer; margin: 7px; padding: 7px; background: @blue}
|
||||
|
||||
@@ -418,9 +418,9 @@ div.locked:before{
|
||||
padding-left: 10px;
|
||||
}
|
||||
.umb-actions-child li .menu-label {
|
||||
font-size: 12px;
|
||||
font-size: 14px;
|
||||
color: #000;
|
||||
margin-left: 20px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.umb-actions-child li .menu-label small {
|
||||
@@ -436,6 +436,9 @@ div.locked:before{
|
||||
}
|
||||
.umb-actions-child i {
|
||||
font-size: 32px;
|
||||
min-width: 32px;
|
||||
text-align: center;
|
||||
line-height: 24px; /* set line-height to ensure all icons use same line-height */
|
||||
}
|
||||
|
||||
.umb-actions-child li.add {
|
||||
|
||||
+6
-1
@@ -16,7 +16,12 @@ angular.module("umbraco")
|
||||
$scope.startNodeId = dialogOptions.startNodeId ? dialogOptions.startNodeId : -1;
|
||||
$scope.cropSize = dialogOptions.cropSize;
|
||||
$scope.lastOpenedNode = $cookieStore.get("umbLastOpenedMediaNodeId");
|
||||
$scope.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
|
||||
if($scope.onlyImages){
|
||||
$scope.acceptedFileTypes = mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes);
|
||||
}
|
||||
else {
|
||||
$scope.acceptedFileTypes = !mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles);
|
||||
}
|
||||
$scope.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
|
||||
|
||||
$scope.model.selectedImages = [];
|
||||
|
||||
@@ -80,7 +80,8 @@
|
||||
item-max-width="150"
|
||||
item-max-height="150"
|
||||
item-min-width="100"
|
||||
item-min-height="100">
|
||||
item-min-height="100"
|
||||
only-images={{onlyImages}}>
|
||||
</umb-media-grid>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -10,4 +10,16 @@ angular.module("umbraco")
|
||||
$scope.model.error.data.StackTrace = $scope.model.error.data.StackTrace.trim();
|
||||
}
|
||||
|
||||
if ($scope.model.error && $scope.model.error.data) {
|
||||
$scope.model.error.data.InnerExceptions = [];
|
||||
var ex = $scope.model.error.data.InnerException;
|
||||
while (ex) {
|
||||
if (ex.StackTrace) {
|
||||
ex.StackTrace = ex.StackTrace.trim();
|
||||
}
|
||||
$scope.model.error.data.InnerExceptions.push(ex);
|
||||
ex = ex.InnerException;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
@@ -16,4 +16,12 @@
|
||||
</h5>
|
||||
<pre style="white-space: pre-wrap; overflow-x: auto;">{{model.error.data.StackTrace}}</pre>
|
||||
</div>
|
||||
|
||||
<div class="umb-control-group" ng-repeat="e in model.error.data.InnerExceptions">
|
||||
<h5>
|
||||
<localize key="defaultdialogs_innerException">Inner Exception:</localize>
|
||||
</h5>
|
||||
<div>{{e.ExceptionType}}: {{e.ExceptionMessage}}</div>
|
||||
<pre style="white-space: pre-wrap; overflow-x: auto;">{{e.StackTrace}}</pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<i ng-if="item.selected" class="icon-check umb-content-grid__checkmark"></i>
|
||||
|
||||
<div class="umb-content-grid__icon-container">
|
||||
<i class="{{ item.icon }} umb-content-grid__icon" ng-class="{'-light': !item.published}"></i>
|
||||
<i class="umb-content-grid__icon {{ item.icon }}" ng-class="{'-light': !item.published}"></i>
|
||||
</div>
|
||||
|
||||
<div class="umb-content-grid__content">
|
||||
|
||||
@@ -5,10 +5,9 @@
|
||||
</div>
|
||||
|
||||
<div ng-if="layoutDropDownIsOpen" class="umb-layout-selector__dropdown shadow-depth-3 animated -half-second fadeIn" on-outside-click="closeLayoutDropdown()">
|
||||
|
||||
<div ng-repeat="layout in layouts | filter:{selected:true}" class="umb-layout-selector__dropdown-item" ng-click="pickLayout(layout)" ng-class="{'-active': layout.active }">
|
||||
<i class="{{ layout.icon }} umb-layout-selector__dropdown-item-icon"></i>
|
||||
</div>
|
||||
<div ng-repeat="layout in layouts | filter:{selected:true}" class="umb-layout-selector__dropdown-item" ng-click="pickLayout(layout)" ng-class="{'-active': layout.active }" ng-attr-title="{{layout.name}}">
|
||||
<i class="{{ layout.icon }} umb-layout-selector__dropdown-item-icon"></i>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -78,12 +78,12 @@
|
||||
<strong>{{ file.name }}</strong>
|
||||
|
||||
<span class="file-error" ng-if="file.$error">
|
||||
<span ng-if="file.$error === 'pattern'" class="errorMessage color-red">(<localize key="media_onlyAllowedFiles"></localize>: "{{ accept }}")</span>
|
||||
<span ng-if="file.$error === 'maxSize'" class="errorMessage color-red">(<localize key="media_maxFileSize"></localize> "{{maxFileSize}}")</span>
|
||||
<span ng-if="file.$error === 'pattern'" class="errorMessage color-red"><localize key="media_disallowedFileType"></localize></span>
|
||||
<span ng-if="file.$error === 'maxSize'" class="errorMessage color-red"><localize key="media_maxFileSize"></localize> "{{maxFileSize}}"</span>
|
||||
</span>
|
||||
|
||||
<span class="file-error" ng-if="file.serverErrorMessage">
|
||||
<span class="errorMessage color-red">({{file.serverErrorMessage}})</span>
|
||||
<span class="errorMessage color-red">{{file.serverErrorMessage}}</span>
|
||||
</span>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<h3>Start here</h3>
|
||||
<h4>This section contains the building blocks for your Umbraco site</h4>
|
||||
<p>Follow the below links to find out more about working with the items in the Setings section:</p>
|
||||
<p>Follow the below links to find out more about working with the items in the Settings section:</p>
|
||||
|
||||
<h4>Find out more:</h4>
|
||||
|
||||
<ul>
|
||||
<li>Read more about working with the Items in Settings <a class="btn-link -underline" href="http://our.umbraco.org/wiki/umbraco-help/settings" target="_blank">in the Community Wiki</a></li>
|
||||
<li>Download the <a class="btn-link -underline" href="http://our.umbraco.org/projects/website-utilities/umbraco-7-editors-manual" target="_blank">Editors Manual</a> for details on working with the Umbraco UI</li>
|
||||
<li>Ask a question in the <a class="btn-link -underline" href="http://our.umbraco.org/" target="_blank">Community Forum</a></li>
|
||||
<li>Read more about working with the Items in Settings <a class="btn-link -underline" href="https://our.umbraco.org/documentation/Getting-Started/Backoffice/Sections/" target="_blank">in the Documentation section</a> of Our Umbraco</li>
|
||||
<li>Download the <a class="btn-link -underline" href="https://our.umbraco.org/projects/website-utilities/umbraco-7-editors-manual" target="_blank">Editors Manual</a> for details on working with the Umbraco UI</li>
|
||||
<li>Ask a question in the <a class="btn-link -underline" href="https://our.umbraco.org/" target="_blank">Community Forum</a></li>
|
||||
<li>Watch our <a class="btn-link -underline" href="http://umbraco.tv" target="_blank">tutorial videos</a> (some are free, some require a subscription)</li>
|
||||
<li>Find out about our <a class="btn-link -underline" href="http://umbraco.com/products" target="_blank">productivity boosting tools and commercial support</a></li>
|
||||
<li>Find out about real-life <a class="btn-link -underline" href="http://umbraco.com/products/training/schedule" target="_blank">training and certification</a> opportunities</li>
|
||||
|
||||
@@ -145,7 +145,8 @@
|
||||
|
||||
contentTypeHelper.generateModels().then(function (result) {
|
||||
|
||||
if (result.success) {
|
||||
// generateModels() returns the dashboard content
|
||||
if (!result.lastError) {
|
||||
|
||||
//re-check model status
|
||||
contentTypeHelper.checkModelsBuilderStatus().then(function(statusResult) {
|
||||
|
||||
+2
-4
@@ -14,10 +14,8 @@
|
||||
var vm = this;
|
||||
|
||||
vm.nodeId = $scope.contentId;
|
||||
//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, "!.");
|
||||
|
||||
//we pass in a blacklist by adding ! to the file extensions, allowing everything EXCEPT for disallowedUploadFiles
|
||||
vm.acceptedFileTypes = !mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles);
|
||||
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
|
||||
vm.activeDrag = false;
|
||||
vm.mediaDetailsTooltip = {};
|
||||
|
||||
+2
-3
@@ -6,9 +6,8 @@
|
||||
var vm = this;
|
||||
|
||||
vm.nodeId = $scope.contentId;
|
||||
//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, "!.");
|
||||
//we pass in a blacklist by adding ! to the file extensions, allowing everything EXCEPT for disallowedUploadFiles
|
||||
vm.acceptedFileTypes = !mediaHelper.formatFileTypes(Umbraco.Sys.ServerVariables.umbracoSettings.disallowedUploadFiles);
|
||||
vm.maxFileSize = Umbraco.Sys.ServerVariables.umbracoSettings.maxFileSize + "KB";
|
||||
vm.activeDrag = false;
|
||||
vm.isRecycleBin = $scope.contentId === '-21' || $scope.contentId === '-20';
|
||||
|
||||
+8
-7
@@ -12,10 +12,10 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
|
||||
$scope.model.config.startNodeId = userData.startMediaId;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function setupViewModel() {
|
||||
$scope.images = [];
|
||||
$scope.ids = [];
|
||||
$scope.ids = [];
|
||||
|
||||
if ($scope.model.value) {
|
||||
var ids = $scope.model.value.split(',');
|
||||
@@ -30,16 +30,16 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
|
||||
entityResource.getByIds(ids, "Media").then(function (medias) {
|
||||
|
||||
_.each(medias, function (media, i) {
|
||||
|
||||
|
||||
//only show non-trashed items
|
||||
if (media.parentId >= -1) {
|
||||
|
||||
if (!media.thumbnail) {
|
||||
if (!media.thumbnail) {
|
||||
media.thumbnail = mediaHelper.resolveFileFromEntity(media, true);
|
||||
}
|
||||
|
||||
$scope.images.push(media);
|
||||
$scope.ids.push(media.id);
|
||||
$scope.ids.push(media.id);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -67,6 +67,7 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
|
||||
title: "Select media",
|
||||
startNodeId: $scope.model.config.startNodeId,
|
||||
multiPicker: multiPicker,
|
||||
onlyImages: onlyImages,
|
||||
show: true,
|
||||
submit: function(model) {
|
||||
|
||||
@@ -93,8 +94,8 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
|
||||
$scope.sortableOptions = {
|
||||
update: function(e, ui) {
|
||||
var r = [];
|
||||
//TODO: Instead of doing this with a half second delay would be better to use a watch like we do in the
|
||||
// content picker. THen we don't have to worry about setting ids, render models, models, we just set one and let the
|
||||
//TODO: Instead of doing this with a half second delay would be better to use a watch like we do in the
|
||||
// content picker. THen we don't have to worry about setting ids, render models, models, we just set one and let the
|
||||
// watch do all the rest.
|
||||
$timeout(function(){
|
||||
angular.forEach($scope.images, function(value, key){
|
||||
|
||||
+62
-7
@@ -1,16 +1,19 @@
|
||||
angular.module("umbraco")
|
||||
.controller("Umbraco.PropertyEditors.RelatedLinksController",
|
||||
function ($rootScope, $scope, dialogService) {
|
||||
function ($rootScope, $scope, dialogService, iconHelper) {
|
||||
|
||||
if (!$scope.model.value) {
|
||||
$scope.model.value = [];
|
||||
}
|
||||
|
||||
$scope.model.config.max = isNumeric($scope.model.config.max) && $scope.model.config.max !== 0 ? $scope.model.config.max : Number.MAX_VALUE;
|
||||
|
||||
$scope.newCaption = '';
|
||||
$scope.newLink = 'http://';
|
||||
$scope.newNewWindow = false;
|
||||
$scope.newInternal = null;
|
||||
$scope.newInternalName = '';
|
||||
$scope.newInternalIcon = null;
|
||||
$scope.addExternal = true;
|
||||
$scope.currentEditLink = null;
|
||||
$scope.hasError = false;
|
||||
@@ -72,7 +75,6 @@
|
||||
}
|
||||
$scope.model.value[idx].edit = true;
|
||||
};
|
||||
|
||||
|
||||
$scope.saveEdit = function (idx) {
|
||||
$scope.model.value[idx].title = $scope.model.value[idx].caption;
|
||||
@@ -107,6 +109,7 @@
|
||||
this.edit = false;
|
||||
this.isInternal = true;
|
||||
this.internalName = $scope.newInternalName;
|
||||
this.internalIcon = $scope.newInternalIcon;
|
||||
this.type = "internal";
|
||||
this.title = $scope.newCaption;
|
||||
};
|
||||
@@ -117,7 +120,7 @@
|
||||
$scope.newNewWindow = false;
|
||||
$scope.newInternal = null;
|
||||
$scope.newInternalName = '';
|
||||
|
||||
$scope.newInternalIcon = null;
|
||||
}
|
||||
$event.preventDefault();
|
||||
};
|
||||
@@ -141,23 +144,73 @@
|
||||
$scope.model.value[index + direction] = temp;
|
||||
};
|
||||
|
||||
//helper for determining if a user can add items
|
||||
$scope.canAdd = function () {
|
||||
return $scope.model.config.max <= 0 || $scope.model.config.max > countVisible();
|
||||
}
|
||||
|
||||
//helper that returns if an item can be sorted
|
||||
$scope.canSort = function () {
|
||||
return countVisible() > 1;
|
||||
}
|
||||
|
||||
$scope.sortableOptions = {
|
||||
containment: 'parent',
|
||||
axis: 'y',
|
||||
handle: '.handle',
|
||||
cursor: 'move',
|
||||
cancel: '.no-drag',
|
||||
containment: 'parent',
|
||||
placeholder: 'sortable-placeholder',
|
||||
forcePlaceholderSize: true,
|
||||
helper: function (e, ui) {
|
||||
// When sorting <trs>, the cells collapse. This helper fixes that: http://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/
|
||||
// When sorting table rows, the cells collapse. This helper fixes that: http://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/
|
||||
ui.children().each(function () {
|
||||
$(this).width($(this).width());
|
||||
});
|
||||
return ui;
|
||||
},
|
||||
items: '> tr',
|
||||
items: '> tr:not(.unsortable)',
|
||||
tolerance: 'pointer',
|
||||
update: function (e, ui) {
|
||||
|
||||
// Get the new and old index for the moved element (using the URL as the identifier)
|
||||
var newIndex = ui.item.index();
|
||||
var movedLinkUrl = ui.item.attr('data-link');
|
||||
var originalIndex = getElementIndexByUrl(movedLinkUrl);
|
||||
|
||||
// Move the element in the model
|
||||
var movedElement = $scope.model.value[originalIndex];
|
||||
$scope.model.value.splice(originalIndex, 1);
|
||||
$scope.model.value.splice(newIndex, 0, movedElement);
|
||||
},
|
||||
start: function (e, ui) {
|
||||
//ui.placeholder.html("<td colspan='5'></td>");
|
||||
|
||||
// Build a placeholder cell that spans all the cells in the row: http://stackoverflow.com/questions/25845310/jquery-ui-sortable-and-table-cell-size
|
||||
var cellCount = 0;
|
||||
$('td, th', ui.helper).each(function () {
|
||||
// For each td or th try and get it's colspan attribute, and add that or 1 to the total
|
||||
var colspan = 1;
|
||||
var colspanAttr = $(this).attr('colspan');
|
||||
if (colspanAttr > 1) {
|
||||
colspan = colspanAttr;
|
||||
}
|
||||
cellCount += colspan;
|
||||
});
|
||||
|
||||
// Add the placeholder UI - note that this is the item's content, so td rather than tr - and set height of tr
|
||||
ui.placeholder.html('<td colspan="' + cellCount + '"></td>').height(ui.item.height());
|
||||
}
|
||||
};
|
||||
|
||||
//helper to count what is visible
|
||||
function countVisible() {
|
||||
return $scope.model.value.length;
|
||||
}
|
||||
|
||||
function isNumeric(n) {
|
||||
return !isNaN(parseFloat(n)) && isFinite(n);
|
||||
}
|
||||
|
||||
function getElementIndexByUrl(url) {
|
||||
for (var i = 0; i < $scope.model.value.length; i++) {
|
||||
if ($scope.model.value[i].link == url) {
|
||||
@@ -172,10 +225,12 @@
|
||||
if ($scope.currentEditLink != null) {
|
||||
$scope.currentEditLink.internal = data.id;
|
||||
$scope.currentEditLink.internalName = data.name;
|
||||
$scope.currentEditLink.internalIcon = iconHelper.convertFromLegacyIcon(data.icon);
|
||||
$scope.currentEditLink.link = data.id;
|
||||
} else {
|
||||
$scope.newInternal = data.id;
|
||||
$scope.newInternalName = data.name;
|
||||
$scope.newInternalIcon = iconHelper.convertFromLegacyIcon(data.icon);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
+43
-32
@@ -11,68 +11,79 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody ui-sortable="sortableOptions" ng-model="model.value">
|
||||
<tr ng-repeat="link in model.value" data-link="{{link.link}}">
|
||||
<td style="width: 20px"><i class="icon icon-navigation handle"></i></td>
|
||||
<td style="word-wrap:break-word; word-break: break-all">
|
||||
<tr ng-repeat="link in model.value" data-link="{{link.link}}" ng-class="{ 'unsortable': model.value.length <= 1 }">
|
||||
<td class="col-sort"><i class="icon icon-navigation handle" ng-show="canSort()"></i></td>
|
||||
<td class="col-caption">
|
||||
<span ng-show="!link.edit">{{link.caption}}</span>
|
||||
<input type="text" ng-model="link.caption" ng-show="link.edit" />
|
||||
<div class="control-wrapper">
|
||||
<input type="text" ng-model="link.caption" ng-show="link.edit" />
|
||||
</div>
|
||||
</td>
|
||||
<td style="word-wrap:break-word; word-break: break-all">
|
||||
<td class="col-link">
|
||||
<div ng-show="!link.edit">
|
||||
<i class="icon {{link.internalIcon}}" ng-show="link.internalIcon"></i>
|
||||
<a href="{{link.link}}" target="_blank" ng-show="!link.isInternal">{{link.link}}</a>
|
||||
<a href="#/content/content/edit/{{link.internal}}" target="_blank" ng-show="link.isInternal" ng-bind="link.internalName"></a>
|
||||
</div>
|
||||
<div ng-show="link.edit">
|
||||
<div ng-show="!link.isInternal">
|
||||
<input type="text" ng-model="link.link" /><br />
|
||||
<localize key="or">or</localize> <a href="#" ng-click="switchLinkType($event,link)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
|
||||
</div>
|
||||
<div class="control-wrapper">
|
||||
<input type="text" ng-model="link.link" />
|
||||
</div>
|
||||
<localize key="or">or</localize> <a href="#" ng-click="switchLinkType($event,link)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
|
||||
</div>
|
||||
|
||||
<div ng-show="link.isInternal">
|
||||
<i class="icon {{link.internalIcon}}" ng-show="link.internalIcon"></i>
|
||||
<span ng-bind="link.internalName"></span> <a href="#" ng-click="selectInternal($event,link)"><localize key="choose">Choose</localize></a><br />
|
||||
<localize key="or">or</localize> <a href="#" ng-click="switchLinkType($event,link)"><localize key="relatedlinks_enterExternal">enter external link</localize></a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<td class="col-newwindow">
|
||||
<span ng-show="!link.edit">{{link.newWindow}}</span>
|
||||
<input type="checkbox" ng-model="link.newWindow" ng-show="link.edit" />
|
||||
</td>
|
||||
<td>
|
||||
|
||||
<td class="col-actions">
|
||||
<div class="btn-group" ng-show="!link.edit">
|
||||
<button type="button" class="btn btn-default" ng-click="edit($index)"><localize key="edit">Edit</localize></button>
|
||||
<button type="button" class="btn btn-default" ng-click="delete($index)"><localize key="delete">Delete</localize></button>
|
||||
</div>
|
||||
<div class="btn-group" ng-show="link.edit">
|
||||
<div class="btn-group" ng-show="link.edit" style="margin-left: 0;">
|
||||
<button type="button" class="btn btn-default" ng-click="saveEdit($index)"><localize key="buttons_save">Save</localize></button>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tfoot ng-show="canAdd()">
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><input type="text" ng-model="newCaption" localize="placeholder" placeholder="@relatedlinks_captionPlaceholder" val-highlight="{{hasError}}" /></td>
|
||||
<td>
|
||||
<div ng-show="addExternal">
|
||||
<td class="col-sort"></td>
|
||||
<td class="col-caption">
|
||||
<div class="control-wrapper">
|
||||
<input type="text" ng-model="newCaption" localize="placeholder" placeholder="@relatedlinks_captionPlaceholder" val-highlight="hasError" />
|
||||
</div>
|
||||
</td>
|
||||
<td class="col-link">
|
||||
<div ng-show="addExternal">
|
||||
<div class="control-wrapper">
|
||||
<input type="text" ng-model="newLink" localize="placeholder" placeholder="@relatedlinks_externalLinkPlaceholder" />
|
||||
<br /> <localize key="or">or</localize>
|
||||
<a href="#" ng-click="switch($event)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
|
||||
</div>
|
||||
<localize key="or">or</localize>
|
||||
<a href="#" ng-click="switch($event)"><localize key="relatedlinks_chooseInternal">choose internal page</localize></a>
|
||||
</div>
|
||||
|
||||
<div ng-show="!addExternal">
|
||||
<span ng-bind="newInternalName"></span> <a href="#" ng-click="internal($event)"><localize key="choose">Choose</localize></a><br />
|
||||
<localize key="or">or</localize> <a href="#" ng-click="switch($event)"><localize key="relatedlinks_enterExternal">enter external link</localize></a>
|
||||
</div>
|
||||
</td>
|
||||
<td><input type="checkbox" ng-model="newNewWindow" /> </td>
|
||||
<td>
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-default" ng-click="add($event)"><localize key="general_add">Add</localize></button>
|
||||
</div>
|
||||
</td>
|
||||
<div ng-show="!addExternal">
|
||||
<i class="icon {{newInternalIcon}}" ng-show="newInternalIcon"></i>
|
||||
<span ng-bind="newInternalName"></span> <a href="#" ng-click="internal($event)"><localize key="choose">Choose</localize></a><br />
|
||||
<localize key="or">or</localize> <a href="#" ng-click="switch($event)"><localize key="relatedlinks_enterExternal">enter external link</localize></a>
|
||||
</div>
|
||||
</td>
|
||||
<td class="col-newwindow"><input type="checkbox" ng-model="newNewWindow" /></td>
|
||||
<td class="col-actions">
|
||||
<div class="btn-group">
|
||||
<button class="btn btn-default" ng-click="add($event)" ng-disabled="newCaption == '' || !canAdd()" ng-show="canAdd()"><localize key="general_add">Add</localize></button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@@ -84,4 +95,4 @@
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -2241,6 +2241,9 @@
|
||||
<Content Include="Umbraco\Members\EditMemberGroup.aspx">
|
||||
<SubType>Form</SubType>
|
||||
</Content>
|
||||
<Content Include="Umbraco\ping.aspx">
|
||||
<SubType>Form</SubType>
|
||||
</Content>
|
||||
<Content Include="Umbraco\publishStatus.aspx" />
|
||||
<Content Include="Umbraco\Settings\EditDictionaryItem.aspx" />
|
||||
<Content Include="Umbraco\Settings\editLanguage.aspx" />
|
||||
@@ -2411,9 +2414,9 @@ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\"
|
||||
<WebProjectProperties>
|
||||
<UseIIS>True</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>7420</DevelopmentServerPort>
|
||||
<DevelopmentServerPort>7430</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>http://localhost:7420</IISUrl>
|
||||
<IISUrl>http://localhost:7430</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
|
||||
@@ -10,7 +10,7 @@ NOTES:
|
||||
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
|
||||
* A new version will invalidate both client and server cache and create new persisted files
|
||||
-->
|
||||
<clientDependency version="433963333" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
|
||||
<clientDependency version="386225312" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
|
||||
|
||||
<!--
|
||||
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.
|
||||
|
||||
@@ -271,7 +271,8 @@
|
||||
|
||||
<key alias="externalLoginProviders">External login providers</key>
|
||||
<key alias="exceptionDetail">Exception Details</key>
|
||||
<key alias="stracktrace">Stacktrace</key>
|
||||
<key alias="stacktrace">Stacktrace</key>
|
||||
<key alias="innerException">Inner Exception</key>
|
||||
|
||||
<key alias="linkYour">Link your</key>
|
||||
<key alias="unLinkYour">Un-Link your</key>
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
<key alias="urls">Link to media</key>
|
||||
<key alias="orClickHereToUpload">or click here to choose files</key>
|
||||
<key alias="onlyAllowedFiles">Only allowed file types are</key>
|
||||
<key alias="disallowedFileType">Cannot upload this file, it does not have an approved file type</key>
|
||||
<key alias="maxFileSize">Max file size is</key>
|
||||
</area>
|
||||
<area alias="member">
|
||||
@@ -271,7 +272,8 @@
|
||||
|
||||
<key alias="externalLoginProviders">External login providers</key>
|
||||
<key alias="exceptionDetail">Exception Details</key>
|
||||
<key alias="stracktrace">Stacktrace</key>
|
||||
<key alias="stacktrace">Stacktrace</key>
|
||||
<key alias="innerException">Inner Exception</key>
|
||||
|
||||
<key alias="linkYour">Link your</key>
|
||||
<key alias="unLinkYour">Un-Link your</key>
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
<key alias="treepicker">項目の選択</key>
|
||||
<key alias="viewCacheItem">キャッシュされている項目の表示</key>
|
||||
<key alias="createFolder">フォルダーの作成...</key>
|
||||
|
||||
|
||||
<key alias="relateToOriginalLabel">オリジナルに関連付ける</key>
|
||||
<key alias="theFriendliestCommunity">フレンドリーなコミュニティ</key>
|
||||
|
||||
@@ -267,7 +267,8 @@
|
||||
|
||||
<key alias="externalLoginProviders">外部ログイン プロバイダー</key>
|
||||
<key alias="exceptionDetail">例外の詳細</key>
|
||||
<key alias="stracktrace">スタックトレース</key>
|
||||
<key alias="stacktrace">スタックトレース</key>
|
||||
<key alias="innerException">Inner Exception</key>
|
||||
|
||||
<key alias="linkYour">次をリンク:</key>
|
||||
<key alias="unLinkYour">次をリンク解除:</key>
|
||||
@@ -475,7 +476,7 @@
|
||||
<key alias="move">移動</key>
|
||||
<key alias="embed">埋め込み</key>
|
||||
</area>
|
||||
|
||||
|
||||
<area alias="colors">
|
||||
<key alias="black">ブラック</key>
|
||||
<key alias="green">グリーン</key>
|
||||
@@ -484,7 +485,7 @@
|
||||
<key alias="blue">ブルー</key>
|
||||
<key alias="red">レッド</key>
|
||||
</area>
|
||||
|
||||
|
||||
<area alias="shortcuts">
|
||||
<key alias="addTab">タブの追加</key>
|
||||
<key alias="addProperty">プロパティの追加</key>
|
||||
@@ -503,7 +504,7 @@
|
||||
<key alias="toggleListView">リスト ビューの切り替え</key>
|
||||
<key alias="toggleAllowAsRoot">ルートとして許可に切り替え</key>
|
||||
</area>
|
||||
|
||||
|
||||
<area alias="graphicheadline">
|
||||
<key alias="backgroundcolor">背景色</key>
|
||||
<key alias="bold">太字</key>
|
||||
@@ -537,7 +538,7 @@
|
||||
<strong>アップグレード</strong>ボタンを押すとUmbraco %0% 用にデータベースをアップグレードします。</p>
|
||||
<p>
|
||||
心配ありません。 - コンテントが消える事はありませんし、後で続けることもできます。
|
||||
</p>
|
||||
</p>
|
||||
]]></key>
|
||||
<key alias="databaseUpgradeDone"><![CDATA[データベースはバージョン %0% 用にアップグレードされました。<br /><strong>次へ</strong>
|
||||
を押して続行してください。]]></key>
|
||||
@@ -583,7 +584,7 @@
|
||||
]]></key>
|
||||
<key alias="runwayFromScratch">スクラッチから始めたい</key>
|
||||
<key alias="runwayFromScratchText"><![CDATA[
|
||||
ウェブサイトはさしあたり完全に空っぽで、必要なドキュメント型やテンプレートを作成するところから始められます。
|
||||
ウェブサイトはさしあたり完全に空っぽで、必要なドキュメント型やテンプレートを作成するところから始められます。
|
||||
(<a href="http://umbraco.tv/documentation/videos/for-site-builders/foundation/document-types">どうしたらいいの?</a>)
|
||||
後からRunwayをインストールする事もできます。そうしたくなった時は、Developerセクションのパッケージへどうぞ。
|
||||
]]></key>
|
||||
@@ -597,8 +598,8 @@
|
||||
<key alias="runwaySimpleSite">簡単なウェブサイトから始めたい</key>
|
||||
<key alias="runwaySimpleSiteText"><![CDATA[
|
||||
<p>
|
||||
"Runway"(≈滑走路)は幾つかの基本的なテンプレートから簡単なウェブサイトを用意します。このインストーラーは自動的にRnwayをセットアップできますが、
|
||||
これを編集したり、拡張したり、削除する事も簡単にできます。もしUmbracoを完璧に使いこなせるならばこれは不要です。とはいえ、
|
||||
"Runway"(≈滑走路)は幾つかの基本的なテンプレートから簡単なウェブサイトを用意します。このインストーラーは自動的にRnwayをセットアップできますが、
|
||||
これを編集したり、拡張したり、削除する事も簡単にできます。もしUmbracoを完璧に使いこなせるならばこれは不要です。とはいえ、
|
||||
Runwayを使う事は、手間なく簡単にUmbracoを始める為には良い選択肢です。
|
||||
Runwayをインストールすれば、必要に応じてRunwayによる基本的な構成のページをRunwayのモジュールから選択できます。
|
||||
</p>
|
||||
@@ -692,7 +693,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
|
||||
<p>ユーザー <strong>'%3%'</strong> によりページ <a href="http://%4%/actions/preview.aspx?id=%5%"><strong>'%2%'</strong></a> 上のタスク <strong>'%1%'</strong> から自動的にメールします。</p>
|
||||
<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%"> 編集 </a>
|
||||
<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%"> 編集 </a>
|
||||
<br />
|
||||
</div>
|
||||
<p>
|
||||
@@ -704,7 +705,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
|
||||
|
||||
<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%"> 編集 </a>
|
||||
<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%"> 編集 </a>
|
||||
<br />
|
||||
</div>
|
||||
|
||||
@@ -1064,7 +1065,7 @@ Runwayをインストールして作られた新しいウェブサイトがど
|
||||
|
||||
<key alias="thisEditorUpdateSettings">このエディターを使用すると新しい設定で更新されます</key>
|
||||
</area>
|
||||
|
||||
|
||||
<area alias="templateEditor">
|
||||
<key alias="alternativeField">代替フィールド</key>
|
||||
<key alias="alternativeText">代替テキスト</key>
|
||||
|
||||
@@ -189,10 +189,10 @@
|
||||
<key alias="inheritedFrom">Унаследован от</key>
|
||||
<key alias="addProperty">Добавить свойство</key>
|
||||
<key alias="requiredLabel">Обязательная метка</key>
|
||||
|
||||
|
||||
<key alias="enableListViewHeading">Представление в формате списка</key>
|
||||
<key alias="enableListViewDescription">Устанавливает представление документа данного типа в виде сортируемого списка дочерних документов с функцией поиска, в отличие от обычного представления дочерних документов в виде дерева</key>
|
||||
|
||||
|
||||
<key alias="allowedTemplatesHeading">Допустимые шаблоны</key>
|
||||
<key alias="allowedTemplatesDescription">Выберите перечень допустимых шаблонов для сопоставления документам данного типа</key>
|
||||
<key alias="allowAsRootHeading">Разрешить в качестве корневого</key>
|
||||
@@ -206,31 +206,31 @@
|
||||
<key alias="compositionsDescription">Унаследовать вкладки и свойства из уже существующего типа документов. Вкладки будут либо добавлены в создаваемый тип, либо в случае совпадения названий вкладок будут добавлены наследуемые свойства.</key>
|
||||
<key alias="compositionInUse">Этот тип документов уже участвует в композиции другого типа, поэтому сам не может быть композицией.</key>
|
||||
<key alias="noAvailableCompositions">В настоящее время нет типов документов, допустимых для построения композиции.</key>
|
||||
|
||||
|
||||
<key alias="availableEditors">Доступные редакторы</key>
|
||||
<key alias="reuse">Переиспользовать</key>
|
||||
<key alias="editorSettings">Установки редактора</key>
|
||||
|
||||
|
||||
<key alias="configuration">Конфигурирование</key>
|
||||
|
||||
|
||||
<key alias="yesDelete">ДА, удалить</key>
|
||||
|
||||
|
||||
<key alias="movedUnderneath">была перемещена внутрь</key>
|
||||
<key alias="folderToMove">Выбрать папку для перемещения</key>
|
||||
<key alias="structureBelow">в структуре дерева</key>
|
||||
|
||||
|
||||
<key alias="allDocumentTypes">Все типы документов</key>
|
||||
<key alias="allDocuments">Все документы</key>
|
||||
<key alias="allMediaItems">Все медиа-элементы</key>
|
||||
|
||||
|
||||
<key alias="usingThisDocument">, использующие этот тип документов, будут безвозвратно удалены, пожалуйста, подтвердите это действие.</key>
|
||||
<key alias="usingThisMedia">, использующие этот тип медиа, будут безвозвратно удалены, пожалуйста, подтвердите это действие.</key>
|
||||
<key alias="usingThisMember">, использующие этот тип участников, будут безвозвратно удалены, пожалуйста, подтвердите это действие.</key>
|
||||
|
||||
|
||||
<key alias="andAllDocuments">и все документы, использующие данный тип</key>
|
||||
<key alias="andAllMediaItems">и все медиа-элементы, использующие данный тип</key>
|
||||
<key alias="andAllMembers">и все участники, использующие данный тип</key>
|
||||
|
||||
|
||||
<key alias="thisEditorUpdateSettings">, использующие этот редактор, будут обновлены с применением этих установок</key>
|
||||
|
||||
<key alias="memberCanEdit">Участник может изменить</key>
|
||||
@@ -302,18 +302,18 @@
|
||||
<key alias="treepicker">Выберите элемент</key>
|
||||
<key alias="viewCacheItem">Просмотр элемента кэша</key>
|
||||
<key alias="createFolder">Создать папку...</key>
|
||||
|
||||
|
||||
<key alias="relateToOriginalLabel">Связать с оригиналом</key>
|
||||
<key alias="theFriendliestCommunity">Самое дружелюбное сообщество</key>
|
||||
|
||||
|
||||
<key alias="linkToPage">Ссылка на страницу</key>
|
||||
|
||||
|
||||
<key alias="openInNewWindow">Открывает документ по ссылке в новом окне или вкладке браузера</key>
|
||||
<key alias="openInFullBody">Открывает документ по ссылке в полноэкранном режиме</key>
|
||||
<key alias="openInParentFrame">Открывает документ по ссылке в родительском фрейме</key>
|
||||
|
||||
|
||||
<key alias="linkToMedia">Ссылка на медиа-файл</key>
|
||||
|
||||
|
||||
<key alias="selectMedia">Выбрать медиа</key>
|
||||
<key alias="selectIcon">Выбрать значок</key>
|
||||
<key alias="selectItem">Выбрать элемент</key>
|
||||
@@ -322,23 +322,24 @@
|
||||
<key alias="selectContent">Выбрать содержимое</key>
|
||||
<key alias="selectMember">Выбрать участника</key>
|
||||
<key alias="selectMemberGroup">Выбрать группу участников</key>
|
||||
|
||||
|
||||
<key alias="noMacroParams">Это макрос без параметров</key>
|
||||
|
||||
|
||||
<key alias="externalLoginProviders">Провайдеры аутентификации</key>
|
||||
<key alias="exceptionDetail">Подробное сообщение об ошибке</key>
|
||||
<key alias="stracktrace">Трассировка стека</key>
|
||||
|
||||
<key alias="stacktrace">Трассировка стека</key>
|
||||
<key alias="innerException">Inner Exception</key>
|
||||
|
||||
<key alias="linkYour">Связать</key>
|
||||
<key alias="unLinkYour">Разорвать связь</key>
|
||||
|
||||
|
||||
<key alias="account">учетную запись</key>
|
||||
|
||||
|
||||
<key alias="selectEditor">Выбрать редактор</key>
|
||||
</area>
|
||||
<area alias="dictionaryItem">
|
||||
<key alias="description"><![CDATA[
|
||||
Ниже Вы можете указать различные переводы данной статьи словаря '<em>%0%</em>'<br/>Добавить другие языки можно, воспользовавшись пунктом 'Языки' в меню слева
|
||||
Ниже Вы можете указать различные переводы данной статьи словаря '<em>%0%</em>'<br/>Добавить другие языки можно, воспользовавшись пунктом 'Языки' в меню слева
|
||||
]]></key>
|
||||
<key alias="displayName">Название языка (культуры)</key>
|
||||
</area>
|
||||
@@ -397,7 +398,7 @@
|
||||
<key alias="macroErrorLoadingCustomControl">Ошибка загрузки внешнего типа (сборка: %0%, тип: '%1%')</key>
|
||||
<key alias="macroErrorLoadingMacroEngineScript">Ошибка загрузки макроса (файл: %0%)</key>
|
||||
<key alias="macroErrorParsingXSLTFile">"Ошибка разбора кода XSLT в файле: %0%</key>
|
||||
<key alias="macroErrorReadingXSLTFile">"Ошибка чтения XSLT-файла: %0%</key>
|
||||
<key alias="macroErrorReadingXSLTFile">"Ошибка чтения XSLT-файла: %0%</key>
|
||||
<key alias="missingPropertyEditorErrorMessage">Ошибка в конфигурации типа данных, используемого для свойства, проверьте тип данных</key>
|
||||
<key alias="missingTitle">Укажите заголовок</key>
|
||||
<key alias="missingType">Выберите тип</key>
|
||||
@@ -876,7 +877,7 @@
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedExpired"><![CDATA[
|
||||
Документ %0% не может быть опубликован, так как текущая информация в нем устарела.
|
||||
]]></key>
|
||||
]]></key>
|
||||
<key alias="contentPublishedFailedByParent"><![CDATA[
|
||||
Документ %0% не может быть опубликован, так как не опубликован его родительский документ.
|
||||
]]></key>
|
||||
@@ -959,14 +960,14 @@
|
||||
<key alias="addTemplate">Добавить шаблон</key>
|
||||
<key alias="addChildNode">Добавить дочерний узел</key>
|
||||
<key alias="addChild">Добавить дочерний</key>
|
||||
|
||||
|
||||
<key alias="editDataType">Изменить тип данных</key>
|
||||
|
||||
|
||||
<key alias="navigateSections">Навигация по разделам</key>
|
||||
|
||||
|
||||
<key alias="shortcut">Ярлыки</key>
|
||||
<key alias="showShortcuts">показать ярлыки</key>
|
||||
|
||||
|
||||
<key alias="toggleListView">В формате списка</key>
|
||||
<key alias="toggleAllowAsRoot">Разрешить в качестве корневого</key>
|
||||
</area>
|
||||
@@ -1108,7 +1109,7 @@
|
||||
http://%3%.
|
||||
|
||||
Удачи!
|
||||
|
||||
|
||||
Генератор уведомлений Umbraco.
|
||||
]]></key>
|
||||
<key alias="mailSubject">[%0%] Задание по переводу %1%</key>
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
<%@ Page language="c#" AutoEventWireup="True" %>
|
||||
I'm alive!
|
||||
@@ -28,6 +28,12 @@ namespace Umbraco.Web.Cache
|
||||
get { return "Domain cache refresher"; }
|
||||
}
|
||||
|
||||
public override void RefreshAll()
|
||||
{
|
||||
ClearCache();
|
||||
base.RefreshAll();
|
||||
}
|
||||
|
||||
public override void Refresh(int id)
|
||||
{
|
||||
ClearCache();
|
||||
|
||||
@@ -571,7 +571,7 @@ namespace Umbraco.Web.Editors
|
||||
{
|
||||
tempFiles.Notifications.Add(new Notification(
|
||||
Services.TextService.Localize("speechBubbles/operationFailedHeader"),
|
||||
"Cannot upload file " + file.Headers.ContentDisposition.FileName + ", it is not an approved file type",
|
||||
Services.TextService.Localize("media/disallowedFileType"),
|
||||
SpeechBubbleIcon.Warning));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,7 +103,24 @@ namespace Umbraco.Web.Editors
|
||||
else
|
||||
{
|
||||
int totalRecords;
|
||||
var members = _provider.GetAllUsers((pageNumber - 1), pageSize, out totalRecords);
|
||||
|
||||
MembershipUserCollection members;
|
||||
if (filter.IsNullOrWhiteSpace())
|
||||
{
|
||||
members = _provider.GetAllUsers((pageNumber - 1), pageSize, out totalRecords);
|
||||
}
|
||||
else
|
||||
{
|
||||
//we need to search!
|
||||
|
||||
//try by name first
|
||||
members = _provider.FindUsersByName(filter, (pageNumber - 1), pageSize, out totalRecords);
|
||||
if (totalRecords == 0)
|
||||
{
|
||||
//try by email then
|
||||
members = _provider.FindUsersByEmail(filter, (pageNumber - 1), pageSize, out totalRecords);
|
||||
}
|
||||
}
|
||||
if (totalRecords == 0)
|
||||
{
|
||||
return new PagedResult<MemberBasic>(0, 0, 0);
|
||||
|
||||
@@ -173,19 +173,23 @@ namespace Umbraco.Web.Models.Mapping
|
||||
Value = localizedText.UmbracoDictionaryTranslate(display.ContentTypeName),
|
||||
View = PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
|
||||
},
|
||||
new ContentPropertyDisplay
|
||||
new ContentPropertyDisplay
|
||||
{
|
||||
Alias = string.Format("{0}releasedate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
|
||||
Label = localizedText.Localize("content/releaseDate"),
|
||||
Value = display.ReleaseDate.HasValue ? display.ReleaseDate.Value.ToIsoString() : null,
|
||||
View = "datepicker" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
|
||||
},
|
||||
//Not editible for people without publish permission (U4-287)
|
||||
View = display.AllowedActions.Contains('P') ? "datepicker" : PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
|
||||
//TODO: Fix up hard coded datepicker
|
||||
} ,
|
||||
new ContentPropertyDisplay
|
||||
{
|
||||
Alias = string.Format("{0}expiredate", Constants.PropertyEditors.InternalGenericPropertiesPrefix),
|
||||
Label = localizedText.Localize("content/unpublishDate"),
|
||||
Value = display.ExpireDate.HasValue ? display.ExpireDate.Value.ToIsoString() : null,
|
||||
View = "datepicker" //TODO: Hard coding this because the templatepicker doesn't necessarily need to be a resolvable (real) property editor
|
||||
//Not editible for people without publish permission (U4-287)
|
||||
View = display.AllowedActions.Contains('P') ? "datepicker" : PropertyEditorResolver.Current.GetByAlias(Constants.PropertyEditors.NoEditAlias).ValueEditor.View
|
||||
//TODO: Fix up hard coded datepicker
|
||||
},
|
||||
new ContentPropertyDisplay
|
||||
{
|
||||
|
||||
@@ -13,6 +13,13 @@ namespace Umbraco.Web.Mvc
|
||||
{
|
||||
base.OnActionExecuted(filterContext);
|
||||
|
||||
// could happens if exception (but afaik this wouldn't happen in MVC)
|
||||
if (filterContext.HttpContext == null || filterContext.HttpContext.Response == null ||
|
||||
filterContext.HttpContext.Response.Cache == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
|
||||
filterContext.HttpContext.Response.Cache.SetMaxAge(TimeSpan.Zero);
|
||||
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
|
||||
|
||||
@@ -21,20 +21,46 @@ namespace Umbraco.Web.Mvc
|
||||
/// </remarks>
|
||||
internal class EnsurePartialViewMacroViewContextFilterAttribute : ActionFilterAttribute
|
||||
{
|
||||
/// <summary>
|
||||
/// Ensures the custom ViewContext datatoken is set before the RenderController action is invoked,
|
||||
/// this ensures that any calls to GetPropertyValue with regards to RTE or Grid editors can still
|
||||
/// render any PartialViewMacro with a form and maintain ModelState
|
||||
/// </summary>
|
||||
/// <param name="filterContext"></param>
|
||||
public override void OnActionExecuting(ActionExecutingContext filterContext)
|
||||
{
|
||||
//ignore anything that is not IRenderController
|
||||
if ((filterContext.Controller is IRenderController) == false)
|
||||
if ((filterContext.Controller is IRenderController) == false && filterContext.IsChildAction == false)
|
||||
return;
|
||||
|
||||
SetViewContext(filterContext);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Ensures that the custom ViewContext datatoken is set after the RenderController action is invoked,
|
||||
/// this ensures that any custom ModelState that may have been added in the RenderController itself is
|
||||
/// passed onwards in case it is required when rendering a PartialViewMacro with a form
|
||||
/// </summary>
|
||||
/// <param name="filterContext">The filter context.</param>
|
||||
public override void OnResultExecuting(ResultExecutingContext filterContext)
|
||||
{
|
||||
//ignore anything that is not IRenderController
|
||||
if ((filterContext.Controller is IRenderController) == false && filterContext.IsChildAction == false)
|
||||
return;
|
||||
|
||||
SetViewContext(filterContext);
|
||||
}
|
||||
|
||||
private void SetViewContext(ControllerContext controllerContext)
|
||||
{
|
||||
var viewCtx = new ViewContext(
|
||||
filterContext.Controller.ControllerContext,
|
||||
new DummyView(),
|
||||
filterContext.Controller.ViewData, filterContext.Controller.TempData,
|
||||
controllerContext,
|
||||
new DummyView(),
|
||||
controllerContext.Controller.ViewData, controllerContext.Controller.TempData,
|
||||
new StringWriter());
|
||||
|
||||
//set the special data token
|
||||
filterContext.RequestContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext] = viewCtx;
|
||||
controllerContext.RequestContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext] = viewCtx;
|
||||
}
|
||||
|
||||
private class DummyView : IView
|
||||
|
||||
@@ -174,9 +174,15 @@ namespace Umbraco.Web.Mvc
|
||||
|
||||
public IModelBinder GetBinder(Type modelType)
|
||||
{
|
||||
return TypeHelper.IsTypeAssignableFrom<IRenderModel>(modelType) || TypeHelper.IsTypeAssignableFrom<IPublishedContent>(modelType)
|
||||
? this
|
||||
: null;
|
||||
// can bind to RenderModel (exact type match)
|
||||
if (modelType == typeof(RenderModel)) return this;
|
||||
|
||||
// can bind to RenderModel<TContent> (exact generic type match)
|
||||
if (modelType.IsGenericType && modelType.GetGenericTypeDefinition() == typeof(RenderModel<>)) return this;
|
||||
|
||||
// can bind to TContent where TContent : IPublishedContent (any IPublishedContent implementation)
|
||||
if (typeof(IPublishedContent).IsAssignableFrom(modelType)) return this;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,9 +120,13 @@ namespace Umbraco.Web.Mvc
|
||||
base.InitializePage();
|
||||
if (ViewContext.IsChildAction == false)
|
||||
{
|
||||
//always ensure the special data token is set - this is used purely for partial view macros that contain forms
|
||||
// and mostly just when rendered within the RTE
|
||||
ViewContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext] = ViewContext;
|
||||
//this is used purely for partial view macros that contain forms
|
||||
// and mostly just when rendered within the RTE - This should already be set with the
|
||||
// EnsurePartialViewMacroViewContextFilterAttribute
|
||||
if (ViewContext.RouteData.DataTokens.ContainsKey(Constants.DataTokenCurrentViewContext) == false)
|
||||
{
|
||||
ViewContext.RouteData.DataTokens.Add(Constants.DataTokenCurrentViewContext, ViewContext);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using Owin;
|
||||
|
||||
namespace Umbraco.Web
|
||||
{
|
||||
public class OwinMiddlewareConfiguredEventArgs : EventArgs
|
||||
{
|
||||
public OwinMiddlewareConfiguredEventArgs(IAppBuilder appBuilder)
|
||||
{
|
||||
AppBuilder = appBuilder;
|
||||
}
|
||||
|
||||
public IAppBuilder AppBuilder { get; private set; }
|
||||
}
|
||||
}
|
||||
@@ -11,5 +11,15 @@ namespace Umbraco.Web.PropertyEditors
|
||||
[PropertyEditor(Constants.PropertyEditors.RelatedLinksAlias, "Related links", "relatedlinks", ValueType ="JSON", Icon="icon-thumbnail-list", Group="pickers")]
|
||||
public class RelatedLinksPropertyEditor : PropertyEditor
|
||||
{
|
||||
protected override PreValueEditor CreatePreValueEditor()
|
||||
{
|
||||
return new RelatedLinksPreValueEditor();
|
||||
}
|
||||
|
||||
internal class RelatedLinksPreValueEditor : PreValueEditor
|
||||
{
|
||||
[PreValueField("max", "Maximum number of links", "number", Description = "Enter the maximum amount of links to be added, enter 0 for unlimited")]
|
||||
public int Maximum { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace Umbraco.Web.Scheduling
|
||||
// ensure we do not run if not main domain, but do NOT lock it
|
||||
if (_appContext.MainDom.IsMainDom == false)
|
||||
{
|
||||
LogHelper.Debug<ScheduledPublishing>("Does not run if not MainDom.");
|
||||
LogHelper.Debug<KeepAlive>("Does not run if not MainDom.");
|
||||
return false; // do NOT repeat, going down
|
||||
}
|
||||
|
||||
|
||||
@@ -24,10 +24,31 @@ namespace Umbraco.Web.Security.Identity
|
||||
{
|
||||
public static class AppBuilderExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Called at the end of configuring middleware
|
||||
/// </summary>
|
||||
/// <param name="app"></param>
|
||||
/// <remarks>
|
||||
/// This could be used for something else in the future - maybe to inform Umbraco that middleware is done/ready, but for
|
||||
/// now this is used to raise the custom event
|
||||
///
|
||||
/// This is an extension method in case developer entirely replace the UmbracoDefaultOwinStartup class, in which case they will
|
||||
/// need to ensure they call this extension method in their startup class.
|
||||
///
|
||||
/// TODO: Move this method in v8, it doesn't belong in this namespace/extension class
|
||||
/// </remarks>
|
||||
public static void FinalizeMiddlewareConfiguration(this IAppBuilder app)
|
||||
{
|
||||
UmbracoDefaultOwinStartup.OnMiddlewareConfigured(new OwinMiddlewareConfiguredEventArgs(app));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the OWIN logger to use Umbraco's logging system
|
||||
/// </summary>
|
||||
/// <param name="app"></param>
|
||||
/// <remarks>
|
||||
/// TODO: Move this method in v8, it doesn't belong in this namespace/extension class
|
||||
/// </remarks>
|
||||
public static void SetUmbracoLoggerFactory(this IAppBuilder app)
|
||||
{
|
||||
app.SetLoggerFactory(new OwinLoggerFactory());
|
||||
|
||||
@@ -349,6 +349,7 @@
|
||||
<Compile Include="Mvc\ModelBindingException.cs" />
|
||||
<Compile Include="Mvc\RenderIndexActionSelectorAttribute.cs" />
|
||||
<Compile Include="Mvc\ValidateMvcAngularAntiForgeryTokenAttribute.cs" />
|
||||
<Compile Include="OwinMiddlewareConfiguredEventArgs.cs" />
|
||||
<Compile Include="PropertyEditors\DatePreValueEditor.cs" />
|
||||
<Compile Include="PropertyEditors\DecimalPropertyEditor.cs" />
|
||||
<Compile Include="PropertyEditors\ValueConverters\ImageCropDataSetConverter.cs" />
|
||||
@@ -1088,6 +1089,9 @@
|
||||
<Compile Include="umbraco.presentation\umbraco\tree.aspx.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="umbraco.presentation\umbraco\ping.aspx.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="umbraco.presentation\umbraco\create\PartialViewMacrosTasks.cs" />
|
||||
<Compile Include="umbraco.presentation\umbraco\create\PartialViewTasks.cs" />
|
||||
<Compile Include="umbraco.presentation\umbraco\developer\Macros\editMacro.aspx.cs">
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Web;
|
||||
using System;
|
||||
using System.Web;
|
||||
using Microsoft.Owin;
|
||||
using Microsoft.Owin.Extensions;
|
||||
using Microsoft.Owin.Logging;
|
||||
@@ -59,12 +60,24 @@ namespace Umbraco.Web
|
||||
app
|
||||
.UseUmbracoBackOfficeCookieAuthentication(ApplicationContext, PipelineStage.Authenticate)
|
||||
.UseUmbracoBackOfficeExternalCookieAuthentication(ApplicationContext, PipelineStage.Authenticate)
|
||||
.UseUmbracoPreviewAuthentication(ApplicationContext, PipelineStage.Authorize);
|
||||
.UseUmbracoPreviewAuthentication(ApplicationContext, PipelineStage.Authorize)
|
||||
.FinalizeMiddlewareConfiguration();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised when the middelware has been configured
|
||||
/// </summary>
|
||||
public static event EventHandler<OwinMiddlewareConfiguredEventArgs> MiddlewareConfigured;
|
||||
|
||||
protected virtual ApplicationContext ApplicationContext
|
||||
{
|
||||
get { return ApplicationContext.Current; }
|
||||
}
|
||||
|
||||
internal static void OnMiddlewareConfigured(OwinMiddlewareConfiguredEventArgs args)
|
||||
{
|
||||
var handler = MiddlewareConfigured;
|
||||
if (handler != null) handler(null, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using System.Web.Http.Controllers;
|
||||
using System.Web.Http.Filters;
|
||||
using Umbraco.Core;
|
||||
|
||||
namespace Umbraco.Web.WebApi.Filters
|
||||
{
|
||||
@@ -24,6 +15,13 @@ namespace Umbraco.Web.WebApi.Filters
|
||||
|
||||
base.OnActionExecuted(actionExecutedContext);
|
||||
|
||||
// happens if exception
|
||||
if (actionExecutedContext == null || actionExecutedContext.Response == null ||
|
||||
actionExecutedContext.Response.Headers == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//NOTE: Until we upgraded to WebApi 2, this didn't work correctly and we had to revert to using
|
||||
// HttpContext.Current responses. I've changed this back to what it should be now since it works
|
||||
// and now with WebApi2, the HttpContext.Current responses dont! Anyways, all good now.
|
||||
@@ -42,9 +40,6 @@ namespace Umbraco.Web.WebApi.Filters
|
||||
//Mon, 01 Jan 1990 00:00:00 GMT
|
||||
new DateTimeOffset(1990, 1, 1, 0, 0, 0, TimeSpan.Zero);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1589,7 +1589,7 @@ namespace umbraco
|
||||
//Trace out to profiling... doesn't actually profile, just for informational output.
|
||||
if (excludeProfiling == false)
|
||||
{
|
||||
using (ApplicationContext.Current.ProfilingLogger.TraceDuration<macro>(string.Format("{0}", message)))
|
||||
using (ApplicationContext.Current.ProfilingLogger.DebugDuration<macro>(string.Format("{0}", message)))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Web;
|
||||
using System.Web.SessionState;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.HtmlControls;
|
||||
|
||||
namespace umbraco.presentation
|
||||
{
|
||||
|
||||
[Obsolete("This class will be removed in future versions.")]
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
public partial class ping : System.Web.UI.Page
|
||||
{
|
||||
#region Web Form Designer generated code
|
||||
override protected void OnInit(EventArgs e)
|
||||
{
|
||||
//
|
||||
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
|
||||
//
|
||||
InitializeComponent();
|
||||
base.OnInit(e);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,7 @@ namespace umbraco.presentation.webservices
|
||||
return jsonRefresher;
|
||||
}
|
||||
|
||||
private bool NotAutorized(string login, string rawPassword)
|
||||
private bool Authorized(string login, string rawPassword)
|
||||
{
|
||||
//TODO: This technique of passing the raw password in is a legacy idea and isn't really
|
||||
// a very happy way to secure this webservice. To prevent brute force attacks, we need
|
||||
@@ -92,7 +92,7 @@ namespace umbraco.presentation.webservices
|
||||
[WebMethod]
|
||||
public void BulkRefresh(RefreshInstruction[] instructions, string appId, string login, string password)
|
||||
{
|
||||
if (NotAutorized(login, password)) return;
|
||||
if (Authorized(login, password) == false) return;
|
||||
if (SelfMessage(appId)) return; // do not process self-messages
|
||||
|
||||
// only execute distinct instructions - no sense in running the same one more than once
|
||||
@@ -131,29 +131,29 @@ namespace umbraco.presentation.webservices
|
||||
[WebMethod]
|
||||
public void RefreshAll(Guid uniqueIdentifier, string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return;
|
||||
if (Authorized(Login, Password) == false) return;
|
||||
GetRefresher(uniqueIdentifier).RefreshAll();
|
||||
}
|
||||
|
||||
[WebMethod]
|
||||
public void RefreshByGuid(Guid uniqueIdentifier, Guid Id, string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return;
|
||||
if (Authorized(Login, Password) == false) return;
|
||||
GetRefresher(uniqueIdentifier).Refresh(Id);
|
||||
}
|
||||
|
||||
[WebMethod]
|
||||
public void RefreshById(Guid uniqueIdentifier, int Id, string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return;
|
||||
if (Authorized(Login, Password) == false) return;
|
||||
GetRefresher(uniqueIdentifier).Refresh(Id);
|
||||
}
|
||||
|
||||
[WebMethod]
|
||||
public void RefreshByIds(Guid uniqueIdentifier, string jsonIds, string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return;
|
||||
var refresher = GetRefresher(uniqueIdentifier);
|
||||
if (Authorized(Login, Password) == false) return;
|
||||
var refresher = GetRefresher(uniqueIdentifier);
|
||||
foreach (var id in JsonConvert.DeserializeObject<int[]>(jsonIds))
|
||||
refresher.Refresh(id);
|
||||
}
|
||||
@@ -161,21 +161,21 @@ namespace umbraco.presentation.webservices
|
||||
[WebMethod]
|
||||
public void RefreshByJson(Guid uniqueIdentifier, string jsonPayload, string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return;
|
||||
if (Authorized(Login, Password) == false) return;
|
||||
GetJsonRefresher(uniqueIdentifier).Refresh(jsonPayload);
|
||||
}
|
||||
|
||||
[WebMethod]
|
||||
public void RemoveById(Guid uniqueIdentifier, int Id, string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return;
|
||||
if (Authorized(Login, Password) == false) return;
|
||||
GetRefresher(uniqueIdentifier).Remove(Id);
|
||||
}
|
||||
|
||||
[WebMethod]
|
||||
public XmlDocument GetRefreshers(string Login, string Password)
|
||||
{
|
||||
if (NotAutorized(Login, Password)) return null;
|
||||
if (Authorized(Login, Password) == false) return null;
|
||||
|
||||
var xd = new XmlDocument();
|
||||
xd.LoadXml("<cacheRefreshers/>");
|
||||
|
||||
Reference in New Issue
Block a user