using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using ScrewTurn.Wiki.PluginFramework; namespace ScrewTurn.Wiki { public partial class AdminNavPaths : BasePage { protected void Page_Load(object sender, EventArgs e) { AdminMaster.RedirectToLoginIfNeeded(); if(!AdminMaster.CanManagePages(SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames())) UrlTools.Redirect("AccessDenied.aspx"); if(!Page.IsPostBack) { // Load namespaces // Add root namespace lstNamespace.Items.Add(new ListItem("", "")); List namespaces = Pages.GetNamespaces(); foreach(NamespaceInfo ns in namespaces) { lstNamespace.Items.Add(new ListItem(ns.Name, ns.Name)); } // Load navigation paths rptNavPaths.DataBind(); } btnNewNavPath.Enabled = CanManagePagesInCurrentNamespace(); } protected void lstNamespace_SelectedIndexChanged(object sender, EventArgs e) { rptNavPaths.DataBind(); btnNewNavPath.Enabled = CanManagePagesInCurrentNamespace(); } /// /// Gets a value indicating whether the current user can manage pages in the selected namespace. /// /// true if the user can manage pages, false otherwise. private bool CanManagePagesInCurrentNamespace() { NamespaceInfo nspace = Pages.FindNamespace(lstNamespace.SelectedValue); bool canManagePages = AuthChecker.CheckActionForNamespace(nspace, Actions.ForNamespaces.ManagePages, SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames()); return canManagePages; } protected void rptNavPaths_DataBinding(object sender, EventArgs e) { bool canManagePages = CanManagePagesInCurrentNamespace(); List paths = NavigationPaths.GetNavigationPaths(Pages.FindNamespace(lstNamespace.SelectedValue)); List result = new List(paths.Count); foreach(NavigationPath path in paths) { result.Add(new NavigationPathRow(path, canManagePages, path.FullName == txtCurrentNavPath.Value)); } rptNavPaths.DataSource = result; } protected void rptNavPaths_ItemCommand(object sender, CommandEventArgs e) { txtCurrentNavPath.Value = e.CommandArgument as string; if(e.CommandName == "Select") { if(!CanManagePagesInCurrentNamespace()) return; txtName.Text = txtCurrentNavPath.Value; txtName.Enabled = false; NavigationPath path = NavigationPaths.Find(txtCurrentNavPath.Value); foreach(string page in path.Pages) { PageInfo pageInfo = Pages.FindPage(page); if(pageInfo != null) { PageContent content = Content.GetPageContent(pageInfo, false); lstPages.Items.Add(new ListItem(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.Other, pageInfo), pageInfo.FullName)); } } cvName2.Enabled = false; btnCreate.Visible = false; btnSave.Visible = true; btnDelete.Visible = true; pnlList.Visible = false; pnlEditNavPath.Visible = true; lblResult.Text = ""; } } protected void btnNewNavPath_Click(object sender, EventArgs e) { if(!CanManagePagesInCurrentNamespace()) return; pnlList.Visible = false; pnlEditNavPath.Visible = true; lblResult.Text = ""; } protected void cvName1_ServerValidate(object sender, ServerValidateEventArgs e) { e.IsValid = Pages.IsValidName(txtName.Text); } protected void cvName2_ServerValidate(object sender, ServerValidateEventArgs e) { e.IsValid = NavigationPaths.Find(NameTools.GetFullName(lstNamespace.SelectedValue, txtName.Text)) == null; } /// /// Resets the account editor. /// private void ResetEditor() { txtName.Text = ""; txtName.Enabled = true; txtPageName.Text = ""; lstAvailablePage.Items.Clear(); btnAdd.Enabled = false; lstPages.Items.Clear(); lstPages_SelectedIndexChanged(this, null); cvName2.Enabled = true; btnCreate.Visible = true; btnSave.Visible = false; btnDelete.Visible = false; lblResult.Text = ""; } /// /// Returns to the accounts list. /// private void ReturnToList() { pnlEditNavPath.Visible = false; pnlList.Visible = true; } /// /// Refreshes the users list. /// private void RefreshList() { txtCurrentNavPath.Value = ""; ResetEditor(); rptNavPaths.DataBind(); } protected void btnSearch_Click(object sender, EventArgs e) { txtPageName.Text = txtPageName.Text.Trim(); if(txtPageName.Text.Length == 0) { lstAvailablePage.Items.Clear(); btnAdd.Enabled = false; return; } PageInfo[] pages = SearchTools.SearchSimilarPages(txtPageName.Text, lstNamespace.SelectedValue); lstAvailablePage.Items.Clear(); foreach(PageInfo page in pages) { PageContent content = Content.GetPageContent(page, false); lstAvailablePage.Items.Add(new ListItem(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.Other, page), page.FullName)); } btnAdd.Enabled = pages.Length > 0; } protected void btnAdd_Click(object sender, EventArgs e) { PageInfo page = Pages.FindPage(lstAvailablePage.SelectedValue); PageContent content = Content.GetPageContent(page, false); lstPages.Items.Add(new ListItem(FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.Other, page), page.FullName)); txtPageName.Text = ""; lstAvailablePage.Items.Clear(); btnAdd.Enabled = false; } protected void lstPages_SelectedIndexChanged(object sender, EventArgs e) { btnUp.Enabled = lstPages.SelectedIndex > 0; btnDown.Enabled = lstPages.SelectedIndex < lstPages.Items.Count - 1; btnRemove.Enabled = lstPages.SelectedIndex >= 0;; } protected void btnUp_Click(object sender, EventArgs e) { int index = lstPages.SelectedIndex; ListItem item = lstPages.Items[lstPages.SelectedIndex]; lstPages.Items.RemoveAt(lstPages.SelectedIndex); lstPages.Items.Insert(index - 1, item); lstPages.SelectedIndex = index - 1; lstPages_SelectedIndexChanged(sender, e); } protected void btnDown_Click(object sender, EventArgs e) { int index = lstPages.SelectedIndex; ListItem item = lstPages.Items[lstPages.SelectedIndex]; lstPages.Items.RemoveAt(lstPages.SelectedIndex); lstPages.Items.Insert(index + 1, item); lstPages.SelectedIndex = index + 1; lstPages_SelectedIndexChanged(sender, e); } protected void btnRemove_Click(object sender, EventArgs e) { lstPages.Items.RemoveAt(lstPages.SelectedIndex); lstPages.SelectedIndex = -1; lstPages_SelectedIndexChanged(sender, e); } protected void btnCancel_Click(object sender, EventArgs e) { RefreshList(); ReturnToList(); } protected void btnCreate_Click(object sender, EventArgs e) { if(!CanManagePagesInCurrentNamespace()) return; if(!Page.IsValid) return; if(lstPages.Items.Count == 0) { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.TheNavPathMustContain; return; } bool done = NavigationPaths.AddNavigationPath(Pages.FindNamespace(lstNamespace.SelectedValue), txtName.Text, GetSelectedPages(), null); if(done) { RefreshList(); lblResult.CssClass = "resultok"; lblResult.Text = Properties.Messages.NavPathCreated; ReturnToList(); } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotCreateNavPath; } } protected void btnDelete_Click(object sender, EventArgs e) { if(!CanManagePagesInCurrentNamespace()) return; bool done = NavigationPaths.RemoveNavigationPath(txtCurrentNavPath.Value); if(done) { RefreshList(); lblResult.CssClass = "resultok"; lblResult.Text = Properties.Messages.NavPathDeleted; ReturnToList(); } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotDeleteNavPath; } } protected void btnSave_Click(object sender, EventArgs e) { if(!CanManagePagesInCurrentNamespace()) return; bool done = NavigationPaths.ModifyNavigationPath(txtCurrentNavPath.Value, GetSelectedPages()); if(done) { RefreshList(); lblResult.CssClass = "resultok"; lblResult.Text = Properties.Messages.NavPathSaved; ReturnToList(); } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotSaveNavPath; } } /// /// Gets the selected pages for the navigation path. /// /// The selected pages. private List GetSelectedPages() { List result = new List(lstPages.Items.Count); foreach(ListItem item in lstPages.Items) { PageInfo page = Pages.FindPage(item.Value); if(page != null) { result.Add(page); } } return result; } } /// /// Represents a navigation path for display purposes. /// public class NavigationPathRow { private string fullName, pages, provider, additionalClass; private bool canSelect; /// /// Initializes a new instance of the class. /// /// The original navigation path. /// A value indicating whether the path can be selected. /// A value indicating whether the navigation path is selected. public NavigationPathRow(NavigationPath path, bool canSelect, bool selected) { fullName = path.FullName; pages = path.Pages.Length.ToString(); provider = path.Provider.Information.Name; this.canSelect = canSelect; additionalClass = selected ? " selected" : ""; } /// /// Gets the full name. /// public string FullName { get { return fullName; } } /// /// Gets the pages. /// public string Pages { get { return pages; } } /// /// Gets the provider. /// public string Provider { get { return provider; } } /// /// Gets a value indicating whether the path can be selected. /// public bool CanSelect { get { return canSelect; } } /// /// Gets the additional CSS class. /// public string AdditionalClass { get { return additionalClass; } } } }