easyappointments/assets/js/components/ldap_import_modal.js

199 lines
5.4 KiB
JavaScript

/* ----------------------------------------------------------------------------
* Easy!Appointments - Online Appointment Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
* @copyright Copyright (c) Alex Tselegidis
* @license https://opensource.org/licenses/GPL-3.0 - GPLv3
* @link https://easyappointments.org
* @since v1.5.0
* ---------------------------------------------------------------------------- */
/**
* LDAP import modal component.
*
* This module implements the LDAP import modal functionality.
*
* This module requires the following scripts:
*
* - App.Http.Customers
* - App.Http.Providers
* - App.Http.Secretaries
* - App.Http.Admins
*/
App.Components.LdapImportModal = (function () {
const $modal = $('#ldap-import-modal');
const $save = $('#ldap-import-save');
const $firstName = $('#ldap-import-first-name');
const $lastName = $('#ldap-import-last-name');
const $email = $('#ldap-import-email');
const $phoneNumber = $('#ldap-import-phone-number');
const $username = $('#ldap-import-username');
const $ldapDn = $('#ldap-import-ldap-dn');
const $roleSlug = $('#ldap-import-role-slug');
const $password = $('#ldap-import-password');
let deferred;
/**
* Validate the import modal form.
*
* @return {Boolean}
*/
function validate() {
$modal.find('.is-invalid').removeClass('is-invalid');
// Check required fields.
let missingRequiredField = false;
$modal.find('.required').each((index, requiredField) => {
if ($(requiredField).val() === '' || $(requiredField).val() === null) {
$(requiredField).addClass('is-invalid');
missingRequiredField = true;
}
});
return !missingRequiredField;
}
/**
* Get the right HTTP client for the create-user request.
*
* @param {String} roleSlug
*
* @return {Object}
*/
function getHttpClient(roleSlug) {
switch (roleSlug) {
case App.Layouts.Backend.DB_SLUG_CUSTOMER:
return App.Http.Customers;
case App.Layouts.Backend.DB_SLUG_PROVIDER:
return App.Http.Providers;
case App.Layouts.Backend.DB_SLUG_SECRETARY:
return App.Http.Secretaries;
case App.Layouts.Backend.DB_SLUG_ADMIN:
return App.Http.Admins;
default:
throw new Error(`Unsupported role slug provided: ${roleSlug}`);
}
}
/**
* Get the user data object, based on the form values the user provided.
*
* @param {String} roleSlug
*
* @return {Object}
*/
function getUser(roleSlug) {
const user = {
first_name: $firstName.val(),
last_name: $lastName.val(),
email: $email.val(),
phone_number: $phoneNumber.val(),
ldap_dn: $ldapDn.val(),
};
if (roleSlug !== App.Layouts.Backend.DB_SLUG_CUSTOMER) {
user.settings = {
username: $username.val(),
password: $password.val(),
notification: 1,
};
}
return user;
}
/**
* Go through the available values and try to load as many as possible based on the provided mapping.
*
* @param {Object} entry
* @param {Object} ldapFieldMapping
*/
function loadEntry(entry, ldapFieldMapping) {
$ldapDn.val(entry.dn);
$firstName.val(entry?.[ldapFieldMapping?.first_name] ?? '');
$lastName.val(entry?.[ldapFieldMapping?.last_name] ?? '');
$email.val(entry?.[ldapFieldMapping?.email] ?? '');
$phoneNumber.val(entry?.[ldapFieldMapping?.phone_number] ?? '');
$username.val(entry?.[ldapFieldMapping?.username] ?? '');
$password.val('');
}
/**
* Save the current user data.
*/
function onSaveClick() {
if (!validate()) {
return;
}
const roleSlug = $roleSlug.val();
const user = getUser(roleSlug);
const httpClient = getHttpClient(roleSlug);
httpClient.store(user).done(() => {
deferred.resolve();
deferred = undefined;
$modal.modal('hide');
});
}
/**
* Reset the modal every time it's hidden.
*/
function onModalHidden() {
resetModal();
if (deferred) {
deferred.reject();
}
}
/**
* Reset the modal fields and state.
*/
function resetModal() {
$modal.find('input, select, textarea').val('');
$modal.find(':checkbox').prop('checked', false);
$roleSlug.val(App.Layouts.Backend.DB_SLUG_PROVIDER);
}
/**
* Open the import modal for an LDAP entry.
*
* @param {Object} entry
* @param {Object} ldapFieldMapping
*
* @return {Object} $.Deferred
*/
function open(entry, ldapFieldMapping) {
resetModal();
deferred = $.Deferred();
loadEntry(entry, ldapFieldMapping);
$modal.modal('show');
return deferred.promise();
}
/**
* Initialize the module.
*/
function initialize() {
$save.on('click', onSaveClick);
$modal.on('hidden.bs.modal', onModalHidden);
}
document.addEventListener('DOMContentLoaded', initialize);
return {
open,
};
})();