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 }