diff --git a/Gruntfile.js b/Gruntfile.js index e28eec5..8bbb3d9 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'] @@ -83,12 +78,6 @@ module.exports = function(grunt) { }, config: { files: [ - { - cwd: 'config/', - src: ['package.manifest'], - dest: '<%= basePath %>', - expand: true - }, { cwd: 'app/langs/', src: ['**'], diff --git a/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj b/app/Umbraco/Archetype.Tests/Archetype.Tests.csproj index e790eb8..f3082fc 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.1\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.1\lib\cms.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\controls.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\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.1\lib\Examine.dll ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll @@ -70,22 +74,24 @@ ..\packages\ImageProcessor.Web.3.2.1.0\lib\net45\ImageProcessor.Web.dll - + False - ..\packages\UmbracoCms.Core.7.1.0\lib\interfaces.dll + ..\packages\UmbracoCms.Core.7.1.1\lib\interfaces.dll False - ..\packages\UmbracoCms.Core.7.1.0\lib\log4net.dll + ..\packages\UmbracoCms.Core.7.1.1\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.1\lib\Microsoft.ApplicationBlocks.Data.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\Microsoft.Web.Helpers.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Microsoft.Web.Helpers.dll True @@ -103,24 +109,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.1\lib\SQLCE4Umbraco.dll True - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.dll + ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.dll True - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.Entity.dll + ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.Entity.dll @@ -163,39 +171,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.1\lib\TidyNet.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.DataLayer.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.editorControls.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Core.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.MacroEngines.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.DataLayer.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.providers.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.editorControls.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Web.UI.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.MacroEngines.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.XmlSerializers.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.providers.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\UmbracoExamine.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Web.UI.dll - - ..\packages\UmbracoCms.Core.7.1.0\lib\UrlRewritingNet.UrlRewriter.dll + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.XmlSerializers.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\UmbracoExamine.dll + + + False + ..\packages\UmbracoCms.Core.7.1.1\lib\UrlRewritingNet.UrlRewriter.dll 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..493b067 100644 --- a/app/Umbraco/Archetype.Tests/packages.config +++ b/app/Umbraco/Archetype.Tests/packages.config @@ -20,9 +20,9 @@ - + - + \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj b/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj index f821384..53469ca 100644 --- a/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj +++ b/app/Umbraco/Umbraco.Archetype/Archetype.Umbraco.csproj @@ -41,8 +41,7 @@ False - ..\packages\UmbracoCms.Core.7.1.0\lib\businesslogic.dll - False + ..\packages\UmbracoCms.Core.7.1.1\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.1\lib\cms.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\controls.dll - False + ..\packages\UmbracoCms.Core.7.1.1\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.1\lib\Examine.dll ..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll @@ -85,24 +81,20 @@ False - ..\packages\UmbracoCms.Core.7.1.0\lib\interfaces.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\interfaces.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\log4net.dll - False + ..\packages\UmbracoCms.Core.7.1.1\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.1\lib\Microsoft.ApplicationBlocks.Data.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\Microsoft.Web.Helpers.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\Microsoft.Web.Helpers.dll False @@ -121,22 +113,20 @@ False - ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll - False + ..\packages\Newtonsoft.Json.6.0.2\lib\net45\Newtonsoft.Json.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\SQLCE4Umbraco.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\SQLCE4Umbraco.dll - False - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.dll + True + ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.dll - False - ..\packages\UmbracoCms.Core.7.1.0\lib\System.Data.SqlServerCe.Entity.dll + True + ..\packages\UmbracoCms.Core.7.1.1\lib\System.Data.SqlServerCe.Entity.dll @@ -183,48 +173,37 @@ - ..\packages\UmbracoCms.Core.7.1.0\lib\TidyNet.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\TidyNet.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Core.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Core.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.DataLayer.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.DataLayer.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.editorControls.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.editorControls.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.MacroEngines.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.MacroEngines.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.providers.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.providers.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\Umbraco.Web.UI.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\Umbraco.Web.UI.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\umbraco.XmlSerializers.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\umbraco.XmlSerializers.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\UmbracoExamine.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\UmbracoExamine.dll - ..\packages\UmbracoCms.Core.7.1.0\lib\UrlRewritingNet.UrlRewriter.dll - False + ..\packages\UmbracoCms.Core.7.1.1\lib\UrlRewritingNet.UrlRewriter.dll @@ -242,8 +221,10 @@ + + diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs index 29b203d..6517af7 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/ArchetypeHelper.cs @@ -1,15 +1,9 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Net.Mime; -using System.Text; -using System.Threading.Tasks; -using System.Web.Http.ModelBinding; using Archetype.Umbraco.Models; using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.PublishedContent; namespace Archetype.Umbraco.Extensions { @@ -28,6 +22,30 @@ namespace Archetype.Umbraco.Extensions _app = ApplicationContext.Current; } + internal Models.Archetype 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.Archetype(); + } + } + internal Models.Archetype DeserializeJsonToArchetype(string sourceJson, int dataTypeId) { try @@ -72,6 +90,14 @@ namespace Archetype.Umbraco.Extensions }) 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( @@ -96,6 +122,7 @@ namespace Archetype.Umbraco.Extensions 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; } diff --git a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs index 2232aa5..c9f3953 100644 --- a/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs +++ b/app/Umbraco/Umbraco.Archetype/Extensions/Extensions.cs @@ -1,4 +1,10 @@ -using Umbraco.Core; +using System; +using System.Web; +using System.Text; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using Umbraco.Core; +using Umbraco.Web; using Archetype.Umbraco.Models; namespace Archetype.Umbraco.Extensions diff --git a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs index 207e9f6..91763ff 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/Archetype.cs @@ -1,6 +1,9 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Archetype.Umbraco.Models { @@ -24,5 +27,18 @@ namespace Archetype.Umbraco.Models { 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/Property.cs b/app/Umbraco/Umbraco.Archetype/Models/Property.cs index a3c4522..902e434 100644 --- a/app/Umbraco/Umbraco.Archetype/Models/Property.cs +++ b/app/Umbraco/Umbraco.Archetype/Models/Property.cs @@ -28,9 +28,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 +38,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 7a33150..799f844 100644 --- a/app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs +++ b/app/Umbraco/Umbraco.Archetype/Properties/VersionInfo.cs @@ -1,4 +1,4 @@ using System.Reflection; -[assembly: AssemblyVersion("0.0.0.0")] -[assembly: AssemblyFileVersion("0.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.0")] +[assembly: AssemblyFileVersion("1.0-beta")] \ No newline at end of file diff --git a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs index f38a029..2f096d3 100644 --- a/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs +++ b/app/Umbraco/Umbraco.Archetype/PropertyConverters/ArchetypeValueConverter.cs @@ -1,13 +1,13 @@ using System; using System.Collections.Generic; -using System.Linq; -using Archetype.Umbraco.Extensions; -using Archetype.Umbraco.Models; -using Newtonsoft.Json; +using System.Linq; +using Archetype.Umbraco.Extensions; +using Archetype.Umbraco.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; namespace Archetype.Umbraco.PropertyConverters @@ -42,8 +42,7 @@ namespace Archetype.Umbraco.PropertyConverters var archetype = new ArchetypeHelper().DeserializeJsonToArchetype(source.ToString(), (propertyType != null ? propertyType.DataTypeId : -1)); - return archetype; + 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..e55ed1d --- /dev/null +++ b/app/Umbraco/Umbraco.Archetype/PropertyEditors/ArcheTypePropertyEditor.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Archetype.Umbraco.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; + +namespace Archetype.Umbraco.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) + { + 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); + } + } + + 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) + { + 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); + } + } + + 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) + { + 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); + } + } + + 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..d006ee4 100644 --- a/app/Umbraco/Umbraco.Archetype/packages.config +++ b/app/Umbraco/Umbraco.Archetype/packages.config @@ -19,8 +19,8 @@ - + - + \ No newline at end of file diff --git a/app/controllers/controller.js b/app/controllers/controller.js index 9ceb769..606a319 100644 --- a/app/controllers/controller.js +++ b/app/controllers/controller.js @@ -11,14 +11,11 @@ //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]; + var fieldset = $scope.model.value.fieldsets[fieldsetIndex]; var fieldsetConfig = $scope.getConfigFieldsetByAlias(fieldset.alias); var template = fieldsetConfigModel.labelTemplate; @@ -61,11 +58,11 @@ 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); } } @@ -74,15 +71,10 @@ } } - //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.model.value.fieldsets.splice($index, 1); } } } @@ -114,16 +106,20 @@ //helpers for determining if the add button should be shown $scope.showAddButton = function () { return $scope.model.config.startWithAddButton - && countVisible() === 0; + && countVisible() === 0 + && !$scope.model.config.enableMultipleFieldsets; } //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 +140,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 +164,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 +184,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 +192,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 +205,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 +218,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 +248,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,23 +258,6 @@ 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.") - } - else - { - syncModelToRenderModel(); - } - }); - //custom js if ($scope.model.config.customJsPath) { assetsService.loadJs($scope.model.config.customJsPath); diff --git a/app/directives/archetypeproperty.js b/app/directives/archetypeproperty.js index a97955e..7358cbd 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); diff --git a/app/views/archetype.html b/app/views/archetype.html index bf31438..5108680 100644 --- a/app/views/archetype.html +++ b/app/views/archetype.html @@ -1,5 +1,5 @@