Пример #1
0
 public void GetNavigation(INavigationBuilder navigationBuilder) {
     navigationBuilder
         .Add("缩略图尺寸管理", PermissionProvider.Thumbnail, builder => builder.Action("Index", "Thumbnail", new { area = "Admin" }))
         .Add("角色管理", PermissionProvider.Role, builder => builder.Action("Index", "Role", new { area = "Admin" }))
         .Add("用户管理", PermissionProvider.Account, builder => builder.Action("Index", "Account", new { area = "Admin" }))
         .Add("系统信息管理", PermissionProvider.SysSetting, builder => builder.Action("Index", "Setting", new { area = "Admin" }), 100)
         .Add("导航管理", PermissionProvider.Navigation, builder => builder.Action("Index", "Navigation", new { area = "Admin" }))
         .Add("分类管理", PermissionProvider.Category, builder => builder.Action("Index", "Category", new { area = "Admin" }))
         .Add("控制台", PermissionProvider.Dashboard, builder => builder.Action("Index", "Dashboard", new { area = "Admin" }));
 }
Пример #2
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "topic", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get model from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Topic)] as Topic;

            if (entity == null)
            {
                return;
            }

            // No edited information
            if (entity.EditedDate == null)
            {
                return;
            }

            // Add HistoryMenu view to entity
            builder
            .Add(T["History"], int.MinValue, history => history
                 .View("HistoryMenu", new
            {
                model = new HistoryMenuViewModel()
                {
                    Entity    = entity,
                    DialogUrl = _contextFacade.GetRouteUrl(new RouteValueDictionary()
                    {
                        ["area"]       = "Plato.Discuss.History",
                        ["controller"] = "Home",
                        ["action"]     = "Index",
                        ["id"]         = 0
                    })
                }
            })
                 .Permission(Permissions.ViewEntityHistory)
                 );
        }
Пример #3
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "admin", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Hidden whilst in demo mode, still accessible via direct Url
            if (_platoOptions.DemoMode)
            {
                return;
            }

            builder
            .Add(T["Settings"], int.MaxValue, settings => settings
                 .IconCss("fal fa-cog")
                 .Add(T["Demo"], int.MaxValue - 450, demo => demo
                      .Action("Index", "Admin", "Plato.Site.Demo")
                      .LocalNav())
                 );
        }
Пример #4
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "post", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Ensure we have a dropdown view model provided via our view provider
            if (!(builder.ActionContext.HttpContext.Items[typeof(VisibilityDropDownViewModel)] is VisibilityDropDownViewModel dropdown))
            {
                return;
            }

            // Get area name
            var areaName = string.Empty;

            if (builder.ActionContext.RouteData.Values.ContainsKey("area"))
            {
                areaName = builder.ActionContext.RouteData.Values["area"].ToString();
            }

            // Ensure we are in the correct area
            if (!String.Equals(areaName, "Plato.Articles", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }


            // Build navigation
            builder
            .Add(dropdown.SelectedValue == "hidden" ? T["Hidden"] : T["Public"], int.MinValue + 10, create => create
                 .View("SelectDropDown", new
            {
                model = dropdown
            })
                 , new List <string>()
            {
                "nav-item", "text-muted"
            });
        }
Пример #5
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "doc-footer", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get model from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Doc)] as Doc;
            var reply  = builder.ActionContext.HttpContext.Items[typeof(DocComment)] as DocComment;

            // Add reaction list to navigation
            builder
            .Add(T["DocFlipper"], int.MaxValue - 10, flipper => flipper
                 .View("DocFlipper", new
            {
                entity,
                reply
            })
                 //.Permission(Permissions.ViewDocReactions)
                 );
        }
Пример #6
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "profile", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            var    context = _actionContextAccessor.ActionContext;
            object id      = context.RouteData.Values["opts.id"],
                   alias   = context.RouteData.Values["opts.alias"];

            builder
            .Add(T["Overview"], 1, profile => profile
                 .Action("Display", "Home", "Plato.Users", new RouteValueDictionary()
            {
                ["opts.id"]    = id?.ToString(),
                ["opts.alias"] = alias?.ToString()
            })
                 //.Permission(Permissions.ManageUsers)
                 .LocalNav()
                 );
        }
Пример #7
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "topic-reply-details", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get entity from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Topic)] as Topic;

            if (entity == null)
            {
                return;
            }

            // Get reply from navigation builder
            var reply = builder.ActionContext.HttpContext.Items[typeof(Reply)] as Reply;

            if (reply == null)
            {
                return;
            }

            // Add reaction menu view to navigation
            builder
            .Add(T["Vote"], react => react
                 .View("VoteToggle", new
            {
                model = new VoteToggleViewModel()
                {
                    Entity     = entity,
                    Reply      = reply,
                    Permission = Permissions.VoteTopicReplies,
                    ApiUrl     = "api/discuss/vote/post"
                }
            })
                 //.Permission(Permissions.ReactToTopics)
                 );
        }
Пример #8
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {

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

            // Get model from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Question)] as Question;

            // We always need an entity
            if (entity == null)
            {
                return;
            }

            // If entity is hidden don't allow voting
            if (entity.IsHidden())
            {
                return;
            }

            // Add reaction menu view to navigation
            builder
                .Add(T["Vote"], react => react
                    .View("VoteToggle", new
                    {
                        model = new VoteToggleViewModel()
                        {                     
                            Entity = entity,
                            Permission = Permissions.VoteQuestions,
                            ApiUrl = "api/questions/vote/post"
                        }
                    })
                );

        }
Пример #9
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "issue-comment-details", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get entity from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Issue)] as Issue;

            if (entity == null)
            {
                return;
            }

            // Get reply from navigation builder
            var reply = builder.ActionContext.HttpContext.Items[typeof(Comment)] as Comment;

            if (reply == null)
            {
                return;
            }

            // Add vote toggle view to navigation
            builder
            .Add(T["Vote"], react => react
                 .View("VoteToggle", new
            {
                model = new VoteToggleViewModel()
                {
                    Entity     = entity,
                    Reply      = reply,
                    Permission = Permissions.VoteIdeaComments,
                    ApiUrl     = "api/ideas/vote/post"
                }
            })
                 );
        }
Пример #10
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "site", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            builder
            .Add(T["Issues"], 7, issues => issues
                 .IconCss("fal fa-bug")
                 .Action("Index", "Home", "Plato.Issues")
                 .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "tooltip" },
                { "data-placement", "bottom" },
                { "title", T["Issues"] }
            })
                 .LocalNav()
                 , new List <string>()
            {
                "articles", "text-hidden"
            }
                 );
        }
Пример #11
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "admin", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            builder
            .Add(T["Files"], int.MaxValue - 15, configuration => configuration
                 .IconCss("fal fa-paperclip")
                 .Add(T["Browse"], int.MinValue + 30, installed => installed
                      .Action("Index", "Admin", "Plato.Files")
                      .Permission(Permissions.BrowseFiles)
                      .LocalNav()
                      ).Add(T["Add"], int.MinValue + 30, installed => installed
                            .Action("Create", "Admin", "Plato.Files")
                            .Permission(Permissions.AddFiles)
                            .LocalNav()
                            ).Add(T["Settings"], int.MinValue + 30, installed => installed
                                  .Action("Settings", "Admin", "Plato.Files")
                                  .Permission(Permissions.ManageFileSettings)
                                  .LocalNav()
                                  ));
        }
Пример #12
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "article", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get model from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Article)] as Article;

            // We need an entity
            if (entity == null)
            {
                return;
            }

            // Don't allow reactions for hidden entities
            if (entity.IsHidden())
            {
                return;
            }

            // Add reaction menu view to navigation
            builder
            .Add(T["React"], react => react
                 .View("ReactionMenu", new
            {
                model = new ReactionMenuViewModel()
                {
                    ModuleId   = "Plato.Articles.Reactions",
                    Entity     = entity,
                    Permission = Permissions.ReactToArticles
                }
            })
                 );
        }
Пример #13
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "topic-reply-footer", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get model from navigation builder
            var entity = builder.ActionContext.HttpContext.Items[typeof(Topic)] as Topic;

            if (entity == null)
            {
                return;
            }

            var reply = builder.ActionContext.HttpContext.Items[typeof(Reply)] as Reply;

            if (reply == null)
            {
                return;
            }

            builder
            .Add(T["React"], int.MaxValue, react => react
                 .View("ReactionList", new
            {
                model = new ReactionListViewModel()
                {
                    Entity     = entity,
                    Reply      = reply,
                    Permission = Permissions.ReactToReplies
                }
            })
                 .Permission(Permissions.ViewReplyReactions)
                 );
        }
Пример #14
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "question-answer", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get entity from context
            var entity = builder.ActionContext.HttpContext.Items[typeof(Question)] as Question;

            if (entity == null)
            {
                return;
            }

            // Get reply from context
            var reply = builder.ActionContext.HttpContext.Items[typeof(Answer)] as Answer;

            if (reply == null)
            {
                return;
            }

            //// Get authenticated user from features
            var user = builder.ActionContext.HttpContext.Features[typeof(User)] as User;

            // Get delete / restore permission
            Permission deletePermission = null;

            if (reply.IsDeleted)
            {
                deletePermission = user?.Id == reply.CreatedUserId
                    ? Permissions.RestoreOwnAnswers
                    : Permissions.RestoreAnyAnswer;
            }
            else
            {
                deletePermission = user?.Id == reply.CreatedUserId
                    ? Permissions.DeleteOwnAnswers
                    : Permissions.DeleteAnyAnswer;
            }

            // Options
            builder
            .Add(T["Options"], int.MaxValue, options => options
                 .IconCss("fa fa-ellipsis-h")
                 .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "tooltip" },
                { "title", T["Options"] }
            })
                 .Add(T["Edit"], int.MinValue, edit => edit
                      .Action("EditReply", "Home", "Plato.Questions", new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Permission(user?.Id == reply.CreatedUserId ?
                                  Permissions.EditOwnAnswers :
                                  Permissions.EditAnyAnswer)
                      .LocalNav())
                 .Add(reply.IsHidden ? T["Unhide"] : T["Hide"], 2, edit => edit
                      .Action(reply.IsHidden ? "ShowReply" : "HideReply", "Home", "Plato.Questions",
                              new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Resource(entity.CategoryId)
                      .Permission(reply.IsHidden
                                ? Permissions.ShowAnswers
                                : Permissions.HideAnswers)
                      .LocalNav()
                      )
                 .Add(reply.IsSpam ? T["Not Spam"] : T["Spam"], 3, spam => spam
                      .Action(reply.IsSpam ? "ReplyFromSpam" : "ReplyToSpam", "Home", "Plato.Questions",
                              new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Resource(entity.CategoryId)
                      .Permission(reply.IsSpam
                                ? Permissions.AnswerFromSpam
                                : Permissions.AnswerToSpam)
                      .LocalNav()
                      )
                 .Add(T["Report"], int.MaxValue - 2, report => report
                      .Action("Report", "Home", "Plato.Questions", new RouteValueDictionary()
            {
                ["opts.id"]      = entity.Id,
                ["opts.alias"]   = entity.Alias,
                ["opts.replyId"] = reply.Id
            })
                      .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "dialog" },
                { "data-dialog-modal-css", "modal fade" },
                { "data-dialog-css", "modal-dialog modal-lg" }
            })
                      .Permission(Permissions.ReportAnswers)
                      .LocalNav()
                      )
                 .Add(T["Divider"], int.MaxValue - 1, divider => divider
                      .Permission(deletePermission)
                      .DividerCss("dropdown-divider").LocalNav()
                      )
                 .Add(reply.IsDeleted ? T["Restore"] : T["Delete"], int.MaxValue, edit => edit
                      .Action(reply.IsDeleted ? "RestoreReply" : "DeleteReply", "Home", "Plato.Questions",
                              new RouteValueDictionary()
            {
                ["id"] = reply.Id
            })
                      .Permission(deletePermission)
                      .LocalNav(),
                      reply.IsDeleted
                                ? new List <string>()
            {
                "dropdown-item", "dropdown-item-success"
            }
                                : new List <string>()
            {
                "dropdown-item", "dropdown-item-danger"
            }
                      )
                 , new List <string>()
            {
                "answer-options", "text-muted", "dropdown-toggle-no-caret", "text-hidden"
            }
                 );


            // If the reply if deleted display permanent delete option
            if (reply.IsDeleted)
            {
                // Permanent delete permissions
                var permanentDeletePermission = reply.CreatedUserId == user?.Id
                    ? Permissions.PermanentDeleteOwnAnswers
                    : Permissions.PermanentDeleteAnyAnswer;

                builder
                .Add(T["Delete"], int.MinValue, options => options
                     .IconCss("fal fa-trash-alt")
                     .Attributes(new Dictionary <string, object>()
                {
                    { "data-toggle", "tooltip" },
                    { "data-provide", "confirm" },
                    { "title", T["Permanent Delete"] },
                })
                     .Action("PermanentDeleteReply", "Home", "Plato.Questions",
                             new RouteValueDictionary()
                {
                    ["id"] = reply.Id
                })
                     .Permission(permanentDeletePermission)
                     .LocalNav()
                     , new List <string>()
                {
                    "question-permanent-delete", "text-muted", "text-hidden"
                }
                     );
            }

            // If entity & reply are not hidden and entity is not locked allow replies
            if (!entity.IsHidden() && !reply.IsHidden() && !entity.IsLocked)
            {
                builder
                .Add(T["Comment"], int.MaxValue, options => options
                     .IconCss("fa fa-reply")
                     .Attributes(new Dictionary <string, object>()
                {
                    { "data-provide", "postQuote" },
                    { "data-quote-selector", "#quote" + reply.Id.ToString() },
                    { "data-toggle", "tooltip" },
                    { "title", T["Reply"] }
                })
                     .Action("Login", "Account", "Plato.Users",
                             new RouteValueDictionary()
                {
                    ["returnUrl"] = builder.ActionContext.HttpContext.Request.Path
                })
                     .Permission(Permissions.PostAnswers)
                     .LocalNav()
                     , new List <string>()
                {
                    "answer-reply", "text-muted", "text-hidden"
                }
                     );
            }
        }
Пример #15
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "idea", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get model from context
            var entity = builder.ActionContext.HttpContext.Items[typeof(Idea)] as Idea;

            if (entity == null)
            {
                return;
            }

            // Get authenticated user from context
            var user = builder.ActionContext.HttpContext.Features[typeof(User)] as User;

            Permission deletePermission = null;

            if (entity.IsDeleted)
            {
                // Do we have restore permissions?
                deletePermission = user?.Id == entity.CreatedUserId
                    ? Permissions.RestoreOwnIdeas
                    : Permissions.RestoreAnyIdea;
            }
            else
            {
                // Do we have delete permissions?
                deletePermission = user?.Id == entity.CreatedUserId
                    ? Permissions.DeleteOwnIdeas
                    : Permissions.DeleteAnyIdeaComment;
            }

            // Add entity options
            builder
            .Add(T["Options"], int.MaxValue, options => options
                 .IconCss("fa fa-ellipsis-h")
                 .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "tooltip" },
                { "title", T["Options"] }
            })
                 .Add(T["Edit"], int.MinValue, edit => edit
                      .Action("Edit", "Home", "Plato.Ideas", new RouteValueDictionary()
            {
                ["opts.id"]    = entity.Id,
                ["opts.alias"] = entity.Alias
            })
                      .Permission(user?.Id == entity.CreatedUserId
                                ? Permissions.EditOwnIdeas
                                : Permissions.EditAnyIdea)
                      .LocalNav()
                      )
                 .Add(entity.IsPinned ? T["Unpin"] : T["Pin"], 1, edit => edit
                      .Action(entity.IsPinned ? "Unpin" : "Pin", "Home", "Plato.Ideas",
                              new RouteValueDictionary()
            {
                ["id"] = entity.Id
            })
                      .Resource(entity.CategoryId)
                      .Permission(entity.IsPinned
                                ? Permissions.UnpinIdeas
                                : Permissions.PinIdeas)
                      .LocalNav()
                      )
                 .Add(entity.IsLocked ? T["Unlock"] : T["Lock"], 2, edit => edit
                      .Action(entity.IsLocked ? "Unlock" : "Lock", "Home", "Plato.Ideas",
                              new RouteValueDictionary()
            {
                ["id"] = entity.Id
            })
                      .Resource(entity.CategoryId)
                      .Permission(entity.IsLocked
                                ? Permissions.UnlockIdeas
                                : Permissions.LockIdeas)
                      .LocalNav()
                      )
                 .Add(entity.IsHidden ? T["Unhide"] : T["Hide"], 2, edit => edit
                      .Action(entity.IsHidden ? "Show" : "Hide", "Home", "Plato.Ideas",
                              new RouteValueDictionary()
            {
                ["id"] = entity.Id
            })
                      .Resource(entity.CategoryId)
                      .Permission(entity.IsHidden
                                ? Permissions.ShowIdeas
                                : Permissions.HideIdeas)
                      .LocalNav()
                      )
                 .Add(entity.IsSpam ? T["Not Spam"] : T["Spam"], 2, spam => spam
                      .Action(entity.IsSpam ? "FromSpam" : "ToSpam", "Home", "Plato.Ideas",
                              new RouteValueDictionary()
            {
                ["id"] = entity.Id
            })
                      .Resource(entity.CategoryId)
                      .Permission(entity.IsSpam
                                ? Permissions.IdeaFromSpam
                                : Permissions.IdeaToSpam)
                      .LocalNav()
                      )
                 .Add(T["Report"], int.MaxValue - 2, report => report
                      .Action("Report", "Home", "Plato.Ideas", new RouteValueDictionary()
            {
                ["opts.id"]    = entity.Id,
                ["opts.alias"] = entity.Alias
            })
                      .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "dialog" },
                { "data-dialog-modal-css", "modal fade" },
                { "data-dialog-css", "modal-dialog modal-lg" }
            })
                      .Permission(Permissions.ReportIdeas)
                      .LocalNav()
                      )
                 .Add(T["Divider"], int.MaxValue - 1, divider => divider
                      .Permission(deletePermission)
                      .DividerCss("dropdown-divider").LocalNav()
                      )
                 .Add(entity.IsDeleted ? T["Restore"] : T["Delete"], int.MaxValue, edit => edit
                      .Attributes(!entity.IsDeleted
                                    ? new Dictionary <string, object>()
            {
                ["data-provide"]         = "confirm",
                ["data-confirm-message"] =
                    "Are you sure you want to delete this idea?\n\nClick OK to confirm..."
            }
                                    : new Dictionary <string, object>())
                      .Action(entity.IsDeleted ? "Restore" : "Delete", "Home", "Plato.Ideas",
                              new RouteValueDictionary()
            {
                ["id"] = entity.Id
            })
                      .Permission(deletePermission)
                      .LocalNav(),
                      entity.IsDeleted
                                ? new List <string>()
            {
                "dropdown-item", "dropdown-item-success"
            }
                                : new List <string>()
            {
                "dropdown-item", "dropdown-item-danger"
            }
                      )
                 , new List <string>()
            {
                "idea-options", "text-muted", "dropdown-toggle-no-caret", "text-hidden"
            }
                 );

            // If the entity if deleted display permanent delete option
            if (entity.IsDeleted)
            {
                // Permanent delete permissions
                var permanentDeletePermission = entity.CreatedUserId == user?.Id
                    ? Permissions.PermanentDeleteOwnIdeas
                    : Permissions.PermanentDeleteAnyIdea;

                builder
                .Add(T["Delete"], int.MinValue, options => options
                     .IconCss("fal fa-trash-alt")
                     .Attributes(new Dictionary <string, object>()
                {
                    { "data-toggle", "tooltip" },
                    { "data-provide", "confirm" },
                    { "title", T["Permanent Delete"] },
                })
                     .Action("PermanentDelete", "Home", "Plato.Ideas",
                             new RouteValueDictionary()
                {
                    ["id"] = entity.Id.ToString(),
                })
                     .Permission(permanentDeletePermission)
                     .LocalNav()
                     , new List <string>()
                {
                    "idea-permanent-delete", "text-muted", "text-hidden"
                }
                     );
            }


            // If entity is not hidden or locked allow replies
            if (!entity.IsHidden() && !entity.IsLocked)
            {
                builder
                .Add(T["Comment"], int.MaxValue, options => options
                     .IconCss("fa fa-reply")
                     .Attributes(new Dictionary <string, object>()
                {
                    { "data-provide", "postReply" },
                    { "data-toggle", "tooltip" },
                    { "title", T["Comment"] }
                })
                     .Action("Login", "Account", "Plato.Users",
                             new RouteValueDictionary()
                {
                    ["returnUrl"] = builder.ActionContext.HttpContext.Request.Path
                })
                     .Permission(Permissions.PostIdeaComments)
                     .LocalNav()
                     , new List <string>()
                {
                    "idea-reply", "text-muted", "text-hidden"
                }
                     );
            }
        }
Пример #16
0
 public void GetNavigation(INavigationBuilder navigationBuilder)
 {
     navigationBuilder
         .Add("微信管理", PermissionProvider.WeChat, builder => builder.Action("Index", "WeChat", new { area = "WeChat" }), 10)
         .Add("微信菜单管理", PermissionProvider.WeChatMenus, builder => builder.Action("WechatMenus", "WeChat", new { area = "WeChat" }), 11);
 }
Пример #17
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "question-answer", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get authenticated user
            var user = builder.ActionContext.HttpContext.Features[typeof(User)] as User;

            // We need to be authenticated to flag replies as accepted answers
            if (user == null)
            {
                return;
            }

            // Get entity from context
            var entity = builder.ActionContext.HttpContext.Items[typeof(Question)] as Question;

            if (entity == null)
            {
                return;
            }

            // Get reply from navigation builder
            var reply = builder.ActionContext.HttpContext.Items[typeof(Answer)] as Answer;

            if (reply == null)
            {
                return;
            }

            // Get permission
            var permission = entity.CreatedUserId == user.Id
                ? Permissions.MarkOwnRepliesAnswer
                : Permissions.MarkAnyReplyAnswer;

            // If entity & reply are not hidden and entity is not locked allow answers
            if (!entity.IsHidden() && !reply.IsHidden() && !entity.IsLocked)
            {
                builder
                .Add(T["Answer"], int.MinValue, options => options
                     .IconCss(reply.IsAnswer ? "fa fa-times" : "fa fa-check")
                     .Attributes(new Dictionary <string, object>()
                {
                    { "data-toggle", "tooltip" },
                    { "title", reply.IsAnswer ? T["Remove As Answer"] : T["Mark As Answer"] }
                })
                     .Action(reply.IsAnswer ? "FromAnswer" : "ToAnswer", "Home", "Plato.Questions.Answers",
                             new RouteValueDictionary()
                {
                    ["Id"] = reply.Id
                })
                     .Permission(permission)
                     .LocalNav()
                     , new List <string>()
                {
                    "topic-answer", "text-muted", "text-hidden"
                }
                     );
            }
        }
Пример #18
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "topic", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get authenticated user from features
            var user = builder.ActionContext.HttpContext.Features[typeof(User)] as User;

            // We always need to be authenticated as a moderator
            if (user == null)
            {
                return;
            }

            // Get model from context
            var topic = builder.ActionContext.HttpContext.Items[typeof(Topic)] as Topic;

            if (topic == null)
            {
                return;
            }

            // Get moderator from context provided by moderator topic view provider
            var moderator = builder.ActionContext.HttpContext.Items[typeof(Moderator)] as Moderator;

            // We always need a moderator to show this menu
            if (moderator == null)
            {
                return;
            }

            // Add moderator options
            builder
            .Add(T["Options"], int.MaxValue, options => options
                 .IconCss("fa fa-ellipsis-h")
                 .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "tooltip" },
                { "title", T["Options"] }
            })
                 .Add(T["Edit"], "1", int.MinValue, edit => edit
                      .Action("Edit", "Home", "Plato.Discuss", new RouteValueDictionary()
            {
                ["opts.id"]    = topic.Id,
                ["opts.alias"] = topic.Alias
            })
                      .Resource(topic.CategoryId)
                      .Permission(ModeratorPermissions.EditTopics)
                      .LocalNav()
                      )
                 .Add(topic.IsPinned ? T["Unpin"] : T["Pin"], 1, edit => edit
                      .Action(topic.IsPinned ? "Unpin" : "Pin", "Home", "Plato.Discuss.Categories.Moderators",
                              new RouteValueDictionary()
            {
                ["id"] = topic.Id
            })
                      .Resource(topic.CategoryId)
                      .Permission(topic.IsPinned
                                ? ModeratorPermissions.UnpinTopics
                                : ModeratorPermissions.PinTopics)
                      .LocalNav()
                      )
                 .Add(topic.IsLocked ? T["Unlock"] : T["Lock"], 2, edit => edit
                      .Action(topic.IsLocked ? "Unlock" : "Lock", "Home", "Plato.Discuss.Categories.Moderators",
                              new RouteValueDictionary()
            {
                ["id"] = topic.Id
            })
                      .Resource(topic.CategoryId)
                      .Permission(topic.IsLocked
                                ? ModeratorPermissions.UnlockTopics
                                : ModeratorPermissions.LockTopics)
                      .LocalNav()
                      )
                 .Add(topic.IsHidden ? T["Unhide"] : T["Hide"], 2, edit => edit
                      .Action(topic.IsHidden ? "Show" : "Hide", "Home", "Plato.Discuss.Categories.Moderators",
                              new RouteValueDictionary()
            {
                ["id"] = topic.Id
            })
                      .Resource(topic.CategoryId)
                      .Permission(topic.IsHidden
                                ? ModeratorPermissions.ShowTopics
                                : ModeratorPermissions.HideTopics)
                      .LocalNav()
                      )
                 .Add(topic.IsSpam ? T["Not Spam"] : T["Spam"], 2, spam => spam
                      .Action(topic.IsSpam ? "FromSpam" : "ToSpam", "Home", "Plato.Discuss.Categories.Moderators",
                              new RouteValueDictionary()
            {
                ["id"] = topic.Id
            })
                      .Resource(topic.CategoryId)
                      .Permission(topic.IsSpam
                                ? ModeratorPermissions.TopicFromSpam
                                : ModeratorPermissions.TopicToSpam)
                      .LocalNav()
                      )
                 .Add(T["Divider"], int.MaxValue - 1, divider => divider
                      .Permission(ModeratorPermissions.DeleteTopics)
                      .DividerCss("dropdown-divider").LocalNav()
                      )
                 .Add(topic.IsDeleted ? T["Restore"] : T["Delete"], "1", int.MaxValue, delete => delete
                      .Attributes(!topic.IsDeleted
                                    ? new Dictionary <string, object>()
            {
                ["data-provide"]         = "confirm",
                ["data-confirm-message"] = "Are you sure you want to delete this topic?\n\nClick OK to confirm..."
            }
                                    : new Dictionary <string, object>())
                      .Action(topic.IsDeleted ? "Restore" : "Delete", "Home",
                              "Plato.Discuss.Categories.Moderators", new RouteValueDictionary()
            {
                ["id"] = topic.Id
            })
                      .Resource(topic.CategoryId)
                      .Permission(ModeratorPermissions.DeleteTopics)
                      .LocalNav(),
                      topic.IsDeleted
                                ? new List <string>()
            {
                "dropdown-item", "dropdown-item-success"
            }
                                : new List <string>()
            {
                "dropdown-item", "dropdown-item-danger"
            }
                      )
                 , new List <string>()
            {
                "topic-options", "text-muted", "dropdown-toggle-no-caret", "text-hidden"
            }
                 );
        }
Пример #19
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "admin-user", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get user we are editing from context
            var user = builder.ActionContext.HttpContext.Items[typeof(User)] as User;

            if (user == null)
            {
                return;
            }

            // Add topic options
            builder
            .Add(T["Options"], options => options
                 .IconCss("fa fa-ellipsis-h")
                 .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "tooltip" },
                { "title", T["Options"] }
            })
                 .Add(user.IsVerified ? T["Remove Verified"] : T["Add to Verified"], verified => verified
                      .Action(user.IsVerified ? "InvalidateUser" : "ValidateUser", "Admin", "Plato.Users",
                              new RouteValueDictionary()
            {
                ["Id"] = user.Id.ToString()
            })
                      .Permission(Permissions.UserToVerify)
                      .LocalNav().LocalNav(), new List <string>()
            {
                "is-verified"
            }
                      )
                 .Add(user.IsStaff ? T["Remove Staff"] : T["Add to Staff"], staff => staff
                      .Action(user.IsStaff ? "FromStaff" : "ToStaff", "Admin", "Plato.Users",
                              new RouteValueDictionary()
            {
                ["Id"] = user.Id.ToString()
            })
                      .Permission(Permissions.UserToStaff)
                      .LocalNav(), new List <string>()
            {
                "is-staff"
            })
                 .Add(T["Divider"], divider => divider
                      .Permission(Permissions.UserToSpam)
                      .DividerCss("dropdown-divider").LocalNav()
                      )
                 .Add(user.IsSpam ? T["Remove from SPAM"] : T["Add to SPAM"], spam => spam
                      .Attributes(!user.IsSpam
                                    ? new Dictionary <string, object>()
            {
                { "data-provide", "confirm" },
                {
                    "data-confirm-message",
                    T[
                        "Are you sure you want to flag this user as SPAM?\n\nAll new and existing contributions will be flagged as SPAM and only visible to those with permission to view content flagged as SPAM.\n\nClick OK to confirm..."]
                }
            }
                                    : new Dictionary <string, object>())
                      .Action(user.IsSpam ? "RemoveSpam" : "SpamUser", "Admin", "Plato.Users",
                              new RouteValueDictionary()
            {
                ["Id"] = user.Id.ToString()
            })
                      .Permission(Permissions.UserToSpam)
                      .LocalNav(), user.IsSpam
                                ? new List <string>()
            {
                "dropdown-item is-spam", "dropdown-item-danger is-spam"
            }
                                : new List <string>()
            {
                "dropdown-item is-spam"
            }
                      )
                 .Add(user.IsBanned ? T["Remove Ban"] : T["Add to Banned"], banned => banned
                      .Attributes(!user.IsBanned
                                    ? new Dictionary <string, object>()
            {
                { "data-provide", "confirm" },
                {
                    "data-confirm-message",
                    T[
                        "Are you sure you want to ban this user?\n\nContributions from this user will be soft deleted and only visible to those with permission to view deleted content. The user will be logged out and will not be able to login again or post new content.\n\nClick OK to confirm..."]
                }
            }
                                    : new Dictionary <string, object>())
                      .Action(user.IsBanned ? "RemoveBan" : "BanUser", "Admin", "Plato.Users",
                              new RouteValueDictionary()
            {
                ["Id"] = user.Id.ToString()
            })
                      .Permission(Permissions.UserToBanned)
                      .LocalNav(), user.IsBanned
                                ? new List <string>()
            {
                "dropdown-item is-banned", "dropdown-item-danger"
            }
                                : new List <string>()
            {
                "dropdown-item is-banned"
            }
                      )
                 .Add(T["Divider"], divider => divider
                      .Permission(Permissions.ResetUserPasswords)
                      .DividerCss("dropdown-divider").LocalNav()
                      )
                 .Add(T["Edit Password"], password => password
                      .Action("EditPassword", "Admin", "Plato.Users", new RouteValueDictionary()
            {
                ["Id"] = user.Id.ToString()
            })
                      .Permission(Permissions.ResetUserPasswords)
                      .LocalNav()
                      )

                 , new List <string>()
            {
                "topic-options", "text-muted", "dropdown-toggle-no-caret", "text-hidden"
            }
                 );
        }
Пример #20
0
        public void BuildNavigation(string name, INavigationBuilder builder)
        {
            if (!String.Equals(name, "topic-reply", StringComparison.OrdinalIgnoreCase))
            {
                return;
            }

            // Get model from navigation builder
            var topic = builder.ActionContext.HttpContext.Items[typeof(Topic)] as Topic;

            if (topic == null)
            {
                return;
            }


            // Get model from navigation builder
            var reply = builder.ActionContext.HttpContext.Items[typeof(Reply)] as Reply;

            if (reply == null)
            {
                return;
            }

            // Get moderator from context provided by moderator topic view provider
            var moderator = builder.ActionContext.HttpContext.Items[typeof(Moderator)] as Moderator;

            // We always need a moderator to show this menu
            if (moderator == null)
            {
                return;
            }

            // Options
            builder
            .Add(T["Options"], int.MaxValue, options => options
                 .IconCss("fa fa-ellipsis-h")
                 .Attributes(new Dictionary <string, object>()
            {
                { "data-provide", "tooltip" },
                { "title", T["Options"] }
            })
                 .Add(T["Edit"], "1", int.MinValue, edit => edit
                      .Action("EditReply", "Home", "Plato.Discuss", new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Resource(topic.CategoryId)
                      .Permission(ModeratorPermissions.EditReplies)
                      .LocalNav())
                 .Add(reply.IsHidden ? T["Unhide"] : T["Hide"], 2, edit => edit
                      .Action(reply.IsHidden ? "ShowReply" : "HideReply", "Home", "Plato.Discuss.Categories.Moderators",
                              new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Resource(topic.CategoryId)
                      .Permission(reply.IsHidden
                                ? ModeratorPermissions.ShowReplies
                                : ModeratorPermissions.HideReplies)
                      .LocalNav()
                      )
                 .Add(reply.IsSpam ? T["Not Spam"] : T["Spam"], 3, spam => spam
                      .Action(reply.IsSpam ? "ReplyFromSpam" : "ReplyToSpam", "Home", "Plato.Discuss.Categories.Moderators",
                              new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Resource(topic.CategoryId)
                      .Permission(reply.IsSpam
                                ? ModeratorPermissions.ReplyFromSpam
                                : ModeratorPermissions.ReplyToSpam)
                      .LocalNav()
                      )
                 .Add(T["Divider"], int.MaxValue - 1, divider => divider
                      .Permission(ModeratorPermissions.DeleteReplies)
                      .DividerCss("dropdown-divider").LocalNav()
                      )
                 .Add(reply.IsDeleted ? T["Restore"] : T["Delete"], int.MaxValue, delete => delete
                      .Action(reply.IsDeleted ? "RestoreReply" : "DeleteReply", "Home", "Plato.Discuss.Categories.Moderators", new RouteValueDictionary()
            {
                ["id"] = reply?.Id ?? 0
            })
                      .Resource(topic.CategoryId)
                      .Permission(reply.IsDeleted
                                    ? ModeratorPermissions.RestoreReplies
                                    : ModeratorPermissions.DeleteReplies)
                      .LocalNav(), new List <string>()
            {
                "dropdown-item", "dropdown-item-danger"
            }
                      )

                 , new List <string>()
            {
                "topic-options", "text-muted", "dropdown-toggle-no-caret", "text-hidden"
            }
                 );
        }