diff --git a/build/Build.proj b/build/Build.proj index 30d794fb3f..20c36e18aa 100644 --- a/build/Build.proj +++ b/build/Build.proj @@ -156,8 +156,8 @@ - - + + diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index e90d3fc6ac..cef82a65f3 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -35,7 +35,6 @@ - diff --git a/build/NuSpecs/tools/Dashboard.config.install.xdt b/build/NuSpecs/tools/Dashboard.config.install.xdt index a1960e5797..1f5bbb0164 100644 --- a/build/NuSpecs/tools/Dashboard.config.install.xdt +++ b/build/NuSpecs/tools/Dashboard.config.install.xdt @@ -26,11 +26,15 @@ views/dashboard/developer/developerdashboardvideos.html - + + + +
+ views/dashboard/developer/examinemanagement.html - +
diff --git a/build/NuSpecs/tools/Readme.txt b/build/NuSpecs/tools/Readme.txt index 9964be2311..0668809ea2 100644 --- a/build/NuSpecs/tools/Readme.txt +++ b/build/NuSpecs/tools/Readme.txt @@ -2,24 +2,22 @@ A note about running Umbraco from Visual Studio. Don't forget to build! -BETA Notice: We've done our best to transform your config files, we are testing this in 7.2 beta and would love to -hear back if it didn't work so we can improve this feature. We'd love to see your before and after config files -(make sure to delete sensitive data like passwords and API keys) in the issue tracker at http://issues.umbraco.org/ -Remember, we backed up your files in App_Data\NuGetBackup so you can find the original file before it was transformed. - When upgrading your website using NuGet you should answer "No" to the questions to overwrite the Web.config file (and config files in the config folder). -We've overwritten all the files in the Umbraco and Umbraco_Client folder, these have been backed up in -App_Data\NuGetBackup. We didn't overwrite the UI.xml file nor did we remove any files or folders that you or a package -might have added. Only the existing files were overwritten. If you customized anything then make sure to do a compare -and merge with the NuGetBackup folder. +We've done our best to transform your configuration files but in case something is not quite right: remember we +backed up your files in App_Data\NuGetBackup so you can find the original files before they were transformed. -This nuget package includes build targets that extends the creation of a deploy package, which is generated by +We've overwritten all the files in the Umbraco and Umbraco_Client folder, these have been backed up in +App_Data\NuGetBackup. We didn't overwrite the UI.xml file nor did we remove any files or folders that you or +a package might have added. Only the existing files were overwritten. If you customized anything then make +sure to do a compare and merge with the NuGetBackup folder. + +This NuGet package includes build targets that extend the creation of a deploy package, which is generated by Publishing from Visual Studio. The targets will only work once Publishing is configured, so if you don't use Publish this won't affect you. -These things will now be automatically included when creating a deploy package or publishing to the file system: -umbraco, umbraco_client, config\splashes and global.asax. +The following items will now be automatically included when creating a deploy package or publishing to the file +system: umbraco, umbraco_client, config\splashes and global.asax. Please read the release notes on our.umbraco.org: http://our.umbraco.org/contribute/releases diff --git a/build/UmbracoVersion.txt b/build/UmbracoVersion.txt index 8e76565d2b..450cb62597 100644 --- a/build/UmbracoVersion.txt +++ b/build/UmbracoVersion.txt @@ -1,3 +1,2 @@ # Usage: on line 2 put the release version, on line 3 put the version comment (example: beta) -7.2.0 -RC \ No newline at end of file +7.2.0 \ No newline at end of file diff --git a/src/Umbraco.Core/Configuration/UmbracoVersion.cs b/src/Umbraco.Core/Configuration/UmbracoVersion.cs index 0e3f146c47..1012ce793f 100644 --- a/src/Umbraco.Core/Configuration/UmbracoVersion.cs +++ b/src/Umbraco.Core/Configuration/UmbracoVersion.cs @@ -23,7 +23,7 @@ namespace Umbraco.Core.Configuration /// Gets the version comment (like beta or RC). /// /// The version comment. - public static string CurrentComment { get { return "RC"; } } + public static string CurrentComment { get { return ""; } } // Get the version of the umbraco.dll by looking at a class in that dll // Had to do it like this due to medium trust issues, see: http://haacked.com/archive/2010/11/04/assembly-location-and-medium-trust.aspx diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs index ec763d07fa..f8f19ef8d1 100644 --- a/src/Umbraco.Core/Models/ContentType.cs +++ b/src/Umbraco.Core/Models/ContentType.cs @@ -19,7 +19,7 @@ namespace Umbraco.Core.Models /// /// Constuctor for creating a ContentType with the parent's id. /// - /// You usually only want to use this for creating ContentTypes at the root. + /// Only use this for creating ContentTypes at the root (with ParentId -1). /// public ContentType(int parentId) : base(parentId) { @@ -31,11 +31,22 @@ namespace Umbraco.Core.Models /// /// Use this to ensure inheritance from parent. /// - public ContentType(IContentType parent) : base(parent) + public ContentType(IContentType parent) : this(parent, null) { - _allowedTemplates = new List(); } + /// + /// Constuctor for creating a ContentType with the parent as an inherited type. + /// + /// Use this to ensure inheritance from parent. + /// + /// + public ContentType(IContentType parent, string alias) + : base(parent, alias) + { + _allowedTemplates = new List(); + } + private static readonly PropertyInfo DefaultTemplateSelector = ExpressionHelper.GetPropertyInfo(x => x.DefaultTemplateId); private static readonly PropertyInfo AllowedTemplatesSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedTemplates); diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index 50212f2722..618b5bd3bc 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -48,17 +48,22 @@ namespace Umbraco.Core.Models _additionalData = new Dictionary(); } - protected ContentTypeBase(IContentTypeBase parent) + protected ContentTypeBase(IContentTypeBase parent) : this(parent, null) { - Mandate.ParameterNotNull(parent, "parent"); + } - _parentId = new Lazy(() => parent.Id); - _allowedContentTypes = new List(); - _propertyGroups = new PropertyGroupCollection(); + protected ContentTypeBase(IContentTypeBase parent, string alias) + { + Mandate.ParameterNotNull(parent, "parent"); + + _alias = alias; + _parentId = new Lazy(() => parent.Id); + _allowedContentTypes = new List(); + _propertyGroups = new PropertyGroupCollection(); _propertyTypes = new PropertyTypeCollection(); _propertyTypes.CollectionChanged += PropertyTypesChanged; _additionalData = new Dictionary(); - } + } private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); diff --git a/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs b/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs index cb10b8cca6..ac358481f1 100644 --- a/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeCompositionBase.cs @@ -22,11 +22,16 @@ namespace Umbraco.Core.Models } protected ContentTypeCompositionBase(IContentTypeComposition parent) - : base(parent) + : this(parent, null) { - AddContentType(parent); } + protected ContentTypeCompositionBase(IContentTypeComposition parent, string alias) + : base(parent, alias) + { + AddContentType(parent); + } + private static readonly PropertyInfo ContentTypeCompositionSelector = ExpressionHelper.GetPropertyInfo>( x => x.ContentTypeComposition); @@ -76,7 +81,7 @@ namespace Umbraco.Core.Models if (contentType.ContentTypeComposition.Any(x => x.CompositionAliases().Any(ContentTypeCompositionExists))) return false; - if (Alias.Equals(contentType.Alias)) + if (string.IsNullOrEmpty(Alias) == false && Alias.Equals(contentType.Alias)) return false; if (ContentTypeCompositionExists(contentType.Alias) == false) diff --git a/src/Umbraco.Core/Models/MediaType.cs b/src/Umbraco.Core/Models/MediaType.cs index d8e3c58538..052e231136 100644 --- a/src/Umbraco.Core/Models/MediaType.cs +++ b/src/Umbraco.Core/Models/MediaType.cs @@ -13,7 +13,7 @@ namespace Umbraco.Core.Models /// /// Constuctor for creating a MediaType with the parent's id. /// - /// You usually only want to use this for creating MediaTypes at the root. + /// Only use this for creating MediaTypes at the root (with ParentId -1). /// public MediaType(int parentId) : base(parentId) { @@ -24,10 +24,21 @@ namespace Umbraco.Core.Models /// /// Use this to ensure inheritance from parent. /// - public MediaType(IMediaType parent) : base(parent) + public MediaType(IMediaType parent) : this(parent, null) { } + /// + /// Constuctor for creating a MediaType with the parent as an inherited type. + /// + /// Use this to ensure inheritance from parent. + /// + /// + public MediaType(IMediaType parent, string alias) + : base(parent, alias) + { + } + /// /// Method to call when Entity is being saved /// diff --git a/src/Umbraco.Core/Models/MemberType.cs b/src/Umbraco.Core/Models/MemberType.cs index 6620843ab5..74a879be81 100644 --- a/src/Umbraco.Core/Models/MemberType.cs +++ b/src/Umbraco.Core/Models/MemberType.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Reflection; using System.Runtime.Serialization; @@ -21,7 +20,12 @@ namespace Umbraco.Core.Models MemberTypePropertyTypes = new Dictionary(); } - public MemberType(IContentTypeComposition parent) : base(parent) + public MemberType(IContentTypeComposition parent) : this(parent, null) + { + } + + public MemberType(IContentTypeComposition parent, string alias) + : base(parent, alias) { MemberTypePropertyTypes = new Dictionary(); } diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AlterDataTypePreValueTable.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AlterDataTypePreValueTable.cs index 8343a9dde5..b15f5eba58 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AlterDataTypePreValueTable.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwoZero/AlterDataTypePreValueTable.cs @@ -1,3 +1,5 @@ +using System.Linq; +using AutoMapper; using Umbraco.Core.Configuration; using Umbraco.Core.Persistence.DatabaseAnnotations; using Umbraco.Core.Persistence.SqlSyntax; @@ -11,9 +13,20 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwoZero { public override void Up() { - //To text - var textType = SqlSyntaxContext.SqlSyntaxProvider.GetSpecialDbType(SpecialDbTypes.NTEXT); - Alter.Table("cmsDataTypePreValues").AlterColumn("value").AsCustom(textType).Nullable(); + var columns = SqlSyntaxContext.SqlSyntaxProvider.GetColumnsInSchema(Context.Database).Distinct().ToArray(); + + //Check if it's already text + if (columns.Any(x => x.ColumnName.InvariantEquals("value") && x.TableName.InvariantEquals("cmsDataTypePreValues") + //mysql check + && (x.DataType.InvariantEquals("longtext") == false + //sql server check + && x.DataType.InvariantEquals("ntext") == false))) + { + //To text + var textType = SqlSyntaxContext.SqlSyntaxProvider.GetSpecialDbType(SpecialDbTypes.NTEXT); + Alter.Table("cmsDataTypePreValues").AlterColumn("value").AsCustom(textType).Nullable(); + } + } public override void Down() diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index f685add6f1..aa3a6e824c 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -200,8 +200,22 @@ namespace Umbraco.Core.Services /// Id of the user issueing the save public void Save(IEnumerable dataTypeDefinitions, int userId = 0) { - if (Saving.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinitions), this)) - return; + Save(dataTypeDefinitions, userId, true); + } + + /// + /// Saves a collection of + /// + /// to save + /// Id of the user issueing the save + /// Boolean indicating whether or not to raise events + public void Save(IEnumerable dataTypeDefinitions, int userId, bool raiseEvents) + { + if (raiseEvents) + { + if (Saving.IsRaisedEventCancelled(new SaveEventArgs(dataTypeDefinitions), this)) + return; + } var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateDataTypeDefinitionRepository(uow)) @@ -213,7 +227,8 @@ namespace Umbraco.Core.Services } uow.Commit(); - Saved.RaiseEvent(new SaveEventArgs(dataTypeDefinitions, false), this); + if (raiseEvents) + Saved.RaiseEvent(new SaveEventArgs(dataTypeDefinitions, false), this); } Audit.Add(AuditTypes.Save, string.Format("Save DataTypeDefinition performed by user"), userId, -1); diff --git a/src/Umbraco.Core/Services/IDataTypeService.cs b/src/Umbraco.Core/Services/IDataTypeService.cs index 00873c0f45..a31be9de5c 100644 --- a/src/Umbraco.Core/Services/IDataTypeService.cs +++ b/src/Umbraco.Core/Services/IDataTypeService.cs @@ -52,6 +52,14 @@ namespace Umbraco.Core.Services /// Id of the user issueing the save void Save(IEnumerable dataTypeDefinitions, int userId = 0); + /// + /// Saves a collection of + /// + /// to save + /// Id of the user issueing the save + /// Boolean indicating whether or not to raise events + void Save(IEnumerable dataTypeDefinitions, int userId, bool raiseEvents); + /// /// Deletes an /// diff --git a/src/Umbraco.Core/Services/PackagingService.cs b/src/Umbraco.Core/Services/PackagingService.cs index 3272592fd8..ebeecb46b5 100644 --- a/src/Umbraco.Core/Services/PackagingService.cs +++ b/src/Umbraco.Core/Services/PackagingService.cs @@ -336,48 +336,56 @@ namespace Umbraco.Core.Services ? (from doc in element.Elements("DocumentType") select doc).ToList() : new List { element }; - //NOTE Here we sort the doctype XElements based on dependencies - //before creating the doc types - this should also allow for a better structure/inheritance support. + //When you are importing a single doc type we have to assume that the depedencies are already there. + //Otherwise something like uSync won't work. var fields = new List>(); - foreach (var documentType in unsortedDocumentTypes) + var isSingleDocTypeImport = unsortedDocumentTypes.Count == 1; + if (isSingleDocTypeImport == false) { - var elementCopy = documentType; - var infoElement = elementCopy.Element("Info"); - var dependencies = new List(); - - //Add the Master as a dependency - if (elementCopy.Element("Master") != null && - string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false) + //NOTE Here we sort the doctype XElements based on dependencies + //before creating the doc types - this should also allow for a better structure/inheritance support. + foreach (var documentType in unsortedDocumentTypes) { - dependencies.Add(elementCopy.Element("Master").Value); - } + var elementCopy = documentType; + var infoElement = elementCopy.Element("Info"); + var dependencies = new List(); - //Add compositions as dependencies - var compositionsElement = infoElement.Element("Compositions"); - if (compositionsElement != null && compositionsElement.HasElements) - { - var compositions = compositionsElement.Elements("Composition"); - if (compositions.Any()) + //Add the Master as a dependency + if (elementCopy.Element("Master") != null && + string.IsNullOrEmpty(elementCopy.Element("Master").Value) == false) { - foreach (var composition in compositions) + dependencies.Add(elementCopy.Element("Master").Value); + } + + //Add compositions as dependencies + var compositionsElement = infoElement.Element("Compositions"); + if (compositionsElement != null && compositionsElement.HasElements) + { + var compositions = compositionsElement.Elements("Composition"); + if (compositions.Any()) { - dependencies.Add(composition.Value); + foreach (var composition in compositions) + { + dependencies.Add(composition.Value); + } } } - } - - var field = new TopologicalSorter.DependencyField - { - Alias = infoElement.Element("Alias").Value, - Item = new Lazy(() => elementCopy), - DependsOn = dependencies.ToArray() - }; - fields.Add(field); + var field = new TopologicalSorter.DependencyField + { + Alias = infoElement.Element("Alias").Value, + Item = new Lazy(() => elementCopy), + DependsOn = dependencies.ToArray() + }; + + fields.Add(field); + } } - //Sorting the Document Types based on dependencies - var documentTypes = TopologicalSorter.GetSortedItems(fields).ToList(); + //Sorting the Document Types based on dependencies - if its not a single doc type import ref. #U4-5921 + var documentTypes = isSingleDocTypeImport + ? unsortedDocumentTypes.ToList() + : TopologicalSorter.GetSortedItems(fields).ToList(); //Iterate the sorted document types and create them as IContentType objects foreach (var documentType in documentTypes) @@ -438,15 +446,10 @@ namespace Umbraco.Core.Services : _contentTypeService.GetContentType(masterAlias); } + var alias = infoElement.Element("Alias").Value; var contentType = parent == null - ? new ContentType(-1) - { - Alias = infoElement.Element("Alias").Value - } - : new ContentType(parent) - { - Alias = infoElement.Element("Alias").Value - }; + ? new ContentType(-1) { Alias = alias } + : new ContentType(parent, alias); if (parent != null) contentType.AddContentType(parent); @@ -843,9 +846,15 @@ namespace Umbraco.Core.Services var list = dataTypes.Select(x => x.Value).ToList(); if (list.Any()) { - _dataTypeService.Save(list, userId); + //NOTE: As long as we have to deal with the two types of PreValue lists (with/without Keys) + //this is a bit of a pain to handle while ensuring that the imported DataTypes has PreValues + //place when triggering the save event. - SavePrevaluesFromXml(list, dataTypeElements); + _dataTypeService.Save(list, userId, false);//Save without raising events + + SavePrevaluesFromXml(list, dataTypeElements);//Save the PreValues for the current list of DataTypes + + _dataTypeService.Save(list, userId, true);//Re-save and raise events } if (raiseEvents) diff --git a/src/Umbraco.Tests/Services/Importing/Fanoe-Package.xml b/src/Umbraco.Tests/Services/Importing/Fanoe-Package.xml new file mode 100644 index 0000000000..5f6371bba1 --- /dev/null +++ b/src/Umbraco.Tests/Services/Importing/Fanoe-Package.xml @@ -0,0 +1,5001 @@ + + + + + bootstrap.min.js + /js + bootstrap.min.js + + + jquery.min.js + /js + jquery.min.js + + + top-image.jpg + /Media/1001 + top-image.jpg + + + top-image_big-thumb.jpg + /Media/1001 + top-image_big-thumb.jpg + + + top-image_thumb.jpg + /Media/1001 + top-image_thumb.jpg + + + 128.jpg + /Media/1002 + 128.jpg + + + 128_thumb.jpg + /Media/1002 + 128_thumb.jpg + + + mid-image.jpg + /Media/1003 + mid-image.jpg + + + mid-image_thumb.jpg + /Media/1003 + mid-image_thumb.jpg + + + milkbath.jpg + /Media/1004 + milkbath.jpg + + + milkbath_thumb.jpg + /Media/1004 + milkbath_thumb.jpg + + + 54619133.jpg + /Media/1005 + 54619133.jpg + + + 54619133_thumb.jpg + /Media/1005 + 54619133_thumb.jpg + + + girls-1000.png + /Media/1006 + girls-1000.png + + + girls-1000_big-thumb.jpg + /Media/1006 + girls-1000_big-thumb.jpg + + + girls-1000_thumb.jpg + /Media/1006 + girls-1000_thumb.jpg + + + boat.jpg + /Media/1007 + boat.jpg + + + boat_big-thumb.jpg + /Media/1007 + boat_big-thumb.jpg + + + boat_thumb.jpg + /Media/1007 + boat_thumb.jpg + + + boat_2.jpg + /Media/1008 + boat_2.jpg + + + boat_2_big-thumb.jpg + /Media/1008 + boat_2_big-thumb.jpg + + + boat_2_thumb.jpg + /Media/1008 + boat_2_thumb.jpg + + + logo.svg + /Media/1009 + logo.svg + + + 591407c7-165f-462c-9546-4b55621da7ce_128.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + 128.jpg + + + b9d7afcb-d025-43fc-88cb-6922d3e7a788_128_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + 128_thumb.jpg + + + 70ec1293-6e21-4a71-bef1-38a0005788ef_54619133.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + 54619133.jpg + + + def11b2b-48ec-4c8e-bca6-6b07117d28b7_54619133_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + 54619133_thumb.jpg + + + 2710e8d0-fc69-4fc2-a5d7-4e78353f6124_boat.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + boat.jpg + + + 61d37ca2-433f-4f0f-ab04-3f297def9e1d_boat_2.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + boat_2.jpg + + + a07ee698-17ff-4daf-9583-80e02ba9bbfe_boat_2_big-thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + boat_2_big-thumb.jpg + + + c17da1af-ae34-42ea-8aaa-ebebcc616607_boat_2_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + boat_2_thumb.jpg + + + 15ec6ab7-ee74-401a-89ae-33ef21428f6b_boat_big-thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + boat_big-thumb.jpg + + + af7ef385-f973-4883-8fcd-6125a2b652fd_boat_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + boat_thumb.jpg + + + ed078f42-d7fd-4c4c-a6b1-c1fff3497403_bootstrap.min.js + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + bootstrap.min.js + + + d16e43db-1b49-4fd6-8e38-072ae77e4ca1_girls-1000.png + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + girls-1000.png + + + 6442ec82-0055-4741-82a1-2c1b4a29ca5f_girls-1000_big-thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + girls-1000_big-thumb.jpg + + + a1641fdd-1aac-4516-bab0-8541e823023e_girls-1000_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + girls-1000_thumb.jpg + + + f3423fde-9765-4b42-8059-34458e2f21cf_jquery.min.js + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + jquery.min.js + + + 9557317e-2194-4b2f-a4a9-4345bea5fa40_logo.svg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + logo.svg + + + a8457e59-4f99-43e8-bac1-12e9ff18696e_mid-image.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + mid-image.jpg + + + 73225caf-fe9c-494e-a8df-14604922eae1_mid-image_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + mid-image_thumb.jpg + + + 2cf84124-8540-4dfd-947e-ef20401638fc_milkbath.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + milkbath.jpg + + + 24ce629e-0748-4524-8d08-077940270f93_milkbath_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + milkbath_thumb.jpg + + + 15554ca1-3cbc-47b5-a40f-29712ce4d4ec_top-image.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + top-image.jpg + + + 7de54e8a-d0eb-4439-a445-0b5067c660e2_top-image_big-thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + top-image_big-thumb.jpg + + + 778cecbc-63a9-4b2f-b443-677fba525a03_top-image_thumb.jpg + /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f + top-image_thumb.jpg + + + Blogpost.cshtml + /Views + Blogpost.cshtml + + + Home.cshtml + /Views + Home.cshtml + + + Master.cshtml + /Views + Master.cshtml + + + TextPage.cshtml + /Views + TextPage.cshtml + + + Web.config + /Views + Web.config + + + InsertUmbracoForm.cshtml + /Views/MacroPartials + InsertUmbracoForm.cshtml + + + RenderUmbracoFormScripts.cshtml + /Views/MacroPartials + RenderUmbracoFormScripts.cshtml + + + mainNavPartial.cshtml + /Views/Partials + mainNavPartial.cshtml + + + yada.cshtml + /Views/Partials + yada.cshtml + + + Form.cshtml + /Views/Partials/Forms + Form.cshtml + + + Script.cshtml + /Views/Partials/Forms + Script.cshtml + + + csv.cshtml + /Views/Partials/Forms/Export + csv.cshtml + + + html.cshtml + /Views/Partials/Forms/Export + html.cshtml + + + FieldType.CheckBox.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.CheckBox.cshtml + + + FieldType.CheckBoxList.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.CheckBoxList.cshtml + + + FieldType.DatePicker.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.DatePicker.cshtml + + + FieldType.DropDownList.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.DropDownList.cshtml + + + FieldType.FileUpload.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.FileUpload.cshtml + + + FieldType.HiddenField.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.HiddenField.cshtml + + + FieldType.PasswordField.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.PasswordField.cshtml + + + FieldType.RadioButtonList.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.RadioButtonList.cshtml + + + Fieldtype.Recaptcha.cshtml + /Views/Partials/Forms/Fieldtypes + Fieldtype.Recaptcha.cshtml + + + FieldType.Text.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.Text.cshtml + + + FieldType.Textarea.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.Textarea.cshtml + + + FieldType.Textfield.cshtml + /Views/Partials/Forms/Fieldtypes + FieldType.Textfield.cshtml + + + d0c3e59e-702b-45f2-a111-b6a24dab4563_blogpost.cshtml + /Views/Partials/Grid + blogpost.cshtml + + + Bootstrap2.cshtml + /Views/Partials/Grid + Bootstrap2.cshtml + + + Bootstrap3.cshtml + /Views/Partials/Grid + Bootstrap3.cshtml + + + Base.cshtml + /Views/Partials/Grid/Editors + Base.cshtml + + + Embed.cshtml + /Views/Partials/Grid/Editors + Embed.cshtml + + + Macro.cshtml + /Views/Partials/Grid/Editors + Macro.cshtml + + + Media.cshtml + /Views/Partials/Grid/Editors + Media.cshtml + + + Rte.cshtml + /Views/Partials/Grid/Editors + Rte.cshtml + + + Textstring.cshtml + /Views/Partials/Grid/Editors + Textstring.cshtml + + + ._embed_videowrapper.cshtml + /App_Plugins/Grid/Editors/Render + ._embed_videowrapper.cshtml + + + embed_videowrapper.cshtml + /App_Plugins/Grid/Editors/Render + embed_videowrapper.cshtml + + + media_round.cshtml + /App_Plugins/Grid/Editors/Render + media_round.cshtml + + + media_text_right.cshtml + /App_Plugins/Grid/Editors/Render + media_text_right.cshtml + + + media_wide.cshtml + /App_Plugins/Grid/Editors/Render + media_wide.cshtml + + + quote_with_description.cshtml + /App_Plugins/Grid/Editors/Render + quote_with_description.cshtml + + + media_with_description.html + /App_Plugins/Grid/Editors/View + media_with_description.html + + + quote_with_description.html + /App_Plugins/Grid/Editors/View + quote_with_description.html + + + installed + /App_Plugins/UmbracoForms + installed + + + package.manifest + /App_Plugins/UmbracoForms + package.manifest + + + UmbracoForms.config + /App_Plugins/UmbracoForms + UmbracoForms.config + + + version + /App_Plugins/UmbracoForms + version + + + defaultform.css + /App_Plugins/UmbracoForms/Assets + defaultform.css + + + jquery-ui-1.8.18.custom.css + /App_Plugins/UmbracoForms/Assets + jquery-ui-1.8.18.custom.css + + + umbracoforms.js + /App_Plugins/UmbracoForms/Assets + umbracoforms.js + + + daterangepicker.css + /App_Plugins/UmbracoForms/Assets/daterangepicker + daterangepicker.css + + + daterangepicker.js + /App_Plugins/UmbracoForms/Assets/daterangepicker + daterangepicker.js + + + moment.min.js + /App_Plugins/UmbracoForms/Assets/moment + moment.min.js + + + pikaday.css + /App_Plugins/UmbracoForms/Assets/pikaday + pikaday.css + + + pikaday.js + /App_Plugins/UmbracoForms/Assets/pikaday + pikaday.js + + + checkbox.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + checkbox.html + + + checkboxlist.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + checkboxlist.html + + + datepicker.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + datepicker.html + + + dropdownlist.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + dropdownlist.html + + + fileupload.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + fileupload.html + + + hiddenfield.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + hiddenfield.html + + + password.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + password.html + + + radiobuttonlist.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + radiobuttonlist.html + + + recaptcha.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + recaptcha.html + + + text.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + text.html + + + textarea.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + textarea.html + + + textfield.html + /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes + textfield.html + + + date.html + /App_Plugins/UmbracoForms/Backoffice/Common/RenderTypes + date.html + + + file.html + /App_Plugins/UmbracoForms/Backoffice/Common/RenderTypes + file.html + + + file.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/RenderTypes/Controllers + file.controller.js + + + 592e910e-fd49-4237-b466-6f4eaabaf0a3_checkbox.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + checkbox.html + + + documentmapper.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + documentmapper.controller.js + + + documentmapper.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + documentmapper.html + + + b3661117-72d3-4d8a-9faa-10833b1641c2_dropdownlist.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + dropdownlist.html + + + fieldmapper.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + fieldmapper.controller.js + + + fieldmapper.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + fieldmapper.html + + + 5222ea6b-3c45-4c6a-a349-2d3998958e53_file.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + file.controller.js + + + 43f7e18f-2c10-4281-a217-418bd085730b_file.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + file.html + + + 43285028-e2d1-4b2b-b609-b317ad28b26a_password.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + password.html + + + pickers.connectionstring.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.connectionstring.controller.js + + + pickers.connectionstring.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.connectionstring.html + + + pickers.contentwithxpath.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.contentwithxpath.controller.js + + + pickers.contentwithxpath.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.contentwithxpath.html + + + pickers.datatype.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.datatype.controller.js + + + pickers.datatype.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.datatype.html + + + pickers.documenttype.controller.js + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.documenttype.controller.js + + + pickers.documenttype.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + pickers.documenttype.html + + + 9914ab3f-255e-44e8-9d52-e60e22d1db6d_textarea.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + textarea.html + + + 56b20f99-e751-4d40-bade-1edf7ff5f983_textfield.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + textfield.html + + + textstring.html + /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes + textstring.html + + + Activity.html + /App_Plugins/UmbracoForms/Backoffice/Dashboards + Activity.html + + + Licensing.html + /App_Plugins/UmbracoForms/Backoffice/Dashboards + Licensing.html + + + YourForms.html + /App_Plugins/UmbracoForms/Backoffice/Dashboards + YourForms.html + + + activity.controller.js + /App_Plugins/UmbracoForms/Backoffice/Dashboards/Controllers + activity.controller.js + + + licensing.controller.js + /App_Plugins/UmbracoForms/Backoffice/Dashboards/Controllers + licensing.controller.js + + + yourforms.controller.js + /App_Plugins/UmbracoForms/Backoffice/Dashboards/Controllers + yourforms.controller.js + + + delete.html + /App_Plugins/UmbracoForms/Backoffice/DataSource + delete.html + + + edit.html + /App_Plugins/UmbracoForms/Backoffice/DataSource + edit.html + + + delete.controller.js + /App_Plugins/UmbracoForms/Backoffice/DataSource/controllers + delete.controller.js + + + edit.controller.js + /App_Plugins/UmbracoForms/Backoffice/DataSource/controllers + edit.controller.js + + + wizard.controller.js + /App_Plugins/UmbracoForms/Backoffice/DataSource/controllers + wizard.controller.js + + + wizard.html + /App_Plugins/UmbracoForms/Backoffice/DataSource/dialogs + wizard.html + + + create.html + /App_Plugins/UmbracoForms/Backoffice/Form + create.html + + + c0d2f039-3acb-47fb-9068-8d2050098db0_delete.html + /App_Plugins/UmbracoForms/Backoffice/Form + delete.html + + + a4fd64d8-aa3a-4753-b9a7-90378fa6b3df_edit.html + /App_Plugins/UmbracoForms/Backoffice/Form + edit.html + + + entries.html + /App_Plugins/UmbracoForms/Backoffice/Form + entries.html + + + workflows.html + /App_Plugins/UmbracoForms/Backoffice/Form + workflows.html + + + create.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + create.controller.js + + + b838c1b8-ef83-435f-9d91-09240d8f70a7_delete.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + delete.controller.js + + + 777a833e-1023-4dfe-9c6a-e8c372ea38a4_edit.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + edit.controller.js + + + entries.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + entries.controller.js + + + entriessettings.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + entriessettings.controller.js + + + fieldsettings.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + fieldsettings.controller.js + + + workflows.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + workflows.controller.js + + + workflows.dialog.controller.js + /App_Plugins/UmbracoForms/Backoffice/Form/controllers + workflows.dialog.controller.js + + + additem.html + /App_Plugins/UmbracoForms/Backoffice/Form/dialogs + additem.html + + + entriesdetail.html + /App_Plugins/UmbracoForms/Backoffice/Form/dialogs + entriesdetail.html + + + entriessettings.html + /App_Plugins/UmbracoForms/Backoffice/Form/dialogs + entriessettings.html + + + fieldsettings.html + /App_Plugins/UmbracoForms/Backoffice/Form/dialogs + fieldsettings.html + + + formsettings.html + /App_Plugins/UmbracoForms/Backoffice/Form/dialogs + formsettings.html + + + workflow.html + /App_Plugins/UmbracoForms/Backoffice/Form/dialogs + workflow.html + + + 753759e0-8867-4d52-a58d-1bac828d76c5_delete.html + /App_Plugins/UmbracoForms/Backoffice/PreValueSource + delete.html + + + a69b3d96-ed63-4bf3-b94e-0e74f351abe0_edit.html + /App_Plugins/UmbracoForms/Backoffice/PreValueSource + edit.html + + + 677731bc-3ecc-43d9-b949-dbb1eedf56d7_delete.controller.js + /App_Plugins/UmbracoForms/Backoffice/PreValueSource/controllers + delete.controller.js + + + 70d127e8-f15b-4afd-935d-a55754d22424_edit.controller.js + /App_Plugins/UmbracoForms/Backoffice/PreValueSource/controllers + edit.controller.js + + + formpicker.controller.js + /App_Plugins/UmbracoForms/Backoffice/PropertyEditors + formpicker.controller.js + + + formpicker.html + /App_Plugins/UmbracoForms/Backoffice/PropertyEditors + formpicker.html + + + umbraco.forms.css + /App_Plugins/UmbracoForms/css + umbraco.forms.css + + + 385baff5-cb75-441a-86e5-5121168a4fac.json + /App_Plugins/UmbracoForms/Data/forms + 385baff5-cb75-441a-86e5-5121168a4fac.json + + + commentform.json + /App_Plugins/UmbracoForms/Data/Templates + commentform.json + + + contactform.json + /App_Plugins/UmbracoForms/Data/Templates + contactform.json + + + 065b5cad-b43d-4390-aecb-166bdc677139.json + /App_Plugins/UmbracoForms/Data/Workflows + 065b5cad-b43d-4390-aecb-166bdc677139.json + + + 706acfaf-6f15-4a20-af43-f7eeb1f2761d.json + /App_Plugins/UmbracoForms/Data/Workflows + 706acfaf-6f15-4a20-af43-f7eeb1f2761d.json + + + 87895f0c-656a-4232-b41e-00fddb4840a0.json + /App_Plugins/UmbracoForms/Data/Workflows + 87895f0c-656a-4232-b41e-00fddb4840a0.json + + + umb-forms-content-picker.html + /App_Plugins/UmbracoForms/Directives + umb-forms-content-picker.html + + + umb-forms-designer.html + /App_Plugins/UmbracoForms/Directives + umb-forms-designer.html + + + umb-forms-prevalue-editor.html + /App_Plugins/UmbracoForms/Directives + umb-forms-prevalue-editor.html + + + umb-forms-regexpicker.html + /App_Plugins/UmbracoForms/Directives + umb-forms-regexpicker.html + + + icomoon.eot + /App_Plugins/UmbracoForms/Fonts + icomoon.eot + + + icomoon.svg + /App_Plugins/UmbracoForms/Fonts + icomoon.svg + + + icomoon.ttf + /App_Plugins/UmbracoForms/Fonts + icomoon.ttf + + + icomoon.woff + /App_Plugins/UmbracoForms/Fonts + icomoon.woff + + + close.png + /App_Plugins/UmbracoForms/Images + close.png + + + recaptcha.png + /App_Plugins/UmbracoForms/Images + recaptcha.png + + + succes-green.png + /App_Plugins/UmbracoForms/Images + succes-green.png + + + umbraco.forms.js + /App_Plugins/UmbracoForms/js + umbraco.forms.js + + + HtmlTable.cshtml + /App_Plugins/UmbracoForms/RazorTemplates + HtmlTable.cshtml + + + umbraco.forms.dashboards.less + /App_Plugins/UmbracoForms/Styles + umbraco.forms.dashboards.less + + + umbraco.forms.entries.less + /App_Plugins/UmbracoForms/Styles + umbraco.forms.entries.less + + + umbraco.forms.fonts.less + /App_Plugins/UmbracoForms/Styles + umbraco.forms.fonts.less + + + umbraco.forms.less + /App_Plugins/UmbracoForms/Styles + umbraco.forms.less + + + umbraco.forms.workflows.less + /App_Plugins/UmbracoForms/Styles + umbraco.forms.workflows.less + + + umbraco.gridview.less + /App_Plugins/UmbracoForms/Styles + umbraco.gridview.less + + + DataTables_json.xslt + /App_Plugins/UmbracoForms/Xslt + DataTables_json.xslt + + + DataTables_json_medtrust.xslt + /App_Plugins/UmbracoForms/Xslt + DataTables_json_medtrust.xslt + + + excel.xslt + /App_Plugins/UmbracoForms/Xslt + excel.xslt + + + Html.xslt + /App_Plugins/UmbracoForms/Xslt + Html.xslt + + + postAsXmlSample.xslt + /App_Plugins/UmbracoForms/Xslt + postAsXmlSample.xslt + + + sendXsltEmailSample.xslt + /App_Plugins/UmbracoForms/Xslt + sendXsltEmailSample.xslt + + + xml.xslt + /App_Plugins/UmbracoForms/Xslt + xml.xslt + + + UmbracoContourListComments.xslt + /App_Plugins/UmbracoForms/Xslt/Templates + UmbracoContourListComments.xslt + + + d337dddb-dd69-4fc1-a10d-7062a562596e_UmbracoContourListComments.xslt + /App_Plugins/UmbracoForms/Xslt/Templates/Schema2 + UmbracoContourListComments.xslt + + + grid.editors.config.js + /Config + grid.editors.config.js + + + + + Fanoe + 1.0.0 + MIT License + http://umbraco.com + + 3 + 0 + 0 + + + + Umbraco HQ + http://umbraco.com + + + + + + + + + + + + + + + #value#" + } + } + } + ] + }, + { + "grid": 12, + "allowAll": false, + "allowed": [ + "banner_tagline" + ], + "controls": [ + { + "value": "You're making great stuff with this thing", + "editor": { + "name": "Banner Tagline", + "alias": "banner_tagline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 25px; line-height: 35px; font-weight: normal; text-align:center", + "markup": "

#value#

" + } + } + } + ] + } + ], + "styles": { + "background-image": "url(/media/1001/top-image.jpg)" + }, + "config": { + "class": "dark" + }, + "id": "2bd04b6a-0561-05c8-aa48-7ee47fde287f" + }, + { + "name": "Article full width", + "areas": [ + { + "grid": 12, + "allowAll": false, + "allowed": [ + "media_text_right", + "headline", + "abstract", + "paragraph", + "quote", + "media", + "code" + ], + "controls": [ + { + "value": "Something", + "editor": { + "name": "Headline", + "alias": "headline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 36px; line-height: 45px; font-weight: bold", + "markup": "

#value#

" + } + } + }, + { + "value": "Sed porttitor lectus nibh. Nulla porttitor accumsan tincidunt. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula. Cras ultricies ligula sed magna dictum porta. Pellentesque in ipsum id orci porta dapibus. Pellentesque in ipsum id orci porta dapibus.", + "editor": { + "name": "Abstract", + "alias": "abstract", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 20px; line-height: 45px; font-weight: light", + "markup": "

#value#

" + } + } + }, + { + "value": "Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula. Sed porttitor lectus nibh. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Pellentesque in ipsum id orci porta dapibus. Vivamus suscipit tortor eget felis porttitor volutpat. Vivamus suscipit tortor eget felis porttitor volutpat. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Curabitur aliquet quam id dui posuere blandit.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + }, + { + "value": "Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula. Sed porttitor lectus nibh. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Pellentesque in ipsum id orci porta dapibus. Vivamus suscipit tortor eget felis porttitor volutpat. Vivamus suscipit tortor eget felis porttitor volutpat. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Curabitur aliquet quam id dui posuere blandit.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + }, + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1072, + "image": "/media/1004/milkbath.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1004%2Fmilkbath.jpg", + "headline": "Creepy dude in milk", + "paragraph": "Curabitur aliquet quam id dui posuere blandit. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Curabitur aliquet quam id dui posuere blandit. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Curabitu" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "light" + }, + "id": "7a2e4652-8523-3ade-053d-f7873c9c8020" + }, + { + "name": "Image wide", + "areas": [ + { + "grid": 12, + "allowAll": false, + "allowed": [ + "media_wide_cropped", + "media_wide" + ], + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1073, + "image": "/media/1005/54619133.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1005%2F54619133.jpg" + }, + "editor": { + "name": "Image wide", + "alias": "media_wide", + "view": "media", + "render": "media_wide", + "icon": "icon-picture" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "full" + }, + "id": "e6c0d256-ccec-5411-ca94-e584cb7f941d" + } + ] + } + ] +}]]> +
+
+ + + #value#" + } + } + } + ] + }, + { + "grid": 12, + "allowAll": false, + "allowed": [ + "banner_tagline" + ], + "controls": [ + { + "value": "ukgfs7 9 yfiugh fi7", + "editor": { + "name": "Banner Tagline", + "alias": "banner_tagline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 25px; line-height: 35px; font-weight: normal; text-align:center", + "markup": "

#value#

" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "blue" + }, + "id": "63d1f52a-a6be-2459-a337-22f97cdb15bb" + }, + { + "name": "Article", + "areas": [ + { + "grid": 3, + "allowAll": false, + "allowed": [ + "media_round", + "paragraph" + ], + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1069, + "image": "/media/1002/128.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1002%2F128.jpg" + }, + "editor": { + "name": "Image rounded", + "alias": "media_round", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_round.cshtml", + "icon": "icon-picture" + } + } + ] + }, + { + "grid": 1, + "allowAll": false, + "allowed": [], + "controls": [] + }, + { + "grid": 8, + "allowAll": false, + "allowed": [ + "headline", + "abstract", + "paragraph" + ], + "controls": [ + { + "value": "gdfsghdfgsfd", + "editor": { + "name": "Headline", + "alias": "headline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 36px; line-height: 45px; font-weight: bold", + "markup": "

#value#

" + } + } + }, + { + "value": "Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Vivamus suscipit tortor eget felis porttitor volutpat. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Donec rutrum congue leo eget malesuada. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Donec sollicitudin molestie malesuada. Nulla quis lorem ut libero malesuada feugiat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula.", + "editor": { + "name": "Abstract", + "alias": "abstract", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 20px; line-height: 45px; font-weight: light", + "markup": "

#value#

" + } + } + }, + { + "value": "Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Vivamus suscipit tortor eget felis porttitor volutpat. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Donec rutrum congue leo eget malesuada. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Donec sollicitudin molestie malesuada. Nulla quis lorem ut libero malesuada feugiat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + }, + { + "value": "Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Vivamus suscipit tortor eget felis porttitor volutpat. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Donec rutrum congue leo eget malesuada. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Donec sollicitudin molestie malesuada. Nulla quis lorem ut libero malesuada feugiat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "dark" + }, + "id": "651b07fa-77eb-9f44-5633-fabbf5e365eb" + }, + { + "name": "Playground", + "areas": [ + { + "grid": 12, + "editors": [ + "headline" + ], + "allowAll": false, + "controls": [ + { + "value": "Donec rutrum congue leo eget malesuada. Sed porttitor lectus nibh. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Pellentesque in ipsum id orci porta dapibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque in ipsum id orci porta dapibus.", + "editor": { + "name": "Quote", + "alias": "quote", + "view": "textstring", + "icon": "icon-quote", + "config": { + "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px", + "markup": "
#value#
" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "yellow" + }, + "id": "c9aabb6d-7787-ef69-f71c-a85c93c2f973" + }, + { + "name": "Image wide", + "areas": [ + { + "grid": 12, + "allowAll": false, + "allowed": [ + "media_wide_cropped", + "media_wide" + ], + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1073, + "image": "/media/1005/54619133.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1005%2F54619133.jpg" + }, + "editor": { + "name": "Image wide", + "alias": "media_wide", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_wide.cshtml", + "icon": "icon-picture" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "full" + }, + "id": "73807b0e-a282-c391-7e40-ccc7eb9a3472" + } + ] + } + ] +}]]> +
+
+ + + #value#" + } + } + } + ] + }, + { + "grid": 6, + "allowAll": false, + "allowed": [ + "abstract", + "media", + "code", + "quote" + ], + "controls": [ + { + "value": "What ever happens this should be the best thing you have ever encountered. We are not even beginning to scratch the surface. The comming months will prove that our path is the righteous one and all who oppose will burn on the bonfires of vanity.", + "editor": { + "name": "Abstract", + "alias": "abstract", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 20px; line-height: 45px; font-weight: light", + "markup": "

#value#

" + } + } + } + ] + }, + { + "grid": 6, + "allowAll": false, + "allowed": [ + "quote", + "code", + "media" + ], + "controls": [] + } + ], + "id": "d8a63df0-4458-5e9d-778b-f30c8ce0c4a4" + } + ] + } + ] +}]]> +
+
+ + + #value#" + } + } + } + ] + } + ], + "id": "a3a2fa03-bdc2-fa37-44bf-4b23406e00a1" + }, + { + "name": "Image wide", + "areas": [ + { + "grid": 12, + "allowAll": false, + "allowed": [ + "media_wide_cropped", + "media_wide" + ], + "config": { + "class": "full" + }, + "styles": {}, + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1073, + "image": "/media/1005/54619133.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1005%2F54619133.jpg" + }, + "editor": { + "name": "Image wide", + "alias": "media_wide", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_wide.cshtml", + "icon": "icon-picture" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "full" + }, + "id": "bc94a446-dd1a-2aa7-b7ed-77b1a4591618" + }, + { + "name": "Article two col", + "areas": [ + { + "grid": 12, + "allowAll": false, + "allowed": [ + "headline", + "quote" + ], + "controls": [ + { + "value": "This is the headline", + "editor": { + "name": "Headline", + "alias": "headline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 36px; line-height: 45px; font-weight: bold", + "markup": "

#value#

" + } + } + } + ] + }, + { + "grid": 6, + "allowAll": false, + "allowed": [ + "abstract", + "media", + "code", + "quote", + "paragraph" + ], + "controls": [ + { + "value": "Proin eget tortor risus. Sed porttitor lectus nibh. Proin eget tortor risus. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Vivamus suscipit tortor eget felis porttitor volutpat. Donec rutrum congue leo eget malesuada. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi.", + "editor": { + "name": "Abstract", + "alias": "abstract", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: bold;", + "markup": "

#value#

" + } + } + }, + { + "value": "Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Donec rutrum congue leo eget malesuada. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Vivamus suscipit tortor eget felis porttitor volutpat. Sed porttitor lectus nibh. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Nulla porttitor accumsan tincidunt. Donec rutrum congue leo eget malesuada.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + } + ] + }, + { + "grid": 6, + "allowAll": false, + "allowed": [ + "quote", + "code", + "media", + "paragraph" + ], + "controls": [ + { + "value": "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula. Nulla porttitor accumsan tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec velit neque, auctor sit amet aliquam vel, ullamcorper sit amet ligula. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Proin eget tortor risus. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Quisque velit nisi, pretium ut lacinia in, elementum id enim.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + }, + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1073, + "image": "/media/1005/54619133.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1005%2F54619133.jpg" + }, + "editor": { + "name": "Image", + "alias": "media", + "view": "media", + "icon": "icon-picture" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "light" + }, + "id": "b6697e42-57de-0052-f592-8a688de00877" + } + ] + } + ] +}]]> +
+
+ + + #value#" + } + } + } + ] + }, + { + "grid": 12, + "allowAll": false, + "allowed": [ + "banner_tagline" + ], + "controls": [ + { + "value": "fdggds adegdgs dg sdsggds dgs dgs sgge egwagerwa gaewgwaearghef", + "editor": { + "name": "Banner Tagline", + "alias": "banner_tagline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 25px; line-height: 35px; font-weight: normal; text-align:center", + "markup": "

#value#

" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "light" + }, + "id": "e051882a-7c75-c14c-747f-9304f0ff329c" + }, + { + "name": "Playground", + "areas": [ + { + "grid": 12, + "editors": [ + "headline" + ], + "allowAll": false, + "controls": [ + { + "value": "Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Vivamus suscipit tortor eget felis porttitor volutpat. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Donec rutrum congue leo eget malesuada.", + "editor": { + "name": "Quote", + "alias": "quote", + "view": "textstring", + "icon": "icon-quote", + "config": { + "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px", + "markup": "
#value#
" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "yellow" + }, + "id": "a8c2e77f-1f2c-4438-69e9-d34ed015e5df" + }, + { + "name": "Playground", + "areas": [ + { + "grid": 12, + "editors": [ + "headline" + ], + "allowAll": false, + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1104, + "image": "/media/1008/boat_2.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1008%2Fboat_2.jpg" + }, + "editor": { + "name": "Image wide", + "alias": "media_wide", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_wide.cshtml", + "icon": "icon-picture" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "full triangle" + }, + "id": "60ae1388-397d-78cf-3f76-e765c1f6f8ba" + }, + { + "name": "Playground", + "areas": [ + { + "grid": 12, + "editors": [ + "headline" + ], + "allowAll": false, + "controls": [ + { + "value": "Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Vivamus suscipit tortor eget felis porttitor volutpat. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Donec rutrum congue leo eget malesuada.", + "editor": { + "name": "Quote", + "alias": "quote", + "view": "textstring", + "icon": "icon-quote", + "config": { + "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px", + "markup": "
#value#
" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "blue" + }, + "id": "14da9201-9f31-1146-21e9-7d1aa64ec86f" + }, + { + "name": "Playground", + "areas": [ + { + "grid": 12, + "editors": [ + "headline" + ], + "allowAll": false, + "controls": [ + { + "value": "", + "editor": { + "name": "Embed", + "alias": "embed", + "view": "embed", + "icon": "icon-movie-alt" + } + } + ] + } + ], + "id": "2f19df8b-4dcc-4ca0-7e51-690ed3866d10" + } + ] + } + ] +}]]> +
+
+ + + #value#" + } + } + }, + { + "value": "This is a standard thingie that works for all conweågdopsjv", + "editor": { + "name": "Banner Tagline", + "alias": "banner_tagline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 25px; line-height: 35px; font-weight: normal; text-align:center", + "markup": "

#value#

" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "light" + }, + "id": "62749619-e9ec-4045-be5e-45898cfdaa40" + }, + { + "name": "Article", + "areas": [ + { + "grid": 3, + "allowAll": false, + "allowed": [ + "media_round", + "paragraph" + ], + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.61691542288557211, + "top": 0.84333333333333338 + }, + "id": 1072, + "image": "/media/1004/milkbath.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1004%2Fmilkbath.jpg" + }, + "editor": { + "name": "Image rounded", + "alias": "media_round", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_round.cshtml", + "icon": "icon-picture" + } + } + ] + }, + { + "grid": 1, + "allowAll": false, + "allowed": [], + "controls": [] + }, + { + "grid": 8, + "allowAll": false, + "allowed": [ + "headline", + "abstract", + "paragraph" + ], + "controls": [ + { + "value": "dsgrefhbs rb fshbh", + "editor": { + "name": "Headline", + "alias": "headline", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 36px; line-height: 45px; font-weight: bold", + "markup": "

#value#

" + } + } + }, + { + "value": "Nulla porttitor accumsan tincidunt. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sollicitudin molestie malesuada. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "editor": { + "name": "Abstract", + "alias": "abstract", + "view": "textstring", + "icon": "icon-coin", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: bold;", + "markup": "

#value#

" + } + } + }, + { + "value": "Nulla quis lorem ut libero malesuada feugiat. Cras ultricies ligula sed magna dictum porta. Curabitur arcu erat, accumsan id imperdiet et, porttitor at sem. Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Donec sollicitudin molestie malesuada. Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Nulla porttitor accumsan tincidunt.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + }, + { + "value": "Pellentesque in ipsum id orci porta dapibus. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Nulla quis lorem ut libero malesuada feugiat. Nulla quis lorem ut libero malesuada feugiat.", + "editor": { + "name": "Paragraph", + "alias": "paragraph", + "view": "textstring", + "icon": "icon-font", + "config": { + "style": "font-size: 16px; line-height: 20px; font-weight: light;", + "markup": "

#value#

" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "light" + }, + "id": "ac4f7103-d72e-69f0-efef-501843fe4b93" + }, + { + "name": "Image wide", + "areas": [ + { + "grid": 12, + "allowAll": false, + "allowed": [ + "media_wide_cropped", + "media_wide" + ], + "controls": [ + { + "value": { + "focalPoint": { + "left": 0.5, + "top": 0.5 + }, + "id": 1068, + "image": "/media/1001/top-image.jpg", + "thumbnail": "/umbraco/backoffice/UmbracoApi/Images/GetBigThumbnail?originalImagePath=%2Fmedia%2F1001%2Ftop-image.jpg" + }, + "editor": { + "name": "Image wide", + "alias": "media_wide", + "view": "media", + "render": "/App_Plugins/Grid/Editors/Render/media_wide.cshtml", + "icon": "icon-picture" + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "full triangle" + }, + "id": "b8cfa16d-98d4-e156-6632-d5c606844f9f" + }, + { + "name": "Playground", + "areas": [ + { + "grid": 12, + "editors": [ + "headline" + ], + "allowAll": false, + "controls": [ + { + "value": "Pellentesque in ipsum id orci porta dapibus. Quisque velit nisi, pretium ut lacinia in, elementum id enim. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet dui. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Nulla quis lorem ut libero malesuada feugiat. Nulla quis lorem ut libero malesuada feugiat.", + "editor": { + "name": "Quote", + "alias": "quote", + "view": "textstring", + "icon": "icon-quote", + "config": { + "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px", + "markup": "
#value#
" + } + } + } + ] + } + ], + "styles": {}, + "config": { + "class": "yellow" + }, + "id": "2e342d39-fe7b-9636-2b6a-030c87a7b820" + } + ] + } + ] +}]]> +
+
+
+ + + + + + + + + + + + +
+
+
+ + + + Master + Master + icon-desktop + folder.png + + False + False + + + + Master + + + Home + + + + Site title + siteTitle + Umbraco.Textbox + 0cc0eba1-9960-42c9-bf9b-60e150b429ae + + False + + + + + Site Description + siteDescription + Umbraco.Textbox + 0cc0eba1-9960-42c9-bf9b-60e150b429ae + + False + + + + + Logo + logo + Umbraco.ImageCropper + 1df9f033-e6d4-451f-b8d2-e0cbc50a836f + + False + + + + + + + + + Blogpost + Blogpost + icon-edit + folder.png + + False + False + Master + + + + Blogpost + + + + + Blogpost + blogpost + Umbraco.Grid + a3785f08-73d5-406b-855f-8e52805c22e2 + Blogpost + False + + + + + + + 13 + Blogpost + 0 + + + + + + Blogpost Repository + BlogpostRepository + .sprTreeFolder + folder.png + + False + True + + + + + Blogpost + + + + + + + Home + Home + icon-home + folder.png + + True + False + Master + + + + Home + + + LandingPage + BlogpostRepository + + + + + + + Landing page + LandingPage + icon-stamp + folder.png + + False + False + Master + + + + TextPage + + + TextPage + + + + Grid Blogpost + gridBlogpost + Umbraco.Grid + a3785f08-73d5-406b-855f-8e52805c22e2 + Post + False + + + + + + + 12 + Post + 0 + + + + + + Text page + TextPage + icon-document + folder.png + + False + False + Master + + + + TextPage + + + + + + + + + + + + + + + bootstrap.min + bootstrap.min + + + + + + fanoe + fanoe + + ul { + padding: 20px; + position: relative; + display: inline-table; + width: 100%; +} + +nav > ul li { + position: relative; + font-family: "Lato", sans-serif; +} + +nav > ul li a { + display: inline-block; + padding: 25px; + font-size: 20px; + font-weight: 500; + color: rgba(255, 255, 255, 0.75); +} + +nav > ul li a:hover { + color: #fff; +} + +nav > ul li:after { + content: ""; + clear: both; + display: block; +} + +nav li > ul { + position: absolute; +} + +nav li > ul li { + float: none; + display: block; + position: relative; +} + +nav li > ul li a { + font-size: 17px; + padding: 15px 15px; + font-weight: 500; + color: rgba(255, 255, 255, 0.8); +} + +nav li > ul li a:hover { + color: #fff; +} + +nav li > ul > li > ul { + left: 100%; + top: 0; + display: none; +} + +.dark, +.light, +.yellow, +.blue, +.purple { + display: block; + margin: 0 auto; + padding: 50px 0; + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + color: #000; +} + +.dark .row, +.light .row, +.yellow .row, +.blue .row, +.purple .row { + margin: 0; +} + +.dark .row div[class^="col-"], +.light .row div[class^="col-"], +.yellow .row div[class^="col-"], +.blue .row div[class^="col-"], +.purple .row div[class^="col-"] { + margin-bottom: 50px; +} + +.dark p, +.light p, +.yellow p, +.blue p, +.purple p, +.dark a, +.light a, +.yellow a, +.blue a, +.purple a, +.dark blockquote, +.light blockquote, +.yellow blockquote, +.blue blockquote, +.purple blockquote, +.dark li, +.light li, +.yellow li, +.blue li, +.purple li { + font-family: "Merriweather", serif; +} + +.dark h1, +.light h1, +.yellow h1, +.blue h1, +.purple h1 { + margin-bottom: 10px; +} + +.dark h2, +.light h2, +.yellow h2, +.blue h2, +.purple h2, +.dark h3, +.light h3, +.yellow h3, +.blue h3, +.purple h3 { + margin: 0 0 15px; +} + +.dark p, +.light p, +.yellow p, +.blue p, +.purple p { + letter-spacing: 0.2px; + margin: 0 auto; +} + +.dark p + *, +.light p + *, +.yellow p + *, +.blue p + *, +.purple p + * { + margin-top: 20px; +} + +.dark a, +.light a, +.yellow a, +.blue a, +.purple a { + position: relative; + display: inline-block; +} + +.dark img, +.light img, +.yellow img, +.blue img, +.purple img { + padding: 20px 0; + max-width: 100%; + width: auto; + height: auto; + margin: 30px 0; +} + +.dark li, +.light li, +.yellow li, +.blue li, +.purple li { + padding: 2px 0 0; +} + +footer ul { + margin: 15px auto 0; + text-align: center; +} + +footer ul li { + position: relative; + display: block; + text-align: left; + padding: 0 0 5px 0; + margin: 0; + line-height: 1; +} + +footer.dark a { + color: rgba(255, 255, 255, 0.6) !important; + font-size: 1rem; + border-bottom: 1px solid transparent; + padding-bottom: 3px; + font-family: "Lato", sans-serif; + font-weight: 100; +} + +footer.dark a:hover { + color: rgba(255, 255, 255, 0.9) !important; + border-bottom: 1px solid #fff !important; + padding-bottom: 3px; + text-decoration: none; +} + +ul { + margin-left: 20px; +} + +img { + max-width: 100%; + height: auto; +} + +blockquote { + padding: 30px 10px; + text-align: center; + position: relative; + font-size: 1.3rem; +} + +* + ul { + margin-bottom: 30px; +} + +.equal { + display: table; + table-layout: fixed; +} + +.equal .vcenter { + display: table-cell; + vertical-align: middle; +} + +.full { + margin: 0; + padding: 0 !important; + overflow: hidden; +} + +.full * { + max-width: 100%; + width: 100%; + height: auto; + margin: 0 !important; + padding: 0 !important; + line-height: 0; +} + +.full .wide { + width: 100%; + height: auto; +} + +.small { + font-size: .85rem; +} + +code, +pre { + overflow: auto; + padding: 6px 10px; + border-radius: 3px; + background-color: rgba(248, 248, 248, 0.3); + font-size: .9rem; + font-family: "Courier 10 Pitch", Courier, monospace; + line-height: 2.3; +} + +.gallery .row > div { + margin-bottom: 2%; +} + +.gallery img { + margin: 0; +} + +.video-wrapper { + margin-top: 25px; + position: relative; + padding-bottom: 56.25%; + padding-top: 25px; + height: 0; +} + +.video-wrapper iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +@media (min-width: 768px) { + +.dark, +.light, +.yellow, +.blue, +.purple { + padding: 80px 0; +} + +.dark img, +.light img, +.yellow img, +.blue img, +.purple img { + padding: 0; +} + +} + +@media (min-width: 992px) { + +.triangle + .dark:before { + border-color: transparent transparent transparent #1c1c1e; +} + +.triangle + .light:before { + border-color: transparent transparent transparent #fff; +} + +.triangle + .yellow:before { + border-color: transparent transparent transparent #FFCC01; +} + +.triangle + .blue:before { + border-color: transparent transparent transparent #51c1f5; +} + +.triangle + .purple:before { + border-color: transparent transparent transparent #C2357B; +} + +header { + padding: 15px 0; +} + +header .container { + max-width: 960px; + padding: 0 20px; +} + +#toggle { + display: none; +} + +nav { + margin: 0 auto; + background: none; + width: 100%; +} + +nav > ul { + padding-right: 0; + width: auto; +} + +nav > ul li { + float: left; +} + +nav > ul li a { + font-size: 15px; +} + +nav > ul li:last-child a { + padding-right: 0; +} + +nav li > ul { + left: 0; + top: 75%; + display: none; + white-space: nowrap; + height: auto; + margin-bottom: 0; + margin-left: 10px; + text-align: left; + background: rgba(0, 0, 0, 0.8); + padding: 5px 8px 5px 0; +} + +nav li > ul li a { + padding: 8px 15px; + font-size: 15px; + color: rgba(255, 255, 255, 0.8); +} + +nav .has-child:hover > .sublevel { + display: block; +} + +.dark .row div[class^="col-"], +.light .row div[class^="col-"], +.yellow .row div[class^="col-"], +.blue .row div[class^="col-"], +.purple .row div[class^="col-"] { + margin-bottom: 20px; +} + +.triangle { + position: relative; +} + +.triangle img { + position: relative; + z-index: 100; +} + +.triangle:before { + content: ""; + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 0 0 150px 100vw; + border-color: inherit; + position: absolute; + z-index: 120; +} + +.triangle + .light, +.triangle + .dark, +.triangle + .blue, +.triangle + .yellow, +.triangle + .purple { + position: relative; +} + +.triangle + .light:before, +.triangle + .dark:before, +.triangle + .blue:before, +.triangle + .yellow:before, +.triangle + .purple:before { + content: ""; + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 150px 0 0 100vw; + border-color: none; + position: absolute; + z-index: 120; + top: -150px; +} + +} + +@media (max-width: 992px) { + +body { + width: 100vw; + overflow-x: hidden; +} + +nav { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); + opacity: 1; + transition: -webkit-transform 300ms ease-in-out, opacity 300ms ease-in-out; + transition: transform 300ms ease-in-out, opacity 300ms ease-in-out; + text-align: center; + position: absolute; + top: 144px; +} + +nav.open { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); +} + +nav > ul { + margin: 0; +} + +nav > ul li:first-child a { + padding: 10px 25px; +} + +nav > ul li a { + padding: 25px 25px 10px 25px; + color: rgba(255, 255, 255, 0.6); +} + +nav > ul li.active > a { + color: #fff; + font-weight: 700; +} + +nav > ul li.active ul { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + height: 120%; +} + +nav li > ul { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + position: relative; + text-align: center; + transition: all 300ms ease-in-out; + height: 0; + margin: 0; +} + +} + +@media (max-width: 992px) and (max-width: 992px) { + +nav > ul li.active ul li a { + color: #fff; + font-weight: 500; +} + +} +]]> + + + + style + style + + + + + + + + Insert form + umbracoforms.RenderForm + + + + + + + True + 0 + ~/Views/MacroPartials/InsertUmbracoForm.cshtml + + + + + + Render Forms Scripts + umbracoforms.RenderScripts + + + + + + + False + 0 + ~/Views/MacroPartials/RenderUmbracoFormScripts.cshtml + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs b/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs index 30bbdb468a..bcc287e2ae 100644 --- a/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs +++ b/src/Umbraco.Tests/Services/Importing/ImportResources.Designer.cs @@ -196,6 +196,34 @@ namespace Umbraco.Tests.Services.Importing { } } + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-8" standalone="no"?> + ///<umbPackage> + /// <files> + /// <file> + /// <guid>bootstrap.min.js</guid> + /// <orgPath>/js</orgPath> + /// <orgName>bootstrap.min.js</orgName> + /// </file> + /// <file> + /// <guid>jquery.min.js</guid> + /// <orgPath>/js</orgPath> + /// <orgName>jquery.min.js</orgName> + /// </file> + /// <file> + /// <guid>top-image.jpg</guid> + /// <orgPath>/Media/1001</orgPath> + /// <orgName>top-image.jpg</orgName> + /// </file> + /// <file> + /// <guid>top-im [rest of string was truncated]";. + /// + internal static string Fanoe_Package { + get { + return ResourceManager.GetString("Fanoe_Package", resourceCulture); + } + } + /// /// Looks up a localized string similar to <?xml version="1.0" encoding="UTF-8" standalone="no"?> ///<umbPackage> diff --git a/src/Umbraco.Tests/Services/Importing/ImportResources.resx b/src/Umbraco.Tests/Services/Importing/ImportResources.resx index 23877a67cf..f6a447531a 100644 --- a/src/Umbraco.Tests/Services/Importing/ImportResources.resx +++ b/src/Umbraco.Tests/Services/Importing/ImportResources.resx @@ -154,4 +154,7 @@ compositionstestpackage-random.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + fanoe-package.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + \ No newline at end of file diff --git a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs index 05d9758cee..215f24e375 100644 --- a/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs +++ b/src/Umbraco.Tests/Services/Importing/PackageImportTests.cs @@ -211,6 +211,30 @@ namespace Umbraco.Tests.Services.Importing Assert.That(templates.Any(), Is.True); } + [Test] + public void PackagingService_Can_Import_Fanoe_Starterkit_ContentTypes_And_Templates_Xml() + { + // Arrange + string strXml = ImportResources.Fanoe_Package; + var xml = XElement.Parse(strXml); + var dataTypeElement = xml.Descendants("DataTypes").First(); + var templateElement = xml.Descendants("Templates").First(); + var docTypeElement = xml.Descendants("DocumentTypes").First(); + + // Act + var dataTypeDefinitions = ServiceContext.PackagingService.ImportDataTypeDefinitions(dataTypeElement); + var templates = ServiceContext.PackagingService.ImportTemplates(templateElement); + var contentTypes = ServiceContext.PackagingService.ImportContentTypes(docTypeElement); + var numberOfDocTypes = (from doc in docTypeElement.Elements("DocumentType") select doc).Count(); + + //Assert - Re-Import contenttypes doesn't throw + Assert.DoesNotThrow(() => ServiceContext.PackagingService.ImportContentTypes(docTypeElement)); + Assert.That(contentTypes.Count(), Is.EqualTo(numberOfDocTypes)); + Assert.That(dataTypeDefinitions, Is.Not.Null); + Assert.That(dataTypeDefinitions.Any(), Is.True); + Assert.That(templates.Any(), Is.True); + } + [Test] public void PackagingService_Can_Import_Content_Package_Xml() { diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 6eac856545..a646c453b3 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -697,6 +697,7 @@ + diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/html/umbcontrolgroup.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/html/umbcontrolgroup.directive.js index 3eec10f332..f371dba9b5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/html/umbcontrolgroup.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/html/umbcontrolgroup.directive.js @@ -33,6 +33,14 @@ angular.module("umbraco.directives.html") else { scope.labelstring = scope.label; } + + if (scope.description && scope.description[0] === "@") { + scope.descriptionstring = localizationService.localize(scope.description.substring(1)); + } + else { + scope.descriptionstring = scope.description; + } + } }; }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/html/umb-control-group.html b/src/Umbraco.Web.UI.Client/src/views/directives/html/umb-control-group.html index 9d144d79d3..b07c2b9c72 100644 --- a/src/Umbraco.Web.UI.Client/src/views/directives/html/umb-control-group.html +++ b/src/Umbraco.Web.UI.Client/src/views/directives/html/umb-control-group.html @@ -3,7 +3,7 @@
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 7fabc9e4d7..3051f644a8 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -410,9 +410,9 @@ Search results - Background color + Background colour Bold - Text color + Text colour Font Text @@ -702,7 +702,7 @@ To manage your website, simply open the Umbraco back office and start adding con ]]> - You have not configured any approved colors + You have not configured any approved colours Add external link diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 588a924928..38b6a1e7c4 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -854,6 +854,36 @@ To manage your website, simply open the Umbraco back office and start adding con Quick Guide to Umbraco template tags Template + + Insert control + Add rows to your layout + below and add your first element]]> + + Grid layouts + Layouts are the overall work area for the grid editor, usually you only need one or two differnt layouts + Add grid layout + Adjust the layout by setting column widths and adding additional sections + + Row configurations + Rows are predefined cells arranged horizontally + Add row configuration + Adjust the row by setting cell widths and adding additional cells + + Columns + Total combined number of columns in the grid layout + + Settings + Configure what settings editors can change + + + Styles + Configure what styling editors can change + + Settings will only save if the entered json configuration is valid + + Allow all editors + Allow all row configurations + Alternative field Alternative Text diff --git a/src/Umbraco.Web/Install/Controllers/InstallApiController.cs b/src/Umbraco.Web/Install/Controllers/InstallApiController.cs index 6041e23ca5..2ab1fd97ad 100644 --- a/src/Umbraco.Web/Install/Controllers/InstallApiController.cs +++ b/src/Umbraco.Web/Install/Controllers/InstallApiController.cs @@ -84,15 +84,9 @@ namespace Umbraco.Web.Install.Controllers public IEnumerable GetPackages() { - var r = new org.umbraco.our.Repository(); - var modules = r.Modules(); - - return modules.Select(package => new Package() - { - Id = package.RepoGuid, - Name = package.Text, - Thumbnail = package.Thumbnail - }); + var installHelper = new InstallHelper(UmbracoContext); + var starterKits = installHelper.GetStarterKits(); + return starterKits; } /// diff --git a/src/Umbraco.Web/Install/InstallHelper.cs b/src/Umbraco.Web/Install/InstallHelper.cs index 1528bd89e1..c882a83cd8 100644 --- a/src/Umbraco.Web/Install/InstallHelper.cs +++ b/src/Umbraco.Web/Install/InstallHelper.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; +using System.Net.Http; using System.Web; using System.Web.Script.Serialization; using System.Web.UI; @@ -11,6 +12,7 @@ using umbraco.BusinessLogic; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; +using Umbraco.Core.Logging; using Umbraco.Core.Persistence; using Umbraco.Web.Install.InstallSteps; using Umbraco.Web.Install.Models; @@ -39,7 +41,7 @@ namespace Umbraco.Web.Install public IEnumerable GetAllSteps() { return new List - { + { new NewInstallStep(_umbContext.Application), new UpgradeStep(), new FilePermissionsStep(), @@ -85,12 +87,12 @@ namespace Umbraco.Web.Install { Directory.Move(IOHelper.MapPath(SystemDirectories.Install), IOHelper.MapPath("~/app_data/temp/install_backup")); } - } + } if (Directory.Exists(IOHelper.MapPath("~/Areas/UmbracoInstall"))) - { + { Directory.Delete(IOHelper.MapPath("~/Areas/UmbracoInstall"), true); - } + } } internal void InstallStatus(bool isCompleted, string errorMsg) @@ -165,7 +167,9 @@ namespace Umbraco.Web.Install if (result == 1) { //the user has not been configured - return true; + //this is always true on UaaS, need to check if there's multiple users too + var usersResult = _umbContext.Application.DatabaseContext.Database.ExecuteScalar("SELECT COUNT(*) FROM umbracoUser"); + return usersResult == 1; } // //check if there are any content types configured, if there isn't then we will consider this a new install @@ -182,5 +186,29 @@ namespace Umbraco.Web.Install return false; } } + + internal IEnumerable GetStarterKits() + { + var packages = new List(); + + try + { + var requestUri = string.Format("http://our.umbraco.org/webapi/StarterKit/Get/?umbracoVersion={0}", + UmbracoVersion.Current); + + using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri)) + using (var httpClient = new HttpClient()) + using (var response = httpClient.SendAsync(request).Result) + { + packages = response.Content.ReadAsAsync>().Result.ToList(); + } + } + catch (AggregateException ex) + { + LogHelper.Error("Could not download list of available starter kits", ex); + } + + return packages; + } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs index f5bc96fdea..e8397136a9 100644 --- a/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/StarterKitDownloadStep.cs @@ -21,16 +21,17 @@ namespace Umbraco.Web.Install.InstallSteps private const string RepoGuid = "65194810-1f85-11dd-bd0b-0800200c9a66"; - //adding a package guid hardcoded, so we can change the sent package remotely, currently this just points to txt kit - //but a future starterkit will be inserted under the same guid on our. - private const string PackageGuid = "69E44BEB-15FF-4CEE-8B64-0A7DAE498657"; - public override InstallSetupResult Execute(Guid? starterKitId) { //if there is no value assigned then use the default starter kit if (starterKitId.HasValue == false) { - starterKitId = Guid.Parse(PackageGuid); + var installHelper = new InstallHelper(UmbracoContext.Current); + var starterKits = installHelper.GetStarterKits().FirstOrDefault(); + if (starterKits != null) + starterKitId = starterKits.Id; + else + return null; } else if (starterKitId.Value == Guid.Empty) { @@ -57,7 +58,7 @@ namespace Umbraco.Web.Install.InstallSteps } if (repo.HasConnection() == false) { - throw new InstallException("Cannot connect to repository"); + throw new InstallException("Cannot connect to repository"); } var installer = new Installer(); @@ -76,7 +77,7 @@ namespace Umbraco.Web.Install.InstallSteps var installer = new Installer(); installer.LoadConfig(packageFile); installer.InstallFiles(manifestId, packageFile); - + } public override string View diff --git a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs index bd4f8d0c3c..ea1fd8dfe9 100644 --- a/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/ImageCropperPropertyEditor.cs @@ -223,9 +223,13 @@ namespace Umbraco.Web.PropertyEditors { json = JObject.Parse((string)p.Value); } - catch (JsonException ex) + catch (JsonException) { - LogHelper.Error("Could not parse the value into a JSON structure! Value: " + p.Value, ex); + //note: we are swallowing this exception because in some cases a normal string/non json value will be passed in which will just be the + // file path like /media/23454/hello.jpg + // This will happen everytime an image is uploaded via the folder browser and we don't really want to pollute the log since it's not actually + // a problem and we take care of this below. + // see: http://issues.umbraco.org/issue/U4-4756 } if (json != null && json["src"] != null) {