Files
BeWoPlaner/BeWoPlanerMobil/Util/HtmlHelperExtensions.cs
Lyndon 8ae75cfc77 Personenmodul hinzugefügt - schreibgeschützt
Mitarbeitermodul mit Abwesenheiten hinzugefügt
Einbau des Dokumententeils vereinfacht.
2026-02-04 18:03:01 +01:00

446 lines
17 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using BeWoPlanerMobil.Models;
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<T>(this HtmlHelper htmlHelper, List<T> 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;
case nameof(CompactPersonDC):
buttonColor = "btn-bewo-person";
buttonOutlineColor = "btn-outline-bewo-person";
prependText = "Person";
modalTitleText = "Personenauswahl";
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 = "&times;" };
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<string, bool> dictionary, string id)
{
if(dictionary is null || false == dictionary.ContainsKey(id))
{
return string.Empty;
}
return dictionary[id] ? "show" : string.Empty;
}
public static string GetCollapsibleChevron(this HtmlHelper htmlHelper, AbstractModel model, string id)
{
model.Collapsibles2IsShown.TryGetValue(id, out var isShown);
return isShown ? "fa-chevron-up" : "fa-chevron-down";
}
public static IHtmlString BootstrapCheckbox(this HtmlHelper htmlHelper, string id, string labelText, bool isChecked = false, string title = null, string onChangeEvent = null)
{
var containerDiv = new TagBuilder("div");
containerDiv.AddCssClass("custom-checkbox");
containerDiv.AddCssClass("custom-control");
var input = new TagBuilder("input");
input.AddCssClass("custom-control-input");
input.MergeAttribute("type", "checkbox");
input.MergeAttribute("id", id);
if(isChecked)
{
input.MergeAttribute("checked", "true");
}
if(false == string.IsNullOrWhiteSpace(onChangeEvent))
{
input.MergeAttribute("onchange", onChangeEvent);
}
var label = new TagBuilder("label");
label.AddCssClass("custom-control-label");
label.MergeAttribute("for", id);
label.InnerHtml = labelText;
if(false == string.IsNullOrWhiteSpace(title))
{
containerDiv.MergeAttribute("title", title);
}
containerDiv.AppendInnerHtml(input);
containerDiv.AppendInnerHtml(label);
return MvcHtmlString.Create(containerDiv.ToString());
}
public static IHtmlString BootstrapNumberInput(this HtmlHelper htmlHelper, string id, string labelText, int value, string min, string max, string step, string additionalContainerCssClasses = null, string title = null, string onChangeEvent = null, BootstrapInputGroupSize size = BootstrapInputGroupSize.Default)
{
var containerDiv = new TagBuilder("div");
containerDiv.AddCssClass("input-group");
if(false == string.IsNullOrWhiteSpace(additionalContainerCssClasses))
{
containerDiv.AddCssClass(additionalContainerCssClasses);
}
if(false == string.IsNullOrWhiteSpace(title))
{
containerDiv.MergeAttribute("title", title);
}
var prepend = new TagBuilder("div");
prepend.AddCssClass("input-group-prepend");
var inputGroupText = new TagBuilder("div");
inputGroupText.AddCssClass("input-group-text");
inputGroupText.InnerHtml = labelText;
var input = new TagBuilder("input");
input.AddCssClass("form-control");
input.MergeAttribute("type", "number");
input.MergeAttribute("min", min);
input.MergeAttribute("step", step);
input.MergeAttribute("id", id);
input.MergeAttribute("value", value.ToString());
if(false == string.IsNullOrWhiteSpace(onChangeEvent))
{
input.MergeAttribute("onchange", onChangeEvent);
}
prepend.AppendInnerHtml(inputGroupText);
containerDiv.AppendInnerHtml(prepend);
containerDiv.AppendInnerHtml(input);
return MvcHtmlString.Create(containerDiv.ToString());
}
public static IHtmlString BootstrapSelect(this HtmlHelper htmlHelper, string id, string labelText, string selectedValue, Dictionary<string, string> value2Text, string onChangeEvent = null)
{
var containerDiv = new TagBuilder("div");
containerDiv.AddCssClass("input-group");
var label = new TagBuilder("label");
label.AddCssClass("input-group-text");
label.MergeAttribute("for", id);
label.InnerHtml = labelText;
var prepend = new TagBuilder("div");
prepend.AddCssClass("input-group-prepend");
prepend.AppendInnerHtml(label);
var select = new TagBuilder("select");
select.AddCssClass("custom-select");
foreach(var val2Text in value2Text)
{
var option = new TagBuilder("option");
option.MergeAttribute("value", val2Text.Key);
option.InnerHtml = val2Text.Value;
if(val2Text.Key.Equals(selectedValue))
{
option.MergeAttribute("selected", "selected");
}
select.AppendInnerHtml(option);
}
if(false == string.IsNullOrWhiteSpace(onChangeEvent))
{
select.MergeAttribute("onchange", onChangeEvent);
}
containerDiv.AppendInnerHtml(prepend);
containerDiv.AppendInnerHtml(select);
return MvcHtmlString.Create(containerDiv.ToString());
}
}
public enum BootstrapInputGroupSize
{
Small,
Default,
Large
}
}