Example #1
0
        public async Task BuildNavigationAsync(string name, NavigationBuilder builder)
        {
            var context = _httpContextAccessor.HttpContext;

            if (!String.Equals(name, "admin", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            var contentTypeDefinitions = _contentDefinitionManager.ListTypeDefinitions().OrderBy(d => d.Name);
            var contentTypes           = contentTypeDefinitions.Where(ctd => ctd.GetSettings <ContentTypeSettings>().Creatable).OrderBy(ctd => ctd.DisplayName);
            await builder.AddAsync(S["Content"], NavigationConstants.AdminMenuContentPosition, async content =>
            {
                content.AddClass("content").Id("content");
                await content.AddAsync(S["Content Items"], S["Content Items"].PrefixPosition(), async contentItems =>
                {
                    if (!await _authorizationService.AuthorizeContentTypeDefinitionsAsync(context.User, CommonPermissions.EditContent, contentTypes, _contentManager))
                    {
                        contentItems.Permission(Permissions.EditContent);
                    }

                    contentItems.Action(nameof(AdminController.List), typeof(AdminController).ControllerName(), new { area = "OrchardCore.Contents", contentTypeId = "" });
                    contentItems.LocalNav();
                });
            });

            var adminSettings = (await _siteService.GetSiteSettingsAsync()).As <AdminSettings>();

            if (adminSettings.DisplayNewMenu && contentTypes.Any())
            {
                await builder.AddAsync(S["New"], "-1", async newMenu =>
                {
                    newMenu.LinkToFirstChild(false).AddClass("new").Id("new");
                    foreach (var contentTypeDefinition in contentTypes)
                    {
                        var ci  = await _contentManager.NewAsync(contentTypeDefinition.Name);
                        var cim = await _contentManager.PopulateAspectAsync <ContentItemMetadata>(ci);
                        var createRouteValues = cim.CreateRouteValues;
                        createRouteValues.Add("returnUrl", _linkGenerator.GetPathByRouteValues(context, "", new
                        {
                            area       = "OrchardCore.Contents",
                            controller = "Admin",
                            action     = "List"
                        }));

                        if (createRouteValues.Any())
                        {
                            newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item
                                        .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues)
                                        .Permission(ContentTypePermissionsHelper.CreateDynamicPermission(ContentTypePermissionsHelper.PermissionTemplates[CommonPermissions.EditOwnContent.Name], contentTypeDefinition))
                                        );
                        }
                    }
                });
            }
        }
        public Task BuildNavigationAsync(MenuItem menuItem, NavigationBuilder builder, IEnumerable <IAdminNodeNavigationBuilder> treeNodeBuilders)
        {
            var node = menuItem as LinkAdminNode;

            if (node == null || String.IsNullOrEmpty(node.LinkText) || !node.Enabled)
            {
                return(Task.CompletedTask);
            }

            return(builder.AddAsync(new LocalizedString(node.LinkText, node.LinkText), async itemBuilder => {
                // Add the actual link
                itemBuilder.Url(node.LinkUrl);
                itemBuilder.Priority(node.Priority);
                itemBuilder.Position(node.Position);

                // Add adminNode's IconClass property values to menuItem.Classes.
                // Add them with a prefix so that later the shape template can extract them to use them on a <i> tag.
                node.IconClass?.Split(' ').ToList().ForEach(c => itemBuilder.AddClass("icon-class-" + c));

                // Let children build themselves inside this MenuItem
                // todo: this logic can be shared by all TreeNodeNavigationBuilders
                foreach (var childTreeNode in menuItem.Items)
                {
                    try
                    {
                        var treeBuilder = treeNodeBuilders.Where(x => x.Name == childTreeNode.GetType().Name).FirstOrDefault();
                        await treeBuilder.BuildNavigationAsync(childTreeNode, itemBuilder, treeNodeBuilders);
                    }
                    catch (Exception e)
                    {
                        _logger.LogError(e, "An exception occurred while building the '{MenuItem}' child Menu Item.", childTreeNode.GetType().Name);
                    }
                }
            }));
        }
        public async Task BuildNavigationAsync(MenuItem menuItem, NavigationBuilder builder, IEnumerable <IAdminNodeNavigationBuilder> treeNodeBuilders)
        {
            _node = menuItem as QueryAdminNode;

            if (_node == null || !_node.Enabled || String.IsNullOrEmpty(_node.QueryId))
            {
                return;
            }

            //  _contentType = _contentDefinitionManager.GetTypeDefinition(_node.ContentType);
            //    var taxonomyContentItem = await _contentManager.GetAsync(_node.ContentType);

            //var taxonomyTree= await  _taxonomyServices.BuildTaxonomyTree( _node.ContentType);
            var query = await _queryManager.GetQueryAsync(_node.QueryId);

            if (query == null)
            {
                _logger.LogError("Can't find The content type '{ContentType}' for list admin node.", _node.QueryId);
                return;
            }
            var parameters  = new Dictionary <string, object>();
            var queryResult = await _queryManager.ExecuteQueryAsync(query, parameters);

            if (_node.AddQueryIdAsParent)
            {
//                if (query == null)
//                {
//                    _logger.LogError("Can't find The content type '{ContentType}' for list admin node.", _node.QueryId);
//                }

                await builder.AddAsync(new LocalizedString(query.Name, query.Name), async listTypeMenu =>
                {
                    AddPrefixToClasses(_node.IconForParentLink).ForEach(c => listTypeMenu.AddClass(c));
                    //todo
//                    listTypeMenu.Permission(ContentTypePermissions.CreateDynamicPermission(
//                        ContentTypePermissions.PermissionTemplates[Contents.Permissions.EditContent.Name], taxonomyContentItem));
                    await AddContentItemsAsync(listTypeMenu, queryResult, _node.LinkMode);
                });
            }
            else
            {
                await AddContentItemsAsync(builder, queryResult, _node.LinkMode);
            }

            // Add external children
            foreach (var childNode in _node.Items)
            {
                try
                {
                    var treeBuilder = treeNodeBuilders.Where(x => x.Name == childNode.GetType().Name).FirstOrDefault();
                    await treeBuilder.BuildNavigationAsync(childNode, builder, treeNodeBuilders);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "An exception occurred while building the '{MenuItem}' child Menu Item.", childNode.GetType().Name);
                }
            }
        }
Example #4
0
        public async Task BuildNavigationAsync(MenuItem menuItem, NavigationBuilder builder, IEnumerable <IAdminNodeNavigationBuilder> treeNodeBuilders)
        {
            var node = menuItem as TaxonomyTermsAdminNode;

            if ((node == null) || (!node.Enabled))
            {
                return;
            }

            var taxonomy = await _contentManager.GetAsync(node.TaxonomyContentItemId, VersionOptions.Latest);

            if (taxonomy == null)
            {
                return;
            }

            //TODO this can move to a handler
            var taxonomyRootRouteValues = await _contentManager.PopulateAspectAsync <ContentItemMetadata>(taxonomy);

            var taxonomyRouteValues = new RouteValueDictionary
            {
                { "Area", "OrchardCore.Contents" },
                { "Controller", "Admin" },
                { "Action", "Display" },
                { "ContentItemId", taxonomy.ContentItemId }
            };

            var homeRoute       = (await _siteService.GetSiteSettingsAsync()).HomeRoute;
            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", taxonomy);

            var taxonomyDisplayText = await _liquidTemplatemanager.RenderAsync(node.TaxonomyDisplayPattern, NullEncoder.Default, templateContext);

            var termEntries = new List <TermMenuEntry>();

            PopulateTermEntries(termEntries, taxonomy.As <TaxonomyPart>().Terms, 0);

            await builder.AddAsync(new LocalizedString(taxonomyDisplayText, taxonomyDisplayText), async taxonomyRoot =>
            {
                //TODO this can route direct to taxonomy
                //var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(homeRouteContentItem.ContentType);
                taxonomyRoot.Action(taxonomyRootRouteValues.EditorRouteValues["Action"] as string, taxonomyRootRouteValues.EditorRouteValues["Controller"] as string, taxonomyRootRouteValues.EditorRouteValues);
                taxonomyRoot.Resource(taxonomy);
                taxonomyRoot.Priority(node.Priority);
                taxonomyRoot.Position(node.Position);
                taxonomyRoot.LocalNav();
                AddPrefixToClasses(node.IconForTree).ToList().ForEach(c => taxonomyRoot.AddClass(c));

                //taxonomyRoot.Permission(ContentTypePermissions.CreateDynamicPermission(
                //    ContentTypePermissions.PermissionTemplates[global::OrchardCore.Contents.Permissions.EditContent.Name], contentTypeDefinition));
                await BuildMenuLevels(taxonomyRoot, termEntries, 0, taxonomyRouteValues);
            });
        }
Example #5
0
        public async Task BuildNavigationAsync(MenuItem menuItem, NavigationBuilder builder, IEnumerable <IAdminNodeNavigationBuilder> treeNodeBuilders)
        {
            _node = menuItem as ListsAdminNode;

            if (_node == null || !_node.Enabled || String.IsNullOrEmpty(_node.ContentType))
            {
                return;
            }

            _contentType = _contentDefinitionManager.GetTypeDefinition(_node.ContentType);

            if (_node.AddContentTypeAsParent)
            {
                if (_contentType == null)
                {
                    _logger.LogError("Can't find The content type '{ContentType}' for list admin node.", _node.ContentType);
                }

                await builder.AddAsync(new LocalizedString(_contentType.DisplayName, _contentType.DisplayName), async listTypeMenu =>
                {
                    AddPrefixToClasses(_node.IconForParentLink).ForEach(c => listTypeMenu.AddClass(c));
                    listTypeMenu.Permission(ContentTypePermissions.CreateDynamicPermission(
                                                ContentTypePermissions.PermissionTemplates[Contents.Permissions.EditContent.Name], _contentType));
                    await AddContentItemsAsync(listTypeMenu);
                });
            }
            else
            {
                await AddContentItemsAsync(builder);
            }

            // Add external children
            foreach (var childNode in _node.Items)
            {
                try
                {
                    var treeBuilder = treeNodeBuilders.Where(x => x.Name == childNode.GetType().Name).FirstOrDefault();
                    await treeBuilder.BuildNavigationAsync(childNode, builder, treeNodeBuilders);
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "An exception occurred while building the '{MenuItem}' child Menu Item.", childNode.GetType().Name);
                }
            }
        }
Example #6
0
        public async Task BuildNavigationAsync(string name, NavigationBuilder builder)
        {
            if (!String.Equals(name, "admin", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            var contentTypeDefinitions = _contentDefinitionManager.ListTypeDefinitions().OrderBy(d => d.Name);

            builder.Add(T["Content"], "1.4", content => content
                        .AddClass("content").Id("content")
                        .Add(T["Content Items"], "1", contentItems => contentItems
                             .Permission(Permissions.EditOwnContent)
                             .Action("List", "Admin", new { area = "OrchardCore.Contents" })
                             .LocalNav())
                        );

            var contentTypes = contentTypeDefinitions.Where(ctd => ctd.Settings.ToObject <ContentTypeSettings>().Creatable).OrderBy(ctd => ctd.DisplayName);

            if (contentTypes.Any())
            {
                await builder.AddAsync(T["New"], "-1", async newMenu =>
                {
                    newMenu.LinkToFirstChild(false).AddClass("new").Id("new");
                    foreach (var contentTypeDefinition in contentTypes)
                    {
                        var ci  = await _contentManager.NewAsync(contentTypeDefinition.Name);
                        var cim = await _contentManager.PopulateAspectAsync <ContentItemMetadata>(ci);
                        var createRouteValues = cim.CreateRouteValues;
                        if (createRouteValues.Any())
                        {
                            newMenu.Add(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName), "5", item => item
                                        .Action(cim.CreateRouteValues["Action"] as string, cim.CreateRouteValues["Controller"] as string, cim.CreateRouteValues)
                                        .Permission(Permissions.EditOwnContent)
                                        // Apply "PublishOwn" permission for the content type
                                        //.Permission(DynamicPermissions.CreateDynamicPermission(DynamicPermissions.PermissionTemplates[Permissions.PublishOwnContent.Name], contentTypeDefinition)
                                        );
                        }
                    }
                });
            }
        }
Example #7
0
        public async Task BuildNavigationAsync(MenuItem menuItem, NavigationBuilder builder, IEnumerable <IAdminNodeNavigationBuilder> treeNodeBuilders)
        {
            var node = menuItem as UrlTreeAdminNode;

            if ((node == null) || (!node.Enabled))
            {
                return;
            }

            //TODO cache (actually cache the levels.)
            var contentItems = (await _session
                                .Query <ContentItem>()
                                .With <AutoroutePartIndex>(o => o.Published)
                                .ListAsync()).ToList();


            var homeRoute = (await _siteService.GetSiteSettingsAsync()).HomeRoute;

            // Return on no homeroute.
            if (homeRoute == null)
            {
                return;
            }

            var homeRouteContentItemId = homeRoute[_options.ContentItemIdKey]?.ToString();

            if (String.IsNullOrEmpty(homeRouteContentItemId))
            {
                return;
            }

            var homeRouteContentItem = await _contentManager.GetAsync(homeRouteContentItemId);

            if (homeRouteContentItem == null)
            {
                return;
            }

            var homeRouteMetadata = await _contentManager.PopulateAspectAsync <ContentItemMetadata>(homeRouteContentItem);

            if (!homeRouteMetadata.AdminRouteValues.Any())
            {
                return;
            }
            // In case of lists, which use display
            homeRouteMetadata.AdminRouteValues["Action"] = "Edit";

            var templateContext = new TemplateContext();

            templateContext.SetValue("ContentItem", homeRouteContentItem);

            var rootMenuDisplayText = await _liquidTemplatemanager.RenderAsync(node.TreeRootDisplayPattern, NullEncoder.Default, templateContext);

            // In case of bad liquid.
            if (String.IsNullOrEmpty(rootMenuDisplayText))
            {
                _logger.LogError("Bad liquid root menu display text");
            }
            var segments = new List <ContentItemSegment2>();

            foreach (var ci in contentItems)
            {
                var part = ci.As <AutoroutePart>();
                var contentItemSegment = new ContentItemSegment2
                {
                    Segments    = part.Path.Contains("/") ? part.Path.Split('/') : new string[] { part.Path },
                    Path        = part.Path,
                    ContentItem = ci
                };
                segments.Add(contentItemSegment);
            }

            var levels = new List <Level>();

            await BuildLevels(levels, segments, node, 0);

            //TODO Dynamic string localization not supported yet.
            await builder.AddAsync(new LocalizedString(rootMenuDisplayText, rootMenuDisplayText), async urlTreeRoot =>
            {
                var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(homeRouteContentItem.ContentType);
                urlTreeRoot.Action(homeRouteMetadata.AdminRouteValues["Action"] as string, homeRouteMetadata.AdminRouteValues["Controller"] as string, homeRouteMetadata.AdminRouteValues);
                urlTreeRoot.Resource(homeRouteContentItem);
                urlTreeRoot.Priority(node.Priority);
                urlTreeRoot.Position(node.Position);
                urlTreeRoot.LocalNav();
                AddPrefixToClasses(node.IconForTree).ToList().ForEach(c => urlTreeRoot.AddClass(c));

                urlTreeRoot.Permission(ContentTypePermissions.CreateDynamicPermission(
                                           ContentTypePermissions.PermissionTemplates[global::OrchardCore.Contents.Permissions.EditContent.Name], contentTypeDefinition));
                await BuildMenuLevels(urlTreeRoot, levels);
            });
        }