using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using Aitex.Core.Account; namespace MECF.Framework.UI.Core.Accounts { /// <summary> /// Interaction logic for RoleEditView.xaml /// </summary> public partial class RoleEditView : Window { public RoleEditView() { InitializeComponent(); Loaded += new RoutedEventHandler(RoleEditView_Loaded); dataGrid1.CanUserAddRows = false; dataGrid1.RowHeight = 25; } public class PermissionClass { public static Dictionary<Permission_CN, string> ViewPermissionCheck = new Dictionary<Permission_CN, string>(); static IEnumerable<Permission_CN> permissions = Enum.GetValues(typeof(Permission_CN)).Cast<Permission_CN>(); static PermissionClass() { foreach (Permission_CN p in permissions) { if (p == Permission_CN.ProcessHidden) { //只针对ReactorProcess相关界面 ViewPermissionCheck.Add(p, "RecipeMonitor"); //"ProcessView" } else { ViewPermissionCheck.Add(p, ""); } } } public static List<Permission_CN> GetPermissions(string viewName) { List<Permission_CN> permissionInfos = new List<Permission_CN>(); foreach (Permission_CN p in ViewPermissionCheck.Keys) { if (ViewPermissionCheck[p] == "") permissionInfos.Add(p); else if(viewName.IndexOf(ViewPermissionCheck[p])>=0) permissionInfos.Add(p); } return permissionInfos; } } public enum Permission_CN { Hidden, ReadOnly, Partial, Full, ProcessHidden } public List<ExpandoObject> DataSource = new List<ExpandoObject>(); void RoleEditView_Loaded(object sender, RoutedEventArgs e) { var viewList = AccountClient.Instance.Service.GetAllViewList(); var viewPermission = AccountClient.Instance.Service.GetAllRolesPermission(); //Dynamically do data binding function here foreach (var role in viewPermission.Keys) { dynamic singleViewPermission = new ExpandoObject(); ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>("RoleName", role)); foreach (var view in viewPermission[role].Keys) { switch (viewPermission[role][view]) { case ViewPermission.Invisiable: ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>(view, Permission_CN.Hidden)); break; case ViewPermission.Readonly: ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>(view, Permission_CN.ReadOnly)); break; case ViewPermission.PartlyControl: ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>(view, Permission_CN.Partial)); break; case ViewPermission.FullyControl: ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>(view, Permission_CN.Full)); break; case ViewPermission.ProcessOPControl: ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>(view, Permission_CN.ProcessHidden)); break; } } DataSource.Add(singleViewPermission); } dataGrid1.DataContext = DataSource; //dynamically creating data grid column foreach (var view in viewList) { var datagGridColumn = new DataGridComboBoxColumn() { Header = view.Value, Width = 100 }; dataGrid1.Columns.Add(datagGridColumn); datagGridColumn.SelectedItemBinding = new Binding() { Path = new PropertyPath(view.Key) }; datagGridColumn.ItemsSource = PermissionClass.GetPermissions(view.Key); } } private void btnClose_Click(object sender, RoutedEventArgs e) { Close(); } private void btnAddNew_Click(object sender, RoutedEventArgs e) { dynamic singleViewPermission = new ExpandoObject(); ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>("RoleName", "New Role")); var viewList = AccountClient.Instance.Service.GetAllViewList(); foreach (var view in viewList.Keys) { ((IDictionary<String, object>)singleViewPermission).Add(new KeyValuePair<string, object>(view, Permission_CN.Hidden)); } DataSource.Add(singleViewPermission); dataGrid1.DataContext = null; dataGrid1.DataContext = DataSource; } /// <summary> /// Save role to xml file /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSave_Click(object sender, RoutedEventArgs e) { for (int i = 0; i < DataSource.Count - 1; i++) { for (int j = i + 1; j < DataSource.Count; j++) { dynamic obj1 = DataSource[i]; dynamic obj2 = DataSource[j]; if (String.Compare(obj1.RoleName, obj2.RoleName) == 0) { MessageBox.Show(string.Format("\"{0}\" Existed,modify to save!", obj1.RoleName), "Role Editor Error", MessageBoxButton.OK, MessageBoxImage.Warning); return; } } } var permissionDic = new Dictionary<string, Dictionary<string,ViewPermission>>(); foreach (dynamic role in DataSource) { permissionDic.Add(role.RoleName, new Dictionary<string, ViewPermission>()); foreach (var item in ((IDictionary<String, object>)role).Keys) { if (item == "RoleName") continue; var perm = (Permission_CN)((IDictionary<String, object>)role)[item]; switch (perm) { case Permission_CN.Full: permissionDic[role.RoleName].Add(item, ViewPermission.FullyControl); break; case Permission_CN.Partial: permissionDic[role.RoleName].Add(item, ViewPermission.PartlyControl); break; case Permission_CN.ReadOnly: permissionDic[role.RoleName].Add(item, ViewPermission.Readonly); break; case Permission_CN.Hidden: permissionDic[role.RoleName].Add(item, ViewPermission.Invisiable); break; case Permission_CN.ProcessHidden: permissionDic[role.RoleName].Add(item, ViewPermission.ProcessOPControl); break; } } } if (AccountClient.Instance.Service.SaveAllRolesPermission(permissionDic)) { MessageBox.Show(Application.Current.Resources["GlobalLableAccountViewSaveRoleOk"].ToString()); } else { MessageBox.Show(Application.Current.Resources["GlobalLableAccountViewSaveRoleFailed"].ToString()); } } /// <summary> /// Delete current selecte role /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRoleDelete_Click(object sender, RoutedEventArgs e) { dynamic obj = dataGrid1.SelectedItem; if (obj != null) { if (MessageBox.Show(string.Format(Application.Current.Resources["GlobalLableAccountViewDeleteRoleInfo"].ToString(), obj.RoleName), Application.Current.Resources["GlobalLableAccountViewMsgTitle"].ToString(), MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { foreach (dynamic role in DataSource) { if (role.RoleName == obj.RoleName) { DataSource.Remove(role); break; } } dataGrid1.DataContext = null; dataGrid1.DataContext = DataSource; } } } } }