Пример #1
0
        public async Task <Tuple <Response <List <Topic> >, PagerContext> > GetTopics(string searchTerm, SearchType searchType, User user, bool includeDeleted, int pageIndex)
        {
            var nonViewableForumIDs = await _forumService.GetNonViewableForumIDs(user);

            var pageSize   = _settingsManager.Current.TopicsPerPage;
            var startRow   = ((pageIndex - 1) * pageSize) + 1;
            var topicCount = 0;
            Response <List <Topic> > topics;
            PagerContext             pagerContext;

            if (string.IsNullOrEmpty(searchTerm))
            {
                topics = new Response <List <Topic> >(new List <Topic>(), true);
            }
            else
            {
                (topics, topicCount) = await _searchRepository.SearchTopics(searchTerm, nonViewableForumIDs, searchType, startRow, pageSize);
            }
            if (topics.IsValid)
            {
                var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));
                pagerContext = new PagerContext {
                    PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
                };
            }
            else
            {
                topics       = new Response <List <Topic> >(new List <Topic>(), false);
                pagerContext = new PagerContext {
                    PageCount = 1, PageIndex = 1, PageSize = 1
                };
            }
            return(Tuple.Create(topics, pagerContext));
        }
Пример #2
0
        public List <ErrorLogEntry> GetErrors(int pageIndex, int pageSize, out PagerContext pagerContext)
        {
            var startRow   = ((pageIndex - 1) * pageSize) + 1;
            var errors     = _errorLogRepository.GetErrors(startRow, pageSize);
            var errorCount = _errorLogRepository.GetErrorCount();
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(errorCount) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(errors);
        }
        public List <PrivateMessage> GetPrivateMessages(User user, PrivateMessageBoxType boxType, int pageIndex, out PagerContext pagerContext)
        {
            var total      = PrivateMessageRepository.GetBoxCount(user.UserID, boxType);
            var pageSize   = SettingsManager.Current.TopicsPerPage;
            var startRow   = ((pageIndex - 1) * pageSize) + 1;
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(PrivateMessageRepository.GetPrivateMessages(user.UserID, boxType, startRow, pageSize));
        }
        public List <Topic> GetTopics(User user, int pageIndex, out PagerContext pagerContext)
        {
            var pageSize   = _settingsManager.Current.TopicsPerPage;
            var startRow   = ((pageIndex - 1) * pageSize) + 1;
            var topics     = _favoriteTopicRepository.GetFavoriteTopics(user.UserID, startRow, pageSize);
            var topicCount = _favoriteTopicRepository.GetFavoriteTopicCount(user.UserID);
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(topics);
        }
Пример #5
0
        public async Task <Tuple <List <PrivateMessage>, PagerContext> > GetPrivateMessages(User user, PrivateMessageBoxType boxType, int pageIndex)
        {
            var total = await _privateMessageRepository.GetBoxCount(user.UserID, boxType);

            var pageSize     = _settingsManager.Current.TopicsPerPage;
            var startRow     = ((pageIndex - 1) * pageSize) + 1;
            var totalPages   = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / Convert.ToDouble(pageSize)));
            var pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            var messages = await _privateMessageRepository.GetPrivateMessages(user.UserID, boxType, startRow, pageSize);

            return(Tuple.Create(messages, pagerContext));
        }
Пример #6
0
        public List <Topic> GetTopics(User viewingUser, User postUser, bool includeDeleted, int pageIndex, out PagerContext pagerContext)
        {
            var nonViewableForumIDs = _forumService.GetNonViewableForumIDs(viewingUser);
            var pageSize            = _settingsManager.Current.TopicsPerPage;
            var startRow            = ((pageIndex - 1) * pageSize) + 1;
            var topics     = _topicRepository.GetTopicsByUser(postUser.UserID, includeDeleted, nonViewableForumIDs, startRow, pageSize);
            var topicCount = _topicRepository.GetTopicCountByUser(postUser.UserID, includeDeleted, nonViewableForumIDs);
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(topics);
        }
        public async Task <Tuple <List <Topic>, PagerContext> > GetTopics(User user, int pageIndex)
        {
            var pageSize = _settingsManager.Current.TopicsPerPage;
            var startRow = ((pageIndex - 1) * pageSize) + 1;
            var topics   = await _favoriteTopicRepository.GetFavoriteTopics(user.UserID, startRow, pageSize);

            var topicCount = await _favoriteTopicRepository.GetFavoriteTopicCount(user.UserID);

            var totalPages   = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));
            var pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };

            return(Tuple.Create(topics, pagerContext));
        }
Пример #8
0
        public async Task <Tuple <List <Topic>, PagerContext> > GetRecentTopics(User user, bool includeDeleted, int pageIndex)
        {
            var nonViewableForumIDs = await GetNonViewableForumIDs(user);

            var pageSize = _settingsManager.Current.TopicsPerPage;
            var startRow = ((pageIndex - 1) * pageSize) + 1;
            var topics   = await _topicRepository.Get(includeDeleted, nonViewableForumIDs, startRow, pageSize);

            var topicCount = await _topicRepository.GetTopicCount(includeDeleted, nonViewableForumIDs);

            var totalPages   = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));
            var pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };

            return(Tuple.Create(topics, pagerContext));
        }
Пример #9
0
        public List <Post> GetPosts(Topic topic, int lastLoadedPostID, bool includeDeleted, out PagerContext pagerContext)
        {
            var allPosts  = _postRepository.Get(topic.TopicID, includeDeleted);
            var lastIndex = allPosts.FindIndex(p => p.PostID == lastLoadedPostID);

            if (lastIndex < 0)
            {
                throw new Exception(String.Format("PostID {0} is not a part of TopicID {1}.", lastLoadedPostID, topic.TopicID));
            }
            var posts      = allPosts.Skip(lastIndex + 1).ToList();
            var pageSize   = _settingsManager.Current.PostsPerPage;
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(allPosts.Count) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = totalPages, PageSize = pageSize
            };
            return(posts);
        }
Пример #10
0
        public async Task <Tuple <List <Post>, PagerContext> > GetPosts(Topic topic, int lastLoadedPostID, bool includeDeleted)
        {
            var allPosts = await _postRepository.Get(topic.TopicID, includeDeleted);

            var lastIndex = allPosts.FindIndex(p => p.PostID == lastLoadedPostID);

            if (lastIndex < 0)
            {
                throw new Exception($"PostID {lastLoadedPostID} is not a part of TopicID {topic.TopicID}.");
            }
            var posts        = allPosts.Skip(lastIndex + 1).ToList();
            var pageSize     = _settingsManager.Current.PostsPerPage;
            var totalPages   = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(allPosts.Count) / Convert.ToDouble(pageSize)));
            var pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = totalPages, PageSize = pageSize
            };

            return(Tuple.Create(posts, pagerContext));
        }
Пример #11
0
        public List <Topic> GetTopics(Forum forum, bool includeDeleted, int pageIndex, out PagerContext pagerContext)
        {
            var pageSize = _settingsManager.Current.TopicsPerPage;
            var startRow = ((pageIndex - 1) * pageSize) + 1;
            var topics   = _topicRepository.Get(forum.ForumID, includeDeleted, startRow, pageSize);
            int topicCount;

            if (includeDeleted)
            {
                topicCount = _topicRepository.GetTopicCount(forum.ForumID, true);
            }
            else
            {
                topicCount = forum.TopicCount;
            }
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(topics);
        }
Пример #12
0
        public List <Post> GetPosts(Topic topic, bool includeDeleted, int pageIndex, out PagerContext pagerContext)
        {
            var pageSize = _settingsManager.Current.PostsPerPage;
            var startRow = ((pageIndex - 1) * pageSize) + 1;
            var posts    = _postRepository.Get(topic.TopicID, includeDeleted, startRow, pageSize);
            int postCount;

            if (includeDeleted)
            {
                postCount = _postRepository.GetReplyCount(topic.TopicID, true);
            }
            else
            {
                postCount = topic.ReplyCount + 1;
            }
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(postCount) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(posts);
        }
Пример #13
0
        public List <Topic> GetTopics(string searchTerm, SearchType searchType, User user, bool includeDeleted, int pageIndex, out PagerContext pagerContext)
        {
            var          nonViewableForumIDs = _forumService.GetNonViewableForumIDs(user);
            var          pageSize            = _settingsManager.Current.TopicsPerPage;
            var          startRow            = ((pageIndex - 1) * pageSize) + 1;
            var          topicCount          = 0;
            List <Topic> topics;

            if (String.IsNullOrEmpty(searchTerm))
            {
                topics = new List <Topic>();
            }
            else
            {
                topics = _searchRepository.SearchTopics(searchTerm, nonViewableForumIDs, searchType, startRow, pageSize, out topicCount);
            }
            var totalPages = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(topicCount) / Convert.ToDouble(pageSize)));

            pagerContext = new PagerContext {
                PageCount = totalPages, PageIndex = pageIndex, PageSize = pageSize
            };
            return(topics);
        }
Пример #14
0
        public static MvcHtmlString PagerLinks(this HtmlHelper htmlHelper, string controllerName, string actionName, PagerContext pagerContext, int low, int high, string id, string firstPage, string previousPage, string nextPage, string lastPage, string moreText, string cssClass, string moreTextCssClass, string currentPageCssClass)
        {
            if (pagerContext == null)
            {
                return(null);
            }
            var builder = new StringBuilder();

            if (String.IsNullOrEmpty(controllerName) || String.IsNullOrEmpty(actionName))
            {
                throw new Exception("controllerName and actionName must be specified for PageLinks.");
            }
            if (pagerContext.PageCount <= 1)
            {
                return(MvcHtmlString.Create(String.Empty));
            }

            if (String.IsNullOrEmpty(cssClass))
            {
                builder.Append("<ul class=\"pagination\">");
            }
            else
            {
                builder.Append(String.Format("<ul class=\"pagination {0}\">", cssClass));
            }
            if (String.IsNullOrEmpty(moreTextCssClass))
            {
                builder.Append(String.Format("<li><span>{0}</span></li>", moreText));
            }
            else
            {
                builder.Append(String.Format("<li class=\"{0}\"><span>{1}</span></li>", moreTextCssClass, moreText));
            }

            if (pagerContext.PageIndex != 1 && low != 1)
            {
                // first page link
                builder.Append("<li>");
                var firstLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, new RouteValueDictionary(new { controller = controllerName, action = actionName, page = 1, id }), new Dictionary <string, object> {
                    { "title", firstPage }, { "class", "glyphicon glyphicon-step-backward" }
                });
                builder.Append(firstLink);
                builder.Append("</li>");
                if (pagerContext.PageIndex > 2 && !(low < pagerContext.PageIndex))
                {
                    // previous page link
                    var previousIndex = pagerContext.PageIndex - 1;
                    builder.Append("<li>");
                    var previousLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, new RouteValueDictionary(new { controller = controllerName, action = actionName, page = previousIndex, id }), new Dictionary <string, object> {
                        { "title", previousPage }, { "rel", "prev" }, { "class", "glyphicon glyphicon-chevron-left" }
                    });
                    builder.Append(previousLink);
                    builder.Append("</li>");
                }
            }

            // calc low and high limits for numeric links
            var calcLow  = pagerContext.PageIndex - 1;
            var calcHigh = pagerContext.PageIndex + 3;

            if (calcLow < 1)
            {
                calcLow = 1;
            }
            if (calcHigh > pagerContext.PageCount)
            {
                calcHigh = pagerContext.PageCount;
            }
            if (calcHigh - calcLow < 5)
            {
                while ((calcHigh < calcLow + 4) && calcHigh < pagerContext.PageCount)
                {
                    calcHigh++;
                }
            }
            if (calcHigh - calcLow < 5)
            {
                while ((calcLow > calcHigh - 4) && calcLow > 1)
                {
                    calcLow--;
                }
            }
            var isRangeRendered = false;

            for (var x = calcLow; x < calcHigh + 1; x++)
            {
                // numeric links
                if (x >= low && x <= high)
                {
                    if (!isRangeRendered)
                    {
                        isRangeRendered = true;
                        if (String.IsNullOrEmpty(currentPageCssClass))
                        {
                            builder.Append(String.Format("<li class=\"active\"><span>{0}-{1} of {2}</span></li>", low, high, pagerContext.PageCount));
                        }
                        else
                        {
                            builder.Append(String.Format("<li class=\"active {0}\"><span>{1}-{2} of {3}</span></li>", currentPageCssClass, low, high, pagerContext.PageCount));
                        }
                    }
                }
                else
                {
                    builder.Append("<li>");
                    builder.Append(htmlHelper.RouteLink(x.ToString(), new { controller = controllerName, action = actionName, page = x, id }));
                    builder.Append("</li>");
                }
            }
            if (pagerContext.PageIndex != pagerContext.PageCount && high < pagerContext.PageCount)
            {
                if (pagerContext.PageIndex < pagerContext.PageCount - 1)
                {
                    // next page link
                    var nextIndex = pagerContext.PageIndex + 1;
                    builder.Append("<li>");
                    var nextLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, new RouteValueDictionary(new { controller = controllerName, action = actionName, page = nextIndex, id }), new Dictionary <string, object> {
                        { "title", nextPage }, { "rel", "next" }, { "class", "glyphicon glyphicon-chevron-right" }
                    });
                    builder.Append(nextLink);
                    builder.Append("</li>");
                }
                // last page link
                builder.Append("<li>");
                var lastLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, new RouteValueDictionary(new { controller = controllerName, action = actionName, page = pagerContext.PageCount, id }), new Dictionary <string, object> {
                    { "title", lastPage }, { "class", "glyphicon glyphicon-step-forward" }
                });
                builder.Append(lastLink);
                builder.Append("</li>");
            }
            builder.Append("</ul>");

            return(MvcHtmlString.Create(builder.ToString()));
        }
Пример #15
0
        public async Task <ActionResult> Topic(string id, int pageNumber = 1)
        {
            var topic = await _topicService.Get(id);

            if (topic == null)
            {
                return(NotFound());
            }
            var forum = await _forumService.Get(topic.ForumID);

            if (forum == null)
            {
                throw new Exception($"TopicID {topic.TopicID} references ForumID {topic.ForumID}, which does not exist.");
            }

            var user              = _userRetrievalShim.GetUser();
            var adapter           = new ForumAdapterFactory(forum);
            var permissionContext = await _forumPermissionService.GetPermissionContext(forum, user, topic);

            if (!permissionContext.UserCanView)
            {
                return(NotFound());
            }

            PagerContext pagerContext = null;
            var          isSubscribed = false;
            var          isFavorite   = false;
            DateTime?    lastReadTime = DateTime.UtcNow;

            if (user != null)
            {
                lastReadTime = await _lastReadService.GetLastReadTime(user, topic);

                isFavorite = await _favoriteTopicService.IsTopicFavorite(user, topic);

                isSubscribed = await _subService.IsTopicSubscribed(user, topic);

                if (isSubscribed)
                {
                    await _subService.MarkSubscribedTopicViewed(user, topic);
                }
                if (!adapter.IsAdapterEnabled || (adapter.IsAdapterEnabled && adapter.ForumAdapter.MarkViewedTopicRead))
                {
                    await _lastReadService.MarkTopicRead(user, topic);
                }
                if (user.IsInRole(PermanentRoles.Moderator))
                {
                    var categorizedForums = await _forumService.GetCategorizedForumContainer();

                    var categorizedForumSelectList = new List <SelectListItem>();
                    foreach (var uncategorizedForum in categorizedForums.UncategorizedForums)
                    {
                        categorizedForumSelectList.Add(new SelectListItem {
                            Value = uncategorizedForum.ForumID.ToString(), Text = uncategorizedForum.Title, Selected = forum.ForumID == uncategorizedForum.ForumID
                        });
                    }
                    foreach (var categoryPair in categorizedForums.CategoryDictionary)
                    {
                        var group = new SelectListGroup {
                            Name = categoryPair.Key.Title
                        };
                        foreach (var categorizedForum in categoryPair.Value)
                        {
                            categorizedForumSelectList.Add(new SelectListItem {
                                Value = categorizedForum.ForumID.ToString(), Text = categorizedForum.Title, Selected = forum.ForumID == categorizedForum.ForumID, Group = group
                            });
                        }
                    }
                    ViewBag.CategorizedForums = categorizedForumSelectList;
                }
            }
            List <Post> posts;

            if (forum.IsQAForum)
            {
                posts = await _postService.GetPosts(topic, permissionContext.UserCanModerate);
            }
            else
            {
                (posts, pagerContext) = await _postService.GetPosts(topic, permissionContext.UserCanModerate, pageNumber);
            }
            if (posts.Count == 0)
            {
                return(NotFound());
            }
            var signatures = await _profileService.GetSignatures(posts);

            var avatars = await _profileService.GetAvatars(posts);

            var votedIDs = await _postService.GetVotedPostIDs(user, posts);

            var container = ComposeTopicContainer(topic, forum, permissionContext, isSubscribed, posts, pagerContext, isFavorite, signatures, avatars, votedIDs, lastReadTime);
            await _topicViewCountService.ProcessView(topic);

            await _topicViewLogService.LogView(user?.UserID, topic.TopicID);

            if (adapter.IsAdapterEnabled)
            {
                adapter.ForumAdapter.AdaptTopic(this, container);
                if (string.IsNullOrWhiteSpace(adapter.ForumAdapter.ViewName))
                {
                    return(View(adapter.ForumAdapter.Model));
                }
                return(View(adapter.ForumAdapter.ViewName, adapter.ForumAdapter.Model));
            }
            if (forum.IsQAForum)
            {
                var containerForQA = _forumService.MapTopicContainerForQA(container);
                return(View("TopicQA", containerForQA));
            }
            return(View(container));
        }
Пример #16
0
        public static MvcHtmlString PagerLinks(this HtmlHelper htmlHelper, string controllerName, string actionName, PagerContext pagerContext, string firstPage, string previousPage, string nextPage, string lastPage, string moreText, string cssClass, string moreTextCssClass, string currentPageCssClass, Dictionary <string, object> routeParameters)
        {
            if (pagerContext == null)
            {
                return(null);
            }
            var builder = new StringBuilder();

            if (String.IsNullOrEmpty(controllerName) || String.IsNullOrEmpty(actionName))
            {
                throw new Exception("controllerName and actionName must be specified for PageLinks.");
            }
            if (pagerContext.PageCount <= 1)
            {
                return(MvcHtmlString.Create(String.Empty));
            }

            if (String.IsNullOrEmpty(cssClass))
            {
                builder.Append("<ul class=\"pagination\">");
            }
            else
            {
                builder.Append(String.Format("<ul class=\"pagination {0}\">", cssClass));
            }
            if (String.IsNullOrEmpty(moreTextCssClass))
            {
                builder.Append(String.Format("<li><span>{0}</span></li>", moreText));
            }
            else
            {
                builder.Append(String.Format("<li class=\"{0}\"><span>{1}</span></li>", moreTextCssClass, moreText));
            }

            if (pagerContext.PageIndex != 1)
            {
                // first page link
                builder.Append("<li>");
                var firstRouteDictionary = new RouteValueDictionary(new { controller = controllerName, action = actionName, page = 1 });
                if (routeParameters != null)
                {
                    foreach (var item in routeParameters)
                    {
                        firstRouteDictionary.Add(item.Key, item.Value);
                    }
                }
                var firstLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, firstRouteDictionary, new Dictionary <string, object> {
                    { "title", firstPage }, { "class", "glyphicon glyphicon-step-backward" }
                });
                builder.Append(firstLink);
                builder.Append("</li>");
                if (pagerContext.PageIndex > 2)
                {
                    // previous page link
                    var previousIndex = pagerContext.PageIndex - 1;
                    builder.Append("<li>");
                    var previousRouteDictionary = new RouteValueDictionary(new { controller = controllerName, action = actionName, page = previousIndex });
                    if (routeParameters != null)
                    {
                        foreach (var item in routeParameters)
                        {
                            previousRouteDictionary.Add(item.Key, item.Value);
                        }
                    }
                    var previousLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, previousRouteDictionary, new Dictionary <string, object> {
                        { "title", previousPage }, { "rel", "prev" }, { "class", "glyphicon glyphicon-chevron-left" }
                    });
                    builder.Append(previousLink);
                    builder.Append("</li>");
                }
            }

            // calc low and high limits for numeric links
            var low  = pagerContext.PageIndex - 1;
            var high = pagerContext.PageIndex + 3;

            if (low < 1)
            {
                low = 1;
            }
            if (high > pagerContext.PageCount)
            {
                high = pagerContext.PageCount;
            }
            if (high - low < 5)
            {
                while ((high < low + 4) && high < pagerContext.PageCount)
                {
                    high++;
                }
            }
            if (high - low < 5)
            {
                while ((low > high - 4) && low > 1)
                {
                    low--;
                }
            }
            for (var x = low; x < high + 1; x++)
            {
                // numeric links
                if (x == pagerContext.PageIndex)
                {
                    if (String.IsNullOrEmpty(currentPageCssClass))
                    {
                        builder.Append(String.Format("<li><span class=\"active\">{0} of {1}</span></li>", x, pagerContext.PageCount));
                    }
                    else
                    {
                        builder.Append(String.Format("<li class=\"active {0}\"><span>{1} of {2}</span></li>", currentPageCssClass, x, pagerContext.PageCount));
                    }
                }
                else
                {
                    builder.Append("<li>");
                    var numericRouteDictionary = new RouteValueDictionary {
                        { "controller", controllerName }, { "action", actionName }, { "page", x }
                    };
                    if (routeParameters != null)
                    {
                        foreach (var item in routeParameters)
                        {
                            numericRouteDictionary.Add(item.Key, item.Value);
                        }
                    }
                    builder.Append(htmlHelper.RouteLink(x.ToString(), numericRouteDictionary));
                    builder.Append("</li>");
                }
            }
            if (pagerContext.PageIndex != pagerContext.PageCount)
            {
                if (pagerContext.PageIndex < pagerContext.PageCount - 1)
                {
                    // next page link
                    var nextIndex = pagerContext.PageIndex + 1;
                    builder.Append("<li>");
                    var nextRouteDictionary = new RouteValueDictionary(new { controller = controllerName, action = actionName, page = nextIndex });
                    if (routeParameters != null)
                    {
                        foreach (var item in routeParameters)
                        {
                            nextRouteDictionary.Add(item.Key, item.Value);
                        }
                    }
                    var nextLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, nextRouteDictionary, new Dictionary <string, object> {
                        { "title", nextPage }, { "rel", "next" }, { "class", "glyphicon glyphicon-chevron-right" }
                    });
                    builder.Append(nextLink);
                    builder.Append("</li>");
                }
                // last page link
                builder.Append("<li>");
                var lastRouteDictionary = new RouteValueDictionary(new { controller = controllerName, action = actionName, page = pagerContext.PageCount });
                if (routeParameters != null)
                {
                    foreach (var item in routeParameters)
                    {
                        lastRouteDictionary.Add(item.Key, item.Value);
                    }
                }
                var lastLink = HtmlHelper.GenerateRouteLink(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection, "", null, lastRouteDictionary, new Dictionary <string, object> {
                    { "title", lastPage }, { "class", "glyphicon glyphicon-step-forward" }
                });
                builder.Append(lastLink);
                builder.Append("</li>");
            }
            builder.Append("</ul>");

            return(MvcHtmlString.Create(builder.ToString()));
        }
Пример #17
0
        public ViewResult Topic(string id, int page = 1)
        {
            var topic = _topicService.Get(id);

            if (topic == null)
            {
                return(this.NotFound("NotFound", null));
            }
            var forum = _forumService.Get(topic.ForumID);

            if (forum == null)
            {
                throw new Exception(String.Format("TopicID {0} references ForumID {1}, which does not exist.", topic.TopicID, topic.ForumID));
            }

            var adapter           = new ForumAdapterFactory(forum);
            var permissionContext = _forumService.GetPermissionContext(forum, this.CurrentUser(), topic);

            if (!permissionContext.UserCanView)
            {
                return(this.Forbidden("Forbidden", null));
            }
            //var category = _categoryService.Get(forum.CategoryID??0);
            //if (category.ClosureDate.Date < DateTime.Now.Date)
            //{
            //    topic.NotReply = true;
            //}
            var closureDate = _categoryService.GetValue();

            if (DateTime.Now.Date > closureDate.ClosureDate.Date)
            {
                topic.NotPostAll = true;
            }
            if (DateTime.Now.Date > closureDate.FinalClosureDate.Date)
            {
                topic.NotReply = true;
            }
            PagerContext pagerContext = null;
            var          isSubscribed = false;
            var          isFavorite   = false;
            var          user         = this.CurrentUser();

            if (user != null)
            {
                isFavorite   = _favoriteTopicService.IsTopicFavorite(user, topic);
                isSubscribed = _subService.IsTopicSubscribed(user, topic);
                if (isSubscribed)
                {
                    _subService.MarkSubscribedTopicViewed(user, topic);
                }
                if (!adapter.IsAdapterEnabled || (adapter.IsAdapterEnabled && adapter.ForumAdapter.MarkViewedTopicRead))
                {
                    _lastReadService.MarkTopicRead(user, topic);
                }
                if (user.IsInRole(PermanentRoles.Moderator))
                {
                    ViewBag.CategorizedForums = _forumService.GetCategorizedForumContainer();
                }
            }
            List <Post> posts;

            if (forum.IsQAForum)
            {
                posts = _postService.GetPosts(topic, permissionContext.UserCanModerate);
            }
            else
            {
                if (this.CurrentUser().UserType > 1) // manager, staff
                {
                    posts = _postService.GetPosts(topic, permissionContext.UserCanModerate, page, out pagerContext);
                }
                else //student
                {
                    posts = _postService.GetPosts(topic, permissionContext.UserCanModerate, page, out pagerContext).Where(a => a.UserType == 1).ToList();
                }
            }

            if (posts.Count == 0)
            {
                return(this.NotFound("NotFound", null));
            }
            var signatures = _profileService.GetSignatures(posts);
            var avatars    = _profileService.GetAvatars(posts);
            var votedIDs   = _postService.GetVotedPostIDs(this.CurrentUser(), posts);


            var container = ComposeTopicContainer(topic, forum, permissionContext, isSubscribed, posts, pagerContext, isFavorite, signatures, avatars, votedIDs);

            _topicViewCountService.ProcessView(topic, HttpContext);
            if (adapter.IsAdapterEnabled)
            {
                adapter.ForumAdapter.AdaptTopic(this, container);
                if (String.IsNullOrWhiteSpace(adapter.ForumAdapter.ViewName))
                {
                    return(View(adapter.ForumAdapter.Model));
                }
                return(View(adapter.ForumAdapter.ViewName, adapter.ForumAdapter.Model));
            }
            if (forum.IsQAForum)
            {
                var containerForQA = _forumService.MapTopicContainerForQA(container);
                return(View("TopicQA", containerForQA));
            }
            return(View(container));
        }
Пример #18
0
        public ActionResult Topic(string id, int page = 1)
        {
            var topic = _topicService.Get(id);

            if (topic == null)
            {
                return(NotFound());
            }
            var forum = _forumService.Get(topic.ForumID);

            if (forum == null)
            {
                throw new Exception(String.Format("TopicID {0} references ForumID {1}, which does not exist.", topic.TopicID, topic.ForumID));
            }

            var user              = _userRetrievalShim.GetUser(HttpContext);
            var adapter           = new ForumAdapterFactory(forum);
            var permissionContext = _forumService.GetPermissionContext(forum, user, topic);

            if (!permissionContext.UserCanView)
            {
                return(Forbid());
            }

            PagerContext pagerContext = null;
            var          isSubscribed = false;
            var          isFavorite   = false;
            DateTime?    lastReadTime = DateTime.UtcNow;

            if (user != null)
            {
                lastReadTime = _lastReadService.GetLastReadTime(user, topic);
                isFavorite   = _favoriteTopicService.IsTopicFavorite(user, topic);
                isSubscribed = _subService.IsTopicSubscribed(user, topic);
                if (isSubscribed)
                {
                    _subService.MarkSubscribedTopicViewed(user, topic);
                }
                if (!adapter.IsAdapterEnabled || (adapter.IsAdapterEnabled && adapter.ForumAdapter.MarkViewedTopicRead))
                {
                    _lastReadService.MarkTopicRead(user, topic);
                }
                if (user.IsInRole(PermanentRoles.Moderator))
                {
                    ViewBag.CategorizedForums = _forumService.GetCategorizedForumContainer();
                }
            }
            List <Post> posts;

            if (forum.IsQAForum)
            {
                posts = _postService.GetPosts(topic, permissionContext.UserCanModerate);
            }
            else
            {
                posts = _postService.GetPosts(topic, permissionContext.UserCanModerate, page, out pagerContext);
            }
            if (posts.Count == 0)
            {
                return(NotFound());
            }
            var signatures = _profileService.GetSignatures(posts);
            var avatars    = _profileService.GetAvatars(posts);
            var votedIDs   = _postService.GetVotedPostIDs(user, posts);
            var container  = ComposeTopicContainer(topic, forum, permissionContext, isSubscribed, posts, pagerContext, isFavorite, signatures, avatars, votedIDs, lastReadTime);

            _topicViewCountService.ProcessView(topic, HttpContext);
            if (adapter.IsAdapterEnabled)
            {
                adapter.ForumAdapter.AdaptTopic(this, container);
                if (String.IsNullOrWhiteSpace(adapter.ForumAdapter.ViewName))
                {
                    return(View(adapter.ForumAdapter.Model));
                }
                return(View(adapter.ForumAdapter.ViewName, adapter.ForumAdapter.Model));
            }
            if (forum.IsQAForum)
            {
                var containerForQA = _forumService.MapTopicContainerForQA(container);
                return(View("TopicQA", containerForQA));
            }
            return(View(container));
        }
Пример #19
0
 public static MvcHtmlString PagerLinks(this HtmlHelper htmlHelper, string controllerName, string actionName, PagerContext pagerContext, string cssClass, string moreTextCssClass, string currentPageCssClass, Dictionary <string, object> routeParameters)
 {
     return(PagerLinks(htmlHelper, controllerName, actionName, pagerContext, Resources.First, Resources.Previous, Resources.Next, Resources.Last, Resources.More + ":", cssClass, moreTextCssClass, currentPageCssClass, routeParameters));
 }
Пример #20
0
 private static TopicContainer ComposeTopicContainer(Topic topic, Forum forum, ForumPermissionContext permissionContext, bool isSubscribed, List <Post> posts, PagerContext pagerContext, bool isFavorite, Dictionary <int, string> signatures, Dictionary <int, int> avatars, List <int> votedPostIDs, DateTime?lastreadTime)
 {
     return(new TopicContainer {
         Forum = forum, Topic = topic, Posts = posts, PagerContext = pagerContext, PermissionContext = permissionContext, IsSubscribed = isSubscribed, IsFavorite = isFavorite, Signatures = signatures, Avatars = avatars, VotedPostIDs = votedPostIDs, LastReadTime = lastreadTime
     });
 }
Пример #21
0
 public static MvcHtmlString PagerLinks(this HtmlHelper htmlHelper, string controllerName, string actionName, PagerContext pagerContext, int low, int high, string id, string cssClass, string moreTextCssClass, string currentPageCssClass)
 {
     return(PagerLinks(htmlHelper, controllerName, actionName, pagerContext, low, high, id, Resources.First, Resources.Previous, Resources.Next, Resources.Last, Resources.More + ":", cssClass, moreTextCssClass, currentPageCssClass));
 }