_SiteEditPartial.cshtml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. @using GreenTree.Nachtragsmanagement.Web.Extensions
  2. @{
  3. var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
  4. }
  5. @model GreenTree.Nachtragsmanagement.Web.Models.Site.SiteDataModel
  6. <div class="siteEditContainer">
  7. <script>
  8. var textSeparator = ", ";
  9. var isDragging = false;
  10. var dragStartY = 0;
  11. var isScrolling = false;
  12. var scrollInterval = null;
  13. var deleteId = null;
  14. $(document).ready(function () {
  15. $(window).mouseup(function () {
  16. isDragging = false;
  17. });
  18. $(window).mousemove(function (e) {
  19. if (isDragging) {
  20. var offset = e.clientY - dragStartY;
  21. var scrollOffset = $("#siteTreeContainer").scrollTop();
  22. if (isDragging) {
  23. var result = scrollOffset + (offset / 10);
  24. $("#siteTreeContainer").scrollTop(result);
  25. }
  26. }
  27. });
  28. });
  29. function saveSite() {
  30. var form = $("#siteEditForm");
  31. $(form).submit(function (e) {
  32. $.ajax({
  33. type: "POST",
  34. url: '@Url.Action("EditSite", "Site")',
  35. data: form.serialize(),
  36. success: function (response) {
  37. setTimeout(function () {
  38. $(".siteEditContainer").remove();
  39. if (response == "success") {
  40. devGridViewSite.PerformCallback();
  41. } else {
  42. $("body").append(response);
  43. }
  44. }, 200);
  45. }
  46. });
  47. e.preventDefault();
  48. });
  49. form.submit();
  50. }
  51. function saveSiteForAppend() {
  52. devPopupControlSaveForAppend.Hide();
  53. var form = $("#siteEditForm");
  54. $(form).submit(function (e) {
  55. $.ajax({
  56. type: "POST",
  57. url: '@Url.Action("EditSiteForAppend", "Site")',
  58. data: form.serialize(),
  59. success: function (response) {
  60. setTimeout(function () {
  61. $(".siteEditContainer").remove();
  62. $("body").append(response);
  63. }, 200);
  64. }
  65. });
  66. e.preventDefault();
  67. });
  68. form.submit();
  69. }
  70. function addAppendixToSite(siteId) {
  71. if (!siteId) return;
  72. if (siteId == -1) {
  73. devPopupControlSaveForAppend.Show();
  74. return;
  75. }
  76. $.ajax({
  77. url: '@Url.Action("AppendAppendixToSite", "Appendix")',
  78. data: { SiteId: siteId },
  79. success: function (response) {
  80. setTimeout(function () {
  81. $(".deviationEditContainer").remove();
  82. $(".appendixEditContainer").remove();
  83. $("body").append(response);
  84. }, 200);
  85. },
  86. error: function () {
  87. alert("error occured");
  88. }
  89. });
  90. }
  91. function addDeviationToSite(siteId) {
  92. if (!siteId) return;
  93. $.ajax({
  94. url: '@Url.Action("AppendDeviationToSite", "Deviation")',
  95. data: { SiteId: siteId },
  96. success: function (response) {
  97. setTimeout(function () {
  98. $(".deviationEditContainer").remove();
  99. $(".appendixEditContainer").remove();
  100. $("body").append(response);
  101. }, 200);
  102. },
  103. error: function () {
  104. alert("error occured");
  105. }
  106. });
  107. }
  108. function addDeviationToAppendix(appendixId) {
  109. if (!appendixId) return;
  110. $.ajax({
  111. url: '@Url.Action("AppendDeviationToAppendix", "Deviation")',
  112. data: { AppendixId: appendixId },
  113. success: function (response) {
  114. setTimeout(function () {
  115. $(".deviationEditContainer").remove();
  116. $(".appendixEditContainer").remove();
  117. $("body").append(response);
  118. }, 200);
  119. },
  120. error: function () {
  121. alert("error occured");
  122. }
  123. });
  124. }
  125. function editDeviation(id) {
  126. if (!id) return;
  127. $.ajax({
  128. url: '@Url.Action("EditDeviation", "Deviation")',
  129. data: { Id: id },
  130. success: function (response) {
  131. setTimeout(function () {
  132. $(".deviationEditContainer").remove();
  133. $(".appendixEditContainer").remove();
  134. $("body").append(response);
  135. }, 200);
  136. },
  137. error: function () {
  138. alert("error occured");
  139. }
  140. });
  141. }
  142. function confirmDeleteDeviation(id) {
  143. if (!id) return;
  144. deleteId = id;
  145. $.ajax({
  146. type: "GET",
  147. url: '@Url.Action("GetDeviation", "Deviation")',
  148. data: { Id: id },
  149. success: function (response) {
  150. if (response == "notFound") return;
  151. var deviation = JSON.parse(response);
  152. var popupControl = MVCxClientPopupControl.Cast(devPopupControlDeleteDeviation);
  153. popupControl.SetHeaderText(popupControl.GetHeaderText().replace("{deviation}", deviation.CustomNumber));
  154. $(".dialogTextDeviation").text($(".dialogTextDeviation").text().replace("{deviation}", deviation.CustomNumber));
  155. popupControl.Show();
  156. }
  157. });
  158. }
  159. function deleteDeviation() {
  160. $.ajax({
  161. type: "POST",
  162. url: '@Url.Action("DeleteDeviation", "Deviation")',
  163. data: { Id: deleteId },
  164. success: function (response) {
  165. var popupControl = MVCxClientPopupControl.Cast(devPopupControlDeleteDeviation);
  166. popupControl.Hide();
  167. setTimeout(function () {
  168. devTreeListSiteDeviationAppendices.PerformCallback();
  169. }, 200);
  170. },
  171. error: function () {
  172. alert("error occured");
  173. }
  174. });
  175. }
  176. function editAppendix(id) {
  177. if (!id) return;
  178. $.ajax({
  179. url: '@Url.Action("EditAppendix", "Appendix")',
  180. data: { Id: id },
  181. success: function (response) {
  182. setTimeout(function () {
  183. $(".deviationEditContainer").remove();
  184. $(".appendixEditContainer").remove();
  185. $("body").append(response);
  186. }, 200);
  187. },
  188. error: function () {
  189. alert("error occured");
  190. }
  191. });
  192. }
  193. function confirmDeleteAppendix(id) {
  194. if (!id) return;
  195. deleteId = id;
  196. $.ajax({
  197. type: "GET",
  198. url: '@Url.Action("GetAppendix", "Appendix")',
  199. data: { Id: id },
  200. success: function (response) {
  201. if (response == "notFound") return;
  202. var appendix = JSON.parse(response);
  203. var popupControl = MVCxClientPopupControl.Cast(devPopupControlDeleteAppendix);
  204. popupControl.SetHeaderText(popupControl.GetHeaderText().replace("{appendix}", appendix.CustomNumber));
  205. $(".dialogTextAppendix").text($(".dialogTextAppendix").text().replace("{appendix}", appendix.CustomNumber));
  206. popupControl.Show();
  207. }
  208. });
  209. }
  210. function deleteAppendix() {
  211. $.ajax({
  212. type: "POST",
  213. url: '@Url.Action("DeleteAppendix", "Appendix")',
  214. data: { Id: deleteId },
  215. success: function (response) {
  216. var popupControl = MVCxClientPopupControl.Cast(devPopupControlDeleteAppendix);
  217. popupControl.Hide();
  218. setTimeout(function () {
  219. devTreeListSiteDeviationAppendices.PerformCallback();
  220. }, 200);
  221. },
  222. error: function () {
  223. alert("error occured");
  224. }
  225. });
  226. }
  227. function startSiteTreeNodeDrag(s, e) {
  228. if (!s || !e) return;
  229. if (e.nodeKey[0] == "a") {
  230. e.cancel = true;
  231. return;
  232. }
  233. dragStartY = e.htmlEvent.clientY;
  234. isDragging = true;
  235. var source = e.nodeKey;
  236. }
  237. function endSiteTreeNodeDrag(s, e) {
  238. if (!s || !e) return;
  239. isDragging = false;
  240. var sourceKey = e.nodeKey;
  241. var targetKey = devTreeListSiteDeviationAppendices.GetNodeKeyByRow(e.targetElement);
  242. if (!sourceKey || !targetKey) return;
  243. $.ajax({
  244. type: "POST",
  245. url: '@Url.Action("AssignDeviationToEntity", "Site")',
  246. data: { SiteId: @Model.Id, SourceKey: sourceKey, TargetKey: targetKey },
  247. success: function (response) {
  248. if (response == "success") {
  249. setTimeout(function () {
  250. devTreeListSiteDeviationAppendices.PerformCallback();
  251. }, 200);
  252. }
  253. }
  254. });
  255. }
  256. function onDeviationSaveSuccess() {
  257. devTreeListSiteDeviationAppendices.PerformCallback();
  258. }
  259. function onAppendixSaveSuccess() {
  260. devTreeListSiteDeviationAppendices.PerformCallback();
  261. }
  262. function onListBoxSelectionChanged(s, e) {
  263. updateText();
  264. }
  265. function updateText() {
  266. var selectedItems = UserValues.GetSelectedItems();
  267. devDropDownListUserValues.SetText(getSelectedItemsText(selectedItems));
  268. }
  269. function synchronizeListBoxValues(s, e) {
  270. UserValues.UnselectAll();
  271. var texts = s.GetText().split(textSeparator);
  272. var values = getValuesByTexts(texts);
  273. UserValues.SelectValues(values);
  274. updateText();
  275. }
  276. function getSelectedItemsText(items) {
  277. var texts = [];
  278. for (var i = 0; i < items.length; i++)
  279. texts.push(items[i].text);
  280. return texts.join(textSeparator);
  281. }
  282. function getValuesByTexts(texts) {
  283. var actualValues = [];
  284. var item;
  285. for (var i = 0; i < texts.length; i++) {
  286. item = UserValues.FindItemByText(texts[i]);
  287. if (item != null)
  288. actualValues.push(item.value);
  289. }
  290. return actualValues;
  291. }
  292. </script>
  293. <style>
  294. .siteTreeList { }
  295. .siteTreeList a { text-decoration: none; }
  296. .siteTreeList a:hover { text-decoration: underline; }
  297. .siteEditLayoutTable { width: 100%; }
  298. .siteEditLayoutTable > tbody > tr > td { width: 50%; padding-right: 8px; vertical-align: top }
  299. </style>
  300. @Html.DevExpress().PopupControl(s =>
  301. {
  302. s.Name = "devPopupControlEditSite";
  303. if (Model.Id == -1)
  304. s.HeaderText = "Neue Baustelle erstellen";
  305. else
  306. s.HeaderText = "\"" + Model.CustomNumber + "\" bearbeiten";
  307. s.Modal = true;
  308. s.Width = new Unit(1000, UnitType.Pixel);
  309. s.CloseAction = CloseAction.CloseButton;
  310. s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
  311. s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
  312. s.PopupVerticalOffset = 10;
  313. s.AllowDragging = true;
  314. s.AllowResize = false;
  315. s.ShowMaximizeButton = true;
  316. s.ShowFooter = false;
  317. s.ShowOnPageLoad = true;
  318. s.SetContent(() =>
  319. {
  320. using (Html.BeginForm("EditSite", "Site", FormMethod.Post, new { id = "siteEditForm" }))
  321. {
  322. ViewContext.Writer.Write("<div class='editFormWrapper'>");
  323. ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.Id + "\" id=\"Id\" name=\"Id\" />");
  324. ViewContext.Writer.Write("<table class=\"siteEditLayoutTable\"><tbody><tr><td>");
  325. {
  326. ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
  327. {
  328. ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 30%'>");
  329. {
  330. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.CustomNumber, "Kostenstelle:"));
  331. ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.CustomNumber).ToHtmlString());
  332. Html.DevExpress().TextBoxFor(m => m.CustomNumber, t =>
  333. {
  334. t.Width = new Unit(90, UnitType.Percentage);
  335. }).Render();
  336. }
  337. ViewContext.Writer.Write("</div>");
  338. ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 70%'>");
  339. {
  340. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Description, "Bauvorhaben:"));
  341. ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Description).ToHtmlString());
  342. Html.DevExpress().TextBoxFor(m => m.Description, t =>
  343. {
  344. t.Width = new Unit(99, UnitType.Percentage);
  345. }).Render();
  346. }
  347. ViewContext.Writer.Write("</div>");
  348. }
  349. ViewContext.Writer.Write("</div>");
  350. ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
  351. {
  352. ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 52%'>");
  353. {
  354. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Start, "Start:"));
  355. ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Start).ToHtmlString());
  356. Html.DevExpress().DateEditFor(m => m.Start, t =>
  357. {
  358. t.Width = new Unit(95, UnitType.Percentage);
  359. }).Render();
  360. }
  361. ViewContext.Writer.Write("</div>");
  362. ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 48%'>");
  363. {
  364. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.End, "Ende:"));
  365. Html.DevExpress().DateEditFor(m => m.End, t =>
  366. {
  367. t.Width = new Unit(98, UnitType.Percentage);
  368. }).Render();
  369. }
  370. ViewContext.Writer.Write("</div>");
  371. }
  372. ViewContext.Writer.Write("</div>");
  373. }
  374. ViewContext.Writer.Write("</td><td>");
  375. {
  376. ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
  377. {
  378. ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 100%'>");
  379. {
  380. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.UserValues, "Benutzer:"));
  381. ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.UserValues).ToHtmlString());
  382. Html.DevExpress().DropDownEdit(t =>
  383. {
  384. t.Name = "devDropDownListUserValues";
  385. t.Width = new Unit(100, UnitType.Percentage);
  386. t.Text = Model.UserDescription;
  387. t.SetDropDownWindowTemplateContent(l =>
  388. {
  389. Html.DevExpress().ListBox(lb =>
  390. {
  391. lb.Name = "UserValues";
  392. lb.Width = new Unit(100, UnitType.Percentage);
  393. lb.Height = new Unit(250, UnitType.Pixel);
  394. lb.Properties.TextField = "Description";
  395. lb.Properties.ValueField = "Id";
  396. lb.Properties.ValueType = typeof(int);
  397. lb.Properties.SelectionMode = ListEditSelectionMode.CheckColumn;
  398. lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
  399. lb.PreRender = (sender, e) =>
  400. {
  401. var listBox = sender as MVCxListBox;
  402. foreach (ListEditItem listItem in listBox.Items)
  403. {
  404. if (Model.UserValues == null || !Model.UserValues.Any(m => m == (int)listItem.Value)) continue;
  405. listItem.Selected = true;
  406. }
  407. };
  408. lb.Properties.ClientSideEvents.SelectedIndexChanged = "function (s, e) { onListBoxSelectionChanged(s, e); }";
  409. }).BindList(ViewData["AllUsersWithRole"]).Render();
  410. t.Properties.ClientSideEvents.TextChanged = "function (s, e) { synchronizeListBoxValues(s, e); }";
  411. t.Properties.ClientSideEvents.DropDown = "function (s, e) { synchronizeListBoxValues(s, e); }";
  412. });
  413. }).Render();
  414. }
  415. ViewContext.Writer.Write("</div>");
  416. }
  417. ViewContext.Writer.Write("</div>");
  418. ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
  419. {
  420. ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 100%'>");
  421. {
  422. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Comment, "Kommentar:"));
  423. ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Comment).ToHtmlString());
  424. Html.DevExpress().TextBoxFor(m => m.Comment, t =>
  425. {
  426. t.Width = new Unit(100, UnitType.Percentage);
  427. }).Render();
  428. }
  429. ViewContext.Writer.Write("</div>");
  430. }
  431. ViewContext.Writer.Write("</div>");
  432. }
  433. ViewContext.Writer.Write("</td></tr></tbody></table>");
  434. ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Deviations, "Vertragsabweichungen / Nachträge:"));
  435. ViewContext.Writer.Write("<div id=\"siteTreeContainer\" style='width: 100%; overflow: auto; max-height: 450px; border: 1px solid #d0d0d0'>");
  436. {
  437. ViewContext.Writer.Write(Html.Partial("~/Views/Sites/_SiteEditTreePartial.cshtml", Model).ToHtmlString());
  438. }
  439. ViewContext.Writer.Write("</div>");
  440. ViewContext.Writer.Write("</div>");
  441. Html.RenderPartial(
  442. "~/Views/Shared/_PopupButtonPanel.cshtml",
  443. new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
  444. {
  445. PopupName = "devPopupControlEditSite",
  446. AcceptFunction = "function (s, e) { saveSite(); }"
  447. }
  448. );
  449. }
  450. });
  451. s.Styles.Content.Paddings.Padding = new Unit(0);
  452. s.Styles.ModalBackground.Opacity = 0;
  453. }).GetHtml()
  454. @Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
  455. {
  456. PopupName = "devPopupControlSaveForAppend",
  457. Content = "<div class='dialogTextSaveForAppend' style='padding: 12px'>Damit ein Nachtrag für die Baustelle erfasst werden kann, " +
  458. "muss Sie zunächst gespeichert werden. Soll die Baustelle jetzt gespeichert werden?</div>",
  459. HeaderText = "Baustelle speichern",
  460. YesFunction = "function (s, e) { saveSiteForAppend(); }",
  461. YesButtonName = "devButtonSaveForAppendYes",
  462. NoButtonName = "devButtonSaveForAppendNo"
  463. })
  464. @Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
  465. {
  466. PopupName = "devPopupControlDeleteAppendix",
  467. Content = "<div class='dialogTextAppendix' style='padding: 12px'>Sind Sie sicher, dass Sie den Nachtrag \"{appendix}\" und " +
  468. "alle zugehörigen Vertragsabweichungen löschen möchten? Der Vorgang kann nicht rückgängig gemacht werden.</div>",
  469. HeaderText = "\"{appendix}\" löschen",
  470. YesFunction = "function (s, e) { deleteAppendix(); }",
  471. YesButtonName = "devButtonDeleteAppendixYes",
  472. NoButtonName = "devButtonDeleteAppendixNo"
  473. })
  474. @Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
  475. {
  476. PopupName = "devPopupControlDeleteDeviation",
  477. Content = "<div class='dialogTextDeviation' style='padding: 12px'>Sind Sie sicher, dass Sie die Vertragsabweichung \"{deviation}\" " +
  478. "löschen möchten? Der Vorgang kann nicht rückgängig gemacht werden.</div>",
  479. HeaderText = "\"{deviation}\" löschen",
  480. YesFunction = "function (s, e) { deleteDeviation(); }",
  481. YesButtonName = "devButtonDeleteDeviationYes",
  482. NoButtonName = "devButtonDeleteDeviationNo"
  483. })
  484. </div>