public async Task <IActionResult> Index([ModelBinder(BinderType = typeof(QueryFilterEngineModelBinder <BlogPost>), Name = "q")] QueryFilterResult <BlogPost> filterResult) { IEnumerable <BlogPost> posts; string currentSearchText = String.Empty; using (var session = _store.CreateSession()) { var query = session.Query <BlogPost>(); await filterResult.ExecuteAsync(new WebQueryExecutionContext <BlogPost>(HttpContext.RequestServices, query)); currentSearchText = filterResult.ToString(); posts = await query.ListAsync(); // Map termList to model. // i.e. SelectedFilter needs to be filled with // the selected filter value from the term. var search = new Filter { SearchText = currentSearchText, OriginalSearchText = currentSearchText }; filterResult.MapTo(search); search.Statuses = new List <SelectListItem>() { new SelectListItem("Select...", "", search.SelectedStatus == BlogPostStatus.Default), new SelectListItem("Published", BlogPostStatus.Published.ToString(), search.SelectedStatus == BlogPostStatus.Published), new SelectListItem("Draft", BlogPostStatus.Draft.ToString(), search.SelectedStatus == BlogPostStatus.Draft) }; search.Sorts = new List <SelectListItem>() { new SelectListItem("Newest", BlogPostSort.Newest.ToString(), search.SelectedSort == BlogPostSort.Newest), new SelectListItem("Oldest", BlogPostSort.Oldest.ToString(), search.SelectedSort == BlogPostSort.Oldest) }; var vm = new BlogPostViewModel { BlogPosts = posts, Search = search }; return(View(vm)); } }
public async Task <ActionResult> Index([ModelBinder(BinderType = typeof(AuditTrailFilterEngineModelBinder), Name = "q")] QueryFilterResult <AuditTrailEvent> queryFilterResult, PagerParameters pagerParameters, string correlationId = "") { if (!await _authorizationService.AuthorizeAsync(User, AuditTrailPermissions.ViewAuditTrail)) { return(Forbid()); } var options = new AuditTrailIndexOptions { FilterResult = queryFilterResult }; // This is used by Contents feature for routing so needs to be passed into the options. if (!String.IsNullOrEmpty(correlationId)) { options.CorrelationId = correlationId; options.CorrelationIdFromRoute = true; } if (options.CorrelationIdFromRoute) { // When the correlation id is provided via the route or options a placeholder node is used to apply a filter. options.FilterResult.TryAddOrReplace(new CorrelationIdFilterNode(options.CorrelationId)); } var siteSettings = await _siteService.GetSiteSettingsAsync(); var pager = new Pager(pagerParameters, siteSettings.PageSize); // With the options populated we filter the query, allowing the filters to alter the options. var result = await _auditTrailAdminListQueryService.QueryAsync(pager.Page, pager.PageSize, options); // 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 pagerShape = await _shapeFactory.CreateAsync("Pager", Arguments.From(new { pager.Page, pager.PageSize, TotalItemCount = result.TotalCount })); var items = new List <IShape>(); foreach (var auditTrailEvent in result.Events) { items.Add( await _displayManager.BuildDisplayAsync(auditTrailEvent, updater: _updateModelAccessor.ModelUpdater, displayType: "SummaryAdmin") ); } var startIndex = (pager.Page - 1) * (pager.PageSize) + 1; options.StartIndex = startIndex; options.EndIndex = startIndex + items.Count - 1; options.EventsCount = items.Count; options.TotalItemCount = result.TotalCount; var header = await _auditTrailOptionsDisplayManager.BuildEditorAsync(options, _updateModelAccessor.ModelUpdater, false); var shapeViewModel = await _shapeFactory.CreateAsync <AuditTrailListViewModel>("AuditTrailAdminList", viewModel => { viewModel.Events = items; viewModel.Pager = pagerShape; viewModel.Options = options; viewModel.Header = header; }); return(View(shapeViewModel)); }
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)); }
public async Task <ActionResult> Index([ModelBinder(BinderType = typeof(UserFilterEngineModelBinder), Name = "q")] QueryFilterResult <User> queryFilterResult, PagerParameters pagerParameters) { // Check a dummy user account to see if the current user has permission to view users. var authUser = new User(); if (!await _authorizationService.AuthorizeAsync(User, Permissions.ViewUsers, authUser)) { return(Forbid()); } var options = new UserIndexOptions(); // Populate route values to maintain previous route data when generating page links // await _userOptionsDisplayManager.UpdateEditorAsync(options, _updateModelAccessor.ModelUpdater, false); options.FilterResult = queryFilterResult; options.FilterResult.MapTo(options); // With the options populated we filter the query, allowing the filters to alter the options. var users = await _usersAdminListQueryService.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 siteSettings = await _siteService.GetSiteSettingsAsync(); var pager = new Pager(pagerParameters, siteSettings.PageSize); var count = await users.CountAsync(); var results = await users .Skip(pager.GetStartIndex()) .Take(pager.PageSize) .ListAsync(); var pagerShape = (await New.Pager(pager)).TotalItemCount(count).RouteData(routeData); var userEntries = new List <UserEntry>(); foreach (var user in results) { userEntries.Add(new UserEntry { UserId = user.UserId, Shape = await _userDisplayManager.BuildDisplayAsync(user, updater: _updateModelAccessor.ModelUpdater, displayType: "SummaryAdmin") } ); } options.UserFilters = new List <SelectListItem>() { new SelectListItem() { Text = S["All Users"], Value = nameof(UsersFilter.All), Selected = (options.Filter == UsersFilter.All) }, new SelectListItem() { Text = S["Enabled Users"], Value = nameof(UsersFilter.Enabled), Selected = (options.Filter == UsersFilter.Enabled) }, new SelectListItem() { Text = S["Disabled Users"], Value = nameof(UsersFilter.Disabled), Selected = (options.Filter == UsersFilter.Disabled) } //new SelectListItem() { Text = S["Approved"], Value = nameof(UsersFilter.Approved) }, //new SelectListItem() { Text = S["Email pending"], Value = nameof(UsersFilter.EmailPending) }, //new SelectListItem() { Text = S["Pending"], Value = nameof(UsersFilter.Pending) } }; options.UserSorts = new List <SelectListItem>() { new SelectListItem() { Text = S["Name"], Value = nameof(UsersOrder.Name), Selected = (options.Order == UsersOrder.Name) }, new SelectListItem() { Text = S["Email"], Value = nameof(UsersOrder.Email), Selected = (options.Order == UsersOrder.Email) }, //new SelectListItem() { Text = S["Created date"], Value = nameof(UsersOrder.CreatedUtc) }, //new SelectListItem() { Text = S["Last Login date"], Value = nameof(UsersOrder.LastLoginUtc) } }; options.UsersBulkAction = new List <SelectListItem>() { new SelectListItem() { Text = S["Approve"], Value = nameof(UsersBulkAction.Approve) }, new SelectListItem() { Text = S["Enable"], Value = nameof(UsersBulkAction.Enable) }, new SelectListItem() { Text = S["Disable"], Value = nameof(UsersBulkAction.Disable) }, new SelectListItem() { Text = S["Delete"], Value = nameof(UsersBulkAction.Delete) } }; var allRoles = (await _roleService.GetRoleNamesAsync()) .Except(new[] { "Anonymous", "Authenticated" }, StringComparer.OrdinalIgnoreCase); options.UserRoleFilters = new List <SelectListItem>() { new SelectListItem() { Text = S["All roles"], Value = String.Empty, Selected = (options.SelectedRole == String.Empty) }, new SelectListItem() { Text = S["Authenticated (no roles)"], Value = "Authenticated", Selected = (String.Equals(options.SelectedRole, "Authenticated", StringComparison.OrdinalIgnoreCase)) } }; // TODO Candidate for dynamic localization. options.UserRoleFilters.AddRange(allRoles.Select(x => new SelectListItem { Text = x, Value = x, Selected = (String.Equals(options.SelectedRole, x, StringComparison.OrdinalIgnoreCase)) })); // Populate options pager summary values. var startIndex = (pagerShape.Page - 1) * (pagerShape.PageSize) + 1; options.StartIndex = startIndex; options.EndIndex = startIndex + userEntries.Count - 1; options.UsersCount = userEntries.Count; options.TotalItemCount = pagerShape.TotalItemCount; var header = await _userOptionsDisplayManager.BuildEditorAsync(options, _updateModelAccessor.ModelUpdater, false); var shapeViewModel = await _shapeFactory.CreateAsync <UsersIndexViewModel>("UsersAdminList", viewModel => { viewModel.Users = userEntries; viewModel.Pager = pagerShape; viewModel.Options = options; viewModel.Header = header; }); return(View(shapeViewModel)); }