_SiteEditPartial.cshtml 17 KB

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