using System;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Collections;
using CMS.DataEngine;
using CMS.ExtendedControls;
using CMS.ExtendedControls.ActionsConfig;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.UIControls;
public partial class CMSModules_Modules_Pages_Development_Module_UI_Roles : SiteManagerPage
{
#region "Constants"
///
/// CSS class for highlighted UI permission matrix rows.
///
private const string HIGHLIGHTED_ROW_CSS = "Highlighted";
#endregion
#region "Variables"
private int mElementID = 0;
private UserInfo mSelectedUser = null;
private UIElementInfo mElement = null;
private ResourceInfo mElementResource = null;
#endregion
#region "Properties"
///
/// Gets selected user ID.
///
private int SelectedUserID
{
get
{
return ValidationHelper.GetInteger(userSelector.Value, 0);
}
}
///
/// Gets UserInfo object for selected user.
///
private UserInfo SelectedUser
{
get
{
if ((mSelectedUser == null) && (SelectedUserID > 0))
{
mSelectedUser = UserInfoProvider.GetUserInfo(SelectedUserID);
}
return mSelectedUser;
}
}
///
/// Gets selected UI element ID.
///
private int ElementID
{
get
{
if (mElementID == 0)
{
mElementID = QueryHelper.GetInteger("elementid", 0);
}
return mElementID;
}
}
///
/// Gets UIElementInfo object for selected UI element.
///
private UIElementInfo Element
{
get
{
if (mElement == null)
{
mElement = UIElementInfoProvider.GetUIElementInfo(ElementID);
}
return mElement;
}
}
///
/// Gets element resource for selected UI element.
///
private ResourceInfo ElementResource
{
get
{
if (mElementResource == null)
{
if (Element != null)
{
mElementResource = ResourceInfoProvider.GetResourceInfo(Element.ElementResourceID);
}
}
return mElementResource;
}
}
#endregion
#region "Page events"
protected void Page_Load(object sender, EventArgs e)
{
// Initialize UI permission matrix
gridMatrix.ContentBefore = "
";
gridMatrix.ContentAfter = "
";
gridMatrix.ColumnsCount = 1;
gridMatrix.OnItemChanged += gridMatrix_OnItemChanged;
gridMatrix.ContentBeforeRowsCssClass = "ContentBefore";
gridMatrix.OnGetRowItemCssClass += gridMatrix_OnGetRowItemCssClass;
gridMatrix.NoRecordsMessage = GetString("general.emptymatrix");
//Initialize site selector
siteSelector.DropDownSingleSelect.AutoPostBack = true;
siteSelector.UniSelector.OnSelectionChanged += UniSelector_SelectedIndexChanged;
siteSelector.IsLiveSite = false;
siteSelector.AllowGlobal = true;
// Initialize user selector
userSelector.SiteID = (siteSelector.SiteID > 0) ? siteSelector.SiteID : 0;
userSelector.ShowSiteFilter = false;
userSelector.DropDownSingleSelect.AutoPostBack = true;
// Display all users if global
if (userSelector.SiteID <= 0)
{
userSelector.DisplayUsersFromAllSites = true;
}
else
{
userSelector.DisplayUsersFromAllSites = false;
}
chkUserOnly.Text = GetString("Administration-Permissions_Header.UserRoles");
// Register js script to display checkbox not adjustable message
string script = "function NA() {alert(" + ScriptHelper.GetString(GetString("Administration-Permissions_Matrix.NotAdjustable")) + ");}";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "NotAdjustableScript", ScriptHelper.GetScript(script));
if ((Element != null) && Element.ElementLevel > 1)
{
// Prepare header action
HeaderActions actions = CurrentMaster.HeaderActions;
// Create 'Copy from parent' action
actions.ActionsList.Add(new HeaderAction
{
ControlType = HeaderActionTypeEnum.Hyperlink,
Text = GetString("uiprofile.permissionsfromparent"),
OnClientClick = "return ConfirmCopyFromParent();",
ImageUrl = GetImageUrl("Objects/CMS_UIElement/list.png"),
CommandName = "copyFromParent",
CommandArgument = string.Empty
});
actions.ActionPerformed += new CommandEventHandler(HeaderActions_ActionPerformed);
// Register javascript to confirm copy
script = "function ConfirmCopyFromParent() {return confirm(" + ScriptHelper.GetString(GetString("uiprofile.ConfirmCopyFromParent")) + ");}";
ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "ConfirmCopyFromParent", ScriptHelper.GetScript(script));
}
}
protected override void OnPreRender(EventArgs e)
{
// Load the matrix
if (Element != null)
{
// Disable check box if no user selected
if (SelectedUserID > 0)
{
chkUserOnly.Enabled = true;
}
else
{
chkUserOnly.Checked = false;
chkUserOnly.Enabled = false;
}
// Set info label
lblInfo.Text = String.Format(GetString("resource.ui.rolesinfo"), HTMLHelper.HTMLEncode(Element.ElementDisplayName));
// Set matrix parameters
gridMatrix.QueryParameters = GetQueryParameters(siteSelector.SiteID, mElementID, Element.ElementDisplayName);
gridMatrix.WhereCondition = GetWhereCondition();
gridMatrix.ShowContentBeforeRows = (SelectedUser != null);
gridMatrix.ContentBeforeRows = GetBeforeRowsContent();
ucDisabledModule.SiteName = siteSelector.SiteName;
ucDisabledModule.InfoText = GetString("resource.ui.disabled");
if (!gridMatrix.HasData)
{
plcUpdate.Visible = false;
lblInfo.Text = (chkUserOnly.Checked) ? GetString("general.norolemember") : GetString("uiprofile.norole");
}
else
{
// Inform user that global admin was selected
if ((SelectedUserID > 0) && SelectedUser.IsGlobalAdministrator)
{
ShowInformation(GetString("uiprofile.GlobalAdministrator"));
}
plcUpdate.Visible = true;
}
}
base.OnPreRender(e);
}
#endregion
#region "Control events"
protected void UniSelector_SelectedIndexChanged(object sender, EventArgs e)
{
if (Element != null)
{
// Reset selected user
userSelector.ReloadData();
mSelectedUser = null;
// Set matrix current page to first
gridMatrix.Pager.CurrentPage = 1;
}
}
protected void gridMatrix_OnItemChanged(object sender, int rowItemId, int colItemId, bool newState)
{
if (newState)
{
RoleUIElementInfoProvider.AddRoleUIElementInfo(rowItemId, colItemId);
}
else
{
RoleUIElementInfoProvider.DeleteRoleUIElementInfo(rowItemId, colItemId);
}
// Invalidate all users
UserInfo.TYPEINFO.InvalidateAllObjects();
// Forget old user
mCurrentUser = null;
// Clear hashtables with users
UserInfoProvider.Clear(true);
// Update content before rows
gridMatrix.ContentBeforeRows = GetBeforeRowsContent();
}
protected string gridMatrix_OnGetRowItemCssClass(object sender, DataRow dr)
{
string roleName = ValidationHelper.GetString(dr["RoleName"], String.Empty);
// Check if all necessary data are available
if (!String.IsNullOrEmpty(roleName) && (SelectedUser != null))
{
if (SelectedUser.IsInRole(roleName, siteSelector.SiteName, (siteSelector.SiteID <= 0), true))
{
return HIGHLIGHTED_ROW_CSS;
}
}
return String.Empty;
}
protected void HeaderActions_ActionPerformed(object sender, CommandEventArgs e)
{
switch (e.CommandName.ToLowerCSafe())
{
case "copyfromparent":
if (Element != null)
{
CopyFromParent(Element);
// Set matrix current page to first
gridMatrix.Pager.CurrentPage = 1;
}
break;
}
}
#endregion
#region "Private methods"
///
/// Returns query parameters for permission matrix.
///
/// Site ID
/// Element ID
/// Element display name
private QueryDataParameters GetQueryParameters(int siteId, int elementId, string elementName)
{
QueryDataParameters parameters = new QueryDataParameters();
parameters.Add("@SiteID", (ValidationHelper.GetString(siteSelector.Value, String.Empty) == siteSelector.GlobalRecordValue) ? 0 : siteId);
parameters.Add("@ElementID", mElementID);
parameters.Add("@ElementDisplayName", ResHelper.LocalizeString(elementName));
return parameters;
}
///
/// Copies role binding from parent UI element.
///
/// Element which are permissions copied to
private void CopyFromParent(UIElementInfo element)
{
using (CMSTransactionScope tr = new CMSTransactionScope())
{
if (element != null)
{
// Delete existing bindings
DataSet elemRoles = RoleUIElementInfoProvider.GetRoleUIElements("ElementID = " + element.ElementID, null);
if (!DataHelper.DataSourceIsEmpty(elemRoles))
{
foreach (DataRow dr in elemRoles.Tables[0].Rows)
{
// Get role id
int roleId = ValidationHelper.GetInteger(dr["RoleID"], 0);
// Remove binding
RoleUIElementInfoProvider.DeleteRoleUIElementInfo(roleId, element.ElementID);
}
}
// Add same bindings as parent has
int parentElemId = element.ElementParentID;
DataSet parentRoles = RoleUIElementInfoProvider.GetRoleUIElements("ElementID = " + parentElemId, null);
if (!DataHelper.DataSourceIsEmpty(parentRoles))
{
foreach (DataRow dr in parentRoles.Tables[0].Rows)
{
// Get role id
int roleId = ValidationHelper.GetInteger(dr["RoleID"], 0);
// Create binding
RoleUIElementInfoProvider.AddRoleUIElementInfo(roleId, element.ElementID);
}
}
}
// Commit transaction
tr.Commit();
}
// Invalidate all users
UserInfo.TYPEINFO.InvalidateAllObjects();
// Clear hashtables with users
UserInfoProvider.Clear(true);
}
///
/// Gets user effective UI permission HTML content.
///
private string GetBeforeRowsContent()
{
// Initialize string builder
StringBuilder sb = new StringBuilder("");
// Check if every necessary property is set
if ((SelectedUser != null) && (Element != null) && (ElementResource != null))
{
// Initialize variables used during rendering
string firstColumnsWidth = (gridMatrix.FirstColumnsWidth > 0) ? "width:" + gridMatrix.FirstColumnsWidth + (gridMatrix.UsePercentage ? "%;" : "px;") : "";
string imagesUrl = GetImageUrl("Design/Controls/UniMatrix/", false, true);
string userName = HTMLHelper.HTMLEncode(TextHelper.LimitLength(Functions.GetFormattedUserName(SelectedUser.UserName, SelectedUser.FullName), 50));
// Get user name column
sb.Append("\n");
// Render UI permission cell
sb.Append(";) | \n");
// Add finish row
sb.Append(" | ");
}
return sb.ToString();
}
///
/// Gets where condition for the matrix.
///
/// String representing where condition for the matrix
private string GetWhereCondition()
{
string where = "RoleGroupId IS NULL";
if (chkUserOnly.Checked && (SelectedUserID > 0))
{
// Get selected site name
string siteName = UserInfo.GLOBAL_ROLES_KEY;
if (siteSelector.SiteID > 0)
{
siteName = siteSelector.SiteName.ToLowerCSafe();
}
string rolesWhere = SelectedUser.GetRoleIdList((siteSelector.SiteID <= 0), true, siteName);
// Add roles where condition
if (!String.IsNullOrEmpty(rolesWhere))
{
where = SqlHelperClass.AddWhereCondition(where, "RoleID IN(" + rolesWhere + ")");
}
else
{
where = SqlHelperClass.NO_DATA_WHERE;
gridMatrix.StopProcessing = true;
}
}
return where;
}
#endregion
}