Browse Source

UserConfigItems repository hinzugefügt und Ansichtseinstellungen verbessert!

Arne Diekmann 8 years ago
parent
commit
779c9eac7a

+ 31 - 0
GreenTree.Nachtragsmanagement.Core/Domain/Config/UserConfigItem.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace GreenTree.Nachtragsmanagement.Core.Domain.Config
+{
+    public class UserConfigItem : BaseEntity
+    {
+        /// <summary>
+        /// Name
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Value
+        /// </summary>
+        public string Value { get; set; }
+
+        /// <summary>
+        /// ID of corresponding user
+        /// </summary>
+        public int UserId { get; set; }
+
+        /// <summary>
+        /// Corresponding user
+        /// </summary>
+        public virtual User.User User { get; set; }
+    }
+}

+ 15 - 0
GreenTree.Nachtragsmanagement.Core/Domain/User/User.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using GreenTree.Nachtragsmanagement.Core.Domain.Config;
 using GreenTree.Nachtragsmanagement.Core.Domain.Misc;
 
 namespace GreenTree.Nachtragsmanagement.Core.Domain.User
@@ -26,6 +27,11 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.User
         /// </summary>
         private ICollection<MailNotification> _mailNotifications;
 
+        /// <summary>
+        /// Configitemlist
+        /// </summary>
+        private ICollection<UserConfigItem> _userConfigItems;
+
         #endregion
 
         /// <summary>
@@ -91,6 +97,15 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.User
             protected set { _mailNotifications = value; }
         }
 
+        /// <summary>
+        /// UserConfigItems related to the user
+        /// </summary>
+        public virtual ICollection<UserConfigItem> UserConfigItems
+        {
+            get { return _userConfigItems ?? ( _userConfigItems = new List<UserConfigItem>()); }
+            protected set { _userConfigItems = value; }
+        }
+
         #region Helper
 
         /// <summary>

+ 1 - 0
GreenTree.Nachtragsmanagement.Core/GreenTree.Nachtragsmanagement.Core.csproj

@@ -92,6 +92,7 @@
     <Compile Include="Domain\Appendix\CategoryValue.cs" />
     <Compile Include="Domain\Appendix\State.cs" />
     <Compile Include="Domain\Config\ConfigItem.cs" />
+    <Compile Include="Domain\Config\UserConfigItem.cs" />
     <Compile Include="Domain\Deviation\Deviation.cs" />
     <Compile Include="Domain\Deviation\Disturbance.cs" />
     <Compile Include="Domain\Deviation\DisturbanceValue.cs" />

+ 4 - 1
GreenTree.Nachtragsmanagement.Data/AppendixObjectContext.cs

@@ -78,6 +78,7 @@ namespace GreenTree.Nachtragsmanagement.Data
             var loggingSet = Set<Log>();
             var colorMarkerSet = Set<ColorMarker>();
             var helpPageSet = Set<HelpPage>();
+            var userConfigItemSet = Set<UserConfigItem>();
 
             _dbSets.AddRange(
                 new object[]
@@ -99,7 +100,8 @@ namespace GreenTree.Nachtragsmanagement.Data
                     configItemSet,
                     loggingSet,
                     colorMarkerSet,
-                    helpPageSet
+                    helpPageSet,
+                    userConfigItemSet
                 }
             );
 
@@ -140,6 +142,7 @@ namespace GreenTree.Nachtragsmanagement.Data
             modelBuilder.Configurations.Add(new LogMap());
             modelBuilder.Configurations.Add(new ColorMarkerMap());
             modelBuilder.Configurations.Add(new HelpPageMap());
+            modelBuilder.Configurations.Add(new UserConfigItemMap());
 
             base.OnModelCreating(modelBuilder);
         }

+ 1 - 0
GreenTree.Nachtragsmanagement.Data/GreenTree.Nachtragsmanagement.Data.csproj

@@ -55,6 +55,7 @@
     <Compile Include="Mapping\Appendix\CategoryValueMap.cs" />
     <Compile Include="Mapping\Appendix\StateMap.cs" />
     <Compile Include="Mapping\Config\ConfigItemMap.cs" />
+    <Compile Include="Mapping\Config\UserConfigItemMap.cs" />
     <Compile Include="Mapping\Deviation\DisturbanceValueMap.cs" />
     <Compile Include="Mapping\Deviation\DeviationMap.cs" />
     <Compile Include="Mapping\Deviation\DisturbanceMap.cs" />

+ 28 - 0
GreenTree.Nachtragsmanagement.Data/Mapping/Config/UserConfigItemMap.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Data.Entity.ModelConfiguration;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using GreenTree.Nachtragsmanagement.Core.Domain.Config;
+using GreenTree.Nachtragsmanagement.Core.Domain.Misc;
+
+namespace GreenTree.Nachtragsmanagement.Data.Mapping.Misc
+{
+    public class UserConfigItemMap : EntityTypeConfiguration<UserConfigItem>
+    {
+        public UserConfigItemMap()
+        {
+            ToTable("UserConfigItem");
+
+            HasKey(m => m.Id);
+
+            Property(m => m.Name);
+            Property(m => m.Value);
+
+            HasRequired(a => a.User)
+                .WithMany(s => s.UserConfigItems)
+                .HasForeignKey(a => a.UserId);
+        }
+    }
+}

+ 105 - 1
GreenTree.Nachtragsmanagement.Services/Configuration/ConfigurationService.cs

@@ -16,6 +16,7 @@ namespace GreenTree.Nachtragsmanagement.Services.Configuration
         #region Fields
 
         private readonly IRepository<ConfigItem> _configItemRepository;
+        private readonly IRepository<UserConfigItem> _userConfigItemRepository;
 
         #endregion
 
@@ -25,9 +26,11 @@ namespace GreenTree.Nachtragsmanagement.Services.Configuration
         /// Initializes a new instance of the ConfigurationService class
         /// </summary>
         public ConfigurationService(
-            IRepository<ConfigItem> configItemRepository)
+            IRepository<ConfigItem> configItemRepository,
+            IRepository<UserConfigItem> userConfigItemRepository)
         {
             _configItemRepository = configItemRepository;
+            _userConfigItemRepository = userConfigItemRepository;
         }
 
         #endregion
@@ -112,6 +115,107 @@ namespace GreenTree.Nachtragsmanagement.Services.Configuration
 
         #endregion
 
+        #region UserConfigItem
+
+        /// <summary>
+        /// Gets all userConfigItems
+        /// </summary>
+        public IList<UserConfigItem> GetAllUserConfigItems()
+        {
+            return _userConfigItemRepository.Table.ToList();
+        }
+
+        /// <summary>
+        /// Gets all userConfigItems of corresponding user
+        /// </summary>
+        /// <param name="userId">User id.</param>
+        public IList<UserConfigItem> GetUserConfigItemsByUserId(int userId)
+        {
+            return _userConfigItemRepository.Table
+                .Where(u => u.UserId == userId)
+                .ToList();
+        }
+
+        /// <summary>
+        /// Gets a userConfigItem by specified Id
+        /// </summary>
+        /// <param name="id">UserConfigItem identifier.</param>
+        public UserConfigItem GetUserConfigItemById(int id)
+        {
+            return _userConfigItemRepository.GetById(id);
+        }
+
+        /// <summary>
+        /// Gets a userConfigItem by specified name and user id
+        /// </summary>
+        /// <param name="name">UserConfigItem name.</param>
+        /// <param name="userId">User Id.</param>
+        public UserConfigItem GetUserConfigItemByNameAndUserId(string name, int userId)
+        {
+            return _userConfigItemRepository.Table
+                .FirstOrDefault(u => u.UserId == userId && u.Name == name);
+        }
+
+        /// <summary>
+        /// Insert or update a userConfigItem
+        /// </summary>
+        /// <param name="userConfigItem">UserConfigItem.</param>
+        public void InsertOrUpdateUserConfigItem(UserConfigItem userConfigItem)
+        {
+            if (userConfigItem == null)
+                return;
+
+            var existingConfig = GetUserConfigItemByNameAndUserId(userConfigItem.Name, userConfigItem.UserId);
+
+            if (existingConfig != null)
+            {
+                existingConfig.Value = userConfigItem.Value;
+
+                _userConfigItemRepository.Update(existingConfig);
+            }
+            else
+                _userConfigItemRepository.Insert(userConfigItem);
+        }
+
+        /// <summary>
+        /// Insert or update a userConfigItem
+        /// </summary>
+        /// <param name="name">UserConfigItem name.</param>
+        /// <param name="userId">User Id.</param>
+        /// <param name="value">New value.</param>
+        public void InsertOrUpdateUserConfigItem(string name, int userId, string value)
+        {
+            var existingConfig = GetUserConfigItemByNameAndUserId(name, userId);
+
+            if (existingConfig != null)
+                existingConfig.Value = value;
+
+            if (existingConfig != null)
+            {
+                existingConfig.Value = value;
+
+                _userConfigItemRepository.Update(existingConfig);
+            }
+            else
+                _userConfigItemRepository.Insert(new UserConfigItem
+                {
+                    Name = name,
+                    UserId = userId,
+                    Value = value
+                });
+        }
+
+        /// <summary>
+        /// Delete a userConfigItem
+        /// </summary>
+        /// <param name="userConfigItem">UserConfigItem.</param>
+        public void DeleteUserConfigItem(UserConfigItem userConfigItem)
+        {
+            _userConfigItemRepository.Delete(userConfigItem);
+        }
+
+        #endregion
+
         #region Casting
 
         /// <summary>

+ 34 - 0
GreenTree.Nachtragsmanagement.Services/Configuration/IConfigurationService.cs

@@ -59,6 +59,40 @@ namespace GreenTree.Nachtragsmanagement.Services.Configuration
 
         #endregion
 
+        #region UserConfigItem
+
+        /// <summary>
+        /// Gets all userConfigItems
+        /// </summary>
+        IList<UserConfigItem> GetAllUserConfigItems();
+
+        /// <summary>
+        /// Gets a userConfigItem by specified Id
+        /// </summary>
+        /// <param name="id">UserConfigItem identifier.</param>
+        UserConfigItem GetUserConfigItemById(int id);
+
+        /// <summary>
+        /// Gets a userConfigItem by specified name and user id
+        /// </summary>
+        /// <param name="name">UserConfigItem name.</param>
+        /// <param name="userId">User Id.</param>
+        UserConfigItem GetUserConfigItemByNameAndUserId(string name, int userId);
+
+        /// <summary>
+        /// Insert or update a userConfigItem
+        /// </summary>
+        /// <param name="userConfigItem">UserConfigItem.</param>
+        void InsertOrUpdateUserConfigItem(UserConfigItem userConfigItem);
+
+        /// <summary>
+        /// Delete a userConfigItem
+        /// </summary>
+        /// <param name="userConfigItem">UserConfigItem.</param>
+        void DeleteUserConfigItem(UserConfigItem userConfigItem);
+
+        #endregion
+
         #region Casting
 
         /// <summary>

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Content/global.css

@@ -18,7 +18,7 @@ h1, h2, h3, h4, h5, h6 {
 }
 
 .functionNavigationContainer {
-    width: 270px;
+    width: 240px;
     overflow: auto;
     background-color: #FAFAFA;
     border: 1px solid #D9D9D9;

+ 171 - 68
GreenTree.Nachtragsmanagement.Web/Extensions/GridViewSettingsHelper.cs

@@ -13,6 +13,8 @@ using System.Web.UI;
 using System.Web.UI.WebControls;
 using System.Web.Mvc.Html;
 using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
+using GreenTree.Nachtragsmanagement.Core;
+using GreenTree.Nachtragsmanagement.Services.Configuration;
 
 namespace GreenTree.Nachtragsmanagement.Web.Extensions
 {
@@ -23,6 +25,11 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
         /// </summary>
         public static UserContext _userContext = Core.CommonHelper.UserContext();
 
+        /// <summary>
+        /// Global configuration service
+        /// </summary>
+        public static IConfigurationService _configurationService;
+
         /// <summary>
         /// Creates GridViewSettings for the site gridView
         /// </summary>
@@ -41,6 +48,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.Settings.ShowFooter = true;
             s.Settings.ShowGroupPanel = true;
             s.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
+            s.Settings.HorizontalScrollBarMode = ScrollBarMode.Auto;
             s.Settings.VerticalScrollBarMode = ScrollBarMode.Auto;
             s.Settings.VerticalScrollableHeight =
                 (html.ViewData["ScrollHeight"] == null || (int)html.ViewData["ScrollHeight"] == -1)
@@ -54,8 +62,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.SettingsBehavior.AllowHeaderFilter = true;
             s.SettingsPager.AlwaysShowPager = true;
             s.SettingsResizing.ColumnResizeMode = ColumnResizeMode.Control;
-            s.SettingsCookies.Enabled = true;
-            s.SettingsCookies.CookiesID = "siteGridStateCookie";
             s.SettingsPager.Position = PagerPosition.Bottom;
             s.SettingsPager.PageSizeItemSettings.Visible = true;
             s.SettingsPager.FirstPageButton.Visible = true;
@@ -127,10 +133,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Kostenstelle";
                 column.FieldName = "CustomNumber";
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
-                column.MinWidth = 100;
-                column.Width = new Unit(8, UnitType.Percentage);
-                column.SortIndex = 0;
-                column.SortOrder = ColumnSortOrder.Ascending;
+                column.MinWidth = 120;
+                column.Width = new Unit(130, UnitType.Pixel);
                 column.Settings.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
             });
             s.Columns.Add(column =>
@@ -138,7 +142,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Bauvorhaben";
                 column.FieldName = "Description";
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
-                column.Width = new Unit(20, UnitType.Percentage);
+                column.MinWidth = 150;
+                column.Width = new Unit(150, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
@@ -146,8 +151,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.FieldName = "Start";
                 column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.DateRangePicker;
-                column.MinWidth = 110;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.MinWidth = 90;
+                column.Width = new Unit(90, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
@@ -155,16 +160,15 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.FieldName = "End";
                 column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.DateRangePicker;
-                column.MinWidth = 110;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.MinWidth = 90;
+                column.Width = new Unit(90, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Offene VA";
                 column.FieldName = "DeviationDescription";
-                column.Visible = false;
-                column.MinWidth = 150;
-                column.Width = new Unit(12, UnitType.Percentage);
+                column.MinWidth = 230;
+                column.Width = new Unit(230, UnitType.Pixel);
                 column.SetDataItemTemplateContent(c =>
                 {
                     var id = Convert.ToInt32(DataBinder.Eval(c.DataItem, "Id"));
@@ -190,22 +194,22 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "VA-Summe";
                 column.FieldName = "DeviationValue";
                 column.PropertiesEdit.DisplayFormatString = "c2";
-                column.Visible = false;
                 column.MinWidth = 120;
-                column.Width = new Unit(10, UnitType.Percentage);
+                column.Width = new Unit(120, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Nachträge";
                 column.FieldName = "AppendixDescription";
-                column.Width = new Unit(10, UnitType.Percentage);
+                column.MinWidth = 130;
+                column.Width = new Unit(130, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Mitarbeiter";
                 column.FieldName = "UserDescription";
-                column.MinWidth = 150;
-                column.Width = new Unit(15, UnitType.Percentage);
+                column.MinWidth = 245;
+                column.Width = new Unit(245, UnitType.Pixel);
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
@@ -258,8 +262,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                             "<a href=\"#\" onclick='editComment(\"site\"," + id + ",function() { devGridViewSite.PerformCallback(); })'>Bearbeiten</a>");
                 });
                 column.MinWidth = 120;
-                column.Width = new Unit(15, UnitType.Percentage);
-                column.Visible = false;
+                column.Width = new Unit(120, UnitType.Pixel);
             });
 
             s.TotalSummary.Add(new ASPxSummaryItem
@@ -294,9 +297,32 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 {
                     if (System.Web.HttpContext.Current.Session["SiteGridState"] != null)
                         e.LayoutData = (string)System.Web.HttpContext.Current.Session["SiteGridState"];
+                    else
+                    {
+                        var userConfigItem = _configurationService.GetUserConfigItemByNameAndUserId("SiteGridLayoutState",
+                            _userContext.CurrentUser.Id);
+
+                        if (userConfigItem != null)
+                        {
+                            System.Web.HttpContext.Current.Session["SiteGridState"] = userConfigItem.Value;
+
+                            e.LayoutData = (string)System.Web.HttpContext.Current.Session["SiteGridState"];
+                        }
+                        else
+                            ((MVCxGridView)sender).SortBy(((MVCxGridView)sender).Columns[0], ColumnSortOrder.Ascending);
+                    }
                 }
                 else
+                {
                     System.Web.HttpContext.Current.Session["SiteGridState"] = e.LayoutData;
+
+                    _configurationService.InsertOrUpdateUserConfigItem(new Core.Domain.Config.UserConfigItem
+                    {
+                        UserId = _userContext.CurrentUser.Id,
+                        Name = "SiteGridLayoutState",
+                        Value = e.LayoutData
+                    });
+                }
             };
 
             s.PreRender = s.BeforeGetCallbackResult = (sender, e) => {
@@ -359,8 +385,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.SettingsBehavior.AllowHeaderFilter = true;
             s.SettingsPager.AlwaysShowPager = true;
             s.SettingsResizing.ColumnResizeMode = ColumnResizeMode.Control;
-            s.SettingsCookies.Enabled = true;
-            s.SettingsCookies.CookiesID = "deviationGridStateCookie";
             s.SettingsPager.Position = PagerPosition.Bottom;
             s.SettingsPager.PageSizeItemSettings.Visible = true;
             s.SettingsPager.FirstPageButton.Visible = true;
@@ -409,8 +433,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
                 column.Settings.ShowFilterRowMenu = DefaultBoolean.False;
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
-                column.SortIndex = 0;
-                column.SortOrder = ColumnSortOrder.Ascending;
                 column.Settings.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
             });
             s.Columns.Add(column =>
@@ -426,7 +448,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Baustelle";
                 column.FieldName = "SiteDescription";
                 column.MinWidth = 150;
-                column.Width = new Unit(10, UnitType.Percentage);
+                column.Width = new Unit(150, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -441,8 +463,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             {
                 column.Caption = "Mitarbeiter";
                 column.FieldName = "UserDescription";
-                column.MinWidth = 150;
-                column.Width = new Unit(15, UnitType.Percentage);
+                column.MinWidth = 250;
+                column.Width = new Unit(250, UnitType.Pixel);
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
@@ -585,8 +607,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                             (isLongText ? "&nbsp;" : "<br/>") +
                             "&nbsp;<a href=\"#\" onclick='editComment(\"deviation\"," + id + ",function() { devGridViewDeviation.PerformCallback(); })'>Bearbeiten</a>");
                 });
-                column.MinWidth = 120;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.MinWidth = 180;
+                column.Width = new Unit(180, UnitType.Pixel);
             });
 
             //s.SetDataRowTemplateContent(t =>
@@ -765,9 +787,32 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 {
                     if (System.Web.HttpContext.Current.Session["DeviationGridState"] != null)
                         e.LayoutData = (string)System.Web.HttpContext.Current.Session["DeviationGridState"];
+                    else
+                    {
+                        var userConfigItem = _configurationService.GetUserConfigItemByNameAndUserId("DeviationGridLayoutState",
+                            _userContext.CurrentUser.Id);
+
+                        if (userConfigItem != null)
+                        {
+                            System.Web.HttpContext.Current.Session["DeviationGridState"] = userConfigItem.Value;
+
+                            e.LayoutData = (string)System.Web.HttpContext.Current.Session["DeviationGridState"];
+                        }
+                        else
+                            ((MVCxGridView)sender).SortBy(((MVCxGridView)sender).Columns[0], ColumnSortOrder.Ascending);
+                    }
                 }
                 else
+                {
                     System.Web.HttpContext.Current.Session["DeviationGridState"] = e.LayoutData;
+
+                    _configurationService.InsertOrUpdateUserConfigItem(new Core.Domain.Config.UserConfigItem
+                    {
+                        UserId = _userContext.CurrentUser.Id,
+                        Name = "DeviationGridLayoutState",
+                        Value = e.LayoutData
+                    });
+                }
             };
 
             s.PreRender = s.BeforeGetCallbackResult = (sender, e) => {
@@ -832,8 +877,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.SettingsBehavior.AllowHeaderFilter = true;
             s.SettingsPager.AlwaysShowPager = true;
             s.SettingsResizing.ColumnResizeMode = ColumnResizeMode.Control;
-            s.SettingsCookies.Enabled = true;
-            s.SettingsCookies.CookiesID = "appendixGridStateCookie";
             s.SettingsPager.Position = PagerPosition.Bottom;
             s.SettingsPager.PageSizeItemSettings.Visible = true;
             s.SettingsPager.FirstPageButton.Visible = true;
@@ -883,15 +926,13 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Settings.ShowFilterRowMenu = DefaultBoolean.False;
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
                 column.Settings.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
-                column.SortIndex = 0;
-                column.SortOrder = ColumnSortOrder.Ascending;
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Bezeichnung";
                 column.FieldName = "Description";
                 column.MinWidth = 200;
-                column.Width = new Unit(14, UnitType.Percentage);
+                column.Width = new Unit(200, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
                 column.SetDataItemTemplateContent(c =>
                 {
@@ -907,7 +948,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Baustelle";
                 column.FieldName = "SiteDescription";
                 column.MinWidth = 150;
-                column.Width = new Unit(10, UnitType.Percentage);
+                column.Width = new Unit(150, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -922,8 +963,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             {
                 column.Caption = "Mitarbeiter";
                 column.FieldName = "UserDescription";
-                column.MinWidth = 150;
-                column.Width = new Unit(15, UnitType.Percentage);
+                column.MinWidth = 245;
+                column.Width = new Unit(245, UnitType.Pixel);
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
@@ -951,7 +992,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Einreichung";
                 column.FieldName = "OfferingDate";
                 column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
-                column.MinWidth = 110;
+                column.MinWidth = 100;
                 column.Width = new Unit(110, UnitType.Pixel);
             });
             s.Columns.Add(column =>
@@ -959,7 +1000,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Angeb. -Summe";
                 column.FieldName = "OfferingValue";
                 column.PropertiesEdit.DisplayFormatString = "c2";
-                column.MinWidth = 110;
+                column.MinWidth = 100;
                 column.Width = new Unit(110, UnitType.Pixel);
                 column.HeaderStyle.Wrap = DefaultBoolean.True;
             });
@@ -985,8 +1026,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             {
                 column.Caption = "VA";
                 column.FieldName = "DeviationDescription";
-                column.MinWidth = 70;
-                column.Width = new Unit(6, UnitType.Percentage);
+                column.MinWidth = 80;
+                column.Width = new Unit(80, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
@@ -1046,7 +1087,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "NT-Kategorien";
                 column.FieldName = "CategoryValuesDescription";
                 column.MinWidth = 200;
-                column.Width = new Unit(12, UnitType.Percentage);
+                column.Width = new Unit(200, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
@@ -1077,8 +1118,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                             (isLongText ? "&nbsp;" : "<br/>") +
                             "<a href=\"#\" onclick='editComment(\"appendix\"," + id + ",function() { devGridViewAppendix.PerformCallback(); })'>Bearbeiten</a>");
                 });
-                column.MinWidth = 250;
-                column.Width = new Unit(14, UnitType.Percentage);
+                column.MinWidth = 200;
+                column.Width = new Unit(200, UnitType.Pixel);
             });
 
             s.TotalSummary.Add(new ASPxSummaryItem
@@ -1134,9 +1175,32 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 {
                     if (System.Web.HttpContext.Current.Session["AppendixGridState"] != null)
                         e.LayoutData = (string)System.Web.HttpContext.Current.Session["AppendixGridState"];
+                    else
+                    {
+                        var userConfigItem = _configurationService.GetUserConfigItemByNameAndUserId("AppendixGridLayoutState",
+                            _userContext.CurrentUser.Id);
+
+                        if (userConfigItem != null)
+                        {
+                            System.Web.HttpContext.Current.Session["AppendixGridState"] = userConfigItem.Value;
+
+                            e.LayoutData = (string)System.Web.HttpContext.Current.Session["AppendixGridState"];
+                        }
+                        else
+                            ((MVCxGridView)sender).SortBy(((MVCxGridView)sender).Columns[0], ColumnSortOrder.Ascending);
+                    }
                 }
                 else
+                {
                     System.Web.HttpContext.Current.Session["AppendixGridState"] = e.LayoutData;
+
+                    _configurationService.InsertOrUpdateUserConfigItem(new Core.Domain.Config.UserConfigItem
+                    {
+                        UserId = _userContext.CurrentUser.Id,
+                        Name = "AppendixGridLayoutState",
+                        Value = e.LayoutData
+                    });
+                }
             };
 
             s.PreRender = s.BeforeGetCallbackResult = (sender, e) => {
@@ -1200,8 +1264,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.SettingsBehavior.AllowHeaderFilter = true;
             s.SettingsPager.AlwaysShowPager = true;
             s.SettingsResizing.ColumnResizeMode = ColumnResizeMode.Control;
-            s.SettingsCookies.Enabled = true;
-            s.SettingsCookies.CookiesID = "mailNotificationGridStateCookie";
             s.SettingsPager.Position = PagerPosition.Bottom;
             s.SettingsPager.PageSizeItemSettings.Visible = true;
             s.SettingsPager.FirstPageButton.Visible = true;
@@ -1258,29 +1320,29 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             {
                 column.Caption = "Zeitplan";
                 column.FieldName = "CronExpressionDescription";
-                column.MinWidth = 100;
-                column.Width = new Unit(20, UnitType.Percentage);
+                column.MinWidth = 200;
+                column.Width = new Unit(200, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Benachrichtigungs-Plugin";
                 column.FieldName = "NotificationPluginSystemNameDescription";
-                column.Width = new Unit(17.5, UnitType.Percentage);
+                column.Width = new Unit(180, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Benachrichtigungs-Job";
                 column.FieldName = "NotificationJobSystemNameDescription";
                 column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
-                column.MinWidth = 110;
-                column.Width = new Unit(17.5, UnitType.Percentage);
+                column.MinWidth = 180;
+                column.Width = new Unit(180, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Mitarbeiter";
                 column.FieldName = "UserDescriptions";
-                column.MinWidth = 200;
-                column.Width = new Unit(20, UnitType.Percentage);
+                column.MinWidth = 150;
+                column.Width = new Unit(200, UnitType.Pixel);
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
@@ -1309,7 +1371,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.FieldName = "NextExecutionTime";
                 column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
                 column.MinWidth = 110;
-                column.Width = new Unit(15, UnitType.Percentage);
+                column.Width = new Unit(150, UnitType.Pixel);
             });
 
             s.ClientLayout = (sender, e) =>
@@ -1318,9 +1380,30 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 {
                     if (System.Web.HttpContext.Current.Session["MailNotificationsGridState"] != null)
                         e.LayoutData = (string)System.Web.HttpContext.Current.Session["MailNotificationsGridState"];
+                    else
+                    {
+                        var userConfigItem = _configurationService.GetUserConfigItemByNameAndUserId("MailNotificationsGridLayoutState",
+                            _userContext.CurrentUser.Id);
+
+                        if (userConfigItem != null)
+                        {
+                            System.Web.HttpContext.Current.Session["MailNotificationsGridState"] = userConfigItem.Value;
+
+                            e.LayoutData = (string)System.Web.HttpContext.Current.Session["MailNotificationsGridState"];
+                        }
+                    }
                 }
                 else
+                {
                     System.Web.HttpContext.Current.Session["MailNotificationsGridState"] = e.LayoutData;
+
+                    _configurationService.InsertOrUpdateUserConfigItem(new Core.Domain.Config.UserConfigItem
+                    {
+                        UserId = _userContext.CurrentUser.Id,
+                        Name = "MailNotificationsGridLayoutState",
+                        Value = e.LayoutData
+                    });
+                }
             };
             s.ClientSideEvents.BeginCallback = "function (s, e) { e.customArgs['scrollHeight'] = [ gridScrollHeight ]; }";
             s.ClientSideEvents.ToolbarItemClick = "function (s, e) { onToolbarItemClick(s, e); }";
@@ -1362,8 +1445,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.SettingsBehavior.AllowHeaderFilter = true;
             s.SettingsPager.AlwaysShowPager = true;
             s.SettingsResizing.ColumnResizeMode = ColumnResizeMode.Control;
-            s.SettingsCookies.Enabled = true;
-            s.SettingsCookies.CookiesID = "logGridStateCookie";
             s.SettingsPager.Position = PagerPosition.Bottom;
             s.SettingsPager.PageSizeItemSettings.Visible = true;
             s.SettingsPager.FirstPageButton.Visible = true;
@@ -1415,14 +1496,15 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 });
                 column.Settings.AllowDragDrop = DefaultBoolean.False;
                 column.Settings.AllowSort = DefaultBoolean.False;
-                column.Width = new Unit(150, UnitType.Pixel);
+                column.MinWidth = 100;
+                column.Width = new Unit(120, UnitType.Pixel);
             });
             s.Columns.Add(column =>
             {
                 column.Caption = "Level";
                 column.FieldName = "LogLevelDescription";
                 column.MinWidth = 100;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.Width = new Unit(100, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -1430,7 +1512,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Betreff";
                 column.FieldName = "ShortMessage";
                 column.MinWidth = 150;
-                column.Width = new Unit(12, UnitType.Percentage);
+                column.Width = new Unit(150, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -1438,7 +1520,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Nachricht";
                 column.FieldName = "FullMessage";
                 column.MinWidth = 200;
-                column.Width = new Unit(20, UnitType.Percentage);
+                column.Width = new Unit(200, UnitType.Pixel);
                 column.SetDataItemTemplateContent(c =>
                 {
                     var fullMessage = DataBinder.Eval(c.DataItem, "FullMessage");
@@ -1457,7 +1539,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "IP-Adresse";
                 column.FieldName = "IpAddress";
                 column.MinWidth = 130;
-                column.Width = new Unit(10, UnitType.Percentage);
+                column.Width = new Unit(130, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -1465,7 +1547,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Mitarbeiter";
                 column.FieldName = "UserDescription";
                 column.MinWidth = 130;
-                column.Width = new Unit(10, UnitType.Percentage);
+                column.Width = new Unit(130, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -1473,7 +1555,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Datentyp";
                 column.FieldName = "EntityType";
                 column.MinWidth = 100;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.Width = new Unit(100, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -1481,7 +1563,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Daten ID";
                 column.FieldName = "EntityId";
                 column.MinWidth = 100;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.Width = new Unit(100, UnitType.Pixel);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
@@ -1489,7 +1571,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Seiten URL";
                 column.FieldName = "PageUrl";
                 column.MinWidth = 150;
-                column.Width = new Unit(12, UnitType.Percentage);
+                column.Width = new Unit(150, UnitType.Pixel);
                 column.Visible = false;
             });
             s.Columns.Add(column =>
@@ -1497,7 +1579,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Caption = "Relative URL";
                 column.FieldName = "ReferrerUrl";
                 column.MinWidth = 100;
-                column.Width = new Unit(8, UnitType.Percentage);
+                column.Width = new Unit(100, UnitType.Pixel);
                 column.Visible = false;
             });
             s.Columns.Add(column =>
@@ -1506,7 +1588,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.FieldName = "CreatedOnLocal";
                 column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy - HH:mm:ss";
                 column.MinWidth = 150;
-                column.Width = new Unit(12, UnitType.Percentage);
+                column.Width = new Unit(150, UnitType.Pixel);
             });
 
             s.ClientLayout = (sender, e) =>
@@ -1515,9 +1597,30 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 {
                     if (System.Web.HttpContext.Current.Session["LogGridState"] != null)
                         e.LayoutData = (string)System.Web.HttpContext.Current.Session["LogGridState"];
+                    else
+                    {
+                        var userConfigItem = _configurationService.GetUserConfigItemByNameAndUserId("LogGridLayoutState",
+                            _userContext.CurrentUser.Id);
+
+                        if (userConfigItem != null)
+                        {
+                            System.Web.HttpContext.Current.Session["LogGridState"] = userConfigItem.Value;
+
+                            e.LayoutData = (string)System.Web.HttpContext.Current.Session["LogGridState"];
+                        }
+                    }
                 }
                 else
+                {
                     System.Web.HttpContext.Current.Session["LogGridState"] = e.LayoutData;
+
+                    _configurationService.InsertOrUpdateUserConfigItem(new Core.Domain.Config.UserConfigItem
+                    {
+                        UserId = _userContext.CurrentUser.Id,
+                        Name = "LogGridLayoutState",
+                        Value = e.LayoutData
+                    });
+                }
             };
 
             s.PreRender = s.BeforeGetCallbackResult = (sender, e) => {

+ 3 - 0
GreenTree.Nachtragsmanagement.Web/Global.asax.cs

@@ -31,6 +31,7 @@ using GreenTree.Nachtragsmanagement.Core.Domain.Config;
 using GreenTree.Nachtragsmanagement.Services.Misc;
 using GreenTree.Nachtragsmanagement.Services.Scheduling;
 using GreenTree.Nachtragsmanagement.Services.Logging;
+using GreenTree.Nachtragsmanagement.Web.Extensions;
 
 namespace GreenTree.Nachtragsmanagement.Web
 {
@@ -70,6 +71,8 @@ namespace GreenTree.Nachtragsmanagement.Web
                 if (notificationScheduler != null)
                     notificationScheduler.Start();
 
+                GridViewSettingsHelper._configurationService = Singleton<IContainer>.Instance.Resolve<IConfigurationService>();
+
                 logger.Information("Anwendung erfolgreich gestartet.");
             }
             catch (Exception ex)