Ejemplo n.º 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))
                                        );
                        }
                    }
                });
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> List(ListContentsViewModel model, PagerParameters pagerParameters, string contentTypeId = "")
        {
            var context = _httpContextAccessor.HttpContext;
            var contentTypeDefinitions = _contentDefinitionManager.ListTypeDefinitions()
                                         .Where(ctd => ctd.GetSettings <ContentTypeSettings>().Creatable&& ctd.GetSettings <ContentTypeSettings>().Enabled)
                                         .OrderBy(ctd => ctd.DisplayName);

            if (!await _authorizationService.AuthorizeContentTypeDefinitionsAsync(User, CommonPermissions.EditContent, contentTypeDefinitions, _contentManager))
            {
                return(Forbid());
            }

            var siteSettings = await _siteService.GetSiteSettingsAsync();

            var pager = new Pager(pagerParameters, siteSettings.PageSize);

            // This is used by the AdminMenus so needs to be passed into the options.
            if (!String.IsNullOrEmpty(contentTypeId))
            {
                model.Options.SelectedContentType = contentTypeId;
            }

            // Populate the creatable types.
            if (!String.IsNullOrEmpty(model.Options.SelectedContentType))
            {
                var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(model.Options.SelectedContentType);
                if (contentTypeDefinition == null)
                {
                    return(NotFound());
                }

                var creatableList = new List <SelectListItem>();

                // Allows non creatable types to be created by another admin page.
                if (contentTypeDefinition.GetSettings <ContentTypeSettings>().Creatable || model.Options.CanCreateSelectedContentType)
                {
                    creatableList.Add(new SelectListItem(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName).Value, contentTypeDefinition.Name));
                }

                model.Options.CreatableTypes = creatableList;
            }

            if (model.Options.CreatableTypes == null)
            {
                var creatableList = new List <SelectListItem>();
                if (contentTypeDefinitions.Any())
                {
                    foreach (var contentTypeDefinition in contentTypeDefinitions)
                    {
                        var contentItem = await _contentManager.NewAsync(contentTypeDefinition.Name);

                        contentItem.Owner = context.User.FindFirstValue(ClaimTypes.NameIdentifier);

                        if (await _authorizationService.AuthorizeAsync(context.User, CommonPermissions.EditContent, contentItem))
                        {
                            creatableList.Add(new SelectListItem(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName).Value, contentTypeDefinition.Name));
                        }
                    }
                }

                model.Options.CreatableTypes = creatableList;
            }

            // We populate the remaining SelectLists.
            model.Options.ContentStatuses = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = S["Latest"], Value = nameof(ContentsStatus.Latest)
                },
                new SelectListItem()
                {
                    Text = S["Published"], Value = nameof(ContentsStatus.Published)
                },
                new SelectListItem()
                {
                    Text = S["Unpublished"], Value = nameof(ContentsStatus.Draft)
                },
                new SelectListItem()
                {
                    Text = S["All versions"], Value = nameof(ContentsStatus.AllVersions)
                }
            };

            if (await _authorizationService.AuthorizeAsync(context.User, Permissions.ListContent))
            {
                model.Options.ContentStatuses.Insert(1, new SelectListItem()
                {
                    Text = S["Owned by me"], Value = nameof(ContentsStatus.Owner)
                });
            }

            model.Options.ContentSorts = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = S["Recently created"], Value = nameof(ContentsOrder.Created)
                },
                new SelectListItem()
                {
                    Text = S["Recently modified"], Value = nameof(ContentsOrder.Modified)
                },
                new SelectListItem()
                {
                    Text = S["Recently published"], Value = nameof(ContentsOrder.Published)
                },
                new SelectListItem()
                {
                    Text = S["Title"], Value = nameof(ContentsOrder.Title)
                }
            };

            model.Options.ContentsBulkAction = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = S["Publish Now"], Value = nameof(ContentsBulkAction.PublishNow)
                },
                new SelectListItem()
                {
                    Text = S["Unpublish"], Value = nameof(ContentsBulkAction.Unpublish)
                },
                new SelectListItem()
                {
                    Text = S["Delete"], Value = nameof(ContentsBulkAction.Remove)
                }
            };

            if ((String.IsNullOrEmpty(model.Options.SelectedContentType) || String.IsNullOrEmpty(contentTypeId)) && model.Options.ContentTypeOptions == null)
            {
                var listableTypes = new List <ContentTypeDefinition>();
                foreach (var ctd in _contentDefinitionManager.ListTypeDefinitions())
                {
                    if (ctd.GetSettings <ContentTypeSettings>().Listable)
                    {
                        var contentItem = await _contentManager.NewAsync(ctd.Name);

                        contentItem.Owner = context.User.FindFirstValue(ClaimTypes.NameIdentifier);
                        var authorized = await _authorizationService.AuthorizeAsync(User, CommonPermissions.EditContent, contentItem);

                        if (authorized)
                        {
                            listableTypes.Add(ctd);
                        }
                    }
                }

                var contentTypeOptions = listableTypes
                                         .Select(ctd => new KeyValuePair <string, string>(ctd.Name, ctd.DisplayName))
                                         .ToList().OrderBy(kvp => kvp.Value);

                model.Options.ContentTypeOptions = new List <SelectListItem>
                {
                    new SelectListItem()
                    {
                        Text = S["All content types"], Value = ""
                    }
                };

                foreach (var option in contentTypeOptions)
                {
                    model.Options.ContentTypeOptions.Add(new SelectListItem()
                    {
                        Text = option.Value, Value = option.Key, Selected = (option.Value == model.Options.SelectedContentType)
                    });
                }
            }

            // If ContentTypeOptions is not initialized by query string or by the code above, initialize it
            if (model.Options.ContentTypeOptions == null)
            {
                model.Options.ContentTypeOptions = new List <SelectListItem>();
            }

            // With the model populated we filter the query, allowing the filters to alter the model.
            var query = await _contentsAdminListQueryService.QueryAsync(model.Options, _updateModelAccessor.ModelUpdater);

            var maxPagedCount = siteSettings.MaxPagedCount;

            if (maxPagedCount > 0 && pager.PageSize > maxPagedCount)
            {
                pager.PageSize = maxPagedCount;
            }

            // We prepare the pager
            var routeData = new RouteData();

            routeData.Values.Add("DisplayText", model.Options.DisplayText);

            var pagerShape         = (await New.Pager(pager)).TotalItemCount(maxPagedCount > 0 ? maxPagedCount : await query.CountAsync()).RouteData(routeData);
            var pageOfContentItems = await query.Skip(pager.GetStartIndex()).Take(pager.PageSize).ListAsync();

            // We prepare the content items SummaryAdmin shape
            var contentItemSummaries = new List <dynamic>();

            foreach (var contentItem in pageOfContentItems)
            {
                contentItemSummaries.Add(await _contentItemDisplayManager.BuildDisplayAsync(contentItem, _updateModelAccessor.ModelUpdater, "SummaryAdmin"));
            }

            // Populate options pager summary values.
            var startIndex = (pagerShape.Page - 1) * (pagerShape.PageSize) + 1;

            model.Options.StartIndex        = startIndex;
            model.Options.EndIndex          = startIndex + contentItemSummaries.Count - 1;
            model.Options.ContentItemsCount = contentItemSummaries.Count;
            model.Options.TotalItemCount    = pagerShape.TotalItemCount;

            var header = await _contentOptionsDisplayManager.BuildEditorAsync(model.Options, _updateModelAccessor.ModelUpdater, false);

            var shapeViewModel = await _shapeFactory.CreateAsync <ListContentsViewModel>("ContentsAdminList", viewModel =>
            {
                viewModel.ContentItems = contentItemSummaries;
                viewModel.Pager        = pagerShape;
                viewModel.Options      = model.Options;
                viewModel.Header       = header;
            });

            return(View(shapeViewModel));
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> List(
            [ModelBinder(BinderType = typeof(ContentItemFilterEngineModelBinder), Name = "q")] QueryFilterResult <ContentItem> queryFilterResult,
            ContentOptionsViewModel options,
            PagerParameters pagerParameters,
            string contentTypeId = "")
        {
            var context = _httpContextAccessor.HttpContext;
            var contentTypeDefinitions = _contentDefinitionManager.ListTypeDefinitions()
                                         .Where(ctd => ctd.GetSettings <ContentTypeSettings>().Creatable)
                                         .OrderBy(ctd => ctd.DisplayName);

            if (!await _authorizationService.AuthorizeContentTypeDefinitionsAsync(User, CommonPermissions.EditContent, contentTypeDefinitions, _contentManager))
            {
                return(Forbid());
            }

            var siteSettings = await _siteService.GetSiteSettingsAsync();

            var pager = new Pager(pagerParameters, siteSettings.PageSize);

            // This is used by the AdminMenus so needs to be passed into the options.
            if (!String.IsNullOrEmpty(contentTypeId))
            {
                options.SelectedContentType = contentTypeId;
            }

            // The filter is bound seperately and mapped to the options.
            // The options must still be bound so that options that are not filters are still bound
            options.FilterResult = queryFilterResult;

            // Populate the creatable types.
            if (!String.IsNullOrEmpty(options.SelectedContentType))
            {
                // When the selected content type is provided via the route or options a placeholder node is used to apply a filter.
                options.FilterResult.TryAddOrReplace(new ContentTypeFilterNode(options.SelectedContentType));

                var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(options.SelectedContentType);
                if (contentTypeDefinition == null)
                {
                    return(NotFound());
                }

                var creatableList = new List <SelectListItem>();

                // Allows non creatable types to be created by another admin page.
                if (contentTypeDefinition.GetSettings <ContentTypeSettings>().Creatable || options.CanCreateSelectedContentType)
                {
                    var contentItem = await _contentManager.NewAsync(contentTypeDefinition.Name);

                    contentItem.Owner = context.User.FindFirstValue(ClaimTypes.NameIdentifier);

                    if (await _authorizationService.AuthorizeAsync(context.User, CommonPermissions.EditContent, contentItem))
                    {
                        creatableList.Add(new SelectListItem(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName).Value, contentTypeDefinition.Name));
                    }
                }

                options.CreatableTypes = creatableList;
            }

            if (options.CreatableTypes == null)
            {
                var creatableList = new List <SelectListItem>();
                if (contentTypeDefinitions.Any())
                {
                    foreach (var contentTypeDefinition in contentTypeDefinitions)
                    {
                        var contentItem = await _contentManager.NewAsync(contentTypeDefinition.Name);

                        contentItem.Owner = context.User.FindFirstValue(ClaimTypes.NameIdentifier);

                        if (await _authorizationService.AuthorizeAsync(context.User, CommonPermissions.EditContent, contentItem))
                        {
                            creatableList.Add(new SelectListItem(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName).Value, contentTypeDefinition.Name));
                        }
                    }
                }

                options.CreatableTypes = creatableList;
            }

            // We populate the remaining SelectLists.
            options.ContentStatuses = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = S["Latest"], Value = nameof(ContentsStatus.Latest), Selected = (options.ContentsStatus == ContentsStatus.Latest)
                },
                new SelectListItem()
                {
                    Text = S["Published"], Value = nameof(ContentsStatus.Published), Selected = (options.ContentsStatus == ContentsStatus.Published)
                },
                new SelectListItem()
                {
                    Text = S["Unpublished"], Value = nameof(ContentsStatus.Draft), Selected = (options.ContentsStatus == ContentsStatus.Draft)
                },
                new SelectListItem()
                {
                    Text = S["All versions"], Value = nameof(ContentsStatus.AllVersions), Selected = (options.ContentsStatus == ContentsStatus.AllVersions)
                }
            };

            if (await _authorizationService.AuthorizeAsync(context.User, Permissions.ListContent))
            {
                options.ContentStatuses.Insert(1, new SelectListItem()
                {
                    Text = S["Owned by me"], Value = nameof(ContentsStatus.Owner)
                });
            }

            options.ContentSorts = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = S["Recently created"], Value = nameof(ContentsOrder.Created), Selected = (options.OrderBy == ContentsOrder.Created)
                },
                new SelectListItem()
                {
                    Text = S["Recently modified"], Value = nameof(ContentsOrder.Modified), Selected = (options.OrderBy == ContentsOrder.Modified)
                },
                new SelectListItem()
                {
                    Text = S["Recently published"], Value = nameof(ContentsOrder.Published), Selected = (options.OrderBy == ContentsOrder.Published)
                },
                new SelectListItem()
                {
                    Text = S["Title"], Value = nameof(ContentsOrder.Title), Selected = (options.OrderBy == ContentsOrder.Title)
                },
            };

            options.ContentsBulkAction = new List <SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = S["Publish Now"], Value = nameof(ContentsBulkAction.PublishNow)
                },
                new SelectListItem()
                {
                    Text = S["Unpublish"], Value = nameof(ContentsBulkAction.Unpublish)
                },
                new SelectListItem()
                {
                    Text = S["Delete"], Value = nameof(ContentsBulkAction.Remove)
                }
            };

            if ((String.IsNullOrEmpty(options.SelectedContentType) || String.IsNullOrEmpty(contentTypeId)) && options.ContentTypeOptions == null)
            {
                var listableTypes      = new List <ContentTypeDefinition>();
                var userNameIdentifier = context.User.FindFirstValue(ClaimTypes.NameIdentifier);

                foreach (var ctd in _contentDefinitionManager.ListTypeDefinitions())
                {
                    if (ctd.GetSettings <ContentTypeSettings>().Listable)
                    {
                        var contentItem = await _contentManager.NewAsync(ctd.Name);

                        contentItem.Owner = userNameIdentifier;
                        var authorized = await _authorizationService.AuthorizeAsync(User, CommonPermissions.EditContent, contentItem);

                        if (authorized)
                        {
                            listableTypes.Add(ctd);
                        }
                    }
                }

                var contentTypeOptions = listableTypes
                                         .Select(ctd => new KeyValuePair <string, string>(ctd.Name, ctd.DisplayName))
                                         .ToList().OrderBy(kvp => kvp.Value);

                options.ContentTypeOptions = new List <SelectListItem>
                {
                    new SelectListItem()
                    {
                        Text = S["All content types"], Value = ""
                    }
                };

                foreach (var option in contentTypeOptions)
                {
                    options.ContentTypeOptions.Add(new SelectListItem()
                    {
                        Text = option.Value, Value = option.Key, Selected = (option.Value == options.SelectedContentType)
                    });
                }
            }

            // If ContentTypeOptions is not initialized by query string or by the code above, initialize it
            if (options.ContentTypeOptions == null)
            {
                options.ContentTypeOptions = new List <SelectListItem>();
            }

            // With the options populated we filter the query, allowing the filters to alter the options.
            var query = await _contentsAdminListQueryService.QueryAsync(options, _updateModelAccessor.ModelUpdater);

            // The search text is provided back to the UI.
            options.SearchText         = options.FilterResult.ToString();
            options.OriginalSearchText = options.SearchText;

            // Populate route values to maintain previous route data when generating page links.
            options.RouteValues.TryAdd("q", options.FilterResult.ToString());

            var routeData     = new RouteData(options.RouteValues);
            var maxPagedCount = siteSettings.MaxPagedCount;

            if (maxPagedCount > 0 && pager.PageSize > maxPagedCount)
            {
                pager.PageSize = maxPagedCount;
            }

            var pagerShape = (await New.Pager(pager)).TotalItemCount(maxPagedCount > 0 ? maxPagedCount : await query.CountAsync()).RouteData(routeData);

            // Load items so that loading handlers are invoked.
            var pageOfContentItems = await query.Skip(pager.GetStartIndex()).Take(pager.PageSize).ListAsync(_contentManager);

            // We prepare the content items SummaryAdmin shape
            var contentItemSummaries = new List <dynamic>();

            foreach (var contentItem in pageOfContentItems)
            {
                contentItemSummaries.Add(await _contentItemDisplayManager.BuildDisplayAsync(contentItem, _updateModelAccessor.ModelUpdater, "SummaryAdmin"));
            }

            // Populate options pager summary values.
            var startIndex = (pagerShape.Page - 1) * (pagerShape.PageSize) + 1;

            options.StartIndex        = startIndex;
            options.EndIndex          = startIndex + contentItemSummaries.Count - 1;
            options.ContentItemsCount = contentItemSummaries.Count;
            options.TotalItemCount    = pagerShape.TotalItemCount;

            var header = await _contentOptionsDisplayManager.BuildEditorAsync(options, _updateModelAccessor.ModelUpdater, false);

            var shapeViewModel = await _shapeFactory.CreateAsync <ListContentsViewModel>("ContentsAdminList", viewModel =>
            {
                viewModel.ContentItems = contentItemSummaries;
                viewModel.Pager        = pagerShape;
                viewModel.Options      = options;
                viewModel.Header       = header;
            });

            return(View(shapeViewModel));
        }