screwturn-4/WebApplication/AdminNavPaths.aspx.cs
2009-09-30 13:47:13 +00:00

354 lines
10 KiB
C#

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("<root>", ""));
List<NamespaceInfo> 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();
}
/// <summary>
/// Gets a value indicating whether the current user can manage pages in the selected namespace.
/// </summary>
/// <returns><c>true</c> if the user can manage pages, <c>false</c> otherwise.</returns>
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<NavigationPath> paths = NavigationPaths.GetNavigationPaths(Pages.FindNamespace(lstNamespace.SelectedValue));
List<NavigationPathRow> result = new List<NavigationPathRow>(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;
}
/// <summary>
/// Resets the account editor.
/// </summary>
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 = "";
}
/// <summary>
/// Returns to the accounts list.
/// </summary>
private void ReturnToList() {
pnlEditNavPath.Visible = false;
pnlList.Visible = true;
}
/// <summary>
/// Refreshes the users list.
/// </summary>
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;
}
}
/// <summary>
/// Gets the selected pages for the navigation path.
/// </summary>
/// <returns>The selected pages.</returns>
private List<PageInfo> GetSelectedPages() {
List<PageInfo> result = new List<PageInfo>(lstPages.Items.Count);
foreach(ListItem item in lstPages.Items) {
PageInfo page = Pages.FindPage(item.Value);
if(page != null) {
result.Add(page);
}
}
return result;
}
}
/// <summary>
/// Represents a navigation path for display purposes.
/// </summary>
public class NavigationPathRow {
private string fullName, pages, provider, additionalClass;
private bool canSelect;
/// <summary>
/// Initializes a new instance of the <see cref="T:NavigationPathRow" /> class.
/// </summary>
/// <param name="path">The original navigation path.</param>
/// <param name="canSelect">A value indicating whether the path can be selected.</param>
/// <param name="selected">A value indicating whether the navigation path is selected.</param>
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" : "";
}
/// <summary>
/// Gets the full name.
/// </summary>
public string FullName {
get { return fullName; }
}
/// <summary>
/// Gets the pages.
/// </summary>
public string Pages {
get { return pages; }
}
/// <summary>
/// Gets the provider.
/// </summary>
public string Provider {
get { return provider; }
}
/// <summary>
/// Gets a value indicating whether the path can be selected.
/// </summary>
public bool CanSelect {
get { return canSelect; }
}
/// <summary>
/// Gets the additional CSS class.
/// </summary>
public string AdditionalClass {
get { return additionalClass; }
}
}
}