diff --git a/Gruntfile.js b/Gruntfile.js index 3b51cd7..5bae100 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,11 +29,6 @@ module.exports = function(grunt) { tasks: ['copy:html'] }, - config: { - files: ['config/package.manifest'], - tasks: ['copy:config'] - }, - dll: { files: ['app/Umbraco/**/*.dll'], tasks: ['copy:dll'] @@ -77,18 +72,12 @@ module.exports = function(grunt) { }, dll: { cwd: 'app/Umbraco/Umbraco.Archetype/bin/Release/', - src: '*.*', + src: 'Archetype.dll', dest: '<%= dest %>/bin/', expand: true }, config: { files: [ - { - cwd: 'config/', - src: ['package.manifest'], - dest: '<%= basePath %>', - expand: true - }, { cwd: 'app/langs/', src: ['**'], @@ -220,6 +209,7 @@ module.exports = function(grunt) { grunt.registerTask('default', ['clean', 'less', 'concat', 'assemblyinfo', 'msbuild:dist', 'copy:dll', 'copy:config', 'copy:html']); - grunt.registerTask('nuget', ['clean:tmp', 'default', 'copy:nuget', 'template:nuspec', 'nugetpack', 'clean:tmp']); + grunt.registerTask('nuget', ['clean:tmp', 'default', 'copy:nuget', 'template:nuspec', 'nugetpack', 'clean:tmp']); grunt.registerTask('umbraco', ['clean:tmp', 'default', 'copy:umbraco', 'umbracoPackage', 'clean:tmp']); + grunt.registerTask('package', ['clean:tmp', 'default', 'copy:nuget', 'template:nuspec', 'nugetpack', 'copy:umbraco', 'umbracoPackage', 'clean:tmp']); }; \ No newline at end of file diff --git a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj index adf99ec..f0dc847 100644 --- a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj +++ b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj @@ -37,8 +37,9 @@ ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\businesslogic.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll ..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll @@ -46,17 +47,20 @@ ..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\cms.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\controls.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\Examine.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll @@ -64,28 +68,32 @@ ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - - ..\packages\ImageProcessor.1.8.7.0\lib\ImageProcessor.dll - - - ..\packages\ImageProcessor.Web.3.2.1.0\lib\net45\ImageProcessor.Web.dll - - + False - ..\packages\UmbracoCms.Core.7.1.0\lib\interfaces.dll + ..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll + + + False + ..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll + + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll False - ..\packages\UmbracoCms.Core.7.1.0\lib\log4net.dll + ..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\Microsoft.ApplicationBlocks.Data.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\Microsoft.Web.Helpers.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll True @@ -103,24 +111,26 @@ ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll - - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + + False + ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll ..\packages\NUnit.2.6.3\lib\nunit.framework.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\SQLCE4Umbraco.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll True - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.dll + ..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll True - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.Entity.dll + ..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll @@ -163,39 +173,49 @@ - - ..\packages\UmbracoCms.Core.7.1.0\lib\TidyNet.dll - - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.dll - - + False - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Core.dll + ..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.DataLayer.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.editorControls.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.MacroEngines.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.providers.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Web.UI.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.XmlSerializers.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\UmbracoExamine.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\UrlRewritingNet.UrlRewriter.dll + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll + + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll + + + False + ..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll diff --git a/app/Umbraco/Archetype.Tests/Models/FieldsetTests.cs b/app/Umbraco/Archetype.Tests/Models/FieldsetTests.cs index 3b1c401..e1bbc0d 100644 --- a/app/Umbraco/Archetype.Tests/Models/FieldsetTests.cs +++ b/app/Umbraco/Archetype.Tests/Models/FieldsetTests.cs @@ -4,7 +4,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using Archetype.Umbraco.PropertyConverters; +using Archetype.PropertyConverters; using NUnit.Framework; namespace Archetype.Tests.Models @@ -26,7 +26,7 @@ namespace Archetype.Tests.Models public void Can_Get_Fieldset_Property_By_Alias() { var converter = new ArchetypeValueConverter(); - var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false); + var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false); var fieldset = result.Fieldsets.First(); var propertyValue = fieldset.GetValue("boxHeadline"); @@ -38,7 +38,7 @@ namespace Archetype.Tests.Models public void Can_Convert_Property_Value_Types() { var converter = new ArchetypeValueConverter(); - var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false); + var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false); var fieldset = result.Fieldsets.First(); @@ -51,7 +51,7 @@ namespace Archetype.Tests.Models public void Returns_String_When_No_Type_Specified() { var converter = new ArchetypeValueConverter(); - var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false); + var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false); var fieldset = result.Fieldsets.First(); diff --git a/app/Umbraco/Archetype.Tests/PropertyValueConverter/PropertyValueConverterTests.cs b/app/Umbraco/Archetype.Tests/PropertyValueConverter/PropertyValueConverterTests.cs index 6329a4d..63f595c 100644 --- a/app/Umbraco/Archetype.Tests/PropertyValueConverter/PropertyValueConverterTests.cs +++ b/app/Umbraco/Archetype.Tests/PropertyValueConverter/PropertyValueConverterTests.cs @@ -4,7 +4,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using Archetype.Umbraco.PropertyConverters; +using Archetype.PropertyConverters; using Moq; using NUnit.Framework; using Umbraco.Core.Models.PublishedContent; @@ -31,9 +31,9 @@ namespace Archetype.Tests.PropertyValueConverter var converter = new ArchetypeValueConverter(); var result = converter.ConvertDataToSource(null, data, false); - Assert.AreEqual(result.GetType(), typeof (Archetype.Umbraco.Models.Archetype)); + Assert.AreEqual(result.GetType(), typeof (Archetype.Models.ArchetypeModel)); - var fieldsets = (Archetype.Umbraco.Models.Archetype) result; + var fieldsets = (Archetype.Models.ArchetypeModel) result; Assert.IsTrue(fieldsets.Count() == 0); } @@ -44,9 +44,9 @@ namespace Archetype.Tests.PropertyValueConverter var converter = new ArchetypeValueConverter(); var result = converter.ConvertDataToSource(null, data, false); - Assert.AreEqual(result.GetType(), typeof (Archetype.Umbraco.Models.Archetype)); + Assert.AreEqual(result.GetType(), typeof (Archetype.Models.ArchetypeModel)); - var fieldsets = (Archetype.Umbraco.Models.Archetype) result; + var fieldsets = (Archetype.Models.ArchetypeModel) result; Assert.IsTrue(fieldsets.Count() == 0); } @@ -54,7 +54,7 @@ namespace Archetype.Tests.PropertyValueConverter public void Can_Serialize_From_Json_Model() { var converter = new ArchetypeValueConverter(); - var result = (Archetype.Umbraco.Models.Archetype)converter.ConvertDataToSource(null, _sampleJson, false); + var result = (Archetype.Models.ArchetypeModel)converter.ConvertDataToSource(null, _sampleJson, false); Assert.That(result != null); Assert.That(result.Fieldsets.Count() == 2); diff --git a/app/Umbraco/Archetype.Tests/app.config b/app/Umbraco/Archetype.Tests/app.config index e509377..72cac16 100644 --- a/app/Umbraco/Archetype.Tests/app.config +++ b/app/Umbraco/Archetype.Tests/app.config @@ -18,6 +18,10 @@ + + + + \ No newline at end of file diff --git a/app/Umbraco/Archetype.Tests/packages.config b/app/Umbraco/Archetype.Tests/packages.config index 66fbf23..e0df35f 100644 --- a/app/Umbraco/Archetype.Tests/packages.config +++ b/app/Umbraco/Archetype.Tests/packages.config @@ -4,8 +4,8 @@ - - + + @@ -20,9 +20,9 @@ - + - + \ No newline at end of file diff --git a/app/Umbraco/DatabaseSizer/Application.cs b/app/Umbraco/DatabaseSizer/Application.cs new file mode 100644 index 0000000..0824ba5 --- /dev/null +++ b/app/Umbraco/DatabaseSizer/Application.cs @@ -0,0 +1,49 @@ +using System; +using Umbraco.Core; +using Umbraco.Core.Logging; + +namespace DatabaseSizer +{ + public class Application : ApplicationEventHandler + { + protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext) + { + base.ApplicationStarted(umbracoApplication, applicationContext); + + ExpandPrevalueValueColumnSize(); + } + + protected void ExpandPrevalueValueColumnSize() + { + try + { + var dbContext = ApplicationContext.Current.DatabaseContext; + var colCount = + dbContext.Database.ExecuteScalar( + "SELECT COUNT(1) FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'nvarchar' AND COLUMN_NAME = 'value' AND CHARACTER_MAXIMUM_LENGTH = 2500 AND TABLE_NAME = 'cmsDataTypePreValues'"); + + // Check column + if (colCount != 0) + { + using (var trans = dbContext.Database.GetTransaction()) + { + // Change column + dbContext.Database.Execute("ALTER TABLE [cmsDataTypePreValues] ALTER COLUMN [value] ntext NULL;"); + + trans.Complete(); + } + + LogHelper.Debug(typeof(Application), "Successfully expanded Prevalue table Value column"); + } + else + { + LogHelper.Debug(typeof(Application), "Prevalue table Value column is already expanded"); + } + } + catch (Exception ex) + { + LogHelper.Error(typeof(Application), "Error expanding Prevalue table Value column", ex); + } + } + } +} \ No newline at end of file diff --git a/app/Umbraco/DatabaseSizer/DatabaseSizer.csproj b/app/Umbraco/DatabaseSizer/DatabaseSizer.csproj new file mode 100644 index 0000000..60c92b8 --- /dev/null +++ b/app/Umbraco/DatabaseSizer/DatabaseSizer.csproj @@ -0,0 +1,213 @@ + + + + + Debug + AnyCPU + {0114C963-C514-49C1-B7AB-DCB1825F498C} + Library + Properties + DatabaseSizer + DatabaseSizer + v4.5 + 512 + ..\ + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.dll + + + ..\packages\AutoMapper.3.0.0\lib\net40\AutoMapper.Net4.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll + + + ..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll + + + ..\packages\ClientDependency-Mvc.1.7.0.4\lib\ClientDependency.Core.Mvc.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll + + + ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll + + + ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll + + + ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll + + + ..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll + + + ..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll + + + ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll + + + True + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + + ..\packages\Microsoft.AspNet.Mvc.FixedDisplayModes.1.0.0\lib\net40\Microsoft.Web.Mvc.FixedDisplayModes.dll + + + ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll + + + ..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll + + + ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll + + + + + True + ..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll + + + True + ..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll + + + ..\packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40\System.Net.Http.Formatting.dll + + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.Helpers.dll + + + ..\packages\Microsoft.AspNet.WebApi.Core.4.0.20710.0\lib\net40\System.Web.Http.dll + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.20710.0\lib\net40\System.Web.Http.WebHost.dll + + + True + ..\packages\Microsoft.AspNet.Mvc.4.0.20710.0\lib\net40\System.Web.Mvc.dll + + + True + ..\packages\Microsoft.AspNet.Razor.2.0.20710.0\lib\net40\System.Web.Razor.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Deployment.dll + + + True + ..\packages\Microsoft.AspNet.WebPages.2.0.20710.0\lib\net40\System.Web.WebPages.Razor.dll + + + + + + + + ..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll + + + ..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll + + + + + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/app/Umbraco/DatabaseSizer/Properties/AssemblyInfo.cs b/app/Umbraco/DatabaseSizer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..46a4e6f --- /dev/null +++ b/app/Umbraco/DatabaseSizer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DatabaseSizer.cs")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DatabaseSizer.cs")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("28dc35d2-3dfb-40b4-9093-bc47c91127ea")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/app/Umbraco/DatabaseSizer/app.config b/app/Umbraco/DatabaseSizer/app.config new file mode 100644 index 0000000..ccb9166 --- /dev/null +++ b/app/Umbraco/DatabaseSizer/app.config @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/Umbraco/DatabaseSizer/packages.config b/app/Umbraco/DatabaseSizer/packages.config new file mode 100644 index 0000000..3fc6851 --- /dev/null +++ b/app/Umbraco/DatabaseSizer/packages.config @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype.sln b/app/Umbraco/Umbraco.Archetype.sln index 88272ac..bb5fa55 100644 --- a/app/Umbraco/Umbraco.Archetype.sln +++ b/app/Umbraco/Umbraco.Archetype.sln @@ -12,6 +12,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{D84AA4 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archetype.Tests", "Archetype.Tests\Archetype.Tests.csproj", "{21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DatabaseSizer", "DatabaseSizer\DatabaseSizer.csproj", "{0114C963-C514-49C1-B7AB-DCB1825F498C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -26,6 +28,10 @@ Global {21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU {21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {21F3E6CF-B76F-4059-9474-1AF1CE63CD6B}.Release|Any CPU.Build.0 = Release|Any CPU + {0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0114C963-C514-49C1-B7AB-DCB1825F498C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0114C963-C514-49C1-B7AB-DCB1825F498C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/app/Umbraco/Umbraco.Archetype/Api/ArchetypeDataTypeController.cs b/app/Umbraco/Umbraco.Archetype/Api/ArchetypeDataTypeController.cs index 3a03b2f..a544c3a 100644 --- a/app/Umbraco/Umbraco.Archetype/Api/ArchetypeDataTypeController.cs +++ b/app/Umbraco/Umbraco.Archetype/Api/ArchetypeDataTypeController.cs @@ -9,7 +9,7 @@ using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.Editors; -namespace Archetype.Umbraco.Api +namespace Archetype.Api { [PluginController("ArchetypeApi")] public class ArchetypeDataTypeController : UmbracoAuthorizedJsonController diff --git a/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj b/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj index cdd3a7a..6b43c6c 100644 --- a/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj +++ b/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ {7D185D41-4228-4978-ACB8-83F9A48AD94F} Library Properties - Archetype.Umbraco + Archetype Archetype v4.5 512 @@ -41,8 +41,7 @@ False - ..\packages\UmbracoCms.Core.7.1.0\lib\businesslogic.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\businesslogic.dll ..\packages\ClientDependency.1.7.1.2\lib\ClientDependency.Core.dll @@ -53,20 +52,17 @@ False - ..\packages\UmbracoCms.Core.7.1.0\lib\cms.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\cms.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\controls.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\controls.dll ..\packages\xmlrpcnet.2.5.0\lib\net20\CookComputing.XmlRpcV2.dll False - ..\packages\UmbracoCms.Core.7.1.0\lib\Examine.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\Examine.dll ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll @@ -77,32 +73,26 @@ False - ..\packages\ImageProcessor.1.8.7.0\lib\ImageProcessor.dll - False + ..\packages\ImageProcessor.1.9.0.0\lib\ImageProcessor.dll - ..\packages\ImageProcessor.Web.3.2.1.0\lib\net45\ImageProcessor.Web.dll - False + ..\packages\ImageProcessor.Web.3.2.3.0\lib\net45\ImageProcessor.Web.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\interfaces.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\interfaces.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\log4net.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\log4net.dll ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll False - ..\packages\UmbracoCms.Core.7.1.0\lib\Microsoft.ApplicationBlocks.Data.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.ApplicationBlocks.Data.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\Microsoft.Web.Helpers.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\Microsoft.Web.Helpers.dll False @@ -121,22 +111,21 @@ False - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll False - ..\packages\UmbracoCms.Core.7.1.0\lib\SQLCE4Umbraco.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\SQLCE4Umbraco.dll - False - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.dll + True + ..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.dll - False - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.Entity.dll + True + ..\packages\UmbracoCms.Core.7.1.2\lib\System.Data.SqlServerCe.Entity.dll @@ -183,61 +172,51 @@ - ..\packages\UmbracoCms.Core.7.1.0\lib\TidyNet.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\TidyNet.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Core.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Core.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.DataLayer.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.DataLayer.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.editorControls.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.editorControls.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.MacroEngines.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.MacroEngines.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.providers.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.providers.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Web.UI.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\Umbraco.Web.UI.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.XmlSerializers.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\umbraco.XmlSerializers.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\UmbracoExamine.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\UmbracoExamine.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\UrlRewritingNet.UrlRewriter.dll - False + ..\packages\UmbracoCms.Core.7.1.2\lib\UrlRewritingNet.UrlRewriter.dll + - + - - + + @@ -245,8 +224,10 @@ + + diff --git a/app/Umbraco/Umbraco.Archetype/Constants.cs b/app/Umbraco/Umbraco.Archetype/Constants.cs index 83d036b..f8e6b50 100644 --- a/app/Umbraco/Umbraco.Archetype/Constants.cs +++ b/app/Umbraco/Umbraco.Archetype/Constants.cs @@ -1,4 +1,4 @@ -namespace Archetype.Umbraco +namespace Archetype { public static class Constants { diff --git a/app/Umbraco/Umbraco.Archetype/Events/ExpireCache.cs b/app/Umbraco/Umbraco.Archetype/Events/ExpireCache.cs index 3db68df..792165b 100644 --- a/app/Umbraco/Umbraco.Archetype/Events/ExpireCache.cs +++ b/app/Umbraco/Umbraco.Archetype/Events/ExpireCache.cs @@ -8,7 +8,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web; -namespace Archetype.Umbraco.Events +namespace Archetype.Events { public class ExpireCache : ApplicationEventHandler { diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs new file mode 100644 index 0000000..1db4ea6 --- /dev/null +++ b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs @@ -0,0 +1,151 @@ +using System; +using System.Linq; +using Archetype.Models; +using Newtonsoft.Json; +using Umbraco.Core; +using Umbraco.Core.Models; + +namespace Archetype.Extensions +{ + public class ArchetypeHelper + { + + protected JsonSerializerSettings _jsonSettings; + protected ApplicationContext _app; + + internal ArchetypeHelper() + { + var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver(); + dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; + + _jsonSettings = new JsonSerializerSettings { ContractResolver = dcr }; + _app = ApplicationContext.Current; + } + + internal Models.ArchetypeModel DeserializeJsonToArchetype(string sourceJson, PreValueCollection dataTypePreValues) + { + try + { + var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); + + try + { + // Get list of configured properties and their types and map them to the deserialized archetype model + var preValue = GetArchetypePreValueFromPreValuesCollection(dataTypePreValues); + RetrieveAdditionalProperties(ref archetype, preValue); + } + catch (Exception ex) + { + } + + return archetype; + } + catch + { + return new Models.ArchetypeModel(); + } + } + + internal Models.ArchetypeModel DeserializeJsonToArchetype(string sourceJson, int dataTypeId) + { + try + { + var archetype = JsonConvert.DeserializeObject(sourceJson, _jsonSettings); + + try + { + // Get list of configured properties and their types and map them to the deserialized archetype model + var preValue = GetArchetypePreValueFromDataTypeId(dataTypeId); + RetrieveAdditionalProperties(ref archetype, preValue); + } + catch (Exception ex) + { + } + + return archetype; + } + catch + { + return new Models.ArchetypeModel(); + } + } + + private ArchetypePreValue GetArchetypePreValueFromDataTypeId(int dataTypeId) + { + return _app.ApplicationCache.RuntimeCache.GetCacheItem( + Constants.CacheKey_PreValueFromDataTypeId + dataTypeId, + () => + { + var preValues = _app.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeId); + + var configJson = preValues.IsDictionaryBased + ? preValues.PreValuesAsDictionary[Constants.PreValueAlias].Value + : preValues.PreValuesAsArray.First().Value; + + var config = JsonConvert.DeserializeObject(configJson, _jsonSettings); + RetrieveAdditionalProperties(ref config); + + return config; + + }) as ArchetypePreValue; + } + + private ArchetypePreValue GetArchetypePreValueFromPreValuesCollection(PreValueCollection dataTypePreValues) + { + var preValueAsString = dataTypePreValues.PreValuesAsDictionary.First().Value.Value; + var preValue = JsonConvert.DeserializeObject(preValueAsString, _jsonSettings); + return preValue; + } + + + private IDataTypeDefinition GetDataTypeByGuid(Guid guid) + { + return (IDataTypeDefinition) ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem( + Constants.CacheKey_DataTypeByGuid + guid, + () => _app.Services.DataTypeService.GetDataTypeDefinitionById(guid)); + } + + /// + /// Retrieves additional metadata that isn't available on the stored model of an Archetype + /// + /// The Archetype to add the additional metadata to + /// The configuration of the Archetype + private void RetrieveAdditionalProperties(ref Models.ArchetypeModel archetype, ArchetypePreValue preValue) + { + foreach (var fieldset in preValue.Fieldsets) + { + var fieldsetAlias = fieldset.Alias; + foreach (var fieldsetInst in archetype.Fieldsets.Where(x => x.Alias == fieldsetAlias)) + { + foreach (var property in fieldset.Properties) + { + var propertyAlias = property.Alias; + foreach ( var propertyInst in fieldsetInst.Properties.Where(x => x.Alias == propertyAlias)) + { + propertyInst.DataTypeGuid = property.DataTypeGuid.ToString(); + propertyInst.DataTypeId = GetDataTypeByGuid(property.DataTypeGuid).Id; + propertyInst.PropertyEditorAlias = property.PropertyEditorAlias; + } + } + } + } + } + + /// + /// Retrieves additional metadata that isn't available on the stored model of an ArchetypePreValue + /// + /// The Archetype to add the additional metadata to + /// The configuration of the Archetype + private void RetrieveAdditionalProperties(ref Models.ArchetypePreValue preValue) + { + foreach (var fieldset in preValue.Fieldsets) + { + foreach (var property in fieldset.Properties) + { + property.PropertyEditorAlias = GetDataTypeByGuid(property.DataTypeGuid).PropertyEditorAlias; + } + } + } + + } +} diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs index 2232aa5..a8fcf78 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs @@ -1,7 +1,13 @@ -using Umbraco.Core; -using Archetype.Umbraco.Models; +using System; +using System.Web; +using System.Text; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using Umbraco.Core; +using Umbraco.Web; +using Archetype.Models; -namespace Archetype.Umbraco.Extensions +namespace Archetype.Extensions { public static class Extensions { @@ -13,7 +19,7 @@ namespace Archetype.Umbraco.Extensions || input.StartsWith("[") && input.EndsWith("]"); } - public static bool IsArchetype(this Property prop) + public static bool IsArchetype(this ArchetypePropertyModel prop) { return prop.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditorAlias); } diff --git a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs deleted file mode 100644 index 207e9f6..0000000 --- a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace Archetype.Umbraco.Models -{ - [JsonObject] - public class Archetype : IEnumerable
- { - [JsonProperty("fieldsets")] - internal IEnumerable
Fieldsets { get; set; } - - public Archetype() - { - Fieldsets = new List
(); - } - - public IEnumerator
GetEnumerator() - { - return this.Fieldsets.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return this.GetEnumerator(); - } - } -} diff --git a/app/Umbraco/Umbraco.Archetype/Models/Fieldset.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypeFieldsetModel.cs similarity index 67% rename from app/Umbraco/Umbraco.Archetype/Models/Fieldset.cs rename to app/Umbraco/Umbraco.Archetype/Models/ArchetypeFieldsetModel.cs index 23dec2d..52d2c9b 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Fieldset.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypeFieldsetModel.cs @@ -1,21 +1,21 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Umbraco.Core; -namespace Archetype.Umbraco.Models +namespace Archetype.Models { - public class Fieldset + public class ArchetypeFieldsetModel { [JsonProperty("alias")] public string Alias { get; set; } [JsonProperty("properties")] - public IEnumerable Properties; + public IEnumerable Properties; - public Fieldset() + public ArchetypeFieldsetModel() { - Properties = new List(); + Properties = new List(); } #region Helper Methods @@ -29,7 +29,7 @@ namespace Archetype.Umbraco.Models { var property = GetProperty(propertyAlias); - if (property == null || string.IsNullOrEmpty(property.Value.ToString())) + if (property == null || property.Value == null || string.IsNullOrEmpty(property.Value.ToString())) return default(T); return property.GetValue(); @@ -43,13 +43,13 @@ namespace Archetype.Umbraco.Models public bool HasValue(string propertyAlias) { var property = GetProperty(propertyAlias); - if (property == null) + if (property == null || property.Value == null) return false; return !string.IsNullOrEmpty(property.Value.ToString()); } - private Property GetProperty(string propertyAlias) + private ArchetypePropertyModel GetProperty(string propertyAlias) { return Properties.FirstOrDefault(p => p.Alias.InvariantEquals(propertyAlias)); } @@ -57,4 +57,4 @@ namespace Archetype.Umbraco.Models #endregion } -} +} \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs new file mode 100644 index 0000000..1587050 --- /dev/null +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypeModel.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Archetype.Models +{ + [JsonObject] + public class ArchetypeModel : IEnumerable + { + [JsonProperty("fieldsets")] + internal IEnumerable Fieldsets { get; set; } + + public ArchetypeModel() + { + Fieldsets = new List(); + } + + public IEnumerator GetEnumerator() + { + return this.Fieldsets.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this.GetEnumerator(); + } + + internal string SerializeForPersistence() + { + var json = JObject.Parse(JsonConvert.SerializeObject(this)); + var propertiesToRemove = new String[] { "propertyEditorAlias", "dataTypeId", "dataTypeGuid" }; + + json.Descendants().OfType() + .Where(p => propertiesToRemove.Contains(p.Name)) + .ToList() + .ForEach(x => x.Remove()); + + return json.ToString(Formatting.None); + } + } +} diff --git a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValue.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValue.cs index 653af0e..08dd923 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValue.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValue.cs @@ -1,14 +1,14 @@ using System.Collections.Generic; using Newtonsoft.Json; -namespace Archetype.Umbraco.Models +namespace Archetype.Models { public class ArchetypePreValue { [JsonProperty("showAdvancedOptions")] - public bool ShowAdvancedOptions { get; set; } - - [JsonProperty("startWithAddButton")] + public bool ShowAdvancedOptions { get; set; } + + [JsonProperty("startWithAddButton")] public bool StartWithAddButton { get; set; } [JsonProperty("hideFieldsetToolbar")] diff --git a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueFieldset.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueFieldset.cs index 251203a..b65683b 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueFieldset.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueFieldset.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Newtonsoft.Json; -namespace Archetype.Umbraco.Models +namespace Archetype.Models { public class ArchetypePreValueFieldset { diff --git a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs index e2cc12b..09cf236 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePreValueProperty.cs @@ -1,7 +1,7 @@ -using System; +using System; using Newtonsoft.Json; -namespace Archetype.Umbraco.Models +namespace Archetype.Models { public class ArchetypePreValueProperty { @@ -31,5 +31,8 @@ namespace Archetype.Umbraco.Models [JsonProperty("required")] public bool Required { get; set; } + + [JsonProperty("regEx")] + public string RegEx { get; set; } } } \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/Models/Property.cs b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePropertyModel.cs similarity index 97% rename from app/Umbraco/Umbraco.Archetype/Models/Property.cs rename to app/Umbraco/Umbraco.Archetype/Models/ArchetypePropertyModel.cs index a3c4522..cd3b1ff 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Property.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/ArchetypePropertyModel.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Umbraco.Core; @@ -7,10 +7,9 @@ using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.PropertyEditors; using Umbraco.Web; -namespace Archetype.Umbraco.Models +namespace Archetype.Models { - public class Property - { + public class ArchetypePropertyModel { [JsonProperty("alias")] public string Alias { get; internal set; } @@ -28,9 +27,6 @@ namespace Archetype.Umbraco.Models public T GetValue() { - // If the value is of type T, just return it - if (Value is T) - return (T)Value; // Try Umbraco's PropertyValueConverters var converters = UmbracoContext.Current != null ? PropertyValueConvertersResolver.Current.Converters : Enumerable.Empty(); @@ -41,6 +37,10 @@ namespace Archetype.Umbraco.Models return convertedAttempt.Result; } + // If the value is of type T, just return it + if (Value is T) + return (T)Value; + // No PropertyValueConverters matched, so try a regular type conversion var convertAttempt2 = Value.TryConvertTo(); if (convertAttempt2.Success) diff --git a/app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs b/app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs index 2f3ebe8..b2449a1 100644 --- a/app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs +++ b/app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; -[assembly: AssemblyVersion("0.5.1")] -[assembly: AssemblyFileVersion("0.5.1-alpha")] \ No newline at end of file +[assembly: AssemblyVersion("1.2")] +[assembly: AssemblyFileVersion("1.2-beta")] diff --git a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs index 207056d..96b59c3 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs @@ -1,129 +1,48 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; -using Archetype.Umbraco.Extensions; -using Archetype.Umbraco.Models; -using Newtonsoft.Json; +using Archetype.Extensions; +using Archetype.Models; +using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.PublishedContent; -using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; -using umbraco.interfaces; + +namespace Archetype.PropertyConverters +{ + [PropertyValueType(typeof(Models.ArchetypeModel))] + [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)] + public class ArchetypeValueConverter : PropertyValueConverterBase + { -namespace Archetype.Umbraco.PropertyConverters -{ - /* based on the Tim Geyssens sample at: https://github.com/TimGeyssens/MatrixPropEditor/blob/master/SamplePropertyValueConverter/SamplePropertyValueConverter/MatrixValueConverter.cs */ - [PropertyValueType(typeof(Archetype.Umbraco.Models.Archetype))] - [PropertyValueCache(PropertyCacheValue.All, PropertyCacheLevel.Content)] - public class ArchetypeValueConverter : PropertyValueConverterBase - { - protected JsonSerializerSettings _jsonSettings; - - public ArchetypeValueConverter() - { - var dcr = new Newtonsoft.Json.Serialization.DefaultContractResolver(); - dcr.DefaultMembersSearchFlags |= System.Reflection.BindingFlags.NonPublic; - - _jsonSettings = new JsonSerializerSettings { ContractResolver = dcr }; - } - - public ServiceContext Services - { - get { return ApplicationContext.Current.Services; } - } - - public override bool IsConverter(PublishedPropertyType propertyType) - { - return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias); - } - - public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) - { - var defaultValue = new Models.Archetype(); - - if (source == null) - return defaultValue; - - var sourceString = source.ToString(); - - if (sourceString.DetectIsJson()) - { - try - { - // Deserialize value to archetype model - var archetype = JsonConvert.DeserializeObject(sourceString, _jsonSettings); - - try - { - // Get list of configured properties and their types - // and map them to the deserialized archetype model - var dataTypeCache = new Dictionary(); - var preValue = GetArchetypePreValueFromDataTypeId(propertyType.DataTypeId, dataTypeCache); - foreach (var fieldset in preValue.Fieldsets) - { - var fieldsetAlias = fieldset.Alias; - foreach (var fieldsetInst in archetype.Fieldsets.Where(x => x.Alias == fieldsetAlias)) - { - foreach (var property in fieldset.Properties) - { - var propertyAlias = property.Alias; - foreach (var propertyInst in fieldsetInst.Properties.Where(x => x.Alias == propertyAlias)) - { - propertyInst.DataTypeId = GetDataTypeByGuid(property.DataTypeGuid).Id; - propertyInst.PropertyEditorAlias = property.PropertyEditorAlias; - } - } - } - } - } - catch (Exception ex) - { - } - - return archetype; - } - catch (Exception ex) - { - return defaultValue; - } - } - - return defaultValue; + public ServiceContext Services + { + get { return ApplicationContext.Current.Services; } } - private ArchetypePreValue GetArchetypePreValueFromDataTypeId(int dataTypeId, IDictionary dataTypeCache) + public override bool IsConverter(PublishedPropertyType propertyType) { - return ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem( - Constants.CacheKey_PreValueFromDataTypeId + dataTypeId, - () => - { - var preValues = Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dataTypeId); - - var configJson = preValues.IsDictionaryBased - ? preValues.PreValuesAsDictionary[Constants.PreValueAlias].Value - : preValues.PreValuesAsArray.First().Value; - - var config = JsonConvert.DeserializeObject(configJson, _jsonSettings); - - foreach (var fieldset in config.Fieldsets) - { - foreach (var property in fieldset.Properties) - { - property.PropertyEditorAlias = GetDataTypeByGuid(property.DataTypeGuid).PropertyEditorAlias; - } - } - - return config; - - }) as ArchetypePreValue; - } - - private IDataTypeDefinition GetDataTypeByGuid(Guid guid) - { - return (IDataTypeDefinition) ApplicationContext.Current.ApplicationCache.RuntimeCache.GetCacheItem( - Constants.CacheKey_DataTypeByGuid + guid, - () => Services.DataTypeService.GetDataTypeDefinitionById(guid)); + return propertyType.PropertyEditorAlias.Equals(Constants.PropertyEditorAlias); } - } -} + + public override object ConvertDataToSource(PublishedPropertyType propertyType, object source, bool preview) + { + var defaultValue = new Models.ArchetypeModel(); + + if (source == null) + return defaultValue; + + var sourceString = source.ToString(); + + if (!sourceString.DetectIsJson()) + return defaultValue; + + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(source.ToString(), + (propertyType != null ? propertyType.DataTypeId : -1)); + + return archetype; + } + } +} \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs new file mode 100644 index 0000000..e847ce8 --- /dev/null +++ b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Archetype.Extensions; +using ClientDependency.Core; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; +using Umbraco.Web.PropertyEditors; +using Umbraco.Core.Logging; + +namespace Archetype.PropertyEditors +{ + [PropertyEditorAsset(ClientDependencyType.Javascript, "/App_Plugins/Archetype/js/archetype.js")] + [PropertyEditor("Imulus.Archetype", "Archetype", "/App_Plugins/Archetype/views/archetype.html", ValueType = "JSON")] + public class ArchetypePropertyEditor : PropertyEditor + { + #region Pre Value Editor + + protected override PreValueEditor CreatePreValueEditor() + { + return new ArchetypePreValueEditor(); + } + + internal class ArchetypePreValueEditor : PreValueEditor + { + [PreValueField("archetypeConfig", "Config", "/App_Plugins/Archetype/views/archetype.config.html", + Description = "(Required) Describe your Archetype.")] + public string Config { get; set; } + + [PreValueField("hideLabel", "Hide Label", "boolean", + Description = "Hide the Umbraco property title and description, making the Archetype span the entire page width")] + public bool HideLabel { get; set; } + } + + #endregion + + #region Value Editor + + protected override PropertyValueEditor CreateValueEditor() + { + return new ArchetypePropertyValueEditor(base.CreateValueEditor()); + } + + internal class ArchetypePropertyValueEditor : PropertyValueEditorWrapper + { + protected JsonSerializerSettings _jsonSettings; + + public ArchetypePropertyValueEditor(PropertyValueEditor wrapped) + : base(wrapped) { } + + public override string ConvertDbToString(Property property, PropertyType propertyType, IDataTypeService dataTypeService) + { + if (property.Value == null || property.Value.ToString() == "") + return string.Empty; + + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId); + + foreach (var fieldset in archetype.Fieldsets) + { + foreach (var propDef in fieldset.Properties) + { + try + { + var dtd = dataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid)); + var propType = new PropertyType(dtd) { Alias = propDef.Alias }; + var prop = new Property(propType, propDef.Value); + var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias); + propDef.Value = propEditor.ValueEditor.ConvertDbToString(prop, propType, dataTypeService); + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, ex); + } + } + } + + return archetype.SerializeForPersistence(); + } + + public override object ConvertDbToEditor(Property property, PropertyType propertyType, IDataTypeService dataTypeService) + { + if (property.Value == null || property.Value.ToString() == "") + return string.Empty; + + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(property.Value.ToString(), propertyType.DataTypeDefinitionId); + + foreach (var fieldset in archetype.Fieldsets) + { + foreach (var propDef in fieldset.Properties) + { + try + { + var dtd = dataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid)); + var propType = new PropertyType(dtd) { Alias = propDef.Alias }; + var prop = new Property(propType, propDef.Value); + var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias); + propDef.Value = propEditor.ValueEditor.ConvertDbToEditor(prop, propType, dataTypeService); + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, ex); + } + } + } + + return archetype; + } + public override object ConvertEditorToDb(ContentPropertyData editorValue, object currentValue) + { + if (editorValue.Value == null || editorValue.Value.ToString() == "") + return string.Empty; + + var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(editorValue.Value.ToString(), editorValue.PreValues); + + foreach (var fieldset in archetype.Fieldsets) + { + foreach (var propDef in fieldset.Properties) + { + try + { + var dtd = ApplicationContext.Current.Services.DataTypeService.GetDataTypeDefinitionById(Guid.Parse(propDef.DataTypeGuid)); + var preValues = ApplicationContext.Current.Services.DataTypeService.GetPreValuesCollectionByDataTypeId(dtd.Id); + var propData = new ContentPropertyData(propDef.Value, preValues, new Dictionary()); + var propEditor = PropertyEditorResolver.Current.GetByAlias(dtd.PropertyEditorAlias); + propDef.Value = propEditor.ValueEditor.ConvertEditorToDb(propData, propDef.Value); + } + catch (Exception ex) + { + LogHelper.Error(ex.Message, ex); + } + } + } + + return archetype.SerializeForPersistence(); + } + } + + #endregion + } +} diff --git a/app/Umbraco/Umbraco.Archetype/app.config b/app/Umbraco/Umbraco.Archetype/app.config new file mode 100644 index 0000000..4429813 --- /dev/null +++ b/app/Umbraco/Umbraco.Archetype/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/packages.config b/app/Umbraco/Umbraco.Archetype/packages.config index 85afbc7..8da9da0 100644 --- a/app/Umbraco/Umbraco.Archetype/packages.config +++ b/app/Umbraco/Umbraco.Archetype/packages.config @@ -4,8 +4,8 @@ - - + + @@ -19,8 +19,8 @@ - + - + \ No newline at end of file diff --git a/app/controllers/controller.js b/app/controllers/controller.js index 9ceb769..b70426a 100644 --- a/app/controllers/controller.js +++ b/app/controllers/controller.js @@ -4,21 +4,20 @@ $scope.model.hideLabel = $scope.model.config.hideLabel == 1; //get a reference to the current form - var form = angularHelper.getCurrentForm($scope); + $scope.form = $scope.form || angularHelper.getCurrentForm($scope); //set the config equal to our prevalue config $scope.model.config = $scope.model.config.archetypeConfig; //ini the model $scope.model.value = $scope.model.value || getDefaultModel($scope.model.config); - - //ini the render model - $scope.archetypeRenderModel = {}; - initArchetypeRenderModel(); + init(); //helper to get $eval the labelTemplate $scope.getFieldsetTitle = function(fieldsetConfigModel, fieldsetIndex) { - var fieldset = $scope.archetypeRenderModel.fieldsets[fieldsetIndex]; + if(!fieldsetConfigModel) + return ""; + var fieldset = $scope.model.value.fieldsets[fieldsetIndex]; var fieldsetConfig = $scope.getConfigFieldsetByAlias(fieldset.alias); var template = fieldsetConfigModel.labelTemplate; @@ -44,7 +43,7 @@ cursor: "move", handle: ".handle", update: function (ev, ui) { - + $scope.setDirty(); }, stop: function (ev, ui) { @@ -61,28 +60,25 @@ if (typeof $index != 'undefined') { - $scope.archetypeRenderModel.fieldsets.splice($index + 1, 0, newFieldset); + $scope.model.value.fieldsets.splice($index + 1, 0, newFieldset); } else { - $scope.archetypeRenderModel.fieldsets.push(newFieldset); + $scope.model.value.fieldsets.push(newFieldset); } } + $scope.setDirty(); newFieldset.collapse = $scope.model.config.enableCollapsing ? true : false; $scope.focusFieldset(newFieldset); } } - //rather than splice the archetypeRenderModel, we're hiding this and cleaning onFormSubmitting $scope.removeRow = function ($index) { if ($scope.canRemove()) { if (confirm('Are you sure you want to remove this?')) { - $scope.archetypeRenderModel.fieldsets[$index].remove = true; - /* - Touches the model. Not sure why this is needed but without it the Digest doesn't run on a remove row. - */ - $scope.archetypeRenderModel = JSON.parse(JSON.stringify($scope.archetypeRenderModel)); + $scope.setDirty(); + $scope.model.value.fieldsets.splice($index, 1); } } } @@ -101,7 +97,8 @@ //helper that returns if an item can be removed $scope.canRemove = function () { - return countVisible() > 1 + return countVisible() > 1 + || ($scope.model.config.maxFieldsets == 1 && $scope.model.config.fieldsets.length > 1) || $scope.model.config.startWithAddButton; } @@ -115,15 +112,19 @@ $scope.showAddButton = function () { return $scope.model.config.startWithAddButton && countVisible() === 0; + ///&& $scope.model.config.fieldsets.length == 1; } //helper, ini the render model from the server (model.value) - function initArchetypeRenderModel() { - $scope.archetypeRenderModel = removeNulls($scope.model.value); + function init() { + $scope.model.value = removeNulls($scope.model.value); + addDefaultProperties($scope.model.value.fieldsets); + } - _.each($scope.archetypeRenderModel.fieldsets, function (fieldset) + function addDefaultProperties(fieldsets) + { + _.each(fieldsets, function (fieldset) { - fieldset.remove = false; fieldset.collapse = false; fieldset.isValid = true; }); @@ -144,6 +145,15 @@ return (typeof property !== 'undefined') ? property.value : ''; }; + $scope.isCollapsed = function(fieldset) + { + if(typeof fieldset.collapse === "undefined") + { + fieldset.collapse = true; + } + return fieldset.collapse; + } + //helper for expanding/collapsing fieldsets $scope.focusFieldset = function(fieldset){ fixDisableSelection(); @@ -159,13 +169,13 @@ iniState = fieldset.collapse; } - _.each($scope.archetypeRenderModel.fieldsets, function(fieldset){ + _.each($scope.model.value.fieldsets, function(fieldset){ fieldset.collapse = true; }); - if(!fieldset && $scope.archetypeRenderModel.fieldsets.length == 1 && $scope.archetypeRenderModel.fieldsets[0].remove == false) + if(!fieldset && $scope.model.value.fieldsets.length == 1) { - $scope.archetypeRenderModel.fieldsets[0].collapse = false; + $scope.model.value.fieldsets[0].collapse = false; return; } @@ -179,7 +189,7 @@ $scope.focusFieldset(); //developerMode helpers - $scope.archetypeRenderModel.toString = stringify; + $scope.model.value.toString = stringify; //encapsulate stringify (should be built into browsers, not sure of IE support) function stringify() { @@ -187,12 +197,12 @@ } //watch for changes - $scope.$watch('archetypeRenderModel', function (v) { + $scope.$watch('model.value', function (v) { if ($scope.model.config.developerMode) { console.log(v); if (typeof v === 'string') { - $scope.archetypeRenderModel = JSON.parse(v); - $scope.archetypeRenderModel.toString = stringify; + $scope.model.value = JSON.parse(v); + $scope.model.value.toString = stringify; } } }); @@ -200,64 +210,7 @@ //helper to count what is visible function countVisible() { - var count = 0; - - _.each($scope.archetypeRenderModel.fieldsets, function(fieldset){ - if (fieldset.remove == false) { - count++; - } - }); - - return count; - } - - //helper to sync the model to the renderModel - function syncModelToRenderModel() - { - $scope.model.value = { fieldsets: [] }; - - _.each($scope.archetypeRenderModel.fieldsets, function(fieldset){ - var cleanedFieldset = cleanFieldset(fieldset); - - if(cleanedFieldset){ - $scope.model.value.fieldsets.push(cleanedFieldset); - } - }); - } - - //helper to remove properties only used during editing that we don't want in the saved data - //also removes properties that are no longer in the config - function cleanFieldset(fieldset) - { - if (typeof fieldset != 'function' && !fieldset.remove){ - - var fieldsetConfig = $scope.getConfigFieldsetByAlias(fieldset.alias); - - //clone and clean - var tempFieldset = JSON.parse(JSON.stringify(fieldset)); - delete tempFieldset.remove; - delete tempFieldset.isValid; - delete tempFieldset.collapse; - - _.each(tempFieldset.properties, function(property, index){ - var propertyConfig = _.find(fieldsetConfig.properties, function(p){ - return property.alias == p.alias; - }); - - //just prune the property - if(propertyConfig){ - delete property.isValid; - } - else - { - //need to remove the whole property - tempFieldset.properties.splice(index, 1); - } - - }); - - return tempFieldset; - } + return $scope.model.value.fieldsets.length; } // helper to get initial model if none was provided @@ -270,7 +223,7 @@ //helper to add an empty fieldset to the render model function getEmptyRenderFieldset (fieldsetModel) { - return {alias: fieldsetModel.alias, remove: false, isValid: true, properties: []}; + return {alias: fieldsetModel.alias, collapse: false, isValid: true, properties: []}; } //helper to ensure no nulls make it into the model @@ -300,9 +253,9 @@ //helper to lookup validity when given a fieldsetIndex and property alias $scope.getPropertyValidity = function(fieldsetIndex, alias) { - if($scope.archetypeRenderModel.fieldsets[fieldsetIndex]) + if($scope.model.value.fieldsets[fieldsetIndex]) { - var property = _.find($scope.archetypeRenderModel.fieldsets[fieldsetIndex].properties, function(property){ + var property = _.find($scope.model.value.fieldsets[fieldsetIndex].properties, function(property){ return property.alias == alias; }); } @@ -310,22 +263,12 @@ return (typeof property == 'undefined') ? true : property.isValid; } - //sync things up on save - $scope.$on("formSubmitting", function (ev, args) { - - //test for form; may have to do this differently for nested archetypes - if(!form) - return; - - if(form.$invalid) - { - notificationsService.warning("Cannot Save Document", "The document could not be saved because of missing required fields.") + // helper to force the current form into the dirty state + $scope.setDirty = function () { + if($scope.form) { + $scope.form.$setDirty(); } - else - { - syncModelToRenderModel(); - } - }); + } //custom js if ($scope.model.config.customJsPath) { diff --git a/app/directives/archetypeproperty.js b/app/directives/archetypeproperty.js index a97955e..3579bd6 100644 --- a/app/directives/archetypeproperty.js +++ b/app/directives/archetypeproperty.js @@ -75,11 +75,10 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c //load in the DefaultPreValues for the PropertyEditor, if any var defaultConfigObj = {}; - if (propertyEditor.hasOwnProperty('defaultPreValues') && propertyEditor.defaultPreValues != null && propertyEditor.defaultPreValues.length > 0) { - _.each(propertyEditor.defaultPreValues, function(p) { - _.extend(defaultConfigObj, p) - }); + if (propertyEditor.hasOwnProperty('defaultPreValues') && propertyEditor.defaultPreValues != null) { + _.extend(defaultConfigObj, propertyEditor.defaultPreValues); } + var mergedConfig = _.extend(defaultConfigObj, config); loadView(pathToView, mergedConfig, defaultValue, alias, umbracoPropertyAlias, scope, element, ngModelCtrl); @@ -91,20 +90,29 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c function validate(renderModel){ var valid = true; - var activeFieldsets = renderModel.filter(function(fieldset) { - return !fieldset.remove; - }); - _.each(activeFieldsets, function(fieldset){ + _.each(renderModel, function(fieldset){ fieldset.isValid = true; _.each(fieldset.properties, function(property){ property.isValid = true; var propertyConfig = getPropertyByAlias(configFieldsetModel, property.alias); - if(propertyConfig && propertyConfig.required && (property.value == null || property.value === "")){ - fieldset.isValid = false; - property.isValid = false; - valid = false; + if (propertyConfig) { + if(propertyConfig.required && (property.value == null || property.value === "")) { + fieldset.isValid = false; + property.isValid = false; + valid = false; + } + // issue 116: RegEx validate property value + // Only validate the property value if anything has been entered - RegEx is considered a supplement to "required". + if (valid == true && propertyConfig.regEx && property.value) { + var regEx = new RegExp(propertyConfig.regEx); + if (regEx.test(property.value) == false) { + fieldset.isValid = false; + property.isValid = false; + valid = false; + } + } } }); }); @@ -125,6 +133,7 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c } //define the initial model and config + scope.form = scope.umbracoForm; scope.model = {}; scope.model.config = {}; @@ -148,8 +157,11 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c scope.$watch('model.value', function (newValue, oldValue) { scope.archetypeRenderModel.fieldsets[scope.fieldsetIndex].properties[renderModelPropertyIndex].value = newValue; - //trigger the validation pipeline - ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue); + // don't set the current value twice - this will keep Umbraco from prompting to discard changes immediately after saving + if (newValue != oldValue) { + //trigger the validation pipeline + ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue); + } }); element.html(data).show(); @@ -177,7 +189,8 @@ angular.module("umbraco.directives").directive('archetypeProperty', function ($c fieldset: '=', fieldsetIndex: '=', archetypeRenderModel: '=', - umbracoPropertyAlias: '=' + umbracoPropertyAlias: '=', + umbracoForm: '=' } } }); \ No newline at end of file diff --git a/app/langs/da-dk.js b/app/langs/da-dk.js index 923133f..2203673 100644 --- a/app/langs/da-dk.js +++ b/app/langs/da-dk.js @@ -27,6 +27,7 @@ "defaultValue": "Standard værdi", "dataType": "Datatype", "required": "Påkrævet", + "regEx": "RegEx validering", "properties": "Egenskaber", "labelTemplate": "Label skabelon", "select": "Vælg", diff --git a/app/langs/de-de.js b/app/langs/de-de.js index 7446d25..00aaaf6 100644 --- a/app/langs/de-de.js +++ b/app/langs/de-de.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/en-gb.js b/app/langs/en-gb.js index 7f0fe80..404398f 100644 --- a/app/langs/en-gb.js +++ b/app/langs/en-gb.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/en-us.js b/app/langs/en-us.js index 7446d25..00aaaf6 100644 --- a/app/langs/en-us.js +++ b/app/langs/en-us.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/es-es.js b/app/langs/es-es.js index 7446d25..00aaaf6 100644 --- a/app/langs/es-es.js +++ b/app/langs/es-es.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/fr-fr.js b/app/langs/fr-fr.js index 7446d25..00aaaf6 100644 --- a/app/langs/fr-fr.js +++ b/app/langs/fr-fr.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/he-il.js b/app/langs/he-il.js index 7446d25..00aaaf6 100644 --- a/app/langs/he-il.js +++ b/app/langs/he-il.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/it-it.js b/app/langs/it-it.js index 7446d25..00aaaf6 100644 --- a/app/langs/it-it.js +++ b/app/langs/it-it.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/ja-jp.js b/app/langs/ja-jp.js index 7446d25..00aaaf6 100644 --- a/app/langs/ja-jp.js +++ b/app/langs/ja-jp.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/ko-kr.js b/app/langs/ko-kr.js index 7446d25..00aaaf6 100644 --- a/app/langs/ko-kr.js +++ b/app/langs/ko-kr.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/nb-no.js b/app/langs/nb-no.js index 7446d25..00aaaf6 100644 --- a/app/langs/nb-no.js +++ b/app/langs/nb-no.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/nl-nl.js b/app/langs/nl-nl.js index 7446d25..00aaaf6 100644 --- a/app/langs/nl-nl.js +++ b/app/langs/nl-nl.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/pl-pl.js b/app/langs/pl-pl.js index 7446d25..00aaaf6 100644 --- a/app/langs/pl-pl.js +++ b/app/langs/pl-pl.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/pt-br.js b/app/langs/pt-br.js index 7446d25..00aaaf6 100644 --- a/app/langs/pt-br.js +++ b/app/langs/pt-br.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/ru-ru.js b/app/langs/ru-ru.js index 7446d25..00aaaf6 100644 --- a/app/langs/ru-ru.js +++ b/app/langs/ru-ru.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/sv-se.js b/app/langs/sv-se.js index 7446d25..00aaaf6 100644 --- a/app/langs/sv-se.js +++ b/app/langs/sv-se.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/langs/zh-cn.js b/app/langs/zh-cn.js index 7446d25..00aaaf6 100644 --- a/app/langs/zh-cn.js +++ b/app/langs/zh-cn.js @@ -27,6 +27,7 @@ "defaultValue": "Default Value", "dataType": "DataType", "required": "Required", + "regEx": "RegEx Validation", "properties": "Properties", "labelTemplate": "Label Template", "select": "Select", diff --git a/app/less/archetype.less b/app/less/archetype.less index 215aac8..0fa2209 100644 --- a/app/less/archetype.less +++ b/app/less/archetype.less @@ -1,5 +1,9 @@ .archetypeEditor { width: 98%; + + .dropdown-menu { + top: auto; + } } .archetypeEditor fieldset{ @@ -24,8 +28,18 @@ } } + .dropdown-menu { + padding: 0; + border-radius: 0; + box-shadow: none; + margin-top: -10px; + margin-left: -200px; + } + span { font-weight: bold; + + &.menu-label { font-weight: normal; } } label:hover { diff --git a/app/views/archetype.config.html b/app/views/archetype.config.html index 5f769b1..cebb76c 100644 --- a/app/views/archetype.config.html +++ b/app/views/archetype.config.html @@ -64,6 +64,10 @@ +
+ + +
diff --git a/app/views/archetype.html b/app/views/archetype.html index bf31438..d86f456 100644 --- a/app/views/archetype.html +++ b/app/views/archetype.html @@ -1,38 +1,34 @@
- -
-
    -
  • - - {{fieldsetModel.label}} -
  • -
-
- -
diff --git a/config/meta.json b/config/meta.json index df9f7e5..e963137 100644 --- a/config/meta.json +++ b/config/meta.json @@ -1,6 +1,6 @@ { "name": "Archetype", - "version": "0.5.1-alpha", + "version": "1.0-beta", "url": "http://github.com/imulus/archetype/", "author": "Imulus", "authorUrl": "http://imulus.com/", diff --git a/config/package.manifest b/config/package.manifest deleted file mode 100644 index 3632228..0000000 --- a/config/package.manifest +++ /dev/null @@ -1,36 +0,0 @@ -{ - propertyEditors: [ - { - alias: "Imulus.Archetype", - name: "Archetype", - editor: { - view: "~/App_Plugins/Archetype/views/archetype.html", - valueType: "JSON" - }, - prevalues: { - fields: [ - { - label: "Config", - description: "(Required) Describe your Archetype.", - key: "archetypeConfig", - view: "/App_Plugins/Archetype/views/archetype.config.html", - validation: [ - { - type: "Required" - } - ] - }, - { - label: "Hide Label", - description: "Hide the Umbraco property title and description, making the Archetype span the entire page width", - key: "hideLabel", - view: "boolean" - } - ] - } - } - ], - javascript: [ - '~/App_Plugins/Archetype/js/archetype.js' - ] -} \ No newline at end of file