Mitarbeitermodul mit Abwesenheiten hinzugefügt Einbau des Dokumententeils vereinfacht.
446 lines
17 KiB
C#
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 = "×" };
|
|
|
|
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
|
|
}
|
|
} |