diff --git a/assets/css/layouts/booking_layout.scss b/assets/css/layouts/booking_layout.scss
index bc322054..f60c1c88 100644
--- a/assets/css/layouts/booking_layout.scss
+++ b/assets/css/layouts/booking_layout.scss
@@ -185,7 +185,7 @@ body {
margin: 15px 0;
padding-right: 10px;
width: auto;
- max-height: 255px;
+ max-height: 250px;
}
#book-appointment-wizard #available-hours div {
@@ -273,6 +273,10 @@ body {
margin: 15px 0;
}
+#book-appointment-wizard #wizard-frame-4 .frame-container .frame-content {
+ max-width: 630px;
+}
+
@media (min-width: 768px) {
.wrapper {
min-height: 100vh;
diff --git a/assets/js/components/appointments_modal.js b/assets/js/components/appointments_modal.js
index 55e4f2f3..b7ed915f 100755
--- a/assets/js/components/appointments_modal.js
+++ b/assets/js/components/appointments_modal.js
@@ -52,6 +52,8 @@ App.Components.AppointmentsModal = (function () {
const $customField4 = $('#custom-field-4');
const $customField5 = $('#custom-field-5');
+ const moment = window.moment;
+
/**
* Update the displayed timezone.
*/
@@ -85,8 +87,11 @@ App.Components.AppointmentsModal = (function () {
// ID must exist on the object in order for the model to update the record and not to perform
// an insert operation.
- const startDatetime = moment($startDatetime[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD HH:mm:ss');
- const endDatetime = moment($endDatetime[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD HH:mm:ss');
+ const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
+ const startDatetime = moment(startDateTimeObject).format('YYYY-MM-DD HH:mm:ss');
+
+ const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDatetime);
+ const endDatetime = moment(endDateTimeObject).format('YYYY-MM-DD HH:mm:ss');
const appointment = {
id_services: $selectService.val(),
@@ -204,8 +209,8 @@ App.Components.AppointmentsModal = (function () {
startMoment.add(1, 'hour').set({minutes: 0});
}
- $startDatetime[0]._flatpickr.setDate(startMoment.toDate());
- $endDatetime[0]._flatpickr.setDate(startMoment.add(duration, 'minutes').toDate());
+ App.Utils.UI.setDateTimePickerValue($startDatetime, startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($endDatetime, startMoment.add(duration, 'minutes').toDate());
// Display modal form.
$appointmentsModal.find('.modal-header h3').text(lang('new_appointment_title'));
@@ -362,8 +367,9 @@ App.Components.AppointmentsModal = (function () {
const duration = service ? service.duration : 60;
- const start = $startDatetime[0]._flatpickr.selectedDates[0];
- $endDatetime[0]._flatpickr.setDate(new Date(start.getTime() + duration * 60000));
+ const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
+ const endDateTimeObject = new Date(startDateTimeObject.getTime() + duration * 60000);
+ App.Utils.UI.setDateTimePickerValue($endDatetime, endDateTimeObject);
// Update the providers select box.
@@ -481,7 +487,7 @@ App.Components.AppointmentsModal = (function () {
const startDatetime = new Date();
const endDatetime = moment().add(duration, 'minutes').toDate();
- App.Utils.UI.initializeDatetimepicker($startDatetime, {
+ App.Utils.UI.initializeDateTimePicker($startDatetime, {
onClose: () => {
const serviceId = $selectService.val();
@@ -490,15 +496,16 @@ App.Components.AppointmentsModal = (function () {
(availableService) => Number(availableService.id) === Number(serviceId),
);
- const start = $startDatetime[0]._flatpickr.selectedDates[0];
- $endDatetime[0]._flatpickr.setDate(new Date(start.getTime() + service.duration * 60000));
+ const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
+ const endDateTimeObject = new Date(startDateTimeObject.getTime() + service.duration * 60000);
+ App.Utils.UI.setDateTimePickerValue($endDatetime, endDateTimeObject);
},
});
- $startDatetime[0]._flatpickr.setDate(startDatetime);
+ App.Utils.UI.setDateTimePickerValue($startDatetime, startDatetime);
- App.Utils.UI.initializeDatetimepicker($endDatetime);
- $endDatetime[0]._flatpickr.setDate(endDatetime);
+ App.Utils.UI.initializeDateTimePicker($endDatetime);
+ App.Utils.UI.setDateTimePickerValue($endDatetime, endDatetime);
}
/**
@@ -538,9 +545,10 @@ App.Components.AppointmentsModal = (function () {
}
// Check appointment start and end time.
- const start = $startDatetime[0]._flatpickr.selectedDates[0];
- const end = $endDatetime[0]._flatpickr.selectedDates[0];
- if (start > end) {
+ const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
+ const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDatetime);
+
+ if (startDateTimeObject > endDateTimeObject) {
$startDatetime.addClass('is-invalid');
$endDatetime.addClass('is-invalid');
throw new Error(lang('start_date_before_end_error'));
diff --git a/assets/js/components/unavailabilities_modal.js b/assets/js/components/unavailabilities_modal.js
index 0c78186f..90efea94 100755
--- a/assets/js/components/unavailabilities_modal.js
+++ b/assets/js/components/unavailabilities_modal.js
@@ -28,6 +28,8 @@ App.Components.UnavailabilitiesModal = (function () {
const $selectFilterItem = $('#select-filter-item');
const $reloadAppointments = $('#reload-appointments');
+ const moment = window.moment;
+
/**
* Update the displayed timezone.
*/
@@ -68,22 +70,22 @@ App.Components.UnavailabilitiesModal = (function () {
return;
}
- const startMoment = moment($startDatetime[0]._flatpickr.selectedDates[0]);
+ const startDateTimeMoment = moment(App.Utils.UI.getDateTimePickerValue($startDatetime));
- if (!startMoment.isValid()) {
+ if (!startDateTimeMoment.isValid()) {
$startDatetime.addClass('is-invalid');
return;
}
- const endMoment = moment($endDatetime[0]._flatpickr.selectedDates[0]);
+ const endDateTimeMoment = moment(App.Utils.UI.getDateTimePickerValue($endDatetime));
- if (!endMoment.isValid()) {
+ if (!endDateTimeMoment.isValid()) {
$endDatetime.addClass('is-invalid');
return;
}
- if (startMoment.isAfter(endMoment)) {
+ if (startDateTimeMoment.isAfter(endDateTimeMoment)) {
// Start time is after end time - display message to user.
$unavailabilitiesModal
.find('.modal-message')
@@ -100,8 +102,8 @@ App.Components.UnavailabilitiesModal = (function () {
// Unavailability period records go to the appointments table.
const unavailability = {
- start_datetime: startMoment.format('YYYY-MM-DD HH:mm:ss'),
- end_datetime: endMoment.format('YYYY-MM-DD HH:mm:ss'),
+ start_datetime: startDateTimeMoment.format('YYYY-MM-DD HH:mm:ss'),
+ end_datetime: endDateTimeMoment.format('YYYY-MM-DD HH:mm:ss'),
notes: $unavailabilitiesModal.find('#unavailability-notes').val(),
id_users_provider: $selectProvider.val(),
};
@@ -156,8 +158,8 @@ App.Components.UnavailabilitiesModal = (function () {
$selectProvider.val($selectFilterItem.val()).closest('.form-group').hide();
}
- $startDatetime[0]._flatpickr.setDate(startMoment.toDate());
- $endDatetime[0]._flatpickr.setDate(startMoment.add(1, 'hour').toDate());
+ App.Utils.UI.setDateTimePickerValue($startDatetime, startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($endDatetime, startMoment.add(1, 'hour').toDate());
$dialog.find('.modal-header h3').text(lang('new_unavailability_title'));
$dialog.modal('show');
@@ -183,11 +185,11 @@ App.Components.UnavailabilitiesModal = (function () {
true,
);
- App.Utils.UI.initializeDatetimepicker($startDatetime);
+ App.Utils.UI.initializeDateTimePicker($startDatetime);
$startDatetime.val(start);
- App.Utils.UI.initializeDatetimepicker($endDatetime);
+ App.Utils.UI.initializeDateTimePicker($endDatetime);
$endDatetime.val(end);
diff --git a/assets/js/components/working_plan_exceptions_modal.js b/assets/js/components/working_plan_exceptions_modal.js
index 68a06ecf..bb3b6418 100644
--- a/assets/js/components/working_plan_exceptions_modal.js
+++ b/assets/js/components/working_plan_exceptions_modal.js
@@ -77,19 +77,19 @@ App.Components.WorkingPlanExceptionsModal = (function () {
function validate() {
$modal.find('.is-invalid').removeClass('is-invalid');
- const date = $date[0]._flatpickr.selectedDates[0];
+ const date = App.Utils.UI.getDateTimePickerValue($date);
if (!date) {
$date.addClass('is-invalid');
}
- const start = $start[0]._flatpickr.selectedDates[0];
+ const start = App.Utils.UI.getDateTimePickerValue($start);
if (!start) {
$start.addClass('is-invalid');
}
- const end = $end[0]._flatpickr.selectedDates[0];
+ const end = App.Utils.UI.getDateTimePickerValue($end);
if (!end) {
$end.addClass('is-invalid');
@@ -157,15 +157,15 @@ App.Components.WorkingPlanExceptionsModal = (function () {
return;
}
- const date = moment($date[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD');
+ const date = moment(App.Utils.UI.getDateTimePickerValue($date)).format('YYYY-MM-DD');
const isNonWorkingDay = $isNonWorkingDay.prop('checked');
const workingPlanException = isNonWorkingDay
? null
: {
- start: moment($start[0]._flatpickr.selectedDates[0]).format('HH:mm'),
- end: moment($end[0]._flatpickr.selectedDates[0]).format('HH:mm'),
+ start: moment(App.Utils.UI.getDateTimePickerValue($start)).format('HH:mm'),
+ end: moment(App.Utils.UI.getDateTimePickerValue($end)).format('HH:mm'),
breaks: getBreaks(),
};
@@ -223,9 +223,9 @@ App.Components.WorkingPlanExceptionsModal = (function () {
function add() {
deferred = $.Deferred();
- $date[0]._flatpickr.setDate(new Date());
- $start[0]._flatpickr.setDate(moment('08:00', 'HH:mm').toDate());
- $end[0]._flatpickr.setDate(moment('20:00', 'HH:mm').toDate());
+ App.Utils.UI.setDateTimePickerValue($date, new Date());
+ App.Utils.UI.setDateTimePickerValue($start, moment('08:00', 'HH:mm').toDate());
+ App.Utils.UI.setDateTimePickerValue($end, moment('20:00', 'HH:mm').toDate());
$isNonWorkingDay.prop('checked', false);
@@ -249,11 +249,11 @@ App.Components.WorkingPlanExceptionsModal = (function () {
const isNonWorkingDay = !Boolean(workingPlanException);
- $date[0]._flatpickr.setDate(moment(date, 'YYYY-MM-DD').toDate());
+ App.Utils.UI.setDateTimePickerValue($date, moment(date, 'YYYY-MM-DD').toDate());
if (isNonWorkingDay === false) {
- $start[0]._flatpickr.setDate(moment(workingPlanException.start, 'HH:mm').toDate());
- $end[0]._flatpickr.setDate(moment(workingPlanException.end, 'HH:mm').toDate());
+ App.Utils.UI.setDateTimePickerValue($start, moment(workingPlanException.start, 'HH:mm').toDate());
+ App.Utils.UI.setDateTimePickerValue($end, moment(workingPlanException.end, 'HH:mm').toDate());
if (!workingPlanException.breaks) {
$breaks.find('tbody').html(renderNoBreaksRow());
@@ -267,8 +267,8 @@ App.Components.WorkingPlanExceptionsModal = (function () {
$breaks.find('tbody .working-plan-exceptions-break-start, tbody .working-plan-exceptions-break-end'),
);
} else {
- $start[0]._flatpickr.setDate(moment('08:00', 'HH:mm').toDate());
- $end[0]._flatpickr.setDate(moment('20:00', 'HH:mm').toDate());
+ App.Utils.UI.setDateTimePickerValue($start, moment('08:00', 'HH:mm').toDate());
+ App.Utils.UI.setDateTimePickerValue($end, moment('20:00', 'HH:mm').toDate());
$breaks.find('tbody').html(renderNoBreaksRow());
}
@@ -380,7 +380,7 @@ App.Components.WorkingPlanExceptionsModal = (function () {
// Make all cells in current row editable.
let $tr = $(this).closest('tr');
$tr.children().trigger('edit');
- App.Utils.UI.initializeTimepicker(
+ App.Utils.UI.initializeTimePicker(
$tr.find('.working-plan-exceptions-break-start input, .working-plan-exceptions-break-end input'),
);
$(this).closest('tr').find('.working-plan-exceptions-break-start').focus();
@@ -462,9 +462,9 @@ App.Components.WorkingPlanExceptionsModal = (function () {
* Initialize the module.
*/
function initialize() {
- App.Utils.UI.initializeDatepicker($date);
- App.Utils.UI.initializeTimepicker($start);
- App.Utils.UI.initializeTimepicker($end);
+ App.Utils.UI.initializeDatePicker($date);
+ App.Utils.UI.initializeTimePicker($start);
+ App.Utils.UI.initializeTimePicker($end);
$modal
.on('hidden.bs.modal', onModalHidden)
diff --git a/assets/js/http/booking_http_client.js b/assets/js/http/booking_http_client.js
index be6a1cb0..c5aae91a 100755
--- a/assets/js/http/booking_http_client.js
+++ b/assets/js/http/booking_http_client.js
@@ -300,7 +300,7 @@ App.Http.Booking = (function () {
const currentDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), i);
if (unavailableDates.indexOf(moment(currentDate).format('YYYY-MM-DD')) === -1) {
- $('#select-date')[0]._flatpickr.setDate(currentDate);
+ App.Utils.UI.setDateTimePickerValue($('#select-date'), currentDate);
getAvailableHours(moment(currentDate).format('YYYY-MM-DD'));
break;
}
@@ -328,7 +328,7 @@ App.Http.Booking = (function () {
!unavailableDates.includes(dateQueryParam) &&
dateQueryParamMoment.format('YYYY-MM') === selectedDateMoment.format('YYYY-MM')
) {
- $('#select-date')[0]._flatpickr.setDate(dateQueryParamMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($('#select-date'), dateQueryParamMoment.toDate());
}
}
diff --git a/assets/js/pages/blocked_periods.js b/assets/js/pages/blocked_periods.js
index 9fc57e3e..1b5e70e5 100644
--- a/assets/js/pages/blocked_periods.js
+++ b/assets/js/pages/blocked_periods.js
@@ -123,9 +123,9 @@ App.Pages.BlockedPeriods = (function () {
* Event: Blocked period Save Button "Click"
*/
$blockedPeriods.on('click', '#save-blocked-period', () => {
- const startDateTimeObject = App.Utils.UI.getDatetimepickerValue($startDateTime);
+ const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDateTime);
const startDateTimeMoment = moment(startDateTimeObject);
- const endDateTimeObject = App.Utils.UI.getDatetimepickerValue($endDateTime);
+ const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDateTime);
const endDateTimeMoment = moment(endDateTimeObject);
const blockedPeriod = {
@@ -235,8 +235,8 @@ App.Pages.BlockedPeriods = (function () {
function display(blockedPeriod) {
$id.val(blockedPeriod.id);
$name.val(blockedPeriod.name);
- App.Utils.UI.setDatetimepickerValue($startDateTime, new Date(blockedPeriod.start_datetime));
- App.Utils.UI.setDatetimepickerValue($endDateTime, new Date(blockedPeriod.end_datetime));
+ App.Utils.UI.setDateTimePickerValue($startDateTime, new Date(blockedPeriod.start_datetime));
+ App.Utils.UI.setDateTimePickerValue($endDateTime, new Date(blockedPeriod.end_datetime));
$notes.val(blockedPeriod.notes);
}
@@ -263,8 +263,8 @@ App.Pages.BlockedPeriods = (function () {
throw new Error(lang('fields_are_required'));
}
- const startDateTimeObject = App.Utils.UI.getDatetimepickerValue($startDateTime);
- const endDateTimeObject = App.Utils.UI.getDatetimepickerValue($endDateTime);
+ const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDateTime);
+ const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDateTime);
if (startDateTimeObject >= endDateTimeObject) {
$startDateTime.addClass('is-invalid');
@@ -346,8 +346,8 @@ App.Pages.BlockedPeriods = (function () {
resetForm();
filter('');
addEventListeners();
- App.Utils.UI.initializeDatetimepicker($startDateTime);
- App.Utils.UI.initializeDatetimepicker($endDateTime);
+ App.Utils.UI.initializeDateTimePicker($startDateTime);
+ App.Utils.UI.initializeDateTimePicker($endDateTime);
}
document.addEventListener('DOMContentLoaded', initialize);
diff --git a/assets/js/pages/booking.js b/assets/js/pages/booking.js
index 255bb8e0..2f68fcbf 100644
--- a/assets/js/pages/booking.js
+++ b/assets/js/pages/booking.js
@@ -82,7 +82,7 @@ App.Pages.Booking = (function () {
// Initialize page's components (tooltips, date pickers etc).
tippy('[data-tippy-content]');
- App.Utils.UI.initializeDatepicker($selectDate, {
+ App.Utils.UI.initializeDatePicker($selectDate, {
inline: true,
minDate: moment().subtract(1, 'day').set({hours: 23, minutes: 59, seconds: 59}).toDate(),
maxDate: moment().add(vars('future_booking_limit'), 'days').toDate(),
@@ -126,7 +126,7 @@ App.Pages.Booking = (function () {
},
});
- $selectDate[0]._flatpickr.setDate(new Date());
+ App.Utils.UI.setDateTimePickerValue($selectDate, new Date());
const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const isTimezoneSupported = $selectTimezone.find(`option[value="${browserTimezone}"]`).length > 0;
@@ -269,7 +269,7 @@ App.Pages.Booking = (function () {
* Event: Timezone "Changed"
*/
$selectTimezone.on('change', () => {
- const date = $selectDate[0]._flatpickr.selectedDates[0];
+ const date = App.Utils.UI.getDateTimePickerValue($selectDate);
if (!date) {
return;
@@ -291,7 +291,7 @@ App.Pages.Booking = (function () {
App.Http.Booking.getUnavailableDates(
$target.val(),
$selectService.val(),
- moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD'),
+ moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD'),
);
updateConfirmFrame();
});
@@ -327,7 +327,7 @@ App.Pages.Booking = (function () {
App.Http.Booking.getUnavailableDates(
$selectProvider.val(),
$target.val(),
- moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD'),
+ moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD'),
);
updateConfirmFrame();
@@ -586,141 +586,120 @@ App.Pages.Booking = (function () {
* customer settings and input for the appointment booking.
*/
function updateConfirmFrame() {
- if ($availableHours.find('.selected-hour').text() === '') {
- return;
+ const serviceOptionText = $selectService.find('option:selected').text();
+ $('.display-selected-service').text(serviceOptionText).removeClass('invisible');
+
+ const providerOptionText = $selectProvider.find('option:selected').text();
+ $('.display-selected-provider').text(providerOptionText).removeClass('invisible');
+
+ if (!$availableHours.find('.selected-hour').text()) {
+ return; // No time is selected, skip the rest of this function...
}
- // Appointment Details
- let selectedDate = $selectDate[0]._flatpickr.selectedDates[0];
-
- if (selectedDate !== null) {
- selectedDate = App.Utils.Date.format(selectedDate, vars('date_format'), vars('time_format'));
- }
+ // Render the appointment details
const serviceId = $selectService.val();
- let servicePrice = '';
- let serviceCurrency = '';
- vars('available_services').forEach((service) => {
- if (Number(service.id) === Number(serviceId) && Number(service.price) > 0) {
- servicePrice = service.price;
- serviceCurrency = service.currency;
- return false; // Break loop
- }
- });
+ const service = vars('available_services').find(
+ (availableService) => Number(availableService.id) === Number(serviceId),
+ );
- $(document)
- .find('.display-selected-service')
- .text($selectService.find('option:selected').text())
- .removeClass('invisible');
+ if (!service) {
+ return; // Service was not found
+ }
- $(document)
- .find('.display-selected-provider')
- .text($selectProvider.find('option:selected').text())
- .removeClass('invisible');
+ const selectedDateObject = App.Utils.UI.getDateTimePickerValue($selectDate);
+ const selectedDateMoment = moment(selectedDateObject);
+ const selectedDate = selectedDateMoment.format('YYYY-MM-DD');
+ const selectedTime = $availableHours.find('.selected-hour').text();
+ const selectedDateTime = `${selectedDate} ${selectedTime}`;
- $('#appointment-details').empty();
+ let formattedSelectedDate;
- $('
', {
- 'html': [
- $('', {
- 'text': lang('appointment'),
- }),
- $('', {
- 'html': [
- $('
', {
- 'text': lang('service') + ': ' + $selectService.find('option:selected').text(),
- }),
- $('
'),
- $('
', {
- 'text': lang('provider') + ': ' + $selectProvider.find('option:selected').text(),
- }),
- $('
'),
- $('
', {
- 'text':
- lang('start') +
- ': ' +
- selectedDate +
- ' ' +
- $availableHours.find('.selected-hour').text(),
- }),
- $('
'),
- $('
', {
- 'text': lang('timezone') + ': ' + $selectTimezone.find('option:selected').text(),
- }),
- $('
'),
- $('
', {
- 'text': lang('price') + ': ' + servicePrice + ' ' + serviceCurrency,
- 'prop': {
- 'hidden': !servicePrice,
- },
- }),
- ],
- }),
- ],
- }).appendTo('#appointment-details');
+ if (selectedDateObject) {
+ formattedSelectedDate = App.Utils.Date.format(
+ selectedDateTime,
+ vars('date_format'),
+ vars('time_format'),
+ true,
+ );
+ }
+
+ const timezoneOptionText = $selectTimezone.find('option:selected').text();
+
+ $('#appointment-details').html(`
+
+
+ ${serviceOptionText}
+
+
+ ${providerOptionText}
+
+
+
+ ${service.duration} ${lang('minutes')}
+
+
+
+ ${formattedSelectedDate}
+
+
+
+ ${timezoneOptionText}
+
+
+
+ ${Number(service.price).toFixed(2)} ${service.currency}
+
+
+ `);
+
+ // Render the customer information
- // Customer Details
const firstName = App.Utils.String.escapeHtml($firstName.val());
const lastName = App.Utils.String.escapeHtml($lastName.val());
- const fullName = firstName + ' ' + lastName;
- const phoneNumber = App.Utils.String.escapeHtml($phoneNumber.val());
+ const fullName = `${firstName} ${lastName}`.trim();
const email = App.Utils.String.escapeHtml($email.val());
+ const phoneNumber = App.Utils.String.escapeHtml($phoneNumber.val());
const address = App.Utils.String.escapeHtml($address.val());
const city = App.Utils.String.escapeHtml($city.val());
const zipCode = App.Utils.String.escapeHtml($zipCode.val());
- $('#customer-details').empty();
+ const addressParts = [];
- $('
', {
- 'html': [
- $('
)', {
- 'text': lang('customer'),
- }),
- $('
', {
- 'html': [
- fullName
- ? $('
', {
- 'text': lang('customer') + ': ' + fullName,
- })
- : null,
- fullName ? $('
') : null,
- phoneNumber
- ? $('
', {
- 'text': lang('phone_number') + ': ' + phoneNumber,
- })
- : null,
- phoneNumber ? $('
') : null,
- email
- ? $('
', {
- 'text': lang('email') + ': ' + email,
- })
- : null,
- email ? $('
') : null,
- address
- ? $('
', {
- 'text': lang('address') + ': ' + address,
- })
- : null,
- address ? $('
') : null,
- city
- ? $('
', {
- 'text': lang('city') + ': ' + city,
- })
- : null,
- city ? $('
') : null,
- zipCode
- ? $('
', {
- 'text': lang('zip_code') + ': ' + zipCode,
- })
- : null,
- zipCode ? $('
') : null,
- ],
- }),
- ],
- }).appendTo('#customer-details');
+ if (city) {
+ addressParts.push(city);
+ }
+
+ if (zipCode) {
+ addressParts.push(zipCode);
+ }
+
+ $('#customer-details').html(`
+
+
+ ${lang('contact_info')}
+
+
+ ${fullName}
+
+
+ ${email}
+
+
+ ${phoneNumber}
+
+
+ ${address}
+
+
+ ${addressParts.join(', ')}
+
+
+ `);
// Update appointment form data for submission to server when the user confirms the appointment.
+
const data = {};
data.customer = {
@@ -736,7 +715,7 @@ App.Pages.Booking = (function () {
data.appointment = {
start_datetime:
- moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD') +
+ moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD') +
' ' +
moment($('.selected-hour').data('value'), 'HH:mm').format('HH:mm') +
':00',
@@ -753,6 +732,7 @@ App.Pages.Booking = (function () {
data.appointment.id = vars('appointment_data').id;
data.customer.id = vars('customer_data').id;
}
+
$('input[name="post_data"]').val(JSON.stringify(data));
}
@@ -772,7 +752,7 @@ App.Pages.Booking = (function () {
);
// Add the duration to the start datetime.
- const selectedDate = moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD');
+ const selectedDate = moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD');
const selectedHour = $('.selected-hour').data('value'); // HH:mm
@@ -807,7 +787,7 @@ App.Pages.Booking = (function () {
// Set Appointment Date
const startMoment = moment(appointment.start_datetime);
- $selectDate[0]._flatpickr.setDate(startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($selectDate, startMoment.toDate());
App.Http.Booking.getAvailableHours(startMoment.format('YYYY-MM-DD'));
// Apply Customer's Data
@@ -833,6 +813,8 @@ App.Pages.Booking = (function () {
}
/**
+ * Update the service description and information.
+ *
* This method updates the HTML content with a brief description of the
* user selected service (only if available in db). This is useful for the
* customers upon selecting the correct service.
@@ -849,41 +831,45 @@ App.Pages.Booking = (function () {
);
if (!service) {
- return;
+ return; // Service not found
}
- $('
', {
- 'text': App.Utils.String.escapeHtml(service.name),
- }).appendTo($serviceDescription);
+ // Render the additional service information
- if (service.description) {
- $('
').appendTo($serviceDescription);
-
- $('
', {
- 'html': App.Utils.String.escapeHtml(service.description).replaceAll('\n', '
'),
- }).appendTo($serviceDescription);
- }
-
- if (service.duration || Number(service.price) > 0 || service.location) {
- $('
').appendTo($serviceDescription);
- }
+ const additionalInfoParts = [];
if (service.duration) {
- $('
', {
- 'text': '[' + lang('duration') + ' ' + service.duration + ' ' + lang('minutes') + ']',
- }).appendTo($serviceDescription);
+ additionalInfoParts.push(`${lang('duration')}: ${service.duration} ${lang('minutes')}`);
}
if (Number(service.price) > 0) {
- $('
', {
- 'text': '[' + lang('price') + ' ' + service.price + ' ' + service.currency + ']',
- }).appendTo($serviceDescription);
+ additionalInfoParts.push(`${lang('price')}: ${service.price} ${service.currency}`);
}
if (service.location) {
- $('
', {
- 'text': '[' + lang('location') + ' ' + service.location + ']',
- }).appendTo($serviceDescription);
+ additionalInfoParts.push(`${lang('location')}: ${service.location}`);
+ }
+
+ if (additionalInfoParts.length) {
+ $(`
+
+ ${additionalInfoParts.join(', ')}
+
+ `).appendTo($serviceDescription);
+ }
+
+ // Render the service description
+
+ if (service.description.length) {
+ const escapedDescription = App.Utils.String.escapeHtml(service.description);
+
+ const multiLineDescription = escapedDescription.replaceAll('\n', '
');
+
+ $(`
+
+ ${multiLineDescription}
+
+ `).appendTo($serviceDescription);
}
}
diff --git a/assets/js/utils/calendar_default_view.js b/assets/js/utils/calendar_default_view.js
index 0edabae4..e8e625d5 100755
--- a/assets/js/utils/calendar_default_view.js
+++ b/assets/js/utils/calendar_default_view.js
@@ -138,10 +138,10 @@ App.Utils.CalendarDefaultView = (function () {
// Set the start and end datetime of the appointment.
startMoment = moment(appointment.start_datetime);
- $appointmentsModal.find('#start-datetime')[0]._flatpickr.setDate(startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#start-datetime'), startMoment.toDate());
endMoment = moment(appointment.end_datetime);
- $appointmentsModal.find('#end-datetime')[0]._flatpickr.setDate(endMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#end-datetime'), endMoment.toDate());
const customer = appointment.customer;
$appointmentsModal.find('#customer-id').val(appointment.id_users_customer);
@@ -183,10 +183,16 @@ App.Utils.CalendarDefaultView = (function () {
// Apply unavailability data to dialog.
$unavailabilitiesModal.find('.modal-header h3').text(lang('edit_unavailability_title'));
- $unavailabilitiesModal.find('#unavailability-start')[0]._flatpickr.setDate(startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue(
+ $unavailabilitiesModal.find('#unavailability-start'),
+ startMoment.toDate(),
+ );
+ App.Utils.UI.setDateTimePickerValue(
+ $unavailabilitiesModal.find('#unavailability-end'),
+ endMoment.toDate(),
+ );
$unavailabilitiesModal.find('#unavailability-id').val(unavailability.id);
$unavailabilitiesModal.find('#unavailability-provider').val(unavailability.id_users_provider);
- $unavailabilitiesModal.find('#unavailability-end')[0]._flatpickr.setDate(endMoment.toDate());
$unavailabilitiesModal.find('#unavailability-notes').val(unavailability.notes);
$unavailabilitiesModal.modal('show');
}
@@ -1057,9 +1063,9 @@ App.Utils.CalendarDefaultView = (function () {
$('#unavailability-provider').trigger('change');
- $('#unavailability-start')[0]._flatpickr.setDate(info.start);
+ App.Utils.UI.setDateTimePickerValue($('#unavailability-start'), info.start);
- $('#unavailability-end')[0]._flatpickr.setDate(info.end);
+ App.Utils.UI.setDateTimePickerValue($('#unavailability-end'), info.end);
messageModal.dispose();
},
@@ -1113,8 +1119,11 @@ App.Utils.CalendarDefaultView = (function () {
}
// Preselect time
- $('#start-datetime')[0]._flatpickr.setDate(info.start);
- $('#end-datetime')[0]._flatpickr.setDate(App.Pages.Calendar.getSelectionEndDate(info));
+ App.Utils.UI.setDateTimePickerValue($('#start-datetime'), info.start);
+ App.Utils.UI.setDateTimePickerValue(
+ $('#end-datetime'),
+ App.Pages.Calendar.getSelectionEndDate(info),
+ );
messageModal.dispose();
},
@@ -1586,10 +1595,13 @@ App.Utils.CalendarDefaultView = (function () {
// Set the start and end datetime of the appointment.
const startDatetimeMoment = moment(appointment.start_datetime);
- $appointmentsModal.find('#start-datetime')[0]._flatpickr.setDate(startDatetimeMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue(
+ $appointmentsModal.find('#start-datetime'),
+ startDatetimeMoment.toDate(),
+ );
const endDatetimeMoment = moment(appointment.end_datetime);
- $appointmentsModal.find('#end-datetime')[0]._flatpickr.setDate(endDatetimeMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#end-datetime'), endDatetimeMoment.toDate());
const customer = appointment.customer;
$appointmentsModal.find('#customer-id').val(appointment.id_users_customer);
diff --git a/assets/js/utils/calendar_table_view.js b/assets/js/utils/calendar_table_view.js
index dfee3514..0a0279f4 100755
--- a/assets/js/utils/calendar_table_view.js
+++ b/assets/js/utils/calendar_table_view.js
@@ -43,25 +43,25 @@ App.Utils.CalendarTableView = (function () {
function addEventListeners() {
$calendar.on('click', '.calendar-header .btn.previous', () => {
const dayInterval = $selectFilterItem.val();
- const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
+ const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDate = moment(currentDate).subtract(1, 'days');
const endDate = startDate.clone().add(dayInterval - 1, 'days');
- $selectDate[0]._flatpickr.setDate(startDate.toDate());
+ App.Utils.UI.setDateTimePickerValue($selectDate, startDate.toDate());
createView(startDate.toDate(), endDate.toDate());
});
$calendar.on('click', '.calendar-header .btn.next', () => {
const dayInterval = $selectFilterItem.val();
- const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
+ const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDate = moment(currentDate).add(1, 'days');
const endDate = startDate.clone().add(dayInterval - 1, 'days');
- $selectDate[0]._flatpickr.setDate(startDate.toDate());
+ App.Utils.UI.setDateTimePickerValue($selectDate, startDate.toDate());
createView(startDate.toDate(), endDate.toDate());
});
$calendarToolbar.on('change', '#select-filter-item', () => {
const dayInterval = $selectFilterItem.val();
- const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
+ const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDate = moment(currentDate);
const endDate = startDate.clone().add(dayInterval - 1, 'days');
createView(startDate.toDate(), endDate.toDate());
@@ -70,7 +70,7 @@ App.Utils.CalendarTableView = (function () {
$calendarToolbar.on('click', '#reload-appointments', () => {
// Fetch the events and place them in the existing HTML format.
const dayInterval = $selectFilterItem.val();
- const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
+ const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDateMoment = moment(currentDate);
const startDate = startDateMoment.toDate();
const endDateMoment = startDateMoment.clone().add(dayInterval - 1, 'days');
@@ -212,10 +212,10 @@ App.Utils.CalendarTableView = (function () {
// Set the start and end datetime of the appointment.
startMoment = moment(appointment.start_datetime);
- $appointmentsModal.find('#start-datetime')[0]._flatpickr.setDate(startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#start-datetime'), startMoment.toDate());
endMoment = moment(appointment.end_datetime);
- $appointmentsModal.find('#end-datetime')[0]._flatpickr.setDate(endMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#end-datetime'), endMoment.toDate());
const customer = appointment.customer;
$appointmentsModal.find('#customer-id').val(appointment.id_users_customer);
@@ -257,10 +257,10 @@ App.Utils.CalendarTableView = (function () {
// Apply unavailability data to dialog.
$unavailabilitiesModal.find('.modal-header h3').text(lang('edit_unavailability_title'));
- $unavailabilitiesModal.find('#unavailability-start')[0]._flatpickr.setDate(startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($('#unavailability-start'), startMoment.toDate());
+ App.Utils.UI.setDateTimePickerValue($('#unavailability-end'), endMoment.toDate());
$unavailabilitiesModal.find('#unavailability-id').val(unavailability.id);
$unavailabilitiesModal.find('#unavailability-provider').val(unavailability.id_users_provider);
- $unavailabilitiesModal.find('#unavailability-end')[0]._flatpickr.setDate(endMoment.toDate());
$unavailabilitiesModal.find('#unavailability-notes').val(unavailability.notes);
$unavailabilitiesModal.modal('show');
@@ -389,7 +389,7 @@ App.Utils.CalendarTableView = (function () {
],
}).appendTo($calendarHeader);
- App.Utils.UI.initializeDatepicker($calendarHeader.find('.select-date'), {
+ App.Utils.UI.initializeDatePicker($calendarHeader.find('.select-date'), {
onChange(selectedDates) {
const startDate = selectedDates[0];
const endDate = moment(startDate)
@@ -1742,9 +1742,8 @@ App.Utils.CalendarTableView = (function () {
$('#unavailability-provider').trigger('change');
- $('#unavailability-start')[0]._flatpickr.setDate(info.start);
-
- $('#unavailability-end')[0]._flatpickr.setDate(info.end);
+ App.Utils.UI.setDateTimePickerValue($('#unavailability-start'), info.start);
+ App.Utils.UI.setDateTimePickerValue($('#unavailability-end'), info.end);
messageModal.dispose();
},
@@ -1783,8 +1782,11 @@ App.Utils.CalendarTableView = (function () {
$selectProvider.trigger('change');
// Preselect time
- $('#start-datetime')[0]._flatpickr.setDate(info.start);
- $('#end-datetime')[0]._flatpickr.setDate(App.Pages.Calendar.getSelectionEndDate(info));
+ App.Utils.UI.setDateTimePickerValue($('#start-datetime'), info.start);
+ App.Utils.UI.setDateTimePickerValue(
+ $('#end-datetime'),
+ App.Pages.Calendar.getSelectionEndDate(info),
+ );
messageModal.dispose();
},
diff --git a/assets/js/utils/ui.js b/assets/js/utils/ui.js
index 882be9b0..2b573f32 100644
--- a/assets/js/utils/ui.js
+++ b/assets/js/utils/ui.js
@@ -148,7 +148,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Object} [params]
*/
- function initializeDatetimepicker($target, params = {}) {
+ function initializeDateTimePicker($target, params = {}) {
$target.flatpickr({
enableTime: true,
allowInput: true,
@@ -168,7 +168,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Object} [params]
*/
- function initializeDatepicker($target, params = {}) {
+ function initializeDatePicker($target, params = {}) {
$target.flatpickr({
allowInput: true,
dateFormat: getDateFormat(),
@@ -186,7 +186,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Object} [params]
*/
- function initializeTimepicker($target, params = {}) {
+ function initializeTimePicker($target, params = {}) {
$target.flatpickr({
noCalendar: true,
enableTime: true,
@@ -230,7 +230,7 @@ window.App.Utils.UI = (function () {
*
* @return {Date}
*/
- function getDatetimepickerValue($target) {
+ function getDateTimePickerValue($target) {
if (!$target?.length) {
throw new Error('Empty $target argument provided.');
}
@@ -244,7 +244,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Date} value
*/
- function setDatetimepickerValue($target, value) {
+ function setDateTimePickerValue($target, value) {
if (!$target?.length) {
throw new Error('Empty $target argument provided.');
}
@@ -253,12 +253,12 @@ window.App.Utils.UI = (function () {
}
return {
- initializeDatetimepicker,
- initializeDatepicker,
- initializeTimepicker,
+ initializeDateTimePicker,
+ initializeDatePicker,
+ initializeTimePicker,
initializeDropdown,
initializeTextEditor,
- getDatetimepickerValue,
- setDatetimepickerValue,
+ getDateTimePickerValue,
+ setDateTimePickerValue,
};
})();
diff --git a/assets/js/utils/working_plan.js b/assets/js/utils/working_plan.js
index 0b670e70..dd02937e 100755
--- a/assets/js/utils/working_plan.js
+++ b/assets/js/utils/working_plan.js
@@ -15,6 +15,8 @@
* This module implements the functionality of working plans.
*/
App.Utils.WorkingPlan = (function () {
+ const moment = window.moment;
+
/**
* Class WorkingPlan
*
@@ -480,7 +482,7 @@ App.Utils.WorkingPlan = (function () {
$tr.children().trigger('edit');
- App.Utils.UI.initializeTimepicker($tr.find('.break-start input, .break-end input'));
+ App.Utils.UI.initializeTimePicker($tr.find('.break-start input, .break-end input'));
$tr.find('.break-day select').focus();
@@ -686,16 +688,16 @@ App.Utils.WorkingPlan = (function () {
disabled = disabled || false;
if (disabled === false) {
- App.Utils.UI.initializeTimepicker($('.working-plan input:text'), {
+ App.Utils.UI.initializeTimePicker($('.working-plan input:text'), {
onChange: (selectedDates, dateStr, instance) => {
const startMoment = moment(selectedDates[0]);
const $workEnd = $(instance.input).closest('tr').find('.work-end');
- const endMoment = moment($workEnd[0]._flatpickr.selectedDates[0]);
+ const endMoment = moment(App.Utils.UI.getDateTimePickerValue($workEnd));
if (startMoment > endMoment) {
- $workEnd[0]._flatpickr.setDate(startMoment.add(1, 'hour').toDate());
+ App.Utils.UI.setDateTimePickerValue($workEnd, startMoment.add(1, 'hour').toDate());
}
},
});