Merge Commit

This commit is contained in:
robvde 2013-10-20 09:26:33 +04:00
commit 9247943323
24 changed files with 946 additions and 225 deletions

View file

@ -112,10 +112,10 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="secMailboxPassword.Text" xml:space="preserve">
<value>User Password Policy</value>
@ -124,6 +124,6 @@
<value>Organization Id Policy</value>
</data>
<data name="threeOrg.Text" xml:space="preserve">
<value>Organization Policy</value>
<value>Additional Default Security Groups</value>
</data>
</root>

View file

@ -32,7 +32,7 @@
</table>
</asp:Panel>
<wsp:CollapsiblePanel id="threeOrg" runat="server" TargetControlID="OrgPanel" meta:resourcekey="threeOrg" Text="Organization Policy"/>
<wsp:CollapsiblePanel id="threeOrg" runat="server" TargetControlID="OrgPanel" meta:resourcekey="threeOrg" Text="Additional Default Security Groups"/>
<asp:Panel ID="OrgPanel" runat="server" Height="0" style="overflow:hidden;">
<table>
<tr>

View file

@ -26,12 +26,17 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System.Linq;
using System.Collections.Generic;
using WebsitePanel.EnterpriseServer;
using WebsitePanel.EnterpriseServer.Base.HostedSolution;
namespace WebsitePanel.Portal
{
public partial class SettingsExchangePolicy : WebsitePanelControlBase, IUserSettingsEditorControl
{
internal static AdditionalGroup[] additionalGroups;
#region IUserSettingsEditorControl Members
public void BindSettings(UserSettings settings)
@ -39,6 +44,10 @@ namespace WebsitePanel.Portal
// mailbox
mailboxPasswordPolicy.Value = settings["MailboxPasswordPolicy"];
orgIdPolicy.Value = settings["OrgIdPolicy"];
additionalGroups = ES.Services.Organizations.GetAdditionalGroups(settings.UserId);
orgPolicy.SetAdditionalGroups(additionalGroups);
orgPolicy.Value = settings["OrgPolicy"];
}
@ -47,6 +56,32 @@ namespace WebsitePanel.Portal
settings["MailboxPasswordPolicy"] = mailboxPasswordPolicy.Value;
settings["OrgIdPolicy"] = orgIdPolicy.Value;
settings["OrgPolicy"] = orgPolicy.Value;
if (Utils.ParseBool(orgPolicy.Value, false))
{
List<AdditionalGroup> newAdditionalGroups = orgPolicy.GetGridViewGroups();
foreach (AdditionalGroup oldGroup in additionalGroups)
{
AdditionalGroup upGroup = newAdditionalGroups.Where(x => x.GroupId == oldGroup.GroupId).FirstOrDefault();
if(upGroup != null && upGroup.GroupName != oldGroup.GroupName)
{
ES.Services.Organizations.UpdateAdditionalGroup(oldGroup.GroupId, upGroup.GroupName);
newAdditionalGroups.Remove(upGroup);
}
else
{
ES.Services.Organizations.DeleteAdditionalGroup(oldGroup.GroupId);
}
}
foreach (AdditionalGroup newGroup in newAdditionalGroups)
{
ES.Services.Organizations.AddAdditionalGroup(settings.UserId, newGroup.GroupName);
}
}
}
#endregion

View file

@ -25,7 +25,6 @@
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.

View file

@ -117,7 +117,31 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="enablePolicyCheckBox.Text" xml:space="preserve">
<data name="btnAddAdditionalGroup.Text" xml:space="preserve">
<value>Add New Group</value>
</data>
<data name="btnUpdateAdditionalGroup.Text" xml:space="preserve">
<value>Update Group</value>
</data>
<data name="chkEnablePolicy.Text" xml:space="preserve">
<value>Enable Policy</value>
</data>
<data name="gvAdditionalGroup.HeaderText" xml:space="preserve">
<value>Display Name</value>
</data>
<data name="gvAdditionalGroupEdit.HeaderText" xml:space="preserve">
<value>Select</value>
</data>
<data name="gvAdditionalGroups.EmptyDataText" xml:space="preserve">
<value>No groups have been added yet. To add a new group click "Add New Group" button.</value>
</data>
<data name="lblAdditionalGroupName.Text" xml:space="preserve">
<value>Display Name:</value>
</data>
<data name="valDuplicateAdditionalGroup" xml:space="preserve">
<value>*</value>
</data>
<data name="valRequireAdditionalGroup.Text" xml:space="preserve">
<value>*</value>
</data>
</root>

View file

@ -1,14 +1,59 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OrgPolicyEditor.ascx.cs" Inherits="WebsitePanel.Portal.UserControls.OrgPolicyEditor" %>
<asp:UpdatePanel runat="server" ID="OrgPolicyPanel" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:CheckBox id="enablePolicyCheckBox" runat="server" meta:resourcekey="enablePolicyCheckBox" Text="Enable Policy" CssClass="NormalBold" AutoPostBack="true" OnCheckedChanged="EnablePolicy_CheckedChanged"/>
<table id="PolicyTable" runat="server" cellpadding="2">
<asp:CheckBox id="chkEnablePolicy" runat="server" meta:resourcekey="chkEnablePolicy" Text="Enable Policy"
CssClass="NormalBold" AutoPostBack="true" OnCheckedChanged="chkEnablePolicy_CheckedChanged"/>
<table id="PolicyBlock" runat="server" style="width:500px;">
<tr>
<td class="Normal" style="width:150px;">
<asp:Label ID="lblEnableDefaultGroups" runat="server" meta:resourcekey="lblEnableDefaultGroups" Text="Enable Default Groups:"/>
<td colspan="2" style="padding-top: 10px;">
<asp:GridView id="gvAdditionalGroups" runat="server" EnableViewState="true" AutoGenerateColumns="false"
Width="100%" meta:resourcekey="gvAdditionalGroups" CssSelectorClass="NormalGridView" OnRowCommand="gvAdditionalGroup_RowCommand" DataKeyNames="GroupId">
<Columns>
<asp:TemplateField meta:resourcekey="gvAdditionalGroupEdit" HeaderText="gvAdditionalGroupEdit">
<ItemTemplate>
<asp:ImageButton ID="cmdEdit" runat="server" SkinID="EditSmall" CommandName="EditItem" AlternateText="Edit record" CommandArgument='<%# Eval("GroupId") %>' ></asp:ImageButton>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField meta:resourcekey="gvAdditionalGroup" HeaderText="gvAdditionalGroup">
<ItemStyle Width="100%"></ItemStyle>
<ItemTemplate>
<asp:Literal id="litDisplayAdditionalGroup" runat="server" Text='<%# Eval("GroupName") %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemStyle Width="30px" Wrap="false"></ItemStyle>
<ItemTemplate>
&nbsp;<asp:ImageButton id="imgDelAdditionalGroup" runat="server" Text="Delete" SkinID="ExchangeDelete"
CommandName="DeleteItem" CommandArgument='<%# Eval("GroupId") %>'
meta:resourcekey="cmdDelete" OnClientClick="return confirm('Are you sure you want to delete selected group?')"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</td>
<td class="Normal">
<asp:CheckBox ID="chkEnableDefaultGroups" runat="server" CssClass="NormalTextBox" />
</tr>
<tr>
<td class="Normal" style="width:150px; padding-top: 10px;">
<asp:Label ID="lblAdditionalGroupName" runat="server" meta:resourcekey="lblAdditionalGroupName" Text="Display Name:"/>
</td>
<td class="Normal" style="padding-top: 10px;">
<asp:TextBox ID="txtAdditionalGroup" runat="server" CssClass="NormalTextBox" Width="200"/>
<asp:RequiredFieldValidator ID="valRequireAdditionalGroup" runat="server" meta:resourcekey="valRequireAdditionalGroup" ControlToValidate="txtAdditionalGroup"
ErrorMessage="Enter Display Name" Display="Dynamic" Text="*" ValidationGroup="SettingsAdditionalGroupEditor" SetFocusOnError="True"></asp:RequiredFieldValidator>
<asp:CustomValidator ID="valDuplicateAdditionalGroup" runat="server" meta:resourcekey="valDuplicateAdditionalGroup" ControlToValidate="txtAdditionalGroup"
OnServerValidate="DuplicateName_Validation" ErrorMessage="Duplicate Display Name" ValidateEmptyText="false" Display="Dynamic" Text="*"
ValidationGroup="SettingsAdditionalGroupEditor" SetFocusOnError="True"></asp:CustomValidator>
</td>
</tr>
<tr>
<td colspan="2" style="padding-top: 10px;">
<div class="FormButtonsBarClean">
<asp:Button ID="btnAddAdditionalGroup" runat="server" meta:resourcekey="btnAddAdditionalGroup"
Text="Add New Group" CssClass="Button1" OnClick="btnAddAdditionalGroup_Click" ValidationGroup="SettingsAdditionalGroupEditor" />
<asp:Button ID="btnUpdateAdditionalGroup" runat="server" meta:resourcekey="btnUpdateAdditionalGroup"
Text="Update Group" CssClass="Button1" OnClick="btnUpdateAdditionalGroup_Click" ValidationGroup="SettingsAdditionalGroupEditor" />
</div>
</td>
</tr>
</table>

View file

@ -27,8 +27,12 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer.Base.HostedSolution;
namespace WebsitePanel.Portal.UserControls
{
@ -40,30 +44,21 @@ namespace WebsitePanel.Portal.UserControls
{
get
{
var sb = new StringBuilder();
sb.Append(enablePolicyCheckBox.Checked.ToString()).Append(";");
sb.Append(chkEnableDefaultGroups.Checked.ToString()).Append(";");
return sb.ToString();
return chkEnablePolicy.Checked.ToString();
}
set
{
if (String.IsNullOrEmpty(value))
{
enablePolicyCheckBox.Checked = true;
chkEnableDefaultGroups.Checked = true;
chkEnablePolicy.Checked = false;
}
else
{
try
{
string[] parts = value.Split(';');
enablePolicyCheckBox.Checked = Utils.ParseBool(parts[0], true);
chkEnableDefaultGroups.Checked = Utils.ParseBool(parts[1], true);
}
catch
{
chkEnablePolicy.Checked = Utils.ParseBool(value, true);
}
catch {}
}
ToggleControls();
@ -74,24 +69,140 @@ namespace WebsitePanel.Portal.UserControls
#region Methods
protected void Page_Load(object sender, EventArgs e)
public void SetAdditionalGroups(AdditionalGroup[] additionalGroups)
{
BindAdditionalGroups(additionalGroups);
}
private void ToggleControls()
public List<AdditionalGroup> GetGridViewGroups()
{
PolicyTable.Visible = enablePolicyCheckBox.Checked;
List<AdditionalGroup> additionalGroups = new List<AdditionalGroup>();
for (int i = 0; i < gvAdditionalGroups.Rows.Count; i++)
{
GridViewRow row = gvAdditionalGroups.Rows[i];
ImageButton cmdEdit = (ImageButton)row.FindControl("cmdEdit");
if (cmdEdit == null)
continue;
AdditionalGroup group = new AdditionalGroup();
group.GroupId = (int)gvAdditionalGroups.DataKeys[i][0];
group.GroupName = ((Literal)row.FindControl("litDisplayAdditionalGroup")).Text;
additionalGroups.Add(group);
}
return additionalGroups;
}
protected void ToggleControls()
{
PolicyBlock.Visible = chkEnablePolicy.Checked;
}
protected void BindAdditionalGroups(AdditionalGroup[] additionalGroups)
{
gvAdditionalGroups.DataSource = additionalGroups;
gvAdditionalGroups.DataBind();
}
protected int GetRowIndexByDataKey(int dataKey)
{
int index = 0;
foreach (DataKey key in gvAdditionalGroups.DataKeys)
{
if (Utils.ParseInt(key.Value, 0) == dataKey)
break;
index++;
}
return index >= gvAdditionalGroups.DataKeys.Count ? -1 : index;
}
#endregion
#region Event Handlers
protected void EnablePolicy_CheckedChanged(object sender, EventArgs e)
protected void chkEnablePolicy_CheckedChanged(object sender, EventArgs e)
{
ToggleControls();
}
protected void btnAddAdditionalGroup_Click(object sender, EventArgs e)
{
if (!Page.IsValid)
return;
List<AdditionalGroup> additionalGroups = GetGridViewGroups();
AdditionalGroup additionalGroup = new AdditionalGroup();
additionalGroup.GroupId = additionalGroups.Count != 0
? additionalGroups.Select(x => x.GroupId).Max() + 1
: 1;
additionalGroup.GroupName = txtAdditionalGroup.Text;
additionalGroups.Add(additionalGroup);
BindAdditionalGroups(additionalGroups.ToArray());
txtAdditionalGroup.Text = string.Empty;
}
protected void btnUpdateAdditionalGroup_Click(object sender, EventArgs e)
{
if (ViewState["AdditionalGroupID"] == null || !Page.IsValid)
return;
List<AdditionalGroup> additionalGroups = GetGridViewGroups();
additionalGroups
.Where(x => x.GroupId == (int)ViewState["AdditionalGroupID"])
.First().GroupName = txtAdditionalGroup.Text;
BindAdditionalGroups(additionalGroups.ToArray());
txtAdditionalGroup.Text = string.Empty;
}
protected void gvAdditionalGroup_RowCommand(object sender, GridViewCommandEventArgs e)
{
int additionalGroupId = Utils.ParseInt(e.CommandArgument.ToString(), 0);
List<AdditionalGroup> additionalGroups = GetGridViewGroups();
int rowIndex = GetRowIndexByDataKey(additionalGroupId);
if (rowIndex != -1)
{
switch (e.CommandName)
{
case "DeleteItem":
BindAdditionalGroups(
additionalGroups
.Where(x => x.GroupId != additionalGroupId).ToArray());
break;
case "EditItem":
ViewState["AdditionalGroupID"] = additionalGroupId;
txtAdditionalGroup.Text = additionalGroups
.Where(x => x.GroupId == additionalGroupId)
.Select(y => y.GroupName).First();
break;
}
}
}
protected void DuplicateName_Validation(object source, ServerValidateEventArgs arguments)
{
List<AdditionalGroup> additionalGroups = GetGridViewGroups();
arguments.IsValid = (additionalGroups.Where(x => x.GroupName.Trim() == arguments.Value).Count() == 0);
}
#endregion
}
}

View file

@ -25,7 +25,6 @@
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
@ -50,39 +49,84 @@ namespace WebsitePanel.Portal.UserControls {
protected global::System.Web.UI.UpdatePanel OrgPolicyPanel;
/// <summary>
/// enablePolicyCheckBox control.
/// chkEnablePolicy control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox enablePolicyCheckBox;
protected global::System.Web.UI.WebControls.CheckBox chkEnablePolicy;
/// <summary>
/// PolicyTable control.
/// PolicyBlock control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTable PolicyTable;
protected global::System.Web.UI.HtmlControls.HtmlTable PolicyBlock;
/// <summary>
/// lblEnableDefaultGroups control.
/// gvAdditionalGroups control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblEnableDefaultGroups;
protected global::System.Web.UI.WebControls.GridView gvAdditionalGroups;
/// <summary>
/// chkEnableDefaultGroups control.
/// lblAdditionalGroupName control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CheckBox chkEnableDefaultGroups;
protected global::System.Web.UI.WebControls.Label lblAdditionalGroupName;
/// <summary>
/// txtAdditionalGroup control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtAdditionalGroup;
/// <summary>
/// valRequireAdditionalGroup control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireAdditionalGroup;
/// <summary>
/// valDuplicateAdditionalGroup control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.CustomValidator valDuplicateAdditionalGroup;
/// <summary>
/// btnAddAdditionalGroup control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnAddAdditionalGroup;
/// <summary>
/// btnUpdateAdditionalGroup control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Button btnUpdateAdditionalGroup;
}
}

View file

@ -5226,6 +5226,7 @@
</Content>
<Content Include="ProviderControls\App_LocalResources\EnterpriseStorage_Settings.ascx.resx" />
<Content Include="ExchangeServer\App_LocalResources\EnterpriseStorageSpaces.ascx.resx">
<Content Include="UserControls\App_LocalResources\OrgPolicyEditor.ascx.resx" />
<SubType>Designer</SubType>
</Content>
<EmbeddedResource Include="UserControls\App_LocalResources\EditDomainsList.ascx.resx">