first commit
Some checks failed
CI / build-test (push) Has been cancelled

This commit is contained in:
2025-05-31 18:56:37 +02:00
commit 8c4798a5fd
1240 changed files with 190468 additions and 0 deletions

View File

@@ -0,0 +1,108 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="about-page" class="container backend-page">
<div id="about" class="col-lg-8 offset-lg-2">
<div class="text-center my-5">
<img src="<?= base_url('assets/img/logo.png') ?>" alt="Easy!Appointments Logo" class="mb-5">
<h3>
Easy!Appointments
</h3>
<h6 class="text-primary">
Online Appointment Scheduler
</h6>
</div>
<p class="mb-5">
<?= lang('about_app_info') ?>
</p>
<div class="card mb-5">
<div class="card-header">
<h5 class="fw-light text-black-50 mb-0">
<?= lang('current_version') ?>
</h5>
</div>
<div class="card-body">
<strong>
<?= config('version') ?>
</strong>
</div>
</div>
<h4 class="fw-light text-black-50 mb-3">
<?= lang('support') ?>
</h4>
<p>
<?= lang('about_app_support') ?>
</p>
<div class="row mb-5">
<div class="col-lg-6 mb-3">
<a class="btn btn-outline-secondary d-block" href="https://easyappointments.org" target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
<?= lang('official_website') ?>
</a>
</div>
<div class="col-lg-6 mb-3">
<a class="btn btn-outline-secondary d-block"
href="https://groups.google.com/forum/#!forum/easy-appointments" target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
<?= lang('support_group') ?>
</a>
</div>
<div class="col-lg-6 mb-3">
<a class="btn btn-outline-secondary d-block"
href="https://github.com/alextselegidis/easyappointments/issues" target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
<?= lang('project_issues') ?>
</a>
</div>
<div class="col-lg-6 mb-3">
<a class="btn btn-outline-secondary d-block" href="https://facebook.com/easyappts" target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
Facebook
</a>
</div>
<div class="col-lg-6 mb-3">
<a class="btn btn-outline-secondary d-block" href="https://x.com/easyappts" target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
X.com
</a>
</div>
<div class="col-lg-6 mb-3">
<a class="btn btn-outline-secondary d-block" href="https://easyappointments.org/get-a-free-quote" target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
Customize E!A
</a>
</div>
</div>
<h4 class="fw-light text-black-50 mb-3">
<?= lang('license') ?>
</h4>
<p>
<?= lang('about_app_license') ?>
</p>
<div class="mb-5">
<a class="btn btn-outline-secondary d-block w-50 m-auto" href="https://www.gnu.org/licenses/gpl-3.0.en.html"
target="_blank">
<i class="fas fa-external-link-alt me-2"></i>
GPL-3.0
</a>
</div>
</div>
</div>
<?php end_section('content'); ?>

View File

@@ -0,0 +1,195 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="account-page" class="container backend-page">
<div id="account">
<div class="row">
<div class="col-lg-8 offset-lg-2">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('account') ?>
</h4>
<?php if (can('edit', PRIV_USER_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
<div class="row">
<div class="col-lg-6">
<input type="hidden" id="user-id">
<div class="mb-3">
<label class="form-label" for="first-name">
<?= lang('first_name') ?>
<span class="text-danger">*</span>
</label>
<input id="first-name" class="form-control required">
</div>
<div class="mb-3">
<label class="form-label" for="last-name">
<?= lang('last_name') ?>
<span class="text-danger">*</span>
</label>
<input id="last-name" class="form-control required">
</div>
<div class="mb-3">
<label class="form-label" for="email">
<?= lang('email') ?>
<span class="text-danger">*</span>
</label>
<input id="email" class="form-control required">
</div>
<div class="mb-3">
<label class="form-label" for="phone-number">
<?= lang('phone_number') ?>
<span class="text-danger">*</span>
</label>
<input id="phone-number" class="form-control required">
</div>
<div class="mb-3">
<label class="form-label" for="mobile-number">
<?= lang('mobile_number') ?>
</label>
<input id="mobile-number" class="form-control">
</div>
<div class="mb-3">
<label class="form-label" for="address">
<?= lang('address') ?>
</label>
<input id="address" class="form-control">
</div>
<div class="mb-3">
<label class="form-label" for="city">
<?= lang('city') ?>
</label>
<input id="city" class="form-control">
</div>
<div class="mb-3">
<label class="form-label" for="state">
<?= lang('state') ?>
</label>
<input id="state" class="form-control">
</div>
<div class="mb-3">
<label class="form-label" for="zip-code">
<?= lang('zip_code') ?>
</label>
<input id="zip-code" class="form-control">
</div>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" class="form-control" rows="3"></textarea>
</div>
</div>
<div class="col-lg-6">
<div class="mb-3">
<label class="form-label" for="username">
<?= lang('username') ?>
<span class="text-danger">*</span>
</label>
<input id="username" class="form-control required">
</div>
<div class="mb-3">
<label class="form-label" for="password">
<?= lang('password') ?>
</label>
<input type="password" id="password" class="form-control"
autocomplete="new-password">
</div>
<div class="mb-3">
<label class="form-label" for="retype-password">
<?= lang('retype_password') ?>
</label>
<input type="password" id="retype-password" class="form-control"
autocomplete="new-password">
</div>
<div class="mb-3">
<label class="form-label" for="calendar-view"><?= lang('calendar') ?>
<span class="text-danger">*</span>
</label>
<select id="calendar-view" class="form-select required">
<option value="default"><?= lang('default') ?></option>
<option value="table"><?= lang('table') ?></option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="language">
<?= lang('language') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="language" class="form-select required">
<?php foreach (vars('available_languages') as $available_language): ?>
<option value="<?= $available_language ?>">
<?= ucfirst($available_language) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="timezone">
<?= lang('timezone') ?>
</label>
<?php component('timezone_dropdown', [
'attributes' => 'id="timezone" class="form-control required"',
'grouped_timezones' => vars('grouped_timezones'),
]); ?>
</div>
<div>
<label class="form-label mb-3">
<?= lang('options') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div class="form-check form-switch">
<input class="form-check-input" id="notifications" type="checkbox">
<label class="form-check-label" for="notifications">
<?= lang('receive_notifications') ?>
</label>
</div>
</div>
</div>
</div>
</fieldset>
</form>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/account_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/account.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,254 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="admins-page">
<div class="row" id="admins">
<div id="filter-admins" class="filter-records column col-12 col-md-5">
<form class="mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('admins') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details column col-12 col-md-7">
<div class="btn-toolbar mb-4">
<div class="add-edit-delete-group btn-group">
<button id="add-admin" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-admin" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-admin" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-admin" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-admin" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div class="form-message alert" style="display:none;"></div>
<input type="hidden" id="id" class="record-id">
<div class="row">
<div class="details col-12 col-md-6">
<div class="mb-3">
<label class="form-label" for="first-name">
<?= lang('first_name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="first-name" class="form-control required" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="last-name">
<?= lang('last_name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="last-name" class="form-control required" maxlength="512" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="email">
<?= lang('email') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="email" class="form-control required" maxlength="512" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="phone-number">
<?= lang('phone_number') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="phone-number" class="form-control required" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="mobile-number">
<?= lang('mobile_number') ?>
</label>
<input id="mobile-number" class="form-control" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="address">
<?= lang('address') ?>
</label>
<input id="address" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="city">
<?= lang('city') ?>
</label>
<input id="city" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="state">
<?= lang('state') ?>
</label>
<input id="state" class="form-control" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="zip-code">
<?= lang('zip_code') ?>
</label>
<input id="zip-code" class="form-control" maxlength="64" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" class="form-control" rows="3" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
<div class="settings col-12 col-md-6">
<div class="mb-3">
<label class="form-label" for="username">
<?= lang('username') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="username" class="form-control required" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="password">
<?= lang('password') ?>
<span class="text-danger" hidden>*</span>
</label>
<input type="password" id="password" class="form-control required" maxlength="512"
autocomplete="new-password" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="password-confirm">
<?= lang('retype_password') ?>
<span class="text-danger" hidden>*</span>
</label>
<input type="password" id="password-confirm" class="form-control required"
maxlength="512" autocomplete="new-password" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="calendar-view">
<?= lang('calendar') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="calendar-view" class="form-select required" disabled>
<option value="default"><?= lang('default') ?></option>
<option value="table"><?= lang('table') ?></option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="language">
<?= lang('language') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="language" class="form-select required" disabled>
<?php foreach (vars('available_languages') as $available_language): ?>
<option value="<?= $available_language ?>">
<?= ucfirst($available_language) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="timezone">
<?= lang('timezone') ?>
<span class="text-danger" hidden>*</span>
</label>
<?php component('timezone_dropdown', [
'attributes' => 'id="timezone" class="form-control required" disabled',
'grouped_timezones' => vars('grouped_timezones'),
]); ?>
</div>
<?php if (setting('ldap_is_active')): ?>
<div class="mb-3">
<label for="ldap-dn" class="form-label">
<?= lang('ldap_dn') ?>
</label>
<input type="text" id="ldap-dn" class="form-control" maxlength="100" disabled/>
</div>
<?php endif; ?>
<div>
<label class="form-label mb-3">
<?= lang('options') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="notifications" disabled>
<label class="form-check-label" for="notifications">
<?= lang('receive_notifications') ?>
</label>
</div>
</div>
<?php slot('after_secondary_fields'); ?>
</div>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/account_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/admins_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/admins.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,64 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="api-settings-page" class="container backend-page">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div id="api-settings" class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('api') ?>
</h4>
<div>
<a href="<?= site_url('integrations') ?>" class="btn btn-outline-primary me-2">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="mb-3">
<label class="form-label" for="api-token">
<?= lang('api_token') ?>
</label>
<input id="api-token" class="form-control" data-field="api_token">
<div class="form-text text-muted">
<small>
<?= lang('api_token_hint') ?>
</small>
</div>
</div>
</div>
</div>
<?php slot('after_primary_appointment_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/api_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/api_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,122 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="blocked-periods-page">
<div class="row" id="blocked-periods">
<div id="filter-blocked-periods" class="filter-records column col-12 col-md-5">
<form class="input-append mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('blocked_periods') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details col-12 col-md-5">
<div class="btn-toolbar mb-4">
<a href="<?= site_url('business_settings') ?>" class="btn btn-outline-primary me-2">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
<div class="add-edit-delete-group btn-group">
<button id="add-blocked-period" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-blocked-period" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-blocked-period" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-blocked-period" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-blocked-period" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div class="form-message alert" style="display:none;"></div>
<input type="hidden" id="id">
<div class="mb-3">
<label class="form-label" for="name">
<?= lang('name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="name" class="form-control required" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="start-date-time">
<?= lang('start') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="start-date-time" class="form-control required" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="end-date-time">
<?= lang('end') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="end-date-time" class="form-control required" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" rows="4" class="form-control" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/ui.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/blocked_periods_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/blocked_periods.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,64 @@
<?php extend('layouts/booking_layout'); ?>
<?php section('content'); ?>
<!-- Booking Cancellation Frame -->
<?php component('booking_cancellation_frame', [
'manage_mode' => vars('manage_mode'),
'appointment_data' => vars('appointment_data'),
'display_delete_personal_information' => vars('display_delete_personal_information'),
]); ?>
<!-- Select Service & Provider -->
<?php component('booking_type_step', ['available_services' => vars('available_services')]); ?>
<!-- Pick An Appointment Date -->
<?php component('booking_time_step', ['grouped_timezones' => vars('grouped_timezones')]); ?>
<!-- Enter Customer Information -->
<?php component('booking_info_step', [
'display_first_name' => vars('display_first_name'),
'require_first_name' => vars('require_first_name'),
'display_last_name' => vars('display_last_name'),
'require_last_name' => vars('require_last_name'),
'display_email' => vars('display_email'),
'require_email' => vars('require_email'),
'display_phone_number' => vars('display_phone_number'),
'require_phone_number' => vars('require_phone_number'),
'display_address' => vars('display_address'),
'require_address' => vars('require_address'),
'display_city' => vars('display_city'),
'require_city' => vars('require_city'),
'display_zip_code' => vars('display_zip_code'),
'require_zip_code' => vars('require_zip_code'),
'display_notes' => vars('display_notes'),
'require_notes' => vars('require_notes'),
]); ?>
<!-- Appointment Data Confirmation -->
<?php component('booking_final_step', [
'manage_mode' => vars('manage_mode'),
'display_terms_and_conditions' => vars('display_terms_and_conditions'),
'display_privacy_policy' => vars('display_privacy_policy'),
]); ?>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/date.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/lang.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/string.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/ui.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/booking_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/booking.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,32 @@
<?php extend('layouts/message_layout'); ?>
<?php section('content'); ?>
<div>
<img id="success-icon" class="mt-0 mb-5" src="<?= base_url('assets/img/success.png') ?>" alt="success"/>
</div>
<div class="mb-5">
<h4 class="mb-5"><?= lang('appointment_cancelled_title') ?></h4>
<p class="mb-5">
<?= lang('appointment_cancelled') ?>
</p>
<a href="<?= site_url() ?>" class="btn btn-primary btn-large">
<i class="fas fa-calendar-alt me-2"></i>
<?= lang('go_to_booking_page') ?>
</a>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<?php component('google_analytics_script', ['google_analytics_code' => vars('google_analytics_code')]); ?>
<?php component('matomo_analytics_script', [
'matomo_analytics_url' => vars('matomo_analytics_url'),
'matomo_analytics_site_id' => vars('matomo_analytics_site_id'),
]); ?>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,43 @@
<?php extend('layouts/message_layout'); ?>
<?php section('content'); ?>
<div>
<img id="success-icon" class="mt-0 mb-5" src="<?= base_url('assets/img/success.png') ?>" alt="success"/>
</div>
<div class="mb-5">
<h4 class="mb-5"><?= lang('appointment_registered') ?></h4>
<p>
<?= lang('appointment_details_was_sent_to_you') ?>
</p>
<p class="mb-5 text-muted">
<small>
<?= lang('check_spam_folder') ?>
</small>
</p>
<a href="<?= site_url() ?>" class="btn btn-primary btn-large">
<i class="fas fa-calendar-alt me-2"></i>
<?= lang('go_to_booking_page') ?>
</a>
<a href="<?= vars('add_to_google_url') ?>" id="add-to-google-calendar" class="btn btn-primary" target="_blank">
<i class="fas fa-plus me-2"></i>
<?= lang('add_to_google_calendar') ?>
</a>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<?php component('google_analytics_script', ['google_analytics_code' => vars('google_analytics_code')]); ?>
<?php component('matomo_analytics_script', [
'matomo_analytics_url' => vars('matomo_analytics_url'),
'matomo_analytics_site_id' => vars('matomo_analytics_site_id'),
]); ?>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,26 @@
<?php extend('layouts/message_layout'); ?>
<?php section('content'); ?>
<div>
<img id="message-icon" class="mt-0 mb-5" src="<?= vars('message_icon') ?>" alt="warning">
</div>
<div class="mb-5">
<h4 class="mb-5"><?= vars('message_title') ?></h4>
<p><?= vars('message_text') ?></p>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<?php component('google_analytics_script', ['google_analytics_code' => vars('google_analytics_code')]); ?>
<?php component('matomo_analytics_script', [
'matomo_analytics_url' => vars('matomo_analytics_url'),
'matomo_analytics_site_id' => vars('matomo_analytics_site_id'),
]); ?>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,443 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="booking-settings-page" class="container backend-page">
<div id="booking-settings">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('booking_settings') ?>
</h4>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
<h5 class="text-black-50 mb-3 fw-light">
<?= lang('fields') ?>
</h5>
<div class="row mb-5 fields-row">
<div class="col-lg-6">
<div class="form-group mb-5">
<label for="first-name" class="form-label">
<?= lang('first_name') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="first-name" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-first-name"
data-field="display_first_name">
<label class="form-check-label" for="display-first-name">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-first-name"
data-field="require_first_name">
<label class="form-check-label" for="require-first-name">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
<div class="form-group mb-5">
<label for="last-name" class="form-label">
<?= lang('last_name') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="last-name" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-last-name"
data-field="display_last_name">
<label class="form-check-label" for="display-last-name">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-last-name"
data-field="require_last_name">
<label class="form-check-label" for="require-last-name">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
<div class="form-group mb-5">
<label for="email" class="form-label">
<?= lang('email') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="email" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-email"
data-field="display_email">
<label class="form-check-label" for="display-email">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-email"
data-field="require_email">
<label class="form-check-label" for="require-email">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
<div class="form-group mb-3">
<label for="phone-number" class="form-label">
<?= lang('phone_number') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="phone-number" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-phone-number"
data-field="display_phone_number">
<label class="form-check-label" for="display-phone-number">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-phone-number"
data-field="require_phone_number">
<label class="form-check-label" for="require-phone-number">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group mb-5">
<label for="address" class="form-label">
<?= lang('address') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="address" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-address"
data-field="display_address">
<label class="form-check-label" for="display-address">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-address"
data-field="require_address">
<label class="form-check-label" for="require-address">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
<div class="form-group mb-5">
<label for="city" class="form-label">
<?= lang('city') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="city" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-city"
data-field="display_city">
<label class="form-check-label" for="display-city">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-city"
data-field="require_city">
<label class="form-check-label" for="require-city">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
<div class="form-group mb-5">
<label for="zip-code" class="form-label">
<?= lang('zip_code') ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="zip-code" class="form-control mb-2" readonly/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-zip-code"
data-field="display_zip_code">
<label class="form-check-label" for="display-zip-code">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-zip-code"
data-field="require_zip_code">
<label class="form-check-label" for="require-zip-code">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
<div class="form-group mb-3">
<label for="notes" class="form-label">
<?= lang('notes') ?>
<span class="text-danger">*</span>
</label>
<textarea id="notes" class="form-control mb-2" rows="1" readonly></textarea>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-notes"
data-field="display_notes">
<label class="form-check-label" for="display-notes">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-notes"
data-field="require_notes">
<label class="form-check-label" for="require-notes">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
</div>
</div>
<h5 class="text-black-50 mb-3 fw-light">
<?= lang('custom_fields') ?>
</h5>
<div class="row mb-5 fields-row">
<?php for ($i = 1; $i <= 5; $i++): ?>
<div class="col-sm-6">
<div class="form-group mb-5">
<label for="first-name" class="form-label">
<?= lang('custom_field') ?> #<?= $i ?>
<span class="text-danger">*</span>
</label>
<input type="text" id="custom-field-<?= $i ?>" class="form-control mb-2"
placeholder="<?= lang('label') ?>"
data-field="label_custom_field_<?= $i ?>"
aria-label="label"
/>
<div class="d-flex">
<div class="form-check form-switch me-4">
<input class="form-check-input display-switch" type="checkbox"
id="display-custom-field-<?= $i ?>"
data-field="display_custom_field_<?= $i ?>">
<label class="form-check-label" for="display-custom-field-<?= $i ?>">
<?= lang('display') ?>
</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input require-switch" type="checkbox"
id="require-custom-field-<?= $i ?>"
data-field="require_custom_field_<?= $i ?>">
<label class="form-check-label" for="require-custom-field-<?= $i ?>">
<?= lang('require') ?>
</label>
</div>
</div>
</div>
</div>
<?php endfor; ?>
</div>
<h5 class="text-black-50 mb-3 fw-light">
<?= lang('options') ?>
</h5>
<div class="row">
<div class="col-12">
<div class="border rounded mb-3 p-3">
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="customer-notifications"
data-field="customer_notifications">
<label class="form-check-label" for="customer-notifications">
<?= lang('customer_notifications') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('customer_notifications_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="limit-customer-access"
data-field="limit_customer_access">
<label class="form-check-label" for="limit-customer-access">
<?= lang('limit_customer_access') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('limit_customer_access_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="require-captcha"
data-field="require_captcha">
<label class="form-check-label" for="require-captcha">
CAPTCHA
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('require_captcha_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="display-any-provider"
data-field="display_any_provider">
<label class="form-check-label" for="display-any-provider">
<?= lang('any_provider') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('display_any_provider_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="display-login-button"
data-field="display_login_button">
<label class="form-check-label" for="display-login-button">
<?= lang('login_button') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('display_login_button_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox"
id="display-delete-personal-information"
data-field="display_delete_personal_information">
<label class="form-check-label" for="display-delete-personal-information">
<?= lang('delete_personal_information') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('delete_personal_information_hint') ?>
</small>
</div>
</div>
<div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="disable-booking"
data-field="disable_booking">
<label class="form-check-label" for="disable-booking">
<?= lang('disable_booking') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('disable_booking_hint') ?>
</small>
</div>
</div>
<div class="form-group mb-3" hidden>
<label class="form-label" for="disable-booking-message">
<?= lang('display_message') ?>
</label>
<textarea id="disable-booking-message" cols="30" rows="10"
class="mb-3"></textarea>
</div>
</div>
</div>
</div>
<?php slot('after_primary_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/booking_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/booking_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,161 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="business-logic-page" class="container backend-page">
<div id="business-logic">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('business_logic') ?>
</h4>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
<h5 class="text-black-50 mb-3 fw-light"><?= lang('working_plan') ?></h5>
<p class="form-text text-muted mb-4">
<?= lang('edit_working_plan_hint') ?>
</p>
<table class="working-plan table table-striped">
<thead>
<tr>
<th><?= lang('day') ?></th>
<th><?= lang('start') ?></th>
<th><?= lang('end') ?></th>
</tr>
</thead>
<tbody><!-- Dynamic Content --></tbody>
</table>
<div class="text-end mb-5">
<button class="btn btn-outline-secondary" id="apply-global-working-plan" type="button">
<i class="fas fa-check"></i>
<?= lang('apply_to_all_providers') ?>
</button>
</div>
<h5 class="text-black-50 mb-3 fw-light"><?= lang('breaks') ?></h5>
<p class="form-text text-muted">
<?= lang('edit_breaks_hint') ?>
</p>
<div class="mt-2">
<button type="button" class="add-break btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add_break') ?>
</button>
</div>
<br>
<table class="breaks table table-striped mb-5">
<thead>
<tr>
<th><?= lang('day') ?></th>
<th><?= lang('start') ?></th>
<th><?= lang('end') ?></th>
<th><?= lang('actions') ?></th>
</tr>
</thead>
<tbody><!-- Dynamic Content --></tbody>
</table>
<?php if (can('view', PRIV_BLOCKED_PERIODS)): ?>
<h5 class="text-black-50 mb-3 fw-light"><?= lang('blocked_periods') ?></h5>
<p class="form-text text-muted">
<?= lang('blocked_periods_hint') ?>
</p>
<div class="mb-5">
<a href="<?= site_url('blocked_periods') ?>" class="btn btn-primary">
<i class="fas fa-cogs me-2"></i>
<?= lang('configure') ?>
</a>
</div>
<?php endif; ?>
<h5 class="text-black-50 mb-3 fw-light"><?= lang(
'allow_rescheduling_cancellation_before',
) ?></h5>
<div class="mb-5">
<label for="book-advance-timeout" class="form-label">
<?= lang('timeout_minutes') ?>
</label>
<input id="book-advance-timeout" data-field="book_advance_timeout" class="form-control"
type="number" min="15">
<div class="form-text text-muted">
<small>
<?= lang('book_advance_timeout_hint') ?>
</small>
</div>
</div>
<h5 class="text-black-50 mb-3 fw-light"><?= lang('future_booking_limit') ?></h5>
<div class="mb-5">
<label for="future-booking-limit" class="form-label">
<?= lang('limit_days') ?>
</label>
<input id="future-booking-limit" data-field="future_booking_limit" class="form-control"
type="number" min="15">
<div class="form-text text-muted">
<small>
<?= lang('future_booking_limit_hint') ?>
</small>
</div>
</div>
<div class="d-flex justify-content-start align-items-center mb-3">
<h5 class="text-black-50 mb-0 me-3 fw-light">
<?= lang('appointment_status_options') ?>
</h5>
</div>
<p class="form-text text-muted mb-4">
<?= lang('appointment_status_options_info') ?>
</p>
<?php component('appointment_status_options', [
'attributes' => 'id="appointment-status-options"',
]); ?>
<?php slot('after_primary_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/vendor/jquery-jeditable/jquery.jeditable.min.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/date.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/string.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/ui.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/working_plan.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/business_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/business_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,156 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="calendar-page">
<div class="row" id="calendar-toolbar">
<div id="calendar-filter" class="col-md-3">
<div class="calendar-filter-items">
<select id="select-filter-item"
class="form-select col"
data-tippy-content="<?= lang('select_filter_item_hint') ?>"
aria-label="Filter">
<!-- JS -->
</select>
</div>
</div>
<div id="calendar-actions" class="col-md-9">
<?php if (vars('calendar_view') === CALENDAR_VIEW_DEFAULT): ?>
<button
id="enable-sync"
class="btn btn-light"
data-tippy-content="<?= lang('enable_appointment_sync_hint') ?>"
hidden>
<i class="fas fa-rotate me-2"></i>
<?= lang('enable_sync') ?>
</button>
<div class="btn-group" id="sync-button-group" hidden>
<button type="button" class="btn btn-light" id="trigger-sync" data-tippy-content="<?= lang(
'trigger_sync_hint',
) ?>">
<i class="fas fa-rotate me-2"></i>
<?= lang('synchronize') ?>
</button>
<button type="button" class="btn btn-light dropdown-toggle dropdown-toggle-split"
data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">
Toggle Dropdown
</span>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#" id="disable-sync">
<?= lang('disable_sync') ?>
</a>
</li>
</ul>
</div>
<?php endif; ?>
<?php if (can('add', PRIV_APPOINTMENTS)): ?>
<div class="dropdown d-sm-inline-block">
<button class="btn btn-light" type="button" data-bs-toggle="dropdown">
<i class="fas fa-plus-square"></i>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="#" id="insert-appointment">
<?= lang('appointment') ?>
</a>
</li>
<li>
<a class="dropdown-item" href="#" id="insert-unavailability">
<?= lang('unavailability') ?>
</a>
</li>
<li>
<a class="dropdown-item" href="#"
id="insert-working-plan-exception" <?= session('role_slug') !== DB_SLUG_ADMIN
? 'hidden'
: '' ?>>
<?= lang('working_plan_exception') ?>
</a>
</li>
</ul>
</div>
<?php endif; ?>
<button id="reload-appointments" class="btn btn-light"
data-tippy-content="<?= lang('reload_appointments_hint') ?>">
<i class="fas fa-sync-alt"></i>
</button>
<?php if (vars('calendar_view') === CALENDAR_VIEW_DEFAULT): ?>
<a class="btn btn-light mb-0" href="<?= site_url('calendar?view=table') ?>"
data-tippy-content="<?= lang('table') ?>">
<i class="fas fa-table"></i>
</a>
<?php endif; ?>
<?php if (vars('calendar_view') === CALENDAR_VIEW_TABLE): ?>
<a class="btn btn-light mb-0" href="<?= site_url('calendar?view=default') ?>"
data-tippy-content="<?= lang('default') ?>">
<i class="fas fa-calendar-alt"></i>
</a>
<?php endif; ?>
<?php slot('after_calendar_actions'); ?>
</div>
</div>
<div id="calendar">
<!-- Dynamically Generated Content -->
</div>
</div>
<!-- Page Components -->
<?php component('appointments_modal', [
'available_services' => vars('available_services'),
'appointment_status_options' => vars('appointment_status_options'),
'timezones' => vars('timezones'),
'require_first_name' => vars('require_first_name'),
'require_last_name' => vars('require_last_name'),
'require_email' => vars('require_email'),
'require_phone_number' => vars('require_phone_number'),
'require_address' => vars('require_address'),
'require_city' => vars('require_city'),
'require_zip_code' => vars('require_zip_code'),
'require_notes' => vars('require_notes'),
]); ?>
<?php component('unavailabilities_modal', [
'timezones' => vars('timezones'),
'timezone' => vars('timezone'),
]); ?>
<?php component('working_plan_exceptions_modal'); ?>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/vendor/fullcalendar/index.global.min.js') ?>"></script>
<script src="<?= asset_url('assets/vendor/fullcalendar-moment/index.global.min.js') ?>"></script>
<script src="<?= asset_url('assets/vendor/jquery-jeditable/jquery.jeditable.min.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/date.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/ui.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/calendar_default_view.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/calendar_table_view.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/calendar_event_popover.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/calendar_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/customers_http_client.js') ?>"></script>
<?php if (vars('calendar_view') === CALENDAR_VIEW_DEFAULT): ?>
<script src="<?= asset_url('assets/js/utils/calendar_sync.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/google_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/caldav_http_client.js') ?>"></script>
<?php endif; ?>
<script src="<?= asset_url('assets/js/pages/calendar.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,236 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="customers-page">
<div class="row" id="customers">
<div id="filter-customers" class="filter-records col col-12 col-md-5">
<form class="mb-4">
<div class="input-group mb-3">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('customers') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details col-12 col-md-7">
<div class="btn-toolbar mb-4">
<div id="add-edit-delete-group" class="btn-group">
<?php if (
can('add', PRIV_CUSTOMERS) &&
(!setting('limit_customer_access') || vars('role_slug') === DB_SLUG_ADMIN)
): ?>
<button id="add-customer" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<?php endif; ?>
<?php if (can('edit', PRIV_CUSTOMERS)): ?>
<button id="edit-customer" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<?php endif; ?>
<?php if (can('delete', PRIV_CUSTOMERS)): ?>
<button id="delete-customer" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
<?php endif; ?>
</div>
<div id="save-cancel-group" style="display:none;">
<button id="save-customer" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-customer" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<input id="customer-id" type="hidden">
<div class="row">
<div class="col-12 col-md-6" style="margin-left: 0;">
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div id="form-message" class="alert" style="display:none;"></div>
<div class="mb-3">
<label for="first-name" class="form-label">
<?= lang('first_name') ?>
<?php if (vars('require_first_name')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="first-name"
class="<?= vars('require_first_name') ? 'required' : '' ?> form-control" maxlength="100"
disabled/>
</div>
<div class="mb-3">
<label for="last-name" class="form-label">
<?= lang('last_name') ?>
<?php if (vars('require_last_name')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="last-name"
class="<?= vars('require_last_name') ? 'required' : '' ?> form-control" maxlength="120"
disabled/>
</div>
<div class="mb-3">
<label for="email" class="form-label">
<?= lang('email') ?>
<?php if (vars('require_email')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="email"
class="<?= vars('require_email') ? 'required' : '' ?> form-control" maxlength="120"
disabled/>
</div>
<div class="mb-3">
<label for="phone-number" class="form-label">
<?= lang('phone_number') ?>
<?php if (vars('require_phone_number')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="phone-number" maxlength="60"
class="<?= vars('require_phone_number') ? 'required' : '' ?> form-control" disabled/>
</div>
<div class="mb-3">
<label for="address" class="form-label">
<?= lang('address') ?>
<?php if (vars('require_address')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="address"
class="<?= vars('require_address') ? 'required' : '' ?> form-control"
maxlength="120" disabled/>
</div>
<div class="mb-3">
<label for="city" class="form-label">
<?= lang('city') ?>
<?php if (vars('require_city')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="city" class="<?= vars('require_city') ? 'required' : '' ?> form-control"
maxlength="120" disabled/>
</div>
<div class="mb-3">
<label for="zip-code" class="form-label">
<?= lang('zip_code') ?>
<?php if (vars('require_zip_code')): ?>
<span class="text-danger" hidden>*</span>
<?php endif; ?>
</label>
<input type="text" id="zip-code"
class="<?= vars('require_zip_code') ? 'required' : '' ?> form-control"
maxlength="120" disabled/>
</div>
<div class="mb-3">
<label class="form-label" for="language">
<?= lang('language') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="language" class="form-select required" disabled>
<?php foreach (vars('available_languages') as $available_language): ?>
<option value="<?= $available_language ?>">
<?= ucfirst($available_language) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="timezone">
<?= lang('timezone') ?>
<span class="text-danger" hidden>*</span>
</label>
<?php component('timezone_dropdown', [
'attributes' => 'id="timezone" class="form-control required" disabled',
'grouped_timezones' => vars('grouped_timezones'),
]); ?>
</div>
<?php if (setting('ldap_is_active')): ?>
<div class="mb-3">
<label for="ldap-dn" class="form-label">
<?= lang('ldap_dn') ?>
</label>
<input type="text" id="ldap-dn" class="form-control" maxlength="100" disabled/>
</div>
<?php endif; ?>
<?php component('custom_fields', [
'disabled' => true,
]); ?>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" rows="4" class="form-control" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
<div class="col-12 col-md-6">
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('appointments') ?>
</h4>
<div id="customer-appointments" class="card bg-white border"></div>
<?php slot('after_secondary_fields'); ?>
</div>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/date.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/customers_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/customers.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,250 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="general-settings-page" class="container backend-page">
<div id="general-settings">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('general_settings') ?>
</h4>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
<div class="row mb-5">
<div class="col-12">
<h5 class="text-black-50 mb-3 fw-light"><?= lang('company') ?></h5>
<div class="mb-3">
<label class="form-label" for="company-name">
<?= lang('company_name') ?>
<span class="text-danger">*</span>
</label>
<input id="company-name" data-field="company_name" class="required form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_name_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="company-email">
<?= lang('company_email') ?>
<span class="text-danger">*</span>
</label>
<input id="company-email" data-field="company_email" class="required form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_email_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="company-link">
<?= lang('company_link') ?>
<span class="text-danger">*</span>
</label>
<input id="company-link" data-field="company_link" class="required form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_link_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="company-logo">
<?= lang('company_logo') ?>
</label>
<input type="file" id="company-logo" data-field="company_logo" class="form-control"
accept="image/*">
<div class="form-text text-muted">
<small>
<?= lang('company_logo_hint') ?>
</small>
</div>
<div class="d-flex justify-content-center">
<img src="#" alt="Company Logo Preview" id="company-logo-preview"
class="img-thumbnail my-3" hidden>
</div>
<div class="d-flex justify-content-center">
<button type="button" class="btn btn-danger btn-sm mb-3"
id="remove-company-logo" hidden>
<i class="fas fa-trash me-2"></i>
<?= lang('remove') ?>
</button>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="company-color">
<?= lang('company_color') ?>
</label>
<input type="color" id="company-color" data-field="company_color"
class="form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_color_hint') ?>
</small>
</div>
<div class="d-flex justify-content-center">
<button type="button" class="btn btn-danger btn-sm my-3"
id="reset-company-color" hidden>
<i class="fas fa-undo-alt me-2"></i>
<?= lang('reset') ?>
</button>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="theme">
<?= lang('theme') ?>
</label>
<select id="theme" data-field="theme" class="form-select">
<?php foreach (vars('available_themes') as $available_theme): ?>
<option value="<?= $available_theme ?>">
<?= ucfirst($available_theme) ?>
</option>
<?php endforeach; ?>
</select>
<div class="form-text text-muted">
<small>
<?= lang('company_color_hint') ?>
</small>
</div>
</div>
</div>
</div>
<div class="row mb-5">
<div class="col-12">
<h5 class="text-black-50 mb-3 fw-light"><?= lang('localization') ?></h5>
<div class="mb-3">
<label class="form-label" for="date-format">
<?= lang('date_format') ?>
</label>
<select class="form-select" id="date-format" data-field="date_format">
<option value="DMY">DMY</option>
<option value="MDY">MDY</option>
<option value="YMD">YMD</option>
</select>
<div class="form-text text-muted">
<small>
<?= lang('date_format_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="time-format">
<?= lang('time_format') ?>
</label>
<select class="form-select" id="time-format" data-field="time_format">
<option value="<?= TIME_FORMAT_REGULAR ?>">H:MM AM/PM</option>
<option value="<?= TIME_FORMAT_MILITARY ?>">HH:MM</option>
</select>
<div class="form-text text-muted">
<small>
<?= lang('time_format_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="first-weekday">
<?= lang('first_weekday') ?>
</label>
<select class="form-select" id="first-weekday" data-field="first_weekday">
<option value="sunday"><?= lang('sunday') ?></option>
<option value="monday"><?= lang('monday') ?></option>
<option value="tuesday"><?= lang('tuesday') ?></option>
<option value="wednesday"><?= lang('wednesday') ?></option>
<option value="thursday"><?= lang('thursday') ?></option>
<option value="friday"><?= lang('friday') ?></option>
<option value="saturday"><?= lang('saturday') ?></option>
</select>
<div class="form-text text-muted">
<small>
<?= lang('first_weekday_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="default-language">
<?= lang('default_language') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="default-language" class="form-select required" data-field="default_language">
<?php foreach (vars('available_languages') as $available_language): ?>
<option value="<?= $available_language ?>">
<?= ucfirst($available_language) ?>
</option>
<?php endforeach; ?>
</select>
<div class="form-text text-muted">
<small>
<?= lang('default_language_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="default-timezone">
<?= lang('default_timezone') ?>
<span class="text-danger" hidden>*</span>
</label>
<?php component('timezone_dropdown', [
'attributes' =>
'id="default-timezone" data-field="default_timezone" class="form-control required"',
'grouped_timezones' => vars('grouped_timezones'),
]); ?>
</div>
<div class="form-text text-muted">
<small>
<?= lang('default_timezone_hint') ?>
</small>
</div>
</div>
</div>
<?php slot('after_primary_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/general_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/general_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,65 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="google-analytics-settings-page" class="container backend-page">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div id="google-analytics-settings" class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('google_analytics') ?>
</h4>
<div>
<a href="<?= site_url('integrations') ?>" class="btn btn-outline-primary me-2">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="mb-3">
<label class="form-label" for="google-analytics-code">
<?= lang('google_analytics_code') ?>
</label>
<input id="google-analytics-code" placeholder="UA-XXXXXXXX-XX or G-XXXXXXXXXX"
class="form-control" data-field="google_analytics_code">
<div class="form-text text-muted">
<small>
<?= lang('google_analytics_code_hint') ?>
</small>
</div>
</div>
</div>
</div>
<?php slot('after_primary_appointment_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/google_analytics_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/google_analytics_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,212 @@
<!doctype html>
<html lang="<?= config('language_code') ?>">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Installation | Easy!Appointments</title>
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/themes/default.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/general.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/pages/installation.css') ?>">
</head>
<body>
<div id="loading" class="d-none">
<img src="<?= base_url('assets/img/loading.gif') ?>" alt="loading">
</div>
<header>
<div class="container">
<h1 class="page-title">Easy!Appointments Installation</h1>
</div>
</header>
<div class="content container">
<div class="welcome">
<h3>Welcome to the Easy!Appointments installation page.</h3>
<p>
This page will help you set the main settings of your Easy!Appointments installation. You will be able to
edit these settings and many more in the backend session of your system. Remember to use the
<strong class="text-primary"><?= site_url('user/login') ?></strong> URL to connect to the backend section
of Easy!Appointments.
If you face any problems during the usage of Easy!Appointments you can always check the
<a href="https://easyappointments.org/docs.html">Documentation</a> and
<a href="https://groups.google.com/group/easy-appointments">Support Group</a> for getting help. You may also
submit new issues on
<a href="https://github.com/alextselegidis/easyappointments/issues">GitHub Issues</a>
in order to help our development process.
</p>
</div>
<div class="alert" hidden></div>
<div class="row">
<div class="admin-settings col-12 col-sm-5">
<h3 class="text-black-50 mb-3 fw-light">Administrator</h3>
<div class="mb-3">
<label class="form-label" for="first-name">
<?= lang('first_name') ?>
<span class="text-danger">*</span>
</label>
<input id="first-name" class="form-control required" maxlength="256">
</div>
<div class="mb-3">
<label class="form-label" for="last-name">
<?= lang('last_name') ?>
<span class="text-danger">*</span>
</label>
<input id="last-name" class="form-control required" maxlength="512">
</div>
<div class="mb-3">
<label class="form-label" for="email">
<?= lang('email') ?>
<span class="text-danger">*</span>
</label>
<input id="email" class="form-control required" maxlength="512">
</div>
<div class="mb-3">
<label class="form-label" for="phone-number">
<?= lang('phone_number') ?>
<span class="text-danger">*</span>
</label>
<input id="phone-number" class="form-control required" maxlength="128">
</div>
<div class="mb-3">
<label class="form-label" for="username">
<?= lang('username') ?>
<span class="text-danger">*</span>
</label>
<input id="username" class="form-control required" maxlength="256">
</div>
<div class="mb-3">
<label class="form-label" for="password">
<?= lang('password') ?>
<span class="text-danger">*</span>
</label>
<input type="password" id="password" class="form-control required" maxlength="512">
</div>
<div class="mb-3">
<label class="form-label" for="password-confirm">
<?= lang('retype_password') ?>
<span class="text-danger">*</span>
</label>
<input type="password" id="password-confirm" class="form-control required" maxlength="512">
</div>
<div class="mb-3">
<label class="form-label" for="language">
<?= lang('language') ?>
<span class="text-danger">*</span>
</label>
<select id="language" class="form-select required">
<?php
$config_lang = config('language');
foreach (vars('available_languages') as $lang): ?>
<option value="<?= $lang ?>"<?= $lang == $config_lang ? ' selected' : '' ?>>
<?= ucfirst($lang) ?>
</option>
<?php endforeach;
?>
</select>
</div>
</div>
<div class="company-settings col-12 col-sm-5">
<h3 class="text-black-50 mb-3 fw-light"><?= lang('company') ?></h3>
<div class="mb-3">
<label class="form-label" for="company-name">
<?= lang('company_name') ?>
<span class="text-danger">*</span>
</label>
<input id="company-name" data-field="company_name" class="required form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_name_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="company-email">
<?= lang('company_email') ?>
<span class="text-danger">*</span>
</label>
<input id="company-email" data-field="company_email" class="required form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_email_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="company-link">
<?= lang('company_link') ?>
<span class="text-danger">*</span>
</label>
<input id="company-link" data-field="company_link" class="required form-control">
<div class="form-text text-muted">
<small>
<?= lang('company_link_hint') ?>
</small>
</div>
</div>
</div>
</div>
<br>
<p>
You will be able to set your business logic in the backend settings page after the installation is complete.
<br>
Press the following button to complete the installation process.
</p>
<br>
<div class="mb-2">
<h3>License</h3>
Easy!Appointments is licensed under the <span class="badge bg-secondary">GPL-3.0 license</span>. By using the
code
of Easy!Appointments in any way <br> you agree with the terms described in the following url:
<a href="https://www.gnu.org/licenses/gpl-3.0.en.html">https://www.gnu.org/licenses/gpl-3.0.en.html</a>
</div>
<br>
<button type="button" id="install" class="btn btn-primary">
<i class="icon-white icon-ok me-2"></i>
Install Easy!Appointments
</button>
</div>
<footer>
Powered by <a href="https://easyappointments.org">Easy!Appointments</a>
</footer>
<?php component('js_vars_script'); ?>
<?php component('js_lang_script'); ?>
<script src="<?= asset_url('assets/vendor/jquery/jquery.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/js/app.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/installation.js') ?>"></script>
</body>
</html>

View File

@@ -0,0 +1,144 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="integrations-page" class="container backend-page">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div id="integrations" class="col-sm-6">
<h4 class="text-black-50 border-bottom py-3 mb-3 fw-light">
<?= lang('integrations') ?>
</h4>
<p class="form-text text-muted mb-4">
<?= lang('integrations_info') ?>
</p>
<div class="row">
<div class="col-sm-6 mb-4">
<div class="card h-100">
<div class="card-header">
<h5 class="fw-light text-black-50 mb-0">
<?= lang('webhooks') ?>
</h5>
</div>
<div class="card-body">
<div class="mb-3 integration-info">
<small>
<?= lang('webhooks_info') ?>
</small>
</div>
</div>
<div class="card-footer bg-white border-0">
<a href="<?= site_url('webhooks') ?>" class="btn btn-outline-primary w-100">
<i class="fas fa-cogs me-2"></i>
<?= lang('configure') ?>
</a>
</div>
</div>
</div>
<div class="col-sm-6 mb-4">
<div class="card h-100">
<div class="card-header">
<h5 class="fw-light text-black-50 mb-0">
<?= lang('google_analytics') ?>
</h5>
</div>
<div class="card-body">
<div class="mb-3 integration-info">
<small>
<?= lang('google_analytics_info') ?>
</small>
</div>
</div>
<div class="card-footer bg-white border-0">
<a href="<?= site_url('google_analytics_settings') ?>"
class="btn btn-outline-primary w-100">
<i class="fas fa-cogs me-2"></i>
<?= lang('configure') ?>
</a>
</div>
</div>
</div>
<div class="col-sm-6 mb-4">
<div class="card h-100">
<div class="card-header">
<h5 class="fw-light text-black-50 mb-0">
<?= lang('matomo_analytics') ?>
</h5>
</div>
<div class="card-body">
<div class="mb-3 integration-info">
<small>
<?= lang('matomo_analytics_info') ?>
</small>
</div>
</div>
<div class="card-footer bg-white border-0">
<a href="<?= site_url('matomo_analytics_settings') ?>"
class="btn btn-outline-primary w-100">
<i class="fas fa-cogs me-2"></i>
<?= lang('configure') ?>
</a>
</div>
</div>
</div>
<div class="col-sm-6 mb-4">
<div class="card h-100">
<div class="card-header">
<h5 class="fw-light text-black-50 mb-0">
<?= lang('api') ?>
</h5>
</div>
<div class="card-body">
<div class="mb-3 integration-info">
<small>
<?= lang('api_info') ?>
</small>
</div>
</div>
<div class="card-footer bg-white border-0">
<a href="<?= site_url('api_settings') ?>" class="btn btn-outline-primary w-100">
<i class="fas fa-cogs me-2"></i>
<?= lang('configure') ?>
</a>
</div>
</div>
</div>
<div class="col-sm-6 mb-4">
<div class="card h-100">
<div class="card-header">
<h5 class="fw-light text-black-50 mb-0">
<?= lang('ldap') ?>
</h5>
</div>
<div class="card-body">
<div class="mb-3 integration-info">
<small>
<?= lang('ldap_info') ?>
</small>
</div>
</div>
<div class="card-footer bg-white border-0">
<a href="<?= site_url('ldap_settings') ?>" class="btn btn-outline-primary w-100">
<i class="fas fa-cogs me-2"></i>
<?= lang('configure') ?>
</a>
</div>
</div>
</div>
<?php slot('after_integration_cards'); ?>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>

View File

@@ -0,0 +1,165 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="ldap-settings-page" class="container backend-page">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div id="ldap-settings" class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('ldap') ?>
</h4>
<div>
<a href="<?= site_url('integrations') ?>" class="btn btn-outline-primary me-2">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
</div>
<?php if (!extension_loaded('ldap')): ?>
<div class="alert alert-warning">
<?= lang('ldap_extension_not_loaded') ?>
</div>
<?php endif; ?>
<div class="row">
<div class="col-12">
<div class="mb-3">
<div class="form-check form-switch mb-3">
<input class="form-check-input" type="checkbox" id="ldap-is-active" data-field="ldap_is_active">
<label class="form-check-label" for="ldap-is-active">
<?= lang('active') ?>
</label>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="ldap-host">
<?= lang('host') ?>
</label>
<input id="ldap-host" class="form-control" data-field="ldap_host">
</div>
<div class="mb-3">
<label class="form-label" for="ldap-port">
<?= lang('port') ?>
</label>
<input id="ldap-port" class="form-control" data-field="ldap_port">
</div>
<div class="mb-3">
<label class="form-label" for="ldap-user_dn">
<?= lang('user_dn') ?>
</label>
<input id="ldap-user_dn" class="form-control" data-field="ldap_user_dn">
</div>
<div class="mb-3">
<label class="form-label" for="ldap-password">
<?= lang('password') ?>
</label>
<input id="ldap-password" type="password" class="form-control" data-field="ldap_password">
</div>
<div class="mb-3">
<label class="form-label" for="ldap-base-dn">
<?= lang('base_dn') ?>
</label>
<input id="ldap-base-dn" class="form-control" data-field="ldap_base_dn">
</div>
<div class="mb-3">
<div class="d-flex mb-2">
<label class="form-label mb-0" for="ldap-filter">
<?= lang('filter') ?>
</label>
<button type="button" class="btn btn-sm btn-outline-secondary py-0 ms-auto" id="ldap-reset-filter">
<i class="fas fa-undo me-2"></i>
<?= lang('reset') ?>
</button>
</div>
<input id="ldap-filter" class="form-control" data-field="ldap_filter">
</div>
<div class="mb-3">
<div class="d-flex mb-2">
<label class="form-label mb-0" for="ldap-field-mapping">
<?= lang('field_mapping') ?>
</label>
<button type="button" class="btn btn-sm btn-outline-secondary py-0 ms-auto" id="ldap-reset-field-mapping">
<i class="fas fa-undo me-2"></i>
<?= lang('reset') ?>
</button>
</div>
<textarea id="ldap-field-mapping" class="form-control" rows="5" data-field="ldap_field_mapping"></textarea>
</div>
</div>
</div>
<?php slot('after_primary_appointment_fields'); ?>
</fieldset>
</form>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('search') ?>
</h4>
</div>
<p class="text-muted small">
<?= lang('ldap_search_hint') ?>
</p>
<form id="ldap-search-form" class="mb-3">
<label class="form-label" for="ldap-search-keyword">
<?= lang('keyword') ?>
</label>
<div class="input-group">
<input id="ldap-search-keyword" class="form-control">
<button type="submit" class="btn btn-outline-primary">
<?= lang('search') ?>
</button>
</div>
</form>
<div id="ldap-search-results" class="mb-3">
<!-- JS -->
</div>
</div>
</div>
</div>
<?php component('ldap_import_modal', [
'roles' => vars('roles'),
]); ?>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/customers_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/providers_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/secretaries_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/admins_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/ldap_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/ldap_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,100 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="legal-settings-page" class="container backend-page">
<div id="legal-contents">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('legal_contents') ?>
</h4>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
<div class="row">
<div class="col-12">
<h5 class="text-black-50 mb-3 fw-light"><?= lang('cookie_notice') ?></h5>
<div class="form-check form-switch mb-3">
<input class="form-check-input display-switch" type="checkbox"
id="display-cookie-notice">
<label class="form-check-label" for="display-cookie-notice">
<?= lang('display_cookie_notice') ?>
</label>
</div>
<div class="mb-5">
<label class="form-label"
for="cookie-notice-content"><?= lang('cookie_notice_content') ?></label>
<textarea id="cookie-notice-content" cols="30" rows="10" class="mb-3"></textarea>
</div>
<h5 class="text-black-50 mb-3 fw-light"><?= lang('terms_and_conditions') ?></h5>
<div class="form-check form-switch mb-3">
<input class="form-check-input display-switch" type="checkbox"
id="display-terms-and-conditions">
<label class="form-check-label" for="display-terms-and-conditions">
<?= lang('display_terms_and_conditions') ?>
</label>
</div>
<div class="mb-5">
<label class="form-label"
for="terms-and-conditions-content"><?= lang(
'terms_and_conditions_content',
) ?></label>
<textarea id="terms-and-conditions-content" cols="30" rows="10"
class="mb-3"></textarea>
</div>
<h5 class="text-black-50 mb-3 fw-light"><?= lang('privacy_policy') ?></h5>
<div class="form-check form-switch mb-3">
<input class="form-check-input display-switch" type="checkbox"
id="display-privacy-policy">
<label class="form-check-label" for="display-privacy-policy">
<?= lang('display_privacy_policy') ?>
</label>
</div>
<div class="mb-3">
<label class="form-label"
for="privacy-policy-content"><?= lang('privacy_policy_content') ?></label>
<textarea id="privacy-policy-content" cols="30" rows="10" class="mb-3"></textarea>
</div>
</div>
</div>
<?php slot('after_primary_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/ui.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/legal_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/legal_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,53 @@
<?php extend('layouts/account_layout'); ?>
<?php section('content'); ?>
<h2><?= lang('backend_section') ?></h2>
<p>
<small>
<?= lang('you_need_to_login') ?>
</small>
</p>
<hr>
<div class="alert d-none"></div>
<form id="login-form">
<div class="mb-3 mt-5">
<label for="username" class="form-label">
<?= lang('username') ?>
</label>
<input type="text" id="username" placeholder="<?= lang(
'enter_username_here',
) ?>" class="form-control" required/>
</div>
<div class="mb-5">
<label for="password" class="form-label">
<?= lang('password') ?>
</label>
<input type="password" id="password" placeholder="<?= lang(
'enter_password_here',
) ?>" class="form-control" required/>
</div>
<div class="d-flex justify-content-between align-items-center mb-5">
<a href="<?= site_url('recovery') ?>" class="forgot-password"><?= lang('forgot_your_password') ?></a>
<button type="submit" id="login" class="btn btn-primary">
<i class="fas fa-sign-in-alt me-2"></i>
<?= lang('login') ?>
</button>
</div>
</form>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<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>
<script src="<?= asset_url('assets/js/http/login_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/login.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,27 @@
<?php extend('layouts/account_layout'); ?>
<?php section('content'); ?>
<h3><?= lang('log_out') ?></h3>
<p>
<small>
<?= lang('logout_success') ?>
</small>
</p>
<div class="d-flex justify-content-between my-5">
<a href="<?= site_url('login') ?>" class="btn btn-outline-secondary btn-large">
<i class="fas fa-wrench me-2"></i>
<?= lang('backend_section') ?>
</a>
<a href="<?= site_url() ?>" class="btn btn-primary btn-large">
<i class="fas fa-calendar-alt me-2"></i>
<?= lang('book_appointment_title') ?>
</a>
</div>
<?php end_section('content'); ?>

View File

@@ -0,0 +1,78 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div id="matomo-analytics-settings-page" class="container backend-page">
<div class="row">
<div class="col-sm-3 offset-sm-1">
<?php component('settings_nav'); ?>
</div>
<div id="matomo-analytics-settings" class="col-sm-6">
<form>
<fieldset>
<div class="d-flex justify-content-between align-items-center border-bottom mb-4 py-2">
<h4 class="text-black-50 mb-0 fw-light">
<?= lang('matomo_analytics') ?>
</h4>
<div>
<a href="<?= site_url('integrations') ?>" class="btn btn-outline-primary me-2">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
<?php if (can('edit', PRIV_SYSTEM_SETTINGS)): ?>
<button type="button" id="save-settings" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<?php endif; ?>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="mb-3">
<label class="form-label" for="matomo-analytics-url">
<?= lang('matomo_analytics_url') ?>
</label>
<input id="matomo-analytics-url" placeholder="//example.org/url/to/matomo/"
data-field="matomo_analytics_url" class="form-control">
<div class="form-text text-muted">
<small>
<?= lang('matomo_analytics_url_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="matomo-analytics-site-id">
<?= lang('matomo_analytics_site_id') ?>
</label>
<input id="matomo-analytics-site-id" data-field="matomo_analytics_site_id"
class="form-control">
<div class="form-text text-muted">
<small>
<?= lang('matomo_analytics_site_id_hint') ?>
</small>
</div>
</div>
</div>
</div>
<?php slot('after_primary_appointment_fields'); ?>
</fieldset>
</form>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/matomo_analytics_settings_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/matomo_analytics_settings.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,399 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="providers-page">
<div class="row" id="providers">
<div id="filter-providers" class="filter-records column col-12 col-md-5">
<form class="mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('providers') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details column col-12 col-md-7">
<div class="float-md-start mb-4 me-4">
<div class="add-edit-delete-group btn-group">
<button id="add-provider" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-provider" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-provider" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-provider" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-provider" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<ul class="nav nav-pills switch-view">
<li class="nav-item">
<a class="nav-link active" href="#details" data-bs-toggle="tab">
<?= lang('details') ?>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#working-plan" data-bs-toggle="tab">
<?= lang('working_plan') ?>
</a>
</li>
</ul>
<?php
// This form message is outside the details view, so that it can be
// visible when the user has working plan view active.
?>
<div class="form-message alert" style="display:none;"></div>
<div class="tab-content">
<div class="details-view tab-pane fade show active clearfix" id="details">
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<input type="hidden" id="id" class="record-id">
<div class="row">
<div class="details col-12 col-md-6">
<div class="mb-3">
<label class="form-label" for="first-name">
<?= lang('first_name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="first-name" class="form-control required" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="last-name">
<?= lang('last_name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="last-name" class="form-control required" maxlength="512" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="email">
<?= lang('email') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="email" class="form-control required" max="512" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="phone-number">
<?= lang('phone_number') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="phone-number" class="form-control required" max="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="mobile-number">
<?= lang('mobile_number') ?>
</label>
<input id="mobile-number" class="form-control" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="address">
<?= lang('address') ?>
</label>
<input id="address" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="city">
<?= lang('city') ?>
</label>
<input id="city" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="state">
<?= lang('state') ?>
</label>
<input id="state" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="zip-code">
<?= lang('zip_code') ?>
</label>
<input id="zip-code" class="form-control" maxlength="64" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" class="form-control" rows="3" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
<div class="settings col-12 col-md-6">
<div class="mb-3">
<label class="form-label" for="username">
<?= lang('username') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="username" class="form-control required" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="password">
<?= lang('password') ?>
<span class="text-danger" hidden>*</span>
</label>
<input type="password" id="password" class="form-control required"
maxlength="512" autocomplete="new-password" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="password-confirm">
<?= lang('retype_password') ?>
<span class="text-danger" hidden>*</span>
</label>
<input type="password" id="password-confirm"
class="form-control required" maxlength="512"
autocomplete="new-password" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="calendar-view">
<?= lang('calendar') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="calendar-view" class="form-select required" disabled>
<option value="default"><?= lang('default') ?></option>
<option value="table"><?= lang('table') ?></option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="language">
<?= lang('language') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="language" class="form-select required" disabled>
<?php foreach (vars('available_languages') as $available_language): ?>
<option value="<?= $available_language ?>">
<?= ucfirst($available_language) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="timezone">
<?= lang('timezone') ?>
<span class="text-danger" hidden>*</span>
</label>
<?php component('timezone_dropdown', [
'attributes' => 'id="timezone" class="form-control required" disabled',
'grouped_timezones' => vars('grouped_timezones'),
]); ?>
</div>
<?php if (setting('ldap_is_active')): ?>
<div class="mb-3">
<label for="ldap-dn" class="form-label">
<?= lang('ldap_dn') ?>
</label>
<input type="text" id="ldap-dn" class="form-control" maxlength="100" disabled/>
</div>
<?php endif; ?>
<div>
<label class="form-label mb-3">
<?= lang('options') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="is-private">
<label class="form-check-label" for="is-private">
<?= lang('hide_from_public') ?>
</label>
</div>
<div class="form-text text-muted mb-3">
<small>
<?= lang('private_hint') ?>
</small>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="notifications" disabled>
<label class="form-check-label" for="notifications">
<?= lang('receive_notifications') ?>
</label>
</div>
</div>
<div>
<label class="form-label mb-3">
<?= lang('services') ?>
</label>
</div>
<div id="provider-services" class="card card-body bg-white border">
<!-- JS -->
</div>
<?php slot('after_secondary_fields'); ?>
</div>
</div>
</div>
<div class="working-plan-view tab-pane fade clearfix" id="working-plan">
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('working_plan') ?>
</h4>
<button id="reset-working-plan" class="btn btn-primary"
data-tippy-content="<?= lang('reset_working_plan') ?>">
<i class="fas fa-undo-alt me-2"></i>
<?= lang('reset_plan') ?></button>
<table class="working-plan table table-striped mt-2">
<thead>
<tr>
<th><?= lang('day') ?></th>
<th><?= lang('start') ?></th>
<th><?= lang('end') ?></th>
</tr>
</thead>
<tbody><!-- Dynamic Content --></tbody>
</table>
<?php slot('after_working_plan'); ?>
<br>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('breaks') ?>
</h4>
<p>
<?= lang('add_breaks_during_each_day') ?>
</p>
<div>
<button type="button" class="add-break btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add_break') ?>
</button>
</div>
<br>
<table class="breaks table table-striped">
<thead>
<tr>
<th><?= lang('day') ?></th>
<th><?= lang('start') ?></th>
<th><?= lang('end') ?></th>
<th><?= lang('actions') ?></th>
</tr>
</thead>
<tbody><!-- Dynamic Content --></tbody>
</table>
<?php slot('after_breaks'); ?>
<br>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('working_plan_exceptions') ?>
</h4>
<p>
<?= lang('add_working_plan_exceptions_during_each_day') ?>
</p>
<div>
<button type="button" class="add-working-plan-exception btn btn-primary me-2">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add_working_plan_exception') ?>
</button>
</div>
<br>
<table class="working-plan-exceptions table table-striped">
<thead>
<tr>
<th><?= lang('day') ?></th>
<th><?= lang('start') ?></th>
<th><?= lang('end') ?></th>
<th><?= lang('actions') ?></th>
</tr>
</thead>
<tbody><!-- Dynamic Content --></tbody>
</table>
<?php component('working_plan_exceptions_modal'); ?>
<?php slot('after_working_plan_exceptions'); ?>
</div>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/vendor/jquery-jeditable/jquery.jeditable.min.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/date.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/string.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/ui.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/working_plan.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/account_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/providers_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/providers.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,54 @@
<?php extend('layouts/account_layout'); ?>
<?php section('content'); ?>
<h2><?= lang('forgot_your_password') ?></h2>
<p>
<small>
<?= lang('type_username_and_email_for_new_password') ?>
</small>
</p>
<hr>
<div class="alert d-none"></div>
<form class="mb-5">
<div class="mb-3 mt-5">
<label for="username" class="form-label">
<?= lang('username') ?>
</label>
<input type="text" id="username" placeholder="<?= lang('enter_username_here') ?>" class="form-control"/>
</div>
<div class="mb-5">
<label for="email" class="form-label">
<?= lang('email') ?>
</label>
<input type="text" id="email" placeholder="<?= lang('enter_email_here') ?>" class="form-control"/>
</div>
<div class="d-flex justify-content-between align-items-center mb-5">
<a href="<?= site_url('login') ?>" class="user-login">
<?= lang('go_to_login') ?>
</a>
<button type="submit" id="get-new-password" class="btn btn-primary btn-large">
<i class="fas fa-unlock-alt me-2"></i>
<?= lang('regenerate_password') ?>
</button>
</div>
</form>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<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>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/recovery_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/recovery.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,263 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="secretaries-page">
<div class="row" id="secretaries">
<div id="filter-secretaries" class="filter-records column col-12 col-md-5">
<form class="mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('secretaries') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details column col-12 col-md-7">
<div class="btn-toolbar mb-4">
<div class="add-edit-delete-group btn-group">
<button id="add-secretary" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-secretary" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-secretary" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-secretary" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-secretary" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div class="form-message alert" style="display:none;"></div>
<input type="hidden" id="id" class="record-id">
<div class="row">
<div class="details col-12 col-md-6">
<div class="mb-3">
<label class="form-label" for="first-name">
<?= lang('first_name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="first-name" class="form-control required" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="last-name">
<?= lang('last_name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="last-name" class="form-control required" maxlength="512" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="email">
<?= lang('email') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="email" class="form-control required" maxlength="512" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="phone-number">
<?= lang('phone_number') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="phone-number" class="form-control required" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="mobile-number">
<?= lang('mobile_number') ?>
</label>
<input id="mobile-number" class="form-control" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="address">
<?= lang('address') ?>
</label>
<input id="address" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="city">
<?= lang('city') ?>
</label>
<input id="city" class="form-control" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="state">
<?= lang('state') ?>
</label>
<input id="state" class="form-control" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="zip-code">
<?= lang('zip_code') ?>
</label>
<input id="zip-code" class="form-control" maxlength="64" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" class="form-control" rows="3" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
<div class="settings col-12 col-md-6">
<div class="mb-3">
<label class="form-label" for="username">
<?= lang('username') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="username" class="form-control required" maxlength="256" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="password">
<?= lang('password') ?>
<span class="text-danger" hidden>*</span>
</label>
<input type="password" id="password" class="form-control required"
maxlength="512" autocomplete="new-password" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="password-confirm">
<?= lang('retype_password') ?>
<span class="text-danger" hidden>*</span>
</label>
<input type="password" id="password-confirm" class="form-control required"
maxlength="512" autocomplete="new-password" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="calendar-view">
<?= lang('calendar') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="calendar-view" class="form-select required" disabled>
<option value="default"><?= lang('default') ?></option>
<option value="table"><?= lang('table') ?></option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="language">
<?= lang('language') ?>
<span class="text-danger" hidden>*</span>
</label>
<select id="language" class="form-select required" disabled>
<?php foreach (vars('available_languages') as $available_language): ?>
<option value="<?= $available_language ?>">
<?= ucfirst($available_language) ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="timezone">
<?= lang('timezone') ?>
<span class="text-danger" hidden>*</span>
</label>
<?php component('timezone_dropdown', [
'attributes' => 'id="timezone" class="form-control required" disabled',
'grouped_timezones' => vars('grouped_timezones'),
]); ?>
</div>
<?php if (setting('ldap_is_active')): ?>
<div class="mb-3">
<label for="ldap-dn" class="form-label">
<?= lang('ldap_dn') ?>
</label>
<input type="text" id="ldap-dn" class="form-control" maxlength="100" disabled/>
</div>
<?php endif; ?>
<div>
<label class="form-label mb-3">
<?= lang('options') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="notifications" disabled>
<label class="form-check-label" for="notifications">
<?= lang('receive_notifications') ?>
</label>
</div>
</div>
<div>
<label class="form-label mb-3">
<?= lang('providers') ?>
</label>
</div>
<div id="secretary-providers" class="card card-body bg-white border">
<!-- JS -->
</div>
<?php slot('after_secondary_fields'); ?>
</div>
</div>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/account_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/secretaries_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/secretaries.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,100 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="service-categories-page">
<div class="row" id="service-categories">
<div id="filter-service-categories" class="filter-records column col-12 col-md-5">
<form class="input-append mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('service_categories') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details col-12 col-md-5">
<div class="btn-toolbar mb-4">
<div class="add-edit-delete-group btn-group">
<button id="add-service-category" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-service-category" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-service-category" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-service-category" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-service-category" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div class="form-message alert" style="display:none;"></div>
<input type="hidden" id="id">
<div class="mb-3">
<label class="form-label" for="name">
<?= lang('name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="name" class="form-control required" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="description">
<?= lang('description') ?>
</label>
<textarea id="description" rows="4" class="form-control" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/service_categories_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/service_categories.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,187 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="services-page">
<div class="row" id="services">
<div id="filter-services" class="filter-records col col-12 col-md-5">
<form class="mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('services') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details column col-12 col-md-5">
<div class="btn-toolbar mb-4">
<div class="add-edit-delete-group btn-group">
<button id="add-service" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-service" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-service" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-service" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-service" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div class="form-message alert" style="display:none;"></div>
<input type="hidden" id="id">
<div class="mb-3">
<label class="form-label" for="name">
<?= lang('name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="name" class="form-control required" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="duration">
<?= lang('duration_minutes') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="duration" class="form-control required" type="number" min="<?= EVENT_MINIMUM_DURATION ?>"
disabled>
</div>
<div class="mb-3">
<label class="form-label" for="price">
<?= lang('price') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="price" class="form-control required" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="currency">
<?= lang('currency') ?>
</label>
<input id="currency" class="form-control" maxlength="32" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="service-category-id">
<?= lang('category') ?>
</label>
<select id="service-category-id" class="form-select" disabled></select>
</div>
<div class="mb-3">
<label class="form-label" for="availabilities-type">
<?= lang('availabilities_type') ?>
</label>
<select id="availabilities-type" class="form-select" disabled>
<option value="<?= AVAILABILITIES_TYPE_FLEXIBLE ?>">
<?= lang('flexible') ?>
</option>
<option value="<?= AVAILABILITIES_TYPE_FIXED ?>">
<?= lang('fixed') ?>
</option>
</select>
</div>
<div class="mb-3">
<label class="form-label" for="attendants-number" disabled>
<?= lang('attendants_number') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="attendants-number" class="form-control required" type="number" min="1">
</div>
<div class="mb-3">
<label class="form-label" for="location">
<?= lang('location') ?>
</label>
<input id="location" class="form-control" disabled>
</div>
<div class="mb-3">
<?php component('color_selection', ['attributes' => 'id="color"']); ?>
</div>
<div>
<label class="form-label mb-3">
<?= lang('options') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="is-private">
<label class="form-check-label" for="is-private">
<?= lang('hide_from_public') ?>
</label>
</div>
<div class="form-text text-muted">
<small>
<?= lang('private_hint') ?>
</small>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="description">
<?= lang('description') ?>
</label>
<textarea id="description" rows="4" class="form-control" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/services_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/service_categories_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/services.js') ?>"></script>
<?php end_section('scripts'); ?>

View File

@@ -0,0 +1,73 @@
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Update | Easy!Appointments</title>
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/themes/default.min.css') ?>">
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/general.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/pages/update.css') ?>">
</head>
<body>
<header>
<div class="container">
<h1 class="page-title">Easy!Appointments Update</h1>
</div>
</header>
<div class="container">
<div class="row">
<div class="col">
<?php if (vars('success')): ?>
<div class="jumbotron">
<h1 class="display-4">Success!</h1>
<p class="lead">
The database got updated successfully.
</p>
<hr class="my-4">
<p>
You can now use the latest Easy!Appointments version.
</p>
<a href="<?= site_url('about') ?>" class="btn btn-success btn-large">
<i class="fas fa-wrench me-2"></i>
<?= lang('backend_section') ?>
</a>
</div>
<?php else: ?>
<div class="jumbotron">
<h1 class="display-4">Failure!</h1>
<p class="lead">
There was an error during the update process.
</p>
<hr class="my-4">
<p>
Please restore your database backup.
</p>
<a href="<?= site_url('login') ?>" class="btn btn-success btn-large">
<i class="fas fa-wrench me-2"></i>
<?= lang('backend_section') ?>
</a>
<p>
Please restore your database backup.
</p>
</div>
<div class="well text-start">
Error Message: <?= vars('exception') ?>
</div>
<?php endif; ?>
</div>
</div>
</div>
<footer>
Powered by <a href="https://easyappointments.org">Easy!Appointments</a>
</footer>
<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>
</body>
</html>

View File

@@ -0,0 +1,168 @@
<?php extend('layouts/backend_layout'); ?>
<?php section('content'); ?>
<div class="container-fluid backend-page" id="webhooks-page">
<div class="row" id="webhooks">
<div id="filter-webhooks" class="filter-records col col-12 col-md-5">
<form class="mb-4">
<div class="input-group">
<input type="text" class="key form-control" aria-label="keyword">
<button class="filter btn btn-outline-secondary" type="submit"
data-tippy-content="<?= lang('filter') ?>">
<i class="fas fa-search"></i>
</button>
</div>
</form>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('webhooks') ?>
</h4>
<?php slot('after_page_title'); ?>
<div class="results">
<!-- JS -->
</div>
</div>
<div class="record-details column col-12 col-md-5">
<div class="btn-toolbar mb-4">
<a href="<?= site_url('integrations') ?>" class="btn btn-outline-primary me-2">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
<div class="add-edit-delete-group btn-group">
<button id="add-webhook" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i>
<?= lang('add') ?>
</button>
<button id="edit-webhook" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-edit me-2"></i>
<?= lang('edit') ?>
</button>
<button id="delete-webhook" class="btn btn-outline-secondary" disabled="disabled">
<i class="fas fa-trash-alt me-2"></i>
<?= lang('delete') ?>
</button>
</div>
<div class="save-cancel-group" style="display:none;">
<button id="save-webhook" class="btn btn-primary">
<i class="fas fa-check-square me-2"></i>
<?= lang('save') ?>
</button>
<button id="cancel-webhook" class="btn btn-secondary">
<?= lang('cancel') ?>
</button>
</div>
<?php slot('after_page_actions'); ?>
</div>
<h4 class="text-black-50 mb-3 fw-light">
<?= lang('details') ?>
</h4>
<div class="form-message alert" style="display:none;"></div>
<input type="hidden" id="id">
<div class="mb-3">
<label class="form-label" for="name">
<?= lang('name') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="name" class="form-control required" maxlength="128" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="url">
<?= lang('url') ?>
<span class="text-danger" hidden>*</span>
</label>
<input id="url" class="form-control required" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="secret-header">
<?= lang('secret_header') ?>
</label>
<input id="secret-header" class="form-control" disabled>
</div>
<div class="mb-3">
<label class="form-label" for="secret-token">
<?= lang('secret_token') ?>
</label>
<input id="secret-token" class="form-control" disabled>
</div>
<div>
<label class="form-label mb-3" for="actions">
<?= lang('actions') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div id="actions">
<?php foreach (vars('available_actions') as $available_action): ?>
<div class="mb-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox"
id="include-<?= str_replace('_', '-', $available_action) ?>"
data-action="<?= $available_action ?>">
<label class="form-check-label"
for="include-<?= str_replace('_', '-', $available_action) ?>">
<?= lang($available_action) ?>
</label>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div>
<label class="form-label mb-3">
<?= lang('options') ?>
</label>
</div>
<div class="border rounded mb-3 p-3">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="is-ssl-verified">
<label class="form-check-label" for="is-ssl-verified">
<?= lang('verify_ssl') ?>
</label>
</div>
</div>
<div class="mb-3">
<label class="form-label" for="notes">
<?= lang('notes') ?>
</label>
<textarea id="notes" rows="4" class="form-control" disabled></textarea>
</div>
<?php slot('after_primary_fields'); ?>
</div>
</div>
</div>
<?php end_section('content'); ?>
<?php section('scripts'); ?>
<script src="<?= asset_url('assets/js/utils/message.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/validation.js') ?>"></script>
<script src="<?= asset_url('assets/js/utils/url.js') ?>"></script>
<script src="<?= asset_url('assets/js/http/webhooks_http_client.js') ?>"></script>
<script src="<?= asset_url('assets/js/pages/webhooks.js') ?>"></script>
<?php end_section('scripts'); ?>