Bugfixes im Kalendermodul des MoK

This commit is contained in:
2023-02-09 15:17:33 +01:00
parent 0088a2b510
commit c4aaeaf45c
14 changed files with 253 additions and 186 deletions

View File

@@ -153,13 +153,10 @@ namespace BeWo.ownChat
stringBuilder.Append($"{m.SendTime:dd.MM.yyyy HH:mm} - {m.Username}: {m.UserMessage}");
}
var utf8 = Encoding.UTF8;
var encodedBytes = utf8.GetBytes(stringBuilder.ToString());
var convertedBytes = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, encodedBytes);
var ascii = Encoding.ASCII;
var finalString = stringBuilder.ToString();
finalString = finalString.Replace("ẞ", "ß");
var finalString = ascii.GetString(convertedBytes);
var firstTime = messages.Min(r =>
{
var dt = r.SendTime;

View File

@@ -49,7 +49,7 @@ namespace BeWoPlanerMobil.Controllers
[Authorize]
public ActionResult Report()
{
if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || !AbstractModel.IsAllowedToSeeScheduler)
if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer"))
{
return Logout();
}
@@ -71,7 +71,7 @@ namespace BeWoPlanerMobil.Controllers
{
try
{
if (!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || !AbstractModel.IsAllowedToSeeScheduler)
if (!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer"))
{
return Logout();
}

View File

@@ -878,6 +878,7 @@ namespace BeWoPlanerMobil.Controllers
if(long.TryParse(teamOidString, out var teamOid))
{
var team = EmployeeService.FindTeamByOid(teamOid, Model.Employee.EmployeeOid.Value);
if(!(team is null))
{
Model.SelectedEmployeesForFiltering.AddRangeIfElementsNotIn(team.Member);
@@ -981,5 +982,29 @@ namespace BeWoPlanerMobil.Controllers
return _LeerzeichenFuerGetMethoden;
}
[Authorize]
public string SelectTeamForIntervalFinder(string teamOidString)
{
if(Model?.Employee?.EmployeeOid is null)
{
Logout();
return _LeerzeichenFuerGetMethoden;
}
if(long.TryParse(teamOidString, out var teamOid))
{
var team = EmployeeService.FindTeamByOid(teamOid, Model.Employee.EmployeeOid.Value);
if(!(team is null))
{
var memberOids = team.Member.Select(member => member.EmployeeOid).ToList();
return JsonConvert.SerializeObject(memberOids);
}
}
return _LeerzeichenFuerGetMethoden;
}
}
}

View File

@@ -10,15 +10,14 @@ function getDateFromPicker(pickerId) {
try {
var picker = $("#" + pickerId);
if (picker.length > 0) {
if(picker.length > 0) {
picker.datetimepicker("show");
picker.datetimepicker("hide");
var unixTime = picker.datetimepicker("date");
var targetDate = new Date(unixTime);
if (isValidDate(targetDate)) {
logError(dateToShortDateString(targetDate));
if(isValidDate(targetDate)) {
return targetDate;
}
}
@@ -62,6 +61,8 @@ function getTimeFromPicker(pickerId) {
function dateToShortDateString(date) {
try {
logInfo2("Konvertiere Datum zu kurzem Datum: " + date);
if (isValidDate(date)) {
var ddNum = date.getDate();
var mmNum = date.getMonth();
@@ -90,7 +91,7 @@ function dateToShortDateString(date) {
return dd + "." + mm + "." + yyyy;
}
} catch (error) {
logError(error.message);
logError("Fehler in dateToShortDateString:" + error.message);
}
}
@@ -114,6 +115,7 @@ function mergeDateAndTime(date, time) {
}
}
// ToDo: Löst Exception aus bei einem Wert von z.B. "06.02.2023".
function isValidDate(date) {
return Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}

View File

@@ -1,54 +1,34 @@
// Wird aufgerufen, wenn sich der Wert der CheckBox ändert.
function changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids) {
function changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) {
try {
if (url === undefined || url === null) {
if(url === undefined || url === null) {
logError("url ist undefined oder null");
return;
}
var oidStr = "";
var oids = [];
var allChecked = true;
$("#" + popupId + " input[type=checkbox]").each(function () {
var id = $(this).attr("id").split("-")[1];
if($.isNumeric(id) === false) {
return;
}
if ($(this).prop("checked")) {
oids.push(id);
oidStr += id + ",";
} else {
allChecked = false;
}
});
var selectedItemOids = $("#" + popupId + " .popup-list-item-container input:checked").map(function () { return $(this).attr("id").split("-")[1]; }).get();
var allItemOids = $("#" + popupId + " .popup-list-item-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get();
if(!isCustomer) {
$("#my-teams-checkbox" + allItemsCheckBoxSuffix).prop("checked", arrayContainsAllItems(oids, teamMemberOids));
$("#my-teams-checkbox" + allItemsCheckBoxSuffix).prop("checked", arrayContainsAllItems(selectedItemOids, teamMemberOids));
}
if (allChecked === true) {
$("#all-" + (isCustomer ? "customers" : "employees") + "-checkbox" + allItemsCheckBoxSuffix).prop("checked", true);
} else {
$("#all-" + (isCustomer ? "customers" : "employees") + "-checkbox" + allItemsCheckBoxSuffix).prop("checked", false);
}
$("#" + allItemsCheckBoxId).prop("checked", arrayContainsAllItems(selectedItemOids, allItemOids));
$.get(url, { oidString: oidStr }).done(function (jsonResult) {
$.get(url, { oidString: selectedItemOids.toString() }).done(function (jsonResult) {
updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids);
$("#one-day-scheduler-partial-container").load(filterAppointmentsUrl);
});
} catch(error) {
logError(error.message);
logError("Fehler in changeItemListSelection: " + error.message);
}
}
// Wird aufgerufen, um die Liste mit den ausgewählten Objekten zu aktualisieren
function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids) {
function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) {
try {
if (isEmptyOrSpaces(jsonResult)) {
if(isEmptyOrSpaces(jsonResult)) {
return;
}
@@ -98,11 +78,11 @@ function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupI
list.append(html);
});
} catch(error) {
logError(error.message);
logError("Fehler in updateSelectedList: " + error.message);
}
}
function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listId, itemIdPrefix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids) {
function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listId, itemIdPrefix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) {
try {
var prefix = isCustomer ? "customer-" : "employee-";
@@ -112,8 +92,8 @@ function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listI
checkBox.prop("checked", false);
}
changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, itemSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids);
changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, itemSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId);
} catch(error) {
logError(error);
logError("Fehler in removeSelectedItem: " + error);
}
}

View File

@@ -1,21 +1,21 @@
function logInfo(message) {
logColorfulMessage(message, "purple");
logColorfulMessage(message, "#FF0094");
}
function logWarning(message) {
logColorfulMessage(message, "darkorange");
logColorfulMessage(message, "#FF5A00");
}
function logError(message) {
console.error("%c" + message, "font-size: 16px; font-weight:bold; color: red");
console.error("%c" + message, "font-size: 14px; font-family: monospace; color: red");
}
function logDebug(message) {
logColorfulMessage(message, "green");
logColorfulMessage(message, "#AAF500");
}
function logColorfulMessage(message, color) {
console.log("%c" + message, "font-size: 16px; font-weight: bold; color: " + color);
console.log("%c" + message, "font-size: 14px; font-family: monospace; color: " + color);
}
function logInfo2(message) {

View File

@@ -199,18 +199,15 @@ function insertOrUpdateAppointment(formattedStartDate, formattedEndDate, formatt
}
function hideAppointmentForm() {
logDebug("hiding appointment form");
$("#form-container").addClass("d-none d-sm-none");
}
function showAppointmentForm() {
logDebug("showing appointment form");
$("#form-container").removeClass("d-none d-sm-none");
calcPrependTextSizes();
}
function toggleAppointmentForm() {
logError("toggling appointment form");
var isVisible = $("#form-container").css("display") === "block";
if (isVisible) {

View File

@@ -38,12 +38,14 @@
var isLeaf = $(item).parent().prop("class").includes("goal-text");
// ToDo: Auch die Ziele beachten!
if(goalText.toLowerCase().includes(text)) {
$.each($($(item).parents(".goal-card")), function(cardIndex, card) {
$(card).show();
$(card).find(".collapse").collapse("show");
});
} else if (isLeaf) {
} else if(isLeaf) {
var parent1 = $($(item).parent());
if(parent1 !== undefined && parent1 !== null) {

View File

@@ -136,31 +136,7 @@
break;
}
}
<!--
Alt:
<div class="input-group-prepend">
<i class="fas fa-chevron-down h-100 text-primary" id="chevron-@result.Identifier"></i>
</div>
<p class="form-control text-primary border-0 bg-transparent" style="user-select: none !important;">
@result.CustomerName
</p>
<div class="input-group-append">
<button class="btn btn-bewo-customers rounded mr-1" type="button" onclick="@methodName">
<span class="fas fa-signature"></span>
<span class="fas fa-@customerIcon" style="color: @customerBtnColor !important"></span>
K
</button>
<button class="btn btn-bewo-employee rounded" type="button" onclick="@employeeMethodName">
<span class="fas fa-signature"></span>
<span class="fas fa-@employeeIcon" style="color: @employeeBtnColor !important"></span>
M
</button>
</div>
-->
<div class="row">
<div class="col-sm-auto mr-auto">
<div class="input-group">

View File

@@ -11,9 +11,22 @@
}
$("#insert-appointment-form").ready(function() {
var width = getMaxWidth("scheduler-form-prepend-text");
$(".scheduler-form-prepend-text").width(width);
calcPrependTextSizes();
});
function calcPrependTextSizes() {
try {
var width = getMaxWidth("scheduler-form-prepend-text");
if(width <= 0) {
return;
}
$(".scheduler-form-prepend-text").width(width);
} catch(error) {
logError(error);
}
}
</script>
@using(Html.BeginForm("InsertOrUpdateAppointment", "Scheduler", FormMethod.Post, new { id = "insert-appointment-form" }))
{
@@ -373,30 +386,22 @@
$.each(entries, function (index, item) {
var employee = $(item);
if (employee.find(".employee-name-label").text().toLowerCase().includes(text)) {
if(employee.find(".employee-name-label").text().toLowerCase().includes(text)) {
employee.show();
} else {
employee.hide();
}
});
} catch (error) {
} catch(error) {
logError(error.message);
}
}
function selectAllEmployeesOnChange() {
try {
var value = $("#all-employees-checkbox").prop("checked");
var allChecked = $("#all-employees-checkbox").prop("checked");
$("#employees-popup input[type=checkbox]").each(function() {
var id = $(this).attr("id").split("-")[1];
if($.isNumeric(id) === false) {
return;
}
$(this).prop("checked", value);
});
$("#employees-popup .employee-input-container input[type=checkbox]").map(function() { $(this).prop("checked", allChecked); });
changeEmployeeListSelection();
} catch(error) {
@@ -406,32 +411,17 @@
function changeEmployeeListSelection() {
try {
var oidStr = "";
var oids = [];
var allChecked = true;
var selectedEmployeeOids = $("#employees-popup .employee-input-container input:checked").map(function() { return $(this).attr("id").split("-")[1]; }).get();
var allEmployeesCount = $("#employees-popup .employee-input-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get().length;
var selectedEmployeesCount = selectedEmployeeOids.length;
$("#employees-popup input[type=checkbox]").each(function () {
var id = $(this).attr("id").split("-")[1];
$("#all-employees-checkbox").prop("checked", (allEmployeesCount === selectedEmployeesCount));
if ($.isNumeric(id) === false) {
return;
}
if ($(this).prop("checked")) {
oids.push(id);
oidStr += id + ",";
} else {
allChecked = false;
}
});
$("#all-employees-checkbox").prop("checked", allChecked);
$.get('@Url.Action("SelectEmployeesForAppointment")', {oidString: oidStr}).done(function(jsonResult) {
$.get('@Url.Action("SelectEmployeesForAppointment")', { oidString: selectedEmployeeOids.toString()}).done(function(jsonResult) {
updateSelectedEmployees(jsonResult);
$("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")');
});
} catch (error) {
} catch(error) {
logError(error);
}
}
@@ -494,7 +484,7 @@
$.get('@Url.Action("SelectTeamForAppointment")', { teamOidString: teamOid }).done(function(jsonResult) {
var oids = $.parseJSON(jsonResult);
$("#employees-popup input[type=checkbox]").each(function () {
$("#employees-popup .employee-input-container input[type=checkbox]").each(function () {
var id = $(this).attr("id").split("-")[1];
if ($.isNumeric(id) === false) {
@@ -569,16 +559,18 @@
<hr />
}
<div class="employee-input-container">
@foreach(var employee in Model.AllEmployees)
{
var checkedValue = Model.SelectedEmployees.Contains(employee) ? "checked" : string.Empty;
@foreach(var employee in Model.AllEmployees)
{
var checkedValue = Model.SelectedEmployees.Contains(employee) ? "checked" : string.Empty;
<div class="custom-control custom-checkbox employee-text">
<input type="checkbox" class="custom-control-input" id="employee-@employee.EmployeeOid-checkbox" @checkedValue onchange="changeEmployeeListSelection()" />
<label class="custom-control-label employee-name-label" for="employee-@employee.EmployeeOid-checkbox">@employee.DetailDescription</label>
</div>
}
<div class="custom-control custom-checkbox employee-text">
<input type="checkbox" class="custom-control-input" id="employee-@employee.EmployeeOid-checkbox" @checkedValue onchange="changeEmployeeListSelection()" />
<label class="custom-control-label employee-name-label" for="employee-@employee.EmployeeOid-checkbox">@employee.DetailDescription</label>
</div>
}
</div>
</div>
</div>
<div class="modal-footer">
@@ -622,16 +614,19 @@
</button>
</div>
</div>
<div class="popup-list-item-container">
@foreach(var customer in Model.AllCustomers)
{
var checkedValue = Model.SelectedCustomers.Contains(customer) ? "checked" : string.Empty;
@foreach(var customer in Model.AllCustomers)
{
var checkedValue = Model.SelectedCustomers.Contains(customer) ? "checked" : string.Empty;
<div class="custom-control custom-checkbox customer-text">
<input type="checkbox" class="custom-control-input" id="customer-@customer.CustomerOid-checkbox" @checkedValue onchange="changeItemListSelection('@Url.Action("SelectCustomersForAppointment", "Scheduler")', 'customers-popup', 'selected-customers-list', 'related-customer-', true, '-checkbox', '@Url.Action("FetchAppointments", "Scheduler")', '', getTeamMemberOids())" />
<label class="custom-control-label customer-name-label" for="customer-@customer.CustomerOid-checkbox">@customer.DetailDescription</label>
</div>
}
<div class="custom-control custom-checkbox customer-text">
<input type="checkbox" class="custom-control-input" id="customer-@customer.CustomerOid-checkbox" @checkedValue onchange="changeItemListSelection('@Url.Action("SelectCustomersForAppointment", "Scheduler")', 'customers-popup', 'selected-customers-list', 'related-customer-', true, '-checkbox', '@Url.Action("FetchAppointments", "Scheduler")', '', getTeamMemberOids(), 'all-customers-checkbox')" />
<label class="custom-control-label customer-name-label" for="customer-@customer.CustomerOid-checkbox">@customer.DetailDescription</label>
</div>
}
</div>
</div>
</div>
<div class="modal-footer">

View File

@@ -35,9 +35,7 @@
$("#selected-resources-interval-finder-list, #selected-employees-interval-finder-list, #selected-customers-interval-finder-list").empty();
var url = '@Url.Action("ResetIntervalFinder", "Scheduler")';
$.get(url);
$.get('@Url.Action("ResetIntervalFinder", "Scheduler")');
}
function submitIntervalFinderForm() {
@@ -46,33 +44,28 @@
var isValid = validateIntervalFinderForm();
$("#hidden-submit-btn").click();
if(isValid === false) {
hideSpinner();
// ToDo: Fehlermeldung anzeigen!
} else {
$("#hidden-submit-btn").click();
}
} catch(error) {
logError(error.message);
}
}
// ToDo: Mit Alert arbeiten? Oder Bootstrap-Validierung anpassen/manuell aufrufen und prüfen, ob das Startdatum vor dem Enddatum liegt.
function validateIntervalFinderForm() {
var isValid = false;
try {
var duration = parseInt($("#interval-duration").val());
var startDate = getDateFromPicker("scheduler-interval-start");
var startTime = getTimeFromPicker("scheduler-interval-start-time");
var endDate = getDateFromPicker("scheduler-interval-end");
var endTime = getTimeFromPicker("scheduler-interval-end-time");
var start = getDateTimeFromPicker("scheduler-interval-start", "scheduler-interval-start-time");
var end = getDateTimeFromPicker("scheduler-interval-end", "scheduler-interval-end-time");
var start = mergeDateAndTime(startDate, startTime);
var end = mergeDateAndTime(endDate, endTime);
if(isValidDate(startDate) && isValidDate(startTime) && isValidDate(endDate) && isValidDate(endTime) && duration > 0 && end > start) {
isValid = end > start;
}
isValid = isValidDate(new Date(start)) && isValidDate(new Date(end)) && duration > 0 && start.isBefore(end);
} catch(error) {
logError(error.message);
} finally {
@@ -80,14 +73,38 @@
}
}
function getDateTimeFromPicker(datePickerId, timePickerId) {
try {
var dateVal = $("#" + datePickerId).datetimepicker("viewDate");
var timeVal = $("#" + timePickerId).val();
var timeRegEx = new RegExp('^(2[0-3]|[01]?[0-9]):([0-5]?[0-9])$');
if(isValidDate(new Date(dateVal)) && timeRegEx.test(timeVal)) {
var hm = timeVal.split(":");
if(hm.length === 2 && $.isNumeric(hm[0]) && $.isNumeric(hm[1])) {
dateVal.hours(parseInt(hm[0]));
dateVal.minutes(parseInt(hm[1]));
return dateVal;
}
}
return null;
} catch (error) {
logError(error);
}
}
(function() {
'use strict';
window.addEventListener('load', function() {
var forms = document.getElementsByClassName('needs-validation');
var validation = Array.prototype.filter.call(forms, function(form) {
form.addEventListener('submit', function(event) {
if (form.checkValidity() === false) {
if(form.checkValidity() === false) {
event.preventDefault();
event.stopPropagation();
hideSpinner();
@@ -102,6 +119,33 @@
var width = getMaxWidth("prepend-text");
$(".prepend-text").width(width);
});
function selectTeamForIntervalFinder(teamOid) {
try {
$.get('@Url.Action("SelectTeamForIntervalFinder")', { teamOidString: teamOid }).done(
function(jsonResult) {
var employeeOids = $.parseJSON(jsonResult);
$("#employees-interval-finder-popup .popup-list-item-container input[type=checkbox]").map(function() {
var employeeOid = $(this).attr("id").split("-")[1];
if($.isNumeric(employeeOid) === false) {
return;
}
var numericEmployeeOid = parseInt(employeeOid);
if(employeeOids.includes(numericEmployeeOid)) {
$(this).prop("checked", true);
}
});
changeItemListSelection('@Url.Action("SelectEmployeesForIntervalFinder", "Scheduler")', 'employees-interval-finder-popup', 'selected-employees-interval-finder-list', 'related-employee-interval-finder-', false, '-interval-finder-checkbox', '@Url.Action("FetchAppointments", "Scheduler")');
});
} catch(error) {
logError(error);
}
}
</script>
<div id="interval-form-container">
@@ -376,9 +420,6 @@
var allResourcesCheckedVal = Model.AllResources.AreListEqual(Model.SelectedResourcesForIntervalFinder) ? "checked" : string.Empty;
}
<!-- ToDo: am 30.01.2023 hier weitermachen! Alle auswählen funktioniert noch nicht!
checkboxId, url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, AllItemsCheckBoxSuffix
-->
<input type="checkbox" class="custom-control-input" id="all-resources-for-interval-finder-checkbox" @allResourcesCheckedVal onchange="selectAllCheckboxOnChange('all-resources-for-interval-finder-checkbox', '@Url.Action("SelectResourcesForIntervalFinder")', 'resources-interval-finder-popup', 'selected-resources-interval-finder-list', 'related-resource-interval-finder-item-', false, '-interval-finder-checkbox', null, 'all-resources-for-interval-finder-checkbox')" />
<label class="custom-control-label" for="all-resources-for-interval-finder-checkbox">Alle</label>
</div>
@@ -442,29 +483,68 @@
<div class="modal-body">
<div class="container-fluid">
<div class="input-group mb-3">
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="listSearchOnChange('interval-finder-employee-search-input', 'interval-finder-employee-text', 'interval-finder-employee-name-label')" id="interval-finder-employee-search-input" />
<div class="input-group-prepend">
<div class="input-group-text">
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
@{
var allEmployeesCheckedVal = Model.AllEmployees.AreListEqual(Model.SelectedEmployeesForIntervalFinder) ? "checked" : string.Empty;
}
<input type="checkbox" class="custom-control-input" id="all-employees-for-interval-finder-checkbox" @allEmployeesCheckedVal
onchange="selectAllCheckboxOnChange('all-employees-for-interval-finder-checkbox', '@Url.Action("SelectEmployeesForIntervalFinder", "Scheduler")', 'employees-interval-finder-popup', 'selected-employees-interval-finder-list', 'related-employee-interval-finder-', false, '-interval-finder-checkbox', '@Url.Action("FetchAppointments", "Scheduler")', '')" />
<label class="custom-control-label" for="all-employees-for-interval-finder-checkbox">Alle</label>
</div>
</div>
</div>
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="listSearchOnChange('interval-finder-employee-search-input', 'interval-finder-employee-text', 'interval-finder-employee-name-label')" id="interval-finder-employee-search-input"/>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" onclick="resetSearch('interval-finder-employee-search-input', 'interval-finder-employee-text')">
<span class="fas fa-times-circle"></span>
</button>
</div>
</div>
@foreach(var employee in Model.AllEmployees)
@if(AbstractModel.HasRightToViewTeams)
{
var checkedValue = Model.SelectedEmployeesForIntervalFinder.Contains(employee) ? "checked" : string.Empty;
var url = Url.Action("SelectEmployeesForIntervalFinder", "Scheduler");
var filterAppointmentsUrl = Url.Action("FetchAppointments", "Scheduler");
var onClickParams = $"'{url}', 'employees-interval-finder-popup', 'selected-employees-interval-finder-list', 'related-employee-interval-finder-', false, '-interval-finder-checkbox', '{filterAppointmentsUrl}'";
<div class="custom-control custom-checkbox interval-finder-employee-text">
<input type="checkbox" class="custom-control-input" id="employee-@employee.EmployeeOid-interval-finder-checkbox" @checkedValue onchange="changeItemListSelection(@onClickParams)" />
<label class="custom-control-label interval-finder-employee-name-label" for="employee-@employee.EmployeeOid-interval-finder-checkbox">@employee.DetailDescription</label>
<div class="card w-100 mb-3">
<div class="card-header" data-toggle="collapse" data-target="#collapsable-teams-selection">
<div class="d-flex align-items-center">
<h5 class="mr-auto">Meine Teams</h5>
<div class="btn-group" role="group">
<span class="fas fa-chevron-down text-primary"></span>
</div>
</div>
</div>
<div class="collapse" id="collapsable-teams-selection">
<div class="card-body">
@foreach(var team in Model.MyTeams)
{
<button type="button" class="btn btn-bewo-teams w-100 my-2" onclick="selectTeamForIntervalFinder(@team.TeamOid)">@team.Name</button>
}
</div>
</div>
</div>
<hr />
}
<div class="popup-list-item-container">
@foreach(var employee in Model.AllEmployees)
{
var checkedValue = Model.SelectedEmployeesForIntervalFinder.Contains(employee) ? "checked" : string.Empty;
var url = Url.Action("SelectEmployeesForIntervalFinder", "Scheduler");
var filterAppointmentsUrl = Url.Action("FetchAppointments", "Scheduler");
var onClickParams = $"'{url}', 'employees-interval-finder-popup', 'selected-employees-interval-finder-list', 'related-employee-interval-finder-', false, '-interval-finder-checkbox', '{filterAppointmentsUrl}', '', getTeamMemberOids(), 'all-employees-for-interval-finder-checkbox'";
<div class="custom-control custom-checkbox interval-finder-employee-text">
<input type="checkbox" class="custom-control-input" id="employee-@employee.EmployeeOid-interval-finder-checkbox" @checkedValue onchange="changeItemListSelection(@onClickParams)" />
<label class="custom-control-label interval-finder-employee-name-label" for="employee-@employee.EmployeeOid-interval-finder-checkbox">@employee.DetailDescription</label>
</div>
}
</div>
</div>
</div>
<div class="modal-footer">
@@ -489,6 +569,19 @@
<div class="modal-body">
<div class="container-fluid">
<div class="input-group mb-3">
<div class="input-group-prepend">
<div class="input-group-text">
@{
var allCustomersCheckedVal = Model.AllCustomers.AreListEqual(Model.SelectedCustomersForIntervalFinder) ? "checked" : string.Empty;
}
<div class="custom-control custom-checkbox custom-control-inline mx-auto">
<input type="checkbox" class="custom-control-input" id="all-customers-for-interval-finder-checkbox" @allCustomersCheckedVal
onchange="selectAllCheckboxOnChange('all-customers-for-interval-finder-checkbox', '@Url.Action("SelectCustomersForIntervalFinder")', 'customers-interval-finder-popup', 'selected-customers-interval-finder-list', 'related-customer-interval-finder-', true, '-interval-finder-checkbox', '@Url.Action("FetchAppointments")', '')" />
<label class="custom-control-label" for="all-customers-for-interval-finder-checkbox">Alle</label>
</div>
</div>
</div>
<input class="form-control w-100" type="text" placeholder="Suchen..." oninput="listSearchOnChange('interval-finder-customer-search-input', 'interval-finder-customer-text', 'interval-finder-customer-name-label')" id="interval-finder-customer-search-input"/>
<div class="input-group-append">
<button type="button" class="btn btn-outline-secondary" onclick="resetSearch('interval-finder-customer-search-input', 'interval-finder-customer-text')">
@@ -496,22 +589,24 @@
</button>
</div>
</div>
<div class="popup-list-item-container">
@foreach(var customer in Model.AllCustomers)
{
var checkedValue = Model.SelectedCustomersForIntervalFinder.Contains(customer) ? "checked" : string.Empty;
@foreach(var customer in Model.AllCustomers)
{
var checkedValue = Model.SelectedCustomersForIntervalFinder.Contains(customer) ? "checked" : string.Empty;
var url = Url.Action("SelectCustomersForIntervalFinder", "Scheduler");
var url = Url.Action("SelectCustomersForIntervalFinder", "Scheduler");
var filterAppointmentsUrl = Url.Action("FetchAppointments", "Scheduler");
var filterAppointmentsUrl = Url.Action("FetchAppointments", "Scheduler");
var onClickParams = $"'{url}', 'customers-interval-finder-popup', 'selected-customers-interval-finder-list', 'related-customer-interval-finder-', true, '-interval-finder-checkbox', '{filterAppointmentsUrl}', '', getTeamMemberOids(), 'all-customers-for-interval-finder-checkbox'";
var onClickParams = $"'{url}', 'customers-interval-finder-popup', 'selected-customers-interval-finder-list', 'related-customer-interval-finder-', true, '-interval-finder-checkbox', '{filterAppointmentsUrl}'";
<div class="custom-control custom-checkbox interval-finder-customer-text">
<input type="checkbox" class="custom-control-input" id="customer-@customer.CustomerOid-interval-finder-checkbox" @checkedValue onchange="changeItemListSelection(@onClickParams)"/>
<label class="custom-control-label interval-finder-customer-name-label" for="customer-@customer.CustomerOid-interval-finder-checkbox">@customer.DetailDescription</label>
</div>
}
<div class="custom-control custom-checkbox interval-finder-customer-text">
<input type="checkbox" class="custom-control-input" id="customer-@customer.CustomerOid-interval-finder-checkbox" @checkedValue onchange="changeItemListSelection(@onClickParams)"/>
<label class="custom-control-label interval-finder-customer-name-label" for="customer-@customer.CustomerOid-interval-finder-checkbox">@customer.DetailDescription</label>
</div>
}
</div>
</div>
</div>
<div class="modal-footer">

View File

@@ -62,7 +62,6 @@
}
});
// ToDo: Muss beim Selektieren/Deselektieren der Checkboxen und der Liste ausgeführt werden!
function selectAllCheckboxOnChange(checkboxId, url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix) {
try {
if(checkboxId === null || checkboxId === undefined || checkboxId.length === 0 || checkboxId.split("-").length < 3) {
@@ -72,7 +71,7 @@
var value = $("#" + checkboxId).prop("checked");
var selectionPrefix = checkboxId.split("-")[1];
$("#" + selectionPrefix + "-popup input[type=checkbox]").each(function () {
$("#" + popupId + " input[type=checkbox]").each(function () {
var id = $(this).attr("id").split("-")[1];
if($.isNumeric(id) === false) {
@@ -83,7 +82,7 @@
});
if(selectionPrefix === "employees" || selectionPrefix === "customers") {
changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, getTeamMemberOids());
changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, getTeamMemberOids(), checkboxId);
} else {
changeResourceSelection(popupId, url, listId, itemIdPrefix, checkBoxIdSuffix, filterAppointmentsUrl, checkboxId);
}
@@ -263,7 +262,7 @@
listCol = "col-md-12";
}
}
<div class="col col-12 @editorCol id="test-container">
<div class="col col-12 @editorCol" id="test-container">
@if(Model.IsInIntervalFinderMode)
{
<!-- Intervallfinder -->

View File

@@ -42,7 +42,7 @@
<script src="~/Scripts/signature_pad-3.2.min.js?v=1.11"></script>
<script src="~/Scripts/utils/trimCanvas.js?v=1.11"></script>
<script src="~/Scripts/utils/resources-list-utils.js?v=1.13"></script>
<script src="~/Scripts/utils/list-utils.js?v=1.12"></script>
<script src="~/Scripts/utils/list-utils.js?v=1.14"></script>
<script src="~/Scripts/utils/service-record-time-calc.js?v=1.5"></script>
<script src="~/Scripts/utils/js-helper.js?v=1.0"></script>
<script src="~/Scripts/utils/logging.js?v=1.0"></script>

View File

@@ -3644,7 +3644,6 @@ namespace BeWo.Data.Access
return resources;
}
// ToDo: Alle geänderten und gelöschten Termine der Serien laden?
var changedOccurrencesCriteria = CreateCriteriaIsActive<SchedulerAppointment>().Add(Restrictions.Eq(nameof(SchedulerAppointment.Type), 3));
var deletedOccurrencesCriteria = CreateCriteria<SchedulerAppointment>().Add(Restrictions.Eq(nameof(SchedulerAppointment.Type), 4));