= __("After that, you have to restart your webserver and start the installer again."); ?>
@@ -1162,19 +1170,40 @@ if (!file_exists('.lock')) {
const activeTab = $('.nav-link.active');
const nextTab = activeTab.parent().next().find('.nav-link');
+ // Open Tab 2 - Prechecks
+ if (nextTab.attr('id') == secondTabId) {
+ if ($('#precheck_testresults').hasClass('alert-danger')) {
+ if (nextTab.length > 0) {
+ let tab = new bootstrap.Tab(nextTab[0]);
+ tab.show();
+ }
+ continueButton.prop('disabled', true);
+ continueButton.removeClass('btn-info');
+ continueButton.addClass('btn-secondary');
+ continueButton.html("= __("You can't continue. Solve the red marked issues, restart the webserver and reload this page."); ?>");
+ backButton.css('display', 'block');
+ return;
+ // This is a dead end. The user have to solve the issues, restart the webserver and reload the page.
+ // There is no reason to continue if PHP modules are missing or the webserver has not write access to some folders within Wavelog.
+ // The checks for PHP Settings are triggering just warnings (except 'allow_url_fopen', this one triggers a failure as it's needed for a lot of different functions (unfortunately)).
+ }
+ }
+
+ // Exit Tab 3 - Configuration
if (nextTab.attr('id') == fourthTabId) {
if (!directory_check() || !websiteurl_check()) {
return;
}
+ if (!callbook_combination()) {
+ return;
+ }
pwdForbiddenChars($('#callbook_password'));
if ($('#callbook_password').hasClass('is-invalid') && $('#callbook_password').val() != '') {
return;
}
- if (passwordField.val() != '') {
- user_pwd_check();
- }
}
+ // Exit Tab 4 - Database
if (nextTab.attr('id') == fifthTabId) {
await db_connection_test();
if (db_connection_results.hasClass('alert-danger')) {
@@ -1182,19 +1211,24 @@ if (!file_exists('.lock')) {
}
}
+ // Exit Tab 5 - User Form
if (nextTab.attr('id') == lastTabId) {
- if (!checklist_firstuser()) {
+ if (!check_for_empty_fields()) {
+ return;
+ }
+ if (!isValidMaidenheadLocator(userLocatorField)) {
+ return;
+ }
+ if (!isValidEmail(emailField)) {
return;
}
if (!user_pwd_check()) {
return;
}
- if (!maidenhead_checks(userLocatorField)) {
- return;
- }
- if (!email_verification()) {
- return;
- }
+ checklist_configuration();
+ checklist_database();
+ checklist_firstuser();
+ enable_installbutton();
}
if (nextTab.length > 0) {
@@ -1244,19 +1278,25 @@ if (!file_exists('.lock')) {
continueButton.css('display', 'block');
}
}
-
- // in addition we can run some checks here
- maidenhead_checks(userLocatorField);
}
- function input_is_valid(field, is_valid) {
- if (is_valid == true) {
- field.removeClass('is-invalid');
- field.addClass('is-valid');
- } else {
- field.removeClass('is-valid');
+ function input_is_valid(field, status) {
+ if (status == 'is-invalid') {
+ field.removeClass('is-valid has-warning');
field.addClass('is-invalid');
+ return;
}
+ if (status == 'has-warning') {
+ field.removeClass('is-valid is-invalid');
+ field.addClass('has-warning');
+ return;
+ }
+ if (status == 'is-valid') {
+ field.removeClass('is-invalid has-warning');
+ field.addClass('is-valid');
+ return;
+ }
+ console.error('input_is_valid(): Unknown status: ' + status);
}
function pwdForbiddenChars(field) {
@@ -1265,8 +1305,17 @@ if (!file_exists('.lock')) {
if (pwd != '') {
if (specialChars.test(pwd)) {
- input_is_valid(field, false);
+ input_is_valid(field, 'is-invalid');
+ if (field = passwordField) {
+ show_userformwarnings('danger', "= __("Password can't contain ' / \ < >"); ?>");
+ }
+ } else {
+ input_is_valid(field, 'is-valid');
+ hide_userformwarnings();
}
+ } else {
+ field.removeClass('is-invalid');
+ field.removeClass('is-valid');
}
}
@@ -1311,40 +1360,52 @@ if (!file_exists('.lock')) {
let directory = $('#directory');
let websiteurl = $('#websiteurl');
+ let callbook_username = $('#callbook_username');
+ let callbook_password = $('#callbook_password');
// On Page Load
$(document).ready(function() {
- checklist_configuration();
-
$('#advancedSettingsButton').click(function() {
$('#advancedSettingsModal').modal('show');
});
- $('#directory, #websiteurl').on('change', function() {
+ directory.on('change', function() {
directory_check();
- websiteurl_check();
- checklist_configuration();
});
- $('#callbook_password').on('change', function() {
- pwdForbiddenChars($('#callbook_password'));
+ websiteurl.on('change', function() {
+ websiteurl_check();
+ });
+
+ callbook_username.on('change', function() {
+ if (callbook_username.val() == '') {
+ callbook_username.removeClass('is-valid is-invalid');
+ }
+ if (callbook_password.val() == '') {
+ callbook_password.removeClass('is-valid is-invalid');
+ }
+ });
+
+ callbook_password.on('change', function() {
+ if (callbook_password.val() == '') {
+ callbook_password.removeClass('is-valid is-invalid');
+ }
+ if (callbook_username.val() == '') {
+ callbook_username.removeClass('is-valid is-invalid');
+ }
+ pwdForbiddenChars(callbook_password);
});
});
function directory_check() {
-
var check = true;
if (directory.val().startsWith('/') || directory.val().endsWith('/')) {
check = false;
}
- if (check) {
- input_is_valid(directory, true);
- } else {
- input_is_valid(directory, false);
- }
+ input_is_valid(directory, check ? 'is-valid' : 'is-invalid');
return check;
}
@@ -1361,9 +1422,29 @@ if (!file_exists('.lock')) {
}
if (check) {
- input_is_valid(websiteurl, true);
+ input_is_valid(websiteurl, 'is-valid');
} else {
- input_is_valid(websiteurl, false);
+ input_is_valid(websiteurl, 'is-invalid');
+ }
+
+ return check;
+ }
+
+ function callbook_combination() {
+ let check = true;
+ let a = callbook_username.val();
+ let b = callbook_password.val();
+ if ((a == '' && b !== '') || (a !== '' && b == '')) {
+ check = false;
+ if (a == '') {
+ input_is_valid(callbook_username, 'is-invalid');
+ } else {
+ input_is_valid(callbook_password, 'is-invalid');
+ }
+
+ } else if (a !== '' && b !== '') {
+ input_is_valid(callbook_username, 'is-valid');
+ pwdForbiddenChars(callbook_password);
}
return check;
@@ -1387,26 +1468,13 @@ if (!file_exists('.lock')) {
let db_password = $('#db_password');
let db_name = $('#db_name');
- // On Page Load
- $(document).ready(function() {
-
- checklist_database();
-
- if ($('#db_hostname').val() != '') {
- db_connection_test()
- }
- $('#db_hostname, #db_name, #db_username, #db_password').on('keyup', function() {
- clear_db_testresult();
- });
- });
-
function db_connection_test() {
return new Promise((resolve, reject) => {
if (db_hostname.val() === '' || db_username.val() === '' || db_name.val() === '') {
db_connection_results.addClass('alert-danger');
- db_connection_results.html('= __("Error: At least Hostname/IP, Database Name and Username are required."); ?>');
+ db_connection_results.html("= __("Error: At least Hostname/IP, Database Name and Username are required."); ?>");
resolve(false);
return;
}
@@ -1436,7 +1504,7 @@ if (!file_exists('.lock')) {
if (sql_version_checker(response) == true) {
db_connection_results.addClass('alert-success');
$('#db_connection_test_button').html(originalButtonText).prop('disabled', false);
- db_connection_results.html('= __("Connection was successful and your database should be compatible"); ?>
');
+ db_connection_results.html("= __("Connection was successful and your database should be compatible."); ?>
");
} else {
db_connection_results.addClass('alert-warning');
$('#db_connection_test_button').html(originalButtonText).prop('disabled', false);
@@ -1503,13 +1571,13 @@ if (!file_exists('.lock')) {
let cnfmPasswordField = $('#cnfm_password');
let minPasswordLenght = 8;
- const firstUserTabIDs = [
+ const firstUserInputIDs = [
'#firstname',
- '#username',
'#lastname',
+ '#username',
'#password',
- '#callsign',
'#cnfm_password',
+ '#callsign',
'#city',
'#user_email',
'#userlocator'
@@ -1522,135 +1590,123 @@ if (!file_exists('.lock')) {
// On Page Load
$(document).ready(function() {
-
- userLocatorField.on('change', function() {
- maidenhead_checks(userLocatorField);
+ firstUserInputIDs.forEach(function(inputID) {
+ $(inputID).on('change', function() {
+ if ($(inputID).hasClass('is-invalid')) {
+ input_is_valid($(inputID), 'is-valid');
+ hide_userformwarnings();
+ }
+ });
+ });
+ userLocatorField.on('change', function() {
+ isValidMaidenheadLocator(userLocatorField);
});
-
emailField.on('change', function() {
- email_verification();
+ isValidEmail(emailField);
});
passwordField.on('change', function() {
pwdForbiddenChars(passwordField);
});
- cnfmPasswordField.on('change focusout', function() {
+ if(passwordField !== '') {
+ pwdForbiddenChars(passwordField);
+ }
+ cnfmPasswordField.on('change', function() {
user_pwd_check();
});
- if (cnfmPasswordField.val() != '') {
- user_pwd_check();
- }
- firstUserTabIDs.forEach(function(firstUserTabID) {
- $(firstUserTabID).on('change', function() {
- checklist_firstuser();
- });
- });
- if (userLocatorField.val() != '') {
- maidenhead_checks(userLocatorField);
- }
- if ($('#user_email').val() != '') {
- email_verification();
- }
});
- function isValidMaidenheadLocator(locator) {
- const maidenheadRegex = /^[A-R]{2}[0-9]{2}[A-X]{2}$/i;
- return maidenheadRegex.test(locator);
+ function check_for_empty_fields() {
+ let check = true;
+ firstUserInputIDs.forEach(function(inputID) {
+ if ($(inputID).val() == '') {
+ input_is_valid($(inputID), 'is-invalid');
+ show_userformwarnings('danger', "= __("At least one field is empty."); ?>");
+ return check = false;
+ } else {
+ if ($(inputID).hasClass('is-invalid')) {
+ hide_userformwarnings();
+ input_is_valid($(inputID), 'is-valid');
+ }
+ }
+ });
+ return check;
+
}
- function isValidEmail(email) {
+ function show_userformwarnings(status, message) {
+ userFormWarnings.css('display', 'block');
+ userFormWarnings.removeClass('alert-warning alert-danger');
+ userFormWarnings.addClass('alert-' + status);
+ userFormWarnings.html(message);
+ }
+
+ function hide_userformwarnings() {
+ userFormWarnings.css('display', 'none');
+ userFormWarnings.removeClass('alert-warning alert-danger');
+ }
+
+ function isValidMaidenheadLocator(field) {
+ let locator = field.val();
+ const maidenheadRegex = /^[A-R]{2}[0-9]{2}[A-X]{2}$/i;
+ let check = maidenheadRegex.test(locator);
+ if (!check) {
+ show_userformwarnings('danger', "= __("The locator seems to be not in the correct format. Should look like AA11AA (6-char grid locator).") ?>")
+ input_is_valid(field, 'is-invalid');
+ } else {
+ hide_userformwarnings();
+ input_is_valid(field, 'is-valid');
+ }
+ return check;
+ }
+
+ function isValidEmail(field) {
+ let email = field.val();
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- return emailRegex.test(email);
+ let check = emailRegex.test(email);
+ if (!check) {
+ show_userformwarnings('danger', "= __("The e-mail adress does not look correct. Make sure it's a valid e-mail address") ?>")
+ input_is_valid(field, 'is-invalid');
+ } else {
+ hide_userformwarnings();
+ input_is_valid(field, 'is-valid');
+ }
+ return check;
}
function user_pwd_check() {
+ pwdForbiddenChars(passwordField);
+ if (passwordField.hasClass('is-invalid')) {
+ return false;
+ }
if (cnfmPasswordField.val() == passwordField.val() && cnfmPasswordField.val() != '') {
if (cnfmPasswordField.val().length >= minPasswordLenght) {
- passwordField.removeClass('is-invalid');
- cnfmPasswordField.removeClass('is-invalid');
- passwordField.removeClass('has-warning');
- cnfmPasswordField.removeClass('has-warning');
+ input_is_valid(passwordField, 'is-valid');
+ input_is_valid(cnfmPasswordField, 'is-valid');
- passwordField.addClass('is-valid');
- cnfmPasswordField.addClass('is-valid');
-
- userFormWarnings.css('display', 'none');
- userFormWarnings.removeClass('alert-warning alert-danger');
+ hide_userformwarnings();
} else {
- passwordField.addClass('has-warning');
- cnfmPasswordField.addClass('has-warning');
-
- passwordField.removeClass('is-valid');
- cnfmPasswordField.removeClass('is-valid');
- passwordField.removeClass('is-invalid');
- cnfmPasswordField.removeClass('is-invalid');
-
- userFormWarnings.css('display', 'block');
- userFormWarnings.removeClass('alert-warning alert-danger');
- userFormWarnings.addClass('alert-warning');
- userFormWarnings.html('= __("Password should be at least 8 characters long"); ?>')
+ input_is_valid(passwordField, 'has-warning');
+ input_is_valid(cnfmPasswordField, 'has-warning');
+ show_userformwarnings('warning', "= __("Password should be at least 8 characters long"); ?>");
}
return true;
} else {
- passwordField.addClass('is-invalid');
- cnfmPasswordField.addClass('is-invalid');
- passwordField.removeClass('has-warning');
- cnfmPasswordField.removeClass('has-warning');
+ input_is_valid(passwordField, 'is-invalid');
+ input_is_valid(cnfmPasswordField, 'is-invalid');
- passwordField.removeClass('is-valid');
- cnfmPasswordField.removeClass('is-valid');
-
- userFormWarnings.css('display', 'block');
- userFormWarnings.removeClass('alert-warning alert-danger');
- userFormWarnings.addClass('alert-danger');
- userFormWarnings.html('= __("Passwords do not match"); ?>');
+ show_userformwarnings('danger', "= __("Passwords do not match"); ?>");
return false;
}
}
- function email_verification() {
- if (!isValidEmail(emailField.val()) && emailField != '') {
-
- input_is_valid(emailField, false);
- userFormWarnings.show();
- userFormWarnings.removeClass('alert-warning alert-danger');
- userFormWarnings.addClass('alert-danger');
- userFormWarnings.html('= __("The E-Mail Address is not valid"); ?>');
- return false;
-
- } else {
-
- input_is_valid(emailField, true);
- userFormWarnings.removeClass('alert-danger alert-warning');
- userFormWarnings.hide();
- return true;
-
- }
- }
-
- function maidenhead_checks(field) {
- if (!isValidMaidenheadLocator(field.val())) {
- input_is_valid(field, false);
- userFormWarnings.css('display', 'block');
- userFormWarnings.removeClass('alert-warning alert-danger');
- userFormWarnings.addClass('alert-danger');
- userFormWarnings.html("= sprintf(__("The grid locator is not valid. Use a 6-character locator, e.g. HA44AA. If you don't know your grid square then
click here!"), "https://zone-check.eu/?m=loc"); ?>");
- return false;
- } else {
- input_is_valid(field, true);
- userFormWarnings.removeClass('alert-danger alert-warning');
- userFormWarnings.css('display', 'none');
- return true;
- }
- }
-
/*
* Tab 6 - Install
*
@@ -1669,16 +1725,17 @@ if (!file_exists('.lock')) {
let checklistDatabase = $('#checklist_database');
let checklistFirstUser = $('#checklist_firstuser');
+
// On Page Load
$(document).ready(function() {
- setInterval(enable_installbutton, 800);
-
resetButton.click(function() {
resetModal.modal('show');
});
+
});
+
function enable_installbutton() {
var install_possible = false;
@@ -1690,11 +1747,11 @@ if (!file_exists('.lock')) {
}
if (install_possible) {
- $('#submit').prop('disabled', false).html('= __("Install Now"); ?>');
+ $('#submit').prop('disabled', false).html("= __("Install Now"); ?>");
$('#install_is_ready_msg').show();
$('#submit').css('margin-top', '50px');
} else {
- $('#submit').prop('disabled', true).html('= __("Install not possible. Checklist incomplete."); ?>');
+ $('#submit').prop('disabled', true).html("= __("Install not possible. Checklist incomplete."); ?>");
$('#install_is_ready_msg').hide();
$('#submit').css('margin-top', '150px');
}
@@ -1757,12 +1814,12 @@ if (!file_exists('.lock')) {
function checklist_firstuser() {
var checklist_firstuser = true;
- firstUserTabIDs.forEach(function(firstUserTabID) {
- if ($(firstUserTabID).val() == '') {
- input_is_valid($(firstUserTabID), false);
+ firstUserInputIDs.forEach(function(inputID) {
+ if ($(inputID).val() == '') {
+ input_is_valid($(inputID), 'is-invalid');
checklist_firstuser = false;
} else {
- input_is_valid($(firstUserTabID), true);
+ input_is_valid($(inputID), 'is-valid');
user_pwd_check();
}
});