public void Discover(ShapeTableBuilder builder) { builder.Describe("Layout") .OnDisplaying(displaying => { IShape layout = displaying.Shape; var httpContext = _httpContextAccessor.Current(); var routeValues = httpContext.Request.RequestContext.RouteData.Values; var controller = (string)routeValues["controller"]; if (controller == "SystemAdmin") { layout.Metadata.Alternates.Add("Layout__" + controller); } }); builder.Describe("Menu") .OnDisplaying(displaying => { IShape layout = displaying.Shape; var httpContext = _httpContextAccessor.Current(); var routeValues = httpContext.Request.RequestContext.RouteData.Values; var controller = (string)routeValues["controller"]; if (controller == "SystemAdmin") { layout.Metadata.Alternates.Add("Menu__" + controller); } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Parts_MenuWidget").OnDisplaying(context => { var contentItem = (ContentItem)context.Shape.ContentItem; var widgetPart = contentItem.As <WidgetPart>(); var menuWidgetPart = contentItem.As <MenuWidgetPart>(); var menuShape = context.Shape.Menu; var widgetName = widgetPart.Name.ToSafeName(); var menu = mMenuService.Value.GetMenu(menuWidgetPart.MenuContentItemId); var menuName = menu.As <TitlePart>().Title.ToSafeName(); var zoneName = widgetPart.Zone; if (!String.IsNullOrWhiteSpace(widgetName)) { context.ShapeMetadata.Alternates.Add($"Parts_MenuWidget__WidgetName__{widgetName}"); } context.ShapeMetadata.Alternates.Add($"Parts_MenuWidget__MenuName__{menuName}"); context.ShapeMetadata.Alternates.Add($"Parts_MenuWidget__MenuLevel__{menuWidgetPart.StartLevel}"); context.ShapeMetadata.Alternates.Add($"Parts_MenuWidget__MenuName__{menuName}__MenuLevel{menuWidgetPart.StartLevel}"); context.ShapeMetadata.Alternates.Add($"Parts_MenuWidget__Zone__{zoneName}"); context.ShapeMetadata.Alternates.Add($"Parts_MenuWidget__Zone__{zoneName}__MenuName__{menuName}"); menuShape.MenuWidget = contentItem; menuShape.SafeMenuName = menuName; }); builder.Describe("Menu").OnDisplaying(ConfigureMenuShape); builder.Describe("Breadcrumb").OnDisplaying(ConfigureMenuShape); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Post_Body_Editor") .OnDisplaying(displaying => { string flavor = displaying.Shape.EditorFlavor; displaying.ShapeMetadata.Alternates.Add("Post_Body_Editor__" + flavor); }); // We support multiple forum types, but need to be able to skin forum admin shapes, so add alternates for any content type that has a ForumPart. builder.Describe("Content").OnDisplaying(displaying => { var content = (ContentItem)displaying.Shape.ContentItem; if (content.Parts.All(x => x.PartDefinition.Name != typeof(ForumPart).Name)) { return; } var displayType = !String.IsNullOrWhiteSpace(displaying.ShapeMetadata.DisplayType) ? displaying.ShapeMetadata.DisplayType : "Detail"; var alternates = new[] { string.Format("Content__{0}", content.ContentType), string.Format("Content__{0}_{1}", content.ContentType, displayType), }; foreach (var alternate in alternates.Where(alternate => !displaying.ShapeMetadata.Alternates.Contains(alternate))) { displaying.ShapeMetadata.Alternates.Add(alternate); } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Parts_Comments") .OnDisplaying(shapeDisplayingContext => { var settings = this.orchardServices.WorkContext.CurrentSite.As <DisqusSettingsPart>(); shapeDisplayingContext.Shape.DisqusSettings = settings; shapeDisplayingContext.Shape.DisqusUniqueId = GetUniqueIdentifier(shapeDisplayingContext.Shape.ContentPart.ContentItem); shapeDisplayingContext.ShapeMetadata.Wrappers.Add("CommentsWrapper"); }); builder.Describe("Parts_Comments_Count") .OnDisplaying(shapeDisplayingContext => { var settings = this.orchardServices.WorkContext.CurrentSite.As <DisqusSettingsPart>(); shapeDisplayingContext.Shape.DisqusSettings = settings; shapeDisplayingContext.Shape.DisqusUniqueId = GetUniqueIdentifier(shapeDisplayingContext.Shape.ContentPart.ContentItem); shapeDisplayingContext.ShapeMetadata.Wrappers.Add("CountWrapper"); }); builder.Describe("Parts_Blogs_BlogPost_List") .OnDisplaying(shapeDisplayingContext => { var settings = this.orchardServices.WorkContext.CurrentSite.As <DisqusSettingsPart>(); shapeDisplayingContext.Shape.DisqusSettings = settings; shapeDisplayingContext.ShapeMetadata.Wrappers.Add("ListWrapper"); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("LogOn") .OnDisplaying(displaying => { var clientsData = _openAuthAuthenticationClients .Select(client => _orchardOpenAuthClientProvider.GetClientData(client.ProviderName)) .Where(x => x != null && x.IsWebSiteLoginEnabled) .ToList(); var shape = displaying.Shape; var metadata = displaying.ShapeMetadata; shape.ClientsData = clientsData; metadata.Type = "OpenAuthLogOn"; }); builder.Describe("Register") .OnDisplaying(displaying => { var clientsData = _openAuthAuthenticationClients .Select(client => _orchardOpenAuthClientProvider.GetClientData(client.ProviderName)) .Where(x => x != null && x.IsWebSiteLoginEnabled) .ToList(); var shape = displaying.Shape; var metadata = displaying.ShapeMetadata; shape.ClientsData = clientsData; metadata.Type = "OpenAuthRegister"; }); }
public void Discover(ShapeTableBuilder builder) { // hack: This is important when using the Input shape directly, but it doesn't come into play // when using a 'master' shape yet. builder.Describe("Input").Configure(descriptor => descriptor.Wrappers.Add("InputWrapper")); builder.Describe("SelectList").Configure(descriptor => descriptor.Wrappers.Add("InputWrapper")); builder.Describe("Textarea").Configure(descriptor => descriptor.Wrappers.Add("InputWrapper")); builder.Describe("Form").OnCreating(ctx => ctx.Create = () => new PropertiesAreItems()); builder.Describe("Fieldset").OnCreating(ctx => ctx.Create = () => new PropertiesAreItems()); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Table") .OnCreating(creating => { creating.Behaviors.Add(new RowHoldingBehavior(() => creating.New.Row())); }); builder.Describe("Row") .OnCreating(creating => { creating.Behaviors.Add(new CellHoldingBehavior(() => creating.New.Cell())); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Content").OnDisplaying(async context => { if (!context.Shape.Metadata.DisplayType.Contains("Admin")) { var contentItem = (ContentItem)((dynamic)context.Shape)["ContentItem"]; if (contentItem != null) { var authorizationService = context.ServiceProvider.GetService <IAuthorizationService>(); var httpContextAccessor = context.ServiceProvider.GetRequiredService <IHttpContextAccessor>(); if (await authorizationService.AuthorizeAsync(httpContextAccessor.HttpContext.User, Permissions.EditContent, contentItem)) { // context.Shape.Classes.Add("my-super-class-test"); // context.Shape.Attributes.Add(new KeyValuePair<string, string>("my-super-attribute-test","my-super-attribute-test-value")); ((dynamic)context.Shape).ContentItemTree = BuildContentItemTreeJson(contentItem); context.Shape.Metadata.Wrappers.Add("ContentShapeDiagnostics_ControlWrapper"); } } } }); builder.Describe("Content").OnProcessing(context => { if (!context.Shape.Metadata.DisplayType.Contains("Admin")) { // var contentItem = (ContentItem) ((dynamic) context.Shape)["ContentItem"]; // if (contentItem != null) // { // var authorizationService = context.ServiceProvider.GetService<IAuthorizationService>(); // var httpContextAccessor = context.ServiceProvider.GetRequiredService<IHttpContextAccessor>(); // if (await authorizationService.AuthorizeAsync(httpContextAccessor.HttpContext.User, // Permissions.EditContent, contentItem)) // { var shapeTree = BuildContentShapeTreeJson(context.Shape); // // var httpContextAccessor = context.ServiceProvider.GetRequiredService<IHttpContextAccessor>(); // httpContextAccessor.HttpContext.Items["ShapeTrees"] = shapeTree; ((dynamic)context.Shape).ContentShapeTree = shapeTree; // ((dynamic) context.Shape).ContentItemTree = BuildContentItemTreeJson(contentItem); //context.Shape.Metadata.Wrappers.Add("ContentShapeDiagnostics_ControlWrapper"); // } // } } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Search__Form") .OnDisplaying(context => { dynamic searchForm = context.Shape; }); builder.Describe("Search__Results") .OnDisplaying(context => { dynamic searchResults = context.Shape; }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Parts_Comments") .OnDisplaying(shapeDisplayingContext => AddShapeWrapper(shapeDisplayingContext, "Parts_Comments_Wrapper")); builder.Describe("Parts_Comments_Count") .OnDisplaying(shapeDisplayingContext => AddShapeWrapper(shapeDisplayingContext, "Parts_Comments_Count_Wrapper")); builder.Describe("Parts_Blogs_BlogPost_List") .OnDisplaying(shapeDisplayingContext => AddShapeWrapper(shapeDisplayingContext, "Parts_BlogPost_List_Wrapper", includeUniqueIndentifier: false)); }
public void Discover(ShapeTableBuilder builder) { builder .Describe("Elements_Snippet_Field_Design") .OnDisplaying(ctx => ctx.ShapeMetadata.Alternates.Add("Elements_Snippet_Field_Design__" + (string)ctx.Shape.Type)); builder .Describe("StockInfoSnippet") .OnDisplaying(ctx => { var apiSettings = mOrchardServices.Value.WorkContext.CurrentSite.As <ApiSiteSettingsPart>(); ctx.Shape.ApiUrl = apiSettings.ApiUrl; }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("AuditTrailEvent").OnDisplaying(context => { var record = (AuditTrailEventRecord)context.Shape.Record; if (record.Category != "Content") { return; } var eventData = (IDictionary <string, object>)context.Shape.EventData; var contentItemId = eventData.Get <int>("ContentId"); var previousContentItemVersionId = eventData.Get <int>("PreviousVersionId"); var previousVersionXml = eventData.GetXml("PreviousVersionXml"); var diffGram = eventData.GetXml("DiffGram"); var contentItem = _contentManager.Value.Get(contentItemId, VersionOptions.AllVersions); var previousVersion = previousContentItemVersionId > 0 ? _contentManager.Value.Get(contentItemId, VersionOptions.VersionRecord(previousContentItemVersionId)) : default(ContentItem); if (diffGram != null) { var diffNodes = _analyzer.Analyze(previousVersionXml, diffGram).ToArray(); context.Shape.DiffNodes = diffNodes; } context.Shape.ContentItemId = contentItemId; context.Shape.ContentItem = contentItem; context.Shape.PreviousVersion = previousVersion; }); builder.Describe("AuditTrailEventActions").OnDisplaying(context => { var record = (AuditTrailEventRecord)context.Shape.Record; if (record.Category != "Content") { return; } var eventData = (IDictionary <string, object>)context.Shape.EventData; var contentItemId = eventData.Get <int>("ContentId"); var previousContentItemVersionId = eventData.Get <int>("PreviousVersionId"); var contentItem = _contentManager.Value.Get(contentItemId, VersionOptions.AllVersions); var previousVersion = previousContentItemVersionId > 0 ? _contentManager.Value.Get(contentItemId, VersionOptions.VersionRecord(previousContentItemVersionId)) : default(ContentItem); context.Shape.ContentItemId = contentItemId; context.Shape.ContentItem = contentItem; context.Shape.PreviousVersion = previousVersion; }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Parts_Common_Body").OnDisplaying(displaying => { if (!displaying.ShapeMetadata.DisplayType.Contains("Admin")) { ContentItem contentItem = (ContentItem)displaying.Shape.ContentItem; // Model.ContentItem; //Mes customized var owner = contentItem.As <ICommonPart>().Owner; if (!string.Equals(owner.UserName, "admin", StringComparison.InvariantCultureIgnoreCase)) { BodyPart bodyPart = contentItem.As <BodyPart>(); var typePartSettings = bodyPart.Settings.GetModel <BodyTypePartSettings>(); var flavor = (typePartSettings != null && !string.IsNullOrWhiteSpace(typePartSettings.Flavor)) ? typePartSettings.Flavor : bodyPart.PartDefinition.Settings.GetModel <BodyPartSettings>().FlavorDefault; if (flavor != "markdown") { displaying.ShapeMetadata.Wrappers.Add("InlineEditing_Body_Wrapper"); } else { displaying.ShapeMetadata.Wrappers.Add("InlineEditing_BodyMarkdown_Wrapper"); } } } }); builder.Describe("Parts_Title").OnDisplaying(displaying => { if (!displaying.ShapeMetadata.DisplayType.Contains("Admin")) { displaying.ShapeMetadata.Wrappers.Add("InlineEditing_Title_Wrapper"); } }); builder.Describe("Widget").OnDisplaying(displaying => { if (!displaying.ShapeMetadata.DisplayType.Contains("Admin")) { displaying.ShapeMetadata.Wrappers.Remove("Widget_Wrapper"); displaying.ShapeMetadata.Wrappers.Add("InlineEditing_Widget_Wrapper"); } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Content") .OnDisplaying(displaying => { if (AdminFilter.IsApplied(new RequestContext(_workContext.GetContext().HttpContext, new RouteData()))) { return; } if (displaying.ShapeMetadata.DisplayType != "Detail") { return; } ContentItem contentItem = displaying.Shape.ContentItem; if (contentItem != null) { var wavePart = contentItem.As <WavePart>(); if (wavePart == null) { return; } displaying.ShapeMetadata.Wrappers.Add("Wave_Wrapper"); } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Price") .OnDisplaying(displaying => { displaying.ShapeMetadata.Alternates.Add("Parts_" + displaying.ShapeMetadata.DisplayType); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Content") .OnCreated(created => { var content = created.Shape; content.Child.Add(created.New.PlaceChildContent(Source: content)); }) .OnDisplaying(displaying => { ContentItem contentItem = displaying.Shape.ContentItem; if (contentItem != null) { // Alternates in order of specificity. // Display type > content type > specific content > display type for a content type > display type for specific content // BasicShapeTemplateHarvester.Adjust will then adjust the template name // Content__[DisplayType] e.g. Content-Summary displaying.ShapeMetadata.Alternates.Add("Content_" + EncodeAlternateElement(displaying.ShapeMetadata.DisplayType)); // Content__[ContentType] e.g. Content-BlogPost, displaying.ShapeMetadata.Alternates.Add("Content__" + EncodeAlternateElement(contentItem.ContentType)); // Content__[Id] e.g. Content-42, displaying.ShapeMetadata.Alternates.Add("Content__" + contentItem.Id); // Content_[DisplayType]__[ContentType] e.g. Content-BlogPost.Summary displaying.ShapeMetadata.Alternates.Add("Content_" + displaying.ShapeMetadata.DisplayType + "__" + EncodeAlternateElement(contentItem.ContentType)); // Content_[DisplayType]__[Id] e.g. Content-42.Summary displaying.ShapeMetadata.Alternates.Add("Content_" + displaying.ShapeMetadata.DisplayType + "__" + contentItem.Id); } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Media") .OnDisplaying(displaying => { ContentItem contentItem = displaying.Shape.ContentItem; if (contentItem != null) { // Alternates in order of specificity. // Display type > content type > specific content > display type for a content type > display type for specific content // BasicShapeTemplateHarvester.Adjust will then adjust the template name // Media__[DisplayType] e.g. Media-Summary displaying.ShapeMetadata.Alternates.Add("Media_" + EncodeAlternateElement(displaying.ShapeMetadata.DisplayType)); // Media__[ContentType] e.g. Media-BlogPost, displaying.ShapeMetadata.Alternates.Add("Media__" + EncodeAlternateElement(contentItem.ContentType)); // Media__[Id] e.g. Media-42, displaying.ShapeMetadata.Alternates.Add("Media__" + contentItem.Id); // Media_[DisplayType]__[ContentType] e.g. Media-Image.Summary displaying.ShapeMetadata.Alternates.Add("Media_" + displaying.ShapeMetadata.DisplayType + "__" + EncodeAlternateElement(contentItem.ContentType)); // Media_[DisplayType]__[Id] e.g. Media-42.Summary displaying.ShapeMetadata.Alternates.Add("Media_" + displaying.ShapeMetadata.DisplayType + "__" + contentItem.Id); } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Widget") .Configure(descriptor => { descriptor.Wrappers.Add("Widget_ControlWrapper"); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("ProductAttributesAdminListItem") .OnDisplaying(displaying => { displaying.ShapeMetadata.Alternates.Add("ProductAttributesLocalizationAdminListItem"); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Widget") .Configure(descriptor => { // todo: have "alternates" for chrome descriptor.Wrappers.Add("Widget_Wrapper"); descriptor.Wrappers.Add("Widget_ControlWrapper"); }) .OnCreated(created => { var widget = created.Shape; widget.Child.Add(created.New.PlaceChildContent(Source: widget)); }) .OnDisplaying(displaying => { var widget = displaying.Shape; widget.Classes.Add("widget"); ContentItem contentItem = displaying.Shape.ContentItem; if (contentItem != null) { widget.Classes.Add("widget-" + contentItem.ContentType.HtmlClassify()); var zoneName = contentItem.As <WidgetPart>().Zone; // Widget__[ZoneName] e.g. Widget-SideBar displaying.ShapeMetadata.Alternates.Add("Widget__" + zoneName); // Widget__[ContentType] e.g. Widget-BlogArchive displaying.ShapeMetadata.Alternates.Add("Widget__" + contentItem.ContentType); } }); }
public void Discover(ShapeTableBuilder builder) { var shapeAttributeOccurrences = new List <ShapeAttributeOccurrence>(); foreach (var shapeProvider in _shapeProviders) { var serviceType = shapeProvider.GetType(); foreach (var method in serviceType.GetMethods()) { var customAttributes = method.GetCustomAttributes(typeof(ShapeAttribute), false).OfType <ShapeAttribute>(); foreach (var customAttribute in customAttributes) { shapeAttributeOccurrences.Add(new ShapeAttributeOccurrence(customAttribute, method, serviceType)); } } } foreach (var iter in shapeAttributeOccurrences) { var occurrence = iter; var shapeType = occurrence.ShapeAttribute.ShapeType ?? occurrence.MethodInfo.Name; builder.Describe(shapeType) .From(_typeFeatureProvider.GetFeatureForDependency(occurrence.ServiceType)) .BoundAs( occurrence.MethodInfo.DeclaringType.FullName + "::" + occurrence.MethodInfo.Name, CreateDelegate(occurrence)); } }
private void ProcessPlacementFile(ShapeTableBuilder builder, FeatureDescriptor featureDescriptor, PlacementFile placementFile) { var feature = new Feature { Descriptor = featureDescriptor }; foreach (var entry in placementFile) { var shapeType = entry.Key; var matches = entry.Value; foreach (var filter in entry.Value) { var placement = new PlacementInfo(); placement.Location = filter.Location; placement.Alternates = filter.Alternates; placement.Wrappers = filter.Wrappers; placement.ShapeType = filter.ShapeType; builder.Describe(shapeType) .From(feature) .Placement(ctx => CheckFilter(ctx, filter), placement); } } }
public void Discover(ShapeTableBuilder builder) { builder.Describe("HeadScripts") .OnDisplaying(shapeDisplayingContext => { if (!_imagesLoadedService.GetAutoEnable()) { return; } if (!_imagesLoadedService.GetAutoEnableAdmin()) { var request = _workContext.Value.HttpContext.Request; if (AdminFilter.IsApplied(request.RequestContext)) { return; } } var resourceManager = _workContext.Value.Resolve <IResourceManager>(); var scripts = resourceManager.GetRequiredResources("script"); string includejs = "imagesLoaded"; var currentHighlight = scripts .Where(l => l.Name == includejs) .FirstOrDefault(); if (currentHighlight == null) { resourceManager.Require("script", includejs).AtFoot(); } }); }
private void ProcessPlacementFile(ShapeTableBuilder builder, IFeatureInfo featureDescriptor, PlacementFile placementFile) { foreach (var entry in placementFile) { var shapeType = entry.Key; var matches = entry.Value; foreach (var filter in entry.Value) { var placement = new PlacementInfo(); placement.Location = filter.Location; if (filter.Alternates?.Length > 0) { placement.Alternates = new AlternatesCollection(filter.Alternates); } if (filter.Wrappers?.Length > 0) { placement.Wrappers = new AlternatesCollection(filter.Wrappers); } placement.ShapeType = filter.ShapeType; builder.Describe(shapeType) .From(featureDescriptor) .Placement(ctx => CheckFilter(ctx, filter), placement); } } }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Content") .OnDisplaying(displaying => { displaying.ShapeMetadata.Wrappers.Add("Wrapper__Cw"); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("LogOn") .OnDisplaying(displaying => { displaying.Shape.ClientsData = GetClientData(); displaying.ShapeMetadata.Type = "OpenAuthLogOn"; }); builder.Describe("Register") .OnDisplaying(displaying => { displaying.Shape.ClientsData = GetClientData(); displaying.ShapeMetadata.Type = "OpenAuthRegister"; }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("HeadLinks") .OnDisplaying(shapeDisplayingContext => { var faviconUrl = _faviconService.GetFaviconUrl(); if (!string.IsNullOrWhiteSpace(faviconUrl)) { // Get the current favicon from head var resourceManager = _wca.GetContext().Resolve <IResourceManager>(); var links = resourceManager.GetRegisteredLinks(); var currentFavicon = links.FirstOrDefault(l => l.Rel == "shortcut icon" && l.Type == "image/x-icon"); // Modify if found if (currentFavicon != default(LinkEntry)) { currentFavicon.Href = faviconUrl; } else { // Add the new one resourceManager.RegisterLink(new LinkEntry { Type = "image/x-icon", Rel = "shortcut icon", Href = faviconUrl }); } } }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("RuleBasedMenuItem") .OnDisplaying(displaying => { dynamic menuItem = displaying.Shape; int level = menuItem.Level; ContentItem menuContentItem = menuItem.ContentItem; var encodedContentType = EncodeAlternateElement(menuContentItem.ContentItem.ContentType); var encodedContentItemId = EncodeAlternateElement(menuContentItem.ContentItem.ContentItemId); menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__level__" + level); // RuleBasedMenuItem__[ContentType] e.g. MenuItemLink-HtmlMenuItem // RuleBasedMenuItem__[ContentType]__level__[level] e.g. MenuItemLink-HtmlMenuItem-level-2 menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__" + encodedContentType); menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__" + encodedContentType + "__level__" + level); // RuleBasedMenuItem__[MenuName] e.g. MenuItemLink-Main-Menu // RuleBasedMenuItem__[MenuName]__level__[level] e.g. MenuItemLink-Main-Menu-level-2 menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__" + encodedContentItemId); menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__" + encodedContentItemId + "__level__" + level); // RuleBasedMenuItem__[MenuName]__[ContentType] e.g. MenuItemLink-Main-Menu-HtmlMenuItem // RuleBasedMenuItem__[MenuName]__[ContentType] e.g. MenuItemLink-Main-Menu-HtmlMenuItem-level-2 menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__" + encodedContentItemId + "__" + encodedContentType); menuItem.Metadata.Alternates.Add("RuleBasedMenuItem__" + encodedContentItemId + "__" + encodedContentType + "__level__" + level); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Price") .OnDisplaying(displaying => { displaying.ShapeMetadata.Alternates.Add("Price__Vat"); displaying.ShapeMetadata.Alternates.Add("Price_" + displaying.ShapeMetadata.DisplayType + "__Vat"); }); builder.Describe("ShoppingCart_CartItems") .OnDisplaying(displaying => { displaying.ShapeMetadata.Alternates.Add("ShoppingCart_CartItems__Vat"); }); builder.Describe("ShoppingCart_Widget") .OnDisplaying(displaying => { displaying.ShapeMetadata.Alternates.Add("ShoppingCart_Widget__Vat"); }); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Content") .OnDisplaying(async context => { if (context.Shape.Metadata.DisplayType == "Detail") { var httpContext = context.ServiceProvider.GetService <IHttpContextAccessor>().HttpContext; if (httpContext.Items.ContainsKey("IntelliLayout")) { string layout = httpContext.Items["IntelliLayout"].ToString(); //only add to alternates if name is not the default layout if (!string.IsNullOrEmpty(layout) && !String.Equals(layout, "Layout", StringComparison.OrdinalIgnoreCase)) { var layoutAccessor = context.DisplayContext.ServiceProvider.GetService <ILayoutAccessor>(); IShape layoutShape = await layoutAccessor.GetLayoutAsync(); layoutShape?.Metadata.Alternates.Add("Layout__" + layout); } } } } ); builder.Describe("Content_Edit") .OnDisplaying(async context => { // if (context.Shape.Metadata.DisplayType == "Detail") //in edit mode ther is not display type // { var httpContext = context.ServiceProvider.GetService <IHttpContextAccessor>().HttpContext; if (httpContext.Items.ContainsKey("IntelliLayout")) { string layout = httpContext.Items["IntelliLayout"].ToString(); //only add to alternates if name is not the default layout if (!string.IsNullOrEmpty(layout) && !String.Equals(layout, "Layout", StringComparison.OrdinalIgnoreCase)) { var layoutAccessor = context.DisplayContext.ServiceProvider.GetService <ILayoutAccessor>(); IShape layoutShape = await layoutAccessor.GetLayoutAsync(); layoutShape?.Metadata.Alternates.Add("Layout__" + layout); } // } } } ); }
public void Discover(ShapeTableBuilder builder) { builder.Describe("Parts_ProjectionPart") .OnDisplaying(displaying => { var shape = displaying.Shape; if (shape.List.Items.Count == 0) { shape.Metadata.Alternates.Add("Parts_ProjectionPart__Empty"); } }); }
public void Discover(ShapeTableBuilder builder) { foreach (var iter in _shapeAttributeOccurrences) { var occurrence = iter; var shapeType = occurrence.ShapeAttribute.ShapeType ?? occurrence.MethodInfo.Name; builder.Describe(shapeType) .From(occurrence.Feature) .BoundAs( occurrence.MethodInfo.DeclaringType.FullName + "::" + occurrence.MethodInfo.Name, descriptor => CreateDelegate(occurrence, descriptor)); } }
public void Discover(ShapeTableBuilder builder) { var availableFeatures = _extensionManager.AvailableFeatures(); var activeFeatures = availableFeatures.Where(FeatureIsEnabled); var activeExtensions = Once(activeFeatures); var hits = activeExtensions.SelectMany(extensionDescriptor => { var basePath = Path.Combine(extensionDescriptor.Location, extensionDescriptor.Id).Replace(Path.DirectorySeparatorChar, '/'); var virtualPath = Path.Combine(basePath, GetFolder()).Replace(Path.DirectorySeparatorChar, '/'); var shapes = _virtualPathProvider.ListFiles(virtualPath) .Select(Path.GetFileName) .Where(fileName => string.Equals(Path.GetExtension(fileName), GetFileExtension(), StringComparison.OrdinalIgnoreCase)) .Select(cssFileName => new { fileName = Path.GetFileNameWithoutExtension(cssFileName), fileVirtualPath = Path.Combine(virtualPath, cssFileName).Replace(Path.DirectorySeparatorChar, '/'), shapeType = GetShapePrefix() + GetAlternateShapeNameFromFileName(cssFileName), extensionDescriptor }); return shapes; }); foreach (var iter in hits) { var hit = iter; var featureDescriptors = hit.extensionDescriptor.Features.Where(fd => fd.Id == hit.extensionDescriptor.Id); foreach (var featureDescriptor in featureDescriptors) { builder.Describe(iter.shapeType) .From(new Feature {Descriptor = featureDescriptor}) .BoundAs( hit.fileVirtualPath, shapeDescriptor => displayContext => { var shape = ((dynamic) displayContext.Value); var output = displayContext.ViewContext.Writer; ResourceDefinition resource = shape.Resource; string condition = shape.Condition; Dictionary<string, string> attributes = shape.TagAttributes; ResourceManager.WriteResource(output, resource, hit.fileVirtualPath, condition, attributes); return null; }); } } }
public void Discover(ShapeTableBuilder builder) { Logger.Information("Start discovering shapes"); var harvesterInfos = _harvesters.Select(harvester => new { harvester, subPaths = harvester.SubPaths() }); var availableFeatures = _extensionManager.AvailableFeatures(); var activeFeatures = availableFeatures.Where(FeatureIsEnabled); var activeExtensions = Once(activeFeatures); var hits = _parallelCacheContext.RunInParallel(activeExtensions, extensionDescriptor => { Logger.Information("Start discovering candidate views filenames"); var pathContexts = harvesterInfos.SelectMany(harvesterInfo => harvesterInfo.subPaths.Select(subPath => { var basePath = Path.Combine(extensionDescriptor.Location, extensionDescriptor.Id).Replace(Path.DirectorySeparatorChar, '/'); var virtualPath = Path.Combine(basePath, subPath).Replace(Path.DirectorySeparatorChar, '/'); var fileNames = _cacheManager.Get(virtualPath, ctx => { if (!_virtualPathProvider.DirectoryExists(virtualPath)) return new List<string>(); if (!DisableMonitoring) { Logger.Debug("Monitoring virtual path \"{0}\"", virtualPath); ctx.Monitor(_virtualPathMonitor.WhenPathChanges(virtualPath)); } return _virtualPathProvider.ListFiles(virtualPath).Select(Path.GetFileName).ToReadOnlyCollection(); }); return new { harvesterInfo.harvester, basePath, subPath, virtualPath, fileNames }; })).ToList(); Logger.Information("Done discovering candidate views filenames"); var fileContexts = pathContexts.SelectMany(pathContext => _shapeTemplateViewEngines.SelectMany(ve => { var fileNames = ve.DetectTemplateFileNames(pathContext.fileNames); return fileNames.Select( fileName => new { fileName = Path.GetFileNameWithoutExtension(fileName), fileVirtualPath = Path.Combine(pathContext.virtualPath, fileName).Replace(Path.DirectorySeparatorChar, '/'), pathContext }); })); var shapeContexts = fileContexts.SelectMany(fileContext => { var harvestShapeInfo = new HarvestShapeInfo { SubPath = fileContext.pathContext.subPath, FileName = fileContext.fileName, TemplateVirtualPath = fileContext.fileVirtualPath }; var harvestShapeHits = fileContext.pathContext.harvester.HarvestShape(harvestShapeInfo); return harvestShapeHits.Select(harvestShapeHit => new { harvestShapeInfo, harvestShapeHit, fileContext }); }); return shapeContexts.Select(shapeContext => new { extensionDescriptor, shapeContext }).ToList(); }).SelectMany(hits2 => hits2); foreach (var iter in hits) { // templates are always associated with the namesake feature of module or theme var hit = iter; var featureDescriptors = iter.extensionDescriptor.Features.Where(fd => fd.Id == hit.extensionDescriptor.Id); foreach (var featureDescriptor in featureDescriptors) { Logger.Debug("Binding {0} as shape [{1}] for feature {2}", hit.shapeContext.harvestShapeInfo.TemplateVirtualPath, iter.shapeContext.harvestShapeHit.ShapeType, featureDescriptor.Id); builder.Describe(iter.shapeContext.harvestShapeHit.ShapeType) .From(new Feature { Descriptor = featureDescriptor }) .BoundAs( hit.shapeContext.harvestShapeInfo.TemplateVirtualPath, shapeDescriptor => displayContext => Render(shapeDescriptor, displayContext, hit.shapeContext.harvestShapeInfo, hit.shapeContext.harvestShapeHit)); } } Logger.Information("Done discovering shapes"); }
public void Discover(ShapeTableBuilder builder) { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Start discovering shapes"); } var harvesterInfos = _harvesters .Select(harvester => new { harvester, subPaths = harvester.SubPaths() }) .ToList(); var activeFeatures = _featureManager.GetEnabledFeaturesAsync().Result.ToList(); var activeExtensions = Once(activeFeatures).ToList(); var matcher = new Matcher(); foreach (var extension in _shapeTemplateViewEngines.SelectMany(x => x.TemplateFileExtensions)) { matcher.AddInclude(string.Format("*.{0}", extension)); } var hits = activeExtensions.Select(extensionDescriptor => { if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Start discovering candidate views filenames"); } var pathContexts = harvesterInfos.SelectMany(harvesterInfo => harvesterInfo.subPaths.Select(subPath => { var basePath = _fileSystem.Combine(extensionDescriptor.Location, extensionDescriptor.Id); var virtualPath = _fileSystem.Combine(basePath, subPath); var files = _fileSystem.ListFiles(virtualPath, matcher).ToReadOnlyCollection(); return new { harvesterInfo.harvester, basePath, subPath, virtualPath, files }; })).ToList(); if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Done discovering candidate views filenames"); } var fileContexts = pathContexts.SelectMany(pathContext => _shapeTemplateViewEngines.SelectMany(ve => { return pathContext.files.Select( file => new { fileName = Path.GetFileNameWithoutExtension(file.Name), fileVirtualPath = "~/" + _fileSystem.Combine(pathContext.virtualPath, file.Name), pathContext }); })); var shapeContexts = fileContexts.SelectMany(fileContext => { var harvestShapeInfo = new HarvestShapeInfo { SubPath = fileContext.pathContext.subPath, FileName = fileContext.fileName, TemplateVirtualPath = fileContext.fileVirtualPath }; var harvestShapeHits = fileContext.pathContext.harvester.HarvestShape(harvestShapeInfo); return harvestShapeHits.Select(harvestShapeHit => new { harvestShapeInfo, harvestShapeHit, fileContext }); }); return shapeContexts.Select(shapeContext => new { extensionDescriptor, shapeContext }).ToList(); }).SelectMany(hits2 => hits2); foreach (var iter in hits) { // templates are always associated with the namesake feature of module or theme var hit = iter; var featureDescriptors = iter.extensionDescriptor.Features.Where(fd => fd.Id == hit.extensionDescriptor.Id); foreach (var featureDescriptor in featureDescriptors) { if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug("Binding {0} as shape [{1}] for feature {2}", hit.shapeContext.harvestShapeInfo.TemplateVirtualPath, iter.shapeContext.harvestShapeHit.ShapeType, featureDescriptor.Id); } builder.Describe(iter.shapeContext.harvestShapeHit.ShapeType) .From(new Feature { Descriptor = featureDescriptor }) .BoundAs( hit.shapeContext.harvestShapeInfo.TemplateVirtualPath, shapeDescriptor => displayContext => RenderAsync(shapeDescriptor, displayContext, hit.shapeContext.harvestShapeInfo, hit.shapeContext.harvestShapeHit)); } } if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("Done discovering shapes"); } }
private void ProcessPlacementFile(ShapeTableBuilder builder, FeatureDescriptor featureDescriptor, PlacementFile placementFile) { var feature = new Feature { Descriptor = featureDescriptor }; // invert the tree into a list of leaves and the stack var entries = DrillDownShapeLocations(placementFile.Nodes, Enumerable.Empty<PlacementMatch>()); foreach (var entry in entries) { var shapeLocation = entry.Item1; var matches = entry.Item2; string shapeType; string differentiator; GetShapeType(shapeLocation, out shapeType, out differentiator); Func<ShapePlacementContext, bool> predicate = ctx => true; if (differentiator != "") { predicate = ctx => (ctx.Differentiator ?? "") == differentiator; } if (matches.Any()) { predicate = matches.SelectMany(match => match.Terms).Aggregate(predicate, BuildPredicate); } var placement = new PlacementInfo(); var segments = shapeLocation.Location.Split(';').Select(s => s.Trim()); foreach (var segment in segments) { if (!segment.Contains('=')) { placement.Location = segment; } else { var index = segment.IndexOf('='); var property = segment.Substring(0, index).ToLower(); var value = segment.Substring(index + 1); switch (property) { case "shape": placement.ShapeType = value; break; case "alternate": placement.Alternates = new[] { value }; break; case "wrapper": placement.Wrappers = new[] { value }; break; } } } builder.Describe(shapeType) .From(feature) .Placement(ctx => { var hit = predicate(ctx); // generate 'debugging' information to trace which file originated the actual location if (hit) { var virtualPath = featureDescriptor.Extension.Location + "/" + featureDescriptor.Extension.Id + "/Placement.info"; ctx.Source = virtualPath; } return hit; }, placement); } }
public void Discover(ShapeTableBuilder builder) { Logger.Information("开始发现形状"); var harvesterInfos = _harvesters.Select(harvester => new { harvester, subPaths = harvester.SubPaths() }); var availableFeatures = _extensionManager.AvailableFeatures(); var activeFeatures = availableFeatures.Where(FeatureIsEnabled); var activeExtensions = Once(activeFeatures); var hits = _parallelCacheContext.RunInParallel(activeExtensions, extensionDescriptor => { Logger.Information("开始发现候选视图文件名称"); var pathContexts = harvesterInfos.SelectMany(harvesterInfo => harvesterInfo.subPaths.Select(subPath => { var basePath = Path.Combine(extensionDescriptor.Location, extensionDescriptor.Id).Replace(Path.DirectorySeparatorChar, '/'); var virtualPath = Path.Combine(basePath, subPath).Replace(Path.DirectorySeparatorChar, '/'); var fileNames = _cacheManager.Get(virtualPath, ctx => { if (!_virtualPathProvider.DirectoryExists(virtualPath)) return new string[0]; if (!DisableMonitoring) { Logger.Debug("监控虚拟路径 \"{0}\"", virtualPath); ctx.Monitor(_virtualPathMonitor.WhenPathChanges(virtualPath)); } return _virtualPathProvider.ListFiles(virtualPath).Select(Path.GetFileName).ToArray(); }); return new { harvesterInfo.harvester, basePath, subPath, virtualPath, fileNames }; })).ToList(); Logger.Information("发现候选视图文件名称完成"); var fileContexts = pathContexts.SelectMany(pathContext => _shapeTemplateViewEngines.SelectMany(ve => { var fileNames = ve.DetectTemplateFileNames(pathContext.fileNames); return fileNames.Select( fileName => new { fileName = Path.GetFileNameWithoutExtension(fileName), fileVirtualPath = Path.Combine(pathContext.virtualPath, fileName).Replace(Path.DirectorySeparatorChar, '/'), pathContext }); })); var shapeContexts = fileContexts.SelectMany(fileContext => { var harvestShapeInfo = new HarvestShapeInfo { SubPath = fileContext.pathContext.subPath, FileName = fileContext.fileName, TemplateVirtualPath = fileContext.fileVirtualPath }; var harvestShapeHits = fileContext.pathContext.harvester.HarvestShape(harvestShapeInfo); return harvestShapeHits.Select(harvestShapeHit => new { harvestShapeInfo, harvestShapeHit, fileContext }); }); return shapeContexts.Select(shapeContext => new { extensionDescriptor, shapeContext }).ToList(); }).SelectMany(hits2 => hits2); foreach (var iter in hits) { //模板总是与模块或主题的同名特征相关联 var hit = iter; var featureDescriptors = iter.extensionDescriptor.Descriptor.Features.Where(fd => fd.Id == hit.extensionDescriptor.Id); foreach (var featureDescriptor in featureDescriptors) { Logger.Debug("为特性 {2} 绑定 {0} 到形状 [{1}]", hit.shapeContext.harvestShapeInfo.TemplateVirtualPath, iter.shapeContext.harvestShapeHit.ShapeType, featureDescriptor.Id); builder.Describe(iter.shapeContext.harvestShapeHit.ShapeType) .From(new Feature { Descriptor = featureDescriptor }) .BoundAs( hit.shapeContext.harvestShapeInfo.TemplateVirtualPath, shapeDescriptor => displayContext => Render(displayContext, hit.shapeContext.harvestShapeInfo)); } } Logger.Information("形状发现完成。"); }