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 | 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; $config['url'] = Config::BASE_URL;

View file

@ -94,13 +94,13 @@ $languages = [
$config['language_codes'] = $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]) $config['language'] = isset($_SERVER['HTTP_ACCEPT_LANGUAGE'], $languages[$language_code])
? $languages[$language_code] ? $languages[$language_code]
: Config::LANGUAGE; : 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 | 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'; // Example: $config['smtp_host'] = 'smtp.gmail.com';
// @link https://codeigniter.com/user_guide/libraries/email.html // @link https://codeigniter.com/user_guide/libraries/email.html
$config['useragent'] = 'Easy!Appointments'; $config['useragent'] = 'MaketRandevu';
$config['protocol'] = 'mail'; // or 'smtp' $config['protocol'] = 'mail'; // or 'smtp'
$config['mailtype'] = 'html'; // or 'text' $config['mailtype'] = 'html'; // or 'text'
// $config['smtp_debug'] = '0'; // or '1' // $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() public function perform()
{ {
@ -67,7 +67,7 @@ class Installation extends EA_Controller
$this->instance->migrate(); $this->instance->migrate();
// Insert admin // Insert admin
$admin['timezone'] = 'UTC'; $admin['timezone'] = 'Europe/Istanbul'; // REVIEW is it working properly ?!
$admin['settings']['username'] = $admin['username']; $admin['settings']['username'] = $admin['username'];
$admin['settings']['password'] = $admin['password']; $admin['settings']['password'] = $admin['password'];
$admin['settings']['notifications'] = true; $admin['settings']['notifications'] = true;
@ -92,8 +92,8 @@ class Installation extends EA_Controller
// Service // Service
$service_id = $this->services_model->save([ $service_id = $this->services_model->save([
'name' => 'Service', 'name' => 'Hizmet İsmini Buraya Girin',
'duration' => '30', 'duration' => '60',
'price' => '0', 'price' => '0',
'currency' => '', 'currency' => '',
'availabilities_type' => 'flexible', 'availabilities_type' => 'flexible',
@ -102,13 +102,13 @@ class Installation extends EA_Controller
// Provider // Provider
$this->providers_model->save([ $this->providers_model->save([
'first_name' => 'Jane', 'first_name' => 'Hizmet Sağlayıcı İsmini Buraya Girin',
'last_name' => 'Doe', 'last_name' => 'Hizmet Sağlayıcı Soyismini Buraya Girin',
'email' => 'jane@example.org', 'email' => 'hizmet_saglayici_mail@example.org',
'phone_number' => '+1 (000) 000-0000', 'phone_number' => '+90 (000) 000-0000',
'services' => [$service_id], 'services' => [$service_id],
'settings' => [ 'settings' => [
'username' => 'janedoe', 'username' => 'ilkhizmetsaglayici',
'password' => random_string(), 'password' => random_string(),
'working_plan' => setting('company_working_plan'), 'working_plan' => setting('company_working_plan'),
'notifications' => true, 'notifications' => true,
@ -121,10 +121,10 @@ class Installation extends EA_Controller
// Customer // Customer
$this->customers_model->save([ $this->customers_model->save([
'first_name' => 'James', 'first_name' => 'Örnek Müşteri İsmi',
'last_name' => 'Doe', 'last_name' => 'Örnek Müşteri Soyismi',
'email' => 'james@example.org', 'email' => 'ornek_musteri@example.org',
'phone_number' => '+1 (000) 000-0000', 'phone_number' => '+90 (000) 000-0000',
]); ]);
json_response([ json_response([

View file

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

View file

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

View file

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

View file

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

View file

@ -35,7 +35,7 @@ class Secretaries_api_v1 extends EA_Controller
/** /**
* Get a secretary collection. * Get a secretary collection.
*/ */
public function index() public function index(): void
{ {
try { try {
$keyword = $this->api->request_keyword(); $keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Secretaries_api_v1 extends EA_Controller
* *
* @param int|null $id Secretary ID. * @param int|null $id Secretary ID.
*/ */
public function show(int $id = null) public function show(int $id = null): void
{ {
try { try {
$occurrences = $this->secretaries_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields(); $fields = $this->api->request_fields();
$secretary = $this->secretaries_model->find($id); $secretary = $this->secretaries_model->find($id);
@ -90,12 +98,6 @@ class Secretaries_api_v1 extends EA_Controller
$this->secretaries_model->only($secretary, $fields); $this->secretaries_model->only($secretary, $fields);
} }
if (!$secretary) {
response('', 404);
return;
}
json_response($secretary); json_response($secretary);
} catch (Throwable $e) { } catch (Throwable $e) {
json_exception($e); json_exception($e);
@ -105,7 +107,7 @@ class Secretaries_api_v1 extends EA_Controller
/** /**
* Store a new secretary. * Store a new secretary.
*/ */
public function store() public function store(): void
{ {
try { try {
$secretary = request(); $secretary = request();
@ -141,7 +143,7 @@ class Secretaries_api_v1 extends EA_Controller
* *
* @param int $id Secretary ID. * @param int $id Secretary ID.
*/ */
public function update(int $id) public function update(int $id): void
{ {
try { try {
$occurrences = $this->secretaries_model->get(['id' => $id]); $occurrences = $this->secretaries_model->get(['id' => $id]);
@ -175,7 +177,7 @@ class Secretaries_api_v1 extends EA_Controller
* *
* @param int $id Secretary ID. * @param int $id Secretary ID.
*/ */
public function destroy(int $id) public function destroy(int $id): void
{ {
try { try {
$occurrences = $this->secretaries_model->get(['id' => $id]); $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. * Get a service-category collection.
*/ */
public function index() public function index(): void
{ {
try { try {
$keyword = $this->api->request_keyword(); $keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Service_categories_api_v1 extends EA_Controller
* *
* @param int|null $id Service-category ID. * @param int|null $id Service-category ID.
*/ */
public function show(int $id = null) public function show(int $id = null): void
{ {
try { try {
$occurrences = $this->service_categories_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields(); $fields = $this->api->request_fields();
$with = $this->api->request_with(); $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); $this->service_categories_model->load($service_category, $with);
} }
if (!$service_category) {
response('', 404);
return;
}
json_response($service_category); json_response($service_category);
} catch (Throwable $e) { } catch (Throwable $e) {
json_exception($e); json_exception($e);
@ -111,7 +113,7 @@ class Service_categories_api_v1 extends EA_Controller
/** /**
* Store a new service-category. * Store a new service-category.
*/ */
public function store() public function store(): void
{ {
try { try {
$service_category = request(); $service_category = request();
@ -139,7 +141,7 @@ class Service_categories_api_v1 extends EA_Controller
* *
* @param int $id Service-category ID. * @param int $id Service-category ID.
*/ */
public function update(int $id) public function update(int $id): void
{ {
try { try {
$occurrences = $this->service_categories_model->get(['id' => $id]); $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. * @param int $id Service-category ID.
*/ */
public function destroy(int $id) public function destroy(int $id): void
{ {
try { try {
$occurrences = $this->service_categories_model->get(['id' => $id]); $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. * Get an service collection.
*/ */
public function index() public function index(): void
{ {
try { try {
$keyword = $this->api->request_keyword(); $keyword = $this->api->request_keyword();
@ -77,9 +77,17 @@ class Services_api_v1 extends EA_Controller
* *
* @param int|null $id Service ID. * @param int|null $id Service ID.
*/ */
public function show(int $id = null) public function show(int $id = null): void
{ {
try { try {
$occurrences = $this->services_model->get(['id' => $id]);
if (empty($occurrences)) {
response('', 404);
return;
}
$fields = $this->api->request_fields(); $fields = $this->api->request_fields();
$with = $this->api->request_with(); $with = $this->api->request_with();
@ -96,12 +104,6 @@ class Services_api_v1 extends EA_Controller
$this->services_model->load($service, $with); $this->services_model->load($service, $with);
} }
if (!$service) {
response('', 404);
return;
}
json_response($service); json_response($service);
} catch (Throwable $e) { } catch (Throwable $e) {
json_exception($e); json_exception($e);
@ -111,7 +113,7 @@ class Services_api_v1 extends EA_Controller
/** /**
* Store a new service. * Store a new service.
*/ */
public function store() public function store(): void
{ {
try { try {
$service = request(); $service = request();
@ -139,7 +141,7 @@ class Services_api_v1 extends EA_Controller
* *
* @param int $id Service ID. * @param int $id Service ID.
*/ */
public function update(int $id) public function update(int $id): void
{ {
try { try {
$occurrences = $this->services_model->get(['id' => $id]); $occurrences = $this->services_model->get(['id' => $id]);
@ -173,7 +175,7 @@ class Services_api_v1 extends EA_Controller
* *
* @param int $id Service ID. * @param int $id Service ID.
*/ */
public function destroy(int $id) public function destroy(int $id): void
{ {
try { try {
$occurrences = $this->services_model->get(['id' => $id]); $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. * @param string $name Setting name.
*/ */
public function show(string $name) public function show(string $name): void
{ {
try { try {
$value = setting($name); $value = setting($name);
@ -90,7 +90,7 @@ class Settings_api_v1 extends EA_Controller
* *
* @param string $name Setting name. * @param string $name Setting name.
*/ */
public function update(string $name) public function update(string $name): void
{ {
try { try {
$value = request('value'); $value = request('value');

View file

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

View file

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

View file

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

View file

@ -1,6 +1,12 @@
<?php defined('BASEPATH') or exit('No direct script access allowed'); <?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'] = 'System Installation';
$lang['system_installation_welcome_header'] = 'Welcome to the ' . branding("software", "name") . " installation page"; $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") . '</a>'; $lang['powered_by'] = 'Powered By <a href="' . branding("software", "website") . '" target="_blank">' . branding("software", "name_en") . '</a>';
// End // End

View file

@ -175,22 +175,22 @@ $lang['visible'] = 'Visible';
$lang['hidden'] = 'Hidden'; $lang['hidden'] = 'Hidden';
$lang['business_logic'] = 'Business Logic'; $lang['business_logic'] = 'Business Logic';
$lang['current_user'] = 'Current User'; $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_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['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'] = '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['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['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['current_version'] = 'Current Version';
$lang['support'] = 'Support'; $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['official_website'] = 'Official Website';
$lang['google_plus_community'] = 'Google+ Community'; $lang['google_plus_community'] = 'Google+ Community';
$lang['support_group'] = 'Support Group'; $lang['support_group'] = 'Support Group';
$lang['project_issues'] = 'Project Issues'; $lang['project_issues'] = 'Project Issues';
$lang['license'] = 'License'; $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['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['book_appointment_title'] = 'Book Appointment';
$lang['backend_section'] = 'Backend Section'; $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['google_calendar_selected'] = 'Google calendar has been successfully selected.';
$lang['oops_something_went_wrong'] = 'Oops! Something Went Wrong.'; $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['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'] = '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['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.'; $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'] = '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['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['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['timezone'] = 'Timezone';
$lang['overwrite_existing_working_plans'] = 'This will overwrite the existing provider working plans, are you sure that you want to continue?'; $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.'; $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'] = '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['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'] = '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['google_analytics_code'] = 'Google Analytics Code';
$lang['matomo_analytics_url'] = 'Matomo Analytics URL'; $lang['matomo_analytics_url'] = 'Matomo Analytics URL';
$lang['future_booking_limit'] = 'Future Booking Limit'; $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_field'] = 'Custom Field';
$lang['custom_fields'] = 'Custom Fields'; $lang['custom_fields'] = 'Custom Fields';
$lang['label'] = 'Label'; $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 // 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'); defined('BASEPATH') or exit('No direct script access allowed');
$lang['cal_su'] = 'Su'; $lang['cal_su'] = 'Pz';
$lang['cal_mo'] = 'Mo'; $lang['cal_mo'] = 'Pt';
$lang['cal_tu'] = 'Tu'; $lang['cal_tu'] = 'Sl';
$lang['cal_we'] = 'We'; $lang['cal_we'] = 'Çş';
$lang['cal_th'] = 'Th'; $lang['cal_th'] = '';
$lang['cal_fr'] = 'Fr'; $lang['cal_fr'] = 'Cm';
$lang['cal_sa'] = 'Sa'; $lang['cal_sa'] = 'Ct';
$lang['cal_sun'] = 'Sun'; $lang['cal_sun'] = 'Pzr';
$lang['cal_mon'] = 'Mon'; $lang['cal_mon'] = 'Pzt';
$lang['cal_tue'] = 'Tue'; $lang['cal_tue'] = 'Salı';
$lang['cal_wed'] = 'Wed'; $lang['cal_wed'] = 'Çrş';
$lang['cal_thu'] = 'Thu'; $lang['cal_thu'] = 'Prş';
$lang['cal_fri'] = 'Fri'; $lang['cal_fri'] = 'Cuma';
$lang['cal_sat'] = 'Sat'; $lang['cal_sat'] = 'Cmt';
$lang['cal_sunday'] = 'Sunday'; $lang['cal_sunday'] = 'Pazar';
$lang['cal_monday'] = 'Monday'; $lang['cal_monday'] = 'Pazartesi';
$lang['cal_tuesday'] = 'Tuesday'; $lang['cal_tuesday'] = 'Salı';
$lang['cal_wednesday'] = 'Wednesday'; $lang['cal_wednesday'] = 'Çarşamba';
$lang['cal_thursday'] = 'Thursday'; $lang['cal_thursday'] = 'Perşembe';
$lang['cal_friday'] = 'Friday'; $lang['cal_friday'] = 'Cuma';
$lang['cal_saturday'] = 'Saturday'; $lang['cal_saturday'] = 'Cumartesi';
$lang['cal_jan'] = 'Jan'; $lang['cal_jan'] = 'Oca';
$lang['cal_feb'] = 'Feb'; $lang['cal_feb'] = 'Şub';
$lang['cal_mar'] = 'Mar'; $lang['cal_mar'] = 'Mar';
$lang['cal_apr'] = 'Apr'; $lang['cal_apr'] = 'Nis';
$lang['cal_may'] = 'May'; $lang['cal_may'] = 'May';
$lang['cal_jun'] = 'Jun'; $lang['cal_jun'] = 'Haz';
$lang['cal_jul'] = 'Jul'; $lang['cal_jul'] = 'Tem';
$lang['cal_aug'] = 'Aug'; $lang['cal_aug'] = 'Ağu';
$lang['cal_sep'] = 'Sep'; $lang['cal_sep'] = 'Eyl';
$lang['cal_oct'] = 'Oct'; $lang['cal_oct'] = 'Eki';
$lang['cal_nov'] = 'Nov'; $lang['cal_nov'] = 'Kas';
$lang['cal_dec'] = 'Dec'; $lang['cal_dec'] = 'Ara';
$lang['cal_january'] = 'January'; $lang['cal_january'] = 'Ocak';
$lang['cal_february'] = 'February'; $lang['cal_february'] = 'Şubat';
$lang['cal_march'] = 'March'; $lang['cal_march'] = 'Mart';
$lang['cal_april'] = 'April'; $lang['cal_april'] = 'Nisan';
$lang['cal_mayl'] = 'May'; $lang['cal_mayl'] = 'Mayıs';
$lang['cal_june'] = 'June'; $lang['cal_june'] = 'Haziran';
$lang['cal_july'] = 'July'; $lang['cal_july'] = 'Temmuz';
$lang['cal_august'] = 'August'; $lang['cal_august'] = 'Ağustos';
$lang['cal_september'] = 'September'; $lang['cal_september'] = 'Eylül';
$lang['cal_october'] = 'October'; $lang['cal_october'] = 'Ekim';
$lang['cal_november'] = 'November'; $lang['cal_november'] = 'Kasım';
$lang['cal_december'] = 'December'; $lang['cal_december'] = 'Aralık';

View file

@ -37,20 +37,20 @@
*/ */
defined('BASEPATH') or exit('No direct script access allowed'); defined('BASEPATH') or exit('No direct script access allowed');
$lang['date_year'] = 'Year'; $lang['date_year'] = 'Yıl';
$lang['date_years'] = 'Years'; $lang['date_years'] = 'Yıl';
$lang['date_month'] = 'Month'; $lang['date_month'] = 'Ay';
$lang['date_months'] = 'Months'; $lang['date_months'] = 'AY';
$lang['date_week'] = 'Week'; $lang['date_week'] = 'Hafta';
$lang['date_weeks'] = 'Weeks'; $lang['date_weeks'] = 'Hafta';
$lang['date_day'] = 'Day'; $lang['date_day'] = 'Gün';
$lang['date_days'] = 'Days'; $lang['date_days'] = 'Gün';
$lang['date_hour'] = 'Hour'; $lang['date_hour'] = 'Saat';
$lang['date_hours'] = 'Hours'; $lang['date_hours'] = 'Saat';
$lang['date_minute'] = 'Minute'; $lang['date_minute'] = 'Dakika';
$lang['date_minutes'] = 'Minutes'; $lang['date_minutes'] = 'Dakika';
$lang['date_second'] = 'Second'; $lang['date_second'] = 'Saniye';
$lang['date_seconds'] = 'Seconds'; $lang['date_seconds'] = 'Saniye';
$lang['UM12'] = '(UTC -12:00) Baker/Howland Island'; $lang['UM12'] = '(UTC -12:00) Baker/Howland Island';
$lang['UM11'] = '(UTC -11:00) Niue'; $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['UTC'] = '(UTC) Greenwich Mean Time, Western European Time';
$lang['UP1'] = '(UTC +1:00) Central European Time, West Africa 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['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['UP35'] = '(UTC +3:30) Iran Standard Time';
$lang['UP4'] = '(UTC +4:00) Azerbaijan Standard Time, Samara Time'; $lang['UP4'] = '(UTC +4:00) Azerbaijan Standard Time, Samara Time';
$lang['UP45'] = '(UTC +4:30) Afghanistan'; $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_unable_to_create'] = 'Belirtilen veri tabanı oluşturulamıyor: %s';
$lang['db_invalid_query'] = 'Verilen sorgu geçersiz.'; $lang['db_invalid_query'] = 'Verilen sorgu geçersiz.';
$lang['db_must_set_table'] = 'Sorguda kullanılacak tabloyu belirtmelisiniz.'; $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_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_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.'; $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'); defined('BASEPATH') or exit('No direct script access allowed');
$lang['form_validation_required'] = 'The {field} field is required.'; $lang['form_validation_required'] = '{field} alanı zorunludur.';
$lang['form_validation_isset'] = 'The {field} field must have a value.'; $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_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_emails'] = 'The {field} field must contain all valid email addresses.';
$lang['form_validation_valid_url'] = 'The {field} field must contain a valid URL.'; $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'); <?php defined('BASEPATH') OR exit('No direct script access allowed');
// Turkish // 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'] = 'Sistem Yüklemesi';
$lang['system_installation_welcome_header'] = branding("software", "name") . " sistem yükleme sayfasına hoşgeldiniz"; $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") . '</a> Gururla Sunar'; $lang['powered_by'] = '<a href="' . branding("software", "website") . '" target="_blank">' . branding("software", "name_tr") . '</a> Gururla Sunar';
// End // End

View file

@ -41,4 +41,4 @@ $lang['terabyte_abbr'] = 'TB';
$lang['gigabyte_abbr'] = 'GB'; $lang['gigabyte_abbr'] = 'GB';
$lang['megabyte_abbr'] = 'MB'; $lang['megabyte_abbr'] = 'MB';
$lang['kilobyte_abbr'] = 'KB'; $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'); <?php defined('BASEPATH') or exit('No direct script access allowed');
// Turkish // 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['service_and_provider'] = 'Hizmet ve Hizmet Sağlayıcıyı Seçin';
$lang['select_service'] = 'Hizmeti Seçin'; $lang['select_service'] = 'Hizmeti Seçin';
$lang['select_provider'] = 'Hizmet Sağlayıcıyı Seçin'; $lang['select_provider'] = 'Hizmet Sağlayıcıyı Seçin';
@ -17,10 +17,10 @@ $lang['last_name'] = 'Soyad';
$lang['email'] = 'Eposta'; $lang['email'] = 'Eposta';
$lang['phone_number'] = 'Telefon No'; $lang['phone_number'] = 'Telefon No';
$lang['phone'] = 'Phone'; $lang['phone'] = 'Phone';
$lang['address'] = 'Adres'; // $lang['address'] = 'Adres';
$lang['city'] = 'Şehir'; // $lang['city'] = 'Şehir';
$lang['zip_code'] = 'Posta Kodu'; // $lang['zip_code'] = 'Posta Kodu';
$lang['notes'] = 'Notlar'; // $lang['notes'] = 'Notlar';
$lang['language'] = 'Dil'; $lang['language'] = 'Dil';
$lang['no_language'] = 'Dil yok'; $lang['no_language'] = 'Dil yok';
$lang['fields_are_required'] = '* Zorunlu Alanlar.'; $lang['fields_are_required'] = '* Zorunlu Alanlar.';
@ -175,22 +175,22 @@ $lang['visible'] = 'Gözle görülür';
$lang['hidden'] = 'Gizli'; $lang['hidden'] = 'Gizli';
$lang['business_logic'] = 'İş Mantığı'; $lang['business_logic'] = 'İş Mantığı';
$lang['current_user'] = 'Mevcut Kullanıcı'; $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_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['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'] = '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['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['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['current_version'] = 'Mevcut Versiyon';
$lang['support'] = 'Destek'; $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['official_website'] = 'Resmi Web Sitesi';
$lang['google_plus_community'] = 'Google+ Çevresi'; $lang['google_plus_community'] = 'Google+ Çevresi';
$lang['support_group'] = 'Destek Grubu'; $lang['support_group'] = 'Destek Grubu';
$lang['project_issues'] = 'Proje Sorunları'; $lang['project_issues'] = 'Proje Sorunları';
$lang['license'] = 'Lisans'; $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['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['book_appointment_title'] = 'Randevu Al';
$lang['backend_section'] = 'Yönetim Paneli'; $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['google_calendar_selected'] = 'Google Takvimi başarıyla seçildi.';
$lang['oops_something_went_wrong'] = 'Oops! Bir Sorun Oluştu.'; $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['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'] = '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['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.'; $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'] = '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['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['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['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['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.'; $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['reset'] = 'Reset';
$lang['all'] = 'All'; $lang['all'] = 'All';
$lang['booking_link'] = 'Booking Link'; $lang['booking_link'] = 'Booking Link';
$lang['add_new_event'] = 'Add New Event'; $lang['add_new_event'] = 'Yeni Etkinlik Ekle';
$lang['what_kind_of_event'] = 'What kind of event would you like to add?'; $lang['what_kind_of_event'] = 'Ne tarz bir etkinlik eklemek istersiniz?';
$lang['theme'] = 'Theme'; $lang['theme'] = 'Theme';
$lang['limit_customer_access'] = 'Limit Customer Access'; $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.'; $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'] = '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['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'] = '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['google_analytics_code'] = 'Google Analytics Code';
$lang['matomo_analytics_url'] = 'Matomo Analytics URL'; $lang['matomo_analytics_url'] = 'Matomo Analytics URL';
$lang['future_booking_limit'] = 'Future Booking Limit'; $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['status'] = 'Status';
$lang['appointment_status_options'] = 'Appointment Status Options'; $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['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['sunday_short'] = 'Pzr';
$lang['monday_short'] = 'Mon'; $lang['monday_short'] = 'Pzt';
$lang['tuesday_short'] = 'Tue'; $lang['tuesday_short'] = 'Salı';
$lang['wednesday_short'] = 'Wed'; $lang['wednesday_short'] = 'Çrş';
$lang['thursday_short'] = 'Thu'; $lang['thursday_short'] = 'Prş';
$lang['friday_short'] = 'Fri'; $lang['friday_short'] = 'Cuma';
$lang['saturday_short'] = 'Sat'; $lang['saturday_short'] = 'Cmt';
$lang['january_short'] = 'Jan'; $lang['january_short'] = 'Oca';
$lang['february_short'] = 'Feb'; $lang['february_short'] = 'Şub';
$lang['march_short'] = 'Mar'; $lang['march_short'] = 'Mar';
$lang['april_short'] = 'Apr'; $lang['april_short'] = 'Nis';
$lang['may_short'] = 'May'; $lang['may_short'] = 'May';
$lang['june_short'] = 'Jun'; $lang['june_short'] = 'Haz';
$lang['july_short'] = 'Jul'; $lang['july_short'] = 'Tem';
$lang['august_short'] = 'Aug'; $lang['august_short'] = 'Ağu';
$lang['september_short'] = 'Sep'; $lang['september_short'] = 'Eyl';
$lang['october_short'] = 'Oct'; $lang['october_short'] = 'Eki';
$lang['november_short'] = 'Nov'; $lang['november_short'] = 'Kas';
$lang['december_short'] = 'Dec'; $lang['december_short'] = 'Ara';
$lang['am'] = 'am'; $lang['am'] = 'am';
$lang['pm'] = 'pm'; $lang['pm'] = 'pm';
$lang['to'] = 'to'; $lang['to'] = 'to';
$lang['click_to_toggle'] = 'Click To Toggle'; $lang['click_to_toggle'] = 'Click To Toggle';
$lang['week_short'] = 'Wk'; $lang['week_short'] = 'Hf';
$lang['scroll_to_increment'] = 'Scroll To Increment'; $lang['scroll_to_increment'] = 'Scroll To Increment';
$lang['year'] = 'Year'; $lang['year'] = 'Yıl';
$lang['make_non_working_day'] = 'This provider will not be available for work on the selected day.'; $lang['make_non_working_day'] = 'Hizmet sağlayıcı seçilen günlerde müsait olmayacak';
$lang['no_breaks'] = 'No Breaks'; $lang['no_breaks'] = 'No Breaks';
$lang['service_categories'] = 'Service Categories'; $lang['service_categories'] = 'Hizmet Kategorileri';
$lang['service_category'] = 'Service Category'; $lang['service_category'] = 'Hizmet Kategorisi';
$lang['blocked_period_saved'] = 'Blocked period saved successfully.'; $lang['blocked_period_saved'] = 'Bloklanan Periyot başarıyla kaydedildi.'; // REVIEW
$lang['blocked_period_deleted'] = 'Blocked period deleted successfully.'; $lang['blocked_period_deleted'] = 'Blocked period deleted successfully.';
$lang['delete_blocked_period'] = 'Delete Blocked Period'; $lang['delete_blocked_period'] = 'Delete Blocked Period';
$lang['blocked_period'] = '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_save'] = 'Blocked Period Save';
$lang['blocked_period_delete'] = 'Blocked Period Delete'; $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['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_field'] = 'Değiştirilebilir Alan';
$lang['custom_fields'] = 'Custom Fields'; $lang['custom_fields'] = 'Değiştirilebilir Alanlar';
$lang['label'] = 'Label'; $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 // 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_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_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.'; $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] #[NoReturn]
public function request_authentication(): void 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'); header('HTTP/1.0 401 Unauthorized');
exit('You are not authorized to use the API.'); 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'); <?php defined('BASEPATH') or exit('No direct script access allowed');
/* ---------------------------------------------------------------------------- /* ----------------------------------------------------------------------------
* Easy!Appointments - Open Source Web Scheduler * MAKET Randevu - Open Source Web Scheduler
* *
* @package EasyAppointments * @package EasyAppointments
* @author A.Tselegidis <alextselegidis@gmail.com> * @author A.Tselegidis <alextselegidis@gmail.com>
@ -41,6 +41,10 @@ class Captcha_builder
* @var array * @var array
*/ */
protected $lineColor = null; protected $lineColor = null;
/**
* @var array
*/
protected $background = null;
/** /**
* @var array * @var array
*/ */

View file

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

View file

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

View file

@ -28,14 +28,15 @@ class Timezones
/** /**
* @var string * @var string
*/ */
protected string $default = 'UTC'; protected string $default = 'Istanbul (+3:00)'; // REVIEW is it working??
/** /**
* @var array * @var array
*/ */
protected array $timezones = [ protected array $timezones = [
'UTC' => [ 'General' => [
'UTC' => 'UTC', 'UTC' => 'UTC',
'Europe/Istanbul' => 'Istanbul (+3:00)', // REVIEW is this line proper and working correctly???
], ],
'America' => [ 'America' => [
'America/Adak' => 'Adak (-10:00)', 'America/Adak' => 'Adak (-10:00)',
@ -317,7 +318,6 @@ class Timezones
'Europe/Bucharest' => 'Bucharest (+2:00)', 'Europe/Bucharest' => 'Bucharest (+2:00)',
'Europe/Chisinau' => 'Chisinau (+2:00)', 'Europe/Chisinau' => 'Chisinau (+2:00)',
'Europe/Helsinki' => 'Helsinki (+2:00)', 'Europe/Helsinki' => 'Helsinki (+2:00)',
'Europe/Istanbul' => 'Istanbul (+3:00)',
'Europe/Kaliningrad' => 'Kaliningrad (+2:00)', 'Europe/Kaliningrad' => 'Kaliningrad (+2:00)',
'Europe/Kiev' => 'Kiev (+2:00)', 'Europe/Kiev' => 'Kiev (+2:00)',
'Europe/Mariehamn' => 'Mariehamn (+2:00)', 'Europe/Mariehamn' => 'Mariehamn (+2:00)',
@ -331,6 +331,7 @@ class Timezones
'Europe/Uzhgorod' => 'Uzhgorod (+2:00)', 'Europe/Uzhgorod' => 'Uzhgorod (+2:00)',
'Europe/Vilnius' => 'Vilnius (+2:00)', 'Europe/Vilnius' => 'Vilnius (+2:00)',
'Europe/Zaporozhye' => 'Zaporozhye (+2:00)', 'Europe/Zaporozhye' => 'Zaporozhye (+2:00)',
'Europe/Istanbul' => 'Istanbul (+3:00)',
'Europe/Moscow' => 'Moscow (+3:00)', 'Europe/Moscow' => 'Moscow (+3:00)',
'Europe/Volgograd' => 'Volgograd (+3:00)', 'Europe/Volgograd' => 'Volgograd (+3:00)',
'Europe/Samara' => 'Samara (+4:00)', 'Europe/Samara' => 'Samara (+4:00)',
@ -343,13 +344,13 @@ class Timezones
'Asia/Beirut' => 'Beirut (+2:00)', 'Asia/Beirut' => 'Beirut (+2:00)',
'Asia/Damascus' => 'Damascus (+2:00)', 'Asia/Damascus' => 'Damascus (+2:00)',
'Asia/Gaza' => 'Gaza (+2:00)', 'Asia/Gaza' => 'Gaza (+2:00)',
'Asia/Istanbul' => 'Istanbul (+3:00)',
'Asia/Jerusalem' => 'Jerusalem (+2:00)', 'Asia/Jerusalem' => 'Jerusalem (+2:00)',
'Asia/Nicosia' => 'Nicosia (+2:00)', 'Asia/Nicosia' => 'Nicosia (+2:00)',
'Asia/Tel_Aviv' => 'Tel_Aviv (+2:00)', 'Asia/Tel_Aviv' => 'Tel_Aviv (+2:00)',
'Asia/Aden' => 'Aden (+3:00)', 'Asia/Aden' => 'Aden (+3:00)',
'Asia/Baghdad' => 'Baghdad (+3:00)', 'Asia/Baghdad' => 'Baghdad (+3:00)',
'Asia/Bahrain' => 'Bahrain (+3:00)', 'Asia/Bahrain' => 'Bahrain (+3:00)',
'Asia/Istanbul' => 'Istanbul (+3:00)',
'Asia/Kuwait' => 'Kuwait (+3:00)', 'Asia/Kuwait' => 'Kuwait (+3:00)',
'Asia/Qatar' => 'Qatar (+3:00)', 'Asia/Qatar' => 'Qatar (+3:00)',
'Asia/Tehran' => 'Tehran (+3:30)', 'Asia/Tehran' => 'Tehran (+3:30)',
@ -530,7 +531,7 @@ class Timezones
*/ */
public function get_default_timezone(): string 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' => [ 'timezone' => [
'type' => 'VARCHAR', 'type' => 'VARCHAR',
'constraint' => '256', 'constraint' => '256',
'default' => 'UTC', 'default' => 'Europe/Istanbul', // REVIEW Works under migration ?
'after' => 'notes', '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 a category was provided then make sure it really exists in the database.
if (!empty($service['id_service_categories'])) { 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) { if (!$count) {
throw new InvalidArgumentException( throw new InvalidArgumentException(
@ -387,7 +389,7 @@ class Services_model extends EA_Model
foreach ($resources as $resource) { foreach ($resources as $resource) {
$service['category'] = match ($resource) { $service['category'] = match ($resource) {
'category' => $this->db 'category' => $this->db
->get_where('categories', [ ->get_where('service_categories', [
'id' => $service['id_service_categories'] ?? ($service['serviceCategoryId'] ?? null), 'id' => $service['id_service_categories'] ?? ($service['serviceCategoryId'] ?? null),
]) ])
->row_array(), ->row_array(),

View file

@ -277,4 +277,65 @@ class Webhooks_model extends EA_Model
{ {
// Webhooks do not currently have any related resources. // 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> <small>
<?= lang('current_user') ?>: <?= lang('current_user') ?>:
<span> <span>
<?= $timezones[session('timezone', 'UTC')] ?> <?= $timezones[session('timezone', 'Europe/Istanbul')] ?>
</span> </span>
</small> </small>
</div> </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 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"> <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> <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 id="wizard-frame-4" class="wizard-frame" style="display:none;">
<div class="frame-container"> <div class="frame-container">
<h2 class="frame-title"><?= lang('appointment_confirmation') ?></h2> <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 class="row frame-content m-auto pt-md-4 mb-4">
<div id="customer-details" class="col-12 col-md-6 text-center text-md-end"></div> <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> </div>
<?php if (setting('require_captcha')): ?> <?php if (setting('require_captcha')): ?>
<div class="row frame-content"> <div class="row frame-content m-auto">
<div class="col-12 col-md-6"> <div class="col">
<label class="captcha-title" for="captcha-text"> <label class="captcha-title" for="captcha-text">
CAPTCHA CAPTCHA
<button class="btn btn-link text-dark text-decoration-none py-0"> <button class="btn btn-link text-dark text-decoration-none py-0">

View file

@ -23,7 +23,7 @@
<?= lang('timezone') ?> <?= lang('timezone') ?>
</label> </label>
<?php component('timezone_dropdown', [ <?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, 'grouped_timezones' => $grouped_timezones,
]); ?> ]); ?>
</div> </div>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -6,10 +6,10 @@
<div id="about" class="col-lg-8 offset-lg-2"> <div id="about" class="col-lg-8 offset-lg-2">
<div class="text-center my-5"> <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> <h3>
Easy!Appointments <?= branding("software", "name") ?>
</h3> </h3>
<h6 class="text-primary"> <h6 class="text-primary">
Online Appointment Scheduler Online Appointment Scheduler

View file

@ -28,6 +28,11 @@
<div class="record-details col-12 col-md-5"> <div class="record-details col-12 col-md-5">
<div class="btn-toolbar mb-4"> <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"> <div class="add-edit-delete-group btn-group">
<button id="add-blocked-period" class="btn btn-primary"> <button id="add-blocked-period" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i> <i class="fas fa-plus-square me-2"></i>
@ -52,11 +57,6 @@
<?= lang('cancel') ?> <?= lang('cancel') ?>
</button> </button>
</div> </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> </div>
<h4 class="text-black-50 mb-3 fw-light"> <h4 class="text-black-50 mb-3 fw-light">

View file

@ -3,7 +3,7 @@
<head> <head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <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="icon" type="image/x-icon" href="<?= asset_url('assets/img/favicon.ico') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/themes/default.min.css') ?>"> <link rel="stylesheet" type="text/css" href="<?= asset_url('assets/css/themes/default.min.css') ?>">
@ -17,20 +17,20 @@
<header> <header>
<div class="container"> <div class="container">
<h1 class="page-title">Easy!Appointments Installation</h1> <h1 class="page-title">MAKET Randevu Installation</h1>
</div> </div>
</header> </header>
<div class="content container"> <div class="content container">
<div class="welcome"> <div class="welcome">
<h3>Welcome to the Easy!Appointments installation page.</h3> <h3>Welcome to the MAKET Randevu installation page.</h3>
<p> <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 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 <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://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 <a href="https://groups.google.com/group/easy-appointments">Support Group</a> for getting help. You may also
submit new issues on submit new issues on
@ -113,9 +113,9 @@
<div class="mb-2"> <div class="mb-2">
<h3>License</h3> <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 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> <a href="https://www.gnu.org/licenses/gpl-3.0.en.html">https://www.gnu.org/licenses/gpl-3.0.en.html</a>
</div> </div>
@ -123,13 +123,13 @@
<button type="button" id="install" class="btn btn-primary"> <button type="button" id="install" class="btn btn-primary">
<i class="icon-white icon-ok me-2"></i> <i class="icon-white icon-ok me-2"></i>
Install Easy!Appointments Install MAKET Randevu
</button> </button>
</div> </div>
<footer> <footer>
<a href="https://easyappointments.org">Easy!Appointments</a> <a href="https://easyappointments.org">MAKET Randevu</a>
</footer> </footer>
<?php component('js_vars_script'); ?> <?php component('js_vars_script'); ?>

View file

@ -27,6 +27,11 @@
<div class="record-details column col-12 col-md-5"> <div class="record-details column col-12 col-md-5">
<div class="btn-toolbar mb-4"> <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"> <div class="add-edit-delete-group btn-group">
<button id="add-webhook" class="btn btn-primary"> <button id="add-webhook" class="btn btn-primary">
<i class="fas fa-plus-square me-2"></i> <i class="fas fa-plus-square me-2"></i>
@ -51,11 +56,6 @@
<?= lang('cancel') ?> <?= lang('cancel') ?>
</button> </button>
</div> </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> </div>
<h4 class="text-black-50 mb-3 fw-light"> <h4 class="text-black-50 mb-3 fw-light">

View file

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

View file

@ -52,6 +52,8 @@ App.Components.AppointmentsModal = (function () {
const $customField4 = $('#custom-field-4'); const $customField4 = $('#custom-field-4');
const $customField5 = $('#custom-field-5'); const $customField5 = $('#custom-field-5');
const moment = window.moment;
/** /**
* Update the displayed timezone. * 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 // ID must exist on the object in order for the model to update the record and not to perform
// an insert operation. // an insert operation.
const startDatetime = moment($startDatetime[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD HH:mm:ss'); const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
const endDatetime = moment($endDatetime[0]._flatpickr.selectedDates[0]).format('YYYY-MM-DD HH:mm:ss'); 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 = { const appointment = {
id_services: $selectService.val(), id_services: $selectService.val(),
@ -204,8 +209,8 @@ App.Components.AppointmentsModal = (function () {
startMoment.add(1, 'hour').set({minutes: 0}); startMoment.add(1, 'hour').set({minutes: 0});
} }
$startDatetime[0]._flatpickr.setDate(startMoment.toDate()); App.Utils.UI.setDateTimePickerValue($startDatetime, startMoment.toDate());
$endDatetime[0]._flatpickr.setDate(startMoment.add(duration, 'minutes').toDate()); App.Utils.UI.setDateTimePickerValue($endDatetime, startMoment.add(duration, 'minutes').toDate());
// Display modal form. // Display modal form.
$appointmentsModal.find('.modal-header h3').text(lang('new_appointment_title')); $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 duration = service ? service.duration : 60;
const start = $startDatetime[0]._flatpickr.selectedDates[0]; const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
$endDatetime[0]._flatpickr.setDate(new Date(start.getTime() + duration * 60000)); const endDateTimeObject = new Date(startDateTimeObject.getTime() + duration * 60000);
App.Utils.UI.setDateTimePickerValue($endDatetime, endDateTimeObject);
// Update the providers select box. // Update the providers select box.
@ -481,7 +487,7 @@ App.Components.AppointmentsModal = (function () {
const startDatetime = new Date(); const startDatetime = new Date();
const endDatetime = moment().add(duration, 'minutes').toDate(); const endDatetime = moment().add(duration, 'minutes').toDate();
App.Utils.UI.initializeDatetimepicker($startDatetime, { App.Utils.UI.initializeDateTimePicker($startDatetime, {
onClose: () => { onClose: () => {
const serviceId = $selectService.val(); const serviceId = $selectService.val();
@ -490,15 +496,16 @@ App.Components.AppointmentsModal = (function () {
(availableService) => Number(availableService.id) === Number(serviceId), (availableService) => Number(availableService.id) === Number(serviceId),
); );
const start = $startDatetime[0]._flatpickr.selectedDates[0]; const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
$endDatetime[0]._flatpickr.setDate(new Date(start.getTime() + service.duration * 60000)); 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); App.Utils.UI.initializeDateTimePicker($endDatetime);
$endDatetime[0]._flatpickr.setDate(endDatetime); App.Utils.UI.setDateTimePickerValue($endDatetime, endDatetime);
} }
/** /**
@ -538,9 +545,10 @@ App.Components.AppointmentsModal = (function () {
} }
// Check appointment start and end time. // Check appointment start and end time.
const start = $startDatetime[0]._flatpickr.selectedDates[0]; const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDatetime);
const end = $endDatetime[0]._flatpickr.selectedDates[0]; const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDatetime);
if (start > end) {
if (startDateTimeObject > endDateTimeObject) {
$startDatetime.addClass('is-invalid'); $startDatetime.addClass('is-invalid');
$endDatetime.addClass('is-invalid'); $endDatetime.addClass('is-invalid');
throw new Error(lang('start_date_before_end_error')); 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 $selectFilterItem = $('#select-filter-item');
const $reloadAppointments = $('#reload-appointments'); const $reloadAppointments = $('#reload-appointments');
const moment = window.moment;
/** /**
* Update the displayed timezone. * Update the displayed timezone.
*/ */
@ -68,22 +70,22 @@ App.Components.UnavailabilitiesModal = (function () {
return; 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'); $startDatetime.addClass('is-invalid');
return; 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'); $endDatetime.addClass('is-invalid');
return; return;
} }
if (startMoment.isAfter(endMoment)) { if (startDateTimeMoment.isAfter(endDateTimeMoment)) {
// Start time is after end time - display message to user. // Start time is after end time - display message to user.
$unavailabilitiesModal $unavailabilitiesModal
.find('.modal-message') .find('.modal-message')
@ -100,8 +102,8 @@ App.Components.UnavailabilitiesModal = (function () {
// Unavailability period records go to the appointments table. // Unavailability period records go to the appointments table.
const unavailability = { const unavailability = {
start_datetime: startMoment.format('YYYY-MM-DD HH:mm:ss'), start_datetime: startDateTimeMoment.format('YYYY-MM-DD HH:mm:ss'),
end_datetime: endMoment.format('YYYY-MM-DD HH:mm:ss'), end_datetime: endDateTimeMoment.format('YYYY-MM-DD HH:mm:ss'),
notes: $unavailabilitiesModal.find('#unavailability-notes').val(), notes: $unavailabilitiesModal.find('#unavailability-notes').val(),
id_users_provider: $selectProvider.val(), id_users_provider: $selectProvider.val(),
}; };
@ -156,8 +158,8 @@ App.Components.UnavailabilitiesModal = (function () {
$selectProvider.val($selectFilterItem.val()).closest('.form-group').hide(); $selectProvider.val($selectFilterItem.val()).closest('.form-group').hide();
} }
$startDatetime[0]._flatpickr.setDate(startMoment.toDate()); App.Utils.UI.setDateTimePickerValue($startDatetime, startMoment.toDate());
$endDatetime[0]._flatpickr.setDate(startMoment.add(1, 'hour').toDate()); App.Utils.UI.setDateTimePickerValue($endDatetime, startMoment.add(1, 'hour').toDate());
$dialog.find('.modal-header h3').text(lang('new_unavailability_title')); $dialog.find('.modal-header h3').text(lang('new_unavailability_title'));
$dialog.modal('show'); $dialog.modal('show');
@ -183,11 +185,11 @@ App.Components.UnavailabilitiesModal = (function () {
true, true,
); );
App.Utils.UI.initializeDatetimepicker($startDatetime); App.Utils.UI.initializeDateTimePicker($startDatetime);
$startDatetime.val(start); $startDatetime.val(start);
App.Utils.UI.initializeDatetimepicker($endDatetime); App.Utils.UI.initializeDateTimePicker($endDatetime);
$endDatetime.val(end); $endDatetime.val(end);

View file

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

View file

@ -300,7 +300,7 @@ App.Http.Booking = (function () {
const currentDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), i); const currentDate = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), i);
if (unavailableDates.indexOf(moment(currentDate).format('YYYY-MM-DD')) === -1) { 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')); getAvailableHours(moment(currentDate).format('YYYY-MM-DD'));
break; break;
} }
@ -328,7 +328,7 @@ App.Http.Booking = (function () {
!unavailableDates.includes(dateQueryParam) && !unavailableDates.includes(dateQueryParam) &&
dateQueryParamMoment.format('YYYY-MM') === selectedDateMoment.format('YYYY-MM') 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" * Event: Blocked period Save Button "Click"
*/ */
$blockedPeriods.on('click', '#save-blocked-period', () => { $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 startDateTimeMoment = moment(startDateTimeObject);
const endDateTimeObject = App.Utils.UI.getDatetimepickerValue($endDateTime); const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDateTime);
const endDateTimeMoment = moment(endDateTimeObject); const endDateTimeMoment = moment(endDateTimeObject);
const blockedPeriod = { const blockedPeriod = {
@ -235,8 +235,8 @@ App.Pages.BlockedPeriods = (function () {
function display(blockedPeriod) { function display(blockedPeriod) {
$id.val(blockedPeriod.id); $id.val(blockedPeriod.id);
$name.val(blockedPeriod.name); $name.val(blockedPeriod.name);
App.Utils.UI.setDatetimepickerValue($startDateTime, new Date(blockedPeriod.start_datetime)); App.Utils.UI.setDateTimePickerValue($startDateTime, new Date(blockedPeriod.start_datetime));
App.Utils.UI.setDatetimepickerValue($endDateTime, new Date(blockedPeriod.end_datetime)); App.Utils.UI.setDateTimePickerValue($endDateTime, new Date(blockedPeriod.end_datetime));
$notes.val(blockedPeriod.notes); $notes.val(blockedPeriod.notes);
} }
@ -263,8 +263,8 @@ App.Pages.BlockedPeriods = (function () {
throw new Error(lang('fields_are_required')); throw new Error(lang('fields_are_required'));
} }
const startDateTimeObject = App.Utils.UI.getDatetimepickerValue($startDateTime); const startDateTimeObject = App.Utils.UI.getDateTimePickerValue($startDateTime);
const endDateTimeObject = App.Utils.UI.getDatetimepickerValue($endDateTime); const endDateTimeObject = App.Utils.UI.getDateTimePickerValue($endDateTime);
if (startDateTimeObject >= endDateTimeObject) { if (startDateTimeObject >= endDateTimeObject) {
$startDateTime.addClass('is-invalid'); $startDateTime.addClass('is-invalid');
@ -346,8 +346,8 @@ App.Pages.BlockedPeriods = (function () {
resetForm(); resetForm();
filter(''); filter('');
addEventListeners(); addEventListeners();
App.Utils.UI.initializeDatetimepicker($startDateTime); App.Utils.UI.initializeDateTimePicker($startDateTime);
App.Utils.UI.initializeDatetimepicker($endDateTime); App.Utils.UI.initializeDateTimePicker($endDateTime);
} }
document.addEventListener('DOMContentLoaded', initialize); document.addEventListener('DOMContentLoaded', initialize);

View file

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

View file

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

View file

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

View file

@ -15,6 +15,8 @@
* This module implements the functionality of working plans. * This module implements the functionality of working plans.
*/ */
App.Utils.WorkingPlan = (function () { App.Utils.WorkingPlan = (function () {
const moment = window.moment;
/** /**
* Class WorkingPlan * Class WorkingPlan
* *
@ -480,7 +482,7 @@ App.Utils.WorkingPlan = (function () {
$tr.children().trigger('edit'); $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(); $tr.find('.break-day select').focus();
@ -686,16 +688,16 @@ App.Utils.WorkingPlan = (function () {
disabled = disabled || false; disabled = disabled || false;
if (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) => { onChange: (selectedDates, dateStr, instance) => {
const startMoment = moment(selectedDates[0]); const startMoment = moment(selectedDates[0]);
const $workEnd = $(instance.input).closest('tr').find('.work-end'); 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) { 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", "name": "maket/maketrandevu",
"description": "MAKET Randevu Portalı", "description": "MAKET Randevu Portalı",
"version": "1.5.0-p1", "version": "1.5.0-RC2",
"homepage": "https://iflpanel.com/about/maketrandevu", "homepage": "https://iflpanel.com/about/maketrandevu",
"type": "project", "type": "project",
"license": "GPL-3.0", "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", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "70cead7cce550cc0e5a37eb1e558aee9", "content-hash": "eafeafe75a984017de7900242825c958",
"packages": [ "packages": [
{ {
"name": "firebase/php-jwt", "name": "firebase/php-jwt",
@ -140,7 +140,7 @@
}, },
{ {
"name": "google/apiclient-services", "name": "google/apiclient-services",
"version": "v0.329.0", "version": "v0.330.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git", "url": "https://github.com/googleapis/google-api-php-client-services.git",
@ -178,7 +178,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues", "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" "time": "2023-12-24T01:02:15+00:00"
}, },

View file

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

View file

@ -5,7 +5,7 @@
# Approximately 10min (tested with 4vcpu / 8GB RAM / 30Mbps network speed) # Approximately 10min (tested with 4vcpu / 8GB RAM / 30Mbps network speed)
# MAKETRANDEVU_VER="test" # MAKETRANDEVU_VER="test"
MAKETRANDEVU_VER="1.5.0-p1" # UPDATE MANUALLY ! MAKETRANDEVU_VER="1.5.0-RC2" # UPDATE MANUALLY !
_RED='\033[0;31m' _RED='\033[0;31m'
_NC='\033[0m \e[0m' # No Color, No Effect _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'); // const debug = require('gulp-debug');
function archive(done) { function archive(done) {
const version = "1.5.0-p1" const version = "1.5.0-RC2"
const filename = 'maketrandevu-' + version + '.zip'; const filename = 'maketrandevu-' + version + '.zip';
fs.removeSync('build'); fs.removeSync('build');

View file

@ -2,13 +2,13 @@
# Nginx Docker Localtest # Nginx Docker Localtest
CONT_NAME="MAKETRANDEVU_NGINX_LOCALTEST" # nginx docker name CONT_NAME="MAKETRANDEVU_NGINX_LOCALTEST" # nginx docker name
MOUNT_PATH="/source" # binded mount path in nginx docker MOUNT_PATH="/source" # binded mount path in nginx docker
SCRIPT_NAME="nginx_docker_localtest.sh" # name of the *this* file SCRIPT_NAME="nginx_docker_localtest.sh" # name of the *this* file
DEBUG="FALSE" DEBUG="FALSE"
### REMOTE RELEASE ### ### REMOTE RELEASE ###
LATEST_RELEASE="1.5.0-p1" LATEST_RELEASE="1.5.0-RC2"
FILE_NAME="maketrandevu-$LATEST_RELEASE.zip" FILE_NAME="maketrandevu-$LATEST_RELEASE.zip"
DOWNLOAD_LINK=https://git.aliberksandikci.com.tr/maket/maketrandevu/releases/download/$LATEST_RELEASE/$FILE_NAME 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) restart: restart services (nginx, mariadb, php-fpm)
update: update source files with new build on /source/ update: update source files with new build on /source/
status: see current webserver status status: see current webserver status
root: move to root web folder
help : see this help text 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=""" CONFIG_FILE_CONTENT="""
<?php <?php
/* ---------------------------------------------------------------------------- /* ----------------------------------------------------------------------------
* MaketRandevu - Izmir Fen Lisesi Randevu Portali * MaketRandevu - MAKET Randevu Portalı
* *
* @package maketrandevu * @package maketrandevu
* @author asandikci <contact@aliberksandikci.com.tr> * @author asandikci <contact@aliberksandikci.com.tr>
@ -176,8 +181,8 @@ _status() {
} }
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
if [[ $(pwd) != *maketrandevu ]]; then if [[ $(pwd) != *MaketRandevu ]]; then
echo "PLEASE CHANGE DIRECTORY TO \`maketrandevu/\` BEFORE STARTING SCRIPT" echo "PLEASE CHANGE DIRECTORY TO \`MaketRandevu/\` BEFORE STARTING SCRIPT"
exit exit
fi fi
# TODO silmeden önce onay iste! # TODO silmeden önce onay iste!
@ -235,6 +240,27 @@ elif [[ $1 == "docker" ]]; then
echo RECONFIGURED echo RECONFIGURED
echo echo
_exit _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 elif [[ $2 == "update" ]]; then
echo "updating sources!" echo "updating sources!"
rsync -a --progress /source/build/ $WEB_ROOT_FOLDER --exclude config.php --exclude storage rsync -a --progress /source/build/ $WEB_ROOT_FOLDER --exclude config.php --exclude storage

View file

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

135
package-lock.json generated
View file

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