Просмотр исходного кода

ID-Prüfung für Nachträge und VAs hinzugefügt.

Arne Diekmann 8 лет назад
Родитель
Сommit
9fa73a2e84

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

@@ -221,4 +221,4 @@ namespace GreenTree.Nachtragsmanagement.Data
 
         #endregion
     }
-}
+}

+ 40 - 32
GreenTree.Nachtragsmanagement.Web/App_Start/FunctionConfig.cs

@@ -135,6 +135,46 @@ namespace GreenTree.Nachtragsmanagement.Web.App_Start
                     AllowMaximize = true
                 },
                 new Function
+                {
+                    Name = "Site",
+                    Description = "Baustellen",
+                    ImageUrl = "~/Content/Images/function-Site-32.png",
+                    IsMenuMember = true,
+                    Plugin = "System"
+                },
+                new Function
+                {
+                    Name = "Site-Sites",
+                    Description = "Baustellenliste",
+                    ImageUrl = "~/Content/Images/function-Site-Sites-32.png",
+                    GroupName = "Site",
+                    RouteName = "GreenTree.Nachtragsmanagement.Web.Site.Sites",
+                    IsMenuMember = true,
+                    Plugin = "System",
+                    BaseWidth = 1100,
+                    MinWidth = 800,
+                    BaseHeight = 650,
+                    MinHeight = 500,
+                    AllowMaximize = true,
+                    MaximizedOnStart = true
+                },
+                new Function
+                {
+                    Name = "Site-Sites-Edit",
+                    Description = "Baustellen editieren",
+                    GroupName = "Site-Sites",
+                    IsMenuMember = false,
+                    Plugin = "System"
+                },
+                new Function
+                {
+                    Name = "Site-Sites-Delete",
+                    Description = "Baustellen löschen",
+                    GroupName = "Site-Sites",
+                    IsMenuMember = false,
+                    Plugin = "System"
+                },
+                new Function
                 {
                     Name = "Deviation",
                     Description = "Vertragsabweichungen",
@@ -244,38 +284,6 @@ namespace GreenTree.Nachtragsmanagement.Web.App_Start
                     IsMenuMember = false,
                     Plugin = "System"
                 },
-                new Function
-                {
-                    Name = "Site",
-                    Description = "Baustellen",
-                    ImageUrl = "~/Content/Images/function-Site-32.png",
-                    IsMenuMember = true,
-                    Plugin = "System"
-                },
-                new Function
-                {
-                    Name = "Site-Sites",
-                    Description = "Baustellenliste",
-                    ImageUrl = "~/Content/Images/function-Site-Sites-32.png",
-                    GroupName = "Site",
-                    RouteName = "GreenTree.Nachtragsmanagement.Web.Site.Sites",
-                    IsMenuMember = true,
-                    Plugin = "System",
-                    BaseWidth = 1100,
-                    MinWidth = 800,
-                    BaseHeight = 650,
-                    MinHeight = 500,
-                    AllowMaximize = true,
-                    MaximizedOnStart = true
-                },
-                new Function
-                {
-                    Name = "Site-Sites-Edit",
-                    Description = "Baustellen editieren",
-                    GroupName = "Site-Sites",
-                    IsMenuMember = false,
-                    Plugin = "System"
-                },
             };
         }
     }

+ 29 - 11
GreenTree.Nachtragsmanagement.Web/Extensions/GridViewSettingsHelper.cs

@@ -5,6 +5,7 @@ using DevExpress.Web.ASPxThemes;
 using DevExpress.Web.Mvc;
 using GreenTree.Nachtragsmanagement.Core.Authentication;
 using System;
+using System.Collections.Generic;
 using System.Web.UI;
 using System.Web.UI.WebControls;
 
@@ -88,25 +89,26 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 });
             });
 
-            //if (_userContext == null)
-            //    _userContext = Core.CommonHelper.UserContext();
-
-            if (_userContext.CurrentUser.HasFunction("Site-Sites-Edit"))
+            if (_userContext.CurrentUser.HasFunction("Site-Sites-Edit") || _userContext.CurrentUser.HasFunction("Site-Sites-Delete"))
             {
                 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>"
-                        );
+                        if (_userContext.CurrentUser.HasFunction("Site-Sites-Edit"))
+                            html.ViewContext.Writer.Write(
+                                "<a href=\"#\" onclick=\"editSite(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Bearbeiten</a>");
+
+                        if (_userContext.CurrentUser.HasFunction("Site-Sites-Delete"))
+                            html.ViewContext.Writer.Write(
+                                "<br /><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;");
+                        if (_userContext.CurrentUser.HasFunction("Site-Sites-Edit"))
+                            html.ViewContext.Writer.Write(
+                                "<a href=\"#\" onclick=\"editSite(-1)\">Neu</a>&nbsp;");
                     });
                     column.Settings.AllowDragDrop = DefaultBoolean.False;
                     column.Settings.AllowSort = DefaultBoolean.False;
@@ -166,9 +168,25 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
             s.Columns.Add(column =>
             {
                 column.Caption = "Mitarbeiter";
-                column.FieldName = "UserDescription";
                 column.MinWidth = 150;
                 column.Width = new Unit(20, UnitType.Percentage);
+                column.SetDataItemTemplateContent(c =>
+                {
+                    var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
+
+                    if (userDescriptions != null)
+                    {
+                        html.ViewContext.Writer.Write(
+                            String.Join("<br />", userDescriptions));
+                    }
+                });
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Kommentar";
+                column.FieldName = "Comment";
+                column.MinWidth = 100;
+                column.Width = new Unit(10, UnitType.Percentage);
             });
 
             s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "DeviationValue");

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Global.asax.cs

@@ -261,7 +261,7 @@ namespace GreenTree.Nachtragsmanagement.Web
                 }
 
                 var siteFunctions = allFunctions
-                    .Where(f => f.Name.StartsWith("Site"));
+                    .Where(f => f.Name.StartsWith("Site") && f.Name != "Site-Sites-Delete");
 
                 foreach (var function in siteFunctions)
                 {

+ 1 - 0
GreenTree.Nachtragsmanagement.Web/Models/Site/SiteDataModel.cs

@@ -89,6 +89,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
                 Description = siteEntity.Description,
                 Start = siteEntity.Start,
                 End = siteEntity.End,
+                Comment = siteEntity.Comment,
                 DeviationValues =
                     siteEntity.Deviations
                         .Select(r => r.Id)

+ 14 - 1
GreenTree.Nachtragsmanagement.Web/Validation/Appendix/AppendixDataModelValidator.cs

@@ -1,4 +1,8 @@
-using FluentValidation;
+using Autofac;
+using FluentValidation;
+using GreenTree.Nachtragsmanagement.Core;
+using GreenTree.Nachtragsmanagement.Services.Appendix;
+using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Web.Models.Appendix;
 using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
 using System;
@@ -12,12 +16,21 @@ namespace GreenTree.Nachtragsmanagement.Web.Validation.Appendix
     {
         public AppendixDataModelValidator()
         {
+            var siteService = Singleton<IContainer>.Instance.Resolve<ISiteService>();
+
             RuleFor(m => m.CustomNumber)
                 .NotEmpty()
                     .WithMessage("Nummer wird benötigt")
                 .MaximumLength(10)
                     .WithMessage("Muss unter 10 Zeichen sein");
 
+            RuleFor(m => m)
+                .Must(a1 => a1.SiteId.HasValue &&
+                    !siteService.GetSiteById(a1.SiteId.Value).Appendices
+                        .Select(a2 => a2.CustomNumber)
+                            .Contains(a1.CustomNumber))
+                    .WithMessage("Nachtragsnummer in Baustelle bereits vorhanden.");
+
             RuleFor(m => m.Description)
                 .NotEmpty()
                     .WithMessage("Beschreibung wird benötigt");

+ 23 - 1
GreenTree.Nachtragsmanagement.Web/Validation/Deviation/DeviationDataModelValidator.cs

@@ -1,4 +1,9 @@
-using FluentValidation;
+using Autofac;
+using FluentValidation;
+using GreenTree.Nachtragsmanagement.Core;
+using GreenTree.Nachtragsmanagement.Services.Appendix;
+using GreenTree.Nachtragsmanagement.Services.Deviation;
+using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
 using System;
 using System.Collections.Generic;
@@ -11,12 +16,29 @@ namespace GreenTree.Nachtragsmanagement.Web.Validation.Deviation
     {
         public DeviationDataModelValidator()
         {
+            var siteService = Singleton<IContainer>.Instance.Resolve<ISiteService>();
+            var appendixService = Singleton<IContainer>.Instance.Resolve<IAppendixService>();
+
             RuleFor(m => m.CustomNumber)
                 .NotEmpty()
                     .WithMessage("Nummer wird benötigt")
                 .MaximumLength(10)
                     .WithMessage("Muss unter 10 Zeichen sein");
 
+            RuleFor(m => m)
+                .Must(d1 =>
+                   (d1.SiteId.HasValue &&
+                        !siteService.GetSiteById(d1.SiteId.Value).Appendices
+                            .SelectMany(d2 => d2.Deviations)
+                                .Select(d3 => d3.CustomNumber)
+                                    .Contains(d1.CustomNumber)) ||
+                   (d1.AppendixId.HasValue &&
+                        !appendixService.GetAppendixById(d1.AppendixId.Value).Site.Appendices
+                            .SelectMany(d2 => d2.Deviations)
+                                .Select(d3 => d3.CustomNumber)
+                                    .Contains(d1.CustomNumber)))
+                    .WithMessage("VA-Nummer in Baustelle bereits vorhanden.");
+
             RuleFor(m => m.Description)
                 .NotEmpty()
                     .WithMessage("Beschreibung wird benötigt");

+ 2 - 0
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixEditPartial.cshtml

@@ -202,6 +202,8 @@
 			ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.Id + "\" id=\"Id\" name=\"Id\" />");
 			ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.SiteId + "\" id=\"SiteId\" name=\"SiteId\" />");
 
+			ViewContext.Writer.Write(Html.ValidationMessageFor(m => m).ToHtmlString());
+
 			ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 			{
 				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 15%'>");

+ 2 - 0
GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationEditPartial.cshtml

@@ -168,6 +168,8 @@
 			ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.AppendixId + "\" id=\"AppendixId\" name=\"AppendixId\" />");
 			ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.SiteId + "\" id=\"SiteId\" name=\"SiteId\" />");
 
+			ViewContext.Writer.Write(Html.ValidationMessageFor(m => m).ToHtmlString());
+
 			ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 			{
 				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 15%'>");

+ 137 - 114
GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteEditPartial.cshtml

@@ -325,152 +325,175 @@
 	</style>
 
 	@Html.DevExpress().PopupControl(s =>
+{
+	s.Name = "devPopupControlEditSite";
+
+	if (Model.Id == -1)
+		s.HeaderText = "Neue Baustelle erstellen";
+	else
+		s.HeaderText = "\"" + Model.CustomNumber + "\" bearbeiten";
+
+	s.Modal = true;
+	s.Width = new Unit(1000, UnitType.Pixel);
+	s.CloseAction = CloseAction.CloseButton;
+	s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
+	s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
+	s.PopupVerticalOffset = 10;
+	s.AllowDragging = true;
+	s.AllowResize = false;
+	s.ShowMaximizeButton = true;
+	s.ShowFooter = false;
+	s.ShowOnPageLoad = true;
+	s.SetContent(() =>
 	{
-		s.Name = "devPopupControlEditSite";
-
-		if (Model.Id == -1)
-			s.HeaderText = "Neue Baustelle erstellen";
-		else
-			s.HeaderText = "\"" + Model.CustomNumber + "\" bearbeiten";
-
-		s.Modal = true;
-		s.Width = new Unit(1000, UnitType.Pixel);
-		s.CloseAction = CloseAction.CloseButton;
-		s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
-		s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
-		s.PopupVerticalOffset = 10;
-		s.AllowDragging = true;
-		s.AllowResize = false;
-		s.ShowMaximizeButton = true;
-		s.ShowFooter = false;
-		s.ShowOnPageLoad = true;
-		s.SetContent(() =>
+		using (Html.BeginForm("EditSite", "Site", FormMethod.Post, new { id = "siteEditForm" }))
 		{
-			using (Html.BeginForm("EditSite", "Site", FormMethod.Post, new { id = "siteEditForm" }))
-			{
-				ViewContext.Writer.Write("<div class='editFormWrapper'>");
+			ViewContext.Writer.Write("<div class='editFormWrapper'>");
 
-				ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.Id + "\" id=\"Id\" name=\"Id\" />");
+			ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.Id + "\" id=\"Id\" name=\"Id\" />");
 
-				ViewContext.Writer.Write("<table class=\"siteEditLayoutTable\"><tbody><tr><td>");
+			ViewContext.Writer.Write("<table class=\"siteEditLayoutTable\"><tbody><tr><td>");
+			{
+				ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 				{
-					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+					ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 30%'>");
 					{
-						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 30%'>");
+						ViewContext.Writer.Write(Html.CustomLabelFor(m => m.CustomNumber, "Kostenstelle:"));
+						ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.CustomNumber).ToHtmlString());
+						Html.DevExpress().TextBoxFor(m => m.CustomNumber, t =>
 						{
-							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.CustomNumber, "Kostenstelle:"));
-							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.CustomNumber).ToHtmlString());
-							Html.DevExpress().TextBoxFor(m => m.CustomNumber, t =>
-							{
-								t.Width = new Unit(90, UnitType.Percentage);
-							}).Render();
-						}
-						ViewContext.Writer.Write("</div>");
-						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 70%'>");
+							t.Width = new Unit(90, UnitType.Percentage);
+						}).Render();
+					}
+					ViewContext.Writer.Write("</div>");
+					ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 70%'>");
+					{
+						ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Description, "Bauvorhaben:"));
+						ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Description).ToHtmlString());
+						Html.DevExpress().TextBoxFor(m => m.Description, t =>
 						{
-							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Description, "Bauvorhaben:"));
-							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Description).ToHtmlString());
-							Html.DevExpress().TextBoxFor(m => m.Description, t =>
-							{
-								t.Width = new Unit(99, UnitType.Percentage);
-							}).Render();
-						}
-						ViewContext.Writer.Write("</div>");
+							t.Width = new Unit(99, UnitType.Percentage);
+						}).Render();
 					}
 					ViewContext.Writer.Write("</div>");
+				}
+				ViewContext.Writer.Write("</div>");
 
-					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+				ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+				{
+					ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 52%'>");
 					{
-						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 52%'>");
+						ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Start, "Start:"));
+						ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Start).ToHtmlString());
+						Html.DevExpress().DateEditFor(m => m.Start, t =>
 						{
-							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Start, "Start:"));
-							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Start).ToHtmlString());
-							Html.DevExpress().DateEditFor(m => m.Start, t =>
-							{
-								t.Width = new Unit(95, UnitType.Percentage);
-							}).Render();
-						}
-						ViewContext.Writer.Write("</div>");
+							t.Width = new Unit(95, UnitType.Percentage);
+						}).Render();
+					}
+					ViewContext.Writer.Write("</div>");
 
-						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 48%'>");
+					ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 48%'>");
+					{
+						ViewContext.Writer.Write(Html.CustomLabelFor(m => m.End, "Ende:"));
+						Html.DevExpress().DateEditFor(m => m.End, t =>
 						{
-							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.End, "Ende:"));
-							Html.DevExpress().DateEditFor(m => m.End, t =>
-							{
-								t.Width = new Unit(98, UnitType.Percentage);
-							}).Render();
-						}
-						ViewContext.Writer.Write("</div>");
+							t.Width = new Unit(98, UnitType.Percentage);
+						}).Render();
 					}
 					ViewContext.Writer.Write("</div>");
 				}
-				ViewContext.Writer.Write("</td><td>");
+				ViewContext.Writer.Write("</div>");
+			}
+			ViewContext.Writer.Write("</td><td>");
+			{
+				ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 				{
-					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.UserValues, "Benutzer:"));
-					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.UserValues).ToHtmlString());
-					Html.DevExpress().DropDownEdit(t =>
+					ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 100%'>");
 					{
-						t.Name = "devDropDownListUserValues";
-						t.Width = new Unit(100, UnitType.Percentage);
-						t.Text = Model.UserDescription;
-
-						t.SetDropDownWindowTemplateContent(l =>
+						ViewContext.Writer.Write(Html.CustomLabelFor(m => m.UserValues, "Benutzer:"));
+						ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.UserValues).ToHtmlString());
+						Html.DevExpress().DropDownEdit(t =>
 						{
-							Html.DevExpress().ListBox(lb =>
+							t.Name = "devDropDownListUserValues";
+							t.Width = new Unit(100, UnitType.Percentage);
+							t.Text = Model.UserDescription;
+
+							t.SetDropDownWindowTemplateContent(l =>
 							{
-								lb.Name = "UserValues";
-								lb.Width = new Unit(100, UnitType.Percentage);
-								lb.Height = new Unit(250, UnitType.Pixel);
-								lb.Properties.TextField = "Description";
-								lb.Properties.ValueField = "Id";
-								lb.Properties.ValueType = typeof(int);
-								lb.Properties.SelectionMode = ListEditSelectionMode.CheckColumn;
-								lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
-								lb.PreRender = (sender, e) =>
+								Html.DevExpress().ListBox(lb =>
 								{
-									var listBox = sender as MVCxListBox;
-
-									foreach (ListEditItem listItem in listBox.Items)
+									lb.Name = "UserValues";
+									lb.Width = new Unit(100, UnitType.Percentage);
+									lb.Height = new Unit(250, UnitType.Pixel);
+									lb.Properties.TextField = "Description";
+									lb.Properties.ValueField = "Id";
+									lb.Properties.ValueType = typeof(int);
+									lb.Properties.SelectionMode = ListEditSelectionMode.CheckColumn;
+									lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
+									lb.PreRender = (sender, e) =>
 									{
-										if (Model.UserValues == null || !Model.UserValues.Any(m => m == (int)listItem.Value)) continue;
-
-										listItem.Selected = true;
-									}
-								};
-								lb.Properties.ClientSideEvents.SelectedIndexChanged = "function (s, e) { onListBoxSelectionChanged(s, e); }";
-							}).BindList(ViewData["AllUsersWithRole"]).Render();
-
-							t.Properties.ClientSideEvents.TextChanged = "function (s, e) { synchronizeListBoxValues(s, e); }";
-							t.Properties.ClientSideEvents.DropDown = "function (s, e) { synchronizeListBoxValues(s, e); }";
-						});
-					}).Render();
+										var listBox = sender as MVCxListBox;
+
+										foreach (ListEditItem listItem in listBox.Items)
+										{
+											if (Model.UserValues == null || !Model.UserValues.Any(m => m == (int)listItem.Value)) continue;
+
+											listItem.Selected = true;
+										}
+									};
+									lb.Properties.ClientSideEvents.SelectedIndexChanged = "function (s, e) { onListBoxSelectionChanged(s, e); }";
+								}).BindList(ViewData["AllUsersWithRole"]).Render();
+
+								t.Properties.ClientSideEvents.TextChanged = "function (s, e) { synchronizeListBoxValues(s, e); }";
+								t.Properties.ClientSideEvents.DropDown = "function (s, e) { synchronizeListBoxValues(s, e); }";
+							});
+						}).Render();
+					}
+					ViewContext.Writer.Write("</div>");
 				}
-				ViewContext.Writer.Write("</td></tr></tbody></table>");
-
-
-				ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Deviations, "Vertragsabweichungen / Nachträge:"));
+				ViewContext.Writer.Write("</div>");
 
-				ViewContext.Writer.Write("<div id=\"siteTreeContainer\" style='width: 100%; overflow: auto; max-height: 450px; border: 1px solid #d0d0d0'>");
+				ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 				{
-					ViewContext.Writer.Write(Html.Partial("~/Views/Sites/_SiteEditTreePartial.cshtml", Model).ToHtmlString());
+					ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 100%'>");
+					{
+						ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Comment, "Kommentar:"));
+						ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Comment).ToHtmlString());
+						Html.DevExpress().TextBoxFor(m => m.Comment, t =>
+						{
+							t.Width = new Unit(100, UnitType.Percentage);
+						}).Render();
+					}
+					ViewContext.Writer.Write("</div>");
 				}
 				ViewContext.Writer.Write("</div>");
+			}
+			ViewContext.Writer.Write("</td></tr></tbody></table>");
 
-				ViewContext.Writer.Write("</div>");
 
-				Html.RenderPartial(
-					"~/Views/Shared/_PopupButtonPanel.cshtml",
-					new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
-					{
-						PopupName = "devPopupControlEditSite",
-						AcceptFunction = "function (s, e) { saveSite(); }"
-					}
-				);
+			ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Deviations, "Vertragsabweichungen / Nachträge:"));
+
+			ViewContext.Writer.Write("<div id=\"siteTreeContainer\" style='width: 100%; overflow: auto; max-height: 450px; border: 1px solid #d0d0d0'>");
+			{
+				ViewContext.Writer.Write(Html.Partial("~/Views/Sites/_SiteEditTreePartial.cshtml", Model).ToHtmlString());
 			}
-		});
-		s.Styles.Content.Paddings.Padding = new Unit(0);
-		s.Styles.ModalBackground.Opacity = 0;
-	}).GetHtml()
+			ViewContext.Writer.Write("</div>");
+
+			ViewContext.Writer.Write("</div>");
+
+			Html.RenderPartial(
+				"~/Views/Shared/_PopupButtonPanel.cshtml",
+				new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
+				{
+					PopupName = "devPopupControlEditSite",
+					AcceptFunction = "function (s, e) { saveSite(); }"
+				}
+			);
+		}
+	});
+	s.Styles.Content.Paddings.Padding = new Unit(0);
+	s.Styles.ModalBackground.Opacity = 0;
+}).GetHtml()
 
 	@Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
 {