using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using BeWoPlanerMobil.Util.MoKExtensions; using BS.Shared.DataContracts.ClientPartials; using BS.Shared.DataContracts.Compact; namespace BeWoPlanerMobil.Util { public static class HtmlHelperExtensions { public static bool IsInDebugMode(this HtmlHelper htmlHelper) { #if DEBUG return true; #else return false; #endif } public static IHtmlString PopupWithSearchForIFilterables(this HtmlHelper htmlHelper, List entities, string itemOnClickMethodName, string itemOnClickParameterString, string selectedItemText, string modalId, bool isButtonPrimaryColor = true, bool hasPrependInputGroupText = true, bool hasPrepend = true, bool hasDeleteSelectionButton = false) where T : IMoKSearchableDC { if(string.IsNullOrWhiteSpace(modalId)) { modalId = $"{Guid.NewGuid()}-modal-popup"; } var buttonColor = "btn-primary"; var buttonOutlineColor = "btn-outline-primary"; var prependText = string.Empty; var modalTitleText = "Auswahl"; if(selectedItemText is null) { selectedItemText = string.Empty; } switch(entities.GetType().GetGenericArguments().Single().Name) { case nameof(CompactCustomerDC): buttonColor = "btn-bewo-customers"; buttonOutlineColor = "btn-outline-bewo-customers"; prependText = "Klient"; modalTitleText = "Klientenauswahl"; break; case nameof(CompactEmployeeDC): buttonColor = "btn-bewo-employee"; buttonOutlineColor = "btn-outline-bewo-employee"; prependText = "Mitarbeiter"; modalTitleText = "Mitarbeiterauswahl"; break; case nameof(CompactOrganisationDC): buttonColor = "btn-bewo-organisation"; buttonOutlineColor = "btn-outline-bewo-organisation"; prependText = "Organisation"; modalTitleText = "Organisationsauswahl"; break; case nameof(CompactTeamDC): buttonColor = "btn-bewo-teams"; buttonOutlineColor = "btn-outline-bewo-teams"; prependText = "Team"; modalTitleText = "Teamauswahl"; break; } if(isButtonPrimaryColor) { buttonColor = "btn-primary"; } var containerDiv = new TagBuilder("div"); var modalToggleButton = new TagBuilder("button"); modalToggleButton.AddCssClass("dropdown-toggle"); if(hasDeleteSelectionButton) { modalToggleButton.AddCssClass(hasPrepend ? "entity-popup-open-button" : "btn-group-dropdown-toggle"); } else { modalToggleButton.AddCssClass("white-space-normal"); modalToggleButton.AddCssClass("text-truncate"); modalToggleButton.AddCssClass("w-100"); } modalToggleButton.AddCssClass(buttonColor); modalToggleButton.AddCssClass("btn"); modalToggleButton.MergeAttribute("type", "button"); modalToggleButton.MergeAttribute("data-toggle", "modal"); modalToggleButton.MergeAttribute("data-target", $"#{modalId}"); modalToggleButton.InnerHtml = selectedItemText; if(hasPrepend) { var inputGroup = new TagBuilder("div"); inputGroup.AddCssClass("input-group"); var prepend = new TagBuilder("div"); prepend.AddCssClass("input-group-prepend"); var inputGroupText = new TagBuilder("span") { InnerHtml = prependText }; if(hasPrependInputGroupText) { inputGroupText.AddCssClass("prepend-input-group-text"); } inputGroupText.AddCssClass("input-group-text"); var append = new TagBuilder("div"); append.AddCssClass(hasDeleteSelectionButton ? "cancel-selection-btn-container" : "dropdown-append"); append.AddCssClass("input-group-append"); if(hasDeleteSelectionButton) { modalToggleButton.AddCssClass("rounded-0"); var xButton = new TagBuilder("button"); xButton.AddCssClass("w-100"); xButton.AddCssClass(buttonOutlineColor); xButton.AddCssClass("btn"); xButton.MergeAttribute("type", "button"); xButton.MergeAttribute("onclick", $"{itemOnClickMethodName}(this, null, {itemOnClickParameterString})"); var xButtonSpan = new TagBuilder("span"); xButtonSpan.AddCssClass("fa-times-circle"); xButtonSpan.AddCssClass("fas"); xButton.AppendInnerHtml(xButtonSpan); append.AppendInnerHtml(xButton); } else { append.AppendInnerHtml(modalToggleButton); } prepend.AppendInnerHtml(inputGroupText); inputGroup.AppendInnerHtml(prepend); if(hasDeleteSelectionButton) { inputGroup.AppendInnerHtml(modalToggleButton); } inputGroup.AppendInnerHtml(append); containerDiv.AppendInnerHtml(inputGroup); } else { if(hasDeleteSelectionButton) { var btnGroup = new TagBuilder("div"); btnGroup.AddCssClass("w-100"); btnGroup.AddCssClass("d-flex"); btnGroup.AddCssClass("btn-group"); btnGroup.MergeAttribute("role", "group"); btnGroup.AppendInnerHtml(modalToggleButton); var cancelSelectionButton = new TagBuilder("button"); cancelSelectionButton.AddCssClass("cancel-selection-btn-container"); cancelSelectionButton.AddCssClass(buttonOutlineColor); cancelSelectionButton.AddCssClass("btn"); cancelSelectionButton.MergeAttribute("type", "button"); var cancelSelectionButtonSpan = new TagBuilder("span"); cancelSelectionButtonSpan.AddCssClass("fa-times-circle"); cancelSelectionButtonSpan.AddCssClass("fas"); btnGroup.AppendInnerHtml(cancelSelectionButtonSpan); } else { containerDiv.AppendInnerHtml(modalToggleButton); } } var modalDiv = new TagBuilder("div"); modalDiv.AddCssClass("modal"); modalDiv.MergeAttribute("id", modalId); modalDiv.MergeAttribute("role", "dialog"); modalDiv.MergeAttribute("tabindex", "-1"); var modalDialog = new TagBuilder("div"); modalDialog.AddCssClass("modal-dialog-scrollable"); modalDialog.AddCssClass("modal-dialog"); modalDialog.MergeAttribute("role", "document"); var modalContent = new TagBuilder("div"); modalContent.AddCssClass("modal-content"); var modalHeader = new TagBuilder("div"); modalHeader.AddCssClass("modal-header"); var modalTitle = new TagBuilder("h5"); modalTitle.AddCssClass("font-weight-bold"); modalTitle.AddCssClass("modal-title"); modalTitle.InnerHtml = modalTitleText; var closeButton = new TagBuilder("button"); closeButton.AddCssClass("close"); closeButton.MergeAttribute("type", "button"); closeButton.MergeAttribute("data-dismiss", "modal"); closeButton.MergeAttribute("onclick", "resetEntitySearch($(this).parent().siblings('.modal-body').children('.input-group').find('.btn-outline-secondary'))"); var closeButtonSpan = new TagBuilder("span") { InnerHtml = "×" }; closeButton.InnerHtml = closeButtonSpan.ToString(); modalHeader.AppendInnerHtml(modalTitle); modalHeader.AppendInnerHtml(closeButton); modalContent.AppendInnerHtml(modalHeader); var modalBody = new TagBuilder("div"); modalBody.AddCssClass("modal-body"); var modalInputGroup = new TagBuilder("div"); modalInputGroup.AddCssClass("input-group"); var searchInput = new TagBuilder("input"); searchInput.MergeAttribute("autocomplete", "on"); searchInput.AddCssClass("form-control"); searchInput.MergeAttribute("oninput", "onEntitySearchInput(this)"); searchInput.MergeAttribute("placeholder", "Suchen..."); searchInput.MergeAttribute("type", "text"); var modalInputGroupAppend = new TagBuilder("div"); modalInputGroupAppend.AddCssClass("input-group-append"); var resetSearchButton = new TagBuilder("button"); resetSearchButton.AddCssClass("btn-outline-secondary"); resetSearchButton.AddCssClass("btn"); resetSearchButton.MergeAttribute("onclick", "resetEntitySearch($(this))"); var resetSearchButtonSpan = new TagBuilder("span"); resetSearchButtonSpan.AddCssClass("fa-times-circle"); resetSearchButtonSpan.AddCssClass("fas"); resetSearchButton.AppendInnerHtml(resetSearchButtonSpan); modalInputGroupAppend.AppendInnerHtml(resetSearchButton); modalInputGroup.AppendInnerHtml(searchInput); modalInputGroup.AppendInnerHtml(modalInputGroupAppend); modalBody.AppendInnerHtml(modalInputGroup); var hr = new TagBuilder("hr"); modalBody.AppendInnerHtml(hr); var listGroup = new TagBuilder("list-group"); listGroup.AddCssClass("list-group"); foreach(var entity in entities.OrderBy(e => e.ToString())) { var a = new TagBuilder("a"); a.AddCssClass("text-body"); a.AddCssClass("text-truncate"); a.AddCssClass("cursor-pointer"); a.AddCssClass("no-underline"); a.AddCssClass("list-group-item"); if(false == string.IsNullOrWhiteSpace(itemOnClickMethodName)) { var parameters = string.IsNullOrWhiteSpace(itemOnClickParameterString) ? string.Empty : $", {itemOnClickParameterString}"; a.MergeAttribute("onclick", $"{itemOnClickMethodName}(this, {entity.EntityOid}{parameters});resetEntitySearch($(this).parent().parent().children('.input-group').find('.btn-outline-secondary'));"); } a.MergeAttribute("id", $"{Guid.NewGuid()}_{entity.EntityOid}"); a.MergeAttribute("href", "#"); a.InnerHtml = entity.ToString(); listGroup.AppendInnerHtml(a); } modalBody.AppendInnerHtml(listGroup); modalContent.AppendInnerHtml(modalBody); modalDialog.AppendInnerHtml(modalContent); modalDiv.AppendInnerHtml(modalDialog); containerDiv.AppendInnerHtml(modalDiv); return MvcHtmlString.Create(containerDiv.ToString()); } public static string GetCollapsibleClass(this HtmlHelper htmlHelper, Dictionary dictionary, string id) { if(dictionary is null || false == dictionary.ContainsKey(id)) { return string.Empty; } return dictionary[id] ? "show" : string.Empty; } } }