Converted the booking page view files to the layout structure
This commit is contained in:
parent
2479ffb3a1
commit
d96e65792b
11 changed files with 542 additions and 499 deletions
|
@ -195,7 +195,7 @@ class Appointments extends EA_Controller {
|
|||
$variables['exceptions'][] = $e;
|
||||
}
|
||||
|
||||
$this->load->view('appointments/book', $variables);
|
||||
$this->load->layout('layouts/booking/booking_layout', 'pages/booking/booking_page', $variables);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,498 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* @var string $company_name
|
||||
* @var string $customer_token
|
||||
* @var string $date_format
|
||||
* @var string $time_format
|
||||
* @var string $first_weekday
|
||||
* @var bool $manage_mode
|
||||
* @var array $appointment_data
|
||||
* @var array $provider_data
|
||||
* @var array $customer_data
|
||||
* @var array $available_services
|
||||
* @var array $available_providers
|
||||
* @var array $show_field
|
||||
* @var bool $require_phone_number
|
||||
* @var string $display_any_provider
|
||||
* @var string $display_terms_and_conditions
|
||||
* @var string $display_privacy_policy
|
||||
* @var string $display_cookie_notice
|
||||
*/
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="theme-color" content="#35A768">
|
||||
<title><?= lang('page_title') . ' ' . $company_name ?></title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/vendor/bootstrap/bootstrap.min.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/vendor/jquery-ui-dist/jquery-ui.min.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/vendor/cookieconsent/cookieconsent.min.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/frontend.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/general.css') ?>">
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
|
||||
<link rel="icon" sizes="192x192" href="<?= asset_url('assets/img/logo.png') ?>">
|
||||
|
||||
<script src="<?= asset_url('assets/vendor/@fortawesome-fontawesome-free/fontawesome.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/@fortawesome-fontawesome-free/solid.min.js') ?>"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="main" class="container">
|
||||
<div class="row wrapper">
|
||||
<div id="book-appointment-wizard" class="col-12 col-lg-10 col-xl-8">
|
||||
|
||||
<!-- FRAME TOP BAR -->
|
||||
|
||||
<div id="header">
|
||||
<span id="company-name"><?= $company_name ?></span>
|
||||
|
||||
<div id="steps">
|
||||
<div id="step-1" class="book-step active-step"
|
||||
data-tippy-content="<?= lang('service_and_provider') ?>">
|
||||
<strong>1</strong>
|
||||
</div>
|
||||
|
||||
<div id="step-2" class="book-step" data-toggle="tooltip"
|
||||
data-tippy-content="<?= lang('appointment_date_and_time') ?>">
|
||||
<strong>2</strong>
|
||||
</div>
|
||||
<div id="step-3" class="book-step" data-toggle="tooltip"
|
||||
data-tippy-content="<?= lang('customer_information') ?>">
|
||||
<strong>3</strong>
|
||||
</div>
|
||||
<div id="step-4" class="book-step" data-toggle="tooltip"
|
||||
data-tippy-content="<?= lang('appointment_confirmation') ?>">
|
||||
<strong>4</strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($manage_mode): ?>
|
||||
<div id="cancel-appointment-frame" class="row booking-header-bar">
|
||||
<div class="col-12 col-md-10">
|
||||
<small><?= lang('cancel_appointment_hint') ?></small>
|
||||
</div>
|
||||
<div class="col-12 col-md-2">
|
||||
<form id="cancel-appointment-form" method="post"
|
||||
action="<?= site_url('appointments/cancel/' . $appointment_data['hash']) ?>">
|
||||
|
||||
<input type="hidden" name="csrfToken" value="<?= $this->security->get_csrf_hash() ?>"/>
|
||||
|
||||
<input id="cancel-reason" name="cancel_reason" type="hidden">
|
||||
|
||||
<button id="cancel-appointment" class="btn btn-warning btn-sm">
|
||||
<?= lang('cancel') ?>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="booking-header-bar row">
|
||||
<div class="col-12 col-md-10">
|
||||
<small><?= lang('delete_personal_information_hint') ?></small>
|
||||
</div>
|
||||
<div class="col-12 col-md-2">
|
||||
<button id="delete-personal-information"
|
||||
class="btn btn-danger btn-sm"><?= lang('delete') ?></button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<!-- SELECT SERVICE AND PROVIDER -->
|
||||
|
||||
<div id="wizard-frame-1" class="wizard-frame">
|
||||
<div class="frame-container">
|
||||
<h2 class="frame-title"><?= lang('service_and_provider') ?></h2>
|
||||
|
||||
<div class="row frame-content">
|
||||
<div class="col">
|
||||
<div class="form-group">
|
||||
<label for="select-service">
|
||||
<strong><?= lang('service') ?></strong>
|
||||
</label>
|
||||
|
||||
<select id="select-service" class="form-control">
|
||||
<?php
|
||||
// Group services by category, only if there is at least one service with a parent category.
|
||||
$has_category = FALSE;
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
if ( ! empty($service['category_id']))
|
||||
{
|
||||
$has_category = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($has_category)
|
||||
{
|
||||
$grouped_services = [];
|
||||
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
if ( ! empty($service['category_id']))
|
||||
{
|
||||
if ( ! isset($grouped_services[$service['category_name']]))
|
||||
{
|
||||
$grouped_services[$service['category_name']] = [];
|
||||
}
|
||||
|
||||
$grouped_services[$service['category_name']][] = $service;
|
||||
}
|
||||
}
|
||||
|
||||
// We need the uncategorized services at the end of the list so we will use
|
||||
// another iteration only for the uncategorized services.
|
||||
$grouped_services['uncategorized'] = [];
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
if ($service['category_id'] == NULL)
|
||||
{
|
||||
$grouped_services['uncategorized'][] = $service;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($grouped_services as $key => $group)
|
||||
{
|
||||
$group_label = $key !== 'uncategorized'
|
||||
? $group[0]['category_name']
|
||||
: 'Uncategorized';
|
||||
|
||||
if (count($group) > 0)
|
||||
{
|
||||
echo '<optgroup label="' . $group_label . '">';
|
||||
foreach ($group as $service)
|
||||
{
|
||||
echo '<option value="' . $service['id'] . '">'
|
||||
. $service['name'] . '</option>';
|
||||
}
|
||||
echo '</optgroup>';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
echo '<option value="' . $service['id'] . '">' . $service['name'] . '</option>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="select-provider">
|
||||
<strong><?= lang('provider') ?></strong>
|
||||
</label>
|
||||
|
||||
<select id="select-provider" class="form-control"></select>
|
||||
</div>
|
||||
|
||||
<div id="service-description"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="command-buttons">
|
||||
<span> </span>
|
||||
|
||||
<button type="button" id="button-next-1" class="btn button-next btn-dark"
|
||||
data-step_index="1">
|
||||
<?= lang('next') ?>
|
||||
<i class="fas fa-chevron-right ml-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SELECT APPOINTMENT DATE -->
|
||||
|
||||
<div id="wizard-frame-2" class="wizard-frame" style="display:none;">
|
||||
<div class="frame-container">
|
||||
|
||||
<h2 class="frame-title"><?= lang('appointment_date_and_time') ?></h2>
|
||||
|
||||
<div class="row frame-content">
|
||||
<div class="col-12 col-md-6">
|
||||
<div id="select-date"></div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6">
|
||||
<div id="select-time">
|
||||
<div class="form-group">
|
||||
<label for="select-timezone"><?= lang('timezone') ?></label>
|
||||
<?= render_timezone_dropdown('id="select-timezone" class="form-control" value="UTC"'); ?>
|
||||
</div>
|
||||
|
||||
<div id="available-hours"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="command-buttons">
|
||||
<button type="button" id="button-back-2" class="btn button-back btn-outline-secondary"
|
||||
data-step_index="2">
|
||||
<i class="fas fa-chevron-left mr-2"></i>
|
||||
<?= lang('back') ?>
|
||||
</button>
|
||||
<button type="button" id="button-next-2" class="btn button-next btn-dark"
|
||||
data-step_index="2">
|
||||
<?= lang('next') ?>
|
||||
<i class="fas fa-chevron-right ml-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ENTER CUSTOMER DATA -->
|
||||
|
||||
<div id="wizard-frame-3" class="wizard-frame" style="display:none;">
|
||||
<div class="frame-container">
|
||||
|
||||
<h2 class="frame-title"><?= lang('customer_information') ?></h2>
|
||||
|
||||
<div class="row frame-content">
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="first-name" class="control-label">
|
||||
<?= lang('first_name') ?>
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<input type="text" id="first-name" class="required form-control" maxlength="100"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="last-name" class="control-label">
|
||||
<?= lang('last_name') ?>
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<input type="text" id="last-name" class="required form-control" maxlength="120"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email" class="control-label">
|
||||
<?= lang('email') ?>
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<input type="text" id="email" class="required form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php if ($show_field['phone-number']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="phone-number" class="control-label">
|
||||
<?= lang('phone_number') ?>
|
||||
<?= $require_phone_number === '1' ? '<span class="text-danger">*</span>' : '' ?>
|
||||
</label>
|
||||
<input type="text" id="phone-number" maxlength="60"
|
||||
class="<?= $require_phone_number === '1' ? 'required' : '' ?> form-control"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6">
|
||||
<?php if ($show_field['address']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="address" class="control-label">
|
||||
<?= lang('address') ?>
|
||||
</label>
|
||||
<input type="text" id="address" class="form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($show_field['city']): ?>
|
||||
<div class="form-group">
|
||||
<label for="city" class="control-label">
|
||||
<?= lang('city') ?>
|
||||
</label>
|
||||
<input type="text" id="city" class="form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($show_field['zip-code']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="zip-code" class="control-label">
|
||||
<?= lang('zip_code') ?>
|
||||
</label>
|
||||
<input type="text" id="zip-code" class="form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($show_field['notes']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="notes" class="control-label">
|
||||
<?= lang('notes') ?>
|
||||
</label>
|
||||
<textarea id="notes" maxlength="500" class="form-control" rows="1"></textarea>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($display_terms_and_conditions): ?>
|
||||
<div class="form-check mb-3">
|
||||
<input type="checkbox" class="required form-check-input" id="accept-to-terms-and-conditions">
|
||||
<label class="form-check-label" for="accept-to-terms-and-conditions">
|
||||
<?= strtr(lang('read_and_agree_to_terms_and_conditions'),
|
||||
[
|
||||
'{$link}' => '<a href="#" data-toggle="modal" data-target="#terms-and-conditions-modal">',
|
||||
'{/$link}' => '</a>'
|
||||
])
|
||||
?>
|
||||
</label>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($display_privacy_policy): ?>
|
||||
<div class="form-check mb-3">
|
||||
<input type="checkbox" class="required form-check-input" id="accept-to-privacy-policy">
|
||||
<label class="form-check-label" for="accept-to-privacy-policy">
|
||||
<?= strtr(lang('read_and_agree_to_privacy_policy'),
|
||||
[
|
||||
'{$link}' => '<a href="#" data-toggle="modal" data-target="#privacy-policy-modal">',
|
||||
'{/$link}' => '</a>'
|
||||
])
|
||||
?>
|
||||
</label>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<div class="command-buttons">
|
||||
<button type="button" id="button-back-3" class="btn button-back btn-outline-secondary"
|
||||
data-step_index="3">
|
||||
<i class="fas fa-chevron-left mr-2"></i>
|
||||
<?= lang('back') ?>
|
||||
</button>
|
||||
<button type="button" id="button-next-3" class="btn button-next btn-dark"
|
||||
data-step_index="3">
|
||||
<?= lang('next') ?>
|
||||
<i class="fas fa-chevron-right ml-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- APPOINTMENT DATA CONFIRMATION -->
|
||||
|
||||
<div id="wizard-frame-4" class="wizard-frame" style="display:none;">
|
||||
<div class="frame-container">
|
||||
<h2 class="frame-title"><?= lang('appointment_confirmation') ?></h2>
|
||||
<div class="row frame-content">
|
||||
<div id="appointment-details" class="col-12 col-md-6"></div>
|
||||
<div id="customer-details" class="col-12 col-md-6"></div>
|
||||
</div>
|
||||
<?php if (setting('require_captcha')): ?>
|
||||
<div class="row frame-content">
|
||||
<div class="col-12 col-md-6">
|
||||
<label class="captcha-title" for="captcha-text">
|
||||
CAPTCHA
|
||||
<button class="btn btn-link text-dark text-decoration-none py-0">
|
||||
<i class="fas fa-sync-alt"></i>
|
||||
</button>
|
||||
</label>
|
||||
<img class="captcha-image" src="<?= site_url('captcha') ?>" alt="CAPTCHA">
|
||||
<input id="captcha-text" class="captcha-text form-control" type="text" value=""/>
|
||||
<span id="captcha-hint" class="help-block" style="opacity:0"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="command-buttons">
|
||||
<button type="button" id="button-back-4" class="btn button-back btn-outline-secondary"
|
||||
data-step_index="4">
|
||||
<i class="fas fa-chevron-left mr-2"></i>
|
||||
<?= lang('back') ?>
|
||||
</button>
|
||||
<form id="book-appointment-form" style="display:inline-block" method="post">
|
||||
<button id="book-appointment-submit" type="button" class="btn btn-success">
|
||||
<i class="fas fa-check-square mr-2"></i>
|
||||
<?= ! $manage_mode ? lang('confirm') : lang('update') ?>
|
||||
</button>
|
||||
<input type="hidden" name="csrfToken"/>
|
||||
<input type="hidden" name="post_data"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- FRAME FOOTER -->
|
||||
|
||||
<div id="frame-footer">
|
||||
<small>
|
||||
<span class="footer-powered-by">
|
||||
Powered By
|
||||
|
||||
<a href="https://easyappointments.org" target="_blank">Easy!Appointments</a>
|
||||
</span>
|
||||
|
||||
<span class="footer-options">
|
||||
<span id="select-language" class="badge badge-secondary">
|
||||
<i class="fas fa-language mr-2"></i>
|
||||
<?= ucfirst(config('language')) ?>
|
||||
</span>
|
||||
|
||||
<a class="backend-link badge badge-primary" href="<?= site_url('backend'); ?>">
|
||||
<i class="fas fa-sign-in-alt mr-2"></i>
|
||||
<?= $this->session->user_id ? lang('backend_section') : lang('login') ?>
|
||||
</a>
|
||||
</span>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($display_cookie_notice === '1'): ?>
|
||||
<?php require __DIR__ . '/../modals/cookie_notice_modal.php' ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($display_terms_and_conditions === '1'): ?>
|
||||
<?php require __DIR__ . '/../modals/terms_and_conditions_modal.php' ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($display_privacy_policy === '1'): ?>
|
||||
<?php require __DIR__ . '/../modals/privacy_policy_modal.php' ?>
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
var GlobalVariables = {
|
||||
availableServices: <?= json_encode($available_services) ?>,
|
||||
availableProviders: <?= json_encode($available_providers) ?>,
|
||||
baseUrl: <?= json_encode(config('base_url')) ?>,
|
||||
manageMode: <?= $manage_mode ? 'true' : 'false' ?>,
|
||||
customerToken: <?= json_encode($customer_token) ?>,
|
||||
dateFormat: <?= json_encode($date_format) ?>,
|
||||
timeFormat: <?= json_encode($time_format) ?>,
|
||||
firstWeekday: <?= json_encode($first_weekday) ?>,
|
||||
displayCookieNotice: <?= json_encode($display_cookie_notice === '1') ?>,
|
||||
appointmentData: <?= json_encode($appointment_data) ?>,
|
||||
providerData: <?= json_encode($provider_data) ?>,
|
||||
customerData: <?= json_encode($customer_data) ?>,
|
||||
displayAnyProvider: <?= json_encode($display_any_provider) ?>,
|
||||
csrfToken: <?= json_encode($this->security->get_csrf_hash()) ?>
|
||||
};
|
||||
|
||||
var EALang = <?= json_encode($this->lang->language) ?>;
|
||||
var availableLanguages = <?= json_encode(config('available_languages')) ?>;
|
||||
</script>
|
||||
|
||||
<script src="<?= asset_url('assets/js/general_functions.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/jquery/jquery.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/jquery-ui-dist/jquery-ui.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/cookieconsent/cookieconsent.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/@popperjs-core/popper.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/bootstrap/bootstrap.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/tippy.js/tippy-bundle.umd.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/datejs/date.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/moment/moment.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/moment-timezone/moment-timezone-with-data.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/js/frontend_book_api.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/js/frontend_book.js') ?>"></script>
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
FrontendBook.initialize(true, GlobalVariables.manageMode);
|
||||
GeneralFunctions.enableLanguageSelection($('#select-language'));
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php google_analytics_script(); ?>
|
||||
</body>
|
||||
</html>
|
21
application/views/layouts/booking/booking_footer.php
Normal file
21
application/views/layouts/booking/booking_footer.php
Normal file
|
@ -0,0 +1,21 @@
|
|||
<div id="frame-footer">
|
||||
<small>
|
||||
<span class="footer-powered-by">
|
||||
Powered By
|
||||
|
||||
<a href="https://easyappointments.org" target="_blank">Easy!Appointments</a>
|
||||
</span>
|
||||
|
||||
<span class="footer-options">
|
||||
<span id="select-language" class="badge badge-secondary">
|
||||
<i class="fas fa-language mr-2"></i>
|
||||
<?= ucfirst(config('language')) ?>
|
||||
</span>
|
||||
|
||||
<a class="backend-link badge badge-primary" href="<?= site_url('backend'); ?>">
|
||||
<i class="fas fa-sign-in-alt mr-2"></i>
|
||||
<?= session('user_id') ? lang('backend_section') : lang('login') ?>
|
||||
</a>
|
||||
</span>
|
||||
</small>
|
||||
</div>
|
29
application/views/layouts/booking/booking_header.php
Normal file
29
application/views/layouts/booking/booking_header.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
/**
|
||||
* @var string $company_name
|
||||
*/
|
||||
?>
|
||||
|
||||
<div id="header">
|
||||
<span id="company-name"><?= $company_name ?></span>
|
||||
|
||||
<div id="steps">
|
||||
<div id="step-1" class="book-step active-step"
|
||||
data-tippy-content="<?= lang('service_and_provider') ?>">
|
||||
<strong>1</strong>
|
||||
</div>
|
||||
|
||||
<div id="step-2" class="book-step" data-toggle="tooltip"
|
||||
data-tippy-content="<?= lang('appointment_date_and_time') ?>">
|
||||
<strong>2</strong>
|
||||
</div>
|
||||
<div id="step-3" class="book-step" data-toggle="tooltip"
|
||||
data-tippy-content="<?= lang('customer_information') ?>">
|
||||
<strong>3</strong>
|
||||
</div>
|
||||
<div id="step-4" class="book-step" data-toggle="tooltip"
|
||||
data-tippy-content="<?= lang('appointment_confirmation') ?>">
|
||||
<strong>4</strong>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
116
application/views/layouts/booking/booking_layout.php
Normal file
116
application/views/layouts/booking/booking_layout.php
Normal file
|
@ -0,0 +1,116 @@
|
|||
<?php
|
||||
/**
|
||||
* @var string $company_name
|
||||
* @var string $customer_token
|
||||
* @var string $date_format
|
||||
* @var string $time_format
|
||||
* @var string $first_weekday
|
||||
* @var bool $manage_mode
|
||||
* @var array $appointment_data
|
||||
* @var array $provider_data
|
||||
* @var array $customer_data
|
||||
* @var array $available_services
|
||||
* @var array $available_providers
|
||||
* @var array $show_field
|
||||
* @var bool $require_phone_number
|
||||
* @var string $display_any_provider
|
||||
* @var string $display_terms_and_conditions
|
||||
* @var string $display_privacy_policy
|
||||
* @var string $display_cookie_notice
|
||||
* @var string $page_path
|
||||
*/
|
||||
?>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="theme-color" content="#35A768">
|
||||
<title><?= lang('page_title') . ' ' . $company_name ?></title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/vendor/bootstrap/bootstrap.min.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/vendor/jquery-ui-dist/jquery-ui.min.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/vendor/cookieconsent/cookieconsent.min.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/frontend.css') ?>">
|
||||
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/general.css') ?>">
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
|
||||
<link rel="icon" sizes="192x192" href="<?= asset_url('assets/img/logo.png') ?>">
|
||||
|
||||
<script src="<?= asset_url('assets/vendor/@fortawesome-fontawesome-free/fontawesome.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/@fortawesome-fontawesome-free/solid.min.js') ?>"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="main" class="container">
|
||||
<div class="row wrapper">
|
||||
<div id="book-appointment-wizard" class="col-12 col-lg-10 col-xl-8">
|
||||
|
||||
<?php require __DIR__ . '/booking_header.php' ?>
|
||||
|
||||
<?php require $page_path ?>
|
||||
|
||||
<?php require __DIR__ . '/booking_footer.php' ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($display_cookie_notice === '1'): ?>
|
||||
<?php require __DIR__ . '/../modals/cookie_notice_modal.php' ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($display_terms_and_conditions === '1'): ?>
|
||||
<?php require __DIR__ . '/../modals/terms_and_conditions_modal.php' ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($display_privacy_policy === '1'): ?>
|
||||
<?php require __DIR__ . '/../modals/privacy_policy_modal.php' ?>
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
var GlobalVariables = {
|
||||
availableServices: <?= json_encode($available_services) ?>,
|
||||
availableProviders: <?= json_encode($available_providers) ?>,
|
||||
baseUrl: <?= json_encode(config('base_url')) ?>,
|
||||
manageMode: <?= $manage_mode ? 'true' : 'false' ?>,
|
||||
customerToken: <?= json_encode($customer_token) ?>,
|
||||
dateFormat: <?= json_encode($date_format) ?>,
|
||||
timeFormat: <?= json_encode($time_format) ?>,
|
||||
firstWeekday: <?= json_encode($first_weekday) ?>,
|
||||
displayCookieNotice: <?= json_encode($display_cookie_notice === '1') ?>,
|
||||
appointmentData: <?= json_encode($appointment_data) ?>,
|
||||
providerData: <?= json_encode($provider_data) ?>,
|
||||
customerData: <?= json_encode($customer_data) ?>,
|
||||
displayAnyProvider: <?= json_encode($display_any_provider) ?>,
|
||||
csrfToken: <?= json_encode($this->security->get_csrf_hash()) ?>
|
||||
};
|
||||
|
||||
var EALang = <?= json_encode($this->lang->language) ?>;
|
||||
var availableLanguages = <?= json_encode(config('available_languages')) ?>;
|
||||
</script>
|
||||
|
||||
<script src="<?= asset_url('assets/js/general_functions.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/jquery/jquery.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/jquery-ui-dist/jquery-ui.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/cookieconsent/cookieconsent.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/@popperjs-core/popper.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/bootstrap/bootstrap.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/tippy.js/tippy-bundle.umd.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/datejs/date.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/moment/moment.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/vendor/moment-timezone/moment-timezone-with-data.min.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/js/frontend_book_api.js') ?>"></script>
|
||||
<script src="<?= asset_url('assets/js/frontend_book.js') ?>"></script>
|
||||
|
||||
<script>
|
||||
$(function () {
|
||||
FrontendBook.initialize(true, GlobalVariables.manageMode);
|
||||
GeneralFunctions.enableLanguageSelection($('#select-language'));
|
||||
});
|
||||
</script>
|
||||
|
||||
<?php google_analytics_script(); ?>
|
||||
</body>
|
||||
</html>
|
36
application/views/pages/booking/booking_cancellation.php
Normal file
36
application/views/pages/booking/booking_cancellation.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
/**
|
||||
* @var bool $manage_mode
|
||||
* @var array $appointment_data
|
||||
*/
|
||||
?>
|
||||
|
||||
<?php if ($manage_mode): ?>
|
||||
<div id="cancel-appointment-frame" class="row booking-header-bar">
|
||||
<div class="col-12 col-md-10">
|
||||
<small><?= lang('cancel_appointment_hint') ?></small>
|
||||
</div>
|
||||
<div class="col-12 col-md-2">
|
||||
<form id="cancel-appointment-form" method="post"
|
||||
action="<?= site_url('appointments/cancel/' . $appointment_data['hash']) ?>">
|
||||
|
||||
<input type="hidden" name="csrfToken" value="<?= $this->security->get_csrf_hash() ?>"/>
|
||||
|
||||
<input id="cancel-reason" name="cancel_reason" type="hidden">
|
||||
|
||||
<button id="cancel-appointment" class="btn btn-warning btn-sm">
|
||||
<?= lang('cancel') ?>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="booking-header-bar row">
|
||||
<div class="col-12 col-md-10">
|
||||
<small><?= lang('delete_personal_information_hint') ?></small>
|
||||
</div>
|
||||
<div class="col-12 col-md-2">
|
||||
<button id="delete-personal-information"
|
||||
class="btn btn-danger btn-sm"><?= lang('delete') ?></button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
41
application/views/pages/booking/booking_page.php
Executable file
41
application/views/pages/booking/booking_page.php
Executable file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
/**
|
||||
* @var string $company_name
|
||||
* @var string $customer_token
|
||||
* @var string $date_format
|
||||
* @var string $time_format
|
||||
* @var string $first_weekday
|
||||
* @var bool $manage_mode
|
||||
* @var array $appointment_data
|
||||
* @var array $provider_data
|
||||
* @var array $customer_data
|
||||
* @var array $available_services
|
||||
* @var array $available_providers
|
||||
* @var array $show_field
|
||||
* @var bool $require_phone_number
|
||||
* @var string $display_any_provider
|
||||
* @var string $display_terms_and_conditions
|
||||
* @var string $display_privacy_policy
|
||||
* @var string $display_cookie_notice
|
||||
*/
|
||||
?>
|
||||
|
||||
<!-- Booking Cancellation Frame -->
|
||||
|
||||
<?php require __DIR__ . '/booking_cancellation.php' ?>
|
||||
|
||||
<!-- Select Service & Provider -->
|
||||
|
||||
<?php require __DIR__ . '/booking_step_1.php' ?>
|
||||
|
||||
<!-- Pick An Appointment Date -->
|
||||
|
||||
<?php require __DIR__ .'/booking_step_2.php' ?>
|
||||
|
||||
<!-- Enter Customer Information -->
|
||||
|
||||
<?php require __DIR__ . '/booking_step_3.php' ?>
|
||||
|
||||
<!-- Appointment Data Confirmation -->
|
||||
|
||||
<?php require __DIR__ . '/booking_step_4.php' ?>
|
104
application/views/pages/booking/booking_step_1.php
Normal file
104
application/views/pages/booking/booking_step_1.php
Normal file
|
@ -0,0 +1,104 @@
|
|||
<div id="wizard-frame-1" class="wizard-frame">
|
||||
<div class="frame-container">
|
||||
<h2 class="frame-title"><?= lang('service_and_provider') ?></h2>
|
||||
|
||||
<div class="row frame-content">
|
||||
<div class="col">
|
||||
<div class="form-group">
|
||||
<label for="select-service">
|
||||
<strong><?= lang('service') ?></strong>
|
||||
</label>
|
||||
|
||||
<select id="select-service" class="form-control">
|
||||
<?php
|
||||
// Group services by category, only if there is at least one service with a parent category.
|
||||
$has_category = FALSE;
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
if ( ! empty($service['category_id']))
|
||||
{
|
||||
$has_category = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($has_category)
|
||||
{
|
||||
$grouped_services = [];
|
||||
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
if ( ! empty($service['category_id']))
|
||||
{
|
||||
if ( ! isset($grouped_services[$service['category_name']]))
|
||||
{
|
||||
$grouped_services[$service['category_name']] = [];
|
||||
}
|
||||
|
||||
$grouped_services[$service['category_name']][] = $service;
|
||||
}
|
||||
}
|
||||
|
||||
// We need the uncategorized services at the end of the list so we will use
|
||||
// another iteration only for the uncategorized services.
|
||||
$grouped_services['uncategorized'] = [];
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
if ($service['category_id'] == NULL)
|
||||
{
|
||||
$grouped_services['uncategorized'][] = $service;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($grouped_services as $key => $group)
|
||||
{
|
||||
$group_label = $key !== 'uncategorized'
|
||||
? $group[0]['category_name']
|
||||
: 'Uncategorized';
|
||||
|
||||
if (count($group) > 0)
|
||||
{
|
||||
echo '<optgroup label="' . $group_label . '">';
|
||||
foreach ($group as $service)
|
||||
{
|
||||
echo '<option value="' . $service['id'] . '">'
|
||||
. $service['name'] . '</option>';
|
||||
}
|
||||
echo '</optgroup>';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach ($available_services as $service)
|
||||
{
|
||||
echo '<option value="' . $service['id'] . '">' . $service['name'] . '</option>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="select-provider">
|
||||
<strong><?= lang('provider') ?></strong>
|
||||
</label>
|
||||
|
||||
<select id="select-provider" class="form-control"></select>
|
||||
</div>
|
||||
|
||||
<div id="service-description"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="command-buttons">
|
||||
<span> </span>
|
||||
|
||||
<button type="button" id="button-next-1" class="btn button-next btn-dark"
|
||||
data-step_index="1">
|
||||
<?= lang('next') ?>
|
||||
<i class="fas fa-chevron-right ml-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
36
application/views/pages/booking/booking_step_2.php
Normal file
36
application/views/pages/booking/booking_step_2.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<div id="wizard-frame-2" class="wizard-frame" style="display:none;">
|
||||
<div class="frame-container">
|
||||
|
||||
<h2 class="frame-title"><?= lang('appointment_date_and_time') ?></h2>
|
||||
|
||||
<div class="row frame-content">
|
||||
<div class="col-12 col-md-6">
|
||||
<div id="select-date"></div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6">
|
||||
<div id="select-time">
|
||||
<div class="form-group">
|
||||
<label for="select-timezone"><?= lang('timezone') ?></label>
|
||||
<?= render_timezone_dropdown('id="select-timezone" class="form-control" value="UTC"'); ?>
|
||||
</div>
|
||||
|
||||
<div id="available-hours"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="command-buttons">
|
||||
<button type="button" id="button-back-2" class="btn button-back btn-outline-secondary"
|
||||
data-step_index="2">
|
||||
<i class="fas fa-chevron-left mr-2"></i>
|
||||
<?= lang('back') ?>
|
||||
</button>
|
||||
<button type="button" id="button-next-2" class="btn button-next btn-dark"
|
||||
data-step_index="2">
|
||||
<?= lang('next') ?>
|
||||
<i class="fas fa-chevron-right ml-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
118
application/views/pages/booking/booking_step_3.php
Normal file
118
application/views/pages/booking/booking_step_3.php
Normal file
|
@ -0,0 +1,118 @@
|
|||
<div id="wizard-frame-3" class="wizard-frame" style="display:none;">
|
||||
<div class="frame-container">
|
||||
|
||||
<h2 class="frame-title"><?= lang('customer_information') ?></h2>
|
||||
|
||||
<div class="row frame-content">
|
||||
<div class="col-12 col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="first-name" class="control-label">
|
||||
<?= lang('first_name') ?>
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<input type="text" id="first-name" class="required form-control" maxlength="100"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="last-name" class="control-label">
|
||||
<?= lang('last_name') ?>
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<input type="text" id="last-name" class="required form-control" maxlength="120"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="email" class="control-label">
|
||||
<?= lang('email') ?>
|
||||
<span class="text-danger">*</span>
|
||||
</label>
|
||||
<input type="text" id="email" class="required form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php if ($show_field['phone-number']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="phone-number" class="control-label">
|
||||
<?= lang('phone_number') ?>
|
||||
<?= $require_phone_number === '1' ? '<span class="text-danger">*</span>' : '' ?>
|
||||
</label>
|
||||
<input type="text" id="phone-number" maxlength="60"
|
||||
class="<?= $require_phone_number === '1' ? 'required' : '' ?> form-control"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6">
|
||||
<?php if ($show_field['address']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="address" class="control-label">
|
||||
<?= lang('address') ?>
|
||||
</label>
|
||||
<input type="text" id="address" class="form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($show_field['city']): ?>
|
||||
<div class="form-group">
|
||||
<label for="city" class="control-label">
|
||||
<?= lang('city') ?>
|
||||
</label>
|
||||
<input type="text" id="city" class="form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($show_field['zip-code']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="zip-code" class="control-label">
|
||||
<?= lang('zip_code') ?>
|
||||
</label>
|
||||
<input type="text" id="zip-code" class="form-control" maxlength="120"/>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php if ($show_field['notes']) : ?>
|
||||
<div class="form-group">
|
||||
<label for="notes" class="control-label">
|
||||
<?= lang('notes') ?>
|
||||
</label>
|
||||
<textarea id="notes" maxlength="500" class="form-control" rows="1"></textarea>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php if ($display_terms_and_conditions): ?>
|
||||
<div class="form-check mb-3">
|
||||
<input type="checkbox" class="required form-check-input" id="accept-to-terms-and-conditions">
|
||||
<label class="form-check-label" for="accept-to-terms-and-conditions">
|
||||
<?= strtr(lang('read_and_agree_to_terms_and_conditions'),
|
||||
[
|
||||
'{$link}' => '<a href="#" data-toggle="modal" data-target="#terms-and-conditions-modal">',
|
||||
'{/$link}' => '</a>'
|
||||
])
|
||||
?>
|
||||
</label>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($display_privacy_policy): ?>
|
||||
<div class="form-check mb-3">
|
||||
<input type="checkbox" class="required form-check-input" id="accept-to-privacy-policy">
|
||||
<label class="form-check-label" for="accept-to-privacy-policy">
|
||||
<?= strtr(lang('read_and_agree_to_privacy_policy'),
|
||||
[
|
||||
'{$link}' => '<a href="#" data-toggle="modal" data-target="#privacy-policy-modal">',
|
||||
'{/$link}' => '</a>'
|
||||
])
|
||||
?>
|
||||
</label>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
<div class="command-buttons">
|
||||
<button type="button" id="button-back-3" class="btn button-back btn-outline-secondary"
|
||||
data-step_index="3">
|
||||
<i class="fas fa-chevron-left mr-2"></i>
|
||||
<?= lang('back') ?>
|
||||
</button>
|
||||
<button type="button" id="button-next-3" class="btn button-next btn-dark"
|
||||
data-step_index="3">
|
||||
<?= lang('next') ?>
|
||||
<i class="fas fa-chevron-right ml-2"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
40
application/views/pages/booking/booking_step_4.php
Normal file
40
application/views/pages/booking/booking_step_4.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<div id="wizard-frame-4" class="wizard-frame" style="display:none;">
|
||||
<div class="frame-container">
|
||||
<h2 class="frame-title"><?= lang('appointment_confirmation') ?></h2>
|
||||
<div class="row frame-content">
|
||||
<div id="appointment-details" class="col-12 col-md-6"></div>
|
||||
<div id="customer-details" class="col-12 col-md-6"></div>
|
||||
</div>
|
||||
<?php if (setting('require_captcha')): ?>
|
||||
<div class="row frame-content">
|
||||
<div class="col-12 col-md-6">
|
||||
<label class="captcha-title" for="captcha-text">
|
||||
CAPTCHA
|
||||
<button class="btn btn-link text-dark text-decoration-none py-0">
|
||||
<i class="fas fa-sync-alt"></i>
|
||||
</button>
|
||||
</label>
|
||||
<img class="captcha-image" src="<?= site_url('captcha') ?>" alt="CAPTCHA">
|
||||
<input id="captcha-text" class="captcha-text form-control" type="text" value=""/>
|
||||
<span id="captcha-hint" class="help-block" style="opacity:0"> </span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<div class="command-buttons">
|
||||
<button type="button" id="button-back-4" class="btn button-back btn-outline-secondary"
|
||||
data-step_index="4">
|
||||
<i class="fas fa-chevron-left mr-2"></i>
|
||||
<?= lang('back') ?>
|
||||
</button>
|
||||
<form id="book-appointment-form" style="display:inline-block" method="post">
|
||||
<button id="book-appointment-submit" type="button" class="btn btn-success">
|
||||
<i class="fas fa-check-square mr-2"></i>
|
||||
<?= ! $manage_mode ? lang('confirm') : lang('update') ?>
|
||||
</button>
|
||||
<input type="hidden" name="csrfToken"/>
|
||||
<input type="hidden" name="post_data"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
Loading…
Reference in a new issue