354 lines
10 KiB
C#
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; }
|
|
}
|
|
|
|
}
|
|
|
|
}
|