256 lines
9.4 KiB
JavaScript
256 lines
9.4 KiB
JavaScript
function calcDuration(idPrefix, isFormatChange, isInvokedByStart, isInvokedByEnd) {
|
|
const endDateInput = $(`#${idPrefix}-end-date-input`);
|
|
const startDateInput = $(`#${idPrefix}-start-date-input`);
|
|
const endTimeInput = $(`#${idPrefix}-end-time-input`);
|
|
const startTimeInput = $(`#${idPrefix}-start-time-input`);
|
|
const durationInput = $(`#${idPrefix}-duration-input`);
|
|
const hoursMinutesBtn = $(`#${idPrefix}-hours-minutes-dropdown-btn`);
|
|
const durationLabel = $(`#${idPrefix}-duration-label`);
|
|
|
|
const startDateValue = startDateInput.val();
|
|
const startTimeValue = startTimeInput.val();
|
|
const endDateValue = endDateInput.val();
|
|
const endTimeValue = endTimeInput.val();
|
|
const durationValue = durationInput.val();
|
|
|
|
const hasMinutesHoursDropdown = hoursMinutesBtn.length > 0;
|
|
|
|
const isInMin = (false === hasMinutesHoursDropdown && false === durationLabel.text().includes("(h)")) ||
|
|
hasMinutesHoursDropdown === true && hoursMinutesBtn.text().replaceAll(/\s/g, "") === "Minuten";
|
|
|
|
const hasEndDate = endDateInput.length;
|
|
|
|
if(startDateValue.length === 0) {
|
|
return;
|
|
}
|
|
|
|
const isStartTimeValid = startTimeValue !== null && startTimeValue !== undefined && startTimeValue.length > 0;
|
|
const isEndTimeValid = endTimeValue !== null && endTimeValue !== undefined && endTimeValue.length > 0;
|
|
const duration = parseFloat(durationValue.replace(",", "."));
|
|
const isDurationValid = !isNaN(duration);
|
|
|
|
let start = new Date(startDateValue);
|
|
let end = hasEndDate ? new Date(endDateValue) : start;
|
|
|
|
if(true === isStartTimeValid && true === isEndTimeValid && false === isFormatChange) {
|
|
start = combineDateAndTime(start, startTimeValue);
|
|
end = combineDateAndTime(end, endTimeValue);
|
|
|
|
let dauer = (end.getTime() - start.getTime()) / 60000;
|
|
|
|
if(duration > 0 && start >= end) {
|
|
dauer = (false === isInMin ? duration * 60 : duration);
|
|
|
|
if(true === isInvokedByStart) {
|
|
end = new Date(start.getTime() + dauer * 60000);
|
|
|
|
endTimeInput.val(getTimeAsString(end));
|
|
endDateInput.val(getDateAsString(end));
|
|
|
|
updateEndDate(idPrefix, getDateAsString(end));
|
|
updateEndTime(idPrefix, getTimeAsString(end));
|
|
}
|
|
else if(true === isInvokedByEnd) {
|
|
end.setDate(end.getDate() + 1);
|
|
|
|
endTimeInput.val(getTimeAsString(end));
|
|
endDateInput.val(getDateAsString(end));
|
|
|
|
updateEndDate(idPrefix, getDateAsString(end));
|
|
updateEndTime(idPrefix, getTimeAsString(end));
|
|
}
|
|
|
|
dauer = (end.getTime() - start.getTime()) / 60000;
|
|
}
|
|
|
|
if(false === isInMin) {
|
|
dauer /= 60.0;
|
|
}
|
|
|
|
durationInput.val(dauer);
|
|
updateDuration(idPrefix, durationInput.val());
|
|
} else if(true === isStartTimeValid && true === isDurationValid) {
|
|
var newDuration = duration;
|
|
|
|
if(true === isFormatChange) {
|
|
let newDurationValue = true === isInMin ? duration * 60.0 : duration / 60.0;
|
|
|
|
if(isNaN(newDurationValue)) {
|
|
durationInput.val("");
|
|
} else {
|
|
durationInput.val(newDurationValue);
|
|
updateDuration(idPrefix, durationInput.val());
|
|
}
|
|
|
|
if(true === isInMin)
|
|
{
|
|
newDuration = newDurationValue;
|
|
}
|
|
}
|
|
|
|
calcTimeWithDuration(startTimeValue, endTimeInput, start, newDuration, isFormatChange, isInMin);
|
|
} else if(true === isEndTimeValid && true === isDurationValid) {
|
|
if(true === isFormatChange) {
|
|
durationInput.val(formatDuration(isInMin, true === isInMin ? duration * 60.0 : duration / 60.0));
|
|
updateDuration(idPrefix, durationInput.val());
|
|
}
|
|
|
|
calcTimeWithDuration(endTimeValue, startTimeInput, start, duration * -1.0, isFormatChange, isInMin);
|
|
} else if(true === isFormatChange) {
|
|
if (true === isFormatChange) {
|
|
durationInput.val(formatDuration(isInMin, true === isInMin ? duration * 60.0 : duration / 60.0));
|
|
updateDuration(idPrefix, durationInput.val());
|
|
}
|
|
}
|
|
}
|
|
|
|
function formatDuration(isInMin, durationAsNumber) {
|
|
if(true === isNaN(durationAsNumber)) {
|
|
return "";
|
|
}
|
|
|
|
const roundedValue = Math.round(durationAsNumber * 1000) / 1000;
|
|
|
|
if(isInMin) {
|
|
return roundedValue.toString().includes(".") ? roundedValue.toString().split(".")[0] : roundedValue;
|
|
} else {
|
|
if (roundedValue.toString().includes(".")) {
|
|
const splitRoundedValue = roundedValue.toString().split(".");
|
|
const [predecimalPlaces, decimalPlaces] = splitRoundedValue;
|
|
|
|
const end = decimalPlaces.length === 0 ? "00" : decimalPlaces.length > 2 ? decimalPlaces.substring(0, 2) : `${decimalPlaces}0`;
|
|
|
|
return `${predecimalPlaces},${end}`;
|
|
} else {
|
|
return `${roundedValue},00`;
|
|
}
|
|
}
|
|
}
|
|
|
|
function calcTimeWithDuration(timeAsString, timeElement, start, duration, isFormatChange, isInMin) {
|
|
start = combineDateAndTime(start, timeAsString);
|
|
|
|
const x = new Date(start.getTime() + duration * 60000);
|
|
const timeString = `${x.getHours().toString().padStart(2, "0")}:${x.getMinutes().toString().padStart(2, "0")}`;
|
|
timeElement.val(timeString);
|
|
timeElement.trigger("change");
|
|
}
|
|
|
|
function beiDaueraenderung(idPrefix) {
|
|
logInfo2(`${idPrefix}-Dauer geändert`);
|
|
const hoursMinutesDropdown = $(`#${idPrefix}-hours-minutes-dropdown-btn`);
|
|
|
|
const startTimeInput = $(`#${idPrefix}-start-time-input`);
|
|
const endTimeInput = $(`#${idPrefix}-end-time-input`);
|
|
const durationInput = $(`#${idPrefix}-duration-input`);
|
|
const startDateInput = $(`#${idPrefix}-start-date-input`);
|
|
const endDateInput = $(`#${idPrefix}-end-date-input`);
|
|
const hoursMinutesBtn = $(`#${idPrefix}-hours-minutes-dropdown-btn`);
|
|
const durationLabel = $(`#${idPrefix}-duration-label`);
|
|
const hasMinutesHoursDropdown = hoursMinutesDropdown.length > 0;
|
|
const isInMin = (false === hasMinutesHoursDropdown && false === durationLabel.text().includes("(h)")) ||
|
|
hasMinutesHoursDropdown === true && hoursMinutesBtn.text().replaceAll(/\s/g, "") === "Minuten";
|
|
|
|
const startTimeCondition = startTimeInput.val().length > 0;
|
|
const endTimeCondition = endTimeInput.val().length > 0;
|
|
|
|
var dauerString = durationInput.val();
|
|
|
|
if(dauerString.indexOf(".") >= 0) {
|
|
dauerString = dauerString.replace(".", ",");
|
|
durationInput.val(dauerString);
|
|
}
|
|
|
|
let duration = parseFloat(dauerString.replace(",", "."));
|
|
|
|
const durationCondition = false === isNaN(duration);
|
|
|
|
if((false === startTimeCondition && false === endTimeCondition) || false === durationCondition) {
|
|
return;
|
|
}
|
|
|
|
if(false === isInMin) {
|
|
duration *= 60;
|
|
}
|
|
|
|
let start = new Date();
|
|
let end = new Date();
|
|
|
|
if(startDateInput.length > 0) {
|
|
start = new Date(startDateInput.val());
|
|
end = new Date(start);
|
|
}
|
|
|
|
if(endDateInput.length > 0) {
|
|
end = new Date(endDateInput.val());
|
|
}
|
|
|
|
if(true === startTimeCondition) {
|
|
const startDateAndTimeCombined = combineDateAndTime(start, startTimeInput.val());
|
|
|
|
end = new Date(startDateAndTimeCombined.getTime() + duration * 60000);
|
|
|
|
endTimeInput.val(getTimeAsString(end));
|
|
endDateInput.val(getDateAsString(end));
|
|
|
|
endTimeInput.trigger("change");
|
|
endDateInput.trigger("change");
|
|
} else {
|
|
const endDateAndTimeCombined = combineDateAndTime(end, endTimeInput.val());
|
|
|
|
start = new Date(endDateAndTimeCombined.getTime() - duration * 60000);
|
|
|
|
startTimeInput.val(getTimeAsString(start));
|
|
startDateInput.val(getDateAsString(start));
|
|
|
|
startTimeInput.trigger("change");
|
|
startDateInput.trigger("change");
|
|
}
|
|
}
|
|
|
|
function combineDateAndTime(date, time) {
|
|
const hours = time.split(":")[0];
|
|
const minutes = time.split(":")[1];
|
|
|
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours, minutes);
|
|
}
|
|
|
|
function getTimeAsString(date) {
|
|
if(date === null || date === undefined) {
|
|
return null;
|
|
}
|
|
|
|
const hours = date.getHours().toString().padStart(2, "0");
|
|
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
|
|
return `${hours}:${minutes}`;
|
|
}
|
|
|
|
function getDateAsString(dateObject) {
|
|
if(dateObject === null || dateObject === undefined) {
|
|
return null;
|
|
}
|
|
|
|
const year = dateObject.getFullYear();
|
|
const date = dateObject.getDate().toString().padStart(2, "0");
|
|
const month = (dateObject.getMonth() + 1).toString().padStart(2, "0");
|
|
|
|
return `${year}-${month}-${date}`;
|
|
}
|
|
|
|
function getDateAndTimeAsString(dateObject) {
|
|
if(dateObject === null || dateObject === undefined) {
|
|
return null;
|
|
}
|
|
|
|
const hours = dateObject.getHours().toString().padStart(2, "0");
|
|
const minutes = dateObject.getMinutes().toString().padStart(2, "0");
|
|
const seconds = dateObject.getSeconds().toString().padStart(2, "0");
|
|
const milliseconds = dateObject.getMilliseconds().toString().padStart(3, "0");
|
|
|
|
const year = dateObject.getFullYear();
|
|
const date = dateObject.getDate().toString().padStart(2, "0");
|
|
const month = (dateObject.getMonth() + 1).toString().padStart(2, "0");
|
|
|
|
return `${year}-${month}-${date} ${hours}:${minutes}:${seconds}.${milliseconds}`;
|
|
} |