private static ProductPart BuildProduct(string sku, decimal price) { var product = new ContentItem(); product.GetOrCreate <PricePart>(); product.Alter <PricePart>(p => p.Price = new Amount(price, Currency.USDollar)); product.GetOrCreate <ProductPart>(); product.Alter <ProductPart>(p => p.Sku = sku); return(product.As <ProductPart>()); }
private static ContentItem BuildProduct(decimal price) { var product = new ContentItem(); product.GetOrCreate <PricePart>(); product.Alter <PricePart>(p => p.Price = new Amount(price, Currency.Dollar)); return(product); }
public void ContentShouldOnlyContainParts() { var contentItem = new ContentItem(); contentItem.GetOrCreate <MyPart>(); contentItem.Alter <MyPart>(x => x.Text = "test"); var json = JsonConvert.SerializeObject(contentItem); Assert.Contains(@"""MyPart"":{""Text"":""test""}", json); }
public void ShouldAlterPart() { var contentItem = new ContentItem(); contentItem.GetOrCreate <MyPart>(); contentItem.Alter <MyPart>(x => x.Text = "test"); var json = JsonConvert.SerializeObject(contentItem); var contentItem2 = JsonConvert.DeserializeObject <ContentItem>(json); Assert.NotNull(contentItem2.Content.MyPart); Assert.Equal("test", (string)contentItem2.Content.MyPart.Text); }
public void ContentShouldStoreFields() { var contentItem = new ContentItem(); contentItem.GetOrCreate <MyPart>(); contentItem.Alter <MyPart>(x => x.Text = "test"); contentItem.Alter <MyPart>(x => { x.GetOrCreate <MyField>("myField"); x.Alter <MyField>("myField", f => f.Value = 123); }); var json = JsonConvert.SerializeObject(contentItem); Assert.Contains(@"""MyPart"":{""Text"":""test"",""myField"":{""Value"":123}}", json); }
public Task Cloning_GeneratesCorrectPropertiesWithPreviousClones(string lastCloneUrl, string urlName, string fullUrl, string expectedUrlName, string expectedFullUrl) { var contentItem = new ContentItem(); contentItem.CreatedUtc = DateTime.Now; contentItem.GetOrCreate <PageLocationPart>(); contentItem.Content.PageLocationPart.FullUrl = lastCloneUrl; var generator = new PageLocationClonePropertyGenerator(); var result = generator.GenerateClonedPageLocationProperties(urlName, fullUrl, new List <ContentItem> { contentItem }); Assert.Equal(expectedUrlName, result.UrlName); Assert.Equal(expectedFullUrl, result.FullUrl); return(Task.CompletedTask); }
public async Task UpdateEditorAsync(ContentItem contentItem, UpdateEditorContext context) { var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); if (contentTypeDefinition == null) return; dynamic contentShape = context.Shape; dynamic partsShape = context.ShapeFactory.Create("Zone", Arguments.Empty); contentShape.Zones["Parts"] = partsShape; foreach (var displayDriver in _displayDrivers) { try { var result = await displayDriver.UpdateEditorAsync(contentItem, context); if (result != null) { result.Apply(context); } } catch (Exception ex) { InvokeExtensions.HandleException(ex, Logger, displayDriver.GetType().Name, nameof(UpdateEditorAsync)); } } var partInfos = _contentPartDrivers.Select(x => x.GetPartInfo()).ToDictionary(x => x.PartName); foreach (var typePartDefinition in contentTypeDefinition.Parts) { ContentPartInfo partInfo; ContentPart part; if (partInfos.TryGetValue(typePartDefinition.PartDefinition.Name, out partInfo)) { // It's a well-known part type, bind the data to the model part = partInfo.Factory(typePartDefinition); } else { // Generic content part model (custom part) part = new ContentPart(); } part = contentItem.GetOrCreate(part.GetType(), () => new ContentPart(), typePartDefinition.Name) as ContentPart; // Create a custom shape to render all the part shapes into it dynamic typePartShape = context.ShapeFactory.Create("ContentPart_Edit", Arguments.Empty); typePartShape.ContentPart = part; typePartShape.ContentTypePartDefinition = typePartDefinition; var partPosition = typePartDefinition.Settings["Position"]?.ToString() ?? "before"; partsShape.Add(typePartShape, partPosition); partsShape[typePartDefinition.Name] = typePartShape; context.FindPlacement = (shape, differentiator, displayType) => new PlacementInfo { Location = $"Parts.{typePartDefinition.Name}" }; await _partDisplayDrivers.InvokeAsync(async contentDisplay => { var result = await contentDisplay.UpdateEditorAsync(part, typePartDefinition, context); if (result != null) { result.Apply(context); } }, Logger); foreach (var partFieldDefinition in typePartDefinition.PartDefinition.Fields) { var fieldName = partFieldDefinition.Name; var fieldPosition = partFieldDefinition.Settings["Position"]?.ToString() ?? "before"; context.FindPlacement = (shape, differentiator, displayType) => new PlacementInfo { Location = $"Parts.{typePartDefinition.Name}:{fieldPosition}" }; await _fieldDisplayDrivers.InvokeAsync(async contentDisplay => { var result = await contentDisplay.UpdateEditorAsync(part, partFieldDefinition, typePartDefinition, context); if (result != null) { result.Apply(context); } }, Logger); } } }
public async Task UpdateEditorAsync(ContentItem contentItem, UpdateEditorContext context) { var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); if (contentTypeDefinition == null) { return; } dynamic contentShape = context.Shape; dynamic partsShape = context.ShapeFactory.Create("Zone", Arguments.Empty); contentShape.Zones["Parts"] = partsShape; foreach (var displayDriver in _displayDrivers) { try { var result = await displayDriver.UpdateEditorAsync(contentItem, context); if (result != null) { result.Apply(context); } } catch (Exception ex) { InvokeExtensions.HandleException(ex, Logger, displayDriver.GetType().Name, nameof(UpdateEditorAsync)); } } foreach (var typePartDefinition in contentTypeDefinition.Parts) { ContentPart part; part = _contentPartFactory.CreateContentPart(typePartDefinition.Name) ?? new ContentPart(); part = contentItem.GetOrCreate(part.GetType(), () => new ContentPart(), typePartDefinition.Name) as ContentPart; // Create a custom shape to render all the part shapes into it dynamic typePartShape = context.ShapeFactory.Create("ContentPart_Edit", Arguments.Empty); typePartShape.ContentPart = part; typePartShape.ContentTypePartDefinition = typePartDefinition; var partPosition = typePartDefinition.Settings["Position"]?.ToString() ?? "before"; partsShape.Add(typePartShape, partPosition); partsShape[typePartDefinition.Name] = typePartShape; context.FindPlacement = (shape, differentiator, displayType) => new PlacementInfo { Location = $"Parts.{typePartDefinition.Name}" }; await _partDisplayDrivers.InvokeAsync(async contentDisplay => { var result = await contentDisplay.UpdateEditorAsync(part, typePartDefinition, context); if (result != null) { result.Apply(context); } }, Logger); foreach (var partFieldDefinition in typePartDefinition.PartDefinition.Fields) { var fieldName = partFieldDefinition.Name; var fieldPosition = partFieldDefinition.Settings["Position"]?.ToString() ?? "before"; context.FindPlacement = (shape, differentiator, displayType) => new PlacementInfo { Location = $"Parts.{typePartDefinition.Name}:{fieldPosition}" }; await _fieldDisplayDrivers.InvokeAsync(async contentDisplay => { var result = await contentDisplay.UpdateEditorAsync(part, partFieldDefinition, typePartDefinition, context); if (result != null) { result.Apply(context); } }, Logger); } } }
public async Task BuildEditorAsync(ContentItem contentItem, BuildEditorContext context) { var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(contentItem.ContentType); if (contentTypeDefinition == null) { return; } dynamic contentShape = context.Shape; dynamic partsShape = context.ShapeFactory.Create("Zone", Arguments.Empty); contentShape.Zones["Parts"] = partsShape; foreach (var displayDriver in _displayDrivers) { try { var result = await displayDriver.BuildEditorAsync(contentItem, context); if (result != null) { result.Apply(context); } } catch (Exception ex) { InvokeExtensions.HandleException(ex, Logger, displayDriver.GetType().Name, nameof(BuildEditorAsync)); } } var partInfos = _contentPartDrivers.Select(x => x.GetPartInfo()).ToDictionary(x => x.PartName); foreach (var typePartDefinition in contentTypeDefinition.Parts) { ContentPartInfo partInfo; ContentPart part; if (partInfos.TryGetValue(typePartDefinition.PartDefinition.Name, out partInfo)) { // It's a well-known part type, bind the data to the model part = partInfo.Factory(typePartDefinition); } else { // Generic content part model (custom part) part = new ContentPart(); } part = contentItem.GetOrCreate(part.GetType(), () => new ContentPart(), typePartDefinition.Name) as ContentPart; // Create a custom shape to render all the part shapes into it dynamic typePartShape = context.ShapeFactory.Create("ContentPart_Edit", Arguments.Empty); typePartShape.ContentPart = part; typePartShape.ContentTypePartDefinition = typePartDefinition; var partPosition = typePartDefinition.Settings["Position"]?.ToString() ?? "before"; partsShape.Add(typePartShape, partPosition); partsShape[typePartDefinition.Name] = typePartShape; context.FindPlacement = (shape, differentiator, displayType) => new PlacementInfo { Location = $"Parts.{typePartDefinition.Name}" }; await _partDisplayDrivers.InvokeAsync(async contentDisplay => { var result = await contentDisplay.BuildEditorAsync(part, typePartDefinition, context); if (result != null) { result.Apply(context); } }, Logger); foreach (var partFieldDefinition in typePartDefinition.PartDefinition.Fields) { var fieldName = partFieldDefinition.Name; var fieldPosition = partFieldDefinition.Settings["Position"]?.ToString() ?? "before"; context.FindPlacement = (shape, differentiator, displayType) => new PlacementInfo { Location = $"Parts.{typePartDefinition.Name}:{fieldPosition}" }; await _fieldDisplayDrivers.InvokeAsync(async contentDisplay => { var result = await contentDisplay.BuildEditorAsync(part, partFieldDefinition, typePartDefinition, context); if (result != null) { result.Apply(context); } }, Logger); } } }