/* ---------------------------------------------------------------------------- * Easy!Appointments - Open Source Web 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.0.0 * ---------------------------------------------------------------------------- */ /** * Categories page. * * This module implements the functionality of the categories page. */ App.Pages.Categories = (function () { const $categories = $('#categories'); let filterResults = {}; let filterLimit = 20; /** * Bind the event handlers. */ function bindEventHandlers() { /** * Event: Filter Categories Form "Submit" * * @param {jQuery.Event} event */ $categories.on('submit', '#filter-categories form', function (event) { event.preventDefault(); const key = $('#filter-categories .key').val(); $('.selected').removeClass('selected'); resetForm(); filter(key); }); /** * Event: Filter Categories Row "Click" * * Displays the selected row data on the right side of the page. */ $categories.on('click', '.category-row', function () { if ($('#filter-categories .filter').prop('disabled')) { $('#filter-categories .results').css('color', '#AAA'); return; // exit because we are on edit mode } const categoryId = $(this).attr('data-id'); const category = filterResults.find(function (filterResult) { return Number(filterResult.id) === Number(categoryId); }); display(category); $('#filter-categories .selected').removeClass('selected'); $(this).addClass('selected'); $('#edit-category, #delete-category').prop('disabled', false); }); /** * Event: Add Category Button "Click" */ $categories.on('click', '#add-category', function () { resetForm(); $('#categories .add-edit-delete-group').hide(); $('#categories .save-cancel-group').show(); $('#categories .record-details').find('input, select, textarea').prop('disabled', false); $('#filter-categories button').prop('disabled', true); $('#filter-categories .results').css('color', '#AAA'); }); /** * Event: Edit Category Button "Click" */ $categories.on('click', '#edit-category', function () { $('#categories .add-edit-delete-group').hide(); $('#categories .save-cancel-group').show(); $('#categories .record-details').find('input, select, textarea').prop('disabled', false); $('#filter-categories button').prop('disabled', true); $('#filter-categories .results').css('color', '#AAA'); }); /** * Event: Delete Category Button "Click" */ $categories.on('click', '#delete-category', function () { const categoryId = $('#category-id').val(); const buttons = [ { text: App.Lang.cancel, click: function () { $('#message-box').dialog('close'); } }, { text: App.Lang.delete, click: function () { remove(categoryId); $('#message-box').dialog('close'); } } ]; App.Utils.Message.show(App.Lang.delete_category, App.Lang.delete_record_prompt, buttons); }); /** * Event: Categories Save Button "Click" */ $categories.on('click', '#save-category', function () { const category = { name: $('#category-name').val(), description: $('#category-description').val() }; if ($('#category-id').val() !== '') { category.id = $('#category-id').val(); } if (!validate()) { return; } save(category); }); /** * Event: Cancel Category Button "Click" */ $categories.on('click', '#cancel-category', function () { const id = $('#category-id').val(); resetForm(); if (id !== '') { select(id, true); } }); } /** * Remove the previously registered event handlers. */ function unbindEventHandlers() { $categories .off('click', '#filter-categories .clear') .off('submit', '#filter-categories form') .off('click', '.category-row') .off('click', '#add-category') .off('click', '#edit-category') .off('click', '#delete-category') .off('click', '#save-category') .off('click', '#cancel-category'); } /** * Filter service categories records. * * @param {String} keyword This key string is used to filter the category records. * @param {Number} selectId Optional, if set then after the filter operation the record with the given * ID will be selected (but not displayed). * @param {Boolean} show Optional (false), if true then the selected record will be displayed on the form. */ function filter(keyword, selectId = null, show = false) { App.Http.Categories.search(keyword, filterLimit).then((response) => { filterResults = response; $('#filter-categories .results').empty(); response.forEach( function (category) { $('#filter-categories .results').append(getFilterHtml(category)).append($('
')); }.bind(this) ); if (response.length === 0) { $('#filter-categories .results').append( $('', { 'text': App.Lang.no_records_found }) ); } else if (response.length === filterLimit) { $('