Compare commits

...

33 commits

Author SHA1 Message Date
b311a9b59e
update versions 2024-01-09 23:47:14 +03:00
b06d335271
update translations 2024-01-09 23:13:13 +03:00
98a37bde1d
Merge remote-tracking branch 'remotes/upstream/develop' into develop 2024-01-09 21:53:49 +03:00
Alex Tselegidis
a02a6118b6 Perform styling changes to the public booking page 2024-01-06 12:32:36 +01:00
Alex Tselegidis
b192b437e0 Patch the Captcha_builder.php for PHP8.2 2024-01-06 11:41:43 +01:00
Alex Tselegidis
acafb0da48 Improve the way the service description renders in the booking page 2024-01-06 11:32:42 +01:00
Alex Tselegidis
fa6f685e13 Fix "categories" table not found error 2024-01-06 11:22:12 +01:00
Alex Tselegidis
ac7ca85b88 Narrow the service selection of the booking page 2024-01-06 11:13:39 +01:00
Alex Tselegidis
cd768bda85 Use the helper methods to set and get date time picker values 2024-01-06 11:06:48 +01:00
Alex Tselegidis
02162ee232 Rename ui.js methods 2024-01-06 10:46:57 +01:00
Alex Tselegidis
c7f2e7f831 Move the position of the back button 2024-01-06 10:40:02 +01:00
26d909a19b
Merge remote-tracking branch 'upstream/develop' into develop 2024-01-05 21:32:28 +03:00
42c707cea3
update translation 2024-01-05 21:27:49 +03:00
Alex Tselegidis
cd6280b97d Make sure the API returns 404 on show if the ID was not found 2024-01-05 19:20:00 +01:00
Alex Tselegidis
aee7bb80c0 Add return types 2024-01-05 19:12:25 +01:00
Alex Tselegidis
7a8832d311 Use fixed swagger UI version 2024-01-05 17:38:50 +01:00
Alex Tselegidis
5a1f604e3d Add missing security section for unavailabilities 2024-01-05 17:10:17 +01:00
Alex Tselegidis
6a1b2b28f1 Replace collection objects with array definitions that better translate to Swagger clients 2024-01-05 17:09:44 +01:00
Alex Tselegidis
e0a1282338 Add missing API methods 2024-01-05 17:06:55 +01:00
Alex Tselegidis
c5eafc9552 Add missing translations 2024-01-05 16:49:23 +01:00
Alex Tselegidis
87cb1e190b Correct typo 2024-01-04 21:57:01 +01:00
Alex Tselegidis
10383d407b
Merge pull request #1442 from asandikci/develop
fix(timezone): update Istanbul timezone
2024-01-03 10:34:13 +01:00
1e46fe94ac
update version 2024-01-01 22:31:08 +03:00
890f265bb9
fix: timezone errors 2024-01-01 22:27:04 +03:00
a2813d235c
update version and dependencies 2024-01-01 20:03:25 +03:00
c8e8fb64f1
BREAKING CHANGE!: change default timezones to Istanbul (+3:00) 2024-01-01 19:58:56 +03:00
d7ff69480a
update languages and branding 2024-01-01 19:53:24 +03:00
6236546d54
update translations 2024-01-01 17:39:18 +03:00
649f31e9b8
a bit more branding 2024-01-01 12:34:30 +03:00
212b6b732d
add todos 2024-01-01 12:05:20 +03:00
514e2ebc18
Merge remote-tracking branch 'upstream/develop' into develop 2024-01-01 12:00:49 +03:00
d08d1459e2
Rearrange Istanbul in Timezones 2024-01-01 11:56:55 +03:00
f495df0488
update branding and localtest files 2024-01-01 11:37:50 +03:00
69 changed files with 825 additions and 685 deletions

3
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"php.version": "8.2"
}

View file

@ -5,11 +5,11 @@
| App Configuration
|--------------------------------------------------------------------------
|
| Declare some of the global config values of Easy!Appointments.
| Declare some of the global config values of MaketRandevu.
|
*/
$config['version'] = '1.5.0-dev.4'; // This must be changed manually.
$config['version'] = '1.5.0-RC2'; // This must be changed manually.
$config['url'] = Config::BASE_URL;

View file

@ -94,13 +94,13 @@ $languages = [
$config['language_codes'] = $languages;
$language_code = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : 'en';
$language_code = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : 'tr';
$config['language'] = isset($_SERVER['HTTP_ACCEPT_LANGUAGE'], $languages[$language_code])
? $languages[$language_code]
: Config::LANGUAGE;
$config['language_code'] = array_search($config['language'], $languages) ?: 'en';
$config['language_code'] = array_search($config['language'], $languages) ?: 'tr';
/*
|--------------------------------------------------------------------------
@ -151,7 +151,7 @@ $config['enable_hooks'] = TRUE;
| http://codeigniter.com/user_guide/general/creating_libraries.html
|
*/
$config['subclass_prefix'] = 'EA_';
$config['subclass_prefix'] = 'EA_'; //TODO create new MAKET_ prefix in future
/*
|--------------------------------------------------------------------------

View file

@ -4,7 +4,7 @@
// Example: $config['smtp_host'] = 'smtp.gmail.com';
// @link https://codeigniter.com/user_guide/libraries/email.html
$config['useragent'] = 'Easy!Appointments';
$config['useragent'] = 'MaketRandevu';
$config['protocol'] = 'mail'; // or 'smtp'
$config['mailtype'] = 'html'; // or 'text'
// $config['smtp_debug'] = '0'; // or '1'

View file

@ -52,7 +52,7 @@ class Installation extends EA_Controller
}
/**
* Installs Easy!Appointments on the server.
* Installs MAKET Randevu on the server.
*/
public function perform()
{
@ -67,7 +67,7 @@ class Installation extends EA_Controller
$this->instance->migrate();
// Insert admin
$admin['timezone'] = 'UTC';
$admin['timezone'] = 'Europe/Istanbul'; // REVIEW is it working properly ?!
$admin['settings']['username'] = $admin['username'];
$admin['settings']['password'] = $admin['password'];
$admin['settings']['notifications'] = true;
@ -92,8 +92,8 @@ class Installation extends EA_Controller
// Service
$service_id = $this->services_model->save([
'name' => 'Service',
'duration' => '30',
'name' => 'Hizmet İsmini Buraya Girin',
'duration' => '60',
'price' => '0',
'currency' => '',
'availabilities_type' => 'flexible',
@ -102,13 +102,13 @@ class Installation extends EA_Controller
// Provider
$this->providers_model->save([
'first_name' => 'Jane',
'last_name' => 'Doe',
'email' => 'jane@example.org',
'phone_number' => '+1 (000) 000-0000',
'first_name' => 'Hizmet Sağlayıcı İsmini Buraya Girin',
'last_name' => 'Hizmet Sağlayıcı Soyismini Buraya Girin',
'email' => 'hizmet_saglayici_mail@example.org',
'phone_number' => '+90 (000) 000-0000',
'services' => [$service_id],
'settings' => [
'username' => 'janedoe',
'username' => 'ilkhizmetsaglayici',
'password' => random_string(),
'working_plan' => setting('company_working_plan'),
'notifications' => true,
@ -121,10 +121,10 @@ class Installation extends EA_Controller
// Customer
$this->customers_model->save([
'first_name' => 'James',
'last_name' => 'Doe',
'email' => 'james@example.org',
'phone_number' => '+1 (000) 000-0000',
'first_name' => 'Örnek Müşteri İsmi',
'last_name' => 'Örnek Müşteri Soyismi',
'email' => 'ornek_musteri@example.org',
'phone_number' => '+90 (000) 000-0000',
]);
json_response([

View file

@ -37,7 +37,7 @@ class Admins_api_v1 extends EA_Controller
/**
* Get an admin collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -79,9 +79,17 @@ class Admins_api_v1 extends EA_Controller
*
* @param int|null $id Admin ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->admins_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -98,12 +106,6 @@ class Admins_api_v1 extends EA_Controller
$this->admins_model->load($admin, $with);
}
if (!$admin) {
response('', 404);
return;
}
json_response($admin);
} catch (Throwable $e) {
json_exception($e);
@ -113,7 +115,7 @@ class Admins_api_v1 extends EA_Controller
/**
* Store a new admin.
*/
public function store()
public function store(): void
{
try {
$admin = request();
@ -145,7 +147,7 @@ class Admins_api_v1 extends EA_Controller
*
* @param int $id Admin ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->admins_model->get(['id' => $id]);
@ -179,7 +181,7 @@ class Admins_api_v1 extends EA_Controller
*
* @param int $id Admin ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->admins_model->get(['id' => $id]);

View file

@ -43,7 +43,7 @@ class Appointments_api_v1 extends EA_Controller
/**
* Get an appointment collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -143,7 +143,7 @@ class Appointments_api_v1 extends EA_Controller
*
* @deprecated Since 1.5
*/
private function aggregates(array &$appointment)
private function aggregates(array &$appointment): void
{
$aggregates = request('aggregates') !== null;
@ -171,9 +171,17 @@ class Appointments_api_v1 extends EA_Controller
*
* @param int|null $id Appointment ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->appointments_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -190,12 +198,6 @@ class Appointments_api_v1 extends EA_Controller
$this->appointments_model->load($appointment, $with);
}
if (!$appointment) {
response('Not Found', 404);
return;
}
json_response($appointment);
} catch (Throwable $e) {
json_exception($e);
@ -205,7 +207,7 @@ class Appointments_api_v1 extends EA_Controller
/**
* Store a new appointment.
*/
public function store()
public function store(): void
{
try {
$appointment = request();
@ -295,7 +297,7 @@ class Appointments_api_v1 extends EA_Controller
*
* @param int $id Appointment ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->appointments_model->get(['id' => $id]);
@ -331,7 +333,7 @@ class Appointments_api_v1 extends EA_Controller
*
* @param int $id Appointment ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->appointments_model->get(['id' => $id]);

View file

@ -54,7 +54,7 @@ class Availabilities_api_v1 extends EA_Controller
*
* If no date parameter is provided then the current date will be used.
*/
public function get()
public function get(): void
{
try {
$provider_id = request('providerId');

View file

@ -35,7 +35,7 @@ class Customers_api_v1 extends EA_Controller
/**
* Get a customer collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Customers_api_v1 extends EA_Controller
*
* @param int|null $id Customer ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->customers_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$customer = $this->customers_model->find($id);
@ -90,12 +98,6 @@ class Customers_api_v1 extends EA_Controller
$this->customers_model->only($customer, $fields);
}
if (!$customer) {
response('', 404);
return;
}
json_response($customer);
} catch (Throwable $e) {
json_exception($e);
@ -105,7 +107,7 @@ class Customers_api_v1 extends EA_Controller
/**
* Store a new customer.
*/
public function store()
public function store(): void
{
try {
$customer = request();
@ -133,7 +135,7 @@ class Customers_api_v1 extends EA_Controller
*
* @param int $id Customer ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->customers_model->get(['id' => $id]);
@ -167,7 +169,7 @@ class Customers_api_v1 extends EA_Controller
*
* @param int $id Customer ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->customers_model->get(['id' => $id]);

View file

@ -35,7 +35,7 @@ class Providers_api_v1 extends EA_Controller
/**
* Get a provider collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Providers_api_v1 extends EA_Controller
*
* @param int|null $id Provider ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->providers_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -96,12 +104,6 @@ class Providers_api_v1 extends EA_Controller
$this->providers_model->load($provider, $with);
}
if (!$provider) {
response('', 404);
return;
}
json_response($provider);
} catch (Throwable $e) {
json_exception($e);
@ -111,7 +113,7 @@ class Providers_api_v1 extends EA_Controller
/**
* Store a new provider.
*/
public function store()
public function store(): void
{
try {
$provider = request();
@ -151,7 +153,7 @@ class Providers_api_v1 extends EA_Controller
*
* @param int $id Provider ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->providers_model->get(['id' => $id]);
@ -185,7 +187,7 @@ class Providers_api_v1 extends EA_Controller
*
* @param int $id Provider ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->providers_model->get(['id' => $id]);

View file

@ -35,7 +35,7 @@ class Secretaries_api_v1 extends EA_Controller
/**
* Get a secretary collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Secretaries_api_v1 extends EA_Controller
*
* @param int|null $id Secretary ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->secretaries_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$secretary = $this->secretaries_model->find($id);
@ -90,12 +98,6 @@ class Secretaries_api_v1 extends EA_Controller
$this->secretaries_model->only($secretary, $fields);
}
if (!$secretary) {
response('', 404);
return;
}
json_response($secretary);
} catch (Throwable $e) {
json_exception($e);
@ -105,7 +107,7 @@ class Secretaries_api_v1 extends EA_Controller
/**
* Store a new secretary.
*/
public function store()
public function store(): void
{
try {
$secretary = request();
@ -141,7 +143,7 @@ class Secretaries_api_v1 extends EA_Controller
*
* @param int $id Secretary ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->secretaries_model->get(['id' => $id]);
@ -175,7 +177,7 @@ class Secretaries_api_v1 extends EA_Controller
*
* @param int $id Secretary ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->secretaries_model->get(['id' => $id]);

View file

@ -35,7 +35,7 @@ class Service_categories_api_v1 extends EA_Controller
/**
* Get a service-category collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Service_categories_api_v1 extends EA_Controller
*
* @param int|null $id Service-category ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->service_categories_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -96,12 +104,6 @@ class Service_categories_api_v1 extends EA_Controller
$this->service_categories_model->load($service_category, $with);
}
if (!$service_category) {
response('', 404);
return;
}
json_response($service_category);
} catch (Throwable $e) {
json_exception($e);
@ -111,7 +113,7 @@ class Service_categories_api_v1 extends EA_Controller
/**
* Store a new service-category.
*/
public function store()
public function store(): void
{
try {
$service_category = request();
@ -139,7 +141,7 @@ class Service_categories_api_v1 extends EA_Controller
*
* @param int $id Service-category ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->service_categories_model->get(['id' => $id]);
@ -173,7 +175,7 @@ class Service_categories_api_v1 extends EA_Controller
*
* @param int $id Service-category ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->service_categories_model->get(['id' => $id]);

View file

@ -35,7 +35,7 @@ class Services_api_v1 extends EA_Controller
/**
* Get an service collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Services_api_v1 extends EA_Controller
*
* @param int|null $id Service ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->services_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -96,12 +104,6 @@ class Services_api_v1 extends EA_Controller
$this->services_model->load($service, $with);
}
if (!$service) {
response('', 404);
return;
}
json_response($service);
} catch (Throwable $e) {
json_exception($e);
@ -111,7 +113,7 @@ class Services_api_v1 extends EA_Controller
/**
* Store a new service.
*/
public function store()
public function store(): void
{
try {
$service = request();
@ -139,7 +141,7 @@ class Services_api_v1 extends EA_Controller
*
* @param int $id Service ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->services_model->get(['id' => $id]);
@ -173,7 +175,7 @@ class Services_api_v1 extends EA_Controller
*
* @param int $id Service ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->services_model->get(['id' => $id]);

View file

@ -71,7 +71,7 @@ class Settings_api_v1 extends EA_Controller
*
* @param string $name Setting name.
*/
public function show(string $name)
public function show(string $name): void
{
try {
$value = setting($name);
@ -90,7 +90,7 @@ class Settings_api_v1 extends EA_Controller
*
* @param string $name Setting name.
*/
public function update(string $name)
public function update(string $name): void
{
try {
$value = request('value');

View file

@ -35,7 +35,7 @@ class Unavailabilities_api_v1 extends EA_Controller
/**
* Get an unavailability collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Unavailabilities_api_v1 extends EA_Controller
*
* @param int|null $id Unavailability ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->unavailabilities_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -96,12 +104,6 @@ class Unavailabilities_api_v1 extends EA_Controller
$this->unavailabilities_model->load($unavailability, $with);
}
if (!$unavailability) {
response('', 404);
return;
}
json_response($unavailability);
} catch (Throwable $e) {
json_exception($e);
@ -111,7 +113,7 @@ class Unavailabilities_api_v1 extends EA_Controller
/**
* Store a new unavailability.
*/
public function store()
public function store(): void
{
try {
$unavailability = request();
@ -139,7 +141,7 @@ class Unavailabilities_api_v1 extends EA_Controller
*
* @param int $id Unavailability ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->unavailabilities_model->get(['id' => $id]);
@ -173,7 +175,7 @@ class Unavailabilities_api_v1 extends EA_Controller
*
* @param int $id Unavailability ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->unavailabilities_model->get(['id' => $id]);

View file

@ -35,7 +35,7 @@ class Webhooks_api_v1 extends EA_Controller
/**
* Get a webhook collection.
*/
public function index()
public function index(): void
{
try {
$keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Webhooks_api_v1 extends EA_Controller
*
* @param int|null $id Webhook ID.
*/
public function show(int $id = null)
public function show(int $id = null): void
{
try {
$occurrences = $this->webhooks_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields();
$with = $this->api->request_with();
@ -96,12 +104,6 @@ class Webhooks_api_v1 extends EA_Controller
$this->webhooks_model->load($webhook, $with);
}
if (!$webhook) {
response('', 404);
return;
}
json_response($webhook);
} catch (Throwable $e) {
json_exception($e);
@ -111,7 +113,7 @@ class Webhooks_api_v1 extends EA_Controller
/**
* Store a new webhook.
*/
public function store()
public function store(): void
{
try {
$webhook = request();
@ -139,7 +141,7 @@ class Webhooks_api_v1 extends EA_Controller
*
* @param int $id Webhook ID.
*/
public function update(int $id)
public function update(int $id): void
{
try {
$occurrences = $this->webhooks_model->get(['id' => $id]);
@ -173,7 +175,7 @@ class Webhooks_api_v1 extends EA_Controller
*
* @param int $id Webhook ID.
*/
public function destroy(int $id)
public function destroy(int $id): void
{
try {
$occurrences = $this->webhooks_model->get(['id' => $id]);

View file

@ -46,8 +46,12 @@ if (!function_exists('branding')) {
// Yazılım Sağlayıcı Bilgileri
$software = array(
"name" => "MAKET",
"description" => "MAKET Randevu Portalı",
"name" => "MAKET Randevu",
"name_tr" => "MAKET Randevu",
"name_en" => "MAKET Appointment",
"description" => "MAKET Randevu",
"description_tr" => "MAKET Randevu Portalı",
"description_en" => "MAKET Appointment Portal",
"maintainers" => "Aliberk Sandıı & Alex Tselegidis", // to also give credit to original maintainer
"maintainer_nickname" => "asandikci",
"maintainer_name" => "Aliberk Sandıı",

View file

@ -1,6 +1,12 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
// Turkish
// English
$lang['address'] = 'School Name';
$lang['city'] = 'School City';
$lang['zip_code'] = 'Number of Students';
$lang['notes'] = 'Extra Notes';
$lang['system_installation'] = 'System Installation';
$lang['system_installation_welcome_header'] = 'Welcome to the ' . branding("software", "name") . " installation page";
$lang['powered_by'] = 'Powered By <a href="' . branding("software", "website") . '" target="_blank">' . branding("software", "name") . '</a>';
$lang['system_installation_welcome_header'] = 'Welcome to the ' . branding("software", "name_en") . " installation page";
$lang['powered_by'] = 'Powered By <a href="' . branding("software", "website") . '" target="_blank">' . branding("software", "name_en") . '</a>';
// End

View file

@ -175,22 +175,22 @@ $lang['visible'] = 'Visible';
$lang['hidden'] = 'Hidden';
$lang['business_logic'] = 'Business Logic';
$lang['current_user'] = 'Current User';
$lang['about_app'] = 'About Easy!Appointments';
$lang['about_app'] = 'About MAKET Randevu';
$lang['edit_working_plan_hint'] = 'Mark below the days and hours that your company will accept appointments. You will be able to adjust appointments in non-working hours but the customers will not be able to book appointments by themselves in non-working periods. This working plan will be the default for every new provider record, but you will be able to change each provider\'s plan separately by editing his record. After that you can add break periods.';
$lang['edit_breaks_hint'] = 'Add the working breaks during each day. These breaks will be applied for all new providers.';
$lang['book_advance_timeout'] = 'Book Advance Timeout';
$lang['book_advance_timeout_hint'] = 'Define the timeout (in minutes) before the customers can book or re-arrange appointments with the company.';
$lang['timeout_minutes'] = 'Timeout (Minutes)';
$lang['about_app_info'] = 'Easy!Appointments is a highly customizable web application that allows your customers to book appointments with you via the web. Moreover, it provides the ability to sync your data with Google Calendar, so you can use them with other services.';
$lang['about_app_info'] = 'MAKET Randevu is a highly customizable web application that allows your customers to book appointments with you via the web. Moreover, it provides the ability to sync your data with Google Calendar, so you can use them with other services.';
$lang['current_version'] = 'Current Version';
$lang['support'] = 'Support';
$lang['about_app_support'] = 'If you encounter any problems when using Easy!Appointments you can search the official Google Group for answers. You might also need to create a new issue on the Google Code page in order to help the development progress.';
$lang['about_app_support'] = 'If you encounter any problems when using MAKET Randevu you can search the official Google Group for answers. You might also need to create a new issue on the Google Code page in order to help the development progress.';
$lang['official_website'] = 'Official Website';
$lang['google_plus_community'] = 'Google+ Community';
$lang['support_group'] = 'Support Group';
$lang['project_issues'] = 'Project Issues';
$lang['license'] = 'License';
$lang['about_app_license'] = 'Easy!Appointments is licensed under the GPLv3 license. By using the code of Easy!Appointments in any way you are agreeing to the terms described in the following url:';
$lang['about_app_license'] = 'MAKET Randevu is licensed under the GPLv3 license. By using the code of MAKET Randevu in any way you are agreeing to the terms described in the following url:';
$lang['logout_success'] = 'You have been successfully logged out! Click on one of the following buttons to navigate to a different page.';
$lang['book_appointment_title'] = 'Book Appointment';
$lang['backend_section'] = 'Backend Section';
@ -272,7 +272,7 @@ $lang['select_google_calendar_prompt'] = 'Select the calendar that you want to s
$lang['google_calendar_selected'] = 'Google calendar has been successfully selected.';
$lang['oops_something_went_wrong'] = 'Oops! Something Went Wrong.';
$lang['could_not_add_to_google_calendar'] = 'Your appointment could not be added to your Google Calendar account.';
$lang['ea_update_success'] = 'Easy!Appointments has been successfully updated.';
$lang['ea_update_success'] = 'MAKET Randevu has been successfully updated.';
$lang['require_captcha'] = 'Require CAPTCHA';
$lang['require_captcha_hint'] = 'When enabled, the customers will have to type a random generated CAPTCHA string before booking/updating an appointment.';
$lang['captcha_is_wrong'] = 'CAPTCHA verification failed, please try again.';
@ -320,7 +320,7 @@ $lang['add_working_plan_exception'] = 'Add Working Plan Exception';
$lang['require_phone_number'] = 'Require phone number';
$lang['require_phone_number_hint'] = 'When enabled, customers and users will need to enter the customer\'s phone number when booking an appointment';
$lang['check_spam_folder'] = 'Please check your spam folder if the email does not arrive within a few minutes.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the Easy!Appointments API.';
$lang['api_token_hint'] = 'Set a secret token in order to enable the token based authentication of the MAKET Randevu API.';
$lang['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'All the working plans got updated.';
@ -396,7 +396,7 @@ $lang['google_analytics_info'] = 'Google Analytics enable you to automatically a
$lang['matomo_analytics'] = 'Matomo Analytics';
$lang['matomo_analytics_info'] = 'Matomo Analytics enable you to automatically add the tracking code and HTML markup to the public page and track all the public booking sessions.';
$lang['api'] = 'API';
$lang['api_info'] = 'API enable you to interact with all the Easy!Appointments data via the HTTP protocol and the available API endpoints and create your own integrations.';
$lang['api_info'] = 'API enable you to interact with all the MAKET Randevu data via the HTTP protocol and the available API endpoints and create your own integrations.';
$lang['google_analytics_code'] = 'Google Analytics Code';
$lang['matomo_analytics_url'] = 'Matomo Analytics URL';
$lang['future_booking_limit'] = 'Future Booking Limit';
@ -449,4 +449,8 @@ $lang['blocked_periods_hint'] = 'Define periods of time where public bookings wi
$lang['custom_field'] = 'Custom Field';
$lang['custom_fields'] = 'Custom Fields';
$lang['label'] = 'Label';
$lang['webhook_saved'] = 'Webhook saved successfully.';
$lang['webhook_deleted'] = 'Webhook deleted successfully.';
$lang['delete_webhook'] = 'Delete Webhook';
$lang['contact_info'] = 'Contact Info';
// End

View file

@ -1,10 +0,0 @@
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>

View file

@ -37,48 +37,48 @@
*/
defined('BASEPATH') or exit('No direct script access allowed');
$lang['cal_su'] = 'Su';
$lang['cal_mo'] = 'Mo';
$lang['cal_tu'] = 'Tu';
$lang['cal_we'] = 'We';
$lang['cal_th'] = 'Th';
$lang['cal_fr'] = 'Fr';
$lang['cal_sa'] = 'Sa';
$lang['cal_sun'] = 'Sun';
$lang['cal_mon'] = 'Mon';
$lang['cal_tue'] = 'Tue';
$lang['cal_wed'] = 'Wed';
$lang['cal_thu'] = 'Thu';
$lang['cal_fri'] = 'Fri';
$lang['cal_sat'] = 'Sat';
$lang['cal_sunday'] = 'Sunday';
$lang['cal_monday'] = 'Monday';
$lang['cal_tuesday'] = 'Tuesday';
$lang['cal_wednesday'] = 'Wednesday';
$lang['cal_thursday'] = 'Thursday';
$lang['cal_friday'] = 'Friday';
$lang['cal_saturday'] = 'Saturday';
$lang['cal_jan'] = 'Jan';
$lang['cal_feb'] = 'Feb';
$lang['cal_su'] = 'Pz';
$lang['cal_mo'] = 'Pt';
$lang['cal_tu'] = 'Sl';
$lang['cal_we'] = 'Çş';
$lang['cal_th'] = '';
$lang['cal_fr'] = 'Cm';
$lang['cal_sa'] = 'Ct';
$lang['cal_sun'] = 'Pzr';
$lang['cal_mon'] = 'Pzt';
$lang['cal_tue'] = 'Salı';
$lang['cal_wed'] = 'Çrş';
$lang['cal_thu'] = 'Prş';
$lang['cal_fri'] = 'Cuma';
$lang['cal_sat'] = 'Cmt';
$lang['cal_sunday'] = 'Pazar';
$lang['cal_monday'] = 'Pazartesi';
$lang['cal_tuesday'] = 'Salı';
$lang['cal_wednesday'] = 'Çarşamba';
$lang['cal_thursday'] = 'Perşembe';
$lang['cal_friday'] = 'Cuma';
$lang['cal_saturday'] = 'Cumartesi';
$lang['cal_jan'] = 'Oca';
$lang['cal_feb'] = 'Şub';
$lang['cal_mar'] = 'Mar';
$lang['cal_apr'] = 'Apr';
$lang['cal_apr'] = 'Nis';
$lang['cal_may'] = 'May';
$lang['cal_jun'] = 'Jun';
$lang['cal_jul'] = 'Jul';
$lang['cal_aug'] = 'Aug';
$lang['cal_sep'] = 'Sep';
$lang['cal_oct'] = 'Oct';
$lang['cal_nov'] = 'Nov';
$lang['cal_dec'] = 'Dec';
$lang['cal_january'] = 'January';
$lang['cal_february'] = 'February';
$lang['cal_march'] = 'March';
$lang['cal_april'] = 'April';
$lang['cal_mayl'] = 'May';
$lang['cal_june'] = 'June';
$lang['cal_july'] = 'July';
$lang['cal_august'] = 'August';
$lang['cal_september'] = 'September';
$lang['cal_october'] = 'October';
$lang['cal_november'] = 'November';
$lang['cal_december'] = 'December';
$lang['cal_jun'] = 'Haz';
$lang['cal_jul'] = 'Tem';
$lang['cal_aug'] = 'Ağu';
$lang['cal_sep'] = 'Eyl';
$lang['cal_oct'] = 'Eki';
$lang['cal_nov'] = 'Kas';
$lang['cal_dec'] = 'Ara';
$lang['cal_january'] = 'Ocak';
$lang['cal_february'] = 'Şubat';
$lang['cal_march'] = 'Mart';
$lang['cal_april'] = 'Nisan';
$lang['cal_mayl'] = 'Mayıs';
$lang['cal_june'] = 'Haziran';
$lang['cal_july'] = 'Temmuz';
$lang['cal_august'] = 'Ağustos';
$lang['cal_september'] = 'Eylül';
$lang['cal_october'] = 'Ekim';
$lang['cal_november'] = 'Kasım';
$lang['cal_december'] = 'Aralık';

View file

@ -37,20 +37,20 @@
*/
defined('BASEPATH') or exit('No direct script access allowed');
$lang['date_year'] = 'Year';
$lang['date_years'] = 'Years';
$lang['date_month'] = 'Month';
$lang['date_months'] = 'Months';
$lang['date_week'] = 'Week';
$lang['date_weeks'] = 'Weeks';
$lang['date_day'] = 'Day';
$lang['date_days'] = 'Days';
$lang['date_hour'] = 'Hour';
$lang['date_hours'] = 'Hours';
$lang['date_minute'] = 'Minute';
$lang['date_minutes'] = 'Minutes';
$lang['date_second'] = 'Second';
$lang['date_seconds'] = 'Seconds';
$lang['date_year'] = 'Yıl';
$lang['date_years'] = 'Yıl';
$lang['date_month'] = 'Ay';
$lang['date_months'] = 'AY';
$lang['date_week'] = 'Hafta';
$lang['date_weeks'] = 'Hafta';
$lang['date_day'] = 'Gün';
$lang['date_days'] = 'Gün';
$lang['date_hour'] = 'Saat';
$lang['date_hours'] = 'Saat';
$lang['date_minute'] = 'Dakika';
$lang['date_minutes'] = 'Dakika';
$lang['date_second'] = 'Saniye';
$lang['date_seconds'] = 'Saniye';
$lang['UM12'] = '(UTC -12:00) Baker/Howland Island';
$lang['UM11'] = '(UTC -11:00) Niue';
@ -70,7 +70,7 @@ $lang['UM1'] = '(UTC -1:00) Azores, Cape Verde Islands';
$lang['UTC'] = '(UTC) Greenwich Mean Time, Western European Time';
$lang['UP1'] = '(UTC +1:00) Central European Time, West Africa Time';
$lang['UP2'] = '(UTC +2:00) Central Africa Time, Eastern European Time, Kaliningrad Time';
$lang['UP3'] = '(UTC +3:00) Moscow Time, East Africa Time, Arabia Standard Time';
$lang['UP3'] = '(UTC +3:00) Moscow Time, East Africa Time, Arabia Standard Time, Türkiye Time';
$lang['UP35'] = '(UTC +3:30) Iran Standard Time';
$lang['UP4'] = '(UTC +4:00) Azerbaijan Standard Time, Samara Time';
$lang['UP45'] = '(UTC +4:30) Afghanistan';

View file

@ -15,7 +15,7 @@ $lang['db_unable_to_select'] = 'Belirtilen veri tabanı seçilemiyor: %s';
$lang['db_unable_to_create'] = 'Belirtilen veri tabanı oluşturulamıyor: %s';
$lang['db_invalid_query'] = 'Verilen sorgu geçersiz.';
$lang['db_must_set_table'] = 'Sorguda kullanılacak tabloyu belirtmelisiniz.';
$lang['db_must_use_set'] = 'Kaydı güncellemek için "set" metodu kullanmalısınız.';
$lang['db_must_use_set'] = 'Kaydı güncellemek için "set" metodunu kullanmalısınız.';
$lang['db_must_use_index'] = 'Toplu güncellemede eşleştirme için bir indeks belirtmelisiniz.';
$lang['db_batch_missing_index'] = 'Toplu güncelleme için verilen bir veya birden fazla kaydın belirtilen indeksi eksik.';
$lang['db_must_use_where'] = '"where" sözcüğü olmayan güncellemelere izin verilmez.';

View file

@ -37,8 +37,8 @@
*/
defined('BASEPATH') or exit('No direct script access allowed');
$lang['form_validation_required'] = 'The {field} field is required.';
$lang['form_validation_isset'] = 'The {field} field must have a value.';
$lang['form_validation_required'] = '{field} alanı zorunludur.';
$lang['form_validation_isset'] = '{field} alanı bir değere sahip olmalıdır.';
$lang['form_validation_valid_email'] = 'The {field} field must contain a valid email address.';
$lang['form_validation_valid_emails'] = 'The {field} field must contain all valid email addresses.';
$lang['form_validation_valid_url'] = 'The {field} field must contain a valid URL.';

View file

@ -1,6 +1,12 @@
<?php defined('BASEPATH') OR exit('No direct script access allowed');
// Turkish
$lang['address'] = 'Okulunuzun Adı';
$lang['city'] = 'Okulunuzun Bulunduğu Şehir';
$lang['zip_code'] = 'Gelecek Öğrenci Sayısı';
$lang['notes'] = 'Eklemek İstedikleriniz';
$lang['system_installation'] = 'Sistem Yüklemesi';
$lang['system_installation_welcome_header'] = branding("software", "name") . " sistem yükleme sayfasına hoşgeldiniz";
$lang['powered_by'] = '<a href="' . branding("software", "website") . '" target="_blank">' . branding("software", "name") . '</a> Gururla Sunar';
$lang['system_installation_welcome_header'] = branding("software", "name_tr") . " sistem yükleme sayfasına hoşgeldiniz";
$lang['powered_by'] = '<a href="' . branding("software", "website") . '" target="_blank">' . branding("software", "name_tr") . '</a> Gururla Sunar';
// End

View file

@ -41,4 +41,4 @@ $lang['terabyte_abbr'] = 'TB';
$lang['gigabyte_abbr'] = 'GB';
$lang['megabyte_abbr'] = 'MB';
$lang['kilobyte_abbr'] = 'KB';
$lang['bytes'] = 'Bytes';
$lang['bytes'] = 'Bayt';

View file

@ -1,6 +1,6 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
// Turkish
$lang['page_title'] = 'Randevu Alınacak Kişi';
$lang['page_title'] = 'Randevu Al | ';
$lang['service_and_provider'] = 'Hizmet ve Hizmet Sağlayıcıyı Seçin';
$lang['select_service'] = 'Hizmeti Seçin';
$lang['select_provider'] = 'Hizmet Sağlayıcıyı Seçin';
@ -17,10 +17,10 @@ $lang['last_name'] = 'Soyad';
$lang['email'] = 'Eposta';
$lang['phone_number'] = 'Telefon No';
$lang['phone'] = 'Phone';
$lang['address'] = 'Adres';
$lang['city'] = 'Şehir';
$lang['zip_code'] = 'Posta Kodu';
$lang['notes'] = 'Notlar';
// $lang['address'] = 'Adres';
// $lang['city'] = 'Şehir';
// $lang['zip_code'] = 'Posta Kodu';
// $lang['notes'] = 'Notlar';
$lang['language'] = 'Dil';
$lang['no_language'] = 'Dil yok';
$lang['fields_are_required'] = '* Zorunlu Alanlar.';
@ -175,22 +175,22 @@ $lang['visible'] = 'Gözle görülür';
$lang['hidden'] = 'Gizli';
$lang['business_logic'] = 'İş Mantığı';
$lang['current_user'] = 'Mevcut Kullanıcı';
$lang['about_app'] = 'Easy!Appointments Hakkında';
$lang['about_app'] = 'MAKET Randevu Hakkında';
$lang['edit_working_plan_hint'] = 'Aağıda şirketinizin kabul edeceği günleri ve saatleri işaretleyin. Çalışma saatleri dışında randevuları ayarlayabilirsiniz, ancak bu saatlere müşterilerin kendileri randevu kaydedemeyecektir. Bu çalışma planı tüm sağlayıcılar için varsayılan değer olup, daha sonra her biri için ayrıca özel plan da girebilir ve araları ekleyebilirsiniz.';
$lang['edit_breaks_hint'] = 'Gün içindeki çalışma aralarını ekleyin. Bu aralar tüm yeni hizmet sağlayıcılar için geçerli olacaktır.';
$lang['book_advance_timeout'] = 'Erken Randevu Zamanaşımı Değeri';
$lang['book_advance_timeout_hint'] = 'Müşterilerin en az ne kadar önceden randevu alması veya randevu düzenlemesi gerektiğini girin (dakika cinsinden).';
$lang['timeout_minutes'] = 'Zamanaşımı (Dakika)';
$lang['about_app_info'] = 'Easy!Appointments yüksek ölçüde özelleştirilebilen, müşterilerinizin web üzerinden randevu almasını sağlayan bir uygulamadır. Ayrıca, bilgilerinizi Google Takvim ile eşitleyerek diğer uygulamalarla da entegre olmasını sağlar. ';
$lang['about_app_info'] = 'MAKET Randevu yüksek ölçüde özelleştirilebilen, müşterilerinizin web üzerinden randevu almasını sağlayan bir uygulamadır. Ayrıca, bilgilerinizi Google Takvim ile eşitleyerek diğer uygulamalarla da entegre olmasını sağlar. ';
$lang['current_version'] = 'Mevcut Versiyon';
$lang['support'] = 'Destek';
$lang['about_app_support'] = 'Easy!Appointments kullanımı sırasında sorun yaşamanız halinde resmi Google Group üzerinde arama yapabilirsiniz. Ayrıca geliştirmeye destek olmak için Google Code sayfasında yeni sorun girişi de yapabilirsiniz.';
$lang['about_app_support'] = 'MAKET Randevu kullanımı sırasında sorun yaşamanız halinde resmi Google Group üzerinde arama yapabilirsiniz. Ayrıca geliştirmeye destek olmak için Google Code sayfasında yeni sorun girişi de yapabilirsiniz.';
$lang['official_website'] = 'Resmi Web Sitesi';
$lang['google_plus_community'] = 'Google+ Çevresi';
$lang['support_group'] = 'Destek Grubu';
$lang['project_issues'] = 'Proje Sorunları';
$lang['license'] = 'Lisans';
$lang['about_app_license'] = 'Easy!Appointments GPLv3 kapsamında lisanslıdır. Bu yazılımı herhangi bir biçimde kullanarak aşağıdaki adreste belirtilen koşulları kabul etmiş olursunuz:';
$lang['about_app_license'] = 'MAKET Randevu GPLv3 kapsamında lisanslıdır. Bu yazılımı herhangi bir biçimde kullanarak aşağıdaki adreste belirtilen koşulları kabul etmiş olursunuz:';
$lang['logout_success'] = 'Başarı ile sistemden çıkış yaptınız! Aşağıdaki butonlara tıklayarak diğer sayfalara geçebilirsiniz.';
$lang['book_appointment_title'] = 'Randevu Al';
$lang['backend_section'] = 'Yönetim Paneli';
@ -272,7 +272,7 @@ $lang['select_google_calendar_prompt'] = 'Randevularınızı eşitlemek istediğ
$lang['google_calendar_selected'] = 'Google Takvimi başarıyla seçildi.';
$lang['oops_something_went_wrong'] = 'Oops! Bir Sorun Oluştu.';
$lang['could_not_add_to_google_calendar'] = 'Randevunuz Google Takvim hesabınıza eklenemedi.';
$lang['ea_update_success'] = 'Easy!Appointments başarı ile güncellendi.';
$lang['ea_update_success'] = 'MAKET Randevu başarı ile güncellendi.';
$lang['require_captcha'] = 'CAPTCHA gereklidir';
$lang['require_captcha_hint'] = 'When enabled, the customers will have to type a random generated CAPTCHA string before booking/updating an appointment.';
$lang['captcha_is_wrong'] = 'CAPTCHA verification failed, please try again.';
@ -320,7 +320,7 @@ $lang['add_working_plan_exception'] = 'İstisna ekle';
$lang['require_phone_number'] = 'Telefon num. gerekli';
$lang['require_phone_number_hint'] = 'Etkinleştirildiğinde, müşterilerin ve kullanıcıların randevu alırken müşterinin telefon numarasını girmeleri gerekir.';
$lang['check_spam_folder'] = 'E-posta birkaç dakika içinde gelmezse lütfen spam klasörünüzü kontrol edin.';
$lang['api_token_hint'] = 'Easy!Appointments Api sinin belirteç tabanlı kimlik doğrulamasını etkinleştirmek için gizli bir belirteç ayarlayın.';
$lang['api_token_hint'] = 'MAKET Randevu Api sinin belirteç tabanlı kimlik doğrulamasını etkinleştirmek için gizli bir belirteç ayarlayın.';
$lang['timezone'] = 'Saat Dilimi';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?';
$lang['working_plans_got_updated'] = 'Tüm çalışma planları güncellendi.';
@ -362,8 +362,8 @@ $lang['private_hint'] = 'Private records will not be displayed or processed in p
$lang['reset'] = 'Reset';
$lang['all'] = 'All';
$lang['booking_link'] = 'Booking Link';
$lang['add_new_event'] = 'Add New Event';
$lang['what_kind_of_event'] = 'What kind of event would you like to add?';
$lang['add_new_event'] = 'Yeni Etkinlik Ekle';
$lang['what_kind_of_event'] = 'Ne tarz bir etkinlik eklemek istersiniz?';
$lang['theme'] = 'Theme';
$lang['limit_customer_access'] = 'Limit Customer Access';
$lang['limit_customer_access_hint'] = 'If enabled, providers and secretaries will only be able to access customers they have an appointment with.';
@ -396,7 +396,7 @@ $lang['google_analytics_info'] = 'Google Analytics enable you to automatically a
$lang['matomo_analytics'] = 'Matomo Analytics';
$lang['matomo_analytics_info'] = 'Matomo Analytics enable you to automatically add the tracking code and HTML markup to the public page and track all the public booking sessions.';
$lang['api'] = 'API';
$lang['api_info'] = 'API enable you to interact with all the Easy!Appointments data via the HTTP protocol and the available API endpoints and create your own integrations.';
$lang['api_info'] = 'API enable you to interact with all the MAKET Randevu data via the HTTP protocol and the available API endpoints and create your own integrations.';
$lang['google_analytics_code'] = 'Google Analytics Code';
$lang['matomo_analytics_url'] = 'Matomo Analytics URL';
$lang['future_booking_limit'] = 'Future Booking Limit';
@ -408,37 +408,37 @@ $lang['at_least_one_field'] = 'At least one field must be displayed in the booki
$lang['status'] = 'Status';
$lang['appointment_status_options'] = 'Appointment Status Options';
$lang['appointment_status_options_info'] = 'Define a list of available appointment status options that can be used in the the calendar page (the first one will automatically become the default value).';
$lang['sunday_short'] = 'Sun';
$lang['monday_short'] = 'Mon';
$lang['tuesday_short'] = 'Tue';
$lang['wednesday_short'] = 'Wed';
$lang['thursday_short'] = 'Thu';
$lang['friday_short'] = 'Fri';
$lang['saturday_short'] = 'Sat';
$lang['january_short'] = 'Jan';
$lang['february_short'] = 'Feb';
$lang['sunday_short'] = 'Pzr';
$lang['monday_short'] = 'Pzt';
$lang['tuesday_short'] = 'Salı';
$lang['wednesday_short'] = 'Çrş';
$lang['thursday_short'] = 'Prş';
$lang['friday_short'] = 'Cuma';
$lang['saturday_short'] = 'Cmt';
$lang['january_short'] = 'Oca';
$lang['february_short'] = 'Şub';
$lang['march_short'] = 'Mar';
$lang['april_short'] = 'Apr';
$lang['april_short'] = 'Nis';
$lang['may_short'] = 'May';
$lang['june_short'] = 'Jun';
$lang['july_short'] = 'Jul';
$lang['august_short'] = 'Aug';
$lang['september_short'] = 'Sep';
$lang['october_short'] = 'Oct';
$lang['november_short'] = 'Nov';
$lang['december_short'] = 'Dec';
$lang['june_short'] = 'Haz';
$lang['july_short'] = 'Tem';
$lang['august_short'] = 'Ağu';
$lang['september_short'] = 'Eyl';
$lang['october_short'] = 'Eki';
$lang['november_short'] = 'Kas';
$lang['december_short'] = 'Ara';
$lang['am'] = 'am';
$lang['pm'] = 'pm';
$lang['to'] = 'to';
$lang['click_to_toggle'] = 'Click To Toggle';
$lang['week_short'] = 'Wk';
$lang['week_short'] = 'Hf';
$lang['scroll_to_increment'] = 'Scroll To Increment';
$lang['year'] = 'Year';
$lang['make_non_working_day'] = 'This provider will not be available for work on the selected day.';
$lang['year'] = 'Yıl';
$lang['make_non_working_day'] = 'Hizmet sağlayıcı seçilen günlerde müsait olmayacak';
$lang['no_breaks'] = 'No Breaks';
$lang['service_categories'] = 'Service Categories';
$lang['service_category'] = 'Service Category';
$lang['blocked_period_saved'] = 'Blocked period saved successfully.';
$lang['service_categories'] = 'Hizmet Kategorileri';
$lang['service_category'] = 'Hizmet Kategorisi';
$lang['blocked_period_saved'] = 'Bloklanan Periyot başarıyla kaydedildi.'; // REVIEW
$lang['blocked_period_deleted'] = 'Blocked period deleted successfully.';
$lang['delete_blocked_period'] = 'Delete Blocked Period';
$lang['blocked_period'] = 'Blocked Period';
@ -446,7 +446,11 @@ $lang['blocked_periods'] = 'Blocked Periods';
$lang['blocked_period_save'] = 'Blocked Period Save';
$lang['blocked_period_delete'] = 'Blocked Period Delete';
$lang['blocked_periods_hint'] = 'Define periods of time where public bookings will be disabled for all providers (e.g. closed dates, holidays etc.).';
$lang['custom_field'] = 'Custom Field';
$lang['custom_fields'] = 'Custom Fields';
$lang['label'] = 'Label';
$lang['custom_field'] = 'Değiştirilebilir Alan';
$lang['custom_fields'] = 'Değiştirilebilir Alanlar';
$lang['label'] = 'Etiket';
$lang['webhook_saved'] = 'Webhook saved successfully.';
$lang['webhook_deleted'] = 'Webhook deleted successfully.';
$lang['delete_webhook'] = 'Delete Webhook';
$lang['contact_info'] = 'İletişim Bilgisi';
// End

View file

@ -53,3 +53,5 @@ $lang['upload_no_filepath'] = 'The upload path does not appear to be valid.';
$lang['upload_no_file_types'] = 'You have not specified any allowed file types.';
$lang['upload_bad_filename'] = 'The file name you submitted already exists on the server.';
$lang['upload_not_writable'] = 'The upload destination folder does not appear to be writable.';
// REVIEW ileride kullanıcılardan bir belge alınması istenirse çevirileri kontrol et!

View file

@ -151,7 +151,7 @@ class Api
#[NoReturn]
public function request_authentication(): void
{
header('WWW-Authenticate: Basic realm="Easy!Appointments"');
header('WWW-Authenticate: Basic realm="MAKET Randevu"');
header('HTTP/1.0 401 Unauthorized');
exit('You are not authorized to use the API.');
}

View file

@ -1,7 +1,7 @@
<?php defined('BASEPATH') or exit('No direct script access allowed');
/* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler
* MAKET Randevu - Open Source Web Scheduler
*
* @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com>
@ -41,6 +41,10 @@ class Captcha_builder
* @var array
*/
protected $lineColor = null;
/**
* @var array
*/
protected $background = null;
/**
* @var array
*/

View file

@ -125,16 +125,15 @@ class Instance
// Provider
$this->CI->providers_model->save([
'first_name' => 'Jane',
'last_name' => 'Doe',
'email' => 'jane@example.org',
'phone_number' => '+10000000000',
'first_name' => 'Hizmet Sağlayıcı İsmini Buraya Girin',
'last_name' => 'Hizmet Sağlayıcı Soyismini Buraya Girin',
'email' => 'hizmet_saglayici_mail@example.org',
'phone_number' => '+90 (000) 000-0000',
'services' => [$service_id],
'settings' => [
'username' => 'janedoe',
'username' => 'ilkhizmetsaglayici',
'password' => random_string(),
'working_plan' => setting('company_working_plan'),
'working_plan_exceptions' => '{}',
'notifications' => true,
'google_sync' => false,
'sync_past_days' => 30,
@ -146,10 +145,10 @@ class Instance
// Customer
$this->CI->customers_model->save([
'first_name' => 'James',
'last_name' => 'Doe',
'email' => 'james@example.org',
'phone_number' => '+10000000000',
'first_name' => 'Örnek Müşteri İsmi',
'last_name' => 'Örnek Müşteri Soyismi',
'email' => 'ornek_musteri@example.org',
'phone_number' => '+90 (000) 000-0000',
]);
return $password;

View file

@ -63,7 +63,7 @@ class Notifications
bool $manage_mode = false,
): void {
try {
$current_language = config('english');
$current_language = config('language');
$customer_link = site_url('booking/reschedule/' . $appointment['hash']);

View file

@ -28,14 +28,15 @@ class Timezones
/**
* @var string
*/
protected string $default = 'UTC';
protected string $default = 'Istanbul (+3:00)'; // REVIEW is it working??
/**
* @var array
*/
protected array $timezones = [
'UTC' => [
'General' => [
'UTC' => 'UTC',
'Europe/Istanbul' => 'Istanbul (+3:00)', // REVIEW is this line proper and working correctly???
],
'America' => [
'America/Adak' => 'Adak (-10:00)',
@ -317,7 +318,6 @@ class Timezones
'Europe/Bucharest' => 'Bucharest (+2:00)',
'Europe/Chisinau' => 'Chisinau (+2:00)',
'Europe/Helsinki' => 'Helsinki (+2:00)',
'Europe/Istanbul' => 'Istanbul (+3:00)',
'Europe/Kaliningrad' => 'Kaliningrad (+2:00)',
'Europe/Kiev' => 'Kiev (+2:00)',
'Europe/Mariehamn' => 'Mariehamn (+2:00)',
@ -331,6 +331,7 @@ class Timezones
'Europe/Uzhgorod' => 'Uzhgorod (+2:00)',
'Europe/Vilnius' => 'Vilnius (+2:00)',
'Europe/Zaporozhye' => 'Zaporozhye (+2:00)',
'Europe/Istanbul' => 'Istanbul (+3:00)',
'Europe/Moscow' => 'Moscow (+3:00)',
'Europe/Volgograd' => 'Volgograd (+3:00)',
'Europe/Samara' => 'Samara (+4:00)',
@ -343,13 +344,13 @@ class Timezones
'Asia/Beirut' => 'Beirut (+2:00)',
'Asia/Damascus' => 'Damascus (+2:00)',
'Asia/Gaza' => 'Gaza (+2:00)',
'Asia/Istanbul' => 'Istanbul (+3:00)',
'Asia/Jerusalem' => 'Jerusalem (+2:00)',
'Asia/Nicosia' => 'Nicosia (+2:00)',
'Asia/Tel_Aviv' => 'Tel_Aviv (+2:00)',
'Asia/Aden' => 'Aden (+3:00)',
'Asia/Baghdad' => 'Baghdad (+3:00)',
'Asia/Bahrain' => 'Bahrain (+3:00)',
'Asia/Istanbul' => 'Istanbul (+3:00)',
'Asia/Kuwait' => 'Kuwait (+3:00)',
'Asia/Qatar' => 'Qatar (+3:00)',
'Asia/Tehran' => 'Tehran (+3:30)',
@ -530,7 +531,7 @@ class Timezones
*/
public function get_default_timezone(): string
{
return 'UTC';
return 'Europe/Istanbul'; // REVIEW is it working in proper way?
}
/**

View file

@ -23,7 +23,7 @@ class Migration_Add_timezone_to_users extends EA_Migration
'timezone' => [
'type' => 'VARCHAR',
'constraint' => '256',
'default' => 'UTC',
'default' => 'Europe/Istanbul', // REVIEW Works under migration ?
'after' => 'notes',
],
];

View file

@ -96,7 +96,9 @@ class Services_model extends EA_Model
// If a category was provided then make sure it really exists in the database.
if (!empty($service['id_service_categories'])) {
$count = $this->db->get_where('categories', ['id' => $service['id_service_categories']])->num_rows();
$count = $this->db
->get_where('service_categories', ['id' => $service['id_service_categories']])
->num_rows();
if (!$count) {
throw new InvalidArgumentException(
@ -387,7 +389,7 @@ class Services_model extends EA_Model
foreach ($resources as $resource) {
$service['category'] = match ($resource) {
'category' => $this->db
->get_where('categories', [
->get_where('service_categories', [
'id' => $service['id_service_categories'] ?? ($service['serviceCategoryId'] ?? null),
])
->row_array(),

View file

@ -277,4 +277,65 @@ class Webhooks_model extends EA_Model
{
// Webhooks do not currently have any related resources.
}
/**
* Convert the database webhook record to the equivalent API resource.
*
* @param array $webhook Webhook data.
*/
public function api_encode(array &$webhook): void
{
$encoded_resource = [
'id' => array_key_exists('id', $webhook) ? (int) $webhook['id'] : null,
'name' => $webhook['name'],
'url' => $webhook['url'],
'actions' => $webhook['actions'],
'secret_token' => $webhook['secret_token'],
'is_ssl_verified' => $webhook['is_ssl_verified'],
'notes' => $webhook['notes'],
];
$webhook = $encoded_resource;
}
/**
* Convert the API resource to the equivalent database webhook record.
*
* @param array $webhook API resource.
* @param array|null $base Base webhook data to be overwritten with the provided values (useful for updates).
*/
public function api_decode(array &$webhook, array $base = null)
{
$decoded_resource = $base ?: [];
if (array_key_exists('id', $webhook)) {
$decoded_resource['id'] = $webhook['id'];
}
if (array_key_exists('name', $webhook)) {
$decoded_resource['name'] = $webhook['name'];
}
if (array_key_exists('url', $webhook)) {
$decoded_resource['url'] = $webhook['url'];
}
if (array_key_exists('actions', $webhook)) {
$decoded_resource['actions'] = $webhook['actions'];
}
if (array_key_exists('secretToken', $webhook)) {
$decoded_resource['secret_token'] = $webhook['secretToken'];
}
if (array_key_exists('isSslVerified', $webhook)) {
$decoded_resource['is_ssl_verified'] = $webhook['isSslVerified'];
}
if (array_key_exists('notes', $webhook)) {
$decoded_resource['notes'] = $webhook['notes'];
}
$webhook = $decoded_resource;
}
}

View file

@ -172,7 +172,7 @@
<small>
<?= lang('current_user') ?>:
<span>
<?= $timezones[session('timezone', 'UTC')] ?>
<?= $timezones[session('timezone', 'Europe/Istanbul')] ?>
</span>
</small>
</div>

View file

@ -7,7 +7,7 @@
?>
<div id="footer" class="d-lg-flex justify-content-lg-start align-items-lg-center p-2 text-center text-lg-left mt-auto">
<div class="mb-3 me-lg-5 mb-lg-0">
<img class="me-1" src="<?= base_url('assets/img/logo-16x16.png') ?>" alt="Easy!Appointments Logo">
<img class="me-1" src="<?= base_url('assets/img/logo-16x16.png') ?>" alt="MAKET Randevu Logo">
<a href="<?= branding('software','website')?>"><?= branding('software','name')?></a>

View file

@ -11,13 +11,19 @@
<div id="wizard-frame-4" class="wizard-frame" style="display:none;">
<div class="frame-container">
<h2 class="frame-title"><?= lang('appointment_confirmation') ?></h2>
<div class="row frame-content">
<div id="appointment-details" class="col-12 col-md-6 text-center text-md-start"></div>
<div id="customer-details" class="col-12 col-md-6 text-center text-md-end"></div>
<div class="row frame-content m-auto pt-md-4 mb-4">
<div id="appointment-details" class="col-12 col-md-6 text-center text-md-start mb-2 mb-md-0">
<!-- JS -->
</div>
<div id="customer-details" class="col-12 col-md-6 text-center text-md-end">
<!-- JS -->
</div>
</div>
<?php if (setting('require_captcha')): ?>
<div class="row frame-content">
<div class="col-12 col-md-6">
<div class="row frame-content m-auto">
<div class="col">
<label class="captcha-title" for="captcha-text">
CAPTCHA
<button class="btn btn-link text-dark text-decoration-none py-0">

View file

@ -23,7 +23,7 @@
<?= lang('timezone') ?>
</label>
<?php component('timezone_dropdown', [
'attributes' => 'id="select-timezone" class="form-control" value="UTC"',
'attributes' => 'id="select-timezone" class="form-control" value="Europe/Istanbul"',
'grouped_timezones' => $grouped_timezones,
]); ?>
</div>

View file

@ -11,7 +11,7 @@
<h2 class="frame-title"><?= lang('service_and_provider') ?></h2>
<div class="row frame-content">
<div class="col">
<div class="col col-md-8 offset-md-2 mt-md-5">
<div class="mb-3">
<label for="select-service">
<strong><?= lang('service') ?></strong>
@ -83,7 +83,9 @@
<select id="select-provider" class="form-control"></select>
</div>
<div id="service-description"></div>
<div id="service-description" class="small">
<!-- JS -->
</div>
</div>
</div>
</div>

View file

@ -63,7 +63,7 @@
<small>
<?= lang('current_user') ?>:
<span>
<?= $timezones[session('timezone', 'UTC')] ?>
<?= $timezones[session('timezone', 'Europe/Istanbul')] ?>
</span>
</small>
</div>

View file

@ -13,7 +13,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Error | Easy!Appointments</title>
<title>Error | MAKET Randevu</title>
<style>
#error-container {
background: #ffffff;
@ -74,7 +74,7 @@
<p>
<small>
<a href="https://easyappointments.org">Easy!Appointments</a>
<a href="https://iflpanel.com/about/maketrandevu">MAKET Randevu</a>
</small>
</p>
</div>

View file

@ -9,7 +9,7 @@
<?php slot('meta'); ?>
<title><?= vars('page_title') ?? lang('backend_section') ?> | Easy!Appointments</title>
<title><?= vars('page_title') ?? lang('backend_section') ?> | MAKET Randevu</title>
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
<link rel="icon" sizes="192x192" href="<?= asset_url('assets/img/logo.png') ?>">

View file

@ -7,7 +7,7 @@
<meta name="theme-color" content="#35A768">
<meta name="google" content="notranslate">
<meta property="og:title" content="<?= lang('page_title') . ' ' . vars('company_name') ?> | Easy!Appointments"/>
<meta property="og:title" content="<?= lang('page_title') . ' ' . vars('company_name') ?> | MAKET Randevu"/>
<meta property="og:description" content="Book Your Appointment With A Few Clicks"/>
<meta property="og:url" content="<?= base_url() ?>">
<meta property="og:image" content="<?= base_url('assets/img/social-card.png') ?>"/>
@ -15,7 +15,7 @@
<?php slot('meta'); ?>
<title><?= lang('page_title') . ' ' . vars('company_name') ?> | Easy!Appointments</title>
<title><?= lang('page_title') . ' ' . vars('company_name') ?> | MAKET Randevu</title>
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
<link rel="icon" sizes="192x192" href="<?= asset_url('assets/img/logo.png') ?>">

View file

@ -9,7 +9,7 @@
<?php slot('meta'); ?>
<title><?= vars('page_title') ?> | Easy!Appointments</title>
<title><?= vars('page_title') ?> | MAKET Randevu</title>
<link rel="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
<link rel="icon" sizes="192x192" href="<?= asset_url('assets/img/logo.png') ?>">
@ -32,8 +32,7 @@
<div class="mt-2">
<small>
<a href="https://easyappointments.org">Easy!Appointments</a>
<?= lang("powered_by") ?>
</small>
</div>

View file

@ -6,10 +6,10 @@
<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">
<img src="<?= base_url('assets/img/logo.png') ?>" alt="MAKET Randevu Logo" class="mb-5">
<h3>
Easy!Appointments
<?= branding("software", "name") ?>
</h3>
<h6 class="text-primary">
Online Appointment Scheduler

View file

@ -28,6 +28,11 @@
<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>
@ -52,11 +57,6 @@
<?= lang('cancel') ?>
</button>
</div>
<a href="<?= site_url('business_settings') ?>" class="btn btn-outline-primary ms-4">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
</div>
<h4 class="text-black-50 mb-3 fw-light">

View file

@ -3,7 +3,7 @@
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Installation | Easy!Appointments</title>
<title>Installation | MAKET Randevu</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') ?>">
@ -17,20 +17,20 @@
<header>
<div class="container">
<h1 class="page-title">Easy!Appointments Installation</h1>
<h1 class="page-title">MAKET Randevu Installation</h1>
</div>
</header>
<div class="content container">
<div class="welcome">
<h3>Welcome to the Easy!Appointments installation page.</h3>
<h3>Welcome to the MAKET Randevu installation page.</h3>
<p>
This page will help you set the main settings of your Easy!Appointments installation. You will be able to
This page will help you set the main settings of your MAKET Randevu 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.
of MAKET Randevu.
If you face any problems during the usage of Easy!Appointments you can always check the
If you face any problems during the usage of MAKET Randevu 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
@ -113,9 +113,9 @@
<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
MAKET Randevu 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:
of MAKET Randevu 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>
@ -123,13 +123,13 @@
<button type="button" id="install" class="btn btn-primary">
<i class="icon-white icon-ok me-2"></i>
Install Easy!Appointments
Install MAKET Randevu
</button>
</div>
<footer>
<a href="https://easyappointments.org">Easy!Appointments</a>
<a href="https://easyappointments.org">MAKET Randevu</a>
</footer>
<?php component('js_vars_script'); ?>

View file

@ -27,6 +27,11 @@
<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>
@ -51,11 +56,6 @@
<?= lang('cancel') ?>
</button>
</div>
<a href="<?= site_url('integrations') ?>" class="btn btn-outline-primary ms-4">
<i class="fas fa-chevron-left me-2"></i>
<?= lang('back') ?>
</a>
</div>
<h4 class="text-black-50 mb-3 fw-light">

View file

@ -185,7 +185,7 @@ body {
margin: 15px 0;
padding-right: 10px;
width: auto;
max-height: 255px;
max-height: 250px;
}
#book-appointment-wizard #available-hours div {
@ -273,6 +273,10 @@ body {
margin: 15px 0;
}
#book-appointment-wizard #wizard-frame-4 .frame-container .frame-content {
max-width: 630px;
}
@media (min-width: 768px) {
.wrapper {
min-height: 100vh;

View file

@ -52,6 +52,8 @@ App.Components.AppointmentsModal = (function () {
const $customField4 = $('#custom-field-4');
const $customField5 = $('#custom-field-5');
const moment = window.moment;
/**
* Update the displayed timezone.
*/
@ -85,8 +87,11 @@ App.Components.AppointmentsModal = (function () {
// ID must exist on the object in order for the model to update the record and not to perform
// an insert operation.
const startDatetime = moment($startDatetime[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD HH:mm:ss');
const endDatetime = moment($endDatetime[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD HH:mm:ss');
const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
const startDatetime = moment(startDateTimeObject).format('YYYY-MM-DD HH:mm:ss');
const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDatetime);
const endDatetime = moment(endDateTimeObject).format('YYYY-MM-DD HH:mm:ss');
const appointment = {
id_services: $selectService.val(),
@ -204,8 +209,8 @@ App.Components.AppointmentsModal = (function () {
startMoment.add(1, 'hour').set({minutes: 0});
}
$startDatetime[0]._flatpickr.setDate(startMoment.toDate());
$endDatetime[0]._flatpickr.setDate(startMoment.add(duration, 'minutes').toDate());
App.Utils.UI.setDateTimePickerValue($startDatetime, startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($endDatetime, startMoment.add(duration, 'minutes').toDate());
// Display modal form.
$appointmentsModal.find('.modal-header h3').text(lang('new_appointment_title'));
@ -362,8 +367,9 @@ App.Components.AppointmentsModal = (function () {
const duration = service ? service.duration : 60;
const start = $startDatetime[0]._flatpickr.selectedDates[0];
$endDatetime[0]._flatpickr.setDate(new Date(start.getTime() + duration * 60000));
const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
const endDateTimeObject = new Date(startDateTimeObject.getTime() + duration * 60000);
App.Utils.UI.setDateTimePickerValue($endDatetime, endDateTimeObject);
// Update the providers select box.
@ -481,7 +487,7 @@ App.Components.AppointmentsModal = (function () {
const startDatetime = new Date();
const endDatetime = moment().add(duration, 'minutes').toDate();
App.Utils.UI.initializeDatetimepicker($startDatetime, {
App.Utils.UI.initializeDateTimePicker($startDatetime, {
onClose: () => {
const serviceId = $selectService.val();
@ -490,15 +496,16 @@ App.Components.AppointmentsModal = (function () {
(availableService) => Number(availableService.id) === Number(serviceId),
);
const start = $startDatetime[0]._flatpickr.selectedDates[0];
$endDatetime[0]._flatpickr.setDate(new Date(start.getTime() + service.duration * 60000));
const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
const endDateTimeObject = new Date(startDateTimeObject.getTime() + service.duration * 60000);
App.Utils.UI.setDateTimePickerValue($endDatetime, endDateTimeObject);
},
});
$startDatetime[0]._flatpickr.setDate(startDatetime);
App.Utils.UI.setDateTimePickerValue($startDatetime, startDatetime);
App.Utils.UI.initializeDatetimepicker($endDatetime);
$endDatetime[0]._flatpickr.setDate(endDatetime);
App.Utils.UI.initializeDateTimePicker($endDatetime);
App.Utils.UI.setDateTimePickerValue($endDatetime, endDatetime);
}
/**
@ -538,9 +545,10 @@ App.Components.AppointmentsModal = (function () {
}
// Check appointment start and end time.
const start = $startDatetime[0]._flatpickr.selectedDates[0];
const end = $endDatetime[0]._flatpickr.selectedDates[0];
if (start > end) {
const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDatetime);
if (startDateTimeObject > endDateTimeObject) {
$startDatetime.addClass('is-invalid');
$endDatetime.addClass('is-invalid');
throw new Error(lang('start_date_before_end_error'));

View file

@ -28,6 +28,8 @@ App.Components.UnavailabilitiesModal = (function () {
const $selectFilterItem = $('#select-filter-item');
const $reloadAppointments = $('#reload-appointments');
const moment = window.moment;
/**
* Update the displayed timezone.
*/
@ -68,22 +70,22 @@ App.Components.UnavailabilitiesModal = (function () {
return;
}
const startMoment = moment($startDatetime[0]._flatpickr.selectedDates[0]);
const startDateTimeMoment = moment(App.Utils.UI.getDateTimePickerValue($startDatetime));
if (!startMoment.isValid()) {
if (!startDateTimeMoment.isValid()) {
$startDatetime.addClass('is-invalid');
return;
}
const endMoment = moment($endDatetime[0]._flatpickr.selectedDates[0]);
const endDateTimeMoment = moment(App.Utils.UI.getDateTimePickerValue($endDatetime));
if (!endMoment.isValid()) {
if (!endDateTimeMoment.isValid()) {
$endDatetime.addClass('is-invalid');
return;
}
if (startMoment.isAfter(endMoment)) {
if (startDateTimeMoment.isAfter(endDateTimeMoment)) {
// Start time is after end time - display message to user.
$unavailabilitiesModal
.find('.modal-message')
@ -100,8 +102,8 @@ App.Components.UnavailabilitiesModal = (function () {
// Unavailability period records go to the appointments table.
const unavailability = {
start_datetime: startMoment.format('YYYY-MM-DD HH:mm:ss'),
end_datetime: endMoment.format('YYYY-MM-DD HH:mm:ss'),
start_datetime: startDateTimeMoment.format('YYYY-MM-DD HH:mm:ss'),
end_datetime: endDateTimeMoment.format('YYYY-MM-DD HH:mm:ss'),
notes: $unavailabilitiesModal.find('#unavailability-notes').val(),
id_users_provider: $selectProvider.val(),
};
@ -156,8 +158,8 @@ App.Components.UnavailabilitiesModal = (function () {
$selectProvider.val($selectFilterItem.val()).closest('.form-group').hide();
}
$startDatetime[0]._flatpickr.setDate(startMoment.toDate());
$endDatetime[0]._flatpickr.setDate(startMoment.add(1, 'hour').toDate());
App.Utils.UI.setDateTimePickerValue($startDatetime, startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($endDatetime, startMoment.add(1, 'hour').toDate());
$dialog.find('.modal-header h3').text(lang('new_unavailability_title'));
$dialog.modal('show');
@ -183,11 +185,11 @@ App.Components.UnavailabilitiesModal = (function () {
true,
);
App.Utils.UI.initializeDatetimepicker($startDatetime);
App.Utils.UI.initializeDateTimePicker($startDatetime);
$startDatetime.val(start);
App.Utils.UI.initializeDatetimepicker($endDatetime);
App.Utils.UI.initializeDateTimePicker($endDatetime);
$endDatetime.val(end);

View file

@ -77,19 +77,19 @@ App.Components.WorkingPlanExceptionsModal = (function () {
function validate() {
$modal.find('.is-invalid').removeClass('is-invalid');
const date = $date[0]._flatpickr.selectedDates[0];
const date = App.Utils.UI.getDateTimePickerValue($date);
if (!date) {
$date.addClass('is-invalid');
}
const start = $start[0]._flatpickr.selectedDates[0];
const start = App.Utils.UI.getDateTimePickerValue($start);
if (!start) {
$start.addClass('is-invalid');
}
const end = $end[0]._flatpickr.selectedDates[0];
const end = App.Utils.UI.getDateTimePickerValue($end);
if (!end) {
$end.addClass('is-invalid');
@ -157,15 +157,15 @@ App.Components.WorkingPlanExceptionsModal = (function () {
return;
}
const date = moment($date[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD');
const date = moment(App.Utils.UI.getDateTimePickerValue($date)).format('YYYY-MM-DD');
const isNonWorkingDay = $isNonWorkingDay.prop('checked');
const workingPlanException = isNonWorkingDay
? null
: {
start: moment($start[0]._flatpickr.selectedDates[0]).format('HH:mm'),
end: moment($end[0]._flatpickr.selectedDates[0]).format('HH:mm'),
start: moment(App.Utils.UI.getDateTimePickerValue($start)).format('HH:mm'),
end: moment(App.Utils.UI.getDateTimePickerValue($end)).format('HH:mm'),
breaks: getBreaks(),
};
@ -223,9 +223,9 @@ App.Components.WorkingPlanExceptionsModal = (function () {
function add() {
deferred = $.Deferred();
$date[0]._flatpickr.setDate(new Date());
$start[0]._flatpickr.setDate(moment('08:00', 'HH:mm').toDate());
$end[0]._flatpickr.setDate(moment('20:00', 'HH:mm').toDate());
App.Utils.UI.setDateTimePickerValue($date, new Date());
App.Utils.UI.setDateTimePickerValue($start, moment('08:00', 'HH:mm').toDate());
App.Utils.UI.setDateTimePickerValue($end, moment('20:00', 'HH:mm').toDate());
$isNonWorkingDay.prop('checked', false);
@ -249,11 +249,11 @@ App.Components.WorkingPlanExceptionsModal = (function () {
const isNonWorkingDay = !Boolean(workingPlanException);
$date[0]._flatpickr.setDate(moment(date, 'YYYY-MM-DD').toDate());
App.Utils.UI.setDateTimePickerValue($date, moment(date, 'YYYY-MM-DD').toDate());
if (isNonWorkingDay === false) {
$start[0]._flatpickr.setDate(moment(workingPlanException.start, 'HH:mm').toDate());
$end[0]._flatpickr.setDate(moment(workingPlanException.end, 'HH:mm').toDate());
App.Utils.UI.setDateTimePickerValue($start, moment(workingPlanException.start, 'HH:mm').toDate());
App.Utils.UI.setDateTimePickerValue($end, moment(workingPlanException.end, 'HH:mm').toDate());
if (!workingPlanException.breaks) {
$breaks.find('tbody').html(renderNoBreaksRow());
@ -267,8 +267,8 @@ App.Components.WorkingPlanExceptionsModal = (function () {
$breaks.find('tbody .working-plan-exceptions-break-start, tbody .working-plan-exceptions-break-end'),
);
} else {
$start[0]._flatpickr.setDate(moment('08:00', 'HH:mm').toDate());
$end[0]._flatpickr.setDate(moment('20:00', 'HH:mm').toDate());
App.Utils.UI.setDateTimePickerValue($start, moment('08:00', 'HH:mm').toDate());
App.Utils.UI.setDateTimePickerValue($end, moment('20:00', 'HH:mm').toDate());
$breaks.find('tbody').html(renderNoBreaksRow());
}
@ -380,7 +380,7 @@ App.Components.WorkingPlanExceptionsModal = (function () {
// Make all cells in current row editable.
let $tr = $(this).closest('tr');
$tr.children().trigger('edit');
App.Utils.UI.initializeTimepicker(
App.Utils.UI.initializeTimePicker(
$tr.find('.working-plan-exceptions-break-start input, .working-plan-exceptions-break-end input'),
);
$(this).closest('tr').find('.working-plan-exceptions-break-start').focus();
@ -462,9 +462,9 @@ App.Components.WorkingPlanExceptionsModal = (function () {
* Initialize the module.
*/
function initialize() {
App.Utils.UI.initializeDatepicker($date);
App.Utils.UI.initializeTimepicker($start);
App.Utils.UI.initializeTimepicker($end);
App.Utils.UI.initializeDatePicker($date);
App.Utils.UI.initializeTimePicker($start);
App.Utils.UI.initializeTimePicker($end);
$modal
.on('hidden.bs.modal', onModalHidden)

View file

@ -300,7 +300,7 @@ App.Http.Booking = (function () {
const currentDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), i);
if (unavailableDates.indexOf(moment(currentDate).format('YYYY-MM-DD')) === -1) {
$('#select-date')[0]._flatpickr.setDate(currentDate);
App.Utils.UI.setDateTimePickerValue($('#select-date'), currentDate);
getAvailableHours(moment(currentDate).format('YYYY-MM-DD'));
break;
}
@ -328,7 +328,7 @@ App.Http.Booking = (function () {
!unavailableDates.includes(dateQueryParam) &&
dateQueryParamMoment.format('YYYY-MM') === selectedDateMoment.format('YYYY-MM')
) {
$('#select-date')[0]._flatpickr.setDate(dateQueryParamMoment.toDate());
App.Utils.UI.setDateTimePickerValue($('#select-date'), dateQueryParamMoment.toDate());
}
}

View file

@ -123,9 +123,9 @@ App.Pages.BlockedPeriods = (function () {
* Event: Blocked period Save Button "Click"
*/
$blockedPeriods.on('click', '#save-blocked-period', () => {
const startDateTimeObject = App.Utils.UI.getDatetimepickerValue($startDateTime);
const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDateTime);
const startDateTimeMoment = moment(startDateTimeObject);
const endDateTimeObject = App.Utils.UI.getDatetimepickerValue($endDateTime);
const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDateTime);
const endDateTimeMoment = moment(endDateTimeObject);
const blockedPeriod = {
@ -235,8 +235,8 @@ App.Pages.BlockedPeriods = (function () {
function display(blockedPeriod) {
$id.val(blockedPeriod.id);
$name.val(blockedPeriod.name);
App.Utils.UI.setDatetimepickerValue($startDateTime, new Date(blockedPeriod.start_datetime));
App.Utils.UI.setDatetimepickerValue($endDateTime, new Date(blockedPeriod.end_datetime));
App.Utils.UI.setDateTimePickerValue($startDateTime, new Date(blockedPeriod.start_datetime));
App.Utils.UI.setDateTimePickerValue($endDateTime, new Date(blockedPeriod.end_datetime));
$notes.val(blockedPeriod.notes);
}
@ -263,8 +263,8 @@ App.Pages.BlockedPeriods = (function () {
throw new Error(lang('fields_are_required'));
}
const startDateTimeObject = App.Utils.UI.getDatetimepickerValue($startDateTime);
const endDateTimeObject = App.Utils.UI.getDatetimepickerValue($endDateTime);
const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDateTime);
const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDateTime);
if (startDateTimeObject >= endDateTimeObject) {
$startDateTime.addClass('is-invalid');
@ -346,8 +346,8 @@ App.Pages.BlockedPeriods = (function () {
resetForm();
filter('');
addEventListeners();
App.Utils.UI.initializeDatetimepicker($startDateTime);
App.Utils.UI.initializeDatetimepicker($endDateTime);
App.Utils.UI.initializeDateTimePicker($startDateTime);
App.Utils.UI.initializeDateTimePicker($endDateTime);
}
document.addEventListener('DOMContentLoaded', initialize);

View file

@ -82,7 +82,7 @@ App.Pages.Booking = (function () {
// Initialize page's components (tooltips, date pickers etc).
tippy('[data-tippy-content]');
App.Utils.UI.initializeDatepicker($selectDate, {
App.Utils.UI.initializeDatePicker($selectDate, {
inline: true,
minDate: moment().subtract(1, 'day').set({hours: 23, minutes: 59, seconds: 59}).toDate(),
maxDate: moment().add(vars('future_booking_limit'), 'days').toDate(),
@ -126,7 +126,7 @@ App.Pages.Booking = (function () {
},
});
$selectDate[0]._flatpickr.setDate(new Date());
App.Utils.UI.setDateTimePickerValue($selectDate, new Date());
const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const isTimezoneSupported = $selectTimezone.find(`option[value="${browserTimezone}"]`).length > 0;
@ -269,7 +269,7 @@ App.Pages.Booking = (function () {
* Event: Timezone "Changed"
*/
$selectTimezone.on('change', () => {
const date = $selectDate[0]._flatpickr.selectedDates[0];
const date = App.Utils.UI.getDateTimePickerValue($selectDate);
if (!date) {
return;
@ -291,7 +291,7 @@ App.Pages.Booking = (function () {
App.Http.Booking.getUnavailableDates(
$target.val(),
$selectService.val(),
moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD'),
moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD'),
);
updateConfirmFrame();
});
@ -327,7 +327,7 @@ App.Pages.Booking = (function () {
App.Http.Booking.getUnavailableDates(
$selectProvider.val(),
$target.val(),
moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD'),
moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD'),
);
updateConfirmFrame();
@ -586,141 +586,120 @@ App.Pages.Booking = (function () {
* customer settings and input for the appointment booking.
*/
function updateConfirmFrame() {
if ($availableHours.find('.selected-hour').text() === '') {
return;
const serviceOptionText = $selectService.find('option:selected').text();
$('.display-selected-service').text(serviceOptionText).removeClass('invisible');
const providerOptionText = $selectProvider.find('option:selected').text();
$('.display-selected-provider').text(providerOptionText).removeClass('invisible');
if (!$availableHours.find('.selected-hour').text()) {
return; // No time is selected, skip the rest of this function...
}
// Appointment Details
let selectedDate = $selectDate[0]._flatpickr.selectedDates[0];
if (selectedDate !== null) {
selectedDate = App.Utils.Date.format(selectedDate, vars('date_format'), vars('time_format'));
}
// Render the appointment details
const serviceId = $selectService.val();
let servicePrice = '';
let serviceCurrency = '';
vars('available_services').forEach((service) => {
if (Number(service.id) === Number(serviceId) && Number(service.price) > 0) {
servicePrice = service.price;
serviceCurrency = service.currency;
return false; // Break loop
const service = vars('available_services').find(
(availableService) => Number(availableService.id) === Number(serviceId),
);
if (!service) {
return; // Service was not found
}
});
$(document)
.find('.display-selected-service')
.text($selectService.find('option:selected').text())
.removeClass('invisible');
const selectedDateObject = App.Utils.UI.getDateTimePickerValue($selectDate);
const selectedDateMoment = moment(selectedDateObject);
const selectedDate = selectedDateMoment.format('YYYY-MM-DD');
const selectedTime = $availableHours.find('.selected-hour').text();
const selectedDateTime = `${selectedDate} ${selectedTime}`;
$(document)
.find('.display-selected-provider')
.text($selectProvider.find('option:selected').text())
.removeClass('invisible');
let formattedSelectedDate;
$('#appointment-details').empty();
if (selectedDateObject) {
formattedSelectedDate = App.Utils.Date.format(
selectedDateTime,
vars('date_format'),
vars('time_format'),
true,
);
}
$('<div/>', {
'html': [
$('<h4/>', {
'text': lang('appointment'),
}),
$('<p/>', {
'html': [
$('<span/>', {
'text': lang('service') + ': ' + $selectService.find('option:selected').text(),
}),
$('<br/>'),
$('<span/>', {
'text': lang('provider') + ': ' + $selectProvider.find('option:selected').text(),
}),
$('<br/>'),
$('<span/>', {
'text':
lang('start') +
': ' +
selectedDate +
' ' +
$availableHours.find('.selected-hour').text(),
}),
$('<br/>'),
$('<span/>', {
'text': lang('timezone') + ': ' + $selectTimezone.find('option:selected').text(),
}),
$('<br/>'),
$('<span/>', {
'text': lang('price') + ': ' + servicePrice + ' ' + serviceCurrency,
'prop': {
'hidden': !servicePrice,
},
}),
],
}),
],
}).appendTo('#appointment-details');
const timezoneOptionText = $selectTimezone.find('option:selected').text();
$('#appointment-details').html(`
<div>
<div class="mb-2 fw-bold fs-3">
${serviceOptionText}
</div>
<div class="mb-2 fw-bold text-muted">
${providerOptionText}
</div>
<div class="mb-2">
<i class="fas fa-clock me-2"></i>
${service.duration} ${lang('minutes')}
</div>
<div class="mb-2">
<i class="fas fa-calendar-day me-2"></i>
${formattedSelectedDate}
</div>
<div class="mb-2">
<i class="fas fa-globe me-2"></i>
${timezoneOptionText}
</div>
<div class="mb-2" ${!Number(service.price) ? 'hidden' : ''}>
<i class="fas fa-cash-register me-2"></i>
${Number(service.price).toFixed(2)} ${service.currency}
</div>
</div>
`);
// Render the customer information
// Customer Details
const firstName = App.Utils.String.escapeHtml($firstName.val());
const lastName = App.Utils.String.escapeHtml($lastName.val());
const fullName = firstName + ' ' + lastName;
const phoneNumber = App.Utils.String.escapeHtml($phoneNumber.val());
const fullName = `${firstName} ${lastName}`.trim();
const email = App.Utils.String.escapeHtml($email.val());
const phoneNumber = App.Utils.String.escapeHtml($phoneNumber.val());
const address = App.Utils.String.escapeHtml($address.val());
const city = App.Utils.String.escapeHtml($city.val());
const zipCode = App.Utils.String.escapeHtml($zipCode.val());
$('#customer-details').empty();
const addressParts = [];
$('<div/>', {
'html': [
$('<h4/>)', {
'text': lang('customer'),
}),
$('<p/>', {
'html': [
fullName
? $('<span/>', {
'text': lang('customer') + ': ' + fullName,
})
: null,
fullName ? $('<br/>') : null,
phoneNumber
? $('<span/>', {
'text': lang('phone_number') + ': ' + phoneNumber,
})
: null,
phoneNumber ? $('<br/>') : null,
email
? $('<span/>', {
'text': lang('email') + ': ' + email,
})
: null,
email ? $('<br/>') : null,
address
? $('<span/>', {
'text': lang('address') + ': ' + address,
})
: null,
address ? $('<br/>') : null,
city
? $('<span/>', {
'text': lang('city') + ': ' + city,
})
: null,
city ? $('<br/>') : null,
zipCode
? $('<span/>', {
'text': lang('zip_code') + ': ' + zipCode,
})
: null,
zipCode ? $('<br/>') : null,
],
}),
],
}).appendTo('#customer-details');
if (city) {
addressParts.push(city);
}
if (zipCode) {
addressParts.push(zipCode);
}
$('#customer-details').html(`
<div>
<div class="mb-2 fw-bold fs-3">
${lang('contact_info')}
</div>
<div class="mb-2 fw-bold text-muted" ${!fullName ? 'hidden' : ''}>
${fullName}
</div>
<div class="mb-2" ${!email ? 'hidden' : ''}>
${email}
</div>
<div class="mb-2" ${!email ? 'hidden' : ''}>
${phoneNumber}
</div>
<div class="mb-2" ${!address ? 'hidden' : ''}>
${address}
</div>
<div class="mb-2" ${!addressParts.length ? 'hidden' : ''}>
${addressParts.join(', ')}
</div>
</div>
`);
// Update appointment form data for submission to server when the user confirms the appointment.
const data = {};
data.customer = {
@ -736,7 +715,7 @@ App.Pages.Booking = (function () {
data.appointment = {
start_datetime:
moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD') +
moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD') +
' ' +
moment($('.selected-hour').data('value'), 'HH:mm').format('HH:mm') +
':00',
@ -753,6 +732,7 @@ App.Pages.Booking = (function () {
data.appointment.id = vars('appointment_data').id;
data.customer.id = vars('customer_data').id;
}
$('input[name="post_data"]').val(JSON.stringify(data));
}
@ -772,7 +752,7 @@ App.Pages.Booking = (function () {
);
// Add the duration to the start datetime.
const selectedDate = moment($selectDate[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD');
const selectedDate = moment(App.Utils.UI.getDateTimePickerValue($selectDate)).format('YYYY-MM-DD');
const selectedHour = $('.selected-hour').data('value'); // HH:mm
@ -807,7 +787,7 @@ App.Pages.Booking = (function () {
// Set Appointment Date
const startMoment = moment(appointment.start_datetime);
$selectDate[0]._flatpickr.setDate(startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($selectDate, startMoment.toDate());
App.Http.Booking.getAvailableHours(startMoment.format('YYYY-MM-DD'));
// Apply Customer's Data
@ -833,6 +813,8 @@ App.Pages.Booking = (function () {
}
/**
* Update the service description and information.
*
* This method updates the HTML content with a brief description of the
* user selected service (only if available in db). This is useful for the
* customers upon selecting the correct service.
@ -849,41 +831,45 @@ App.Pages.Booking = (function () {
);
if (!service) {
return;
return; // Service not found
}
$('<strong/>', {
'text': App.Utils.String.escapeHtml(service.name),
}).appendTo($serviceDescription);
// Render the additional service information
if (service.description) {
$('<br/>').appendTo($serviceDescription);
$('<span/>', {
'html': App.Utils.String.escapeHtml(service.description).replaceAll('\n', '<br/>'),
}).appendTo($serviceDescription);
}
if (service.duration || Number(service.price) > 0 || service.location) {
$('<br/>').appendTo($serviceDescription);
}
const additionalInfoParts = [];
if (service.duration) {
$('<span/>', {
'text': '[' + lang('duration') + ' ' + service.duration + ' ' + lang('minutes') + ']',
}).appendTo($serviceDescription);
additionalInfoParts.push(`${lang('duration')}: ${service.duration} ${lang('minutes')}`);
}
if (Number(service.price) > 0) {
$('<span/>', {
'text': '[' + lang('price') + ' ' + service.price + ' ' + service.currency + ']',
}).appendTo($serviceDescription);
additionalInfoParts.push(`${lang('price')}: ${service.price} ${service.currency}`);
}
if (service.location) {
$('<span/>', {
'text': '[' + lang('location') + ' ' + service.location + ']',
}).appendTo($serviceDescription);
additionalInfoParts.push(`${lang('location')}: ${service.location}`);
}
if (additionalInfoParts.length) {
$(`
<div class="mb-2 fst-italic">
${additionalInfoParts.join(', ')}
</div>
`).appendTo($serviceDescription);
}
// Render the service description
if (service.description.length) {
const escapedDescription = App.Utils.String.escapeHtml(service.description);
const multiLineDescription = escapedDescription.replaceAll('\n', '<br/>');
$(`
<div class="text-muted">
${multiLineDescription}
</div>
`).appendTo($serviceDescription);
}
}

View file

@ -138,10 +138,10 @@ App.Utils.CalendarDefaultView = (function () {
// Set the start and end datetime of the appointment.
startMoment = moment(appointment.start_datetime);
$appointmentsModal.find('#start-datetime')[0]._flatpickr.setDate(startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#start-datetime'), startMoment.toDate());
endMoment = moment(appointment.end_datetime);
$appointmentsModal.find('#end-datetime')[0]._flatpickr.setDate(endMoment.toDate());
App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#end-datetime'), endMoment.toDate());
const customer = appointment.customer;
$appointmentsModal.find('#customer-id').val(appointment.id_users_customer);
@ -183,10 +183,16 @@ App.Utils.CalendarDefaultView = (function () {
// Apply unavailability data to dialog.
$unavailabilitiesModal.find('.modal-header h3').text(lang('edit_unavailability_title'));
$unavailabilitiesModal.find('#unavailability-start')[0]._flatpickr.setDate(startMoment.toDate());
App.Utils.UI.setDateTimePickerValue(
$unavailabilitiesModal.find('#unavailability-start'),
startMoment.toDate(),
);
App.Utils.UI.setDateTimePickerValue(
$unavailabilitiesModal.find('#unavailability-end'),
endMoment.toDate(),
);
$unavailabilitiesModal.find('#unavailability-id').val(unavailability.id);
$unavailabilitiesModal.find('#unavailability-provider').val(unavailability.id_users_provider);
$unavailabilitiesModal.find('#unavailability-end')[0]._flatpickr.setDate(endMoment.toDate());
$unavailabilitiesModal.find('#unavailability-notes').val(unavailability.notes);
$unavailabilitiesModal.modal('show');
}
@ -1057,9 +1063,9 @@ App.Utils.CalendarDefaultView = (function () {
$('#unavailability-provider').trigger('change');
$('#unavailability-start')[0]._flatpickr.setDate(info.start);
App.Utils.UI.setDateTimePickerValue($('#unavailability-start'), info.start);
$('#unavailability-end')[0]._flatpickr.setDate(info.end);
App.Utils.UI.setDateTimePickerValue($('#unavailability-end'), info.end);
messageModal.dispose();
},
@ -1113,8 +1119,11 @@ App.Utils.CalendarDefaultView = (function () {
}
// Preselect time
$('#start-datetime')[0]._flatpickr.setDate(info.start);
$('#end-datetime')[0]._flatpickr.setDate(App.Pages.Calendar.getSelectionEndDate(info));
App.Utils.UI.setDateTimePickerValue($('#start-datetime'), info.start);
App.Utils.UI.setDateTimePickerValue(
$('#end-datetime'),
App.Pages.Calendar.getSelectionEndDate(info),
);
messageModal.dispose();
},
@ -1586,10 +1595,13 @@ App.Utils.CalendarDefaultView = (function () {
// Set the start and end datetime of the appointment.
const startDatetimeMoment = moment(appointment.start_datetime);
$appointmentsModal.find('#start-datetime')[0]._flatpickr.setDate(startDatetimeMoment.toDate());
App.Utils.UI.setDateTimePickerValue(
$appointmentsModal.find('#start-datetime'),
startDatetimeMoment.toDate(),
);
const endDatetimeMoment = moment(appointment.end_datetime);
$appointmentsModal.find('#end-datetime')[0]._flatpickr.setDate(endDatetimeMoment.toDate());
App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#end-datetime'), endDatetimeMoment.toDate());
const customer = appointment.customer;
$appointmentsModal.find('#customer-id').val(appointment.id_users_customer);

View file

@ -43,25 +43,25 @@ App.Utils.CalendarTableView = (function () {
function addEventListeners() {
$calendar.on('click', '.calendar-header .btn.previous', () => {
const dayInterval = $selectFilterItem.val();
const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDate = moment(currentDate).subtract(1, 'days');
const endDate = startDate.clone().add(dayInterval - 1, 'days');
$selectDate[0]._flatpickr.setDate(startDate.toDate());
App.Utils.UI.setDateTimePickerValue($selectDate, startDate.toDate());
createView(startDate.toDate(), endDate.toDate());
});
$calendar.on('click', '.calendar-header .btn.next', () => {
const dayInterval = $selectFilterItem.val();
const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDate = moment(currentDate).add(1, 'days');
const endDate = startDate.clone().add(dayInterval - 1, 'days');
$selectDate[0]._flatpickr.setDate(startDate.toDate());
App.Utils.UI.setDateTimePickerValue($selectDate, startDate.toDate());
createView(startDate.toDate(), endDate.toDate());
});
$calendarToolbar.on('change', '#select-filter-item', () => {
const dayInterval = $selectFilterItem.val();
const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDate = moment(currentDate);
const endDate = startDate.clone().add(dayInterval - 1, 'days');
createView(startDate.toDate(), endDate.toDate());
@ -70,7 +70,7 @@ App.Utils.CalendarTableView = (function () {
$calendarToolbar.on('click', '#reload-appointments', () => {
// Fetch the events and place them in the existing HTML format.
const dayInterval = $selectFilterItem.val();
const currentDate = $selectDate[0]._flatpickr.selectedDates[0];
const currentDate = App.Utils.UI.getDateTimePickerValue($selectDate);
const startDateMoment = moment(currentDate);
const startDate = startDateMoment.toDate();
const endDateMoment = startDateMoment.clone().add(dayInterval - 1, 'days');
@ -212,10 +212,10 @@ App.Utils.CalendarTableView = (function () {
// Set the start and end datetime of the appointment.
startMoment = moment(appointment.start_datetime);
$appointmentsModal.find('#start-datetime')[0]._flatpickr.setDate(startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#start-datetime'), startMoment.toDate());
endMoment = moment(appointment.end_datetime);
$appointmentsModal.find('#end-datetime')[0]._flatpickr.setDate(endMoment.toDate());
App.Utils.UI.setDateTimePickerValue($appointmentsModal.find('#end-datetime'), endMoment.toDate());
const customer = appointment.customer;
$appointmentsModal.find('#customer-id').val(appointment.id_users_customer);
@ -257,10 +257,10 @@ App.Utils.CalendarTableView = (function () {
// Apply unavailability data to dialog.
$unavailabilitiesModal.find('.modal-header h3').text(lang('edit_unavailability_title'));
$unavailabilitiesModal.find('#unavailability-start')[0]._flatpickr.setDate(startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($('#unavailability-start'), startMoment.toDate());
App.Utils.UI.setDateTimePickerValue($('#unavailability-end'), endMoment.toDate());
$unavailabilitiesModal.find('#unavailability-id').val(unavailability.id);
$unavailabilitiesModal.find('#unavailability-provider').val(unavailability.id_users_provider);
$unavailabilitiesModal.find('#unavailability-end')[0]._flatpickr.setDate(endMoment.toDate());
$unavailabilitiesModal.find('#unavailability-notes').val(unavailability.notes);
$unavailabilitiesModal.modal('show');
@ -389,7 +389,7 @@ App.Utils.CalendarTableView = (function () {
],
}).appendTo($calendarHeader);
App.Utils.UI.initializeDatepicker($calendarHeader.find('.select-date'), {
App.Utils.UI.initializeDatePicker($calendarHeader.find('.select-date'), {
onChange(selectedDates) {
const startDate = selectedDates[0];
const endDate = moment(startDate)
@ -1742,9 +1742,8 @@ App.Utils.CalendarTableView = (function () {
$('#unavailability-provider').trigger('change');
$('#unavailability-start')[0]._flatpickr.setDate(info.start);
$('#unavailability-end')[0]._flatpickr.setDate(info.end);
App.Utils.UI.setDateTimePickerValue($('#unavailability-start'), info.start);
App.Utils.UI.setDateTimePickerValue($('#unavailability-end'), info.end);
messageModal.dispose();
},
@ -1783,8 +1782,11 @@ App.Utils.CalendarTableView = (function () {
$selectProvider.trigger('change');
// Preselect time
$('#start-datetime')[0]._flatpickr.setDate(info.start);
$('#end-datetime')[0]._flatpickr.setDate(App.Pages.Calendar.getSelectionEndDate(info));
App.Utils.UI.setDateTimePickerValue($('#start-datetime'), info.start);
App.Utils.UI.setDateTimePickerValue(
$('#end-datetime'),
App.Pages.Calendar.getSelectionEndDate(info),
);
messageModal.dispose();
},

View file

@ -148,7 +148,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Object} [params]
*/
function initializeDatetimepicker($target, params = {}) {
function initializeDateTimePicker($target, params = {}) {
$target.flatpickr({
enableTime: true,
allowInput: true,
@ -168,7 +168,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Object} [params]
*/
function initializeDatepicker($target, params = {}) {
function initializeDatePicker($target, params = {}) {
$target.flatpickr({
allowInput: true,
dateFormat: getDateFormat(),
@ -186,7 +186,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Object} [params]
*/
function initializeTimepicker($target, params = {}) {
function initializeTimePicker($target, params = {}) {
$target.flatpickr({
noCalendar: true,
enableTime: true,
@ -230,7 +230,7 @@ window.App.Utils.UI = (function () {
*
* @return {Date}
*/
function getDatetimepickerValue($target) {
function getDateTimePickerValue($target) {
if (!$target?.length) {
throw new Error('Empty $target argument provided.');
}
@ -244,7 +244,7 @@ window.App.Utils.UI = (function () {
* @param {jQuery} $target
* @param {Date} value
*/
function setDatetimepickerValue($target, value) {
function setDateTimePickerValue($target, value) {
if (!$target?.length) {
throw new Error('Empty $target argument provided.');
}
@ -253,12 +253,12 @@ window.App.Utils.UI = (function () {
}
return {
initializeDatetimepicker,
initializeDatepicker,
initializeTimepicker,
initializeDateTimePicker,
initializeDatePicker,
initializeTimePicker,
initializeDropdown,
initializeTextEditor,
getDatetimepickerValue,
setDatetimepickerValue,
getDateTimePickerValue,
setDateTimePickerValue,
};
})();

View file

@ -15,6 +15,8 @@
* This module implements the functionality of working plans.
*/
App.Utils.WorkingPlan = (function () {
const moment = window.moment;
/**
* Class WorkingPlan
*
@ -480,7 +482,7 @@ App.Utils.WorkingPlan = (function () {
$tr.children().trigger('edit');
App.Utils.UI.initializeTimepicker($tr.find('.break-start input, .break-end input'));
App.Utils.UI.initializeTimePicker($tr.find('.break-start input, .break-end input'));
$tr.find('.break-day select').focus();
@ -686,16 +688,16 @@ App.Utils.WorkingPlan = (function () {
disabled = disabled || false;
if (disabled === false) {
App.Utils.UI.initializeTimepicker($('.working-plan input:text'), {
App.Utils.UI.initializeTimePicker($('.working-plan input:text'), {
onChange: (selectedDates, dateStr, instance) => {
const startMoment = moment(selectedDates[0]);
const $workEnd = $(instance.input).closest('tr').find('.work-end');
const endMoment = moment($workEnd[0]._flatpickr.selectedDates[0]);
const endMoment = moment(App.Utils.UI.getDateTimePickerValue($workEnd));
if (startMoment > endMoment) {
$workEnd[0]._flatpickr.setDate(startMoment.add(1, 'hour').toDate());
App.Utils.UI.setDateTimePickerValue($workEnd, startMoment.add(1, 'hour').toDate());
}
},
});

View file

@ -1,7 +1,7 @@
{
"name": "maket/maketrandevu",
"description": "MAKET Randevu Portalı",
"version": "1.5.0-p1",
"version": "1.5.0-RC2",
"homepage": "https://iflpanel.com/about/maketrandevu",
"type": "project",
"license": "GPL-3.0",

6
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "70cead7cce550cc0e5a37eb1e558aee9",
"content-hash": "eafeafe75a984017de7900242825c958",
"packages": [
{
"name": "firebase/php-jwt",
@ -140,7 +140,7 @@
},
{
"name": "google/apiclient-services",
"version": "v0.329.0",
"version": "v0.330.0",
"source": {
"type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git",
@ -178,7 +178,7 @@
],
"support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.329.0"
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.330.0"
},
"time": "2023-12-24T01:02:15+00:00"
},

View file

@ -46,7 +46,7 @@ services:
swagger-ui:
platform: linux/amd64
image: swaggerapi/swagger-ui
image: swaggerapi/swagger-ui:v5.10.5
ports:
- "8000:8080"
volumes:

View file

@ -5,7 +5,7 @@
# Approximately 10min (tested with 4vcpu / 8GB RAM / 30Mbps network speed)
# MAKETRANDEVU_VER="test"
MAKETRANDEVU_VER="1.5.0-p1" # UPDATE MANUALLY !
MAKETRANDEVU_VER="1.5.0-RC2" # UPDATE MANUALLY !
_RED='\033[0;31m'
_NC='\033[0m \e[0m' # No Color, No Effect

View file

@ -25,7 +25,7 @@ const zip = require('zip-dir');
// const debug = require('gulp-debug');
function archive(done) {
const version = "1.5.0-p1"
const version = "1.5.0-RC2"
const filename = 'maketrandevu-' + version + '.zip';
fs.removeSync('build');

View file

@ -8,7 +8,7 @@ SCRIPT_NAME="nginx_docker_localtest.sh" # name of the *this* file
DEBUG="FALSE"
### REMOTE RELEASE ###
LATEST_RELEASE="1.5.0-p1"
LATEST_RELEASE="1.5.0-RC2"
FILE_NAME="maketrandevu-$LATEST_RELEASE.zip"
DOWNLOAD_LINK=https://git.aliberksandikci.com.tr/maket/maketrandevu/releases/download/$LATEST_RELEASE/$FILE_NAME
@ -34,16 +34,21 @@ COMMANDS:
restart: restart services (nginx, mariadb, php-fpm)
update: update source files with new build on /source/
status: see current webserver status
root: move to root web folder
help : see this help text
BUNDLE COMMANDS:
complete-restart: update + reconf + restart + reconf
EXTERNAL COMMANDS: (without dock keyword)
root: move to root web folder
"""
CONFIG_FILE_CONTENT="""
<?php
/* ----------------------------------------------------------------------------
* MaketRandevu - Izmir Fen Lisesi Randevu Portali
* MaketRandevu - MAKET Randevu Portalı
*
* @package maketrandevu
* @author asandikci <contact@aliberksandikci.com.tr>
@ -176,8 +181,8 @@ _status() {
}
if [[ $# -eq 0 ]]; then
if [[ $(pwd) != *maketrandevu ]]; then
echo "PLEASE CHANGE DIRECTORY TO \`maketrandevu/\` BEFORE STARTING SCRIPT"
if [[ $(pwd) != *MaketRandevu ]]; then
echo "PLEASE CHANGE DIRECTORY TO \`MaketRandevu/\` BEFORE STARTING SCRIPT"
exit
fi
# TODO silmeden önce onay iste!
@ -235,6 +240,27 @@ elif [[ $1 == "docker" ]]; then
echo RECONFIGURED
echo
_exit
elif [[ $2 == "complete-restart" ]]; then
echo "updating sources!"
rsync -a --progress /source/build/ $WEB_ROOT_FOLDER --exclude config.php --exclude storage
sleep 1
echo -e "$CONFIG_FILE_CONTENT" >"$WEB_ROOT_FOLDER/config.php"
echo -e "$NGINX_CONFIG_FILE" >"/etc/nginx/conf.d/default.conf"
echo -e "$PHP_FPM_CONFIG_FILE" >"/etc/php/8.2/fpm/pool.d/maketrandevu.conf"
echo RECONFIGURED
echo
service mariadb restart
sleep 3
service php8.2-fpm restart
sleep 3
service nginx restart
_status
elif [[ $2 == "update" ]]; then
echo "updating sources!"
rsync -a --progress /source/build/ $WEB_ROOT_FOLDER --exclude config.php --exclude storage

View file

@ -54,7 +54,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/Availabilities'
type: array
items:
type: string
'401':
description: Unauthorized
'500':
@ -131,7 +133,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/AppointmentCollection'
type: array
items:
$ref: '#/components/schemas/AppointmentRecord'
'401':
description: Unauthorized
'500':
@ -302,7 +306,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/UnavailabilityCollection'
type: array
items:
$ref: '#/components/schemas/UnavailabilityRecord'
'401':
description: Unauthorized
'500':
@ -311,6 +317,10 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
x-codegen-request-body-name: body
security:
- BearerToken: [ ]
- BasicAuth: [ ]
post:
tags:
- unavailabilities
@ -470,7 +480,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/CustomerCollection'
type: array
items:
$ref: '#/components/schemas/CustomerRecord'
'401':
description: Unauthorized
'500':
@ -641,7 +653,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceCollection'
type: array
items:
$ref: '#/components/schemas/ServiceRecord'
'401':
description: Unauthorized
'500':
@ -812,7 +826,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceCategoryCollection'
type: array
items:
$ref: '#/components/schemas/ServiceCategoryRecord'
'401':
description: Unauthorized
'500':
@ -983,7 +999,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/AdminCollection'
type: array
items:
$ref: '#/components/schemas/AdminRecord'
'401':
description: Unauthorized
'500':
@ -1154,7 +1172,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/ProviderCollection'
type: array
items:
$ref: '#/components/schemas/ProviderRecord'
'401':
description: Unauthorized
'500':
@ -1325,7 +1345,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/SecretaryCollection'
type: array
items:
$ref: '#/components/schemas/SecretaryRecord'
'401':
description: Unauthorized
'500':
@ -1490,7 +1512,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/SettingCollection'
type: array
items:
$ref: '#/components/schemas/ServiceRecord'
'401':
description: Unauthorized
'500':
@ -1606,7 +1630,9 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookCollection'
type: array
items:
$ref: '#/components/schemas/WebhookRecord'
'401':
description: Unauthorized
'500':
@ -1821,10 +1847,6 @@ components:
customerId: 5
providerId: 2
serviceId: 6
AppointmentCollection:
type: array
items:
$ref: '#/components/schemas/AppointmentRecord'
UnavailabilityRecord:
type: object
properties:
@ -1875,10 +1897,6 @@ components:
location: Test Street 1A, 12345 Some State, Some Place
notes: This is a test appointment.
providerId: 2
UnavailabilityCollection:
type: array
items:
$ref: '#/components/schemas/UnavailabilityRecord'
CustomerRecord:
type: object
properties:
@ -1978,10 +1996,6 @@ components:
customField4: Value4
customField5: Value5
notes: This is a test customer.
CustomerCollection:
type: array
items:
$ref: '#/components/schemas/CustomerRecord'
ServiceRecord:
type: object
properties:
@ -2048,10 +2062,6 @@ components:
availabilitiesType: flexible
attendantsNumber: 1
serviceCategoryId: null
ServiceCollection:
type: array
items:
$ref: '#/components/schemas/ServiceRecord'
ServiceCategoryRecord:
type: object
properties:
@ -2075,10 +2085,6 @@ components:
example:
name: Test Category
description: This is a test category.
ServiceCategoryCollection:
type: array
items:
$ref: '#/components/schemas/ServiceCategoryRecord'
AdminRecord:
type: object
properties:
@ -2187,10 +2193,6 @@ components:
password: Password@123
notifications: true
calendarView: default
AdminCollection:
type: array
items:
$ref: '#/components/schemas/AdminRecord'
ProviderRecord:
type: object
properties:
@ -2391,10 +2393,6 @@ components:
end: '17:00'
breaks: [ ]
saturday: null
ProviderCollection:
type: array
items:
$ref: '#/components/schemas/ProviderRecord'
SecretaryRecord:
type: object
properties:
@ -2516,10 +2514,6 @@ components:
password: Password@123
notifications: true
calendarView: default
SecretaryCollection:
type: array
items:
$ref: '#/components/schemas/SecretaryRecord'
SettingRecord:
type: object
properties:
@ -2537,10 +2531,6 @@ components:
type: string
example:
value: ACME Inc
SettingCollection:
type: array
items:
$ref: '#/components/schemas/SettingRecord'
WebhookRecord:
type: object
properties:
@ -2588,10 +2578,6 @@ components:
secretToken: SecureSecretTokenHere
isSslVerified: true
notes: This is a webhook.
WebhookCollection:
type: array
items:
$ref: '#/components/schemas/WebhookRecord'
ErrorResponse:
type: object
properties:

135
package-lock.json generated
View file

@ -60,12 +60,13 @@
}
},
"node_modules/@babel/code-frame": {
"version": "7.21.4",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz",
"integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==",
"version": "7.23.5",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
"dev": true,
"dependencies": {
"@babel/highlight": "^7.18.6"
"@babel/highlight": "^7.23.4",
"chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
@ -111,12 +112,12 @@
}
},
"node_modules/@babel/generator": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz",
"integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==",
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
"integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.21.5",
"@babel/types": "^7.23.6",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@ -226,34 +227,34 @@
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz",
"integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==",
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"version": "7.23.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"dependencies": {
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
"integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
"version": "7.22.5",
"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@ -383,30 +384,30 @@
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
"integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
"version": "7.22.6",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
"@babel/types": "^7.18.6"
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz",
"integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==",
"version": "7.23.4",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
"integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.19.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
"integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
"version": "7.22.20",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@ -451,13 +452,13 @@
}
},
"node_modules/@babel/highlight": {
"version": "7.18.6",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
"integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
"version": "7.23.4",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.18.6",
"chalk": "^2.0.0",
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
@ -465,9 +466,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.21.8",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz",
"integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==",
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
"integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@ -1593,34 +1594,34 @@
}
},
"node_modules/@babel/template": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
"integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
"version": "7.22.15",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
"integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/code-frame": "^7.22.13",
"@babel/parser": "^7.22.15",
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz",
"integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==",
"version": "7.23.7",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
"integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.21.4",
"@babel/generator": "^7.21.5",
"@babel/helper-environment-visitor": "^7.21.5",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.21.5",
"@babel/types": "^7.21.5",
"debug": "^4.1.0",
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.6",
"@babel/types": "^7.23.6",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
"engines": {
@ -1628,13 +1629,13 @@
}
},
"node_modules/@babel/types": {
"version": "7.21.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz",
"integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==",
"version": "7.23.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
"integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
"dev": true,
"dependencies": {
"@babel/helper-string-parser": "^7.21.5",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/helper-string-parser": "^7.23.4",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
@ -5814,9 +5815,9 @@
}
},
"node_modules/normalize-package-data/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@ -7051,9 +7052,9 @@
"integrity": "sha512-Hr9TdhyHCZUtwznEH2CBf7967mEM0idtJ5nMtjvk3Up5tPukOLXbHUNmh10oRfeNIhj+3GD3niu+g6sVK+gK0A=="
},
"node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"