Intervallfinder überarbeitet & Bug gefixt, der zu einem Fehler beim Suchen nach freien Intervallen über mehrere Tage geführt hatte, wenn die Enduhrzeit vor der Startuhrzeit lag. Berichte mit Parametern. Verbesserte Mitarbeiter-, Klienten-, Team-, und Organisationsdropdowns mit Suche. Quittierungsbelegresultate (zum Unterschreiben) wird wie die Zeiterfassung paginiert. FaC: neuer Kalender noch nicht fertig.
290 lines
12 KiB
C#
290 lines
12 KiB
C#
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<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;
|
|
}
|
|
|
|
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 };
|
|
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.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());
|
|
}
|
|
}
|
|
} |