_SiteEditPartial.cshtml 17 KB

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