using System;
using System.Collections.Generic;
using System.Data;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using CMS.CMSHelper;
using CMS.ExtendedControls;
using CMS.GlobalHelper;
using CMS.MessageBoard;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.DocumentEngine;
using CMS.UIControls;
public partial class CMSModules_MessageBoards_Controls_Messages_MessageList : CMSAdminListControl
{
#region "Private variables"
private int mBoardId = 0;
private int mGroupId = 0;
private string mEditPageUrl = "";
protected string mPostBackRefference = "";
private int siteId = 0;
private bool mHideWhenGroupIsNotSupplied = false;
private bool mShowFilter = true;
private string mIsApproved = "no";
private string mIsSpam = "all";
private string mSiteName = String.Empty;
private string mItemsPerPage = String.Empty;
private string mOrderBy = String.Empty;
private bool mAllowMassActions = true;
private bool mShowPermissionMessage = false;
#endregion
#region "Public properties"
///
/// Determines whether to hide the content of the control when group ID is not supplied.
///
public bool HideWhenGroupIsNotSupplied
{
get
{
return mHideWhenGroupIsNotSupplied;
}
set
{
mHideWhenGroupIsNotSupplied = value;
}
}
///
/// If true show permission error.
///
public bool ShowPermissionMessage
{
get
{
return mShowPermissionMessage;
}
set
{
mShowPermissionMessage = value;
}
}
///
/// Site name of blogs.
///
public string SiteName
{
get
{
return mSiteName;
}
set
{
mSiteName = value;
}
}
///
/// If true mass actions are allowed.
///
public bool AllowMassActions
{
get
{
return mAllowMassActions;
}
set
{
mAllowMassActions = value;
}
}
///
/// Items per page.
///
public string ItemsPerPage
{
get
{
return mItemsPerPage;
}
set
{
mItemsPerPage = value;
}
}
///
/// ID of the current board.
///
public int BoardID
{
get
{
return mBoardId;
}
set
{
mBoardId = value;
}
}
///
/// ID of board selected in filter UI.
///
public int SelectedBoardID
{
get
{
return (BoardID > 0) ? BoardID : ValidationHelper.GetInteger(boardSelector.Value, 0);
}
}
///
/// Order by.
///
public string OrderBy
{
get
{
return mOrderBy;
}
set
{
mOrderBy = value;
}
}
///
/// Indicates whether shown comments are approved.
///
public string IsApproved
{
get
{
return mIsApproved;
}
set
{
mIsApproved = value;
}
}
///
/// Indicates whether show spam marked comments.
///
public string IsSpam
{
get
{
return mIsSpam;
}
set
{
mIsSpam = value;
}
}
///
/// ID of the current group.
///
public int GroupID
{
get
{
return mGroupId;
}
set
{
mGroupId = value;
boardSelector.GroupID = value;
}
}
///
/// Target URL for the modal dialog message is edited in.
///
public string EditPageUrl
{
get
{
return mEditPageUrl;
}
set
{
mEditPageUrl = value;
}
}
///
/// If true filter is shown.
///
public bool ShowFilter
{
get
{
return mShowFilter;
}
set
{
mShowFilter = value;
}
}
///
/// Indicates if control is used on live site
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
headerActions.IsLiveSite = value;
}
}
#endregion
#region "Private properties"
///
/// Returns selected site ID.
///
private int SelectedSiteID
{
get
{
Control postbackControl = ControlsHelper.GetPostBackControl(Page);
int val = ValidationHelper.GetInteger((postbackControl == btnFilter) ? siteSelector.Value : ViewState["SelectedSiteID"], CMSContext.CurrentSiteID);
return val;
}
set
{
ViewState["SelectedSiteID"] = value;
}
}
///
/// Where condition.
///
private string WhereCondition
{
get
{
Control postbackControl = ControlsHelper.GetPostBackControl(Page);
return DataHelper.GetNotEmpty((postbackControl == btnFilter) ? GetFilterWhereCondition() : ViewState["WhereCondition"], GetFilterWhereCondition());
}
set
{
ViewState["WhereCondition"] = value;
}
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
// Check if the group was supplied and hide control if required
if ((GroupID == 0) && (HideWhenGroupIsNotSupplied))
{
Visible = false;
}
// If control should be hidden save view state memory
if (StopProcessing || !Visible)
{
EnableViewState = false;
}
if (!ShowFilter)
{
RowFilter.Visible = false;
}
SetContext();
// Initializes the controls
SetupControls();
ReleaseContext();
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (DataHelper.DataSourceIsEmpty(gridElem.GridView.DataSource))
{
lblActions.Visible = false;
drpActions.Visible = false;
btnOk.Visible = false;
}
else
{
// Hide column containing board name when reviewing specific board
if (BoardID > 0)
{
gridElem.NamedColumns["BoardName"].Visible = false;
}
// Hide column containing site name when specific site filtered
if (!plcSite.Visible || (SelectedSiteID > 0))
{
gridElem.NamedColumns["SiteName"].Visible = false;
}
if (ShowPermissionMessage)
{
messageElem.Visible = true;
messageElem.ErrorMessage = GetString("general.nopermission");
}
lblActions.Visible = true;
drpActions.Visible = true;
btnOk.Visible = true;
}
}
#endregion
#region "Private methods"
///
/// Initializes the controls.
///
private void SetupControls()
{
btnFilter.Text = GetString("general.show");
btnOk.Text = GetString("general.ok");
// Mass actions
gridElem.GridOptions.ShowSelection = AllowMassActions;
rowActions.Visible = AllowMassActions;
lblSiteName.AssociatedControlClientID = siteSelector.DropDownSingleSelect.ClientID;
lblBoardName.AssociatedControlClientID = boardSelector.DropDownSingleSelect.ClientID;
gridElem.IsLiveSite = IsLiveSite;
gridElem.OnAction += gridElem_OnAction;
gridElem.OnExternalDataBound += gridElem_OnExternalDataBound;
gridElem.OnBeforeDataReload += gridElem_OnBeforeDataReload;
gridElem.ZeroRowsText = GetString("general.nodatafound");
btnOk.OnClientClick += "return MassConfirm('" + drpActions.ClientID + "'," + ScriptHelper.GetString(GetString("General.ConfirmGlobalDelete")) + ");";
ScriptHelper.RegisterDialogScript(Page);
if (GroupID == 0)
{
GroupID = QueryHelper.GetInteger("groupid", 0);
}
ReloadFilter();
if (!RequestHelper.IsPostBack())
{
// Preselect filter data
PreselectFilter(";;" + GroupID + ";;;NO;;");
}
if (GroupID > 0)
{
// Hide site selection
plcSite.Visible = false;
}
if (BoardID > 0)
{
// Hide board selection
plcBoard.Visible = false;
// Hide site selection
plcSite.Visible = false;
if ((GroupID > 0) && IsLiveSite)
{
InitializeGroupNewMessage();
}
}
siteSelector.UniSelector.OnSelectionChanged += UniSelector_OnSelectionChanged;
// Reload message list script
string board = (BoardID > 0 ? BoardID.ToString() : boardSelector.Value.ToString());
string group = GroupID.ToString();
string user = HTMLHelper.HTMLEncode(txtUserName.Text);
string message = HTMLHelper.HTMLEncode(txtMessage.Text);
string approved = drpApproved.SelectedItem.Value;
string spam = drpSpam.SelectedItem.Value;
bool changemaster = QueryHelper.GetBoolean("changemaster", false);
// Set site selector
siteSelector.DropDownSingleSelect.AutoPostBack = true;
siteSelector.AllowAll = true;
siteSelector.IsLiveSite = IsLiveSite;
boardSelector.IsLiveSite = IsLiveSite;
boardSelector.GroupID = GroupID;
if (!ShowFilter)
{
SiteInfo si = SiteInfoProvider.GetSiteInfo(SiteName);
if (si != null)
{
siteId = si.SiteID;
}
if (SiteName == TreeProvider.ALL_SITES)
{
siteId = -1;
}
}
else
{
// Collect values from filter controls
siteId = SelectedSiteID;
IsApproved = drpApproved.SelectedValue.ToLowerCSafe();
IsSpam = drpSpam.SelectedValue.ToLowerCSafe();
}
if (siteId == 0)
{
siteId = CMSContext.CurrentSiteID;
siteSelector.Value = siteId;
}
SelectedSiteID = siteId;
string cmdArg = siteId + ";" + board + ";" + group + ";" + user.Replace(";", "#sc#") + ";" +
message.Replace(";", "#sc#") + ";" + approved + ";" + spam + ";" + changemaster;
btnRefreshHdn.CommandArgument = cmdArg;
mPostBackRefference = ControlsHelper.GetPostBackEventReference(btnRefreshHdn, null);
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "RefreshBoardList", ScriptHelper.GetScript("function RefreshBoardList(){" +
mPostBackRefference + "}"));
siteSelector.OnlyRunningSites = IsLiveSite;
gridElem.WhereCondition = GetWhereCondition();
if ((!RequestHelper.IsPostBack()) && (!string.IsNullOrEmpty(ItemsPerPage)))
{
gridElem.Pager.DefaultPageSize = ValidationHelper.GetInteger(ItemsPerPage, -1);
}
if (!String.IsNullOrEmpty(OrderBy))
{
gridElem.OrderBy = OrderBy;
}
}
///
/// Creates where condition reflecting filter settings.
///
private string GetFilterWhereCondition()
{
string where = String.Empty;
// Sites dropdown list
if (SelectedSiteID > 0)
{
where = SqlHelperClass.AddWhereCondition(where, "BoardSiteID = " + SelectedSiteID);
}
// Approved dropdown list
switch (IsApproved.ToLowerCSafe())
{
case "yes":
where = SqlHelperClass.AddWhereCondition(where, "MessageApproved = 1");
break;
case "no":
where = SqlHelperClass.AddWhereCondition(where, "MessageApproved = 0");
break;
}
// Spam dropdown list
switch (IsSpam.ToLowerCSafe())
{
case "yes":
where = SqlHelperClass.AddWhereCondition(where, "MessageIsSpam = 1");
break;
case "no":
where = SqlHelperClass.AddWhereCondition(where, "MessageIsSpam = 0");
break;
}
if (BoardID > 0)
{
where = SqlHelperClass.AddWhereCondition(where, "MessageBoardID = " + mBoardId.ToString());
}
else
{
// Board dropdown list
if (SelectedBoardID > 0)
{
where = SqlHelperClass.AddWhereCondition(where, "MessageBoardID = " + SelectedBoardID);
}
else if (GroupID > 0)
{
where = SqlHelperClass.AddWhereCondition(where, "BoardGroupID =" + GroupID);
}
else
{
where = SqlHelperClass.AddWhereCondition(where, "BoardGroupID IS NULL");
}
}
if (txtUserName.Text.Trim() != "")
{
where = SqlHelperClass.AddWhereCondition(where, "MessageUserName LIKE '%" + txtUserName.Text.Trim().Replace("'", "''") + "%'");
}
if (txtMessage.Text.Trim() != "")
{
where = SqlHelperClass.AddWhereCondition(where, "MessageText LIKE '%" + txtMessage.Text.Trim().Replace("'", "''") + "%'");
}
return where;
}
///
/// Creates where condition based on data access permissions.
///
private string GetWhereCondition()
{
string where = String.Empty;
bool isAuthorized = false;
if (SelectedBoardID > 0)
{
BoardInfo selectedBoard = BoardInfoProvider.GetBoardInfo(SelectedBoardID);
if (selectedBoard != null)
{
isAuthorized = BoardInfoProvider.IsUserAuthorizedToManageMessages(selectedBoard);
}
}
// Show messages to boards only where user is moderator
if (!isAuthorized && (!(CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.MessageBoards", "Modify") || CMSContext.CurrentUser.IsGroupAdministrator(GroupID))))
{
where = SqlHelperClass.AddWhereCondition(where, "BoardID IN (SELECT BoardID FROM Board_Moderator WHERE Board_Moderator.UserID = " + CMSContext.CurrentUser.UserID + " )");
}
// Group restriction
if (GroupID > 0)
{
where = SqlHelperClass.AddWhereCondition(where, "BoardGroupID =" + mGroupId);
}
else
{
where = SqlHelperClass.AddWhereCondition(where, "(BoardGroupID = 0 OR BoardGroupID IS NULL)");
}
// Site restriction
if (SelectedSiteID > 0)
{
where = SqlHelperClass.AddWhereCondition(where, "BoardSiteID = " + SelectedSiteID);
}
return where;
}
///
/// Initializes New message action for group message board.
///
private void InitializeGroupNewMessage()
{
plcNewMessageGroups.Visible = true;
// New message link
string[,] actions = new string[1, 6];
actions[0, 0] = HeaderActions.TYPE_HYPERLINK;
actions[0, 1] = GetString("Board.MessageList.NewMessage");
actions[0, 2] = "modalDialog('" + CMSContext.ResolveDialogUrl("~/CMSModules/Groups/CMSPages/Message_Edit.aspx") + "?boardId=" + BoardID + "&groupid=" + GroupID + "&changemaster=" + QueryHelper.GetBoolean("changemaster", false) + "', 'MessageEdit', 500, 400); return false;";
actions[0, 3] = "#";
actions[0, 4] = null;
actions[0, 5] = GetImageUrl("Objects/Board_Message/add.png");
headerActions.Actions = actions;
}
protected void btnFilter_Click(object sender, EventArgs e)
{
WhereCondition = GetFilterWhereCondition();
SelectedSiteID = ValidationHelper.GetInteger(siteSelector.Value, CMSContext.CurrentSiteID);
}
protected void UniSelector_OnSelectionChanged(object sender, EventArgs e)
{
boardSelector.SiteID = ValidationHelper.GetInteger(siteSelector.Value, 0);
boardSelector.ReloadData(true);
ReloadData();
}
///
/// Gets the information on last selected filter configuration and pre-selects the actual values.
///
private void PreselectFilter(string filter)
{
string site = "";
string board = "";
string username = "";
string message = "";
string approved = "no";
string isspam = "";
string filterParams = HttpUtility.HtmlDecode(filter);
if (!string.IsNullOrEmpty(filterParams))
{
string[] paramsArr = filterParams.Split(';');
site = paramsArr[0];
board = paramsArr[1];
GroupID = ValidationHelper.GetInteger(paramsArr[2], 0);
username = paramsArr[3].Replace("#sc#", ";");
message = paramsArr[4].Replace("#sc#", ";");
approved = paramsArr[5];
isspam = paramsArr[6];
}
// Get filter values from the query string by default
// or ViewState if the control is used as part of GroupProfile on Live site
site = QueryHelper.GetString("site", site);
board = QueryHelper.GetString("board", board);
username = QueryHelper.GetString("username", username);
message = QueryHelper.GetString("message", message);
approved = QueryHelper.GetString("approved", approved);
isspam = QueryHelper.GetString("isspam", isspam);
// Ensure site id
if (site != "")
{
siteId = ValidationHelper.GetInteger(site, 0);
siteSelector.Value = siteId;
}
else
{
if (BoardID == 0)
{
siteId = CMSContext.CurrentSiteID;
siteSelector.Value = siteId;
}
}
if (board != "")
{
if (boardSelector.UniSelector.HasData)
{
boardSelector.Value = board;
}
}
// Show user name
if (username != "")
{
txtUserName.Text = username;
}
// Show message
if (message != "")
{
txtMessage.Text = message;
}
if (approved != "")
{
if (drpApproved.Items.Count > 0)
{
drpApproved.SelectedValue = approved;
}
}
if (isspam != "")
{
if (drpSpam.Items.Count > 0)
{
drpSpam.SelectedValue = isspam;
}
}
}
///
/// Load data according to filter settings.
///
public override void ReloadData()
{
base.ReloadData();
gridElem.ReloadData();
}
#endregion
#region "Public methods"
///
/// Sets the filter default values.
///
public void ReloadFilter()
{
if (GroupID == 0)
{
plcSite.Visible = CMSContext.CurrentUser.IsGlobalAdministrator;
}
if (BoardID == 0)
{
// Init board selector
boardSelector.IsLiveSite = IsLiveSite;
boardSelector.SiteID = CMSContext.CurrentSiteID;
boardSelector.GroupID = GroupID;
boardSelector.ReloadData(false);
}
if (drpApproved.Items.Count == 0)
{
// Fill is approved DDL
drpApproved.Items.Add(new ListItem(GetString("general.selectall"), "ALL"));
drpApproved.Items.Add(new ListItem(GetString("general.yes"), "YES"));
drpApproved.Items.Add(new ListItem(GetString("general.no"), "NO"));
drpApproved.SelectedIndex = 0;
}
if (drpSpam.Items.Count == 0)
{
// Fill is span DDL
drpSpam.Items.Add(new ListItem(GetString("general.selectall"), "ALL"));
drpSpam.Items.Add(new ListItem(GetString("general.yes"), "YES"));
drpSpam.Items.Add(new ListItem(GetString("general.no"), "NO"));
drpSpam.SelectedIndex = 0;
}
if (drpActions.Items.Count == 0)
{
// Fill actions DDL
drpActions.Items.Add(new ListItem(GetString("Board.MessageList.Action.Select"), "SELECT"));
drpActions.Items.Add(new ListItem(GetString("Board.MessageList.Action.Approve"), "APPROVE"));
drpActions.Items.Add(new ListItem(GetString("Board.MessageList.Action.Reject"), "REJECT"));
drpActions.Items.Add(new ListItem(GetString("Board.MessageList.Action.Spam"), "SPAM"));
drpActions.Items.Add(new ListItem(GetString("Board.MessageList.Action.NoSpam"), "NOSPAM"));
drpActions.Items.Add(new ListItem(GetString("Board.MessageList.Action.Delete"), "DELETE"));
}
}
#endregion
#region "Event handlers"
protected void btnRefreshHdn_Command(object sender, CommandEventArgs e)
{
// Preselect filter and reload data
PreselectFilter(Convert.ToString(e.CommandArgument));
ReloadData();
}
protected void gridElem_OnBeforeDataReload()
{
gridElem.WhereCondition = WhereCondition;
}
protected object gridElem_OnExternalDataBound(object sender, string sourceName, object parameter)
{
switch (sourceName.ToLowerCSafe())
{
case "messageapproved":
return UniGridFunctions.ColoredSpanYesNo(parameter);
case "messageisspam":
return UniGridFunctions.ColoredSpanYesNoReversed(parameter);
case "messagetext":
string text = parameter.ToString();
if (text.Length > 30)
{
text = text.Substring(0, 30) + "...";
}
return HTMLHelper.HTMLEncode(text);
case "messagetooltip":
return HTMLHelper.HTMLEncodeLineBreaks(parameter.ToString());
case "edit":
ImageButton editButton = ((ImageButton)sender);
int boardID = ValidationHelper.GetInteger(((DataRowView)((GridViewRow)parameter).DataItem).Row["BoardID"], 0);
string url = "~/CMSModules/MessageBoards/Tools/Messages/Message_Edit.aspx";
if (IsLiveSite)
{
url = "~/CMSModules/MessageBoards/CMSPages/Message_Edit.aspx";
}
editButton.OnClientClick = "modalDialog('" + CMSContext.ResolveDialogUrl(((EditPageUrl == "") ? url : EditPageUrl)) +
"?messageboardid=" + boardID + "&messageId=" + editButton.CommandArgument + "', 'MessageEdit', 500, 400); return false;";
break;
case "approve":
bool approve = ValidationHelper.GetBoolean(((DataRowView)((GridViewRow)parameter).DataItem).Row["MessageApproved"], false);
if (!approve)
{
ImageButton button = ((ImageButton)sender);
button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Approve.png");
button.ToolTip = GetString("general.approve");
}
else
{
ImageButton button = ((ImageButton)sender);
button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Reject.png");
button.ToolTip = GetString("general.reject");
}
break;
case "messageinserted":
return CMSContext.ConvertDateTime(ValidationHelper.GetDateTime(parameter, DataHelper.DATETIME_NOT_SELECTED), this).ToString();
}
return parameter;
}
///
/// Handles the UniGrid's OnAction event.
///
/// Name of item (button) that throws event
/// ID (value of Primary key) of corresponding data row
protected void gridElem_OnAction(string actionName, object actionArgument)
{
BoardMessageInfo message = BoardMessageInfoProvider.GetBoardMessageInfo(Convert.ToInt32(actionArgument));
BoardInfo bi = BoardInfoProvider.GetBoardInfo(message.MessageBoardID);
string[] argument = null;
switch (actionName)
{
case "delete":
case "approve":
// Check whether user is board moderator first
if (!BoardInfoProvider.IsUserAuthorizedToManageMessages(bi))
{
// Then check modify to messageboards
if (!CheckPermissions("cms.messageboards", PERMISSION_MODIFY))
{
return;
}
}
break;
}
switch (actionName)
{
case "delete":
if (message != null)
{
BoardMessageInfoProvider.DeleteBoardMessageInfo(message);
}
break;
case "approve":
if (message != null)
{
if (message.MessageApproved)
{
// Reject message
message.MessageApproved = false;
message.MessageApprovedByUserID = 0;
}
else
{
// Approve message
message.MessageApproved = true;
message.MessageApprovedByUserID = CMSContext.CurrentUser.UserID;
}
BoardMessageInfoProvider.SetBoardMessageInfo(message);
}
break;
}
RaiseOnAction(actionName, ((argument == null) ? actionArgument : argument));
}
protected void btnOk_Clicked(object sender, EventArgs e)
{
// Check permissions
if (!CheckPermissions("cms.messageboards", PERMISSION_MODIFY))
{
return;
}
if (drpActions.SelectedValue != "SELECT")
{
List list = gridElem.SelectedItems;
if (list.Count > 0)
{
foreach (string messageId in list)
{
BoardMessageInfo message = BoardMessageInfoProvider.GetBoardMessageInfo(Convert.ToInt32(messageId));
switch (drpActions.SelectedValue)
{
case "DELETE":
// Delete board
BoardMessageInfoProvider.DeleteBoardMessageInfo(message);
break;
case "APPROVE":
if (!message.MessageApproved)
{
message.MessageApproved = true;
message.MessageApprovedByUserID = CMSContext.CurrentUser.UserID;
BoardMessageInfoProvider.SetBoardMessageInfo(message);
}
break;
case "REJECT":
// Reject message
if (message.MessageApproved)
{
message.MessageApproved = false;
message.MessageApprovedByUserID = 0;
BoardMessageInfoProvider.SetBoardMessageInfo(message);
}
break;
case "SPAM":
if (!message.MessageIsSpam)
{
message.MessageIsSpam = true;
BoardMessageInfoProvider.SetBoardMessageInfo(message);
}
break;
case "NOSPAM":
if (message.MessageIsSpam)
{
message.MessageIsSpam = false;
BoardMessageInfoProvider.SetBoardMessageInfo(message);
}
break;
}
}
}
else
{
ltlScript.Text += ScriptHelper.GetAlertScript(GetString("general.noitems"));
}
}
gridElem.ResetSelection();
ReloadData();
}
#endregion
}