/* ---------------------------------------------------------------------------- * Easy!Appointments - Online Appointment Scheduler * * @package EasyAppointments * @author A.Tselegidis * @copyright Copyright (c) Alex Tselegidis * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 * @link https://easyappointments.org * @since v1.5.0 * ---------------------------------------------------------------------------- */ /** * LDAP settings page. * * This module implements the functionality of the LDAP settings page. */ App.Pages.LdapSettings = (function () { const $saveSettings = $('#save-settings'); const $searchForm = $('#ldap-search-form'); const $searchKeyword = $('#ldap-search-keyword'); const $searchResults = $('#ldap-search-results'); const $ldapFilter = $('#ldap-filter'); const $ldapFieldMapping = $('#ldap-field-mapping'); const $resetFilter = $('#ldap-reset-filter'); const $resetFieldMapping = $('#ldap-reset-field-mapping'); /** * Check if the form has invalid values. * * @return {Boolean} */ function isInvalid() { try { $('#ldap-settings .is-invalid').removeClass('is-invalid'); // Validate required fields. let missingRequiredFields = false; $('#ldap-settings .required').each((index, requiredField) => { const $requiredField = $(requiredField); if (!$requiredField.val()) { $requiredField.addClass('is-invalid'); missingRequiredFields = true; } }); if (missingRequiredFields) { throw new Error(lang('fields_are_required')); } return false; } catch (error) { App.Layouts.Backend.displayNotification(error.message); return true; } } /** * Apply the setting values to the UI form. * * @param {Array} ldapSettings */ function deserialize(ldapSettings) { ldapSettings.forEach((ldapSetting) => { const $field = $('[data-field="' + ldapSetting.name + '"]'); $field.is(':checkbox') ? $field.prop('checked', Boolean(Number(ldapSetting.value))) : $field.val(ldapSetting.value); }); } /** * Prepare an array of setting values based on the UI form. * * @return {Array} */ function serialize() { const ldapSettings = []; $('[data-field]').each((index, field) => { const $field = $(field); ldapSettings.push({ name: $field.data('field'), value: $field.is(':checkbox') ? Number($field.prop('checked')) : $field.val(), }); }); return ldapSettings; } function getLdapFieldMapping() { const jsonLdapFieldMapping = $ldapFieldMapping.val(); return JSON.parse(jsonLdapFieldMapping); } /** * Save the current server settings. */ function saveSettings() { if (isInvalid()) { App.Layouts.Backend.displayNotification(lang('settings_are_invalid')); return; } const ldapSettings = serialize(); return App.Http.LdapSettings.save(ldapSettings); } /** * Search the LDAP server based on a keyword. */ function searchServer() { $searchResults.empty(); const keyword = $searchKeyword.val(); if (!keyword) { return; } App.Http.LdapSettings.search(keyword).done((entries) => { $searchResults.empty(); if (!entries?.length) { renderNoRecordsFound().appendTo($searchResults); return; } entries.forEach((entry) => { renderEntry(entry).appendTo($searchResults); }); }); } /** * Save the account information. */ function onSaveSettingsClick() { saveSettings().done(() => { App.Layouts.Backend.displayNotification(lang('settings_saved')); }); } /** * Set the field value back to the original state. */ function onResetFilterClick() { $ldapFilter.val(vars('ldap_default_filter')); } /** * Set the field value back to the original state. */ function onResetFieldMappingClick() { const defaultFieldMapping = vars('ldap_default_field_mapping'); const jsonDefaultFieldMapping = JSON.stringify(defaultFieldMapping, null, 2); $ldapFieldMapping.val(jsonDefaultFieldMapping); } /** * Handle the LDAP import button click */ function onLdapImportClick(event) { const $target = $(event.target); const $card = $target.closest('.card'); const entry = $card.data('entry'); const ldapFieldMapping = getLdapFieldMapping(); App.Components.LdapImportModal.open(entry, ldapFieldMapping).done(() => { App.Layouts.Backend.displayNotification(lang('user_imported')); }); } /** * Render the no-records-found message */ function renderNoRecordsFound() { return $(`
${lang('no_records_found')}
`); } /** * Render the LDAP entry data on screen * * @param {Object} entry */ function renderEntry(entry) { if (!entry?.dn) { return; } const $entry = $(`
${entry.dn}

${lang('content')}

${JSON.stringify(entry, null, 2)}
`); $entry.data('entry', entry); return $entry; } /** * Save the current connection settings and then search the directory based on the provided keyword. * * @param {Object} event */ function onSearchFormSubmit(event) { event.preventDefault(); saveSettings().done(() => { searchServer(); }); } /** * Initialize the module. */ function initialize() { $saveSettings.on('click', onSaveSettingsClick); $resetFilter.on('click', onResetFilterClick); $resetFieldMapping.on('click', onResetFieldMappingClick); $searchForm.on('submit', onSearchFormSubmit); $searchResults.on('click', '.ldap-import', onLdapImportClick); const ldapSettings = vars('ldap_settings'); deserialize(ldapSettings); } document.addEventListener('DOMContentLoaded', initialize); return {}; })();