').addClass('col-3 mb-3').text('XXXXX'));
$('#modalSelectAccountBody').append($('
').addClass('col-3 mb-3').text('XXXXX'));
$('#modalSelectAccountBody').append($('
').addClass('col-3 mb-3').text('XXXXX'));
*/
$('#modalSelectAccountBodySpinner').removeClass('d-none').addClass('d-none');
$('#modalSelectAccountBody').removeClass('d-none');
});
$('#modalSelectAccount').modal('show');
}
// Clicking on a menu/nav1 item
// nav1ElementIds: IDs of the html nav elements to be put on "active"
var currentPage=null;
var tour=null;
function clickOnNav1Item(nav1ElementIds, callback=null, nonUserClickCallOfThisFunction=false, extCallFlag=false) {
currentPage=nav1ElementIds[nav1ElementIds.length-1];
//console.log(currentPage, nav1ElementIds);
externalCallFlag=extCallFlag;
// The JS datatable object (including triggers and events) is not destroyed only because of content area is loaded with new content.
// The HTML table is deleted, but not the JS datatable object. And it still triggers on other pages - problem.
// This code here is used to handle these "orphaned" datatables and destroyes them.
// (see ticket EI-680)
// Simply destroy all still existing datatable objects since last clickOnNav1Item()
//destroyAllDataTableObjects();
// Remove active class from all nav elements
$("#sidebar ul.sidebar-nav li.sidebar-item").removeClass('active');
// Add active class to relevant nav elements
nav1ElementIds.forEach(function(item, index, array) {
$("#"+item).addClass("active");
});
// Destroy all data tables
var datatablesAry=$.fn.dataTable.tables();
if (Array.isArray(datatablesAry) && datatablesAry.length>0) {
for (var i=0; i
');
$("#contentLoad").load(pathToIncludeFile, function(response, status, xhr) {
if(status == "success") {
if (callback !== null) callback(); // can be used to execute some additional code on loaded page
} else if(status == "error") {
var errorMsg=((xhr!==null && 'responseJSON' in xhr && xhr.responseJSON!==null && xhr.responseJSON!==undefined && 'message' in xhr.responseJSON) ? xhr.responseJSON.message : '');
Logger.log('FRONTEND_CLIENT_LOADCONTENTPAGE', 'ERROR_SYSTEM_DATALOAD', { status: status, errorMsg: errorMsg, pathToIncludeFile: pathToIncludeFile });
//console.log("Error: " + xhr.status + ": " + xhr.statusText);
}
});
}
if (!nonUserClickCallOfThisFunction) Logger.log('FRONTEND_CLIENT_CLICK', 'OK', { pathToFile: (pathToIncludeFile!==null ? pathToIncludeFile : pathToLoadFile), targetPageId: nav1ElementIds[nav1ElementIds.length-1]});
}
function waitForCssElement(selector, callback) {
if (jQuery(selector).length) {
callback();
} else {
//console.log('Wait for element '+selector);
setTimeout(function() {
waitForCssElement(selector, callback);
}, 100);
}
}
function waitForVariableInitalized(variableName, callback) {
if (window[variableName]) {
callback();
} else {
//console.log('Wait for variable '+variableName+' being initalized.');
setTimeout(function() {
waitForVariableInitalized(variableName, callback);
}, 100);
}
}
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
/*
function destroyAllDataTableObjects() { // TODO NOT USED ANYMORE
// The JS datatable object (including triggers and events) is not destroyed only because of content area is loaded with new content.
// The HTML table is deleted, but not the JS datatable object. And it still triggers on other pages - problem.
// This code here is used to handle these "orphaned" datatables and destroyes them.
// (see ticket EI-680)
// Simply destroy all still existing datatable objects since last clickOnNav1Item()
for (dataTableObjX of dataTableObjAry) {
if (dataTableObjX!==null && dataTableObjX!==undefined) dataTableObjX.destroy(true); // Destroy existing table
}
dataTableObjAry=[]; // Also delete all now destroyed datatable objects from the array
}
*/
function getTimestampWithRandomSuffix() {
var ts=new Date();
return ts.getFullYear().toString()+'_'+(ts.getMonth()+1).toString()+'_'+ts.getDate().toString()+'_'+ts.getHours().toString()+'_'+ts.getMinutes().toString()+'_'+ts.getSeconds().toString()+'_'+ts.getMilliseconds().toString()+'_'+Math.round(Math.random()*1000000000);
}
function handleExternalCalls() {
let externalCallHandled=false;
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
// ### Handles external calls to Measurements
/*
Example:
https://www.dekobe-esg-dev.de/esg-tool/?measurementId=123456789?utm_source=email_alert&utm_medium=email
*/
const measurementId = urlParams.get('measurementId');
const consumptionValueId = urlParams.get('consumptionValueId');
const csrdMeasurementId = urlParams.get('csrdMeasurementId');
if (measurementId!==null) {
Logger.log('FRONTEND_CLIENT_EXTERNALCALL', 'OK', { measurementId: measurementId });
externalCallHandled=true;
Measurement.showMeasurementFromExternal(measurementId);
} else if (csrdMeasurementId!==null) {
Logger.log('FRONTEND_CLIENT_EXTERNALCALL', 'OK', { csrdMeasurementId: csrdMeasurementId });
externalCallHandled=true;
MeasurementCSRD.showMeasurementFromExternal(csrdMeasurementId);
} else if (consumptionValueId!==null) {
Logger.log('FRONTEND_CLIENT_EXTERNALCALL', 'OK', { consumptionValueId: consumptionValueId });
externalCallHandled=true;
ConsumptionValue.showConsumptionValueFromExternal(consumptionValueId);
}
return externalCallHandled;
}
function handleFailedApiCall(event, apiUrl, xhr, status, error, eventStatus=null, additionalEventDetails=null) {
console.log(xhr);
console.log(status);
console.log(error);
var errorMsg=(
(xhr!==null && 'responseJSON' in xhr && xhr.responseJSON!==null && xhr.responseJSON!==undefined && 'message' in xhr.responseJSON) ?
xhr.responseJSON.message :
// ''
null
);
if (errorMsg=='No message available') { // Default error message from Spring API
errorMsg=null;
}
var errorMsgLog=null;
if (xhr!==null) {
if ('responseJSON' in xhr && xhr.responseText!==null) {
errorMsgLog=xhr.responseText;
}
}
var errorHttpCode=null;
if (xhr!==null && 'status' in xhr) errorHttpCode=xhr.status;
else if (xhr!==null && 'responseJSON' in xhr && xhr.responseJSON!==null && xhr.responseJSON!==undefined && 'status' in xhr.responseJSON) errorHttpCode=xhr.responseJSON.status;
var eventDetails={ apiUrl: apiUrl, errorMsg: errorMsgLog, httpStatusCode: errorHttpCode };
if (additionalEventDetails!==null) {
for (var prop in additionalEventDetails) {
eventDetails[prop]=additionalEventDetails[prop];
}
}
Logger.log(event
, (eventStatus!==null ?
eventStatus :
(errorHttpCode==501 ? 'ERROR_USER_APIREQUEST' : 'ERROR_SYSTEM_APIREQUEST')
)
, eventDetails
);
if (errorHttpCode==401) { // User is not authenticated (from Spring Security)
// Log out and send load prompt
window.location.href='?action=clear_login&msg=Bitte logge Dich erneut ein';
} else if (errorHttpCode==403) { // User is authenticated, but privileges are insufficient (i.e. call to resource is forbidden) (from Spring Security)
//Helper.showToastr('Warnung', 'Die Benutzerrechte sind nicht ausreichend für diese Aktion.', 'warning');
Helper.showToastr('Fehler', (errorMsg===null ? 'Die Benutzerrechte sind nicht ausreichend für diese Aktion' : errorMsg)+' (403)', 'error');
} else if (errorHttpCode==429) { // User exeeded the rate limit quota
//Helper.showToastr('Warnung', 'Die Benutzerrechte sind nicht ausreichend für diese Aktion.', 'warning');
Helper.showToastr('Fehler', 'Du hast im aktuellen Zeitraum zu viele Anfragen gestellt.', 'error');
} else if (errorHttpCode==500) { // From Controller in case of an exception
//Helper.showToastr('Fehler', 'Es ist ein Fehler aufgetreten beim Aufrufen der API. (500)', 'error');
Helper.showToastr('Fehler', (errorMsg===null ? 'Es ist ein System-Fehler im Backend aufgetreten' : errorMsg)+' (500)', 'error');
} else if (errorHttpCode==501) { // From Controller in case of a user exception
//Helper.showToastr('Fehler', 'Es ist ein Fehler aufgetreten beim Aufrufen der API. (501)', 'error');
Helper.showToastr('Fehler', (errorMsg===null ? 'Es ist ein User-Fehler im Backend aufgetreten' : errorMsg)+' (501)', 'error');
} else if (errorHttpCode==503) { // From Plesk/Webserver in case API daemon is not available
window.location.href='?action=clear_login&msg=Die Anwendung ist zurzeit nicht erreichbar';
} else {
//Helper.showToastr('Fehler', 'Es ist ein Fehler aufgetreten beim Aufrufen der API. (-)', 'error');
Helper.showToastr('Fehler', (errorMsg===null ? 'Es ist ein Fehler aufgetreten' : errorMsg)+' ('+errorHttpCode+')', 'error');
}
}