Procházet zdrojové kódy

GridView-Funktionen erheblich erweitert!

Arne Diekmann před 8 roky
rodič
revize
b1f6b17fda

+ 51 - 5
GreenTree.Nachtragsmanagement.Web/Controllers/AppendixController.cs

@@ -1,10 +1,12 @@
-using GreenTree.Nachtragsmanagement.Core;
+using DevExpress.Web.Mvc;
+using GreenTree.Nachtragsmanagement.Core;
 using GreenTree.Nachtragsmanagement.Services.Appendix;
 using GreenTree.Nachtragsmanagement.Services.Deviation;
 using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
 using GreenTree.Nachtragsmanagement.Web.Models.Appendix;
 using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
+using GreenTree.Nachtragsmanagement.Web.Models.Global;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
@@ -75,16 +77,51 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         /// <summary>
         /// Callback result for appendix grid
         /// </summary>
-        public ActionResult PartialAppendices()
+        public ActionResult PartialAppendices(int scrollHeight = -1)
         {
             var appendices = _appendixService.GetAllAppendices();
             var appendixModels = appendices
                 .Select(u => AppendixDataModel.FromAppendix(u, false))
                 .ToList();
 
+            ViewData["ScrollHeight"] = scrollHeight;
+
             return PartialView("~/Views/Appendices/_AppendixGridPartial.cshtml", appendixModels);
         }
 
+        /// <summary>
+        /// Export result for appendix grid
+        /// </summary>
+        [HttpPost]
+        public ActionResult ExportPartialAppendices(GridViewExportFormat exportformat)
+        {
+            if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
+                return new EmptyResult();
+
+            var appendices = _appendixService.GetAllAppendices();
+            var appendixModels = appendices
+                .Select(u => AppendixDataModel.FromAppendix(u, false))
+                .ToList();
+
+            var viewContext = new ViewContext();
+            var viewPage = new ViewPage();
+            var htmlHelper = new HtmlHelper(viewContext, viewPage);
+
+            var gridViewSettings = Extensions.GridViewSettingsHelper.AppendixGridViewSettings(htmlHelper);
+
+            switch (exportformat.Format.ToLower())
+            {
+                case "xlsx":
+                    return GridViewExtension.ExportToXlsx(gridViewSettings, appendixModels);
+                case "xls":
+                    return GridViewExtension.ExportToXls(gridViewSettings, appendixModels);
+                case "pdf":
+                    return GridViewExtension.ExportToPdf(gridViewSettings, appendixModels);
+                default:
+                    return new EmptyResult();
+            }
+        }
+
         /// <summary>
         /// Partial edit for editing of existing or for new appendix
         /// </summary>
@@ -126,9 +163,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (defaultState != null)
                 ViewData["DefaultState"] = defaultState.Id;
 
-            //ViewData["relationType"] = "site";
-            //ViewData["relationId"] = siteId;
-
             return PartialView("~/Views/Appendices/_AppendixEditPartial.cshtml", appendixModel);
         }
 
@@ -310,6 +344,18 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (!ModelState.IsValid)
                 return PartialView("~/Views/Appendices/_StateEditPartial.cshtml", stateModel);
 
+            var allStates = _appendixService.GetAllStates();
+
+            if (stateModel.IsDefault)
+            {
+                foreach (var state in allStates)
+                {
+                    state.IsDefault = false;
+
+                    _appendixService.UpdateState(state);
+                }
+            }
+
             if (stateModel.Id == -1)
             {
                 var claim = stateModel.ToState();

+ 68 - 12
GreenTree.Nachtragsmanagement.Web/Controllers/DeviationController.cs

@@ -1,4 +1,5 @@
-using GreenTree.Nachtragsmanagement.Core;
+using DevExpress.Web.Mvc;
+using GreenTree.Nachtragsmanagement.Core;
 using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
 using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
 using GreenTree.Nachtragsmanagement.Services.Appendix;
@@ -6,6 +7,7 @@ using GreenTree.Nachtragsmanagement.Services.Deviation;
 using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
 using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
+using GreenTree.Nachtragsmanagement.Web.Models.Global;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
@@ -77,16 +79,52 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         /// <summary>
         /// Callback result for deviation grid
         /// </summary>
-        public ActionResult PartialDeviations()
+        /// <param name="scrollHeight">The height of the grid scrollable component.</param>
+        public ActionResult PartialDeviations(int scrollHeight = -1)
         {
             var deviations = _deviationService.GetAllDeviations();
             var deviationModels = deviations
                 .Select(u => DeviationDataModel.FromDeviation(u, false))
                 .ToList();
 
+            ViewData["ScrollHeight"] = scrollHeight;
+
             return PartialView("~/Views/Deviations/_DeviationGridPartial.cshtml", deviationModels);
         }
 
+        /// <summary>
+        /// Export result for deviation grid
+        /// </summary>
+        [HttpPost]
+        public ActionResult ExportPartialDeviations(GridViewExportFormat exportformat)
+        {
+            if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
+                return new EmptyResult();
+
+            var deviations = _deviationService.GetAllDeviations();
+            var deviationModels = deviations
+                .Select(u => DeviationDataModel.FromDeviation(u, false))
+                .ToList();
+
+            var viewContext = new ViewContext();
+            var viewPage = new ViewPage();
+            var htmlHelper = new HtmlHelper(viewContext, viewPage);
+
+            var gridViewSettings = Extensions.GridViewSettingsHelper.DeviationGridViewSettings(htmlHelper);
+
+            switch (exportformat.Format.ToLower())
+            {
+                case "xlsx":
+                    return GridViewExtension.ExportToXlsx(gridViewSettings, deviationModels);
+                case "xls":
+                    return GridViewExtension.ExportToXls(gridViewSettings, deviationModels);
+                case "pdf":
+                    return GridViewExtension.ExportToPdf(gridViewSettings, deviationModels);
+                default:
+                    return new EmptyResult();
+            }
+        }
+
         /// <summary>
         /// Partial edit for editing of existing or for new deviation
         /// </summary>
@@ -144,9 +182,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (defaultStatus != null)
                 ViewData["DefaultStatus"] = defaultStatus.Id;
 
-            //ViewData["relationType"] = "site";
-            //ViewData["relationId"] = siteId;
-
             return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
         }
 
@@ -188,9 +223,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (defaultStatus != null)
                 ViewData["DefaultStatus"] = defaultStatus.Id;
 
-            //ViewData["relationType"] = "appendix";
-            //ViewData["relationId"] = appendixId;
-
             return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
         }
 
@@ -382,6 +414,18 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (!ModelState.IsValid)
                 return PartialView("~/Views/Deviations/_StatusEditPartial.cshtml", statusModel);
 
+            var allStatuses = _deviationService.GetAllStatuses();
+
+            if (statusModel.IsDefault)
+            {
+                foreach (var status in allStatuses)
+                {
+                    status.IsDefault = false;
+
+                    _deviationService.UpdateStatus(status);
+                }
+            }
+
             if (statusModel.Id == -1)
             {
                 var claim = statusModel.ToStatus();
@@ -390,12 +434,12 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             }
             else
             {
-                var status = _deviationService.GetStatusById(statusModel.Id);
+                var claim = _deviationService.GetStatusById(statusModel.Id);
 
-                status.Description = statusModel.Description;
-                status.IsDefault = statusModel.IsDefault;
+                claim.Description = statusModel.Description;
+                claim.IsDefault = statusModel.IsDefault;
 
-                _deviationService.UpdateStatus(status);
+                _deviationService.UpdateStatus(claim);
             }
 
             return new JsonResult
@@ -445,6 +489,18 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (!ModelState.IsValid)
                 return PartialView("~/Views/Deviations/_KindEditPartial.cshtml", kindModel);
 
+            var allKinds = _deviationService.GetAllKinds();
+
+            if (kindModel.IsDefault)
+            {
+                foreach (var kind in allKinds)
+                {
+                    kind.IsDefault = false;
+
+                    _deviationService.UpdateKind(kind);
+                }
+            }
+
             if (kindModel.Id == -1)
             {
                 var claim = kindModel.ToKind();

+ 58 - 3
GreenTree.Nachtragsmanagement.Web/Controllers/SiteController.cs

@@ -1,17 +1,26 @@
-using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
+using DevExpress.Utils;
+using DevExpress.Web;
+using DevExpress.Web.ASPxThemes;
+using DevExpress.Web.Mvc;
+using DevExpress.XtraPrinting;
+using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
 using GreenTree.Nachtragsmanagement.Core.Domain.User;
 using GreenTree.Nachtragsmanagement.Services.Appendix;
 using GreenTree.Nachtragsmanagement.Services.Deviation;
 using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Services.User;
 using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
+using GreenTree.Nachtragsmanagement.Web.Models.Global;
 using GreenTree.Nachtragsmanagement.Web.Models.Site;
 using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Linq;
 using System.Web;
 using System.Web.Mvc;
+using System.Web.UI;
+using System.Web.UI.WebControls;
 
 namespace GreenTree.Nachtragsmanagement.Web.Controllers
 {
@@ -33,7 +42,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             _appendixService = appendixService;
             _userService = userService;
 
-            ViewData["AllUsers"] =
+            ViewData["AllUsers"] = _userService.GetAllUsers();
+            ViewData["AllUsersWithRole"] =
                 _userService.GetAllUsers()
                     .Select(u => new
                     {
@@ -90,16 +100,52 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         /// <summary>
         /// Callback result for site grid
         /// </summary>
-        public ActionResult PartialSites()
+        /// <param name="scrollHeight">The height of the grid scrollable component.</param>
+        public ActionResult PartialSites(int scrollHeight = -1)
         {
             var sites = _siteService.GetAllSites();
             var siteModels = sites
                 .Select(u => SiteDataModel.FromSite(u, false))
                 .ToList();
 
+            ViewData["ScrollHeight"] = scrollHeight;
+
             return PartialView("~/Views/Sites/_SiteGridPartial.cshtml", siteModels);
         }
 
+        /// <summary>
+        /// Export result for site grid
+        /// </summary>
+        [HttpPost]
+        public ActionResult ExportPartialSites(GridViewExportFormat exportformat)
+        {
+            if (exportformat == null || String.IsNullOrEmpty(exportformat.Format))
+                return new EmptyResult();
+
+            var sites = _siteService.GetAllSites();
+            var siteModels = sites
+                .Select(u => SiteDataModel.FromSite(u, false))
+                .ToList();
+
+            var viewContext = new ViewContext();
+            var viewPage = new ViewPage();
+            var htmlHelper = new HtmlHelper(viewContext, viewPage);
+
+            var gridViewSettings = Extensions.GridViewSettingsHelper.SiteGridViewSettings(htmlHelper);
+
+            switch (exportformat.Format.ToLower())
+            {
+                case "xlsx":
+                    return GridViewExtension.ExportToXlsx(gridViewSettings, siteModels);
+                case "xls":
+                    return GridViewExtension.ExportToXls(gridViewSettings, siteModels);
+                case "pdf":
+                    return GridViewExtension.ExportToPdf(gridViewSettings, siteModels);
+                default:
+                    return new EmptyResult();
+            }
+        }
+
         /// <summary>
         /// Callback result for site appendices
         /// </summary>
@@ -146,6 +192,15 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
                         ((IList<User>)ViewData["AllUsers"])
                             .First(r => r.Id == role).Lastname);
 
+                if (siteModel.Id != -1)
+                {
+                    var site = _siteService.GetSiteById(siteModel.Id);
+
+                    var siteTreeModel = SiteTreeDataModel.TreeFromSite(site);
+
+                    siteModel.SiteTreeData = siteTreeModel;
+                }
+
                 return PartialView("~/Views/Sites/_SiteEditPartial.cshtml", siteModel);
             }
 

+ 644 - 0
GreenTree.Nachtragsmanagement.Web/Extensions/GridViewSettingsHelper.cs

@@ -0,0 +1,644 @@
+using DevExpress.Data;
+using DevExpress.Utils;
+using DevExpress.Web;
+using DevExpress.Web.ASPxThemes;
+using DevExpress.Web.Mvc;
+using GreenTree.Nachtragsmanagement.Core.Authentication;
+using System;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace GreenTree.Nachtragsmanagement.Web.Extensions
+{
+    public static class GridViewSettingsHelper
+    {
+        /// <summary>
+        /// Current user context
+        /// </summary>
+        public static UserContext _userContext = Core.CommonHelper.UserContext();
+
+        /// <summary>
+        /// Creates GridViewSettings for the site gridView
+        /// </summary>
+        /// <param name="html">Current HtmlHelper context.</param>
+        public static GridViewSettings SiteGridViewSettings(this System.Web.Mvc.HtmlHelper html)
+        {
+            var s = new GridViewSettings();
+
+            s.Name = "devGridViewSite";
+            s.KeyFieldName = "Id";
+            s.CallbackRouteValues = new { Controller = "Site", Action = "PartialSites" };
+            s.Width = Unit.Percentage(100);
+            s.Settings.ShowFilterRow = true;
+            s.Settings.ShowFilterRowMenu = true;
+            s.Settings.ShowFooter = true;
+            s.Settings.ShowGroupPanel = true;
+            s.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
+            s.Settings.VerticalScrollBarMode = ScrollBarMode.Auto;
+            s.Settings.VerticalScrollableHeight =
+                (html.ViewData["ScrollHeight"] == null || (int)html.ViewData["ScrollHeight"] == -1)
+                ? 400
+                : (int)html.ViewData["ScrollHeight"];
+            s.SettingsExport.Landscape = true;
+            s.SettingsExport.FileName = "Baustellenliste";
+            s.SettingsPopup.CustomizationWindow.Width = new Unit(250, UnitType.Pixel);
+            s.SettingsPopup.CustomizationWindow.Height = new Unit(350, UnitType.Pixel);
+            s.SettingsBehavior.EnableCustomizationWindow = true;
+
+            s.Toolbars.Add(t =>
+            {
+                var refreshItem = t.Items.Add(GridViewToolbarCommand.Refresh);
+                refreshItem.Text = "Aktualisieren";
+                var expandItem = t.Items.Add(GridViewToolbarCommand.FullExpand);
+                expandItem.Text = "Alle aufklappen";
+                var collapseItem = t.Items.Add(GridViewToolbarCommand.FullCollapse);
+                collapseItem.Text = "Alle einklappen";
+                var filterItem = t.Items.Add(GridViewToolbarCommand.ClearFilter);
+                filterItem.Text = "Filter entfernen";
+                t.Items.Add(i =>
+                {
+                    i.Text = "Spalten anzeigen / ausblenden";
+                    i.Name = "ToggleColumnChooser";
+                    i.Image.IconID = IconID.OtherViewgridlines16x16gray;
+                    i.BeginGroup = true;
+                });
+                t.Items.Add(i =>
+                {
+                    i.Text = "Exportieren nach";
+                    i.Image.IconID = IconID.ActionsDownload16x16office2013;
+                    i.BeginGroup = true;
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Pdf";
+                        exportitem.Text = "PDF";
+                        exportitem.Image.IconID = IconID.ExportExporttopdf16x16office2013;
+                    });
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Xlsx";
+                        exportitem.Text = "XLSX";
+                        exportitem.Image.IconID = IconID.ExportExporttoxlsx16x16office2013;
+                    });
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Xls";
+                        exportitem.Text = "XLS";
+                        exportitem.Image.IconID = IconID.ExportExporttoxls16x16office2013;
+                    });
+                });
+            });
+
+            if (_userContext.CurrentUser.HasFunction("Site-Sites-Edit"))
+            {
+                s.Columns.Add(column =>
+                {
+                    column.Caption = "#";
+                    column.SetDataItemTemplateContent(c =>
+                    {
+                        html.ViewContext.Writer.Write(
+                            "<a href=\"#\" onclick=\"editSite(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Bearbeiten</a>&nbsp;" +
+                            "<a href=\"#\" onclick=\"confirmDelete(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Löschen</a>"
+                        );
+                    });
+                    column.SetHeaderTemplateContent(c =>
+                    {
+                        html.ViewContext.Writer.Write(
+                            "<a href=\"#\" onclick=\"editSite(-1)\">Neu</a>&nbsp;");
+                    });
+                    column.Settings.AllowDragDrop = DefaultBoolean.False;
+                    column.Settings.AllowSort = DefaultBoolean.False;
+                    column.Width = new Unit(150, UnitType.Pixel);
+                });
+            }
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Kostenstelle";
+                column.FieldName = "CustomNumber";
+                column.MinWidth = 100;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Bauvorhaben";
+                column.FieldName = "Description";
+                column.Width = new Unit(13, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Start";
+                column.FieldName = "Start";
+                column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+                column.MinWidth = 110;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Ende";
+                column.FieldName = "End";
+                column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+                column.MinWidth = 110;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "VA";
+                column.FieldName = "DeviationDescription";
+                column.MinWidth = 150;
+                column.Width = new Unit(12, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "VA-Summe";
+                column.FieldName = "DeviationValue";
+                column.PropertiesEdit.DisplayFormatString = "c2";
+                column.MinWidth = 120;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Nachträge";
+                column.FieldName = "AppendixDescription";
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Mitarbeiter";
+                column.FieldName = "UserDescription";
+                column.MinWidth = 150;
+                column.Width = new Unit(20, UnitType.Percentage);
+            });
+
+            s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "DeviationValue");
+            s.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "DeviationValue");
+
+            s.ClientLayout = (sender, e) =>
+            {
+                if (e.LayoutMode == ClientLayoutMode.Loading)
+                {
+                    if (System.Web.HttpContext.Current.Session["SiteGridState"] != null)
+                        e.LayoutData = (string)System.Web.HttpContext.Current.Session["SiteGridState"];
+                }
+                else
+                    System.Web.HttpContext.Current.Session["SiteGridState"] = e.LayoutData;
+            };
+            s.ClientSideEvents.BeginCallback = "function (s, e) { e.customArgs['scrollHeight'] = [ gridScrollHeight ]; }";
+            s.ClientSideEvents.ToolbarItemClick = "function (s, e) { onToolbarItemClick(s, e); }";
+
+            s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
+
+            return s;
+        }
+
+        /// <summary>
+        /// Creates GridViewSettings for the deviation gridView
+        /// </summary>
+        /// <param name="html">Current HtmlHelper context.</param>
+        public static GridViewSettings DeviationGridViewSettings(this System.Web.Mvc.HtmlHelper html)
+        {
+            var s = new GridViewSettings();
+
+            s.Name = "devGridViewDeviation";
+            s.KeyFieldName = "Id";
+            s.CallbackRouteValues = new { Controller = "Deviation", Action = "PartialDeviations" };
+            s.Width = Unit.Percentage(100);
+            s.Settings.ShowFilterRow = true;
+            s.Settings.ShowFilterRowMenu = true;
+            s.Settings.ShowFooter = true;
+            s.Settings.ShowGroupPanel = true;
+            s.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
+            s.Settings.VerticalScrollBarMode = ScrollBarMode.Auto;
+            s.Settings.VerticalScrollableHeight =
+                (html.ViewData["ScrollHeight"] == null || (int)html.ViewData["ScrollHeight"] == -1)
+                ? 400
+                : (int)html.ViewData["ScrollHeight"];
+            s.SettingsExport.Landscape = true;
+            s.SettingsExport.FileName = "Vertragsabweichungsliste";
+            s.SettingsBehavior.EnableCustomizationWindow = true;
+            s.SettingsPopup.CustomizationWindow.Width = new Unit(250, UnitType.Pixel);
+            s.SettingsPopup.CustomizationWindow.Height = new Unit(350, UnitType.Pixel);
+
+            s.Toolbars.Add(t =>
+            {
+                var refreshItem = t.Items.Add(GridViewToolbarCommand.Refresh);
+                refreshItem.Text = "Aktualisieren";
+                var expandItem = t.Items.Add(GridViewToolbarCommand.FullExpand);
+                expandItem.Text = "Alle aufklappen";
+                var collapseItem = t.Items.Add(GridViewToolbarCommand.FullCollapse);
+                collapseItem.Text = "Alle einklappen";
+                var filterItem = t.Items.Add(GridViewToolbarCommand.ClearFilter);
+                filterItem.Text = "Filter entfernen";
+                t.Items.Add(i =>
+                {
+                    i.Text = "Spalten anzeigen / ausblenden";
+                    i.Name = "ToggleColumnChooser";
+                    i.Image.IconID = IconID.OtherViewgridlines16x16gray;
+                    i.BeginGroup = true;
+                });
+                t.Items.Add(i =>
+                {
+                    i.Text = "Exportieren nach";
+                    i.Image.IconID = IconID.ActionsDownload16x16office2013;
+                    i.BeginGroup = true;
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Pdf";
+                        exportitem.Text = "PDF";
+                        exportitem.Image.IconID = IconID.ExportExporttopdf16x16office2013;
+                    });
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Xlsx";
+                        exportitem.Text = "XLSX";
+                        exportitem.Image.IconID = IconID.ExportExporttoxlsx16x16office2013;
+                    });
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Xls";
+                        exportitem.Text = "XLS";
+                        exportitem.Image.IconID = IconID.ExportExporttoxls16x16office2013;
+                    });
+                });
+            });
+
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Nummer";
+                column.FieldName = "CustomNumber";
+                column.MinWidth = 80;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Bezeichnung";
+                column.FieldName = "Description";
+                column.MinWidth = 200;
+                column.Width = new Unit(14, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Baustelle";
+                column.FieldName = "SiteDescription";
+                column.MinWidth = 120;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Nachtrag";
+                column.FieldName = "AppendixDescription";
+                column.MinWidth = 120;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Einreichung";
+                column.FieldName = "ReceiptDate";
+                column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+                column.MinWidth = 110;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Tage VA - NT";
+                column.FieldName = "DaysReceiptToAppendixOffering";
+                column.MinWidth = 110;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Schätzung bew.";
+                column.FieldName = "PercentageValue";
+                column.PropertiesEdit.DisplayFormatString = "c2";
+                column.MinWidth = 100;
+                column.Width = new Unit(9, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Status";
+                column.FieldName = "StatusDescription";
+                column.MinWidth = 160;
+                column.Width = new Unit(12, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "VA-Kategorien";
+                column.FieldName = "DisturbanceValuesDescription";
+                column.MinWidth = 200;
+                column.Width = new Unit(14, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Art";
+                column.FieldName = "KindDescription";
+                column.MinWidth = 140;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Kommentar";
+                column.CellStyle.Wrap = DefaultBoolean.True;
+                column.SetDataItemTemplateContent(c =>
+                {
+                    var id = Convert.ToInt32(DataBinder.Eval(c.DataItem, "Id"));
+
+                    var comment = DataBinder.Eval(c.DataItem, "Comment");
+                    var text = comment == null
+                        ? String.Empty
+                        : comment.ToString();
+
+                    if (text.ToString().Length > 40)
+                    {
+                        html.ViewContext.Writer.Write(text.Substring(0, 40) + " ...");
+                        html.ViewContext.Writer.Write("<a href=\"#\" onclick='showComment(\"deviation\"," + id + ",this)'><br />Anzeigen</a>");
+                    }
+                    else
+                        html.ViewContext.Writer.Write(text);
+                });
+                column.MinWidth = 120;
+                column.Width = new Unit(8, UnitType.Percentage);
+                column.Visible = false;
+            });
+
+            var totalDaysReceiptToAppendixOfferingSum = 0;
+            var totalDaysReceiptToAppendixOfferingCount = 0;
+
+            s.CustomSummaryCalculate = (sender, e) =>
+            {
+                if (e.SummaryProcess == CustomSummaryProcess.Start)
+                {
+                    totalDaysReceiptToAppendixOfferingSum = 0;
+                    totalDaysReceiptToAppendixOfferingCount = 0;
+                }
+
+                if (e.SummaryProcess == CustomSummaryProcess.Calculate)
+                {
+                    var val = e.GetValue("DaysReceiptToAppendixOffering");
+
+                    if (val != null)
+                    {
+                        totalDaysReceiptToAppendixOfferingCount++;
+                        totalDaysReceiptToAppendixOfferingSum += Convert.ToInt32(val);
+                    }
+                }
+
+                if (e.SummaryProcess == CustomSummaryProcess.Finalize)
+                    e.TotalValue = totalDaysReceiptToAppendixOfferingSum / totalDaysReceiptToAppendixOfferingCount;
+            };
+
+            s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "PercentageValue");
+            s.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "PercentageValue");
+
+            s.TotalSummary.Add(new ASPxSummaryItem
+            {
+                FieldName = "DaysReceiptToAppendixOffering",
+                SummaryType = DevExpress.Data.SummaryItemType.Custom,
+                DisplayFormat = "Schnitt = {0:n0}",
+                
+            });
+            s.GroupSummary.Add(new ASPxSummaryItem
+            {
+                FieldName = "DaysReceiptToAppendixOffering",
+                SummaryType = DevExpress.Data.SummaryItemType.Custom,
+                DisplayFormat = "Schnitt = {0:n0}"
+            });
+
+            s.ClientLayout = (sender, e) =>
+            {
+                if (e.LayoutMode == ClientLayoutMode.Loading)
+                {
+                    if (System.Web.HttpContext.Current.Session["DeviationGridState"] != null)
+                        e.LayoutData = (string)System.Web.HttpContext.Current.Session["DeviationGridState"];
+                }
+                else
+                    System.Web.HttpContext.Current.Session["DeviationGridState"] = e.LayoutData;
+            };
+            s.ClientSideEvents.BeginCallback = "function (s, e) { e.customArgs['scrollHeight'] = [ gridScrollHeight ]; }";
+            s.ClientSideEvents.ToolbarItemClick = "function (s, e) { onToolbarItemClick(s, e); }";
+
+            s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
+
+            return s;
+        }
+
+        /// <summary>
+        /// Creates GridViewSettings for the appendix gridView
+        /// </summary>
+        /// <param name="html">Current HtmlHelper context.</param>
+        public static GridViewSettings AppendixGridViewSettings(this System.Web.Mvc.HtmlHelper html)
+        {
+            var s = new GridViewSettings();
+
+            s.Name = "devGridViewAppendix";
+            s.KeyFieldName = "Id";
+            s.CallbackRouteValues = new { Controller = "Appendix", Action = "PartialAppendices" };
+            s.Width = Unit.Percentage(100);
+            s.Settings.ShowFilterRow = true;
+            s.Settings.ShowFilterRowMenu = true;
+            s.Settings.ShowFooter = true;
+            s.Settings.ShowGroupPanel = true;
+            s.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
+            s.Settings.VerticalScrollBarMode = ScrollBarMode.Auto;
+            s.Settings.VerticalScrollableHeight =
+                (html.ViewData["ScrollHeight"] == null || (int)html.ViewData["ScrollHeight"] == -1)
+                ? 400
+                : (int)html.ViewData["ScrollHeight"];
+            s.SettingsExport.Landscape = true;
+            s.SettingsExport.FileName = "Nachtragsliste";
+            s.SettingsBehavior.EnableCustomizationWindow = true;
+            s.SettingsPopup.CustomizationWindow.Width = new Unit(250, UnitType.Pixel);
+            s.SettingsPopup.CustomizationWindow.Height = new Unit(350, UnitType.Pixel);
+
+            s.Toolbars.Add(t =>
+            {
+                var refreshItem = t.Items.Add(GridViewToolbarCommand.Refresh);
+                refreshItem.Text = "Aktualisieren";
+                var expandItem = t.Items.Add(GridViewToolbarCommand.FullExpand);
+                expandItem.Text = "Alle aufklappen";
+                var collapseItem = t.Items.Add(GridViewToolbarCommand.FullCollapse);
+                collapseItem.Text = "Alle einklappen";
+                var filterItem = t.Items.Add(GridViewToolbarCommand.ClearFilter);
+                filterItem.Text = "Filter entfernen";
+                t.Items.Add(i =>
+                {
+                    i.Text = "Spalten anzeigen / ausblenden";
+                    i.Name = "ToggleColumnChooser";
+                    i.Image.IconID = IconID.OtherViewgridlines16x16gray;
+                    i.BeginGroup = true;
+                });
+                t.Items.Add(i =>
+                {
+                    i.Text = "Exportieren nach";
+                    i.Image.IconID = IconID.ActionsDownload16x16office2013;
+                    i.BeginGroup = true;
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Pdf";
+                        exportitem.Text = "PDF";
+                        exportitem.Image.IconID = IconID.ExportExporttopdf16x16office2013;
+                    });
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Xlsx";
+                        exportitem.Text = "XLSX";
+                        exportitem.Image.IconID = IconID.ExportExporttoxlsx16x16office2013;
+                    });
+                    i.Items.Add(exportitem =>
+                    {
+                        exportitem.Name = "Xls";
+                        exportitem.Text = "XLS";
+                        exportitem.Image.IconID = IconID.ExportExporttoxls16x16office2013;
+                    });
+                });
+            });
+
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Nummer";
+                column.FieldName = "CustomNumber";
+                column.MinWidth = 80;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Bezeichnung";
+                column.FieldName = "Description";
+                column.MinWidth = 200;
+                column.Width = new Unit(14, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Baustelle";
+                column.FieldName = "SiteDescription";
+                column.MinWidth = 120;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Einreichung";
+                column.FieldName = "OfferingDate";
+                column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+                column.MinWidth = 110;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Angeb.-Sum.";
+                column.FieldName = "OfferingValue";
+                column.PropertiesEdit.DisplayFormatString = "c2";
+                column.MinWidth = 140;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Verhand.-Sum.";
+                column.FieldName = "NegotiationValue";
+                column.PropertiesEdit.DisplayFormatString = "c2";
+                column.MinWidth = 140;
+                column.Width = new Unit(8, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Verh. Angeb./Verha.";
+                column.FieldName = "RelationOfferingToNegotiation";
+                column.PropertiesEdit.DisplayFormatString = "p2";
+                column.MinWidth = 140;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "VA";
+                column.FieldName = "DeviationDescription";
+                column.MinWidth = 100;
+                column.Width = new Unit(6, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Verh. Angeb./VA.";
+                column.FieldName = "RelationOfferingToDeviations";
+                column.PropertiesEdit.DisplayFormatString = "n2";
+                column.MinWidth = 140;
+                column.Width = new Unit(10, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Status";
+                column.FieldName = "StateDescription";
+                column.MinWidth = 100;
+                column.Width = new Unit(6, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "NT-Kategorien";
+                column.FieldName = "CategoryValuesDescription";
+                column.MinWidth = 200;
+                column.Width = new Unit(12, UnitType.Percentage);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Kommentar";
+                column.CellStyle.Wrap = DefaultBoolean.True;
+                column.SetDataItemTemplateContent(c =>
+                {
+                    var id = Convert.ToInt32(DataBinder.Eval(c.DataItem, "Id"));
+
+                    var comment = DataBinder.Eval(c.DataItem, "Comment");
+                    var text = comment == null
+                        ? String.Empty
+                        : comment.ToString();
+
+                    if (text.ToString().Length > 40)
+                    {
+                        html.ViewContext.Writer.Write(text.Substring(0, 40) + " ...");
+                        html.ViewContext.Writer.Write("<a href=\"#\" onclick='showComment(\"appendix\"," + id + ",this)'><br />Anzeigen</a>");
+                    }
+                    else
+                        html.ViewContext.Writer.Write(text);
+                });
+                column.MinWidth = 250;
+                column.Width = new Unit(14, UnitType.Percentage);
+            });
+
+            s.TotalSummary.Add(new ASPxSummaryItem
+            {
+                SummaryType = DevExpress.Data.SummaryItemType.Sum,
+                FieldName = "OfferingValue",
+                DisplayFormat = "{0:c2}"
+            });
+            s.GroupSummary.Add(new ASPxSummaryItem
+            {
+                SummaryType = DevExpress.Data.SummaryItemType.Sum,
+                FieldName = "OfferingValue",
+                DisplayFormat = "{0:c2}"
+            });
+
+            s.TotalSummary.Add(new ASPxSummaryItem
+            {
+                SummaryType = DevExpress.Data.SummaryItemType.Sum,
+                FieldName = "NegotiationValue",
+                DisplayFormat = "{0:c2}"
+            });
+            s.GroupSummary.Add(new ASPxSummaryItem
+            {
+                SummaryType = DevExpress.Data.SummaryItemType.Sum,
+                FieldName = "NegotiationValue",
+                DisplayFormat = "{0:c2}"
+            });
+
+            s.ClientLayout = (sender, e) =>
+            {
+                if (e.LayoutMode == ClientLayoutMode.Loading)
+                {
+                    if (System.Web.HttpContext.Current.Session["AppendixGridState"] != null)
+                        e.LayoutData = (string)System.Web.HttpContext.Current.Session["AppendixGridState"];
+                }
+                else
+                    System.Web.HttpContext.Current.Session["AppendixGridState"] = e.LayoutData;
+            };
+            s.ClientSideEvents.BeginCallback = "function (s, e) { e.customArgs['scrollHeight'] = [ gridScrollHeight ]; }";
+            s.ClientSideEvents.ToolbarItemClick = "function (s, e) { onToolbarItemClick(s, e); }";
+
+            s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
+
+            return s;
+        }
+    }
+}

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

@@ -254,6 +254,16 @@ namespace GreenTree.Nachtragsmanagement.Web
                     r4.Functions.Add(function);
                 }
 
+                var siteFunctions = allFunctions
+                    .Where(f => f.Name.StartsWith("Site"));
+
+                foreach (var function in siteFunctions)
+                {
+                    r2.Functions.Add(function);
+                    r3.Functions.Add(function);
+                    r4.Functions.Add(function);
+                }
+
                 userService.UpdateRole(r2);
                 userService.UpdateRole(r3);
                 userService.UpdateRole(r4);
@@ -461,6 +471,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[0].Id,
                         Value = 40000,
                         Percentage = 1,
+                        ReceiptDate = new DateTime(2016, 8, 1),
                         Appendix = appendices[0],
                         AppendixId = appendices[0].Id,
                         AppendixDate = appendices[0].OfferingDate
@@ -479,6 +490,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[1].Id,
                         Value = 30000,
                         Percentage = 0,
+                        ReceiptDate = new DateTime(2016, 8, 10),
                         Appendix = appendices[0],
                         AppendixId = appendices[0].Id,
                         AppendixDate = appendices[0].OfferingDate
@@ -497,6 +509,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[0].Id,
                         Value = 2000,
                         Percentage = 1,
+                        ReceiptDate = new DateTime(2016, 8, 15),
                         Appendix = appendices[1],
                         AppendixId = appendices[1].Id,
                         AppendixDate = appendices[1].OfferingDate
@@ -515,6 +528,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[2].Id,
                         Value = 40000,
                         Percentage = (decimal)0.3,
+                        ReceiptDate = new DateTime(2016, 8, 20),
                         Site = sites[0],
                         SiteId = sites[0].Id
                     },
@@ -532,6 +546,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[0].Id,
                         Value = 2500,
                         Percentage = 1,
+                        ReceiptDate = new DateTime(2017, 1, 5),
                         Appendix = appendices[2],
                         AppendixId = appendices[2].Id,
                         AppendixDate = appendices[2].OfferingDate
@@ -550,6 +565,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[0].Id,
                         Value = 10000,
                         Percentage = 1,
+                        ReceiptDate = new DateTime(2017, 1, 7),
                         Appendix = appendices[3],
                         AppendixId = appendices[3].Id,
                         AppendixDate = appendices[3].OfferingDate
@@ -568,6 +584,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[3].Id,
                         Value = 10000,
                         Percentage = 1,
+                        ReceiptDate = new DateTime(2017, 1, 10),
                         Appendix = appendices[3],
                         AppendixId = appendices[3].Id,
                         AppendixDate = appendices[3].OfferingDate
@@ -586,6 +603,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                         StatusId = statuses[2].Id,
                         Value = 6000,
                         Percentage = (decimal)0.5,
+                        ReceiptDate = new DateTime(2017, 1, 12),
                         Site = sites[1],
                         SiteId = sites[1].Id
                     }

+ 2 - 0
GreenTree.Nachtragsmanagement.Web/GreenTree.Nachtragsmanagement.Web.csproj

@@ -306,6 +306,7 @@
     <Compile Include="Controllers\HomeController.cs" />
     <Compile Include="Controllers\LoginController.cs" />
     <Compile Include="Controllers\SiteController.cs" />
+    <Compile Include="Extensions\GridViewSettingsHelper.cs" />
     <Compile Include="Extensions\HtmlHelper.cs" />
     <Compile Include="Global.asax.cs">
       <DependentUpon>Global.asax</DependentUpon>
@@ -327,6 +328,7 @@
     <Compile Include="Models\Deviation\KindDataModel.cs" />
     <Compile Include="Models\Deviation\StatusDataModel.cs" />
     <Compile Include="Models\Global\EmptyIRequireDataModel.cs" />
+    <Compile Include="Models\Global\GridViewExportFormat.cs" />
     <Compile Include="Models\Global\OptionDialogItemModel.cs" />
     <Compile Include="Models\Global\YesNoDialogModel.cs" />
     <Compile Include="Models\Global\OptionDialogModel.cs" />

+ 13 - 0
GreenTree.Nachtragsmanagement.Web/Models/Appendix/AppendixDataModel.cs

@@ -15,10 +15,12 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Appendix
         public int? OfferingNumber { get; set; }
         public DateTime? OfferingDate { get; set; }
         public decimal OfferingValue { get; set; }
+        public decimal? RelationOfferingToDeviations { get; set; }
         public decimal Percentage { get; set; }
         public decimal PercentageValue { get; set; }
         public DateTime? NegotiationDate { get; set; }
         public decimal? NegotiationValue { get; set; }
+        public decimal? RelationOfferingToNegotiation { get; set; }
         public bool ProtocolExists { get; set; }
         public int? OrderNumber { get; set; }
         public DateTime? OrderDate { get; set; }
@@ -78,8 +80,19 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Appendix
                 OfferingNumber = appendixEntity.OfferingNumber,
                 OfferingDate = appendixEntity.OfferingDate,
                 OfferingValue = appendixEntity.Value.Value,
+                RelationOfferingToDeviations =
+                    appendixEntity.Value.HasValue
+                        ? (decimal?)Convert.ToDecimal(
+                            appendixEntity.Value / 
+                                (appendixEntity.Deviations
+                                    .Sum(r => r.Value.HasValue && r.Percentage.HasValue ? r.Value.Value * r.Percentage.Value : 0)))
+                        : null,
                 NegotiationDate = appendixEntity.NegotiationDate,
                 NegotiationValue = appendixEntity.NegotiationValue,
+                RelationOfferingToNegotiation =
+                    appendixEntity.Value.HasValue && appendixEntity.NegotiationValue.HasValue
+                        ? appendixEntity.NegotiationValue / appendixEntity.Value
+                        : null,
                 ProtocolExists = appendixEntity.ProtocolExists,
                 OrderNumber = appendixEntity.OrderNumber,
                 OrderDate = appendixEntity.OrderDate,

+ 6 - 0
GreenTree.Nachtragsmanagement.Web/Models/Deviation/DeviationDataModel.cs

@@ -28,6 +28,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
         public int? SiteId { get; set; }
         public string AppendixDescription { get; set; }
         public int? AppendixId { get; set; }
+        public int? DaysReceiptToAppendixOffering { get; set; }
         public ICollection<string> DisturbanceEntities { get; set; }
         public ICollection<DisturbanceValueDataModel> DisturbanceValueEntities { get; set; }
         public string DisturbanceValuesDescription
@@ -94,6 +95,11 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
                     ? null
                     : deviationEntity.Kind.Description,
                 Comment = deviationEntity.Comment,
+                DaysReceiptToAppendixOffering = deviationEntity.Appendix == null
+                    ? null
+                    : deviationEntity.Appendix.OfferingDate.HasValue && deviationEntity.ReceiptDate.HasValue
+                        ? (int?)(deviationEntity.Appendix.OfferingDate.Value - deviationEntity.ReceiptDate.Value).Days
+                        : null,
                 DisturbanceValueEntities =
                     deviationEntity.DisturbanceValues
                         .Select(r =>

+ 12 - 0
GreenTree.Nachtragsmanagement.Web/Models/Global/GridViewExportFormat.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace GreenTree.Nachtragsmanagement.Web.Models.Global
+{
+    public class GridViewExportFormat
+    {
+        public string Format { get; set; }
+    }
+}

+ 40 - 0
GreenTree.Nachtragsmanagement.Web/Views/Appendices/View.cshtml

@@ -6,6 +6,41 @@
 
 <script>
 	var deleteId;
+	var gridScrollHeight;
+	var gridScrollOffset = 280;
+	var resizeFinished;
+
+	$(document).ready(function () {
+		gridScrollHeight = $(window).height() - gridScrollOffset;
+		setTimeout(function () {
+			devGridViewAppendix.PerformCallback();
+		}, 500);
+	});
+
+	$(window).resize(function () {
+		clearTimeout(window.resizedFinished);
+		window.resizedFinished = setTimeout(function () {
+			gridScrollHeight = $(window).height() - gridScrollOffset;
+			devGridViewAppendix.PerformCallback();
+		}, 250);
+	});
+
+	function onToolbarItemClick(s, e) {
+		if (!s || !e) return;
+		if (IsExportToolbarCommand(e.item.name)) {
+			$("#Format").val(e.item.name);
+			$("#appendixExportForm").submit();
+		} else if (e.item.name == "ToggleColumnChooser") {
+			if (devGridViewAppendix.IsCustomizationWindowVisible())
+				devGridViewAppendix.HideCustomizationWindow();
+			else
+				devGridViewAppendix.ShowCustomizationWindow();
+		}
+	}
+
+	function IsExportToolbarCommand(command) {
+		return command == "Pdf" || command == "Xlsx" || command == "Xls";
+	}
 
 	function editAppendix(id) {
 		if (!id) return;
@@ -61,6 +96,11 @@
 	}
 </script>
 
+@using (Html.BeginForm("ExportPartialAppendices", "Appendix", FormMethod.Post, new { id = "appendixExportForm" }))
+{
+	@Html.Hidden("Format")
+}
+
 @Html.Partial("~/Views/Appendices/_AppendixGridPartial.cshtml", Model)
 @Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
 {

+ 13 - 8
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixEditPartial.cshtml

@@ -287,27 +287,32 @@
 
 			ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 			{
-				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 30%'>");
+				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 40%'>");
 				{
 					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.NegotiationValue, "Verhandlungssumme:"));
 					Html.DevExpress().SpinEditFor(m => m.NegotiationValue, t =>
 					{
-						t.Width = new Unit(100, UnitType.Percentage);
+						t.Width = new Unit(96, UnitType.Percentage);
 						t.Properties.DecimalPlaces = 2;
 						t.Properties.NumberType = SpinEditNumberType.Float;
 						t.Properties.DisplayFormatString = "c2";
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
+
+				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 36.1%'>");
+				{
+					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.NegotiationDate, "Verhandlungstermin:"));
+					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.NegotiationDate).ToHtmlString());
+					Html.DevExpress().DateEditFor(m => m.NegotiationDate, t =>
+					{
+						t.Width = new Unit(100, UnitType.Percentage);
+					}).Render();
+				}
+				ViewContext.Writer.Write("</div>");
 			}
 			ViewContext.Writer.Write("</div>");
 
-			//if (ViewData["relationType"] != null && ViewData["relationType"].ToString() == "site")
-			//{
-			//	ViewContext.Writer.Write(
-			//		"<input type=\"hidden\" value=\"" + ViewData["relationId"].ToString() + "\" id=\"SiteId\" name=\"SiteId\" />");
-			//}
-
 			ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 			{
 				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 35%'>");

+ 6 - 2
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixGridPartial.cshtml

@@ -1,10 +1,14 @@
 @model IEnumerable<GreenTree.Nachtragsmanagement.Web.Models.Appendix.AppendixDataModel>
 
+@using GreenTree.Nachtragsmanagement.Web.Extensions
+
 @{ 
 	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
 }
 
-@Html.DevExpress().GridView(s =>
+@Html.DevExpress().GridView(Html.AppendixGridViewSettings()).Bind(Model).GetHtml()
+
+@*@Html.DevExpress().GridView(s =>
 {
 	s.Name = "devGridViewAppendix";
 	s.KeyFieldName = "Id";
@@ -84,4 +88,4 @@
 	};
 
 	s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
-}).Bind(Model).GetHtml()
+}).Bind(Model).GetHtml()*@

+ 40 - 0
GreenTree.Nachtragsmanagement.Web/Views/Deviations/View.cshtml

@@ -6,6 +6,41 @@
 
 <script>
 	var deleteId;
+	var gridScrollHeight;
+	var gridScrollOffset = 280;
+	var resizeFinished;
+
+	$(document).ready(function () {
+		gridScrollHeight = $(window).height() - gridScrollOffset;
+		setTimeout(function () {
+			devGridViewDeviation.PerformCallback();
+		}, 500);
+	});
+
+	$(window).resize(function () {
+		clearTimeout(window.resizedFinished);
+		window.resizedFinished = setTimeout(function () {
+			gridScrollHeight = $(window).height() - gridScrollOffset;
+			devGridViewDeviation.PerformCallback();
+		}, 250);
+	});
+
+	function onToolbarItemClick(s, e) {
+		if (!s || !e) return;
+		if (IsExportToolbarCommand(e.item.name)) {
+			$("#Format").val(e.item.name);
+			$("#deviationExportForm").submit();
+		} else if (e.item.name == "ToggleColumnChooser") {
+			if (devGridViewDeviation.IsCustomizationWindowVisible())
+				devGridViewDeviation.HideCustomizationWindow();
+			else
+				devGridViewDeviation.ShowCustomizationWindow();
+		}
+	}
+
+	function IsExportToolbarCommand(command) {
+		return command == "Pdf" || command == "Xlsx" || command == "Xls";
+	}
 
 	function editDeviation(id) {
 		if (!id) return;
@@ -61,6 +96,11 @@
 	}
 </script>
 
+@using (Html.BeginForm("ExportPartialDeviations", "Deviation", FormMethod.Post, new { id = "deviationExportForm" }))
+{
+	@Html.Hidden("Format")
+}
+
 @Html.Partial("~/Views/Deviations/_DeviationGridPartial.cshtml", Model)
 @Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
 {

+ 7 - 3
GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationGridPartial.cshtml

@@ -1,10 +1,14 @@
 @model IEnumerable<GreenTree.Nachtragsmanagement.Web.Models.Deviation.DeviationDataModel>
 
-@{ 
+@using GreenTree.Nachtragsmanagement.Web.Extensions
+
+@{
 	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
 }
 
-@Html.DevExpress().GridView(s =>
+@Html.DevExpress().GridView(Html.DeviationGridViewSettings()).Bind(Model).GetHtml()
+
+@*@Html.DevExpress().GridView(s =>
 {
 	s.Name = "devGridViewDeviation";
 	s.KeyFieldName = "Id";
@@ -72,4 +76,4 @@
 	};
 
 	s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
-}).Bind(Model).GetHtml()
+}).Bind(Model).GetHtml()*@

+ 40 - 0
GreenTree.Nachtragsmanagement.Web/Views/Sites/View.cshtml

@@ -6,6 +6,41 @@
 
 <script>
 	var deleteId;
+	var gridScrollHeight;
+	var gridScrollOffset = 280;
+	var resizeFinished;
+
+	$(document).ready(function () {
+		gridScrollHeight = $(window).height() - gridScrollOffset;
+		setTimeout(function () {
+			devGridViewSite.PerformCallback();
+		}, 500);
+	});
+
+	$(window).resize(function () {
+		clearTimeout(window.resizedFinished);
+		window.resizedFinished = setTimeout(function () {
+			gridScrollHeight = $(window).height() - gridScrollOffset;
+			devGridViewSite.PerformCallback();
+		}, 250);
+	});
+
+	function onToolbarItemClick(s, e) {
+		if (!s || !e) return;
+		if (IsExportToolbarCommand(e.item.name)) {
+			$("#Format").val(e.item.name);
+			$("#siteExportForm").submit();
+		} else if (e.item.name == "ToggleColumnChooser") {
+			if (devGridViewSite.IsCustomizationWindowVisible())
+				devGridViewSite.HideCustomizationWindow();
+			else
+				devGridViewSite.ShowCustomizationWindow();
+		}
+	}
+
+	function IsExportToolbarCommand(command) {
+		return command == "Pdf" || command == "Xlsx" || command == "Xls";
+	}
 
 	function editSite(id) {
 		if (!id) return;
@@ -61,6 +96,11 @@
 	}
 </script>
 
+@using (Html.BeginForm("ExportPartialSites", "Site", FormMethod.Post, new { id = "siteExportForm" }))
+{
+	@Html.Hidden("Format")
+}
+
 @Html.Partial("~/Views/Sites/_SiteGridPartial.cshtml", Model)
 @Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
 {

+ 1 - 4
GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteEditPartial.cshtml

@@ -279,7 +279,6 @@
 		}
 
 		function onListBoxSelectionChanged(s, e) {
-			updateSelectAllItemState();
 			updateText();
 		}
 
@@ -317,8 +316,6 @@
 
 	<style>
 		.siteTreeList { }
-		/*.siteTreeList > tbody > tr > td > table > tbody > tr:nth-child(2n) { background-color: #F7F7F7; }
-		.siteTreeList > tbody > tr > td > table > tbody > tr:nth-child(2n) > td:first-child { background-color: #F7F7F7; }*/
 		.siteTreeList a { text-decoration: none; }
 		.siteTreeList a:hover { text-decoration: underline; }
 		.siteEditLayoutTable { width: 100%; }
@@ -439,7 +436,7 @@
 									}
 								};
 								lb.Properties.ClientSideEvents.SelectedIndexChanged = "function (s, e) { onListBoxSelectionChanged(s, e); }";
-							}).BindList(ViewData["AllUsers"]).Render();
+							}).BindList(ViewData["AllUsersWithRole"]).Render();
 
 							t.Properties.ClientSideEvents.TextChanged = "function (s, e) { synchronizeListBoxValues(s, e); }";
 							t.Properties.ClientSideEvents.DropDown = "function (s, e) { synchronizeListBoxValues(s, e); }";

+ 87 - 10
GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteGridPartial.cshtml

@@ -1,10 +1,14 @@
 @model IEnumerable<GreenTree.Nachtragsmanagement.Web.Models.Site.SiteDataModel>
 
+@using GreenTree.Nachtragsmanagement.Web.Extensions
+
 @{ 
 	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
 }
 
-@Html.DevExpress().GridView(s =>
+@Html.DevExpress().GridView(Html.SiteGridViewSettings()).Bind(Model).GetHtml()
+
+@*@Html.DevExpress().GridView(s =>
 {
 	s.Name = "devGridViewSite";
 	s.KeyFieldName = "Id";
@@ -14,6 +18,44 @@
 	s.Settings.ShowFilterRowMenu = true;
 	s.Settings.ShowFooter = true;
 	s.Settings.ShowGroupPanel = true;
+	s.Settings.AutoFilterCondition = AutoFilterCondition.Contains;
+	s.Settings.VerticalScrollBarMode = ScrollBarMode.Auto;
+	s.Settings.VerticalScrollableHeight = (ViewData["ScrollHeight"] == null || (int)ViewData["ScrollHeight"] == -1) ? 400 : (int)ViewData["ScrollHeight"];
+	s.Toolbars.Add(t =>
+	{
+		var refreshItem = t.Items.Add(GridViewToolbarCommand.Refresh);
+		refreshItem.Text = "Aktualisieren";
+		var expandItem = t.Items.Add(GridViewToolbarCommand.FullExpand);
+		expandItem.Text = "Alle aufklappen";
+		var collapseItem = t.Items.Add(GridViewToolbarCommand.FullCollapse);
+		collapseItem.Text = "Alle einklappen";
+		var filterItem = t.Items.Add(GridViewToolbarCommand.ClearFilter);
+		filterItem.Text = "Filter entfernen";
+		t.Items.Add(i =>
+		{
+			i.Text = "Exportieren nach";
+			i.Image.IconID = IconID.ActionsDownload16x16office2013;
+			i.BeginGroup = true;
+			i.Items.Add(exportitem =>
+			{
+				exportitem.Name = "Pdf";
+				exportitem.Text = "PDF";
+				exportitem.Image.IconID = IconID.ExportExporttopdf16x16office2013;
+			});
+			i.Items.Add(exportitem =>
+			{
+				exportitem.Name = "Xlsx";
+				exportitem.Text = "XLSX";
+				exportitem.Image.IconID = IconID.ExportExporttoxlsx16x16office2013;
+			});
+			i.Items.Add(exportitem =>
+			{
+				exportitem.Name = "Xls";
+				exportitem.Text = "XLS";
+				exportitem.Image.IconID = IconID.ExportExporttoxls16x16office2013;
+			});
+		});
+	});
 
 	if (userContext.CurrentUser.HasFunction("Site-Sites-Edit"))
 	{
@@ -34,33 +76,66 @@
 			});
 			column.Settings.AllowDragDrop = DefaultBoolean.False;
 			column.Settings.AllowSort = DefaultBoolean.False;
-			column.Width = 70;
+			column.Width = new Unit(150, UnitType.Pixel);
 		});
 	}
-	s.Columns.Add("CustomNumber", "Kostenstelle");
-	s.Columns.Add("Description", "Bauvorhaben");
+	s.Columns.Add(column =>
+	{
+		column.Caption = "Kostenstelle";
+		column.FieldName = "CustomNumber";
+		column.MinWidth = 100;
+		column.Width = new Unit(10, UnitType.Percentage);
+	});
+	s.Columns.Add(column =>
+	{
+		column.Caption = "Bauvorhaben";
+		column.FieldName = "Description";
+		column.Width = new Unit(13, UnitType.Percentage);
+	});
 	s.Columns.Add(column =>
 	{
 		column.Caption = "Start";
 		column.FieldName = "Start";
 		column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+		column.MinWidth = 110;
+		column.Width = new Unit(8, UnitType.Percentage);
 	});
 	s.Columns.Add(column =>
 	{
 		column.Caption = "Ende";
 		column.FieldName = "End";
 		column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+		column.MinWidth = 110;
+		column.Width = new Unit(8, UnitType.Percentage);
+	});
+	s.Columns.Add(column =>
+	{
+		column.Caption = "VA";
+		column.FieldName = "DeviationDescription";
+		column.MinWidth = 150;
+		column.Width = new Unit(12, UnitType.Percentage);
 	});
-	s.Columns.Add("DeviationDescription", "Vertragsabweichungen");
 	s.Columns.Add(column =>
 	{
-		column.Caption = "Wert";
+		column.Caption = "VA-Summe";
 		column.FieldName = "DeviationValue";
 		column.PropertiesEdit.DisplayFormatString = "c2";
+		column.MinWidth = 120;
+		column.Width = new Unit(10, UnitType.Percentage);
+	});
+	s.Columns.Add(column =>
+	{
+		column.Caption = "Nachträge";
+		column.FieldName = "AppendixDescription";
+		column.Width = new Unit(10, UnitType.Percentage);
+	});
+	s.Columns.Add(column =>
+	{
+		column.Caption = "Mitarbeiter";
+		column.FieldName = "UserDescription";
+		column.MinWidth = 150;
+		column.Width = new Unit(20, UnitType.Percentage);
 	});
-	s.Columns.Add("AppendixDescription", "Nachträge");
-	s.Columns.Add("UserDescription", "Mitarbeiter");
-	s.Columns.Add("Comment", "Kommentar");
 
 	s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "DeviationValue");
 	s.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "DeviationValue");
@@ -75,6 +150,8 @@
 		else
 			Session["SiteGridState"] = e.LayoutData;
 	};
+	s.ClientSideEvents.BeginCallback = "function (s, e) { e.customArgs['scrollHeight'] = [ gridScrollHeight ]; }";
+	s.ClientSideEvents.ToolbarItemClick = "function (s, e) { onToolbarItemClick(s, e); }";
 
 	s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
-}).Bind(Model).GetHtml()
+}).Bind(Model).GetHtml()*@