in src/OrchardCore.Modules/OrchardCore.Contents/Controllers/AdminController.cs [84:223]
public async Task<IActionResult> List(ListContentsViewModel model, PagerParameters pagerParameters, string contentTypeId = "")
{
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();
}
// Allows non creatable types to be created by another admin page.
if (model.Options.CanCreateSelectedContentType)
{
model.Options.CreatableTypes = new List<SelectListItem>
{
new SelectListItem(new LocalizedString(contentTypeDefinition.DisplayName, contentTypeDefinition.DisplayName).Value, contentTypeDefinition.Name)
};
}
}
if (model.Options.CreatableTypes == null)
{
var contentTypes = _contentDefinitionManager
.ListTypeDefinitions()
.Where(ctd => ctd.GetSettings<ContentTypeSettings>().Creatable)
.OrderBy(ctd => ctd.DisplayName);
var creatableList = new List<SelectListItem>();
if (contentTypes.Any())
{
foreach (var contentTypeDefinition in contentTypes)
{
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["Owned by me"], Value = nameof(ContentsStatus.Owner) },
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) }
};
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) }
};
var listableTypes = new List<ContentTypeDefinition>();
foreach (var ctd in _contentDefinitionManager.ListTypeDefinitions())
{
if (ctd.GetSettings<ContentTypeSettings>().Listable)
{
var authorized = await _authorizationService.AuthorizeAsync(User, Permissions.EditContent, await _contentManager.NewAsync(ctd.Name));
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 });
}
// 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);
}