From 9409633a5dc1364dee4cb63483182a259b6ff3b1 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Thu, 10 Dec 2020 11:31:19 +0200 Subject: [PATCH 01/36] Corrected javascript typo with unavailability events (#946). --- assets/js/backend_calendar_default_view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/backend_calendar_default_view.js b/assets/js/backend_calendar_default_view.js index 75c01c9d..4d7cf6ae 100755 --- a/assets/js/backend_calendar_default_view.js +++ b/assets/js/backend_calendar_default_view.js @@ -1069,7 +1069,7 @@ window.BackendCalendarDefaultView = window.BackendCalendarDefaultView || {}; var notes = unavailable.notes ? ' - ' + unavailable.notes : ''; if (unavailable.notes && unavailable.notes.length > 30) { - notes = unavilable.notes.substring(0, 30) + '...' + notes = unavailable.notes.substring(0, 30) + '...'; } var unavailabilityEvent = { From ae3e0b1dcb76474f171e4d41549249dcb01916b6 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Thu, 10 Dec 2020 11:31:59 +0200 Subject: [PATCH 02/36] Google Calendar sync must not break when syncing all day events (#945). --- application/controllers/Google.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/application/controllers/Google.php b/application/controllers/Google.php index 1f5f0d9e..c84a4846 100644 --- a/application/controllers/Google.php +++ b/application/controllers/Google.php @@ -182,6 +182,11 @@ class Google extends EA_Controller { continue; } + if ($google_event->getStart()->getDateTime() === $google_event->getEnd()->getDateTime()) + { + continue; // Skip all day events + } + $results = $CI->appointments_model->get_batch(['id_google_calendar' => $google_event->getId()]); if ( ! empty($results)) From 7bf1d536f39d1e8fcacb1a75e53075c7e380c804 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 09:55:54 +0200 Subject: [PATCH 03/36] Updated the facebook URL in the about page. --- application/views/backend/settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/views/backend/settings.php b/application/views/backend/settings.php index 28fb6418..044caaef 100755 --- a/application/views/backend/settings.php +++ b/application/views/backend/settings.php @@ -530,7 +530,7 @@ | - + Facebook | From 3381b998a14cc2c05054065119007ae742110e71 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 12:44:29 +0200 Subject: [PATCH 04/36] Check for other services when calculating multiple attendants number availability (#948). --- application/libraries/Availability.php | 17 ++++++++++ application/models/Appointments_model.php | 41 ++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/application/libraries/Availability.php b/application/libraries/Availability.php index 883e91db..5cfe0786 100644 --- a/application/libraries/Availability.php +++ b/application/libraries/Availability.php @@ -388,11 +388,28 @@ class Availability { while ($slot_end <= $period['end']) { + // Make sure there is no other service appointment for this time slot. + $other_service_attendants_number = $this->CI->appointments_model->get_other_service_attendants_number( + $slot_start, + $slot_end, + $service['id'], + $provider['id'], + $exclude_appointment_id + ); + + if ($other_service_attendants_number > 0) + { + $slot_start->add($interval); + $slot_end->add($interval); + continue; + } + // Check reserved attendants for this time slot and see if current attendants fit. $appointment_attendants_number = $this->CI->appointments_model->get_attendants_number_for_period( $slot_start, $slot_end, $service['id'], + $provider['id'], $exclude_appointment_id ); diff --git a/application/models/Appointments_model.php b/application/models/Appointments_model.php index 9defb2f4..25973d56 100644 --- a/application/models/Appointments_model.php +++ b/application/models/Appointments_model.php @@ -556,11 +556,12 @@ class Appointments_model extends EA_Model { * @param DateTime $slot_start When the slot starts * @param DateTime $slot_end When the slot ends. * @param int $service_id Selected service ID. + * @param int $provider_id Selected provider ID. * @param int|null $exclude_appointment_id Exclude an appointment from the availability generation. * * @return int Returns the number of attendants for selected time period. */ - public function get_attendants_number_for_period(DateTime $slot_start, DateTime $slot_end, $service_id, $exclude_appointment_id = NULL) + public function get_attendants_number_for_period(DateTime $slot_start, DateTime $slot_end, $service_id, $provider_id, $exclude_appointment_id = NULL) { if ($exclude_appointment_id) { @@ -581,6 +582,44 @@ class Appointments_model extends EA_Model { ->group_end() ->group_end() ->where('id_services', $service_id) + ->where('id_users_provider', $provider_id) + ->get() + ->row() + ->attendants_number; + } + + /** + * Returns the number of the other service attendants number for the provided time slot. + * + * @param DateTime $slot_start When the slot starts + * @param DateTime $slot_end When the slot ends. + * @param int $service_id Selected service ID. + * @param int|null $exclude_appointment_id Exclude an appointment from the availability generation. + * + * @return int Returns the number of attendants for selected time period. + */ + public function get_other_service_attendants_number(DateTime $slot_start, DateTime $slot_end, $service_id, $provider_id, $exclude_appointment_id = NULL) + { + if ($exclude_appointment_id) + { + $this->db->where('id !=', $exclude_appointment_id); + } + + return (int)$this->db + ->select('count(*) AS attendants_number') + ->from('appointments') + ->group_start() + ->group_start() + ->where('start_datetime <=', $slot_start->format('Y-m-d H:i:s')) + ->where('end_datetime >', $slot_start->format('Y-m-d H:i:s')) + ->group_end() + ->or_group_start() + ->where('start_datetime <', $slot_end->format('Y-m-d H:i:s')) + ->where('end_datetime >=', $slot_end->format('Y-m-d H:i:s')) + ->group_end() + ->group_end() + ->where('id_services !=', $service_id) + ->where('id_users_provider', $provider_id) ->get() ->row() ->attendants_number; From f59568d54d19ea0e09ede234a677e818473b98ef Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 12:45:42 +0200 Subject: [PATCH 05/36] Documentation updates and improvements --- docs/faq.md | 2 +- docs/installation-guide.md | 2 +- docs/readme.md | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index b04d3591..61876197 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,4 +1,4 @@ -#FAQ +# FAQ ## How do I check that my server has Apache, Php and MySQL already installed? diff --git a/docs/installation-guide.md b/docs/installation-guide.md index 6ad8ee08..0f644862 100644 --- a/docs/installation-guide.md +++ b/docs/installation-guide.md @@ -8,7 +8,7 @@ Easy!Appointments is a web appointment scheduler that can be installed and run i ### Installation There are 6 steps you must follow during the installation process. - 1. **Make sure that your server has at least the following applications/tools installed: Apache(v2.4), PHP(v5.6) and MySQL(v5.7).** Easy!Appointments needs these programs to run. Most of the web hosting companies provide these tools within their Linux hosting plans. If you want to install Easy!Appointments on your local server use one of the pre-made bundles available on the web (XAMPP, MAMP, WAMP ...), all of which are free to use. If you plan to use the Google Calendar synchronization you will need the **php_curl** extension installed and enabled as well. + 1. **Make sure that your server has at least the following applications/tools installed: Apache(v2.4), PHP(v7.0) and MySQL(v5.7).** Easy!Appointments needs these programs to run. Most of the web hosting companies provide these tools within their Linux hosting plans. If you want to install Easy!Appointments on your local server use one of the pre-made bundles available on the web (XAMPP, MAMP, WAMP ...), all of which are free to use. If you plan to use the Google Calendar synchronization you will need the **php_curl** extension installed and enabled as well. 2. **Create a new database (or use an existing one).** The database is necessary for storing the system data. Therefore your hosting plan must include at least one MySQL database. You must also get the database administration credentials because they will be needed later on. 3. **Upload the Easy!Appointments source files to your server.** You can place the files into a directory with named "easyappointments" or "appointments" or "book" etc. Make sure that you mark the Easy!Appointments folder URL because it will be needed in the following step. For example if the system files are placed in the this directory ".../httpdocs/easyappointments/" then the URL to this folder will be "http://your-domain.com/easyappointments". This URL will be needed in the following steps. 4. **Ensure that the "storage" directory is writable.** Session information, logs and any other kind of files will land into the "storage" directory so make sure that it has the correct permissions and that is writable. diff --git a/docs/readme.md b/docs/readme.md index c4ac52fc..75e7cb45 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,14 +1,14 @@ -# Easy!Appointments Documentation +# Easy!Appointments Welcome to the documentation pages of Easy!Appointments. Navigate through the available sections and learn how to get the most out of your installation. -- [Installation & Configuration](installation-guide.md) -- [Update Guide](update-guide.md) -- [Manage Translations](manage-translations.md) -- [Google Calendar Sync](google-calendar-sync.md) +- [Installation](installation-guide.md) +- [Update](update-guide.md) +- [Translations](manage-translations.md) - [REST API](rest-api.md) - [Console](console.md) - [Docker](docker.md) +- [Google Calendar Sync](google-calendar-sync.md) - [FAQ](faq.md) *This document applies to Easy!Appointments v1.4.0.* From 88b96f53cc1873c002d8fe1b046e10e1b025456e Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 12:46:30 +0200 Subject: [PATCH 06/36] Corrected calendar view data type in swagger.yml --- swagger.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swagger.yml b/swagger.yml index b61b4278..0fb61b85 100644 --- a/swagger.yml +++ b/swagger.yml @@ -1026,7 +1026,7 @@ definitions: notifications: type: boolean calendarView: - type: boolean + type: string googleSync: type: boolean googleCalendar: From 039f3ec9932e096ad288c67aa0da1bfc6ee1cfac Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 12:49:27 +0200 Subject: [PATCH 07/36] Added timezone support to the API when managing users (#952). --- engine/Api/V1/Parsers/Admins.php | 6 ++++++ engine/Api/V1/Parsers/Providers.php | 6 ++++++ engine/Api/V1/Parsers/Secretaries.php | 6 ++++++ swagger.yml | 6 ++++++ 4 files changed, 24 insertions(+) diff --git a/engine/Api/V1/Parsers/Admins.php b/engine/Api/V1/Parsers/Admins.php index e1c56b08..4f754f03 100644 --- a/engine/Api/V1/Parsers/Admins.php +++ b/engine/Api/V1/Parsers/Admins.php @@ -40,6 +40,7 @@ class Admins implements ParsersInterface { 'state' => $response['state'], 'zip' => $response['zip_code'], 'notes' => $response['notes'], + 'timezone' => $response['timezone'], 'settings' => [ 'username' => $response['settings']['username'], 'notifications' => filter_var($response['settings']['notifications'], FILTER_VALIDATE_BOOLEAN), @@ -115,6 +116,11 @@ class Admins implements ParsersInterface { $decoded_request['notes'] = $request['notes']; } + if ( ! empty($request['timezone'])) + { + $decoded_request['timezone'] = $request['timezone']; + } + if ( ! empty($request['settings'])) { if (empty($decoded_request['settings'])) diff --git a/engine/Api/V1/Parsers/Providers.php b/engine/Api/V1/Parsers/Providers.php index 2f8327a8..b2f41436 100644 --- a/engine/Api/V1/Parsers/Providers.php +++ b/engine/Api/V1/Parsers/Providers.php @@ -40,6 +40,7 @@ class Providers implements ParsersInterface { 'state' => $response['state'], 'zip' => $response['zip_code'], 'notes' => $response['notes'], + 'timezone' => $response['timezone'], ]; if (array_key_exists('services', $response)) @@ -131,6 +132,11 @@ class Providers implements ParsersInterface { $decoded_request['notes'] = $request['notes']; } + if ( ! empty($request['timezone'])) + { + $decoded_request['timezone'] = $request['timezone']; + } + if ( ! empty($request['services'])) { $decoded_request['services'] = $request['services']; diff --git a/engine/Api/V1/Parsers/Secretaries.php b/engine/Api/V1/Parsers/Secretaries.php index 86bda591..05c88aeb 100644 --- a/engine/Api/V1/Parsers/Secretaries.php +++ b/engine/Api/V1/Parsers/Secretaries.php @@ -41,6 +41,7 @@ class Secretaries implements ParsersInterface { 'zip' => $response['zip_code'], 'notes' => $response['notes'], 'providers' => $response['providers'], + 'timezone' => $response['timezone'], 'settings' => [ 'username' => $response['settings']['username'], 'notifications' => filter_var($response['settings']['notifications'], FILTER_VALIDATE_BOOLEAN), @@ -116,6 +117,11 @@ class Secretaries implements ParsersInterface { $decoded_request['notes'] = $request['notes']; } + if ( ! empty($request['timezone'])) + { + $decoded_request['timezone'] = $request['timezone']; + } + if ( ! empty($request['providers'])) { $decoded_request['providers'] = $request['providers']; diff --git a/swagger.yml b/swagger.yml index 0fb61b85..1b4f2790 100644 --- a/swagger.yml +++ b/swagger.yml @@ -977,6 +977,8 @@ definitions: type: string notes: type: string + timezone: + type: string settings: type: object properties: @@ -1012,6 +1014,8 @@ definitions: type: string notes: type: string + timezone: + type: string services: type: array items: @@ -1063,6 +1067,8 @@ definitions: type: string notes: type: string + timezone: + type: string providers: type: array items: From de9e0542ea2c85201fdc487e1f748253588faed6 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 21:15:25 +0200 Subject: [PATCH 08/36] Remove now indicator as it does not support custom timezones (#953) --- assets/js/backend_calendar_default_view.js | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/js/backend_calendar_default_view.js b/assets/js/backend_calendar_default_view.js index 4d7cf6ae..2696f784 100755 --- a/assets/js/backend_calendar_default_view.js +++ b/assets/js/backend_calendar_default_view.js @@ -1412,7 +1412,6 @@ window.BackendCalendarDefaultView = window.BackendCalendarDefaultView || {}; // Initialize page calendar $('#calendar').fullCalendar({ - nowIndicator: true, defaultView: defaultView, height: getCalendarHeight(), editable: true, From 36def8c52ca78edec7b4e5eca134aa9a4df9517d Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 21:16:49 +0200 Subject: [PATCH 09/36] Corrections in the API endpoints (#950) --- .../controllers/api/v1/Appointments.php | 9 ++- application/controllers/api/v1/Settings.php | 8 +- .../controllers/api/v1/Unavailabilities.php | 8 +- engine/Api/V1/Parsers/Admins.php | 36 ++++----- engine/Api/V1/Parsers/Appointments.php | 24 +++--- engine/Api/V1/Parsers/Categories.php | 10 +-- engine/Api/V1/Parsers/Customers.php | 20 ++--- engine/Api/V1/Parsers/Providers.php | 80 +++++++++++-------- engine/Api/V1/Parsers/Secretaries.php | 38 ++++----- engine/Api/V1/Parsers/Services.php | 22 ++--- engine/Api/V1/Parsers/Settings.php | 4 +- engine/Api/V1/Parsers/Unavailabilities.php | 24 +++--- 12 files changed, 151 insertions(+), 132 deletions(-) diff --git a/application/controllers/api/v1/Appointments.php b/application/controllers/api/v1/Appointments.php index a61a2f6c..bae447ca 100644 --- a/application/controllers/api/v1/Appointments.php +++ b/application/controllers/api/v1/Appointments.php @@ -84,7 +84,7 @@ class Appointments extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -120,6 +120,7 @@ class Appointments extends API_V1_Controller { $id = $this->appointments_model->add($appointment); + $appointment = $this->appointments_model->get_row($id); $service = $this->services_model->get_row($appointment['id_services']); $provider = $this->providers_model->get_row($appointment['id_users_provider']); $customer = $this->customers_model->get_row($appointment['id_users_customer']); @@ -142,7 +143,7 @@ class Appointments extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -192,7 +193,7 @@ class Appointments extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -231,7 +232,7 @@ class Appointments extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } } diff --git a/application/controllers/api/v1/Settings.php b/application/controllers/api/v1/Settings.php index 7a9732de..74af732b 100644 --- a/application/controllers/api/v1/Settings.php +++ b/application/controllers/api/v1/Settings.php @@ -88,7 +88,7 @@ class Settings extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -116,7 +116,7 @@ class Settings extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -129,7 +129,7 @@ class Settings extends API_V1_Controller { { try { - $result = $this->settings_model->remove_setting($name); + $this->settings_model->remove_setting($name); $response = new Response([ 'code' => 200, @@ -140,7 +140,7 @@ class Settings extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } } diff --git a/application/controllers/api/v1/Unavailabilities.php b/application/controllers/api/v1/Unavailabilities.php index 71c123d4..ca043cbb 100644 --- a/application/controllers/api/v1/Unavailabilities.php +++ b/application/controllers/api/v1/Unavailabilities.php @@ -71,7 +71,7 @@ class Unavailabilities extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -102,7 +102,7 @@ class Unavailabilities extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -137,7 +137,7 @@ class Unavailabilities extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } @@ -161,7 +161,7 @@ class Unavailabilities extends API_V1_Controller { } catch (Exception $exception) { - exit($this->handle_exception($exception)); + $this->handle_exception($exception); } } } diff --git a/engine/Api/V1/Parsers/Admins.php b/engine/Api/V1/Parsers/Admins.php index 4f754f03..fac31fb0 100644 --- a/engine/Api/V1/Parsers/Admins.php +++ b/engine/Api/V1/Parsers/Admins.php @@ -29,7 +29,7 @@ class Admins implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'firstName' => $response['first_name'], 'lastName' => $response['last_name'], 'email' => $response['email'], @@ -61,90 +61,90 @@ class Admins implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['firstName'])) + if (array_key_exists('firstName', $request)) { $decoded_request['first_name'] = $request['firstName']; } - if ( ! empty($request['lastName'])) + if (array_key_exists('lastName', $request)) { $decoded_request['last_name'] = $request['lastName']; } - if ( ! empty($request['email'])) + if (array_key_exists('email', $request)) { $decoded_request['email'] = $request['email']; } - if ( ! empty($request['mobile'])) + if (array_key_exists('mobile', $request)) { $decoded_request['mobile_number'] = $request['mobile']; } - if ( ! empty($request['phone'])) + if (array_key_exists('phone', $request)) { $decoded_request['phone_number'] = $request['phone']; } - if ( ! empty($request['address'])) + if (array_key_exists('address', $request)) { $decoded_request['address'] = $request['address']; } - if ( ! empty($request['city'])) + if (array_key_exists('city', $request)) { $decoded_request['city'] = $request['city']; } - if ( ! empty($request['state'])) + if (array_key_exists('state', $request)) { $decoded_request['state'] = $request['state']; } - if ( ! empty($request['zip'])) + if (array_key_exists('zip', $request)) { $decoded_request['zip_code'] = $request['zip']; } - if ( ! empty($request['notes'])) + if (array_key_exists('notes', $request)) { $decoded_request['notes'] = $request['notes']; } - if ( ! empty($request['timezone'])) + if (array_key_exists('timezone', $request)) { $decoded_request['timezone'] = $request['timezone']; } - if ( ! empty($request['settings'])) + if (array_key_exists('settings', $request)) { if (empty($decoded_request['settings'])) { $decoded_request['settings'] = []; } - if ( ! empty($request['settings']['username'])) + if (array_key_exists('username', $request['settings'])) { $decoded_request['settings']['username'] = $request['settings']['username']; } - if ( ! empty($request['settings']['password'])) + if (array_key_exists('password', $request['settings'])) { $decoded_request['settings']['password'] = $request['settings']['password']; } - if ($request['settings']['notifications'] !== NULL) + if (array_key_exists('notifications', $request['settings'])) { $decoded_request['settings']['notifications'] = filter_var($request['settings']['notifications'], FILTER_VALIDATE_BOOLEAN); } - if ( ! empty($request['settings']['calendarView'])) + if (array_key_exists('calendarView', $request['settings'])) { $decoded_request['settings']['calendar_view'] = $request['settings']['calendarView']; } diff --git a/engine/Api/V1/Parsers/Appointments.php b/engine/Api/V1/Parsers/Appointments.php index aa90eee9..24974e4b 100644 --- a/engine/Api/V1/Parsers/Appointments.php +++ b/engine/Api/V1/Parsers/Appointments.php @@ -29,7 +29,7 @@ class Appointments implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'book' => $response['book_datetime'], 'start' => $response['start_datetime'], 'end' => $response['end_datetime'], @@ -76,57 +76,57 @@ class Appointments implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['book'])) + if (array_key_exists('book', $request)) { $decoded_request['book_datetime'] = $request['book']; } - if ( ! empty($request['start'])) + if (array_key_exists('start', $request)) { $decoded_request['start_datetime'] = $request['start']; } - if ( ! empty($request['end'])) + if (array_key_exists('end', $request)) { $decoded_request['end_datetime'] = $request['end']; } - if ( ! empty($request['hash'])) + if (array_key_exists('hash', $request)) { $decoded_request['hash'] = $request['hash']; } - if ( ! empty($request['location'])) + if (array_key_exists('location', $request)) { $decoded_request['location'] = $request['location']; } - if ( ! empty($request['notes'])) + if (array_key_exists('notes', $request)) { $decoded_request['notes'] = $request['notes']; } - if ( ! empty($request['customerId'])) + if (array_key_exists('customerId', $request)) { $decoded_request['id_users_customer'] = $request['customerId']; } - if ( ! empty($request['providerId'])) + if (array_key_exists('providerId', $request)) { $decoded_request['id_users_provider'] = $request['providerId']; } - if ( ! empty($request['serviceId'])) + if (array_key_exists('serviceId', $request)) { $decoded_request['id_services'] = $request['serviceId']; } - if ( ! empty($request['googleCalendarId'])) + if (array_key_exists('googleCalendarId', $request)) { $decoded_request['id_google_calendar'] = $request['googleCalendarId']; } diff --git a/engine/Api/V1/Parsers/Categories.php b/engine/Api/V1/Parsers/Categories.php index c270795d..6b2ea7a2 100644 --- a/engine/Api/V1/Parsers/Categories.php +++ b/engine/Api/V1/Parsers/Categories.php @@ -29,9 +29,9 @@ class Categories implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'name' => $response['name'], - 'description' => $response['description'] + 'description' => array_key_exists('description', $response) ? $response['description'] : NULL ]; $response = $encoded_response; @@ -47,17 +47,17 @@ class Categories implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['name'])) + if (array_key_exists('name', $request)) { $decoded_request['name'] = $request['name']; } - if ( ! empty($request['description'])) + if (array_key_exists('description', $request)) { $decoded_request['description'] = $request['description']; } diff --git a/engine/Api/V1/Parsers/Customers.php b/engine/Api/V1/Parsers/Customers.php index 17df8a55..c6610774 100644 --- a/engine/Api/V1/Parsers/Customers.php +++ b/engine/Api/V1/Parsers/Customers.php @@ -29,7 +29,7 @@ class Customers implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'firstName' => $response['first_name'], 'lastName' => $response['last_name'], 'email' => $response['email'], @@ -53,47 +53,47 @@ class Customers implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if ( array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['firstName'])) + if ( array_key_exists('firstName', $request)) { $decoded_request['first_name'] = $request['firstName']; } - if ( ! empty($request['lastName'])) + if ( array_key_exists('lastName', $request)) { $decoded_request['last_name'] = $request['lastName']; } - if ( ! empty($request['email'])) + if ( array_key_exists('email', $request)) { $decoded_request['email'] = $request['email']; } - if ( ! empty($request['phone'])) + if ( array_key_exists('phone', $request)) { $decoded_request['phone_number'] = $request['phone']; } - if ( ! empty($request['address'])) + if ( array_key_exists('address', $request)) { $decoded_request['address'] = $request['address']; } - if ( ! empty($request['city'])) + if ( array_key_exists('city', $request)) { $decoded_request['city'] = $request['city']; } - if ( ! empty($request['zip'])) + if ( array_key_exists('zip', $request)) { $decoded_request['zip_code'] = $request['zip']; } - if ( ! empty($request['notes'])) + if ( array_key_exists('notes', $request)) { $decoded_request['notes'] = $request['notes']; } diff --git a/engine/Api/V1/Parsers/Providers.php b/engine/Api/V1/Parsers/Providers.php index b2f41436..79fee1f1 100644 --- a/engine/Api/V1/Parsers/Providers.php +++ b/engine/Api/V1/Parsers/Providers.php @@ -29,7 +29,7 @@ class Providers implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'firstName' => $response['first_name'], 'lastName' => $response['last_name'], 'email' => $response['email'], @@ -54,13 +54,27 @@ class Providers implements ParsersInterface { 'username' => $response['settings']['username'], 'notifications' => filter_var($response['settings']['notifications'], FILTER_VALIDATE_BOOLEAN), 'calendarView' => $response['settings']['calendar_view'], - 'googleSync' => filter_var($response['settings']['google_sync'], FILTER_VALIDATE_BOOLEAN), - 'googleCalendar' => $response['settings']['google_calendar'], - 'googleToken' => $response['settings']['google_token'], - 'syncFutureDays' => $response['settings']['sync_future_days'] !== NULL ? (int)$response['settings']['sync_future_days'] : NULL, - 'syncPastDays' => $response['settings']['sync_past_days'] !== NULL ? (int)$response['settings']['sync_past_days'] : NULL, - 'workingPlan' => json_decode($response['settings']['working_plan'], TRUE), - 'workingPlanExceptions' => json_decode($response['settings']['working_plan_exceptions'], TRUE), + 'googleSync' => array_key_exists('google_sync', $response['settings']) + ? filter_var($response['settings']['google_sync'], FILTER_VALIDATE_BOOLEAN) + : NULL, + 'googleCalendar' => array_key_exists('google_calendar', $response['settings']) + ? $response['settings']['google_calendar'] + : NULL, + 'googleToken' => array_key_exists('google_token', $response['settings']) + ? $response['settings']['google_token'] + : NULL, + 'syncFutureDays' => array_key_exists('sync_future_days', $response['settings']) + ? (int)$response['settings']['sync_future_days'] + : NULL, + 'syncPastDays' => array_key_exists('sync_past_days', $response['settings']) + ? (int)$response['settings']['sync_past_days'] + : NULL, + 'workingPlan' => array_key_exists('working_plan', $response['settings']) + ? json_decode($response['settings']['working_plan'], TRUE) + : NULL, + 'workingPlanExceptions' => array_key_exists('working_plan_exceptions', $response['settings']) + ? json_decode($response['settings']['working_plan_exceptions'], TRUE) + : NULL, ]; } @@ -77,131 +91,131 @@ class Providers implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['firstName'])) + if (array_key_exists('firstName', $request)) { $decoded_request['first_name'] = $request['firstName']; } - if ( ! empty($request['lastName'])) + if (array_key_exists('lastName', $request)) { $decoded_request['last_name'] = $request['lastName']; } - if ( ! empty($request['email'])) + if (array_key_exists('email', $request)) { $decoded_request['email'] = $request['email']; } - if ( ! empty($request['mobile'])) + if (array_key_exists('mobile', $request)) { $decoded_request['mobile_number'] = $request['mobile']; } - if ( ! empty($request['phone'])) + if (array_key_exists('phone', $request)) { $decoded_request['phone_number'] = $request['phone']; } - if ( ! empty($request['address'])) + if (array_key_exists('address', $request)) { $decoded_request['address'] = $request['address']; } - if ( ! empty($request['city'])) + if (array_key_exists('city', $request)) { $decoded_request['city'] = $request['city']; } - if ( ! empty($request['state'])) + if (array_key_exists('state', $request)) { $decoded_request['state'] = $request['state']; } - if ( ! empty($request['zip'])) + if (array_key_exists('zip', $request)) { $decoded_request['zip_code'] = $request['zip']; } - if ( ! empty($request['notes'])) + if (array_key_exists('notes', $request)) { $decoded_request['notes'] = $request['notes']; } - if ( ! empty($request['timezone'])) + if (array_key_exists('timezone', $request)) { $decoded_request['timezone'] = $request['timezone']; } - if ( ! empty($request['services'])) + if (array_key_exists('services', $request)) { $decoded_request['services'] = $request['services']; } - if ( ! empty($request['settings'])) + if (array_key_exists('settings', $request)) { if (empty($decoded_request['settings'])) { $decoded_request['settings'] = []; } - if ( ! empty($request['settings']['username'])) + if (array_key_exists('username', $request['settings'])) { $decoded_request['settings']['username'] = $request['settings']['username']; } - if ( ! empty($request['settings']['password'])) + if (array_key_exists('password', $request['settings'])) { $decoded_request['settings']['password'] = $request['settings']['password']; } - if ( ! empty($request['settings']['calendarView'])) + if (array_key_exists('calendarView', $request['settings'])) { $decoded_request['settings']['calendar_view'] = $request['settings']['calendarView']; } - if ($request['settings']['notifications'] !== NULL) + if (array_key_exists('notifications', $request['settings'])) { $decoded_request['settings']['notifications'] = filter_var($request['settings']['notifications'], FILTER_VALIDATE_BOOLEAN); } - if ($request['settings']['googleSync'] !== NULL) + if (array_key_exists('googleSync', $request['settings'])) { $decoded_request['settings']['google_sync'] = filter_var($request['settings']['googleSync'], FILTER_VALIDATE_BOOLEAN); } - if ( ! empty($request['settings']['googleCalendar'])) + if (array_key_exists('googleCalendar', $request['settings'])) { $decoded_request['settings']['google_calendar'] = $request['settings']['googleCalendar']; } - if ( ! empty($request['settings']['googleToken'])) + if (array_key_exists('googleToken', $request['settings'])) { $decoded_request['settings']['google_token'] = $request['settings']['googleToken']; } - if ( ! empty($request['settings']['syncFutureDays'])) + if (array_key_exists('syncFutureDays', $request['settings'])) { $decoded_request['settings']['sync_future_days'] = $request['settings']['syncFutureDays']; } - if ( ! empty($request['settings']['syncPastDays'])) + if (array_key_exists('syncPastDays', $request['settings'])) { $decoded_request['settings']['sync_past_days'] = $request['settings']['syncPastDays']; } - if ( ! empty($request['settings']['workingPlan'])) + if (array_key_exists('workingPlan', $request['settings'])) { $decoded_request['settings']['working_plan'] = json_encode($request['settings']['workingPlan']); } - if ( ! empty($request['settings']['workingPlanExceptions'])) + if (array_key_exists('workingPlanExceptions', $request['settings'])) { $decoded_request['settings']['working_plan_exceptions'] = json_encode($request['settings']['workingPlanExceptions']); } diff --git a/engine/Api/V1/Parsers/Secretaries.php b/engine/Api/V1/Parsers/Secretaries.php index 05c88aeb..162fe559 100644 --- a/engine/Api/V1/Parsers/Secretaries.php +++ b/engine/Api/V1/Parsers/Secretaries.php @@ -29,7 +29,7 @@ class Secretaries implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'firstName' => $response['first_name'], 'lastName' => $response['last_name'], 'email' => $response['email'], @@ -62,95 +62,95 @@ class Secretaries implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['firstName'])) + if (array_key_exists('firstName', $request)) { $decoded_request['first_name'] = $request['firstName']; } - if ( ! empty($request['lastName'])) + if (array_key_exists('lastName', $request)) { $decoded_request['last_name'] = $request['lastName']; } - if ( ! empty($request['email'])) + if (array_key_exists('email', $request)) { $decoded_request['email'] = $request['email']; } - if ( ! empty($request['mobile'])) + if (array_key_exists('mobile', $request)) { $decoded_request['mobile_number'] = $request['mobile']; } - if ( ! empty($request['phone'])) + if (array_key_exists('phone', $request)) { $decoded_request['phone_number'] = $request['phone']; } - if ( ! empty($request['address'])) + if (array_key_exists('address', $request)) { $decoded_request['address'] = $request['address']; } - if ( ! empty($request['city'])) + if (array_key_exists('city', $request)) { $decoded_request['city'] = $request['city']; } - if ( ! empty($request['state'])) + if (array_key_exists('state', $request)) { $decoded_request['state'] = $request['state']; } - if ( ! empty($request['zip'])) + if (array_key_exists('zip', $request)) { $decoded_request['zip_code'] = $request['zip']; } - if ( ! empty($request['notes'])) + if (array_key_exists('notes', $request)) { $decoded_request['notes'] = $request['notes']; } - if ( ! empty($request['timezone'])) + if (array_key_exists('timezone', $request)) { $decoded_request['timezone'] = $request['timezone']; } - if ( ! empty($request['providers'])) + if (array_key_exists('providers', $request)) { $decoded_request['providers'] = $request['providers']; } - if ( ! empty($request['settings'])) + if (array_key_exists('settings', $request)) { if (empty($decoded_request['settings'])) { $decoded_request['settings'] = []; } - if ( ! empty($request['settings']['username'])) + if (array_key_exists('username', $request['settings'])) { $decoded_request['settings']['username'] = $request['settings']['username']; } - if ( ! empty($request['settings']['password'])) + if (array_key_exists('password', $request['settings'])) { $decoded_request['settings']['password'] = $request['settings']['password']; } - if ($request['settings']['notifications'] !== NULL) + if (array_key_exists('notifications', $request['settings'])) { $decoded_request['settings']['notifications'] = filter_var($request['settings']['notifications'], FILTER_VALIDATE_BOOLEAN); } - if ( ! empty($request['settings']['calendarView'])) + if (array_key_exists('calendarView', $request['settings'])) { $decoded_request['settings']['calendar_view'] = $request['settings']['calendarView']; } diff --git a/engine/Api/V1/Parsers/Services.php b/engine/Api/V1/Parsers/Services.php index d4757084..c1de3581 100644 --- a/engine/Api/V1/Parsers/Services.php +++ b/engine/Api/V1/Parsers/Services.php @@ -29,7 +29,7 @@ class Services implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'name' => $response['name'], 'duration' => (int)$response['duration'], 'price' => (float)$response['price'], @@ -54,52 +54,52 @@ class Services implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decoded_request['id'] = $request['id']; } - if ( ! empty($request['name'])) + if (array_key_exists('name', $request)) { $decoded_request['name'] = $request['name']; } - if ( ! empty($request['duration'])) + if (array_key_exists('duration', $request)) { $decoded_request['duration'] = $request['duration']; } - if ( ! empty($request['price'])) + if (array_key_exists('price', $request)) { $decoded_request['price'] = $request['price']; } - if ( ! empty($request['currency'])) + if (array_key_exists('currency', $request)) { $decoded_request['currency'] = $request['currency']; } - if ( ! empty($request['description'])) + if (array_key_exists('description', $request)) { $decoded_request['description'] = $request['description']; } - if ( ! empty($request['location'])) + if (array_key_exists('location', $request)) { $decoded_request['location'] = $request['location']; } - if ( ! empty($request['availabilitiesType'])) + if (array_key_exists('availabilitiesType', $request)) { $decoded_request['availabilities_type'] = $request['availabilitiesType']; } - if ( ! empty($request['attendantsNumber'])) + if (array_key_exists('attendantsNumber', $request)) { $decoded_request['attendants_number'] = $request['attendantsNumber']; } - if ( ! empty($request['categoryId'])) + if (array_key_exists('categoryId', $request)) { $decoded_request['id_service_categories'] = $request['categoryId']; } diff --git a/engine/Api/V1/Parsers/Settings.php b/engine/Api/V1/Parsers/Settings.php index 48a19c71..591c5842 100644 --- a/engine/Api/V1/Parsers/Settings.php +++ b/engine/Api/V1/Parsers/Settings.php @@ -46,12 +46,12 @@ class Settings implements ParsersInterface { { $decoded_request = $base ?: []; - if ( ! empty($request['name'])) + if (array_key_exists('name', $request)) { $decoded_request['name'] = $request['name']; } - if ( ! empty($request['value'])) + if (array_key_exists('value', $request)) { $decoded_request['value'] = $request['value']; } diff --git a/engine/Api/V1/Parsers/Unavailabilities.php b/engine/Api/V1/Parsers/Unavailabilities.php index 09d0b142..40b8b898 100644 --- a/engine/Api/V1/Parsers/Unavailabilities.php +++ b/engine/Api/V1/Parsers/Unavailabilities.php @@ -29,13 +29,17 @@ class Unavailabilities implements ParsersInterface { public function encode(array &$response) { $encoded_response = [ - 'id' => $response['id'] !== NULL ? (int)$response['id'] : NULL, + 'id' => array_key_exists('id', $response) ? (int)$response['id'] : NULL, 'book' => $response['book_datetime'], 'start' => $response['start_datetime'], 'end' => $response['end_datetime'], 'notes' => $response['notes'], - 'providerId' => $response['id_users_provider'] !== NULL ? (int)$response['id_users_provider'] : NULL, - 'googleCalendarId' => $response['id_google_calendar'] !== NULL ? (int)$response['id_google_calendar'] : NULL + 'providerId' => array_key_exists('id_users_provider', $response) + ? (int)$response['id_users_provider'] + : NULL, + 'googleCalendarId' => array_key_exists('id_google_calendar', $response) + ? (int)$response['id_google_calendar'] + : NULL ]; $response = $encoded_response; @@ -51,37 +55,37 @@ class Unavailabilities implements ParsersInterface { { $decodedRequest = $base ?: []; - if ( ! empty($request['id'])) + if (array_key_exists('id', $request)) { $decodedRequest['id'] = $request['id']; } - if ( ! empty($request['book'])) + if (array_key_exists('book', $request)) { $decodedRequest['book_datetime'] = $request['book']; } - if ( ! empty($request['start'])) + if (array_key_exists('start', $request)) { $decodedRequest['start_datetime'] = $request['start']; } - if ( ! empty($request['end'])) + if (array_key_exists('end', $request)) { $decodedRequest['end_datetime'] = $request['end']; } - if ( ! empty($request['notes'])) + if (array_key_exists('notes', $request)) { $decodedRequest['notes'] = $request['notes']; } - if ( ! empty($request['providerId'])) + if (array_key_exists('providerId', $request)) { $decodedRequest['id_users_provider'] = $request['providerId']; } - if ( ! empty($request['googleCalendarId'])) + if (array_key_exists('googleCalendarId', $request)) { $decodedRequest['id_google_calendar'] = $request['googleCalendarId']; } From 9ad3ed929fe01702e5b228f304c21b5e48292991 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 21:17:16 +0200 Subject: [PATCH 10/36] Corrected details in swagger.yml --- swagger.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/swagger.yml b/swagger.yml index 1b4f2790..59dd66fe 100644 --- a/swagger.yml +++ b/swagger.yml @@ -798,15 +798,15 @@ paths: schema: items: $ref: '#/definitions/Setting' - '/settings/{settingId}': + '/settings/{settingName}': get: tags: - settings summary: Get single setting parameters: - - name: settingId + - name: settingName in: path - type: integer + type: string required: true responses: '200': @@ -818,7 +818,7 @@ paths: - settings summary: Update single setting parameters: - - name: settingId + - name: settingName in: path type: integer required: true @@ -836,7 +836,7 @@ paths: - settings summary: Delete single setting parameters: - - name: settingId + - name: settingName in: path type: integer required: true From 2dc5439b5dc5e551286b6451ddcde7ea05c31149 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Fri, 11 Dec 2020 21:18:33 +0200 Subject: [PATCH 11/36] The password must be provided when creating a new user (#954) --- application/models/Admins_model.php | 5 +++++ application/models/Providers_model.php | 6 +++++- application/models/Secretaries_model.php | 5 +++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/application/models/Admins_model.php b/application/models/Admins_model.php index 364d7646..a081f292 100644 --- a/application/models/Admins_model.php +++ b/application/models/Admins_model.php @@ -116,6 +116,11 @@ class Admins_model extends EA_Model { } } + if ( ! isset($admin['id']) && ! isset($admin['settings']['password'])) + { + throw new Exception('The user password cannot be empty for new users.'); + } + // Validate calendar view mode. if (isset($admin['settings']['calendar_view']) && ($admin['settings']['calendar_view'] !== CALENDAR_VIEW_DEFAULT && $admin['settings']['calendar_view'] !== CALENDAR_VIEW_TABLE)) diff --git a/application/models/Providers_model.php b/application/models/Providers_model.php index 5a7f7145..98df3a34 100755 --- a/application/models/Providers_model.php +++ b/application/models/Providers_model.php @@ -73,7 +73,6 @@ class Providers_model extends EA_Model { */ public function validate($provider) { - // If a provider id is present, check whether the record exist in the database. if (isset($provider['id'])) { @@ -147,6 +146,11 @@ class Providers_model extends EA_Model { } } + if ( ! isset($provider['id']) && ! isset($provider['settings']['password'])) + { + throw new Exception('The user password cannot be empty for new users.'); + } + // Validate calendar view mode. if (isset($provider['settings']['calendar_view']) && ($provider['settings']['calendar_view'] !== CALENDAR_VIEW_DEFAULT && $provider['settings']['calendar_view'] !== CALENDAR_VIEW_TABLE)) diff --git a/application/models/Secretaries_model.php b/application/models/Secretaries_model.php index 9f28a44f..0a8bd153 100644 --- a/application/models/Secretaries_model.php +++ b/application/models/Secretaries_model.php @@ -124,6 +124,11 @@ class Secretaries_model extends EA_Model { } } + if ( ! isset($secretary['id']) && ! isset($secretary['settings']['password'])) + { + throw new Exception('The user password cannot be empty for new users.'); + } + // Validate calendar view mode. if (isset($secretary['settings']['calendar_view']) && ($secretary['settings']['calendar_view'] !== CALENDAR_VIEW_DEFAULT && $secretary['settings']['calendar_view'] !== CALENDAR_VIEW_TABLE)) From 06804550f6632f3c2675e2f217a68c68e14d5981 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sat, 12 Dec 2020 13:33:33 +0200 Subject: [PATCH 12/36] Updated CHANGELOG.md --- CHANGELOG.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2134989c..f265c449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,21 @@ This file contains the code changes that were introduced into each release (starting from v1.1.0) so that is easy for developers to maintain and readjust their custom modifications on the main project codebase. +## [1.4.1] - 2020-12-14 + +### Added + +- #952 Add timezone support in the REST API, when managing users. + +### Fixed + +- #945 Google Calendar sync throws an error with all day Google Calendar Events. +- #946 Typo in JavaScript code leads to a broken calendar view, when loading unavailability events with note contents. +- #948 Multiple attendant services may lead to double booking. +- #950 Cannot create provider without services via the API, some values (other endpoints) are optional too. +- #953 Current time indicator in fullcalendar is showing time in local timezone and not in the user selected timezone. +- #954 The password must be provided via the API when creating new users. + ## [1.4.0] - 2020-12-09 ### Added @@ -34,7 +49,6 @@ developers to maintain and readjust their custom modifications on the main proje - #770: Store customer's language and use it with notifications or when the customer manages and existing appointment. - #889: Notify admins and secretaries on appointment changes. - ### Changed - #386: Service price should be optional. @@ -42,7 +56,6 @@ developers to maintain and readjust their custom modifications on the main proje - #568: Sort providers alphabetically in the booking page. - #745: Add appointment notes preview in the event popover. - ### Fixed - #171: Google calendar sync - wrong timezone for appointments. @@ -70,7 +83,6 @@ developers to maintain and readjust their custom modifications on the main proje - #883: Appointment date is wrongly changed to today in some case. - #903: Notification not working when creating/updating/deleting an appointment from the REST API. - ## [1.3.2] - 2018-07-29 ### Fixed From ccd63eabe4a266094f4d7addf4c4ec7f695c9a43 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sat, 12 Dec 2020 13:42:51 +0200 Subject: [PATCH 13/36] Updated doc references --- docs/console.md | 2 +- docs/docker.md | 2 +- docs/faq.md | 2 +- docs/get-involved.md | 2 +- docs/google-calendar-sync.md | 2 +- docs/installation-guide.md | 2 +- docs/manage-translations.md | 2 +- docs/readme.md | 2 +- docs/rest-api.md | 2 +- docs/update-guide.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/console.md b/docs/console.md index f2e40126..e5ed6709 100644 --- a/docs/console.md +++ b/docs/console.md @@ -89,6 +89,6 @@ php index.php help This command will give more information about the console capabilities. -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/docker.md b/docs/docker.md index e1f5b8e4..57ce0813 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -45,6 +45,6 @@ You can remove the docker containers with `docker rm easyappointments-server eas You can remove the server image with `docker rmi easyappointments-server:v1`. -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/faq.md b/docs/faq.md index 61876197..32abfc0e 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -54,6 +54,6 @@ You get this warning because PHP is not configured with a timezone setting. This `date_default_timezone_set('America/Los_Angeles'); // Use your own timezone string.` -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/get-involved.md b/docs/get-involved.md index 3dc6ddcf..b65fcd46 100644 --- a/docs/get-involved.md +++ b/docs/get-involved.md @@ -20,6 +20,6 @@ You are more than welcome to help with the translation progress of the user inte It would be much appreciated if you would take 5 minutes of your time to fill this small form on your experience with Easy!Appointments. User feedback is very important and will help with the future planning of the project. Fill the [E!A Feedback Form](https://docs.google.com/forms/d/15dw1jl7lUgw4q-XXMn13Gx_e8zJxAiyWYMOdqtZqIHU/viewform). -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/google-calendar-sync.md b/docs/google-calendar-sync.md index f3502def..a7595d62 100644 --- a/docs/google-calendar-sync.md +++ b/docs/google-calendar-sync.md @@ -49,6 +49,6 @@ Google Developers – https://developers.google.com/google-apps/calendar E!A Support Group – https://groups.google.com/forum/#!forum/easy-appointments -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/installation-guide.md b/docs/installation-guide.md index 0f644862..03ef736b 100644 --- a/docs/installation-guide.md +++ b/docs/installation-guide.md @@ -29,6 +29,6 @@ Finally just add a link in your website that points to your Easy!Appointments in Happy Bookin'! -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/manage-translations.md b/docs/manage-translations.md index 6b51552f..f726a4f3 100644 --- a/docs/manage-translations.md +++ b/docs/manage-translations.md @@ -14,6 +14,6 @@ Easy!Appointments is based upon CodeIgniter (PHP Framework) and it uses its buil Follow these steps in order to add or adjust your translations and modify the message of the user interface of Easy!Appointments. If you want contribute to the translation process of Easy!Appointments please read the [Get Involved](https://github.com/alextselegidis/easyappointments/wiki/Get-Involved!) wiki page for more information. Please share your translations with the user community. -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/readme.md b/docs/readme.md index 75e7cb45..7d172e58 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -11,4 +11,4 @@ Welcome to the documentation pages of Easy!Appointments. Navigate through the av - [Google Calendar Sync](google-calendar-sync.md) - [FAQ](faq.md) -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* diff --git a/docs/rest-api.md b/docs/rest-api.md index 5f47399b..c8fd2ea6 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -472,6 +472,6 @@ fastcgi_param PHP_AUTH_PW $http_authorization; [[Source]](http://serverfault.com/a/520943) -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) diff --git a/docs/update-guide.md b/docs/update-guide.md index 009dfcdd..db6caba9 100644 --- a/docs/update-guide.md +++ b/docs/update-guide.md @@ -110,6 +110,6 @@ Open your browser to the Easy!Appointments installation URL, login to the backen Use the data of the old `configuration.php` file in the new `config.php`. -*This document applies to Easy!Appointments v1.4.0.* +*This document applies to Easy!Appointments v1.4.1.* [Back](readme.md) From 731fb52ab4d12fd2976f79ceb8f79f9093155ac0 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sat, 12 Dec 2020 14:22:25 +0200 Subject: [PATCH 14/36] Display confirmation modal when disabling a connected Google Calendar Sync (#955). --- .../language/arabic/translations_lang.php | 3 +- .../language/bulgarian/translations_lang.php | 1 + .../language/catalan/translations_lang.php | 1 + .../language/chinese/translations_lang.php | 1 + .../language/czech/translations_lang.php | 1 + .../language/danish/translations_lang.php | 1 + .../language/dutch/translations_lang.php | 1 + .../language/english/translations_lang.php | 1 + .../language/finnish/translations_lang.php | 1 + .../language/french/translations_lang.php | 1 + .../language/german/translations_lang.php | 1 + .../language/greek/translations_lang.php | 1 + .../language/hebrew/translations_lang.php | 3 +- .../language/hindi/translations_lang.php | 1 + .../language/hungarian/translations_lang.php | 1 + .../language/italian/translations_lang.php | 1 + .../language/japanese/translations_lang.php | 1 + .../luxembourgish/translations_lang.php | 1 + .../language/marathi/translations_lang.php | 1 + .../language/polish/translations_lang.php | 1 + .../portuguese-br/translations_lang.php | 1 + .../language/portuguese/translations_lang.php | 1 + .../language/romanian/translations_lang.php | 1 + .../language/russian/translations_lang.php | 1 + .../language/slovak/translations_lang.php | 1 + .../language/spanish/translations_lang.php | 1 + .../language/swedish/translations_lang.php | 1 + .../language/turkish/translations_lang.php | 1 + assets/js/backend_calendar_default_view.js | 1 - assets/js/backend_calendar_google_sync.js | 56 ++++++++++++------- 30 files changed, 67 insertions(+), 22 deletions(-) diff --git a/application/language/arabic/translations_lang.php b/application/language/arabic/translations_lang.php index b450c97e..83d713a3 100755 --- a/application/language/arabic/translations_lang.php +++ b/application/language/arabic/translations_lang.php @@ -1,4 +1,4 @@ - Date: Sat, 12 Dec 2020 14:23:01 +0200 Subject: [PATCH 15/36] Updated CHANGELOG.md --- CHANGELOG.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f265c449..aa6e019e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,16 +7,17 @@ developers to maintain and readjust their custom modifications on the main proje ### Added -- #952 Add timezone support in the REST API, when managing users. +- #952: Add timezone support in the REST API, when managing users. +- #955: Display confirmation modal when disabling a connected Google Calendar Sync. ### Fixed -- #945 Google Calendar sync throws an error with all day Google Calendar Events. -- #946 Typo in JavaScript code leads to a broken calendar view, when loading unavailability events with note contents. -- #948 Multiple attendant services may lead to double booking. -- #950 Cannot create provider without services via the API, some values (other endpoints) are optional too. -- #953 Current time indicator in fullcalendar is showing time in local timezone and not in the user selected timezone. -- #954 The password must be provided via the API when creating new users. +- #945: Google Calendar sync throws an error with all day Google Calendar Events. +- #946: Typo in JavaScript code leads to a broken calendar view, when loading unavailability events with note contents. +- #948: Multiple attendant services may lead to double booking. +- #950: Cannot create provider without services via the API, some values (other endpoints) are optional too. +- #953: Current time indicator in fullcalendar is showing time in local timezone and not in the user selected timezone. +- #954: The password must be provided via the API when creating new users. ## [1.4.0] - 2020-12-09 From ce40aa342bf6e0a9a97e4fab891bf30bd6b7cf6e Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sat, 12 Dec 2020 14:54:41 +0200 Subject: [PATCH 16/36] Automatically update the non working plan when changed in backend calendar. --- assets/js/backend_calendar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/js/backend_calendar.js b/assets/js/backend_calendar.js index 4441e2fc..452172df 100755 --- a/assets/js/backend_calendar.js +++ b/assets/js/backend_calendar.js @@ -82,7 +82,7 @@ window.BackendCalendar = window.BackendCalendar || {}; var successCallback = function () { Backend.displayNotification(EALang.working_plan_exception_saved); - var workingPlanExceptions = jQuery.parseJSON(provider.settings.working_plan_exceptions) || {}; + var workingPlanExceptions = JSON.parse(provider.settings.working_plan_exceptions) || {}; workingPlanExceptions[date] = workingPlanException; @@ -90,7 +90,7 @@ window.BackendCalendar = window.BackendCalendar || {}; var availableProvider = GlobalVariables.availableProviders[index]; if (Number(availableProvider.id) === Number(providerId)) { - availableProvider.settings.working_plan_exceptions = JSON.stringify(workingPlanExceptions); + GlobalVariables.availableProviders[index].settings.working_plan_exceptions = JSON.stringify(workingPlanExceptions); break; } } From 0da88a7729adc0b1f725d39dbfe2b267e54fdf06 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sat, 12 Dec 2020 15:11:33 +0200 Subject: [PATCH 17/36] Check provided date --- assets/js/general_functions.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/assets/js/general_functions.js b/assets/js/general_functions.js index 231ce7cc..235120d1 100755 --- a/assets/js/general_functions.js +++ b/assets/js/general_functions.js @@ -365,16 +365,21 @@ window.GeneralFunctions = window.GeneralFunctions || {}; var timeFormat = GlobalVariables.timeFormat === 'regular' ? 'h:mm tt' : 'HH:mm'; var hours = addHours ? ' ' + timeFormat : ''; var result; + var parsedDate = Date.parse(date); + + if (!parsedDate) { + return date; + } switch (dateFormatSetting) { case 'DMY': - result = Date.parse(date).toString('dd/MM/yyyy' + hours); + result = parsedDate.toString('dd/MM/yyyy' + hours); break; case 'MDY': - result = Date.parse(date).toString('MM/dd/yyyy' + hours); + result = parsedDate.toString('MM/dd/yyyy' + hours); break; case 'YMD': - result = Date.parse(date).toString('yyyy/MM/dd' + hours); + result = parsedDate.toString('yyyy/MM/dd' + hours); break; default: throw new Error('Invalid date format setting provided!', dateFormatSetting); From 30381b5c86aec141f23bb4d77c68357bc7bb8a0b Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Sat, 12 Dec 2020 15:31:08 +0200 Subject: [PATCH 18/36] Removed the onDayClick callback in table view as it is not needed. --- assets/js/backend_calendar_table_view.js | 44 +++--------------------- 1 file changed, 4 insertions(+), 40 deletions(-) diff --git a/assets/js/backend_calendar_table_view.js b/assets/js/backend_calendar_table_view.js index 6fdbadfa..7724f8b3 100755 --- a/assets/js/backend_calendar_table_view.js +++ b/assets/js/backend_calendar_table_view.js @@ -574,8 +574,10 @@ window.BackendCalendarTableView = window.BackendCalendarTableView || {}; return matches.length; }); - return (!filterProviderIds.length && !filterServiceIds.length) || servedServiceIds.length - || filterProviderIds.indexOf(provider.id) !== -1; + return (!filterProviderIds.length && !filterServiceIds.length) + || (filterProviderIds.length && !filterServiceIds.length && filterProviderIds.indexOf(provider.id) !== -1) + || (!filterProviderIds.length && filterServiceIds.length && servedServiceIds.length) + || (filterProviderIds.length && filterServiceIds.length && servedServiceIds.length && filterProviderIds.indexOf(provider.id) !== -1); }); if (GlobalVariables.user.role_slug === 'provider') { @@ -792,7 +794,6 @@ window.BackendCalendarTableView = window.BackendCalendarTableView || {}; eventClick: onEventClick, eventResize: onEventResize, eventDrop: onEventDrop, - dayClick: onDayClick, viewRender: onViewRender }); @@ -804,43 +805,6 @@ window.BackendCalendarTableView = window.BackendCalendarTableView || {}; .prependTo($providerColumn); } - /** - * Calendar Day "Click" Callback - * - * When the user clicks on a day square on the calendar, then he will automatically be transferred to that - * day view calendar. - */ - function onDayClick(date) { - $('#insert-appointment').trigger('click'); - - var $dialog = $('#manage-appointment'); - - var providerId = $(this).closest('.provider-column').data('provider').id; - - var provider = GlobalVariables.availableProviders.find(function (provider) { - return Number(provider.id) === Number(providerId); - }); - - if (!provider) { - return; - } - - var service = GlobalVariables.availableServices.find(function (service) { - return provider.services.indexOf(service.id) !== -1; - }); - - if (provider.services.length) { - $dialog.find('#select-service').val([provider.services[0]]).trigger('change'); - $dialog.find('#select-provider').val(provider.id); - - $dialog.find('#start-datetime').val(GeneralFunctions.formatDate(date, GlobalVariables.dateFormat, true)); - $dialog.find('#start-datetime').datepicker('setDate', date); - $dialog.find('#end-datetime').val(GeneralFunctions.formatDate(date.addMinutes(service.duration), - GlobalVariables.dateFormat, true)); - $dialog.find('#end-datetime').datepicker('setDate', date); - } - } - function onViewRender(view, element) { $(element).fullCalendar('option', 'height', getCalendarHeight()); } From 0d5f673ecf9fc23767d5796da64b75a7d4e57017 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 09:53:16 +0200 Subject: [PATCH 19/36] User timezone must not be empied by default as it is required. --- application/views/backend/users.php | 11 ++++++----- assets/js/backend_users_admins.js | 8 ++++++-- assets/js/backend_users_providers.js | 2 ++ assets/js/backend_users_secretaries.js | 2 ++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/application/views/backend/users.php b/application/views/backend/users.php index db957069..1ead72f1 100755 --- a/application/views/backend/users.php +++ b/application/views/backend/users.php @@ -261,9 +261,9 @@
- +

@@ -549,9 +549,9 @@
- +

@@ -757,8 +757,9 @@
- +

diff --git a/assets/js/backend_users_admins.js b/assets/js/backend_users_admins.js index 9b379b67..8f2e546b 100644 --- a/assets/js/backend_users_admins.js +++ b/assets/js/backend_users_admins.js @@ -308,8 +308,12 @@ $('#admins .add-edit-delete-group').show(); $('#admins .save-cancel-group').hide(); - $('#admins .record-details').find('input, select, textarea').prop('disabled', true); - $('#admins .record-details').find('input, textarea').val(''); + $('#admins .record-details') + .find('input, select, textarea') + .val('') + .prop('disabled', true); + $('#admins .record-details #admin-calendar-view').val('default'); + $('#admins .record-details #admin-timezone').val('UTC'); $('#edit-admin, #delete-admin').prop('disabled', true); $('#admins .has-error').removeClass('has-error'); diff --git a/assets/js/backend_users_providers.js b/assets/js/backend_users_providers.js index f27793da..2f0c685a 100755 --- a/assets/js/backend_users_providers.js +++ b/assets/js/backend_users_providers.js @@ -350,6 +350,8 @@ $('#providers .record-details').find('input, select, textarea') .val('') .prop('disabled', true); + $('#providers .record-details #provider-calendar-view').val('default'); + $('#providers .record-details #provider-timezone').val('UTC'); $('#providers .add-break, .add-working-plan-exception, #reset-working-plan').prop('disabled', true); BackendUsers.wp.timepickers(true); $('#providers .working-plan input:text').timepicker('destroy'); diff --git a/assets/js/backend_users_secretaries.js b/assets/js/backend_users_secretaries.js index c6310306..8ddb41e2 100644 --- a/assets/js/backend_users_secretaries.js +++ b/assets/js/backend_users_secretaries.js @@ -324,6 +324,8 @@ .find('input, select, textarea') .val('') .prop('disabled', true); + $('#secretaries .record-details #secretary-calendar-view').val('default'); + $('#secretaries .record-details #secretary-timezone').val('UTC'); $('#secretaries .add-edit-delete-group').show(); $('#secretaries .save-cancel-group').hide(); $('#edit-secretary, #delete-secretary').prop('disabled', true); From 122f2aef8531347a614e493d05eb3f55db1cece3 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 10:38:43 +0200 Subject: [PATCH 20/36] Replace unix based "find" command with node package for the removal of .DS_Store files --- gulpfile.js | 8 +- package-lock.json | 226 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 3 files changed, 226 insertions(+), 9 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 04fa784a..0d2c023e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -15,6 +15,7 @@ const fs = require('fs-extra'); const zip = require('zip-dir'); const plugins = require('gulp-load-plugins')(); const {execSync} = require('child_process'); +const del = require('del'); // Gulp error handling. const source = gulp.src; @@ -68,13 +69,12 @@ gulp.task('package', (done) => { console.log(stderr); }); - execSync('cd build && find . -name ".DS_Store" -type f -delete', function (err, stdout, stderr) { - console.log(stdout); - console.log(stderr); - }); + del.sync('**/.DS_Store'); fs.removeSync('build/composer.lock'); + del.sync('**/.DS_Store') + zip('build', {saveTo: archive}, function (err) { if (err) console.log('Zip Error', err); diff --git a/package-lock.json b/package-lock.json index 816a6e17..5e0e20bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,29 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.1.tgz", "integrity": "sha512-OEdH7SyC1suTdhBGW91/zBfR6qaIhThbcN8PUXtXilY4GYnSBbVqOntdHbC1vXwsDnX0Qix2m2+DSU1J51ybOQ==" }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, "@popperjs/core": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.5.3.tgz", @@ -48,6 +71,15 @@ } } }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", @@ -263,6 +295,11 @@ } } }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -606,6 +643,11 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -923,6 +965,31 @@ } } }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -934,6 +1001,21 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + } + } + }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -1489,12 +1571,81 @@ "time-stamp": "^1.0.0" } }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "requires": { + "reusify": "^1.0.4" + } + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -11257,6 +11408,26 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + } + } + }, "glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", @@ -11269,8 +11440,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growly": { "version": "1.3.0", @@ -11643,6 +11813,11 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -11834,8 +12009,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -11850,7 +12024,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -11906,6 +12079,16 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -12413,6 +12596,11 @@ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -12763,6 +12951,14 @@ "lcid": "^1.0.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -12865,6 +13061,11 @@ "pinkie-promise": "^2.0.0" } }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -13280,6 +13481,11 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -13323,6 +13529,11 @@ "once": "^1.3.0" } }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" + }, "rx-lite": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", @@ -13400,6 +13611,11 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, "slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", diff --git a/package.json b/package.json index 904f27d0..f005314b 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "bootstrap": "^4.5.3", "cookieconsent": "^3.1.1", "datejs": "0.0.2", + "del": "^6.0.0", "fullcalendar": "^3.10.2", "jquery": "^3.5.1", "jquery-ui": "^1.12.0", From f77ceeff84d43158a48f7a6e0dcf997b395d1f44 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 10:48:36 +0200 Subject: [PATCH 21/36] Corrected click event behavior of the captcha refresh button --- application/views/appointments/book.php | 4 +++- assets/js/frontend_book.js | 2 +- assets/js/frontend_book_api.js | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/application/views/appointments/book.php b/application/views/appointments/book.php index 47e511bc..772eaa82 100755 --- a/application/views/appointments/book.php +++ b/application/views/appointments/book.php @@ -363,7 +363,9 @@

CAPTCHA - +

diff --git a/assets/js/frontend_book.js b/assets/js/frontend_book.js index 3c6a6f0c..15e2ea25 100644 --- a/assets/js/frontend_book.js +++ b/assets/js/frontend_book.js @@ -433,7 +433,7 @@ window.FrontendBook = window.FrontendBook || {}; * * @param {jQuery.Event} event */ - $('.captcha-title svg').on('click', function (event) { + $('.captcha-title button').on('click', function (event) { $('.captcha-image').attr('src', GlobalVariables.baseUrl + '/index.php/captcha?' + Date.now()); }); diff --git a/assets/js/frontend_book_api.js b/assets/js/frontend_book_api.js index 119eeaed..d5330352 100755 --- a/assets/js/frontend_book_api.js +++ b/assets/js/frontend_book_api.js @@ -194,7 +194,7 @@ window.FrontendBookApi = window.FrontendBookApi || {}; $('#captcha-hint').fadeTo(400, 0); }, 3000); - $('.captcha-title svg').trigger('click'); + $('.captcha-title button').trigger('click'); $captchaText.closest('.form-group').addClass('has-error'); @@ -205,7 +205,7 @@ window.FrontendBookApi = window.FrontendBookApi || {}; + '/index.php/appointments/book_success/' + response.appointment_hash; }) .fail(function (jqxhr, textStatus, errorThrown) { - $('.captcha-title svg').trigger('click'); + $('.captcha-title button').trigger('click'); }) .always(function () { $layer.remove(); From a7539325e5f7d6a2d8c79f9bfb00a511a0ee0420 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 15:05:11 +0200 Subject: [PATCH 22/36] Updated the composer.lock file --- composer.lock | 1025 +++++++++++++++++++++++++++---------------------- 1 file changed, 567 insertions(+), 458 deletions(-) diff --git a/composer.lock b/composer.lock index 23ffe7c2..864dd3a6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5c87a4ae7a51d129a86f46448dd2262b", + "content-hash": "9e5f14e0a8a119ba99b24d367d526911", "packages": [ { "name": "codeigniter/framework", @@ -91,23 +91,23 @@ }, { "name": "google/apiclient", - "version": "v2.4.1", + "version": "v2.8.3", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "1fdfe942f9aaf3064e621834a5e3047fccb3a6da" + "reference": "81696e6206322e38c643cfcc96c4494ccfef8a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/1fdfe942f9aaf3064e621834a5e3047fccb3a6da", - "reference": "1fdfe942f9aaf3064e621834a5e3047fccb3a6da", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/81696e6206322e38c643cfcc96c4494ccfef8a32", + "reference": "81696e6206322e38c643cfcc96c4494ccfef8a32", "shasum": "" }, "require": { "firebase/php-jwt": "~2.0||~3.0||~4.0||~5.0", "google/apiclient-services": "~0.13", - "google/auth": "^1.0", - "guzzlehttp/guzzle": "~5.3.1||~6.0", + "google/auth": "^1.10", + "guzzlehttp/guzzle": "~5.3.1||~6.0||~7.0", "guzzlehttp/psr7": "^1.2", "monolog/monolog": "^1.17|^2.0", "php": ">=5.4", @@ -115,15 +115,16 @@ }, "require-dev": { "cache/filesystem-adapter": "^0.3.2", - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "composer/composer": "^1.10", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", "phpcompatibility/php-compatibility": "^9.2", - "phpunit/phpunit": "^4.8|^5.0", + "phpunit/phpunit": "^4.8.36|^5.0", "squizlabs/php_codesniffer": "~2.3", "symfony/css-selector": "~2.1", "symfony/dom-crawler": "~2.1" }, "suggest": { - "cache/filesystem-adapter": "For caching certs and tokens (using Google_Client::setCache)" + "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)" }, "type": "library", "extra": { @@ -132,11 +133,14 @@ } }, "autoload": { - "psr-0": { - "Google_": "src/" + "psr-4": { + "Google\\": "src/" }, + "files": [ + "src/aliases.php" + ], "classmap": [ - "src/Google/Service/" + "src/aliases.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -148,20 +152,20 @@ "keywords": [ "google" ], - "time": "2020-03-26T15:30:32+00:00" + "time": "2020-11-17T17:33:35+00:00" }, { "name": "google/apiclient-services", - "version": "v0.133", + "version": "v0.156", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "dd53c4a23a5c4d868e409585e30ab31da278b5d2" + "reference": "2f5e54fdef034f856208328126bddd8376dae4b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/dd53c4a23a5c4d868e409585e30ab31da278b5d2", - "reference": "dd53c4a23a5c4d868e409585e30ab31da278b5d2", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/2f5e54fdef034f856208328126bddd8376dae4b3", + "reference": "2f5e54fdef034f856208328126bddd8376dae4b3", "shasum": "" }, "require": { @@ -185,37 +189,37 @@ "keywords": [ "google" ], - "time": "2020-05-03T00:24:28+00:00" + "time": "2020-11-30T20:03:55+00:00" }, { "name": "google/auth", - "version": "v1.8.0", + "version": "v1.14.3", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "c7b295feb248f138f462a1e6b7d635e4244204c5" + "reference": "c1503299c779af0cbc99b43788f75930988852cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/c7b295feb248f138f462a1e6b7d635e4244204c5", - "reference": "c7b295feb248f138f462a1e6b7d635e4244204c5", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/c1503299c779af0cbc99b43788f75930988852cf", + "reference": "c1503299c779af0cbc99b43788f75930988852cf", "shasum": "" }, "require": { "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "~5.3.1|~6.0", + "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", "guzzlehttp/psr7": "^1.2", "php": ">=5.4", "psr/cache": "^1.0", "psr/http-message": "^1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", "guzzlehttp/promises": "0.1.1|^1.3", "kelvinmo/simplejwt": "^0.2.5", "phpseclib/phpseclib": "^2", "phpunit/phpunit": "^4.8.36|^5.7", - "sebastian/comparator": ">=1.2.3" + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." @@ -237,7 +241,7 @@ "google", "oauth2" ], - "time": "2020-03-26T19:47:36+00:00" + "time": "2020-10-16T21:33:48+00:00" }, { "name": "gregwar/captcha", @@ -294,37 +298,43 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.3", + "version": "7.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e" + "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aab4ebd862aa7d04f01a4b51849d657db56d882e", - "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79", + "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.11" + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", "psr/log": "^1.1" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.1-dev" } }, "autoload": { @@ -344,6 +354,11 @@ "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "Guzzle is a PHP HTTP client library", @@ -354,30 +369,50 @@ "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], - "time": "2020-04-18T10:38:46+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://github.com/alexeyshockov", + "type": "github" + }, + { + "url": "https://github.com/gmponos", + "type": "github" + } + ], + "time": "2020-10-10T11:47:56+00:00" }, { "name": "guzzlehttp/promises", - "version": "v1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "reference": "60d379c243457e073cff02bc323a2a86cb355631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { @@ -408,20 +443,20 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "time": "2020-09-30T07:37:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", "shasum": "" }, "require": { @@ -434,15 +469,15 @@ }, "require-dev": { "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -479,7 +514,7 @@ "uri", "url" ], - "time": "2019-07-01T23:21:34+00:00" + "time": "2020-09-30T07:37:11+00:00" }, { "name": "jsvrcek/ics", @@ -531,16 +566,16 @@ }, { "name": "monolog/monolog", - "version": "1.25.3", + "version": "1.25.5", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fa82921994db851a8becaf3787a9e73c5976b6f1" + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fa82921994db851a8becaf3787a9e73c5976b6f1", - "reference": "fa82921994db851a8becaf3787a9e73c5976b6f1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", "shasum": "" }, "require": { @@ -554,11 +589,10 @@ "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", "ruflin/elastica": ">=0.90 <3.0", "sentry/sentry": "^0.13", "swiftmailer/swiftmailer": "^5.3|^6.0" @@ -605,31 +639,45 @@ "logging", "psr-3" ], - "time": "2019-12-20T14:15:16+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:35:51+00:00" }, { "name": "phpmailer/phpmailer", - "version": "v6.1.7", + "version": "v6.2.0", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0" + "reference": "e38888a75c070304ca5514197d4847a59a5c853f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0", - "reference": "2c2370ba3df7034f9eb7b8f387c97b52b2ba5ad0", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e38888a75c070304ca5514197d4847a59a5c853f", + "reference": "e38888a75c070304ca5514197d4847a59a5c853f", "shasum": "" }, "require": { "ext-ctype": "*", "ext-filter": "*", + "ext-hash": "*", "php": ">=5.5.0" }, "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", "doctrine/annotations": "^1.2", - "friendsofphp/php-cs-fixer": "^2.2", - "phpunit/phpunit": "^4.8 || ^5.7" + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.5.6", + "yoast/phpunit-polyfills": "^0.2.0" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset", @@ -667,20 +715,26 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2020-07-14T18:50:27+00:00" + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "time": "2020-11-25T15:24:57+00:00" }, { "name": "phpseclib/phpseclib", - "version": "2.0.27", + "version": "2.0.29", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc" + "reference": "497856a8d997f640b4a516062f84228a772a48a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc", - "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/497856a8d997f640b4a516062f84228a772a48a8", + "reference": "497856a8d997f640b4a516062f84228a772a48a8", "shasum": "" }, "require": { @@ -689,7 +743,6 @@ "require-dev": { "phing/phing": "~2.7", "phpunit/phpunit": "^4.8.35|^5.7|^6.0", - "sami/sami": "~2.0", "squizlabs/php_codesniffer": "~2.0" }, "suggest": { @@ -759,7 +812,21 @@ "x.509", "x509" ], - "time": "2020-04-04T23:17:33+00:00" + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2020-09-08T04:24:43+00:00" }, { "name": "psr/cache", @@ -807,6 +874,55 @@ ], "time": "2016-08-06T20:24:11+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "time": "2020-06-29T06:28:15+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -946,27 +1062,22 @@ }, { "name": "symfony/finder", - "version": "v5.0.7", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "600a52c29afc0d1caa74acbec8d3095ca7e9910d" + "reference": "fd8305521692f27eae3263895d1ef1571c71a78d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/600a52c29afc0d1caa74acbec8d3095ca7e9910d", - "reference": "600a52c29afc0d1caa74acbec8d3095ca7e9910d", + "url": "https://api.github.com/repos/symfony/finder/zipball/fd8305521692f27eae3263895d1ef1571c71a78d", + "reference": "fd8305521692f27eae3263895d1ef1571c71a78d", "shasum": "" }, "require": { - "php": "^7.2.5" + "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" @@ -991,218 +1102,51 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2020-03-27T16:56:45+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", - "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.15-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ + "funding": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" + "url": "https://symfony.com/sponsor", + "type": "custom" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "time": "2020-03-09T19:04:49+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.15-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "url": "https://github.com/fabpot", + "type": "github" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" } ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "time": "2020-03-09T19:04:49+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "37b0976c78b94856543260ce09b460a7bc852747" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747", - "reference": "37b0976c78b94856543260ce09b460a7bc852747", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.15-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "time": "2020-02-27T09:26:54+00:00" + "time": "2020-11-18T09:42:36+00:00" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -1216,7 +1160,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -1225,24 +1169,38 @@ "constructor", "instantiate" ], - "time": "2019-10-21T16:45:58+00:00" + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.9.5", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "replace": { "myclabs/deep-copy": "self.version" @@ -1273,7 +1231,13 @@ "object", "object graph" ], - "time": "2020-01-17T21:11:47+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-11-13T09:40:50+00:00" }, { "name": "phar-io/manifest", @@ -1379,28 +1343,25 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "2.0.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~6" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -1427,32 +1388,31 @@ "reflection", "static analysis" ], - "time": "2018-08-07T13:53:10+00:00" + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.1.0", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", - "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "shasum": "" }, "require": { - "ext-filter": "^7.1", - "php": "^7.2", - "phpdocumentor/reflection-common": "^2.0", - "phpdocumentor/type-resolver": "^1.0", - "webmozart/assert": "^1" + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "doctrine/instantiator": "^1", - "mockery/mockery": "^1" + "mockery/mockery": "~1.3.2" }, "type": "library", "extra": { @@ -1480,34 +1440,33 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-02-22T12:28:44+00:00" + "time": "2020-09-03T19:13:55+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.1.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", - "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "shasum": "" }, "require": { - "php": "^7.2", + "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "^7.2", - "mockery/mockery": "~1" + "ext-tokenizer": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { @@ -1526,37 +1485,37 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-02-18T18:59:58+00:00" + "time": "2020-09-17T18:55:26+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.10.3", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" + "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.1", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0 <9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -1589,7 +1548,7 @@ "spy", "stub" ], - "time": "2020-03-05T15:02:03+00:00" + "time": "2020-09-29T09:10:42+00:00" }, { "name": "phpunit/php-code-coverage", @@ -1656,23 +1615,23 @@ }, { "name": "phpunit/php-file-iterator", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1702,7 +1661,13 @@ "filesystem", "iterator" ], - "time": "2018-09-13T20:33:42+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:25:21+00:00" }, { "name": "phpunit/php-text-template", @@ -1747,23 +1712,23 @@ }, { "name": "phpunit/php-timer", - "version": "2.1.2", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1792,25 +1757,31 @@ "keywords": [ "timer" ], - "time": "2019-06-07T04:22:29+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:20:02+00:00" }, { "name": "phpunit/php-token-stream", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + "reference": "472b687829041c24b25f475e14c2f38a09edf1c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/472b687829041c24b25f475e14c2f38a09edf1c2", + "reference": "472b687829041c24b25f475e14c2f38a09edf1c2", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.0" @@ -1841,7 +1812,14 @@ "keywords": [ "tokenizer" ], - "time": "2019-09-17T06:23:10+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "abandoned": true, + "time": "2020-11-30T08:38:46+00:00" }, { "name": "phpunit/phpunit", @@ -1933,12 +1911,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "81541a731da2f245a08666de73169cb5da7ac573" + "reference": "d5961914bf7f90e81af509b81e51450bff419815" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/81541a731da2f245a08666de73169cb5da7ac573", - "reference": "81541a731da2f245a08666de73169cb5da7ac573", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/d5961914bf7f90e81af509b81e51450bff419815", + "reference": "d5961914bf7f90e81af509b81e51450bff419815", "shasum": "" }, "conflict": { @@ -1947,11 +1925,15 @@ "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", "amphp/artax": "<1.0.6|>=2,<2.0.6", "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", "aws/aws-sdk-php": ">=3,<3.2.1", "bagisto/bagisto": "<0.1.5", - "bolt/bolt": "<3.6.10", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "baserproject/basercms": ">=4,<=4.3.6|>=4.4,<4.4.1", + "bolt/bolt": "<3.7.1", "brightlocal/phpwhois": "<=4.2.5", "buddypress/buddypress": "<5.1.2", "bugsnag/bugsnag-laravel": ">=2,<2.0.2", @@ -1964,10 +1946,11 @@ "composer/composer": "<=1-alpha.11", "contao-components/mediaelement": ">=2.14.2,<2.21.1", "contao/core": ">=2,<3.5.39", - "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/core-bundle": ">=4,<4.4.52|>=4.5,<4.9.6|= 4.10.0", "contao/listing-bundle": ">=4,<4.4.8", "datadog/dd-trace": ">=0.30,<0.30.2", "david-garcia/phpwhois": "<=4.3.1", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", "doctrine/annotations": ">=1,<1.2.7", "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", @@ -1977,22 +1960,25 @@ "doctrine/mongodb-odm": ">=1,<1.0.2", "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", - "dolibarr/dolibarr": "<=10.0.6", + "dolibarr/dolibarr": "<11.0.4", "dompdf/dompdf": ">=0.6,<0.6.2", - "drupal/core": ">=7,<7.69|>=8,<8.7.12|>=8.8,<8.8.4", - "drupal/drupal": ">=7,<7.69|>=8,<8.7.12|>=8.8,<8.8.4", + "drupal/core": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", + "drupal/drupal": ">=7,<7.74|>=8,<8.8.11|>=8.9,<8.9.9|>=9,<9.0.8", "endroid/qr-code-bundle": "<3.4.2", "enshrined/svg-sanitize": "<0.13.1", "erusev/parsedown": "<1.7.2", "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", - "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", "ezsystems/ezplatform-user": ">=1,<1.0.1", - "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.1|>=6,<6.7.9.1|>=6.8,<6.13.6.2|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.6.2", - "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.2|>=2011,<2017.12.7.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", "ezsystems/repository-forms": ">=2.3,<2.3.2.1", "ezyang/htmlpurifier": "<4.1.1", "firebase/php-jwt": "<2", @@ -2001,14 +1987,18 @@ "friendsofsymfony/oauth2-php": "<1.3", "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", "fuel/core": "<1.8.1", "getgrav/grav": "<1.7-beta.8", + "getkirby/cms": ">=3,<3.4.5", + "getkirby/panel": "<2.5.14", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gree/jose": "<=2.2", "gregwar/rst": "<1.0.3", "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", - "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", - "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29|>=5.5,<=5.5.44|>=6,<6.18.34|>=7,<7.23.2", "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", "illuminate/view": ">=7,<7.1.2", "ivankristianto/phpwhois": "<=4.3", @@ -2016,57 +2006,83 @@ "joomla/session": "<1.3.1", "jsmitty12/phpwhois": "<5.1", "kazist/phpwhois": "<=4.2.6", + "kitodo/presentation": "<3.1.2", "kreait/firebase-php": ">=3.2,<3.8.1", "la-haute-societe/tcpdf": "<6.2.22", - "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.34|>=7,<7.23.2", "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", "league/commonmark": "<0.18.3", "librenms/librenms": "<1.53", + "livewire/livewire": ">2.2.4,<2.2.6", "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", "magento/magento1ce": "<1.9.4.3", "magento/magento1ee": ">=1,<1.14.4.3", "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "marcwillmann/turn": "<0.3.3", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mittwald/typo3_forum": "<1.2.1", "monolog/monolog": ">=1.8,<1.12", "namshi/jose": "<2.2", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": ">=1.0.319,<1.0.470", + "october/cms": "= 1.0.469|>=1.0.319,<1.0.469", + "october/october": ">=1.0.319,<1.0.466", + "october/rain": ">=1.0.319,<1.0.468", "onelogin/php-saml": "<2.10.4", "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", "openid/php-openid": "<2.3", + "openmage/magento-lts": "<19.4.8|>=20,<20.0.4", + "orchid/platform": ">=9,<9.4.4", "oro/crm": ">=1.7,<1.7.4", "oro/platform": ">=1.7,<1.7.4", "padraic/humbug_get_contents": "<1.1.2", "pagarme/pagarme-php": ">=0,<3", "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", "paypal/merchant-sdk-php": "<3.12", - "pear/archive_tar": "<1.4.4", + "pear/archive_tar": "<1.4.11", + "personnummer/personnummer": "<3.0.2", "phpfastcache/phpfastcache": ">=5,<5.0.13", - "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", - "phpmyadmin/phpmyadmin": "<4.9.2", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.6|>=5,<5.0.3", "phpoffice/phpexcel": "<1.8.2", "phpoffice/phpspreadsheet": "<1.8", "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", "phpwhois/phpwhois": "<=4.2.5", "phpxmlrpc/extras": "<0.6.1", "pimcore/pimcore": "<6.3", + "pocketmine/pocketmine-mp": "<3.15.4", "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/contactform": ">1.0.1,<4.3", "prestashop/gamification": "<2.3.2", + "prestashop/productcomments": ">=4,<4.2", "prestashop/ps_facetedsearch": "<3.4.1", "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", "propel/propel": ">=2-alpha.1,<=2-alpha.7", "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<0.7.19|>=1-rc.0,<=1-rc.6", "pusher/pusher-php-server": "<2.2.1", + "rainlab/debugbar-plugin": "<3.1", "robrichards/xmlseclibs": "<3.0.4", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", "sensiolabs/connect": "<4.2.3", "serluck/phpwhois": "<=4.2.6", - "shopware/shopware": "<5.3.7", + "shopware/core": "<=6.3.2", + "shopware/platform": "<=6.3.2", + "shopware/shopware": "<5.6.9", "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", - "silverstripe/framework": "<4.4.5|>=4.5,<4.5.2", - "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", "silverstripe/subsites": ">=2,<2.1.1", @@ -2082,15 +2098,16 @@ "socalnick/scn-social-auth": "<1.15.2", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", - "ssddanbrown/bookstack": "<0.25.3", + "ssddanbrown/bookstack": "<0.29.2", "stormpath/sdk": ">=0,<9.9.99", "studio-42/elfinder": "<2.1.49", + "sulu/sulu": "<1.6.34|>=2,<2.0.10|>=2.1,<2.1.1", "swiftmailer/swiftmailer": ">=4,<5.4.5", "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", - "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", - "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.6.9|>=1.7,<1.7.9|>=1.8,<1.8.3", "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", "symbiote/silverstripe-versionedfiles": "<=2.0.3", "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", @@ -2099,7 +2116,7 @@ "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", - "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", "symfony/mime": ">=4.3,<4.3.8", "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", @@ -2114,12 +2131,13 @@ "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", "symfony/serializer": ">=2,<2.0.11", - "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.4.13|>=5,<5.1.5", "symfony/translation": ">=2,<2.0.17", "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", "tecnickcom/tcpdf": "<6.2.22", "thelia/backoffice-default-template": ">=2.1,<2.1.2", "thelia/thelia": ">=2.1-beta.1,<2.1.3", @@ -2127,11 +2145,12 @@ "titon/framework": ">=0,<9.9.99", "truckersmp/phpwhois": "<=4.3.1", "twig/twig": "<1.38|>=2,<2.7", - "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", - "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.12|>=10,<10.2.1", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", + "typo3/cms-core": ">=8,<8.7.38|>=9,<9.5.23|>=10,<10.4.10", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", "ua-parser/uap-php": "<3.8", "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", @@ -2139,7 +2158,7 @@ "willdurand/js-translation-bundle": "<2.1.1", "yii2mod/yii2-cms": "<1.9.2", "yiisoft/yii": ">=1.1.14,<1.1.15", - "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2": "<2.0.38", "yiisoft/yii2-bootstrap": "<2.0.4", "yiisoft/yii2-dev": "<2.0.15", "yiisoft/yii2-elasticsearch": "<2.0.5", @@ -2191,27 +2210,37 @@ } ], "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", - "time": "2020-04-23T00:01:30+00:00" + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2020-12-08T15:02:56+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -2236,29 +2265,35 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:15:22+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", "shasum": "" }, "require": { - "php": "^7.1", + "php": ">=7.1", "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -2276,6 +2311,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -2287,10 +2326,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -2300,24 +2335,30 @@ "compare", "equality" ], - "time": "2018-07-12T15:12:46+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:04:30+00:00" }, { "name": "sebastian/diff", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5 || ^8.0", @@ -2339,13 +2380,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", @@ -2356,24 +2397,30 @@ "unidiff", "unified diff" ], - "time": "2019-02-04T06:01:07+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:59:04+00:00" }, { "name": "sebastian/environment", - "version": "4.2.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5" @@ -2409,24 +2456,30 @@ "environment", "hhvm" ], - "time": "2019-11-20T08:46:58+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:53:42+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.2", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/recursion-context": "^3.0" }, "require-dev": { @@ -2476,7 +2529,13 @@ "export", "exporter" ], - "time": "2019-09-14T09:02:43+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:47:53+00:00" }, { "name": "sebastian/global-state", @@ -2531,20 +2590,20 @@ }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/object-reflector": "^1.1.1", "sebastian/recursion-context": "^3.0" }, @@ -2574,24 +2633,30 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:40:27+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -2619,24 +2684,30 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:37:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -2657,14 +2728,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -2672,24 +2743,30 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:34:24+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "type": "library", "extra": { @@ -2714,7 +2791,13 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:30:19+00:00" }, { "name": "sebastian/version", @@ -2761,20 +2844,20 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.15.0", + "version": "v1.20.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-ctype": "For best performance" @@ -2782,7 +2865,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -2815,27 +2902,41 @@ "polyfill", "portable" ], - "time": "2020-02-27T09:26:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { "name": "theseer/tokenizer", - "version": "1.1.3", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + "reference": "75a63c33a8577608444246075ea0af0d052e452a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -2855,27 +2956,34 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" }, { "name": "webmozart/assert", - "version": "1.8.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6" + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6", - "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0", + "php": "^5.3.3 || ^7.0 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { + "phpstan/phpstan": "<0.12.20", "vimeo/psalm": "<3.9.1" }, "require-dev": { @@ -2903,7 +3011,7 @@ "check", "validate" ], - "time": "2020-04-18T12:12:48+00:00" + "time": "2020-07-08T17:02:28+00:00" } ], "aliases": [], @@ -2914,11 +3022,12 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.6", + "php": ">=7.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-gd": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "1.1.0" } From bae970d2575fb4441933578a1a1da5d110fc53a4 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 20:37:08 +0200 Subject: [PATCH 23/36] Sync appointment with customer's Google Calendar in the book success page needs the correct timezone --- .../views/appointments/book_success.php | 3 +++ assets/js/frontend_book_success.js | 18 ++++++------------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/application/views/appointments/book_success.php b/application/views/appointments/book_success.php index ae655193..875d2eb1 100755 --- a/application/views/appointments/book_success.php +++ b/application/views/appointments/book_success.php @@ -73,6 +73,8 @@ + + + From 1a1deb28c27c06ed1924123cd110c9bf99338c80 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 20:38:57 +0200 Subject: [PATCH 27/36] Use the native JSON.parse method instead of the jQuery variation --- assets/js/backend_calendar_working_plan_exceptions_modal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/backend_calendar_working_plan_exceptions_modal.js b/assets/js/backend_calendar_working_plan_exceptions_modal.js index 85876691..4c724d32 100644 --- a/assets/js/backend_calendar_working_plan_exceptions_modal.js +++ b/assets/js/backend_calendar_working_plan_exceptions_modal.js @@ -90,7 +90,7 @@ window.BackendCalendarWorkingPlanExceptionsModal = window.BackendCalendarWorking } var selectedDate = date.toString('yyyy-MM-dd'); - var workingPlanExceptions = jQuery.parseJSON(provider.settings.working_plan_exceptions); + var workingPlanExceptions = JSON.parse(provider.settings.working_plan_exceptions); workingPlanExceptions[selectedDate] = { start: start.toString('HH:mm'), From 5df1bd49023cea2690a8606bbf07f56922011094 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 20:40:10 +0200 Subject: [PATCH 28/36] Made the timezone and language fields required, in the backend customers page --- application/views/backend/customers.php | 7 ++++--- assets/js/backend_customers_helper.js | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/application/views/backend/customers.php b/application/views/backend/customers.php index ab5f9f1d..9312238c 100755 --- a/application/views/backend/customers.php +++ b/application/views/backend/customers.php @@ -154,16 +154,17 @@
- +
- +
diff --git a/assets/js/backend_customers_helper.js b/assets/js/backend_customers_helper.js index 3fe6bd3c..b22e30e3 100644 --- a/assets/js/backend_customers_helper.js +++ b/assets/js/backend_customers_helper.js @@ -259,6 +259,7 @@ .find('input, select, textarea') .val('') .prop('disabled', true); + $('.record-details #timezone').val('UTC'); $('#language').val('english'); @@ -350,7 +351,7 @@ // Timezone $('', { - 'text': GlobalVariables.timezones[GlobalVariables.user.timezone] + 'text': GlobalVariables.timezones[appointment.provider.timezone] }) ] }) From 442ba8329664dab3991eef2baaab3b216bfa86b9 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 20:40:32 +0200 Subject: [PATCH 29/36] Display the please-select-time warning at the top of the available hours --- assets/js/frontend_book.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/assets/js/frontend_book.js b/assets/js/frontend_book.js index 15e2ea25..e2cba84d 100644 --- a/assets/js/frontend_book.js +++ b/assets/js/frontend_book.js @@ -249,28 +249,28 @@ window.FrontendBook = window.FrontendBook || {}; * Some special tasks might be performed, depending the current wizard step. */ $('.button-next').on('click', function () { - // If we are on the first step and there is not provider selected do not continue - // with the next step. + // If we are on the first step and there is not provider selected do not continue with the next step. if ($(this).attr('data-step_index') === '1' && !$('#select-provider').val()) { return; } - // If we are on the 2nd tab then the user should have an appointment hour - // selected. + // If we are on the 2nd tab then the user should have an appointment hour selected. if ($(this).attr('data-step_index') === '2') { if (!$('.selected-hour').length) { if (!$('#select-hour-prompt').length) { - $('#available-hours').append('

' - + '' - + EALang.appointment_hour_missing - + ''); + $('
', { + 'id': 'select-hour-prompt', + 'class': 'text-danger mb-4', + 'text': EALang.appointment_hour_missing, + }) + .prependTo('#available-hours'); } return; } } - // If we are on the 3rd tab then we will need to validate the user's - // input before proceeding to the next step. + // If we are on the 3rd tab then we will need to validate the user's input before proceeding to the next + // step. if ($(this).attr('data-step_index') === '3') { if (!validateCustomerForm()) { return; // Validation failed, do not continue. @@ -700,6 +700,9 @@ window.FrontendBook = window.FrontendBook || {}; $('#address').val(customer.address); $('#city').val(customer.city); $('#zip-code').val(customer.zip_code); + if (customer.timezone) { + $('#select-timezone').val(customer.timezone) + } var appointmentNotes = (appointment.notes !== null) ? appointment.notes : ''; $('#notes').val(appointmentNotes); From 5512731c4103b8d654b953edc12c822f51e9f578 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 20:40:56 +0200 Subject: [PATCH 30/36] Added customer data in the book success page --- application/controllers/Appointments.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/application/controllers/Appointments.php b/application/controllers/Appointments.php index 38ef8926..ff6c6b4f 100755 --- a/application/controllers/Appointments.php +++ b/application/controllers/Appointments.php @@ -267,6 +267,8 @@ class Appointments extends EA_Controller { $appointment = $appointments[0]; unset($appointment['notes']); + $customer = $this->customers_model->get_row($appointment['id_users_customer']); + $provider = $this->providers_model->get_row($appointment['id_users_provider']); $service = $this->services_model->get_row($appointment['id_services']); @@ -285,6 +287,13 @@ class Appointments extends EA_Controller { 'email' => $provider['email'], 'timezone' => $provider['timezone'], ], + 'customer_data' => [ + 'id' => $customer['id'], + 'first_name' => $customer['first_name'], + 'last_name' => $customer['last_name'], + 'email' => $customer['email'], + 'timezone' => $customer['timezone'], + ], 'service_data' => $service, 'company_name' => $company_name, ]; From cf7bad9f19a303b96ba31011d79515fba13bb2cf Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Mon, 14 Dec 2020 20:41:21 +0200 Subject: [PATCH 31/36] Always display events in the provider's timezone in the backend calendar pages --- application/controllers/Backend_api.php | 36 +++++++---------------- application/libraries/Timezones.php | 34 --------------------- application/models/Appointments_model.php | 11 +------ 3 files changed, 11 insertions(+), 70 deletions(-) diff --git a/application/controllers/Backend_api.php b/application/controllers/Backend_api.php index 6e9c9cfe..bef6e303 100755 --- a/application/controllers/Backend_api.php +++ b/application/controllers/Backend_api.php @@ -82,11 +82,11 @@ class Backend_api extends EA_Controller { ]) ]; - foreach ($response['appointments'] as $index => $appointment) + foreach ($response['appointments'] as &$appointment) { - $response['appointments'][$index]['provider'] = $this->providers_model->get_row($appointment['id_users_provider']); - $response['appointments'][$index]['service'] = $this->services_model->get_row($appointment['id_services']); - $response['appointments'][$index]['customer'] = $this->customers_model->get_row($appointment['id_users_customer']); + $appointment['provider'] = $this->providers_model->get_row($appointment['id_users_provider']); + $appointment['service'] = $this->services_model->get_row($appointment['id_services']); + $appointment['customer'] = $this->customers_model->get_row($appointment['id_users_customer']); } $user_id = $this->session->userdata('user_id'); @@ -218,6 +218,11 @@ class Backend_api extends EA_Controller { $response['unavailables'] = $this->appointments_model->get_batch($where_clause); } + foreach ($response['unavailables'] as &$unavailable) + { + $unavailable['provider'] = $this->providers_model->get_row($unavailable['id_users_provider']); + } + $this->output ->set_content_type('application/json') ->set_output(json_encode($response)); @@ -282,16 +287,6 @@ class Backend_api extends EA_Controller { $appointment['id_users_customer'] = $customer['id']; } - $provider_timezone = $this->user_model->get_user_timezone($appointment['id_users_provider']); - - $session_timezone = $this->timezones->get_session_timezone(); - - $appointment['start_datetime'] = $this->timezones->convert($appointment['start_datetime'], - $session_timezone, $provider_timezone); - - $appointment['end_datetime'] = $this->timezones->convert($appointment['end_datetime'], - $session_timezone, $provider_timezone); - $appointment['id'] = $this->appointments_model->add($appointment); } @@ -565,8 +560,7 @@ class Backend_api extends EA_Controller { foreach ($customers as &$customer) { - $appointments = $this->appointments_model - ->get_batch(['id_users_customer' => $customer['id']]); + $appointments = $this->appointments_model->get_batch(['id_users_customer' => $customer['id']]); foreach ($appointments as &$appointment) { @@ -615,16 +609,6 @@ class Backend_api extends EA_Controller { $provider = $this->providers_model->get_row($unavailable['id_users_provider']); // Add appointment - $provider_timezone = $this->user_model->get_user_timezone($unavailable['id_users_provider']); - - $session_timezone = $this->timezones->get_session_timezone(); - - $unavailable['start_datetime'] = $this->timezones->convert($unavailable['start_datetime'], - $session_timezone, $provider_timezone); - - $unavailable['end_datetime'] = $this->timezones->convert($unavailable['end_datetime'], - $session_timezone, $provider_timezone); - $unavailable['id'] = $this->appointments_model->add_unavailable($unavailable); $unavailable = $this->appointments_model->get_row($unavailable['id']); // fetch all inserted data diff --git a/application/libraries/Timezones.php b/application/libraries/Timezones.php index 1c2af09c..357bca0b 100644 --- a/application/libraries/Timezones.php +++ b/application/libraries/Timezones.php @@ -13,10 +13,6 @@ /** * Timezones - * - * @property CI_Loader $load - * - * @package Models */ class Timezones { /** @@ -484,36 +480,6 @@ class Timezones { return $this->timezones; } - /** - * Convert the dates of an event to the timezone of the user. - * - * @param array $event Must contain the "start_datetime", "end_datetime" and "id_users_provider" properties. - * - * @return array - * - * @throws Exception - */ - public function convert_event_timezone($event) - { - if ( ! isset($event['start_datetime'], $event['end_datetime'], $event['id_users_provider'])) - { - throw new Exception('The provided event does not have the required properties: ' . print_r($event)); - } - - $user_timezone = $this->CI->user_model->get_user_timezone($event['id_users_provider']); - - $session_timezone = $this->get_session_timezone(); - - $event['start_datetime'] = $this->convert($event['start_datetime'], - $user_timezone, $session_timezone); - - $event['end_datetime'] = $this->convert($event['end_datetime'], - $user_timezone, $session_timezone); - - return $event; - } - - /** * Returns the session timezone or the default timezone as a fallback. * diff --git a/application/models/Appointments_model.php b/application/models/Appointments_model.php index 25973d56..9866d350 100644 --- a/application/models/Appointments_model.php +++ b/application/models/Appointments_model.php @@ -24,7 +24,6 @@ class Appointments_model extends EA_Model { { parent::__construct(); $this->load->helper('data_validation'); - $this->load->library('timezones'); } /** @@ -317,11 +316,7 @@ class Appointments_model extends EA_Model { . $appointment_id); } - $appointment = $this->db->get_where('appointments', ['id' => $appointment_id])->row_array(); - - $appointment = $this->timezones->convert_event_timezone($appointment); - - return $appointment; + return $this->db->get_where('appointments', ['id' => $appointment_id])->row_array(); } /** @@ -363,8 +358,6 @@ class Appointments_model extends EA_Model { throw new Exception('The given field name does not exist in the database: ' . $field_name); } - $row_data = $this->timezones->convert_event_timezone($row_data); - return $row_data[$field_name]; } @@ -401,8 +394,6 @@ class Appointments_model extends EA_Model { foreach ($appointments as &$appointment) { - $appointment = $this->timezones->convert_event_timezone($appointment); - if ($aggregates) { $appointment = $this->get_aggregates($appointment); From 78ab4ac3d261077a93ec6087fba2ad1adeb87714 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Tue, 15 Dec 2020 10:49:16 +0200 Subject: [PATCH 32/36] Removed unnecessary condition --- assets/js/backend_calendar_default_view.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/assets/js/backend_calendar_default_view.js b/assets/js/backend_calendar_default_view.js index 736dbc12..63817f5e 100755 --- a/assets/js/backend_calendar_default_view.js +++ b/assets/js/backend_calendar_default_view.js @@ -1565,12 +1565,10 @@ window.BackendCalendarDefaultView = window.BackendCalendarDefaultView || {}; $('#select-filter-item').prop('disabled', true); } - if (GlobalVariables.user.role_slug === Backend.DB_SLUG_SECRETARY) { - $('#select-filter-item optgroup:eq(1)').remove(); - } - if (GlobalVariables.user.role_slug === Backend.DB_SLUG_SECRETARY) { // Remove the providers that are not connected to the secretary. + $('#select-filter-item optgroup:eq(1)').remove(); + $('#select-filter-item option[type="provider"]').each(function (index, option) { var provider = GlobalVariables.secretaryProviders.find(function (secretaryProviderId) { return Number($(option).val()) === Number(secretaryProviderId); From 505b709e5064c93e6fd8bec2596af93633ccad6d Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Thu, 17 Dec 2020 16:03:00 +0200 Subject: [PATCH 33/36] More width for better display in certain languages --- assets/css/backend.css | 4 ++-- assets/css/frontend.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/css/backend.css b/assets/css/backend.css index 8f4955bb..7351c02b 100644 --- a/assets/css/backend.css +++ b/assets/css/backend.css @@ -849,12 +849,12 @@ body .form-horizontal .controls { } #settings-page .personal-info-wrapper { - max-width: 400px; + max-width: 450px; margin-bottom: 20px; } #settings-page .miscellaneous-wrapper { - max-width: 400px; + max-width: 450px; margin-bottom: 20px; } diff --git a/assets/css/frontend.css b/assets/css/frontend.css index f7e2ecf0..9db9e2fa 100644 --- a/assets/css/frontend.css +++ b/assets/css/frontend.css @@ -384,7 +384,7 @@ body { #success-frame .btn { margin-bottom: 10px; width: 80%; - max-width: 250px; + max-width: 300px; } @media (min-width: 768px) { From bd6ab1c7fe17133de796b1866be8b862b4596bab Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Thu, 17 Dec 2020 16:33:50 +0200 Subject: [PATCH 34/36] Remove the codeigniter user guide from the build archive --- gulpfile.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 0d2c023e..37495bb3 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -73,11 +73,14 @@ gulp.task('package', (done) => { fs.removeSync('build/composer.lock'); - del.sync('**/.DS_Store') + del.sync('**/.DS_Store'); + + del.sync('build/vendor/codeigniter/framework/user_guide'); zip('build', {saveTo: archive}, function (err) { - if (err) + if (err) { console.log('Zip Error', err); + } done(); }); From 5a52bde05a26ab2830508528944b2224977651ec Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Thu, 17 Dec 2020 16:49:04 +0200 Subject: [PATCH 35/36] Additional check for the provided user props via the API --- application/controllers/api/v1/Admins.php | 7 ++++++- application/controllers/api/v1/Providers.php | 17 ++++++++++++++++- application/controllers/api/v1/Secretaries.php | 12 +++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/application/controllers/api/v1/Admins.php b/application/controllers/api/v1/Admins.php index 1a3cbe91..4b5dff26 100644 --- a/application/controllers/api/v1/Admins.php +++ b/application/controllers/api/v1/Admins.php @@ -87,11 +87,16 @@ class Admins extends API_V1_Controller { $admin = $request->get_body(); $this->parser->decode($admin); - if (isset($admin['id'])) + if (array_key_exists('id', $admin)) { unset($admin['id']); } + if ( ! array_key_exists('settings', $admin)) + { + throw new Exception('No settings property provided.'); + } + $id = $this->admins_model->add($admin); // Fetch the new object from the database and return it to the client. diff --git a/application/controllers/api/v1/Providers.php b/application/controllers/api/v1/Providers.php index 5d163b18..a3739968 100644 --- a/application/controllers/api/v1/Providers.php +++ b/application/controllers/api/v1/Providers.php @@ -87,11 +87,26 @@ class Providers extends API_V1_Controller { $provider = $request->get_body(); $this->parser->decode($provider); - if (isset($provider['id'])) + if (array_key_exists('id', $provider)) { unset($provider['id']); } + if ( ! array_key_exists('services', $provider)) + { + throw new Exception('No services property provided.'); + } + + if ( ! array_key_exists('settings', $provider)) + { + throw new Exception('No settings property provided.'); + } + + if ( ! array_key_exists('working_plan', $provider['settings']['working_plan'])) + { + $provider['settings']['working_plan'] = $this->settings_model->get_setting('company_working_plan'); + } + $id = $this->providers_model->add($provider); // Fetch the new object from the database and return it to the client. diff --git a/application/controllers/api/v1/Secretaries.php b/application/controllers/api/v1/Secretaries.php index d25001cc..2cff1720 100644 --- a/application/controllers/api/v1/Secretaries.php +++ b/application/controllers/api/v1/Secretaries.php @@ -87,11 +87,21 @@ class Secretaries extends API_V1_Controller { $secretary = $request->get_body(); $this->parser->decode($secretary); - if (isset($secretary['id'])) + if (array_key_exists('id', $secretary)) { unset($secretary['id']); } + if ( ! array_key_exists('providers', $secretary)) + { + throw new Exception('No providers property provided.'); + } + + if ( ! array_key_exists('settings', $secretary)) + { + throw new Exception('No settings property provided.'); + } + $id = $this->secretaries_model->add($secretary); // Fetch the new object from the database and return it to the client. From 5d73fafc310f0a1bcfce17194d273bb9df0c8702 Mon Sep 17 00:00:00 2001 From: Alex Tselegidis Date: Thu, 17 Dec 2020 16:54:58 +0200 Subject: [PATCH 36/36] Release v1.4.1 --- application/config/config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/config/config.php b/application/config/config.php index bfe7fcf4..ddf01caa 100644 --- a/application/config/config.php +++ b/application/config/config.php @@ -8,7 +8,7 @@ | Declare some of the global config values of Easy!Appointments. | */ -$config['version'] = '1.4.0'; // This must be changed manually. +$config['version'] = '1.4.1'; // This must be changed manually. $config['release_label'] = ''; // Leave empty for no title or add Alpha, Beta etc ... $config['debug'] = Config::DEBUG_MODE; @@ -304,7 +304,7 @@ $config['cache_path'] = __DIR__ . '/../../storage/cache/'; | new release. | */ -$config['cache_busting_token'] = '729RF'; +$config['cache_busting_token'] = '924WX'; /* |--------------------------------------------------------------------------