using System;
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.Community;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.ExtendedControls;
public partial class CMSModules_Groups_Controls_Members_MemberEdit : CMSAdminEditControl
{
#region "Variables"
private GroupMemberInfo gmi = null;
private bool newItem = false;
private bool currentRolesLoaded = false;
protected string currentValues = string.Empty;
#endregion
#region "Events"
public event EventHandler OnApprove;
public event EventHandler OnReject;
#endregion
#region "Public properties"
///
/// Messages placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
return plcMess;
}
}
///
/// Indicates if control is used on live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
plcMess.IsLiveSite = value;
base.IsLiveSite = value;
}
}
///
/// Current group member ID.
///
public int MemberID
{
get
{
return ValidationHelper.GetInteger(ViewState["MemberID"], 0);
}
set
{
ViewState["MemberID"] = value;
}
}
///
/// Current group ID.
///
public int GroupID
{
get
{
return ValidationHelper.GetInteger(ViewState["GroupID"], 0);
}
set
{
ViewState["GroupID"] = value;
}
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
RaiseOnCheckPermissions(PERMISSION_READ, this);
if (StopProcessing)
{
return;
}
// Is live site
userSelector.IsLiveSite = IsLiveSite;
userSelector.ShowSiteFilter = false;
userSelector.HideHiddenUsers = true;
userSelector.HideDisabledUsers = true;
usRoles.IsLiveSite = IsLiveSite;
// In case of uniselector's callback calling must be where condition set here
string where = CreateWhereCondition();
usRoles.WhereCondition = where;
if (!RequestHelper.IsPostBack() && !IsLiveSite)
{
// Reload data
ReloadData();
}
// Initialize user selector
if (CMSContext.CurrentSite != null)
{
userSelector.SiteID = CMSContext.CurrentSite.SiteID;
}
// Add onclick handlers
btnSave.Click += new EventHandler(btnSave_Click);
btnApprove.Click += new EventHandler(btnApprove_Click);
btnReject.Click += new EventHandler(btnReject_Click);
usRoles.OnSelectionChanged += new EventHandler(usRoles_OnSelectionChanged);
}
///
/// Reloads data.
///
public override void ReloadData()
{
base.ReloadData();
// Get member object info
if ((MemberID > 0))
{
gmi = GroupMemberInfoProvider.GetGroupMemberInfo(MemberID);
}
// Get roles for current user
LoadCurrentRoles();
string where = CreateWhereCondition();
usRoles.WhereCondition = where;
// Show message or uniselector?
if (DataHelper.DataSourceIsEmpty(RoleInfoProvider.GetRoles("RoleID", where, null, 1)))
{
usRoles.Visible = false;
lblRole.Visible = true;
}
else
{
usRoles.Visible = true;
lblRole.Visible = false;
}
// Enable or disable buttons according to state of user's approval process
if (gmi != null)
{
// Current user cannot approve/reject him self
if (IsLiveSite && (gmi.MemberUserID == CMSContext.CurrentUser.UserID))
{
// Member can nothing
btnApprove.Enabled = false;
btnReject.Enabled = false;
}
else if (gmi.MemberStatus == GroupMemberStatus.Approved)
{
// Member can be rejected
btnApprove.Enabled = false;
btnReject.Enabled = true;
}
else if (gmi.MemberStatus == GroupMemberStatus.Rejected)
{
// Member can be approved
btnApprove.Enabled = true;
btnReject.Enabled = false;
}
else if (gmi.MemberStatus == GroupMemberStatus.WaitingForApproval)
{
// Member can be rejected and approved
btnApprove.Enabled = true;
btnReject.Enabled = true;
}
}
InitializeForm();
usRoles.Value = currentValues;
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
}
protected void btnSave_Click(object sender, EventArgs e)
{
if (SaveData())
{
// Save data
ShowChangesSaved();
RaiseOnSaved();
}
}
protected void btnApprove_Click(object sender, EventArgs e)
{
if (ApproveMember())
{
// Approve member
ShowConfirmation(GetString("group.member.userhasbeenapproved"));
ReloadData();
if (OnApprove != null)
{
OnApprove(this, null);
}
}
}
protected void btnReject_Click(object sender, EventArgs e)
{
if (RejectMember())
{
// Reject member
ShowConfirmation(GetString("group.member.userhasbeenrejected"));
ReloadData();
if (OnReject != null)
{
OnReject(this, null);
}
}
}
#endregion
#region "Public methods"
///
/// Resets the form to default values.
///
public override void ClearForm()
{
// Clear form
txtComment.Text = "";
chkApprove.Checked = true;
}
///
/// Approves member.
///
public bool ApproveMember()
{
// Check MANAGE permission for groups module
if (!CheckPermissions("cms.groups", PERMISSION_MANAGE, GroupID))
{
return false;
}
EnsureMember();
if ((gmi != null) && (CMSContext.CurrentUser != null))
{
// Set properties
gmi.MemberApprovedByUserID = CMSContext.CurrentUser.UserID;
gmi.MemberStatus = GroupMemberStatus.Approved;
gmi.MemberApprovedWhen = DateTime.Now;
gmi.MemberRejectedWhen = DataHelper.DATETIME_NOT_SELECTED;
GroupMemberInfoProvider.SetGroupMemberInfo(gmi);
GroupInfo group = GroupInfoProvider.GetGroupInfo(GroupID);
if ((group != null) && (group.GroupSendWaitingForApprovalNotification))
{
// Send notification email
GroupMemberInfoProvider.SendNotificationMail("Groups.MemberApproved", CMSContext.CurrentSiteName, gmi, false);
}
lblMemberApproved.Text = GetApprovalInfoText(gmi.MemberApprovedWhen, gmi.MemberApprovedByUserID);
lblMemberRejected.Text = GetApprovalInfoText(gmi.MemberRejectedWhen, gmi.MemberApprovedByUserID);
return true;
}
return false;
}
///
/// Approves member.
///
public bool RejectMember()
{
// Check MANAGE permission for groups module
if (!CheckPermissions("cms.groups", PERMISSION_MANAGE, GroupID))
{
return false;
}
EnsureMember();
if ((gmi != null) && (CMSContext.CurrentUser != null))
{
// Set properties
gmi.MemberApprovedByUserID = CMSContext.CurrentUser.UserID;
gmi.MemberStatus = GroupMemberStatus.Rejected;
gmi.MemberApprovedWhen = DataHelper.DATETIME_NOT_SELECTED;
gmi.MemberRejectedWhen = DateTime.Now;
// Save to database
GroupMemberInfoProvider.SetGroupMemberInfo(gmi);
GroupInfo group = GroupInfoProvider.GetGroupInfo(GroupID);
if ((group != null) && (group.GroupSendWaitingForApprovalNotification))
{
// Send notification email
GroupMemberInfoProvider.SendNotificationMail("Groups.MemberRejected", CMSContext.CurrentSiteName, gmi, false);
}
lblMemberApproved.Text = GetApprovalInfoText(gmi.MemberApprovedWhen, gmi.MemberApprovedByUserID);
lblMemberRejected.Text = GetApprovalInfoText(gmi.MemberRejectedWhen, gmi.MemberApprovedByUserID);
return true;
}
return false;
}
///
/// Updates the current Group or creates new if no MemberID is present.
///
public bool SaveData()
{
// Check MANAGE permission for groups module
if (!CheckPermissions("cms.groups", PERMISSION_MANAGE, GroupID))
{
return false;
}
EnsureMember();
newItem = (MemberID == 0);
if (gmi != null)
{
// Get user info
UserInfo ui = UserInfoProvider.GetUserInfo(gmi.MemberUserID);
if (ui != null)
{
// Save user roles
SaveRoles(ui.UserID);
gmi.MemberComment = txtComment.Text;
GroupMemberInfoProvider.SetGroupMemberInfo(gmi);
return true;
}
}
else
{
// New member
if (newItem)
{
int userId = ValidationHelper.GetInteger(userSelector.Value, 0);
// Check if some user was selected
if (userId == 0)
{
ShowError(GetString("group.member.selectuser"));
return false;
}
// Check if user is not already group member
gmi = GroupMemberInfoProvider.GetGroupMemberInfo(userId, GroupID);
if (gmi != null)
{
ShowError(GetString("group.member.userexists"));
return false;
}
// New member object
gmi = new GroupMemberInfo();
gmi.MemberGroupID = GroupID;
gmi.MemberJoined = DateTime.Now;
gmi.MemberUserID = userId;
gmi.MemberComment = txtComment.Text;
if (chkApprove.Checked)
{
// Approve member
gmi.MemberStatus = GroupMemberStatus.Approved;
gmi.MemberApprovedWhen = DateTime.Now;
gmi.MemberApprovedByUserID = CMSContext.CurrentUser.UserID;
}
else
{
gmi.MemberStatus = GroupMemberStatus.WaitingForApproval;
gmi.MemberApprovedByUserID = CMSContext.CurrentUser.UserID;
}
// Save member to database
GroupMemberInfoProvider.SetGroupMemberInfo(gmi);
GroupInfo group = GroupInfoProvider.GetGroupInfo(GroupID);
if (group != null)
{
// Send notification email
if ((chkApprove.Checked) && (group.GroupSendWaitingForApprovalNotification))
{
GroupMemberInfoProvider.SendNotificationMail("Groups.MemberJoinedConfirmation", CMSContext.CurrentSiteName, gmi, false);
}
else
{
if (group.GroupSendWaitingForApprovalNotification)
{
GroupMemberInfoProvider.SendNotificationMail("Groups.MemberJoinedWaitingForApproval ", CMSContext.CurrentSiteName, gmi, false);
}
}
}
// Save user roles
SaveRoles(userId);
MemberID = gmi.MemberID;
return true;
}
}
return false;
}
#endregion
#region "Private methods"
///
/// Ensures the memberinfo object is initialized.
///
private void EnsureMember()
{
if (MemberID > 0)
{
if (gmi == null)
{
// Get group member
gmi = GroupMemberInfoProvider.GetGroupMemberInfo(MemberID);
}
}
}
///
/// Gets roles for current user.
///
private void LoadCurrentRoles()
{
if (gmi != null)
{
// Get user roles
DataSet ds = UserRoleInfoProvider.GetUserRoles("UserID = " + gmi.MemberUserID + "AND RoleID IN (SELECT RoleID FROM CMS_Role WHERE RoleGroupID = " + gmi.MemberGroupID + ")", null, 0, "RoleID");
if (!DataHelper.DataSourceIsEmpty(ds))
{
currentValues = TextHelper.Join(";", SystemDataHelper.GetStringValues(ds.Tables[0], "RoleID"));
}
currentRolesLoaded = true;
}
}
///
/// Creates where condition for unigrid with roles.
///
private string CreateWhereCondition()
{
string where = null;
if (gmi != null)
{
// Member
where = "(RoleGroupID = " + gmi.MemberGroupID + ")";
}
else
{
// Group
where = "(RoleGroupID = " + GroupID + ")";
}
return where;
}
///
/// Initializes the contols in the form.
///
private void InitializeForm()
{
newItem = (MemberID == 0);
// Intialize UI
plcEdit.Visible = !newItem;
plcNew.Visible = newItem;
userSelector.Visible = newItem;
btnApprove.Visible = !newItem;
btnReject.Visible = !newItem;
pnlRoles.GroupingText = GetString("group.member.memberinroles");
if (newItem)
{
pnlRoles.GroupingText = GetString("group.member.addmemberinroles");
}
// Get strings
lblFullNameLabel.Text = GetString("general.user") + ResHelper.Colon;
lblComment.Text = GetString("group.member.comment") + ResHelper.Colon;
lblMemberApprovedLabel.Text = GetString("group.member.approved") + ResHelper.Colon;
lblMemberApprove.Text = GetString("general.approve") + ResHelper.Colon;
lblMemberRejectedLabel.Text = GetString("group.member.rejected") + ResHelper.Colon;
lblMemberJoinedLabel.Text = GetString("group.member.joined") + ResHelper.Colon;
// Initialize buttons
btnSave.Text = GetString("general.ok");
btnApprove.Text = GetString("general.approve");
btnReject.Text = GetString("general.reject");
ClearForm();
// Handle existing Group editing - prepare the data
if (MemberID > 0)
{
HandleExistingMember(gmi);
}
}
///
/// Fills the data into form for specified Group member.
///
private void HandleExistingMember(GroupMemberInfo gmi)
{
if (gmi != null)
{
// Fill controls with data from existing user
int userId = ValidationHelper.GetInteger(gmi.MemberUserID, 0);
UserInfo ui = UserInfoProvider.GetUserInfo(userId);
if (ui != null)
{
lblFullName.Text = HTMLHelper.HTMLEncode(ui.FullName);
}
txtComment.Text = gmi.MemberComment;
lblMemberApproved.Text = GetApprovalInfoText(gmi.MemberApprovedWhen, gmi.MemberApprovedByUserID);
lblMemberRejected.Text = GetApprovalInfoText(gmi.MemberRejectedWhen, gmi.MemberApprovedByUserID);
lblMemberJoined.Text = CMSContext.ConvertDateTime(gmi.MemberJoined, this).ToString();
}
}
///
/// Returns the approval text in format "date (approved by user full name)".
///
/// Date time
/// User id
private string GetApprovalInfoText(DateTime date, int userId)
{
string retval = "";
if (date != DataHelper.DATETIME_NOT_SELECTED)
{
// Get current time
retval = CMSContext.ConvertDateTime(date, this).ToString();
UserInfo ui = UserInfoProvider.GetUserInfo(userId);
if (ui != null)
{
// Add user's full name
retval += " (" + HTMLHelper.HTMLEncode(ui.FullName) + ")";
}
}
return retval;
}
///
/// Saves roles of specified user.
///
private void SaveRoles(int userID)
{
// Load user's roles
if (!currentRolesLoaded)
{
LoadCurrentRoles();
}
// Remove old items
string newValues = ValidationHelper.GetString(usRoles.Value, null);
string items = DataHelper.GetNewItemsInList(newValues, currentValues);
if (!String.IsNullOrEmpty(items))
{
string[] newItems = items.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (newItems != null)
{
// Removes relationship between user and role
foreach (string item in newItems)
{
int roleID = ValidationHelper.GetInteger(item, 0);
UserRoleInfoProvider.RemoveUserFromRole(userID, roleID);
}
}
}
// Add new items
items = DataHelper.GetNewItemsInList(currentValues, newValues);
if (!String.IsNullOrEmpty(items))
{
string[] newItems = items.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (newItems != null)
{
// Add relationship between user and role
foreach (string item in newItems)
{
int roleID = ValidationHelper.GetInteger(item, 0);
UserRoleInfoProvider.AddUserToRole(userID, roleID);
}
}
}
}
///
/// Handles the OnSelectionChanged event of the usRoles control.
/// Saves the user roles when they are changed.
///
/// The source of the event
/// The instance containing the event data
private void usRoles_OnSelectionChanged(object sender, EventArgs e)
{
// Check MANAGE permission for groups module
if (!CheckPermissions("cms.groups", PERMISSION_MANAGE, GroupID))
{
return;
}
EnsureMember();
if (gmi != null)
{
UserInfo ui = UserInfoProvider.GetUserInfo(gmi.MemberUserID);
if (ui != null)
{
// Save user roles
SaveRoles(ui.UserID);
}
}
}
#endregion
}