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 }