Bugfixes im Kalendermodul des MoK
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user