diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 4f5402c512..b9f5696553 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -40,9 +40,9 @@ This document gives you a quick overview on how to get started.
Not all changes are wanted, so on occasion we might close a PR without merging it. We will give you feedback why we can't accept your changes and we'll be nice about it, thanking you for spending your valuable time.
-We have [documented what we consider small and large changes](CONTRIBUTION_GUIDELINES.md). Make sure to talk to us before making large changes.
+We have [documented what we consider small and large changes](CONTRIBUTION_GUIDELINES.md). Make sure to talk to us before making large changes, so we can ensure that you don't put all your hard work into something we would not be able to merge.
-Remember, if an issue is in the `Up for grabs` list or you've asked for some feedback before you sent us a PR, your PR will not be closed as unwanted.
+Remember, it is always worth working on an issue from the `Up for grabs` list or even asking for some feedback before you send us a PR. This way, your PR will not be closed as unwanted.
### What can I start with?
@@ -64,32 +64,32 @@ Great question! The short version goes like this:
* **Change** - make your changes, experiment, have fun, explore and learn, and don't be afraid. We welcome all contributions and will [happily give feedback](#questions)
* **Commit** - done? Yay! 🎉 **Important:** create a new branch now and name it after the issue you're fixing, we usually follow the format: `temp-12345`. This means it's a temporary branch for the particular issue you're working on, in this case `12345`. When you have a branch, commit your changes. Don't commit to `v8/dev`, create a new branch first.
* **Push** - great, now you can push the changes up to your fork on GitHub
- * **Create pull request** - exciting! You're ready to show us your changes (or not quite ready, you just need some feedback to progress). GitHub has picked up on the new branch you've pushed and will offer to create a Pull Request. Click that green button and away you go.
+ * **Create pull request** - exciting! You're ready to show us your changes (or not quite ready, you just need some feedback to progress - you can now make use of GitHub's draft pull request status, detailed [here] (https://github.blog/2019-02-14-introducing-draft-pull-requests/)). GitHub has picked up on the new branch you've pushed and will offer to create a Pull Request. Click that green button and away you go.

### Pull requests
The most successful pull requests usually look a like this:
- * Fill in the required template
+ * Fill in the required template, linking your pull request to an issue on the [issue tracker,](https://github.com/umbraco/Umbraco-CMS/issues) if applicable.
* Include screenshots and animated GIFs in your pull request whenever possible.
- * Unit tests, while optional are awesome, thank you!
- * New code is commented with documentation from which [the reference documentation](https://our.umbraco.com/documentation/Reference/) is generated
+ * Unit tests, while optional, are awesome. Thank you!
+ * New code is commented with documentation from which [the reference documentation](https://our.umbraco.com/documentation/Reference/) is generated.
-Again, these are guidelines, not strict requirements.
+Again, these are guidelines, not strict requirements. However, the more information that you give to us, the more we have to work with when considering your contributions. Good documentation of a pull request can really speed up the time it takes to review and merge your work!
## Reviews
-You've sent us your first contribution, congratulations! Now what?
+You've sent us your first contribution - congratulations! Now what?
-The [pull request team](#the-pr-team) can now start reviewing your proposed changes and give you feedback on them. If it's not perfect, we'll either fix up what we need or we can request you to make some additional changes.
+The [pull request team](#the-pr-team) can now start reviewing your proposed changes and give you feedback on them. If it's not perfect, we'll either fix up what we need or we can request that you make some additional changes.
We have [a process in place which you can read all about](REVIEW_PROCESS.md). The very abbreviated version is:
- Your PR will get a reply within 48 hours
- An in-depth reply will be added within at most 2 weeks
- The PR will be either merged or rejected within at most 4 weeks
-- Sometimes it is difficult to meet these timelines and we'll talk to you
+- Sometimes it is difficult to meet these timelines and we'll talk to you if this is the case.
### Styleguides
@@ -99,21 +99,21 @@ That said, the Umbraco development team likes to follow the hints that ReSharper
### The PR team
-The pull request team consists of a member of Umbraco HQ, [Sebastiaan](https://github.com/nul800sebastiaan), who gets assistance from the following community members
+The pull request team consists of one member of Umbraco HQ, [Sebastiaan](https://github.com/nul800sebastiaan), who gets assistance from the following community members who have comitted to volunteering their free time:
- [Anders Bjerner](https://github.com/abjerner)
- [Dave Woestenborghs](https://github.com/dawoe)
- [Emma Burstow](https://github.com/emmaburstow)
- [Poornima Nayar](https://github.com/poornimanayar)
-These wonderful volunteers will provide you with a first reply to your PR, review and test out your changes and might ask more questions. After that they'll let Umbraco HQ know if everything seems okay.
+These wonderful people aim to provide you with a first reply to your PR, review and test out your changes and on occasions, they might ask more questions. If they are happy with your work, they'll let Umbraco HQ know by approving the PR. Hq will have final sign-off and will check the work again before it is merged.
### Questions?
-You can get in touch with [the PR team](#the-pr-team) in multiple ways, we love open conversations and we are a friendly bunch. No question you have is stupid. Any questions you have usually helps out multiple people with the same question. Ask away:
+You can get in touch with [the PR team](#the-pr-team) in multiple ways; we love open conversations and we are a friendly bunch. No question you have is stupid. Any question you have usually helps out multiple people with the same question. Ask away:
-- If there's an existing issue on the issue tracker then that's a good place to leave questions and discuss how to start or move forward
-- Unsure where to start? Did something not work as expected? Try leaving a note in the ["Contributing to Umbraco"](https://our.umbraco.com/forum/contributing-to-umbraco-cms/) forum, the team monitors that one closely
+- If there's an existing issue on the issue tracker then that's a good place to leave questions and discuss how to start or move forward.
+- Unsure where to start? Did something not work as expected? Try leaving a note in the ["Contributing to Umbraco"](https://our.umbraco.com/forum/contributing-to-umbraco-cms/) forum. The team monitors that one closely, so one of us will be on hand and ready to point you in the right direction.
## Working with the code
@@ -125,19 +125,19 @@ In order to build the Umbraco source code locally, first make sure you have the
* Node v10+
* npm v6.4.1+
-The easiest way to get started is to run `build.ps1` which will build both the backoffice (also known as "Belle") and the Umbraco core. You can then easily start debugging from Visual Studio, or if you need to debug Belle you can run `gulp dev` in `src\Umbraco.Web.UI.Client`. See [this page](BUILD.md) for more details.
+The easiest way to get started is to open `src\umbraco.sln` in Visual Studio 2017 (version 15.9.7 or higher, [the community edition is free](https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15) for you to use to contribute to Open Source projects). In Visual Studio, find the Task Runner Explorer (in the View menu under Other Windows) and run the build task under the gulpfile.
-Alternatively, you can open `src\umbraco.sln` in Visual Studio 2017 (version 15.9.7 or higher, [the community edition is free](https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15) for you to use to contribute to Open Source projects). In Visual Studio, find the Task Runner Explorer (in the View menu under Other Windows) and run the build task under the gulpfile.
+Alternatively, you can run `build.ps1` from the Powershell command line, which will build both the backoffice (also known as "Belle") and the Umbraco core. You can then easily start debugging from Visual Studio, or if you need to debug Belle you can run `gulp dev` in `src\Umbraco.Web.UI.Client`. See [this page](BUILD.md) for more details.

-After this build completes, you should be able to hit `F5` in Visual Studio to build and run the project. A IISExpress webserver will start and the Umbraco installer will pop up in your browser, follow the directions there to get a working Umbraco install up and running.
+After this build completes, you should be able to hit `F5` in Visual Studio to build and run the project. A IISExpress webserver will start and the Umbraco installer will pop up in your browser. Follow the directions there to get a working Umbraco install up and running.
### Working with the source code
Some parts of our source code are over 10 years old now. And when we say "old", we mean "mature" of course!
-There's two big areas that you should know about:
+There are two big areas that you should know about:
1. The Umbraco backoffice is a extensible AngularJS app and requires you to run a `gulp dev` command while you're working with it, so changes are copied over to the appropriate directories and you can refresh your browser to view the results of your changes.
You may need to run the following commands to set up gulp properly:
@@ -146,20 +146,24 @@ There's two big areas that you should know about:
npm install
npm run build
```
+ The caching for the back office has been described as 'aggressive' so we often find it's best when making back office changes to disable caching in the browser to help you to see the changes you're making.
+
2. "The rest" is a C# based codebase, which is mostly ASP.NET MVC based. You can make changes, build them in Visual Studio, and hit `F5` to see the result.
-To find the general areas of something you're looking to fix or improve, have a look at the following two parts of the API documentation.
+To find the general areas for something you're looking to fix or improve, have a look at the following two parts of the API documentation.
* [The AngularJS based backoffice files](https://our.umbraco.com/apidocs/ui/#/api) (to be found in `src\Umbraco.Web.UI.Client\src`)
* [The C# application](https://our.umbraco.com/apidocs/csharp/)
### Which branch should I target for my contributions?
-We like to use [Gitflow as much as possible](https://jeffkreeftmeijer.com/git-flow/), don't worry if you are not familiar with it. The most important thing you need to know is that when you fork the Umbraco repository, the default branch is set to something, usually `v8/dev`. Whatever the default is, that's where we'd like you to target your contributions.
+We like to use [Gitflow as much as possible](https://jeffkreeftmeijer.com/git-flow/), but don't worry if you are not familiar with it. The most important thing you need to know is that when you fork the Umbraco repository, the default branch is set to something, usually `v8/dev`. If you are working on v8, this is the branch you should be targetting. For v7 contributions, please target 'v7/dev'.
+
+Please note: we are no longer accepting features for v7 but will continue to merge bug fixes as and when they arise.

-### Making changes after the PR was opened
+### Making changes after the PR is open
If you make the corrections we ask for in the same branch and push them to your fork again, the pull request automatically updates with the additional commit(s) so we can review it again. If all is well, we'll merge the code and your commits are forever part of Umbraco!
@@ -167,9 +171,9 @@ If you make the corrections we ask for in the same branch and push them to your
We recommend you sync with our repository before you submit your pull request. That way, you can fix any potential merge conflicts and make our lives a little bit easier.
-Also, if you've submitted a pull request three weeks ago and want to work on something new, you'll want to get the latest code to build against of course.
+Also, if you submitted a pull request three weeks ago and want to work on something new, you'll want to get the latest code to build against of course.
-To sync your fork with this original one, you'll have to add the upstream url, you only have to do this once:
+To sync your fork with this original one, you'll have to add the upstream url. You only have to do this once:
```
git remote add upstream https://github.com/umbraco/Umbraco-CMS.git
@@ -185,3 +189,7 @@ git rebase upstream/v8/dev
In this command we're syncing with the `v8/dev` branch, but you can of course choose another one if needed.
(More info on how this works: [http://robots.thoughtbot.com/post/5133345960/keeping-a-git-fork-updated](http://robots.thoughtbot.com/post/5133345960/keeping-a-git-fork-updated))
+
+### And finally
+
+We welcome all kinds of contributions to this repository. If you don't feel you'd like to make code changes here, you can visit our [documentation repository](https://github.com/umbraco/UmbracoDocs) and use your experience to contribute to making the docs we have, even better. We also encourage community members to feel free to comment on others' pull requests and issues - the expertise we have is not limited to the PR team and HQ. So, if you see something on the issue tracker or pull requests you feel you can add to, please don't be shy.
diff --git a/build/NuSpecs/tools/ReadmeUpgrade.txt b/build/NuSpecs/tools/ReadmeUpgrade.txt
index 2f52d03776..ba88f808c0 100644
--- a/build/NuSpecs/tools/ReadmeUpgrade.txt
+++ b/build/NuSpecs/tools/ReadmeUpgrade.txt
@@ -26,6 +26,6 @@ The following items will now be automatically included when creating a deploy pa
system: umbraco, config\splashes and global.asax.
Please read the release notes on our.umbraco.com:
-http://our.umbraco.com/contribute/releases
+https://our.umbraco.com/contribute/releases
- Umbraco
diff --git a/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs b/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs
index e447f7f493..9a11b0ef3e 100644
--- a/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs
+++ b/src/Umbraco.Core/Configuration/Grid/IGridEditorConfig.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Core.Configuration.Grid
public interface IGridEditorConfig
{
string Name { get; }
+ string NameTemplate { get; }
string Alias { get; }
string View { get; }
string Render { get; }
diff --git a/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs b/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs
index 5163dda1f6..77ad7df0dc 100644
--- a/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs
+++ b/src/Umbraco.Core/Configuration/UmbracoSettings/ContentElement.cs
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Configuration.UmbracoSettings
{
internal class ContentElement : UmbracoConfigurationElement, IContentSection
{
- private const string DefaultPreviewBadge = @"In Preview Mode - click to end";
+ private const string DefaultPreviewBadge = @"
Preview mode
";
[ConfigurationProperty("imaging")]
internal ContentImagingElement Imaging => (ContentImagingElement) this["imaging"];
diff --git a/src/Umbraco.Core/MainDom.cs b/src/Umbraco.Core/MainDom.cs
index d1012fb669..5da1062275 100644
--- a/src/Umbraco.Core/MainDom.cs
+++ b/src/Umbraco.Core/MainDom.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.Linq;
+using System.Security.Cryptography;
using System.Threading;
using System.Web.Hosting;
using Umbraco.Core.Logging;
@@ -65,7 +65,7 @@ namespace Umbraco.Core
// a new process for the same application path
var appPath = HostingEnvironment.ApplicationPhysicalPath;
- var hash = (appId + ":::" + appPath).ToSHA1();
+ var hash = (appId + ":::" + appPath).GenerateHash();
var lockName = "UMBRACO-" + hash + "-MAINDOM-LCK";
_asyncLock = new AsyncLock(lockName);
diff --git a/src/Umbraco.Core/Models/ContentEditing/ContentApp.cs b/src/Umbraco.Core/Models/ContentEditing/ContentApp.cs
index bf28c28c9e..64e4b41186 100644
--- a/src/Umbraco.Core/Models/ContentEditing/ContentApp.cs
+++ b/src/Umbraco.Core/Models/ContentEditing/ContentApp.cs
@@ -67,6 +67,12 @@ namespace Umbraco.Core.Models.ContentEditing
///
[DataMember(Name = "active")]
public bool Active { get; set; }
+
+ ///
+ /// Gets or sets the content app badge.
+ ///
+ [DataMember(Name = "badge")]
+ public ContentAppBadge Badge { get; set; }
}
}
diff --git a/src/Umbraco.Core/Models/ContentEditing/ContentAppBadge.cs b/src/Umbraco.Core/Models/ContentEditing/ContentAppBadge.cs
new file mode 100644
index 0000000000..ba11fd338d
--- /dev/null
+++ b/src/Umbraco.Core/Models/ContentEditing/ContentAppBadge.cs
@@ -0,0 +1,39 @@
+namespace Umbraco.Core.Models.ContentEditing
+{
+ using System.Runtime.Serialization;
+
+ using Umbraco.Core.Events;
+
+ ///
+ /// Represents a content app badge
+ ///
+ [DataContract(Name = "badge", Namespace = "")]
+ public class ContentAppBadge
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public ContentAppBadge()
+ {
+ this.Type = ContentAppBadgeType.Default;
+ }
+
+ ///
+ /// Gets or sets the number displayed in the badge
+ ///
+ [DataMember(Name = "count")]
+ public int Count { get; set; }
+
+ ///
+ /// Gets or sets the type of badge to display
+ ///
+ ///
+ /// This controls the background color of the badge.
+ /// Warning will display a dark yellow badge
+ /// Alert will display a red badge
+ /// Default will display a turquoise badge
+ ///
+ [DataMember(Name = "type")]
+ public ContentAppBadgeType Type { get; set; }
+ }
+}
diff --git a/src/Umbraco.Core/Models/ContentEditing/ContentAppBadgeType.cs b/src/Umbraco.Core/Models/ContentEditing/ContentAppBadgeType.cs
new file mode 100644
index 0000000000..c3217099b6
--- /dev/null
+++ b/src/Umbraco.Core/Models/ContentEditing/ContentAppBadgeType.cs
@@ -0,0 +1,24 @@
+namespace Umbraco.Core.Models.ContentEditing
+{
+ using System.Runtime.Serialization;
+
+ using Newtonsoft.Json;
+ using Newtonsoft.Json.Converters;
+
+ ///
+ /// Represent the content app badge types
+ ///
+ [DataContract(Name = "contentAppBadgeType")]
+ [JsonConverter(typeof(StringEnumConverter))]
+ public enum ContentAppBadgeType
+ {
+ [EnumMember(Value = "default")]
+ Default = 0,
+
+ [EnumMember(Value = "warning")]
+ Warning = 1,
+
+ [EnumMember(Value = "alert")]
+ Alert = 2
+ }
+}
diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs
index cf7df4fb86..e00ac4ba15 100644
--- a/src/Umbraco.Core/Models/UserExtensions.cs
+++ b/src/Umbraco.Core/Models/UserExtensions.cs
@@ -67,7 +67,7 @@ namespace Umbraco.Core.Models
if (user.Avatar.IsNullOrWhiteSpace())
{
- var gravatarHash = user.Email.ToMd5();
+ var gravatarHash = user.Email.GenerateHash();
var gravatarUrl = "https://www.gravatar.com/avatar/" + gravatarHash + "?d=404";
//try Gravatar
diff --git a/src/Umbraco.Core/ObjectExtensions.cs b/src/Umbraco.Core/ObjectExtensions.cs
index 68bc9c923d..78ad60f763 100644
--- a/src/Umbraco.Core/ObjectExtensions.cs
+++ b/src/Umbraco.Core/ObjectExtensions.cs
@@ -542,7 +542,7 @@ namespace Umbraco.Core
{
return "\"{0}\"".InvariantFormat(obj);
}
- if (obj is int || obj is Int16 || obj is Int64 || obj is float || obj is double || obj is bool || obj is int? || obj is Int16? || obj is Int64? || obj is float? || obj is double? || obj is bool?)
+ if (obj is int || obj is short || obj is long || obj is float || obj is double || obj is bool || obj is int? || obj is float? || obj is double? || obj is bool?)
{
return "{0}".InvariantFormat(obj);
}
@@ -723,7 +723,7 @@ namespace Umbraco.Core
{
return typeConverter;
}
-
+
var converter = TypeDescriptor.GetConverter(target);
if (converter.CanConvertFrom(source))
{
@@ -788,6 +788,6 @@ namespace Umbraco.Core
return BoolConvertCache[type] = false;
}
-
+
}
}
diff --git a/src/Umbraco.Core/Persistence/BulkDataReader.cs b/src/Umbraco.Core/Persistence/BulkDataReader.cs
index 1eaa88ee88..7dbe74922a 100644
--- a/src/Umbraco.Core/Persistence/BulkDataReader.cs
+++ b/src/Umbraco.Core/Persistence/BulkDataReader.cs
@@ -470,7 +470,7 @@ namespace Umbraco.Core.Persistence
break;
case SqlDbType.SmallInt:
- dataType = typeof(Int16);
+ dataType = typeof(short);
dataTypeName = "smallint";
break;
@@ -688,34 +688,34 @@ namespace Umbraco.Core.Persistence
DataColumnCollection columns = _schemaTable.Columns;
- columns.Add(SchemaTableColumn.ColumnName, typeof(System.String));
- columns.Add(SchemaTableColumn.ColumnOrdinal, typeof(System.Int32));
- columns.Add(SchemaTableColumn.ColumnSize, typeof(System.Int32));
- columns.Add(SchemaTableColumn.NumericPrecision, typeof(System.Int16));
- columns.Add(SchemaTableColumn.NumericScale, typeof(System.Int16));
- columns.Add(SchemaTableColumn.IsUnique, typeof(System.Boolean));
- columns.Add(SchemaTableColumn.IsKey, typeof(System.Boolean));
- columns.Add(SchemaTableOptionalColumn.BaseServerName, typeof(System.String));
- columns.Add(SchemaTableOptionalColumn.BaseCatalogName, typeof(System.String));
- columns.Add(SchemaTableColumn.BaseColumnName, typeof(System.String));
- columns.Add(SchemaTableColumn.BaseSchemaName, typeof(System.String));
- columns.Add(SchemaTableColumn.BaseTableName, typeof(System.String));
- columns.Add(SchemaTableColumn.DataType, typeof(System.Type));
- columns.Add(SchemaTableColumn.AllowDBNull, typeof(System.Boolean));
- columns.Add(SchemaTableColumn.ProviderType, typeof(System.Int32));
- columns.Add(SchemaTableColumn.IsAliased, typeof(System.Boolean));
- columns.Add(SchemaTableColumn.IsExpression, typeof(System.Boolean));
- columns.Add(BulkDataReader.IsIdentitySchemaColumn, typeof(System.Boolean));
- columns.Add(SchemaTableOptionalColumn.IsAutoIncrement, typeof(System.Boolean));
- columns.Add(SchemaTableOptionalColumn.IsRowVersion, typeof(System.Boolean));
- columns.Add(SchemaTableOptionalColumn.IsHidden, typeof(System.Boolean));
- columns.Add(SchemaTableColumn.IsLong, typeof(System.Boolean));
- columns.Add(SchemaTableOptionalColumn.IsReadOnly, typeof(System.Boolean));
- columns.Add(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(System.Type));
- columns.Add(BulkDataReader.DataTypeNameSchemaColumn, typeof(System.String));
- columns.Add(BulkDataReader.XmlSchemaCollectionDatabaseSchemaColumn, typeof(System.String));
- columns.Add(BulkDataReader.XmlSchemaCollectionOwningSchemaSchemaColumn, typeof(System.String));
- columns.Add(BulkDataReader.XmlSchemaCollectionNameSchemaColumn, typeof(System.String));
+ columns.Add(SchemaTableColumn.ColumnName, typeof(string));
+ columns.Add(SchemaTableColumn.ColumnOrdinal, typeof(int));
+ columns.Add(SchemaTableColumn.ColumnSize, typeof(int));
+ columns.Add(SchemaTableColumn.NumericPrecision, typeof(short));
+ columns.Add(SchemaTableColumn.NumericScale, typeof(short));
+ columns.Add(SchemaTableColumn.IsUnique, typeof(bool));
+ columns.Add(SchemaTableColumn.IsKey, typeof(bool));
+ columns.Add(SchemaTableOptionalColumn.BaseServerName, typeof(string));
+ columns.Add(SchemaTableOptionalColumn.BaseCatalogName, typeof(string));
+ columns.Add(SchemaTableColumn.BaseColumnName, typeof(string));
+ columns.Add(SchemaTableColumn.BaseSchemaName, typeof(string));
+ columns.Add(SchemaTableColumn.BaseTableName, typeof(string));
+ columns.Add(SchemaTableColumn.DataType, typeof(Type));
+ columns.Add(SchemaTableColumn.AllowDBNull, typeof(bool));
+ columns.Add(SchemaTableColumn.ProviderType, typeof(int));
+ columns.Add(SchemaTableColumn.IsAliased, typeof(bool));
+ columns.Add(SchemaTableColumn.IsExpression, typeof(bool));
+ columns.Add(BulkDataReader.IsIdentitySchemaColumn, typeof(bool));
+ columns.Add(SchemaTableOptionalColumn.IsAutoIncrement, typeof(bool));
+ columns.Add(SchemaTableOptionalColumn.IsRowVersion, typeof(bool));
+ columns.Add(SchemaTableOptionalColumn.IsHidden, typeof(bool));
+ columns.Add(SchemaTableColumn.IsLong, typeof(bool));
+ columns.Add(SchemaTableOptionalColumn.IsReadOnly, typeof(bool));
+ columns.Add(SchemaTableOptionalColumn.ProviderSpecificDataType, typeof(Type));
+ columns.Add(BulkDataReader.DataTypeNameSchemaColumn, typeof(string));
+ columns.Add(BulkDataReader.XmlSchemaCollectionDatabaseSchemaColumn, typeof(string));
+ columns.Add(BulkDataReader.XmlSchemaCollectionOwningSchemaSchemaColumn, typeof(string));
+ columns.Add(BulkDataReader.XmlSchemaCollectionNameSchemaColumn, typeof(string));
}
#endregion
@@ -1090,7 +1090,7 @@ namespace Umbraco.Core.Persistence
///
public decimal GetDecimal(int i)
{
- return (Decimal)GetValue(i);
+ return (decimal)GetValue(i);
}
///
diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs
index baac02b6bf..acf6bb7df2 100644
--- a/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RedirectUrlRepository.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Security.Cryptography;
using NPoco;
using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
@@ -105,7 +106,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID");
CreateDateUtc = redirectUrl.CreateDateUtc,
Url = redirectUrl.Url,
Culture = redirectUrl.Culture,
- UrlHash = redirectUrl.Url.ToSHA1()
+ UrlHash = redirectUrl.Url.GenerateHash()
};
}
@@ -134,7 +135,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID");
public IRedirectUrl Get(string url, Guid contentKey, string culture)
{
- var urlHash = url.ToSHA1();
+ var urlHash = url.GenerateHash();
var sql = GetBaseQuery(false).Where(x => x.Url == url && x.UrlHash == urlHash && x.ContentKey == contentKey && x.Culture == culture);
var dto = Database.Fetch(sql).FirstOrDefault();
return dto == null ? null : Map(dto);
@@ -157,7 +158,7 @@ JOIN umbracoNode ON umbracoRedirectUrl.contentKey=umbracoNode.uniqueID");
public IRedirectUrl GetMostRecentUrl(string url)
{
- var urlHash = url.ToSHA1();
+ var urlHash = url.GenerateHash();
var sql = GetBaseQuery(false)
.Where(x => x.Url == url && x.UrlHash == urlHash)
.OrderByDescending(x => x.CreateDateUtc);
diff --git a/src/Umbraco.Core/PropertyEditors/GridEditor.cs b/src/Umbraco.Core/PropertyEditors/GridEditor.cs
index 986eed9ccc..cc3561fbc2 100644
--- a/src/Umbraco.Core/PropertyEditors/GridEditor.cs
+++ b/src/Umbraco.Core/PropertyEditors/GridEditor.cs
@@ -18,6 +18,9 @@ namespace Umbraco.Core.PropertyEditors
[JsonProperty("name", Required = Required.Always)]
public string Name { get; set; }
+ [JsonProperty("nameTemplate")]
+ public string NameTemplate { get; set; }
+
[JsonProperty("alias", Required = Required.Always)]
public string Alias { get; set; }
diff --git a/src/Umbraco.Core/Services/PropertyValidationService.cs b/src/Umbraco.Core/Services/PropertyValidationService.cs
index b846095bd1..a037a83920 100644
--- a/src/Umbraco.Core/Services/PropertyValidationService.cs
+++ b/src/Umbraco.Core/Services/PropertyValidationService.cs
@@ -131,6 +131,12 @@ namespace Umbraco.Core.Services
private bool IsPropertyValueValid(PropertyType propertyType, object value)
{
var editor = _propertyEditors[propertyType.PropertyEditorAlias];
+ if (editor == null)
+ {
+ // nothing much we can do validation wise if the property editor has been removed.
+ // the property will be displayed as a label, so flagging it as invalid would be pointless.
+ return true;
+ }
var configuration = _dataTypeService.GetDataType(propertyType.DataTypeId).Configuration;
var valueEditor = editor.GetValueEditor(configuration);
return !valueEditor.Validate(value, propertyType.Mandatory, propertyType.ValidationRegExp).Any();
diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs
index 4df1105bf7..9bb61c7f2e 100644
--- a/src/Umbraco.Core/StringExtensions.cs
+++ b/src/Umbraco.Core/StringExtensions.cs
@@ -724,67 +724,56 @@ namespace Umbraco.Core
///
/// Generates a hash of a string based on the FIPS compliance setting.
///
- /// Refers to itself
- /// The hashed string
+ /// The to hash.
+ ///
+ /// The hashed string.
+ ///
public static string GenerateHash(this string str)
{
- return CryptoConfig.AllowOnlyFipsAlgorithms
- ? str.ToSHA1()
- : str.ToMd5();
+ return str.GenerateHash(CryptoConfig.AllowOnlyFipsAlgorithms ? "SHA1" : "MD5");
}
///
- /// Converts the string to MD5
+ /// Generate a hash of a string based on the specified hash algorithm.
///
- /// Refers to itself
- /// The MD5 hashed string
- [Obsolete("Please use the GenerateHash method instead. This may be removed in future versions")]
- internal static string ToMd5(this string stringToConvert)
+ /// The hash algorithm implementation to use.
+ /// The to hash.
+ ///
+ /// The hashed string.
+ ///
+ internal static string GenerateHash(this string str)
+ where T : HashAlgorithm
{
- return stringToConvert.GenerateHash("MD5");
+ return str.GenerateHash(typeof(T).FullName);
}
///
- /// Converts the string to SHA1
+ /// Generate a hash of a string based on the specified .
///
- /// refers to itself
- /// The SHA1 hashed string
- [Obsolete("Please use the GenerateHash method instead. This may be removed in future versions")]
- internal static string ToSHA1(this string stringToConvert)
+ /// The to hash.
+ /// The hash algorithm implementation to use.
+ ///
+ /// The hashed string.
+ ///
+ /// No hashing type found by name .
+ ///
+ internal static string GenerateHash(this string str, string hashType)
{
- return stringToConvert.GenerateHash("SHA1");
- }
-
- /// Generate a hash of a string based on the hashType passed in
- ///
- /// Refers to itself
- /// String with the hash type. See remarks section of the CryptoConfig Class in MSDN docs for a list of possible values.
- /// The hashed string
- private static string GenerateHash(this string str, string hashType)
- {
- //create an instance of the correct hashing provider based on the type passed in
var hasher = HashAlgorithm.Create(hashType);
- if (hasher == null) throw new InvalidOperationException("No hashing type found by name " + hashType);
+ if (hasher == null) throw new InvalidOperationException($"No hashing type found by name {hashType}.");
+
using (hasher)
{
- //convert our string into byte array
var byteArray = Encoding.UTF8.GetBytes(str);
-
- //get the hashed values created by our selected provider
var hashedByteArray = hasher.ComputeHash(byteArray);
- //create a StringBuilder object
- var stringBuilder = new StringBuilder();
-
- //loop to each byte
+ var sb = new StringBuilder();
foreach (var b in hashedByteArray)
{
- //append it to our StringBuilder
- stringBuilder.Append(b.ToString("x2"));
+ sb.Append(b.ToString("x2"));
}
- //return the hashed value
- return stringBuilder.ToString();
+ return sb.ToString();
}
}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 80db137b6c..309dc97b81 100755
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -245,6 +245,8 @@
+
+
diff --git a/src/Umbraco.Core/Xml/DynamicContext.cs b/src/Umbraco.Core/Xml/DynamicContext.cs
index d39c4e133b..e5b90a1622 100644
--- a/src/Umbraco.Core/Xml/DynamicContext.cs
+++ b/src/Umbraco.Core/Xml/DynamicContext.cs
@@ -236,7 +236,7 @@ namespace Umbraco.Core.Xml
_name = name;
_value = value;
- if (value is String)
+ if (value is string)
_type = XPathResultType.String;
else if (value is bool)
_type = XPathResultType.Boolean;
diff --git a/src/Umbraco.Tests/Composing/TypeHelperTests.cs b/src/Umbraco.Tests/Composing/TypeHelperTests.cs
index 756ca4ca15..1f2477bf98 100644
--- a/src/Umbraco.Tests/Composing/TypeHelperTests.cs
+++ b/src/Umbraco.Tests/Composing/TypeHelperTests.cs
@@ -165,7 +165,7 @@ namespace Umbraco.Tests.Composing
Assert.IsTrue(TypeHelper.MatchType(typeof(int?), typeof(Nullable<>)));
- Assert.IsTrue(TypeHelper.MatchType(typeof(Derived), typeof(Object)));
+ Assert.IsTrue(TypeHelper.MatchType(typeof(Derived), typeof(object)));
Assert.IsFalse(TypeHelper.MatchType(typeof(Derived), typeof(List<>)));
Assert.IsFalse(TypeHelper.MatchType(typeof(Derived), typeof(IEnumerable<>)));
Assert.IsTrue(TypeHelper.MatchType(typeof(Derived), typeof(Base)));
diff --git a/src/Umbraco.Tests/Configurations/UmbracoSettings/ContentElementTests.cs b/src/Umbraco.Tests/Configurations/UmbracoSettings/ContentElementTests.cs
index 26e6a1ad8a..0245159c6e 100644
--- a/src/Umbraco.Tests/Configurations/UmbracoSettings/ContentElementTests.cs
+++ b/src/Umbraco.Tests/Configurations/UmbracoSettings/ContentElementTests.cs
@@ -67,7 +67,7 @@ namespace Umbraco.Tests.Configurations.UmbracoSettings
[Test]
public void PreviewBadge()
{
- Assert.AreEqual(SettingsSection.Content.PreviewBadge, @"In Preview Mode - click to end");
+ Assert.AreEqual(SettingsSection.Content.PreviewBadge, @"
Preview mode
");
}
[Test]
public void ResolveUrlsFromTextString()
diff --git a/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config b/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config
index ac022a5489..8cbb799d88 100644
--- a/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config
+++ b/src/Umbraco.Tests/Configurations/UmbracoSettings/umbracoSettings.config
@@ -41,9 +41,7 @@
- In Preview Mode - click to end
- ]]>
+ Preview mode]]>
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-groups-builder.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-groups-builder.html
index 1f4eb44c56..a5ec479dfd 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/umb-groups-builder.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-groups-builder.html
@@ -37,6 +37,8 @@
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js
index 46604227da..df97d67f5d 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js
@@ -17,8 +17,14 @@
$scope.model.disableSubmitButton = !firstSelected;
- //need to set the Save state to true if publish is true
- language.save = language.unpublish;
+ if (language.isMandatory) {
+ angular.forEach($scope.model.languages, function (lang) {
+ if (lang !== language) {
+ lang.unpublish = true;
+ lang.disabled = language.unpublish;
+ }
+ });
+ }
}
function onInit() {
@@ -50,6 +56,7 @@
if (active) {
//ensure that the current one is selected
active.unpublish = true;
+ changeSelection(active);
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html
index d7f33db58b..254187bdd1 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html
@@ -24,16 +24,17 @@
-
+
+ disabled="language.disabled"
+ />
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js
index 536169778c..925ebf0e1f 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js
@@ -2,8 +2,46 @@
"$scope",
"Umbraco.PropertyEditors.NestedContent.Resources",
+ "overlayService",
+ "localizationService",
+ "iconHelper",
+
+ function ($scope, ncResources, overlayService, localizationService, iconHelper) {
+ var selectElementTypeModalTitle = "";
+
+ $scope.elemTypeTabs = [];
+
+
+ init();
+
+
+ function init() {
+ localizationService.localize("content_nestedContentSelectElementTypeModalTitle").then(function (value) {
+ selectElementTypeModalTitle = value;
+ });
+
+ ncResources.getContentTypes().then(function (elemTypes) {
+ $scope.model.elemTypes = elemTypes;
+
+ // convert legacy icons
+ iconHelper.formatContentTypeIcons($scope.model.elemTypes);
+
+ // Count doctype name occurrences
+ var elTypeNameOccurrences= _.countBy(elemTypes, 'name');
+
+ // Populate document type tab dictionary
+ // And append alias to name if multiple doctypes have the same name
+ elemTypes.forEach(function (value) {
+ $scope.elemTypeTabs[value.alias] = value.tabs;
+
+ if (elTypeNameOccurrences[value.name] > 1) {
+ value.name += " (" + value.alias + ")";
+ }
+ });
+ });
+
+ }
- function ($scope, ncResources) {
$scope.add = function () {
$scope.model.value.push({
@@ -57,42 +95,66 @@
}
};
- $scope.docTypeTabs = {};
- ncResources.getContentTypes().then(function (docTypes) {
- $scope.model.docTypes = docTypes;
-
- // Count doctype name occurrences
- var docTypeNameOccurrences = _.countBy(docTypes, 'name');
-
- // Populate document type tab dictionary
- // And append alias to name if multiple doctypes have the same name
- docTypes.forEach(function (value) {
- $scope.docTypeTabs[value.alias] = value.tabs;
-
- value.displayName = value.name;
-
- if (docTypeNameOccurrences[value.name] > 1) {
- value.displayName += " (" + value.alias + ")";
- }
+ $scope.placeholder = function (config) {
+ return _.find($scope.model.elemTypes, function (elType) {
+ return elType.alias === config.ncAlias;
});
- });
+ }
- $scope.selectableDocTypesFor = function (config) {
- // return all doctypes that are:
+ $scope.selectableElemTypesFor = function (config) {
+ // return all elemTypes that are:
// 1. either already selected for this config, or
// 2. not selected in any other config
- return _.filter($scope.model.docTypes, function (docType) {
- return docType.alias === config.ncAlias || !_.find($scope.model.value, function(c) {
- return docType.alias === c.ncAlias;
+ return _.filter($scope.model.elemTypes, function (elType) {
+ return elType.alias === config.ncAlias || !_.find($scope.model.value, function (c) {
+ return elType.alias === c.ncAlias;
});
});
}
+ $scope.canAdd = function () {
+ return !$scope.model.value || _.some($scope.model.elemTypes, function (elType) {
+ return !_.find($scope.model.value, function (c) {
+ return elType.alias === c.ncAlias;
+ });
+ });
+ }
+
+
+ $scope.openElemTypeModal = function ($event, config) {
+
+ //we have to add the alias to the objects (they are stored as ncAlias)
+ var selectedItems = _.each($scope.model.value, function (obj) {
+ obj.alias = obj.ncAlias;
+ return obj;
+ })
+
+ var elemTypeSelectorOverlay = {
+ view: "itempicker",
+ title: selectElementTypeModalTitle,
+ availableItems: $scope.selectableElemTypesFor(config),
+ selectedItems: selectedItems,
+ position: "target",
+ event: $event,
+ submit: function (model) {
+ config.ncAlias = model.selectedItem.alias;
+ overlayService.close();
+ },
+ close: function () {
+ overlayService.close();
+ }
+ };
+
+ overlayService.open(elemTypeSelectorOverlay);
+ }
+
+
if (!$scope.model.value) {
$scope.model.value = [];
$scope.add();
}
+
}
]);
@@ -141,7 +203,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
$scope.hasContentTypes = $scope.model.config.contentTypes.length > 0;
$scope.labels = {};
- localizationService.localizeMany(["grid_addElement", "content_createEmpty"]).then(function(data) {
+ localizationService.localizeMany(["grid_addElement", "content_createEmpty"]).then(function (data) {
$scope.labels.grid_addElement = data[0];
$scope.labels.content_createEmpty = data[1];
});
@@ -179,14 +241,14 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
$scope.overlayMenu.show = false;
$scope.overlayMenu = null;
},
- submit: function(model) {
- if(model && model.selectedItem) {
+ submit: function (model) {
+ if (model && model.selectedItem) {
$scope.addNode(model.selectedItem.alias);
}
$scope.overlayMenu.show = false;
$scope.overlayMenu = null;
},
- close: function() {
+ close: function () {
$scope.overlayMenu.show = false;
$scope.overlayMenu = null;
}
@@ -218,22 +280,22 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
icon: iconHelper.convertFromLegacyIcon(node.icon)
});
});
-
+
$scope.overlayMenu.title = $scope.overlayMenu.pasteItems.length > 0 ? $scope.labels.grid_addElement : $scope.labels.content_createEmpty;
-
- $scope.overlayMenu.clickClearPaste = function($event) {
+
+ $scope.overlayMenu.clickClearPaste = function ($event) {
$event.stopPropagation();
$event.preventDefault();
clipboardService.clearEntriesOfType("elementType", contentTypeAliases);
$scope.overlayMenu.pasteItems = [];// This dialog is not connected via the clipboardService events, so we need to update manually.
};
-
+
if ($scope.overlayMenu.availableItems.length === 1 && $scope.overlayMenu.pasteItems.length === 0) {
// only one scaffold type - no need to display the picker
$scope.addNode($scope.scaffolds[0].contentTypeAlias);
return;
}
-
+
$scope.overlayMenu.show = true;
};
@@ -324,10 +386,10 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
if ($scope.nodes[idx].name !== name) {
$scope.nodes[idx].name = name;
}
-
+
return name;
};
-
+
$scope.getIcon = function (idx) {
var scaffold = $scope.getScaffold($scope.model.value[idx].ncContentTypeAlias);
return scaffold && scaffold.icon ? iconHelper.convertFromLegacyIcon(scaffold.icon) : "icon-folder";
@@ -335,7 +397,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
$scope.sortableOptions = {
axis: "y",
cursor: "move",
- handle:'.umb-nested-content__header-bar',
+ handle: '.umb-nested-content__header-bar',
distance: 10,
opacity: 0.7,
tolerance: "pointer",
@@ -377,15 +439,15 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
return contentType.ncAlias === alias;
});
}
-
+
$scope.showCopy = clipboardService.isSupported();
-
+
$scope.showPaste = false;
-
- $scope.clickCopy = function($event, node) {
-
+
+ $scope.clickCopy = function ($event, node) {
+
syncCurrentNode();
-
+
clipboardService.copy("elementType", node.contentTypeAlias, node);
$event.stopPropagation();
}
@@ -395,27 +457,27 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
if (newNode === undefined) {
return;
}
-
+
// generate a new key.
newNode.key = String.CreateGuid();
-
+
$scope.nodes.push(newNode);
$scope.setDirty();
//updateModel();// done by setting current node...
$scope.currentNode = newNode;
}
-
+
function checkAbilityToPasteContent() {
$scope.showPaste = clipboardService.hasEntriesOfType("elementType", contentTypeAliases);
}
-
+
eventsService.on("clipboardService.storageUpdate", checkAbilityToPasteContent);
-
+
var notSupported = [
- "Umbraco.Tags",
- "Umbraco.UploadField",
- "Umbraco.ImageCropper"
+ "Umbraco.Tags",
+ "Umbraco.UploadField",
+ "Umbraco.ImageCropper"
];
// Initialize
@@ -495,24 +557,24 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
}
$scope.inited = true;
-
+
checkAbilityToPasteContent();
}
}
-
+
function createNode(scaffold, fromNcEntry) {
var node = angular.copy(scaffold);
-
+
node.key = fromNcEntry && fromNcEntry.key ? fromNcEntry.key : String.CreateGuid();
-
+
var variant = node.variants[0];
for (var t = 0; t < variant.tabs.length; t++) {
var tab = variant.tabs[t];
-
+
for (var p = 0; p < tab.properties.length; p++) {
var prop = tab.properties[p];
-
+
prop.propertyAlias = prop.alias;
prop.alias = $scope.model.alias + "___" + prop.alias;
// Force validation to occur server side as this is the
@@ -522,7 +584,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
mandatory: false,
pattern: ""
};
-
+
if (fromNcEntry && fromNcEntry[prop.propertyAlias]) {
prop.value = fromNcEntry[prop.propertyAlias];
}
@@ -533,7 +595,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
return node;
}
-
+
function convertNodeIntoNCEntry(node) {
var obj = {
key: node.key,
@@ -551,16 +613,16 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
}
return obj;
}
-
+
function syncCurrentNode() {
if ($scope.realCurrentNode) {
$scope.$broadcast("ncSyncVal", { key: $scope.realCurrentNode.key });
}
}
-
+
function updateModel() {
syncCurrentNode();
-
+
if ($scope.inited) {
var newValues = [];
for (var i = 0; i < $scope.nodes.length; i++) {
@@ -582,7 +644,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop
$scope.$on("$destroy", function () {
unsubscribe();
});
-
+
}
]);
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html
index 516c23daad..f6bfdecb31 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.doctypepicker.html
@@ -3,7 +3,7 @@
-
+
Element Type
@@ -22,14 +22,22 @@
-
+ {{ph = placeholder(config);""}}
+
+
+
+
+
+ {{ ph.name }}
+
+ Add element type
+
+
+ ng-options="t for t in elemTypeTabs[config.ncAlias]"
+ ng-model="config.ncTabAlias" required>
@@ -49,15 +57,15 @@
-
+
- Group:
+ Group:
Select the group whose properties should be displayed. If left blank, the first group on the element type will be used.
- Template:
- Enter an angular expression to evaluate against each item for its name. Use {{$index}} to display the item index
+ Template:
+ Enter an angular expression to evaluate against each item for its name. Use {{$index}} to display the item index
Add
+
+
diff --git a/src/Umbraco.Web.UI.Client/test/config/app.unit.js b/src/Umbraco.Web.UI.Client/test/config/app.unit.js
index 32b05ab0d4..1f49d237e6 100644
--- a/src/Umbraco.Web.UI.Client/test/config/app.unit.js
+++ b/src/Umbraco.Web.UI.Client/test/config/app.unit.js
@@ -13,7 +13,7 @@ var app = angular.module('umbraco', [
'ngSanitize',
//'ngMessages',
- 'tmh.dynamicLocale',
+ 'tmh.dynamicLocale'
//'ngFileUpload',
//'LocalStorageModule',
//'chart.js'
diff --git a/src/Umbraco.Web.UI.Client/test/config/karma.conf.js b/src/Umbraco.Web.UI.Client/test/config/karma.conf.js
index 39c4844466..37058d433b 100644
--- a/src/Umbraco.Web.UI.Client/test/config/karma.conf.js
+++ b/src/Umbraco.Web.UI.Client/test/config/karma.conf.js
@@ -51,9 +51,23 @@ module.exports = function (config) {
exclude: [],
// use dolts reporter, as travis terminal does not support escaping sequences
- // possible values: 'dots', 'progress', 'junit', 'teamcity'
+ // possible values: 'dots', 'progress', 'junit', 'spec'
+ // ***
+ // progress: Outputs a simple list like: "Executed 128 of 144 SUCCESS (0 secs / 0.814 secs)"
+ // spec: Outputs a more verbose report which is more useful for debugging if one of the tests fails.
+ // ***
// CLI --reporters progress
- reporters: ['progress', 'junit'],
+
+ reporters: ['spec', 'junit'],
+ specReporter: {
+ maxLogLines: 5, // limit number of lines logged per test
+ suppressErrorSummary: true, // do not print error summary
+ suppressFailed: false, // do not print information about failed tests
+ suppressPassed: false, // do not print information about passed tests
+ suppressSkipped: true, // do not print information about skipped tests
+ showSpecTiming: false // print the time elapsed for each spec
+ },
+
// web server port
// CLI --port 9876
@@ -102,7 +116,9 @@ module.exports = function (config) {
plugins: [
require('karma-jasmine'),
require('karma-phantomjs-launcher'),
- require('karma-junit-reporter')
+ require('karma-junit-reporter'),
+ require('karma-spec-reporter')
+
],
// the default configuration
diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/dropdown-controller.spec.js b/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/dropdown-controller.spec.js
index dba3373ec2..a82a926a6d 100644
--- a/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/dropdown-controller.spec.js
+++ b/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/dropdown-controller.spec.js
@@ -37,7 +37,7 @@ describe('Drop down controller tests', function () {
$routeParams: routeParams
});
- //this should be the expected format based on the changes made to the sortable prevalues
+ // this should be the expected format based on the changes made to the sortable prevalues
expect(scope.model.config.items[0].value).toBe("value0");
expect(scope.model.config.items[1].value).toBe("value1");
expect(scope.model.config.items[2].value).toBe("value2");
diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/filters/truncate-filters.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/filters/truncate-filters.spec.js
new file mode 100644
index 0000000000..1e9ea2ea46
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/test/unit/common/filters/truncate-filters.spec.js
@@ -0,0 +1,69 @@
+(function () {
+
+ describe('truncate filter', function() {
+ var $truncate;
+
+ var testCases = [
+ {input:'test', noOfChars:5, appendDots:true, expectedResult: 'test'},
+ {input:'test ', noOfChars:4, appendDots:true, expectedResult: 'test…'},
+ {input:'test a long text with space', noOfChars:5, appendDots:true, expectedResult: 'test …'},
+ {input:'scenarios is a long word', noOfChars:5, appendDots:true, expectedResult: 'scena…'},
+ {input:'scenarios is a long word', noOfChars:10, appendDots:true, expectedResult: 'scenarios …'},
+ {input:'test', noOfChars:5, appendDots:false, expectedResult: 'test'},
+ {input:'test a long text with space', noOfChars:5, appendDots:false, expectedResult: 'test '},
+ {input:'scenarios is a long word', noOfChars:5, appendDots:false, expectedResult: 'scena'},
+ {input:'scenarios is a long word', noOfChars:10, appendDots:false, expectedResult: 'scenarios '}
+ ];
+
+ var testCasesNew = [
+ {value:'test', wordwise:false, max:20, tail:'...', expectedResult: 'test'},
+ {value:'LoremIpsumLoremIpsumLoremIpsum',wordwise:false, max:20, tail:null, expectedResult: 'LoremIpsumLoremIpsum…'}
+ ];
+
+ beforeEach(module('umbraco'));
+
+ beforeEach(inject(function($filter) {
+ $truncate = $filter('truncate');
+ }));
+
+ it('empty string as input is expected to give an empty string', function() {
+ expect($truncate('', 5, true)).toBe('');
+ });
+
+ it('null as input is expected to give an empty string', function() {
+ expect($truncate(null, 5, true)).toBe('');
+ });
+
+ it('undefined as input is expected to give an empty string', function() {
+ expect($truncate(undefined, 5, true)).toBe('');
+ });
+
+ it('null as noOfChars to result in \'test\'', function() {
+ expect($truncate('test', null, true)).toBe('test');
+ });
+
+ it('undefined as noOfChars to result in \'test\'', function() {
+ expect($truncate('test', undefined, true)).toBe('test');
+ });
+
+ it('null as appendDots to behave as false', function() {
+ expect($truncate('test', 5, null)).toBe('test');
+ });
+
+ testCases.forEach(function(test){
+
+ it('Expects \'' + test.input + '\' to be truncated as \''+ test.expectedResult + '\', when noOfChars=' + test.noOfChars + ', and appendDots=' + test.appendDots, function() {
+ console.log($truncate(test.input, test.noOfChars, test.appendDots));
+ expect($truncate(test.input, test.noOfChars, test.appendDots)).toBe(test.expectedResult);
+ });
+ });
+
+ testCasesNew.forEach(function(test){
+ it('Expects \'' + test.value + '\' to be truncated as \''+ test.expectedResult + '\', when wordwise=' + test.wordwise + ', and max=' + test.max + ', and tail=' + test.tail, function() {
+ expect($truncate(test.value, test.wordwise, test.max, test.tail)).toBe(test.expectedResult);
+ });
+ });
+
+ });
+
+}());
diff --git a/src/Umbraco.Web.UI.Docs/gulpfile.js b/src/Umbraco.Web.UI.Docs/gulpfile.js
index ade7aa64c4..789e2b7845 100644
--- a/src/Umbraco.Web.UI.Docs/gulpfile.js
+++ b/src/Umbraco.Web.UI.Docs/gulpfile.js
@@ -53,4 +53,4 @@ gulp.task('open:docs', function (cb) {
gulp.src(__filename)
.pipe(open(options));
cb();
-});
+});
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
index ceec3ee927..5fcdacbdcb 100644
--- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
+++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
@@ -348,6 +348,9 @@
8300/http://localhost:8300/
+ 8210
+ /
+ http://localhost:8210/FalseFalse
@@ -429,4 +432,4 @@
-
\ No newline at end of file
+
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
index 5afff06ae1..62344195fd 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
@@ -408,6 +408,7 @@
KlipRediger ordbogsnøgleRediger sprog
+ Rediger det valgte medieIndsæt lokalt linkIndsæt tegnIndsæt grafisk overskrift
@@ -447,7 +448,7 @@
Link til sideÅben linket i et nyt vindue eller faneLink til medie
- Vælg indhold startnode
+ Vælg startnode for indholdVælg medieVælg medietypeVælg ikon
@@ -456,7 +457,7 @@
Vælg makroVælg indholdVælg indholdstype
- Vælg medie startnode
+ Vælg startnode for mediearkivetVælg medlemVælg medlemsgruppeVælg medlemstype
@@ -643,6 +644,7 @@
FeltFindFørste
+ FokuspunktGenereltGrupperGruppe
@@ -1360,6 +1362,7 @@ Mange hilsner fra Umbraco robotten
Nedarv faner og egenskaber fra en anden dokumenttype. Nye faner vil blive tilføjet den nuværende dokumenttype eller sammenflettet hvis fanenavnene er ens.Indholdstypen bliver brugt i en komposition og kan derfor ikke blive anvendt som kompositionDer er ingen indholdstyper tilgængelige at bruge som komposition
+ Når du fjerner en komposition vil alle associerede indholdsdata blive slettet. Når først dokumenttypen er gemt, er der ingen vej tilbage.Tilgængelige editorsGenbrugEditor indstillinger
@@ -1579,7 +1582,7 @@ Mange hilsner fra Umbraco robotten
Du ændrer i øjeblikket rettigheder for siderne:Vælg sider for at ændre deres rettighederFjern billede
- Standard rettigheder
+ StandardrettighederGranulære rettighederSæt rettigheder for specifikke noderProfil
@@ -1718,6 +1721,7 @@ Mange hilsner fra Umbraco robotten
Åben/Luk dine profil indstillingerAktivt sprogSkift sprog til
+ Opret ny mappeReferencer
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/de.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/de.xml
index 03b333e6f2..74f987a4cb 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/de.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/de.xml
@@ -1589,7 +1589,7 @@
Neues ElementLayout auswählenNeue Zeile
- Neuer Inhalt
+ Inhalt hinzufügenInhalt entfernenEinstellungen anwendennicht zugelassen]]>
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
index 96d9e2a10b..15be061e72 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
@@ -1,2171 +1,2178 @@
-
-
-
- The Umbraco community
- https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files
-
-
- Culture and Hostnames
- Audit Trail
- Browse Node
- Change Document Type
- Copy
- Create
- Export
- Create Package
- Create group
- Delete
- Disable
- Empty recycle bin
- Enable
- Export Document Type
- Import Document Type
- Import Package
- Edit in Canvas
- Exit
- Move
- Notifications
- Public access
- Publish
- Unpublish
- Reload
- Republish entire site
- Rename
- Restore
- Set permissions for the page %0%
- Choose where to copy
- Choose where to move
- to in the tree structure below
- was moved to
- was copied to
- was deleted
- Permissions
- Rollback
- Send To Publish
- Send To Translation
- Set group
- Sort
- Translate
- Update
- Set permissions
- Unlock
- Create Content Template
- Resend Invitation
-
-
- Content
- Administration
- Structure
- Other
-
-
- Allow access to assign culture and hostnames
- Allow access to view a node's history log
- Allow access to view a node
- Allow access to change document type for a node
- Allow access to copy a node
- Allow access to create nodes
- Allow access to delete nodes
- Allow access to move a node
- Allow access to set and change public access for a node
- Allow access to publish a node
- Allow access to unpublish a node
- Allow access to change permissions for a node
- Allow access to roll back a node to a previous state
- Allow access to send a node for approval before publishing
- Allow access to send a node for translation
- Allow access to change the sort order for nodes
- Allow access to translate a node
- Allow access to save a node
- Allow access to create a Content Template
-
-
- Content
- Info
-
-
- Permission denied.
- Add new Domain
- remove
- Invalid node.
- One or more domains have an invalid format.
- Domain has already been assigned.
- Language
- Domain
- New domain '%0%' has been created
- Domain '%0%' is deleted
- Domain '%0%' has already been assigned
- Domain '%0%' has been updated
- Edit Current Domains
-
-
- Inherit
- Culture
-
- or inherit culture from parent nodes. Will also apply
- to the current node, unless a domain below applies too.]]>
-
- Domains
-
-
- Clear selection
- Select
- Do something else
- Bold
- Cancel Paragraph Indent
- Insert form field
- Insert graphic headline
- Edit Html
- Indent Paragraph
- Italic
- Center
- Justify Left
- Justify Right
- Insert Link
- Insert local link (anchor)
- Bullet List
- Numeric List
- Insert macro
- Insert picture
- Publish and close
- Publish with descendants
- Edit relations
- Return to list
- Save
- Save and close
- Save and publish
- Save and schedule
- Save and send for approval
- Save list view
- Schedule
- Preview
- Preview is disabled because there's no template assigned
- Choose style
- Show styles
- Insert table
- Save and generate models
- Undo
- Redo
- Delete tag
- Cancel
- Confirm
- More publishing options
-
-
- Viewing for
- Content deleted
- Content unpublished
- Content saved and Published
- Content saved and published for languages: %0%
- Content saved
- Content saved for languages: %0%
- Content moved
- Content copied
- Content rolled back
- Content sent for publishing
- Content sent for publishing for languages: %0%
- Sort child items performed by user
- Copy
- Publish
- Publish
- Move
- Save
- Save
- Delete
- Unpublish
- Rollback
- Send To Publish
- Send To Publish
- Sort
- History (all variants)
-
-
- To change the document type for the selected content, first select from the list of valid types for this location.
- Then confirm and/or amend the mapping of properties from the current type to the new, and click Save.
- The content has been re-published.
- Current Property
- Current type
- The document type cannot be changed, as there are no alternatives valid for this location. An alternative will be valid if it is allowed under the parent of the selected content item and that all existing child content items are allowed to be created under it.
- Document Type Changed
- Map Properties
- Map to Property
- New Template
- New Type
- none
- Content
- Select New Document Type
- The document type of the selected content has been successfully changed to [new type] and the following properties mapped:
- to
- Could not complete property mapping as one or more properties have more than one mapping defined.
- Only alternate types valid for the current location are displayed.
-
-
- Failed to create a folder under parent with ID %0%
- Failed to create a folder under parent with name %0%
- The folder name cannot contain illegal characters.
- Failed to delete item: %0%
-
-
- Is Published
- About this page
- Alias
- (how would you describe the picture over the phone)
- Alternative Links
- Click to edit this item
- Created by
- Original author
- Updated by
- Created
- Date/time this document was created
- Document Type
- Editing
- Remove at
- This item has been changed after publication
- This item is not published
- Last published
- There are no items to show
- There are no items to show in the list.
- No content has been added
- No members have been added
- Media Type
- Link to media item(s)
- Member Group
- Role
- Member Type
- No changes have been made
- No date chosen
- Page title
- This media item has no link
- Properties
- This document is published but is not visible because the parent '%0%' is unpublished
- This culture is published but is not visible because it is unpublished on parent '%0%'
- This document is published but is not in the cache
- Could not get the url
- This document is published but its url would collide with content %0%
- This document is published but its url cannot be routed
- Publish
- Published
- Published (pending changes)
- Publication Status
- Publish with descendants to publish %0% and all content items underneath and thereby making their content publicly available.]]>
- Publish with descendants to publish the selected languages and the same languages of content items underneath and thereby making their content publicly available.]]>
- Publish at
- Unpublish at
- Clear Date
- Set date
- Sortorder is updated
- To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the "shift" or "control" key while selecting
- Statistics
- Title (optional)
- Alternative text (optional)
- Type
- Unpublish
- Unpublished
- Last edited
- Date/time this document was edited
- Remove file(s)
- Link to document
- Member of group(s)
- Not a member of group(s)
- Child items
- Target
- This translates to the following time on the server:
- What does this mean?]]>
- Are you sure you want to delete this item?
- Property %0% uses editor %1% which is not supported by Nested Content.
- No content types are configured for this property.
- Add another text box
- Remove this text box
- Content root
- Include drafts: also publish unpublished content items.
- This value is hidden. If you need access to view this value please contact your website administrator.
- This value is hidden.
- What languages would you like to publish? All languages with content are saved!
- What languages would you like to publish?
- What languages would you like to save?
- All languages with content are saved on creation!
- What languages would you like to send for approval?
- What languages would you like to schedule?
- Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages.
- Published Languages
- Unpublished Languages
- Unmodified Languages
- These languages haven't been created
- Ready to Publish?
- Ready to Save?
- Send for approval
- Select the date and time to publish and/or unpublish the content item.
- Create new
- Paste from clipboard
-
-
- Create a new Content Template from '%0%'
- Blank
- Select a Content Template
- Content Template created
- A Content Template was created from '%0%'
- Another Content Template with the same name already exists
- A Content Template is predefined content that an editor can select to use as the basis for creating new content
-
-
- Click to upload
- or click here to choose files
- You can drag files here to upload
- Cannot upload this file, it does not have an approved file type
- Max file size is
- Media root
- Failed to move media
- Failed to copy media
- Failed to create a folder under parent id %0%
- Failed to rename the folder with id %0%
- Drag and drop your file(s) into the area
-
-
- Create a new member
- All Members
- Member groups have no additional properties for editing.
-
-
- Where do you want to create the new %0%
- Create an item under
- Select the document type you want to make a content template for
- Enter a folder name
- Choose a type and a title
- Document Types within the Settings section, by editing the Allowed child node types under Permissions.]]>
- Document Types within the Settings section.]]>
- The selected page in the content tree doesn't allow for any pages to be created below it.
- Edit permissions for this document type
- Create a new document type
- Document Types within the Settings section, by changing the Allow as root option under Permissions.]]>
- Media Types Types within the Settings section, by editing the Allowed child node types under Permissions.]]>
- The selected media in the tree doesn't allow for any other media to be created below it.
- Edit permissions for this media type
- Document Type without a template
- New folder
- New data type
- New JavaScript file
- New empty partial view
- New partial view macro
- New partial view from snippet
- New partial view macro from snippet
- New partial view macro (without macro)
- New style sheet file
- New Rich Text Editor style sheet file
-
-
- Browse your website
- - Hide
- If Umbraco isn't opening, you might need to allow popups from this site
- has opened in a new window
- Restart
- Visit
- Welcome
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
- Publishing will make the selected items visible on the site.
- Unpublishing will remove the selected items and all their descendants from the site.
- Unpublishing will remove this page and all its descendants from the site.
- You have unsaved changes. Making changes to the Document Type will discard the changes.
-
-
- Done
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Link title
- Link
- Anchor / querystring
- Name
- Manage hostnames
- Close this window
- Are you sure you want to delete
- Are you sure you want to disable
- Are you sure?
- Are you sure?
- Cut
- Edit Dictionary Item
- Edit Language
- Insert local link
- Insert character
- Insert graphic headline
- Insert picture
- Insert link
- Click to add a Macro
- Insert table
- This will delete the language
- Changing the culture for a language may be an expensive operation and will result in the content cache and indexes being rebuilt
- Last Edited
- Link
- Internal link:
- When using local links, insert "#" in front of link
- Open in new window?
- This macro does not contain any properties you can edit
- Paste
- Edit permissions for
- Set permissions for
- Set permissions for %0% for user group %1%
- Select the users groups you want to set permissions for
- The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place
- The recycle bin is now empty
- When items are deleted from the recycle bin, they will be gone forever
- regexlib.com's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]>
- Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url'
- Remove Macro
- Required Field
- Site is reindexed
- The website cache has been refreshed. All publish content is now up to date. While all unpublished content is still unpublished
- The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.
- Number of columns
- Number of rows
- Click on the image to see full size
- Pick item
- View Cache Item
- Relate to original
- Include descendants
- The friendliest community
- Link to page
- Opens the linked document in a new window or tab
- Link to media
- Select content start node
- Select media
- Select media type
- Select icon
- Select item
- Select link
- Select macro
- Select content
- Select content type
- Select media start node
- Select member
- Select member group
- Select member type
- Select node
- Select sections
- Select users
- No icons were found
- There are no parameters for this macro
- There are no macros available to insert
- External login providers
- Exception Details
- Stacktrace
- Inner Exception
- Link your
- Un-link your
- account
- Select editor
- Select snippet
- This will delete the node and all its languages. If you only want to delete one language, you should unpublish the node in that language instead.
-
-
- There are no dictionary items.
-
-
- %0%' below
- ]]>
- Culture Name
-
- Dictionary overview
-
-
- Configured Searchers
- Shows properties and tools for any configured Searcher (i.e. such as a multi-index searcher)
- Field values
- Health status
- The health status of the index and if it can be read
- Indexers
- Index info
- Lists the properties of the index
- Manage Examine's indexes
- Allows you to view the details of each index and provides some tools for managing the indexes
- Rebuild index
-
- Depending on how much content there is in your site this could take a while.
- It is not recommended to rebuild an index during times of high website traffic or when editors are editing content.
- ]]>
-
- Searchers
- Search the index and view the results
- Tools
- Tools to manage the index
- fields
-
-
- Enter your username
- Enter your password
- Confirm your password
- Name the %0%...
- Enter a name...
- Enter an email...
- Enter a username...
- Label...
- Enter a description...
- Type to search...
- Type to filter...
- Type to add tags (press enter after each tag)...
- Enter your email
- Enter a message...
- Your username is usually your email
- #value or ?key=value
- Enter alias...
- Generating alias...
- Create item
- Edit
- Name
-
-
- Create custom list view
- Remove custom list view
- A content type, media type or member type with this alias already exists
-
-
- Renamed
- Enter a new folder name here
- %0% was renamed to %1%
-
-
- Add prevalue
- Database datatype
- Property editor GUID
- Property editor
- Buttons
- Enable advanced settings for
- Enable context menu
- Maximum default size of inserted images
- Related stylesheets
- Show label
- Width and height
- All property types & property data
- using this data type will be deleted permanently, please confirm you want to delete these as well
- Yes, delete
- and all property types & property data using this data type
- Select the folder to move
- to in the tree structure below
- was moved underneath
-
-
- Your data has been saved, but before you can publish this page there are some errors you need to fix first:
- The current membership provider does not support changing password (EnablePasswordRetrieval need to be true)
- %0% already exists
- There were errors:
- There were errors:
- The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s)
- %0% must be an integer
- The %0% field in the %1% tab is mandatory
- %0% is a mandatory field
- %0% at %1% is not in a correct format
- %0% is not in a correct format
-
-
- Received an error from the server
- The specified file type has been disallowed by the administrator
- NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.
- Please fill both alias and name on the new property type!
- There is a problem with read/write access to a specific file or folder
- Error loading Partial View script (file: %0%)
- Please enter a title
- Please choose a type
- You're about to make the picture larger than the original size. Are you sure that you want to proceed?
- Startnode deleted, please contact your administrator
- Please mark content before changing style
- No active styles available
- Please place cursor at the left of the two cells you wish to merge
- You cannot split a cell that hasn't been merged.
- This property is invalid
-
-
- About
- Action
- Actions
- Add
- Alias
- All
- Are you sure?
- Back
- Back to overview
- Border
- by
- Cancel
- Cell margin
- Choose
- Close
- Close Window
- Comment
- Confirm
- Constrain
- Constrain proportions
- Content
- Continue
- Copy
- Create
- Database
- Date
- Default
- Delete
- Deleted
- Deleting...
- Design
- Dictionary
- Dimensions
- Down
- Download
- Edit
- Edited
- Elements
- Email
- Error
- Field
- Find
- First
- General
- Groups
- Group
- Height
- Help
- Hide
- History
- Icon
- Id
- Import
- Include subfolders in search
- Info
- Inner margin
- Insert
- Install
- Invalid
- Justify
- Label
- Language
- Last
- Layout
- Links
- Loading
- Locked
- Login
- Log off
- Logout
- Macro
- Mandatory
- Message
- Move
- Name
- New
- Next
- No
- of
- Off
- OK
- Open
- Options
- On
- or
- Order by
- Password
- Path
- One moment please...
- Previous
- Properties
- Rebuild
- Email to receive form data
- Recycle Bin
- Your recycle bin is empty
- Reload
- Remaining
- Remove
- Rename
- Renew
- Required
- Retrieve
- Retry
- Permissions
- Scheduled Publishing
- Search
- Sorry, we can not find what you are looking for.
- No items have been added
- Server
- Settings
- Show
- Show page on Send
- Size
- Sort
- Status
- Submit
- Type
- Type to search...
- under
- Up
- Update
- Upgrade
- Upload
- Url
- User
- Username
- Value
- View
- Welcome...
- Width
- Yes
- Folder
- Search results
- Reorder
- I am done reordering
- Preview
- Change password
- to
- List view
- Saving...
- current
- Embed
- selected
-
-
- Blue
-
-
- Add group
- Add property
- Add editor
- Add template
- Add child node
- Add child
- Edit data type
- Navigate sections
- Shortcuts
- show shortcuts
- Toggle list view
- Toggle allow as root
- Comment/Uncomment lines
- Remove line
- Copy Lines Up
- Copy Lines Down
- Move Lines Up
- Move Lines Down
- General
- Editor
- Toggle allow culture variants
-
-
- Background colour
- Bold
- Text colour
- Font
- Text
-
-
- Page
-
-
- The installer cannot connect to the database.
- Could not save the web.config file. Please modify the connection string manually.
- Your database has been found and is identified as
- Database configuration
-
- install button to install the Umbraco %0% database
- ]]>
-
- Next to proceed.]]>
- Database not found! Please check that the information in the "connection string" of the "web.config" file is correct.
-
To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.
]]>
-
- Please contact your ISP if necessary.
- If you're installing on a local machine or server you might need information from your system administrator.]]>
-
- Press the upgrade button to upgrade your database to Umbraco %0%
-
- Don't worry - no content will be deleted and everything will continue working afterwards!
-
- ]]>
- Press Next to
- proceed. ]]>
- next to continue the configuration wizard]]>
- The Default users' password needs to be changed!]]>
- The Default user has been disabled or has no access to Umbraco!
No further actions needs to be taken. Click Next to proceed.]]>
- The Default user's password has been successfully changed since the installation!
No further actions needs to be taken. Click Next to proceed.]]>
- The password is changed!
- Get a great start, watch our introduction videos
- By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI.
- Not installed yet.
- Affected files and folders
- More information on setting up permissions for Umbraco here
- You need to grant ASP.NET modify permissions to the following files/folders
- Your permission settings are almost perfect!
- You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
- How to Resolve
- Click here to read the text version
- video tutorial on setting up folder permissions for Umbraco or read the text version.]]>
- Your permission settings might be an issue!
-
- You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
- Your permission settings are not ready for Umbraco!
-
- In order to run Umbraco, you'll need to update your permission settings.]]>
- Your permission settings are perfect!
- You are ready to run Umbraco and install packages!]]>
- Resolving folder issue
- Follow this link for more information on problems with ASP.NET and creating folders
- Setting up folder permissions
-
- I want to start from scratch
- learn how)
- You can still choose to install Runway later on. Please go to the Developer section and choose Packages.
- ]]>
- You've just set up a clean Umbraco platform. What do you want to do next?
- Runway is installed
-
- This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules
- ]]>
- Only recommended for experienced users
- I want to start with a simple website
-
- "Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically,
- but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However,
- Runway offers an easy foundation based on best practices to get you started faster than ever.
- If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.
-
-
- Included with Runway: Home page, Getting Started page, Installing Modules page.
- Optional Modules: Top Navigation, Sitemap, Contact, Gallery.
-
- ]]>
- What is Runway
- Step 1/5 Accept license
- Step 2/5: Database configuration
- Step 3/5: Validating File Permissions
- Step 4/5: Check Umbraco security
- Step 5/5: Umbraco is ready to get you started
- Thank you for choosing Umbraco
- Browse your new site
-You installed Runway, so why not see how your new website looks.]]>
- Further help and information
-Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]>
- Umbraco %0% is installed and ready for use
- /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%'.]]>
- started instantly by clicking the "Launch Umbraco" button below. If you are new to Umbraco,
-you can find plenty of resources on our getting started pages.]]>
- Launch Umbraco
-To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
- Connection to database failed.
- Umbraco Version 3
- Umbraco Version 4
- Watch
- Umbraco %0% for a fresh install or upgrading from version 3.0.
-