Index.cshtml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. @{
  2. ViewBag.Title = "Nachtragsmanagement";
  3. Layout = "~/Views/Shared/_Layout.cshtml";
  4. }
  5. @model GreenTree.Nachtragsmanagement.Web.Models.Home.HomeModel
  6. <script>
  7. var openOffsetX = 10;
  8. var openOffsetY = 5;
  9. var popupNames = [];
  10. var popupElements = {};
  11. var popupStatus = {};
  12. var popupImages = {};
  13. var popupDescriptions = {};
  14. var popupWidths = {};
  15. var popupHeights = {};
  16. var popupLocationsX = {};
  17. var popupLocationsY = {};
  18. var popupMinimized = {};
  19. var popupUrls = {};
  20. var popupMaxOnStartup = {};
  21. var isFullscreen = false;
  22. var isFullscreenMaximized = false;
  23. var fullscreenLastX;
  24. var fullscreenLastY;
  25. var fullscreenLastWidth;
  26. var fullscreenLastHeight;
  27. var contentX = 0;
  28. var contentY = 0;
  29. var dragElement = null;
  30. var dragStart = {};
  31. var eventListeners = [];
  32. var exportFormat = "pdf";
  33. @foreach (var g in Model.AvailableFunctions)
  34. {
  35. foreach (var i in g.Value)
  36. {
  37. if (Url.RouteCollection[i.RouteName] != null)
  38. {
  39. ViewContext.Writer.WriteLine("popupNames.push(\"" + i.Name + "\");");
  40. ViewContext.Writer.WriteLine("popupElements[\"" + i.Name + "\"] = \"" + i.Name + "_PW-1\";");
  41. ViewContext.Writer.WriteLine("popupImages[\"" + i.Name + "\"] = \"" + Url.Content(i.ImageUrl) + "\";");
  42. ViewContext.Writer.WriteLine("popupDescriptions[\"" + i.Name + "\"] = \"" + i.Description + "\";");
  43. ViewContext.Writer.WriteLine("popupUrls[\"" + i.Name + "\"] = \"" + Url.RouteUrl(i.RouteName) + "\";");
  44. ViewContext.Writer.WriteLine("popupMaxOnStartup[\"" + i.Name + "\"] = " + (i.MaximizedOnStart.HasValue ? i.MaximizedOnStart.Value.ToString().ToLower() : "false") + ";");
  45. }
  46. }
  47. }
  48. function addCustomEventListener(name, func) {
  49. if (!name || !func) return;
  50. eventListeners.push({ name: name, func: func });
  51. }
  52. function callCustomEventListener(name) {
  53. for (var i = 0; i < eventListeners.length; i++) {
  54. if (eventListeners[i].name == name) {
  55. eventListeners[i].func();
  56. eventListeners.splice(i, 1);
  57. }
  58. }
  59. }
  60. function callCustomEventListener(name, params) {
  61. for (var i = 0; i < eventListeners.length; i++) {
  62. if (eventListeners[i].name == name) {
  63. eventListeners[i].func(params);
  64. eventListeners.splice(i, 1);
  65. }
  66. }
  67. }
  68. $(document).ready(function () {
  69. $(".functionNavigationContainer").height($(window).height() - $(".globalFooter").height() - 3);
  70. $(".functionContentContainer").height($(window).height() - $(".globalFooter").height() - 3);
  71. $(".functionContentContainer").width($(window).width() - $(".functionNavigationContainer").width() - 3);
  72. contentX = $(".functionContentContainer").position().left;
  73. contentY = $(".functionContentContainer").position().top;
  74. for (var i = 0; i < popupNames.length; i++) {
  75. var popupElem = $("#" + popupNames[i] + "-Popup_PW-1");
  76. var headerElem = $("#" + popupNames[i] + "-Popup_PW-1 > .dxpc-mainDiv > .dxpc-header");
  77. var contentWrapper = $("#" + popupNames[i] + "-Popup_PW-1 .dxpc-contentWrapper");
  78. var content = $("#" + popupNames[i] + "-Popup_PW-1 .dxpc-content");
  79. popupElem.draggable({
  80. containment: $(".functionContentContainer"),
  81. handle: headerElem
  82. });
  83. popupElem.resizable({
  84. containment: $(".functionContentContainer"),
  85. alsoResize: [contentWrapper, content]
  86. });
  87. popupElem.on("dragstop", function (e, s) {
  88. var controls = ASPxClientControl.GetControlCollection();
  89. var popupName = e.currentTarget.id.replace("_PW-1", "");
  90. var functionName = e.currentTarget.id.replace("-Popup_PW-1", "");
  91. var popupElement = controls.GetByName(popupName);
  92. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  93. var popupPositionX = $(this).position().left;
  94. var popupPositionY = $(this).position().top;
  95. popupLocationsX[functionName] = popupPositionX;
  96. popupLocationsY[functionName] = popupPositionY;
  97. });
  98. popupElem.on("resizestop", function (e, s) {
  99. var controls = ASPxClientControl.GetControlCollection();
  100. var popupName = e.currentTarget.id.replace("_PW-1", "");
  101. var functionName = e.currentTarget.id.replace("-Popup_PW-1", "");
  102. var popupElement = controls.GetByName(popupName);
  103. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  104. var popupWidth = $(this).width();
  105. var popupHeight = $(this).height();
  106. popupWidths[functionName] = popupWidth;
  107. popupHeights[functionName] = popupHeight;
  108. popupControl.SetWidth(popupWidth);
  109. popupControl.SetHeight(popupHeight);
  110. });
  111. }
  112. })
  113. function toggleFullscreenFunction(popupName, imgElem) {
  114. var popupElem = $("#" + popupName + "-Popup_PW-1");
  115. var controls = ASPxClientControl.GetControlCollection();
  116. var popupElementName = popupName + "-Popup";
  117. var popupElement = controls.GetByName(popupElementName);
  118. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  119. if (isFullscreen) {
  120. if (isFullscreenMaximized) {
  121. popupElem.resizable({
  122. disable: true,
  123. containment: $(".functionContentContainer"),
  124. });
  125. } else {
  126. popupControl.ShowAtPos(popupLocationsX[popupName], popupLocationsY[popupName]);
  127. popupControl.SetWidth(popupWidths[popupName]);
  128. popupControl.SetHeight(popupHeights[popupName]);
  129. popupStatus[popupName] = "normalized";
  130. popupContentElem.addClass("dxpc-shadow");
  131. popupHeaderElem.addClass("devExAllowDrag");
  132. popupElem.draggable("enable");
  133. popupElem.resizable("enable");
  134. }
  135. isFullscreen = false;
  136. $(imgElem).attr("src", '@Url.Content("~/Content/Images/fullScreen-16.png")');
  137. popupControl.ShowAtPos(fullscreenLastX, fullscreenLastY);
  138. popupControl.SetWidth(fullscreenLastWidth);
  139. popupControl.SetHeight(fullscreenLastHeight);
  140. } else {
  141. fullscreenLastX = popupElem.position().left;
  142. fullscreenLastY = popupElem.position().top;
  143. fullscreenLastWidth = popupControl.GetWidth();
  144. fullscreenLastHeight = popupControl.GetHeight();
  145. if (popupStatus[popupName] == "maximized") {
  146. isFullscreenMaximized = true;
  147. } else {
  148. isFullscreenMaximized = false;
  149. popupStatus[popupName] = "maximized";
  150. popupContentElem.removeClass("dxpc-shadow");
  151. popupHeaderElem.removeClass("devExAllowDrag");
  152. popupElem.draggable("disable");
  153. }
  154. popupControl.ShowAtPos(0, 0);
  155. popupControl.SetWidth($(window).width());
  156. popupControl.SetHeight($(window).height());
  157. popupElem.resizable({
  158. disable: true,
  159. containment: "window"
  160. });
  161. isFullscreen = true;
  162. $(imgElem).attr("src", '@Url.Content("~/Content/Images/normalize-16.png")');
  163. }
  164. }
  165. function checkPopupItemSizes() {
  166. var originalWidth = 0;
  167. $('.popupPanelItem').each(function () {
  168. if ($(this).attr('data-origwidth') !== undefined) {
  169. originalWidth += parseInt($(this).attr('data-origwidth'));
  170. }
  171. });
  172. var footerWidth = $('.globalFooter').width();
  173. if (originalWidth > (footerWidth * 1.05)) {
  174. $('.popupPanelItem').each(function () {
  175. $(this).children('span').text('');
  176. });
  177. } else if (originalWidth > (footerWidth * 0.9)) {
  178. $('.popupPanelItem').each(function () {
  179. $(this).children('span').text($(this).attr('title').substr(0, 4) + '...');
  180. });
  181. } else if (originalWidth > (footerWidth * 0.65)) {
  182. $('.popupPanelItem').each(function () {
  183. $(this).children('span').text($(this).attr('title').substr(0, 6) + '...');
  184. });
  185. } else {
  186. $('.popupPanelItem').each(function () {
  187. $(this).children('span').text($(this).attr('title'));
  188. });
  189. }
  190. }
  191. function showFunction(e, parameters) {
  192. if (!e) return;
  193. var controls = ASPxClientControl.GetControlCollection();
  194. var popupName = e.item.name + "-Popup";
  195. var popupElement = controls.GetByName(popupName);
  196. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  197. if (popupControl.IsVisible()) {
  198. popupControl.BringToFront();
  199. return;
  200. }
  201. if (popupMinimized[e.item.name] == true) {
  202. popupControl.Show();
  203. $("#" + e.item.name + "-PanelItem").fadeTo(500, 1);
  204. } else if (!popupStatus[e.item.name] || popupStatus[e.item.name] == "closed") {
  205. if (popupWidths[e.item.name] && popupHeights[e.item.name]) {
  206. popupControl.SetWidth(popupWidths[e.item.name]);
  207. popupControl.SetHeight(popupHeights[e.item.name]);
  208. } else if (popupMaxOnStartup[e.item.name] && popupMaxOnStartup[e.item.name] == true) {
  209. var popupElem = $("#" + popupName + "_PW-1");
  210. var popupContentElem = $("#" + popupName + "_PW-1 > .dxpc-mainDiv");
  211. var popupHeaderElem = $("#" + popupName + "_PW-1 > .dxpc-mainDiv > .dxpc-header");
  212. openOffsetX = 0;
  213. openOffsetY = 0;
  214. popupControl.SetWidth($(".functionContentContainer").width());
  215. popupControl.SetHeight($(".functionContentContainer").height() - 1);
  216. popupContentElem.removeClass("dxpc-shadow");
  217. popupHeaderElem.removeClass("devExAllowDrag");
  218. popupElem.draggable("disable");
  219. popupElem.resizable("disable");
  220. popupWidths[e.item.name] = ($(".functionContentContainer").width() * 0.8);
  221. popupHeights[e.item.name] = ($(".functionContentContainer").height() * 0.8);
  222. }
  223. if (!parameters) {
  224. popupControl.SetContentUrl(popupUrls[e.item.name]);
  225. } else {
  226. popupControl.SetContentUrl(popupUrls[e.item.name] + parameters);
  227. }
  228. popupControl.ShowAtPos(contentX + openOffsetX, contentY + openOffsetY);
  229. popupLocationsX[e.item.name] = contentX + openOffsetX;
  230. popupLocationsY[e.item.name] = contentY + openOffsetY;
  231. openOffsetX += 50;
  232. openOffsetY += 25;
  233. var popupPanel = $(
  234. '<div id="' + e.item.name + '-PanelItem" class="popupPanelItem" title="' + popupDescriptions[e.item.name] + '" onclick=\'normalizeFunction("' + e.item.name + '")\'>' +
  235. '<img src="' + popupImages[e.item.name] + '" />' +
  236. '<span>' + popupDescriptions[e.item.name] + '</span>' +
  237. '<img src="@Url.Content("~/Content/Images/close-16.png")" onclick=\'hideFunction("' + e.item.name + '", false)\' />' +
  238. '</div>')
  239. .hide()
  240. .appendTo(".popupPanel")
  241. .fadeIn(500, function () {
  242. $(this).attr("data-origwidth", $(this).outerWidth(true));
  243. checkPopupItemSizes();
  244. });
  245. }
  246. if (popupMaxOnStartup[e.item.name] && popupMaxOnStartup[e.item.name] == true) {
  247. popupStatus[e.item.name] = "maximized";
  248. } else {
  249. popupStatus[e.item.name] = "normalized";
  250. popupControl.BringToFront();
  251. }
  252. }
  253. function normalizeFunction(popupName) {
  254. var controls = ASPxClientControl.GetControlCollection();
  255. var popupElementName = popupName + "-Popup";
  256. var popupElement = controls.GetByName(popupElementName);
  257. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  258. if (popupStatus[popupName] == "maximized") {
  259. popupControl.Show();
  260. } else {
  261. popupControl.ShowAtPos(popupLocationsX[popupName], popupLocationsY[popupName]);
  262. popupStatus[popupName] = "normalized";
  263. }
  264. popupMinimized[popupName] = false;
  265. $("#" + popupName + "-PanelItem").fadeTo(500, 1);
  266. }
  267. function toggleMaximizeFunction(popupName) {
  268. var controls = ASPxClientControl.GetControlCollection();
  269. var popupElementName = popupName + "-Popup";
  270. var popupElement = controls.GetByName(popupElementName);
  271. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  272. var popupElem = $("#" + popupElementName + "_PW-1");
  273. var popupContentElem = $("#" + popupElementName + "_PW-1 > .dxpc-mainDiv");
  274. var popupHeaderElem = $("#" + popupElementName + "_PW-1 > .dxpc-mainDiv > .dxpc-header");
  275. if (popupStatus[popupName] && popupStatus[popupName] == "minimized") {
  276. popupControl.Show();
  277. } else if (popupStatus[popupName] && popupStatus[popupName] == "normalized") {
  278. popupWidths[popupName] = popupControl.GetWidth();
  279. popupHeights[popupName] = popupControl.GetHeight();
  280. popupControl.ShowAtPos(contentX, contentY);
  281. popupControl.SetWidth($(".functionContentContainer").width());
  282. popupControl.SetHeight($(".functionContentContainer").height() - 1);
  283. popupStatus[popupName] = "maximized";
  284. popupContentElem.removeClass("dxpc-shadow");
  285. popupHeaderElem.removeClass("devExAllowDrag");
  286. popupElem.draggable("disable");
  287. popupElem.resizable("disable");
  288. isFullscreen = false;
  289. } else if (popupStatus[popupName] && popupStatus[popupName] == "maximized") {
  290. popupControl.ShowAtPos(popupLocationsX[popupName], popupLocationsY[popupName]);
  291. popupControl.SetWidth(popupWidths[popupName]);
  292. popupControl.SetHeight(popupHeights[popupName]);
  293. popupStatus[popupName] = "normalized";
  294. popupContentElem.addClass("dxpc-shadow");
  295. popupHeaderElem.addClass("devExAllowDrag");
  296. popupElem.draggable("enable");
  297. popupElem.resizable("enable");
  298. // Prevent growing of function container so it breaks below navigation container
  299. $(".functionContentContainer").width($(".functionContentContainer").width() - 50);
  300. $(".functionContentContainer").width($(".functionContentContainer").width() + 50);
  301. isFullscreen = false;
  302. }
  303. }
  304. function hideFunction(popupName, minimize) {
  305. var controls = ASPxClientControl.GetControlCollection();
  306. var popupElementName = popupName + "-Popup";
  307. var popupElement = controls.GetByName(popupElementName);
  308. var popupControl = MVCxClientPopupControl.Cast(popupElement);
  309. var popupContentElem = $("#" + popupElementName + "_PW-1 > .dxpc-mainDiv");
  310. popupControl.Hide();
  311. if (minimize == true) {
  312. if (popupStatus[popupName] == "maximized") {
  313. popupLocationsX[popupName] = contentX;
  314. popupLocationsY[popupName] = contentY;
  315. }
  316. popupMinimized[popupName] = true;
  317. $("#" + popupName + "-PanelItem").fadeTo(500, 0.6);
  318. } else {
  319. if (popupMinimized[popupName] == true) {
  320. popupMinimized[popupName] = false;
  321. }
  322. popupStatus[popupName] = "closed";
  323. popupContentElem.addClass("dxpc-shadow");
  324. popupContentElem.addClass("devExAllowDrag");
  325. var iframe = popupControl.GetWindowContentIFrame();
  326. iframe.contentWindow.document.open();
  327. iframe.contentWindow.document.write("");
  328. iframe.contentWindow.document.close();
  329. $("#" + popupName + "-PanelItem").fadeOut(500, function () {
  330. $(this).remove();
  331. checkPopupItemSizes();
  332. });
  333. }
  334. event.stopPropagation();
  335. }
  336. function customizeExportToolbar(baseName) {
  337. var controls = ASPxClientControl.GetControlCollection();
  338. var formatComboBox = ASPxClientComboBox.Cast(controls.GetByName(baseName + "_Splitter_Toolbar_Menu_ITCNT11_SaveFormat"));
  339. var excludedFormats = [ "png", "csv", "txt", "html", "mht", "docx", "rtf" ]
  340. var allItems = formatComboBox.GetItemCount();
  341. for (var i = 0; i < allItems; i++) {
  342. var item = formatComboBox.GetItem(i);
  343. }
  344. for (var i = 0; i < excludedFormats.length; i++) {
  345. var item = formatComboBox.FindItemByValue(excludedFormats[i]);
  346. if (!item) continue;
  347. formatComboBox.RemoveItem(item.index);
  348. }
  349. formatComboBox.SelectedIndexChanged.AddHandler(function (s, e) {
  350. exportFormat = s.GetValue();
  351. });
  352. exportFormat = "pdf";
  353. }
  354. </script>
  355. @foreach (var g in Model.AvailableFunctions)
  356. {
  357. foreach (var i in g.Value)
  358. {
  359. if (Url.RouteCollection[i.RouteName] != null)
  360. {
  361. Html.DevExpress().PopupControl(s =>
  362. {
  363. s.Name = i.Name + "-Popup";
  364. s.HeaderText = i.Description;
  365. s.SetHeaderTemplateContent(
  366. "<div class=\"functionHeader\">" +
  367. "<img class=\"headerIcon\" src=\"" + Url.Content(i.ImageUrl) + "\" />" +
  368. "<span class=\"headerText\">" + i.Description + "</span>" +
  369. "<div class=\"controlContainer\">" +
  370. "<img class=\"controlIcon\" src=\"" +
  371. Url.Content("~/Content/Images/minimize-16.png") + "\" onclick=\"hideFunction('" + i.Name + "',true);\" />" +
  372. "<img class=\"controlIcon\" src=\"" +
  373. Url.Content("~/Content/Images/maximize-16.png") + "\" onclick=\"toggleMaximizeFunction('" + i.Name + "');\" />" +
  374. "<img class=\"controlIcon\" src=\"" +
  375. Url.Content("~/Content/Images/fullScreen-16.png") + "\" onclick=\"toggleFullscreenFunction('" + i.Name + "',this);\" />" +
  376. "<img class=\"controlIcon\" src=\"" +
  377. Url.Content("~/Content/Images/close-16.png") + "\" onclick=\"hideFunction('" + i.Name + "',false);\" />" +
  378. "</div>" +
  379. "</div>");
  380. s.ContentUrl = Url.RouteUrl(i.RouteName);
  381. s.Modal = false;
  382. s.ShowMaximizeButton = (i.AllowMaximize.HasValue && i.AllowMaximize.Value) ? true : false;
  383. s.Width = new Unit(i.BaseWidth.Value, UnitType.Pixel);
  384. s.Height = new Unit(i.BaseHeight.Value, UnitType.Pixel);
  385. s.MinWidth = new Unit(i.MinWidth.Value, UnitType.Pixel);
  386. s.MinHeight = new Unit(i.MinHeight.Value, UnitType.Pixel);
  387. s.CloseAction = CloseAction.None;
  388. s.AllowDragging = false;
  389. s.Styles.Header.CssClass += "devExAllowDrag";
  390. }).GetHtml();
  391. }
  392. }
  393. }
  394. <table class="homeContainer">
  395. <tbody>
  396. <tr>
  397. <td class="functionNavigationContainer">
  398. @Html.DevExpress().NavBar(s =>
  399. {
  400. s.Name = "devNavBarFunctions";
  401. s.Width = new Unit(100, UnitType.Percentage);
  402. s.ClientSideEvents.ItemClick = "function (s, e) { showFunction(e); }";
  403. s.Styles.Item.Cursor = "pointer";
  404. s.ControlStyle.Border.BorderStyle = BorderStyle.None;
  405. s.Styles.GroupHeader.Border.BorderStyle = BorderStyle.None;
  406. s.Styles.GroupHeader.CssClass += "devExBorderBottom devExBorderBottomGray devExBorderBottomSmall";
  407. s.Styles.GroupContent.Border.BorderStyle = BorderStyle.None;
  408. s.Styles.GroupContent.CssClass += "devExBorderBottom devExBorderBottomGray devExBorderBottomSmall";
  409. s.Styles.GroupContent.ForeColor = System.Drawing.Color.FromArgb(250, 250, 250);
  410. s.Styles.Item.Border.BorderStyle = BorderStyle.None;
  411. s.Styles.Item.CssClass += "devExBorderBottom";
  412. foreach (var g in Model.AvailableFunctions)
  413. {
  414. var hasFunctions =
  415. g.Value
  416. .Any(i => Url.RouteCollection[i.RouteName] != null);
  417. if (!hasFunctions) continue;
  418. s.Groups.Add(n1 =>
  419. {
  420. n1.Name = g.Key.Name;
  421. n1.Text = g.Key.Description;
  422. n1.ItemImagePosition = ImagePosition.Top;
  423. foreach (var i in g.Value)
  424. {
  425. if (Url.RouteCollection[i.RouteName] != null)
  426. {
  427. n1.Items.Add(n2 =>
  428. {
  429. n2.Name = i.Name;
  430. n2.Text = i.Description;
  431. n2.Image.Url = i.ImageUrl;
  432. n2.Image.UrlHottracked = GreenTree.Nachtragsmanagement.Core.StaticHelper.AddSuffix(i.ImageUrl, "-contrast", true);
  433. });
  434. }
  435. }
  436. });
  437. }
  438. }).GetHtml()
  439. </td>
  440. <td class="functionContentContainer">
  441. </td>
  442. </tr>
  443. </tbody>
  444. </table>