Plugin Directory

Changeset 3313046


Ignore:
Timestamp:
06/17/2025 08:31:46 AM (6 months ago)
Author:
wimbraam
Message:

Release 3.1.0

Location:
simplybook
Files:
54 added
2 deleted
50 edited
1 copied

Legend:

Unmodified
Added
Removed
  • simplybook/tags/3.1.0/app/Plugin.php

    r3297362 r3313046  
    127127         * @deprecated 3.0.0 Use App::env('plugin.version') instead
    128128         */
    129         define('SIMPLYBOOK_VERSION', '3.0.0');
     129        define('SIMPLYBOOK_VERSION', '3.1.0');
    130130
    131131        /**
     
    193193            new Controllers\ServicesController(),
    194194            new Controllers\ReviewController(),
     195            new Controllers\WidgetTrackingController(
     196                new Services\WidgetTrackingService()
     197            ),
    195198        ]);
    196199    }
  • simplybook/tags/3.1.0/app/controllers/DashboardController.php

    r3297362 r3313046  
    106106        wp_enqueue_style(
    107107            'simplybook-tailwind',
    108             App::env('plugin.react_url') . '/src/tailwind.generated.css',
     108            App::env('plugin.react_url') . '/build/tailwind.generated.css',
    109109            [],
    110110            ($chunkTranslation['version'] ?? '')
  • simplybook/tags/3.1.0/app/features/Notifications/NotificationListener.php

    r3297362 r3313046  
    1919        add_action('simplybook_event_' . Event::AUTH_SUCCEEDED, [$this, 'handleSucceededAuthentication']);
    2020        add_action('simplybook_event_' . Event::CALENDAR_PUBLISHED, [$this, 'handleCalendarPublished']);
     21        add_action('simplybook_event_' . Event::CALENDAR_UNPUBLISHED, [$this, 'handleCalendarUnPublished']);
    2122        add_action('simplybook_event_' . Event::PUBLISH_WIDGET_TASK_DISMISSED, [$this, 'dismissPublishWidgetNotice']);
    2223    }
     
    5354
    5455    /**
     56     * Handle the calendar published event to update task status.
     57     */
     58    public function handleCalendarUnPublished(): void
     59    {
     60        $this->service->activate(
     61            Notices\PublishWidgetNotice::IDENTIFIER
     62        );
     63    }
     64
     65    /**
    5566     * Dismiss the publish-widget-notice.
    5667     */
  • simplybook/tags/3.1.0/app/features/Onboarding/OnboardingController.php

    r3297362 r3313046  
    1111use SimplyBook\Interfaces\FeatureInterface;
    1212use SimplyBook\Exceptions\RestDataException;
     13use SimplyBook\Services\WidgetTrackingService;
    1314
    1415class OnboardingController implements FeatureInterface
    1516{
    1617    private OnboardingService $service;
    17 
    18     public function __construct(OnboardingService $service)
     18    private WidgetTrackingService $widgetService;
     19
     20    public function __construct(OnboardingService $service, WidgetTrackingService $widgetTrackingService)
    1921    {
    2022        $this->service = $service;
     23        $this->widgetService = $widgetTrackingService;
    2124    }
    2225
     
    238241        // These flags are deleted after its one time use in the Task and Notice
    239242        if ($pageCreatedSuccessfully) {
    240             $this->service->setPublishWidgetCompleted();
     243            $this->widgetService->setPublishWidgetCompleted();
    241244        }
    242245
     
    336339        $this->finishLoggingInUser($response, $companyDomain, $companyLogin);
    337340
    338         return new \WP_REST_Response([
    339             'message' => 'Successfully authenticated user',
    340         ], 200);
     341        return $this->service->sendHttpResponse([], true, esc_html__('Successfully authenticated user', 'simplybook')); // Default code 200 because React side still used request() here
    341342    }
    342343
     
    400401            );
    401402        } catch (\Exception $e) {
    402             return new \WP_REST_Response([
    403                 'message' => $e->getMessage(),
    404             ], 400);
    405         }
    406 
    407         return new \WP_REST_Response([
    408             'message' => 'Successfully requested SMS code',
    409         ], 200);
     403            return $this->service->sendHttpResponse([], false, $e->getMessage()); // Default code 200 because React side still used request() here
     404        }
     405
     406        return $this->service->sendHttpResponse([], true, esc_html__('Successfully requested SMS code', 'simplybook')); // Default code 200 because React side still used request() here
    410407    }
    411408
     
    449446     * or the Gutenberg block.
    450447     */
    451     public function validatePublishedWidget(): void
    452     {
    453         $cache = wp_cache_get('simplybook_widget_published', 'simplybook');
    454         if ($cache === true) {
    455             $this->service->setPublishWidgetCompleted();
    456             return;
    457         }
    458 
    459         global $wpdb;
    460 
    461         // Search for "simplybook widget" with a maximum of 1 character in
    462         // between. This will match both the shortcode ([simplybook_widget])
    463         // and the Gutenberg block (<!-- wp:simplybook/widget -->).
    464         $pattern = 'simplybook.{0,1}widget';
    465 
    466         // This direct SQL query is intentional, safe, and properly prepared.
    467         // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
    468         $query = $wpdb->prepare("
    469             SELECT 1
    470             FROM {$wpdb->posts}
    471             WHERE post_content REGEXP %s
    472             LIMIT 1
    473         ", $pattern);
    474 
    475         $havePosts = (bool) $wpdb->get_var($query);
    476         if (!$havePosts) {
    477             return;
    478         }
    479 
    480         $this->service->setPublishWidgetCompleted();
    481         wp_cache_set('simplybook_widget_published', true, 'simplybook');
    482     }
     448    public function validatePublishedWidget(): void {
     449        $cache = wp_cache_get( 'simplybook_widget_published', 'simplybook' );
     450        if ( $cache === true ) {
     451            $this->widgetService->setPublishWidgetCompleted();
     452
     453            return;
     454        }
     455
     456        // Check if any widgets are currently published
     457        if ( $this->widgetService->hasTrackedPosts() ) {
     458            $this->widgetService->setPublishWidgetCompleted();
     459            wp_cache_set( 'simplybook_widget_published', true, 'simplybook' );
     460        }
     461    }
    483462}
  • simplybook/tags/3.1.0/app/features/Onboarding/OnboardingService.php

    r3297362 r3313046  
    11<?php namespace SimplyBook\Features\Onboarding;
    22
     3use SimplyBook\App;
    34use SimplyBook\Http\ApiClient;
    45use SimplyBook\Helpers\Storage;
     
    3031        $this->setCompletedStep(5);
    3132        $this->clearTemporaryData();
     33
     34        App::provide('client')->clearFailedAuthenticationFlag();
    3235
    3336        $completedPreviously = get_option('simplybook_onboarding_completed', false);
     
    174177    }
    175178
    176     /**
    177      * Use this method to set the "publish widget" notice and task as completed.
    178      * These flags are deleted after its one time use in the Task and Notice.
    179      */
    180     public function setPublishWidgetCompleted(bool $completed = true): void
    181     {
    182         update_option('simplybook_calendar_published_notification_completed', $completed);
    183         update_option('simplybook_calendar_published_task_completed', $completed);
    184     }
    185179}
  • simplybook/tags/3.1.0/app/features/TaskManagement/TaskManagementListener.php

    r3297362 r3313046  
    2525        add_action('simplybook_event_' . Event::AUTH_FAILED, [$this, 'handleFailedAuthentication']);
    2626        add_action('simplybook_event_' . Event::CALENDAR_PUBLISHED, [$this, 'handleCalendarPublished']);
     27        add_action('simplybook_event_' . Event::CALENDAR_UNPUBLISHED, [$this, 'handleCalendarUnPublished']);
    2728        add_action('simplybook_save_design_settings', [$this, 'handleDesignSettingsSaved']);
    2829    }
     
    254255
    255256    /**
     257     * Handle the calendar published event to update task status.
     258     */
     259    public function handleCalendarUnPublished(): void
     260    {
     261        $this->service->flagTaskUrgent(
     262            Tasks\PublishWidgetTask::IDENTIFIER
     263        );
     264    }
     265
     266    /**
    256267     * Handle the after save options event to update task status.
    257268     */
  • simplybook/tags/3.1.0/app/http/ApiClient.php

    r3297362 r3313046  
    77
    88use Carbon\Carbon;
     9use SimplyBook\App;
    910use SimplyBook\Helpers\Event;
    1011use SimplyBook\Helpers\Storage;
     
    117118
    118119    /**
     120     * Clear the authentication failed flag. This is used when the user has
     121     * successfully authenticated again. Currently used after successfully
     122     * logging in with the sign in modal.
     123     */
     124    public function clearFailedAuthenticationFlag(): void
     125    {
     126        $this->authenticationFailedFlag = false;
     127        delete_option($this->authenticationFailedFlagKey);
     128    }
     129
     130    /**
    119131     * Set the during onboarding flag
    120132     */
     
    232244        $headers = array(
    233245            'Content-Type'  => 'application/json',
     246            'User-Agent' => $this->getRequestUserAgent(),
    234247        );
    235248
     
    244257                        $this->refresh_token('admin');
    245258                        break;
    246                     case 'user':
    247                         $this->get_user_token();
    248                         break;
    249259                }
    250260                $token = $this->get_token($token_type);
     
    268278            $type = $type . '_refresh';
    269279        }
    270         $token = get_option("simplybook_token_" . esc_sql($type), '');
     280        $token = get_option("simplybook_token_" . $type, '');
    271281
    272282        return $this->decrypt_string($token);
     
    432442    private function automaticAuthenticationFallback(string $type)
    433443    {
    434         if ($this->authenticationFailedFlag) {
     444        // Company login can be empty for fresh accounts
     445        if ($this->authenticationFailedFlag || empty($this->get_company_login(false))) {
    435446            $this->releaseRefreshLock($type);
    436             return; // Dont even try again.
     447            return; // Dont even try (again).
    437448        }
    438449
     
    518529     * @return string
    519530     */
    520     public function get_company_login(): string {
     531    public function get_company_login(bool $create = true): string
     532    {
    521533        $login = get_option('simplybook_company_login', '');
    522534        if ( !empty($login) ) {
    523535            return $login;
     536        }
     537
     538        if ($create === false) {
     539            return ''; // Abort
    524540        }
    525541
     
    675691                    'journey_type' => 'skip_welcome_tour',
    676692                    'callback_url' => get_rest_url(get_current_blog_id(),"simplybook/v1/company_registration/$callback_url"),
     693                    'ref' => $this->getReferrer(),
    677694                ]
    678695            ),
     
    16081625    }
    16091626
     1627    /**
     1628     *
     1629     * \EXTENDIFY_PARTNER_ID will contain the required value if WordPress is
     1630     * configured using Extendify. Otherwise, use default 'wp'.
     1631     */
     1632    private function getReferrer(): string
     1633    {
     1634        return (defined('\EXTENDIFY_PARTNER_ID') ? \EXTENDIFY_PARTNER_ID : 'wp');
     1635    }
     1636
     1637    /**
     1638     * Get the user agent for the API requests.
     1639     *
     1640     * @example format SimplyBookPlugin/3.2.1 (WordPress/6.5.3; ref:
     1641     * EXTENDIFY_PARTNER_ID; +https://example.com)
     1642     */
     1643    private function getRequestUserAgent(): string
     1644    {
     1645        return "SimplyBookPlugin/" . App::env('plugin.version') . " (WordPress/" . get_bloginfo('version') . "; ref: " . $this->getReferrer() . "; +" . site_url() . ")";
     1646    }
     1647
    16101648}
  • simplybook/tags/3.1.0/app/support/builders/WidgetScriptBuilder.php

    r3297362 r3313046  
    5151        }
    5252
    53         if ($this->isAuthenticated === false) {
     53        if ($this->showDemoWidget()) {
    5454            return $this->getDemoWidgetAlert() . $script;
    5555        }
     
    194194        $content = '';
    195195
    196         if ($this->isAuthenticated === false) {
     196        if ($this->showDemoWidget()) {
    197197            $content = $this->getDemoWidgetAlert();
    198198        }
     
    221221        }
    222222
    223         if (empty($widgetSettings['server'])) {
     223        if ($this->showDemoWidget($widgetSettings)) {
    224224            $widgetSettings['server'] = $this->getDemoWidgetServerUrl();
    225225        }
     
    258258    }
    259259
     260    /**
     261     * The demo widget should be shown if the server URL is not set in the
     262     * widget settings. This is used to display a demo widget when the
     263     * plugin is not configured yet.
     264     *
     265     * @internal The widget works even when the plugin lost connection to the
     266     * SimplyBook account of the user so that is not a condition to show the
     267     * demo widget.
     268     */
     269    public function showDemoWidget(?array $widgetSettings = null): bool
     270    {
     271        $widgetSettings = $widgetSettings ?? $this->widgetSettings;
     272        return empty($widgetSettings['server']);
     273    }
     274
    260275}
  • simplybook/tags/3.1.0/app/support/helpers/Event.php

    r3297362 r3313046  
    2424    const AUTH_SUCCEEDED = 'auth_succeeded';
    2525    const CALENDAR_PUBLISHED = 'calendar_published';
     26    const CALENDAR_UNPUBLISHED = 'calendar_unpublished';
    2627    const PUBLISH_WIDGET_TASK_DISMISSED = 'publish_widget_task_dismissed';
    2728
  • simplybook/tags/3.1.0/app/traits/LegacyHelper.php

    r3297362 r3313046  
    101101
    102102    /**
    103      * Encrypt data
    104      * @param $string
    105      * @return string
     103     * Encrypts a token using AES-256-CBC encryption with a version marker.
     104     *
     105     * This function encrypts a token string using AES-256-CBC with a random
     106     * initialization vector (IV). New tokens use the "v2:" format which separates
     107     * the IV and encrypted data with a period for better clarity.
     108     *
     109     * @param string $string The token to encrypt (should be a 64-character hex string).
     110     * @return string The encrypted token with format "v2:base64(iv).base64(encrypted)".
     111     *
     112     * @since 3.1 Uses v2 format with OPENSSL_RAW_DATA
     113     * @example
     114     * $token = "a1b2c3d4e5f6..."; // 64-character hex string
     115     * $encrypted = encrypt_string($token); // Returns "v2:abc123.xyz789"
    106116     */
    107117    public function encrypt_string($string): string
     
    112122        $iv = openssl_random_pseudo_bytes($ivLength);
    113123
    114         $encrypted = openssl_encrypt($string, 'AES-256-CBC', $key, 0, $iv);
     124        // Use OPENSSL_RAW_DATA for new v2 tokens
     125        $encrypted = openssl_encrypt($string, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
    115126
    116         return base64_encode($iv . $encrypted);
     127        // Format: v2:base64(iv).base64(encrypted)
     128        return 'v2:' . base64_encode($iv) . '.' . base64_encode($encrypted);
    117129    }
    118130
  • simplybook/tags/3.1.0/app/traits/LegacyLoad.php

    r3297362 r3313046  
    33
    44use SimplyBook\App;
     5use SimplyBook\Traits\LegacyHelper;
    56
    67if ( ! defined( 'ABSPATH' ) ) {
     
    99100    }
    100101
    101     /**
    102      * Decrypt a string
    103      * @param $encrypted_string
    104      * @return string
    105      */
    106     public function decrypt_string($encrypted_string): string
    107     {
    108         $key = '7*w$9pumLw5koJc#JT6';
    109         $data = base64_decode($encrypted_string);
    110         $ivLength = openssl_cipher_iv_length('AES-256-CBC');
    111         $iv = substr($data, 0, $ivLength);
    112         $encrypted = substr($data, $ivLength);
    113 
    114         return openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv);
    115     }
     102
     103    /**
     104     * Decrypts an encrypted token string with backward compatibility support.
     105     *
     106     * This function acts as a dispatcher that automatically detects the token format
     107     * and delegates to the appropriate decryption method:
     108     * - V2 format: "v2:base64(iv).base64(encrypted)"
     109     * - Legacy format: base64(iv + encrypted)
     110     *
     111     * @param string $encrypted_string The encrypted token to decrypt.
     112     * @return string The decrypted token if valid, or an empty string if invalid.
     113     *
     114     * @since 3.1 Added support for v2 format with OPENSSL_RAW_DATA
     115     * @example
     116     * $decrypted = decrypt_string("v2: abc123.xyz789"); // Returns the original token
     117     * $decrypted = decrypt_string("legacy_encrypted_data"); // Also works with old tokens
     118     */
     119    public function decrypt_string($encrypted_string): string
     120    {
     121
     122        if (empty($encrypted_string)) {
     123            return '';
     124        }
     125
     126        $key = '7*w$9pumLw5koJc#JT6';
     127
     128        // Check if it's a v2 token (new format)
     129        if (strpos($encrypted_string, 'v2:') === 0) {
     130            return $this->decrypt_string_v2($encrypted_string, $key);
     131        }
     132
     133        return $this->decrypt_legacy_string($encrypted_string, $key);
     134    }
     135
     136    /**
     137     * Decrypts a v2 format encrypted token.
     138     *
     139     * V2 tokens use the format "v2:base64(iv).base64(encrypted)" and employ
     140     * an OPENSSL_RAW_DATA flag for decryption. This format separates the IV and
     141     * ciphertext with base64 encoding for each component.
     142     *
     143     * @param string $encrypted_string The v2 format encrypted token (prefixed with "v2:").
     144     * @return string The decrypted token if valid, or an empty string if decryption fails.
     145     *
     146     * @since 3.1
     147     */
     148    private function decrypt_string_v2(string $encrypted_string, string $key): string {
     149        $parts = explode('.', substr($encrypted_string, 3), 2);
     150        if (count($parts) !== 2) {
     151            $this->log("v2 token: invalid format — missing iv or ciphertext part.");
     152            return '';
     153        }
     154
     155        $iv = base64_decode($parts[0], true);
     156        $encrypted = base64_decode($parts[1], true);
     157
     158        if ($iv === false || $encrypted === false) {
     159            $this->log("v2 token: base64 decode failed (iv: " . ($iv === false ? 'invalid' : 'ok') . ", encrypted: " . ($encrypted === false ? 'invalid' : 'ok') . ")");
     160            return '';
     161        }
     162
     163        $decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
     164
     165        if ($decrypted === false) {
     166            $this->log("v2 token: openssl decryption failed.");
     167            return '';
     168        }
     169
     170        if (!preg_match('/^[a-f0-9]{64}$/i', $decrypted)) {
     171            $this->log("v2 token: decrypted result did not match expected 64-character hex format.");
     172            return '';
     173        }
     174
     175        return $decrypted;
     176    }
     177
     178    /**
     179     * Decrypts a legacy format encrypted token.
     180     *
     181     * Legacy tokens use the format base64(iv + encrypted) where the IV and
     182     * ciphertext are concatenated before base64 encoding. This method includes
     183     * fallback logic for double base64 encoding scenarios and uses flag=0
     184     * for OpenSSL decryption.
     185     *
     186     * @param string $encrypted_string The legacy format encrypted token.
     187     * @return string The decrypted token if valid, or an empty string if decryption fails.
     188     *
     189     * @since 3.1
     190     */
     191    private function decrypt_legacy_string(string $encrypted_string, string $key): string {
     192        // Legacy tokens
     193        $data = base64_decode($encrypted_string, true);
     194        $ivLength = openssl_cipher_iv_length('AES-256-CBC');
     195
     196        if ($data === false || strlen($data) < $ivLength) {
     197            $this->log("legacy token: decoded data too short, trying double base64 decoding...");
     198
     199            $data = base64_decode($data, true);
     200
     201            if ($data === false || strlen($data) < $ivLength) {
     202                $this->log("legacy token: double base64 decoding failed or still too short (length: " . strlen($data) . ").");
     203                return '';
     204            }
     205        }
     206
     207        $iv = substr($data, 0, $ivLength);
     208        $encrypted = substr($data, $ivLength);
     209
     210        $decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv);
     211
     212        if ($decrypted === false) {
     213            $this->log("legacy token: openssl decryption failed.");
     214            return '';
     215        }
     216
     217        if (!preg_match('/^[a-f0-9]{64}$/i', $decrypted)) {
     218            $this->log("legacy token: decrypted result did not match expected 64-character hex format.");
     219            return '';
     220        }
     221
     222        return $decrypted;
     223    }
     224
    116225
    117226    /**
  • simplybook/tags/3.1.0/assets/languages/simplybook.pot

    r3297362 r3313046  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: SimplyBook.me - Booking and reservations calendar 3.0.0\n"
     5"Project-Id-Version: SimplyBook.me - Booking and reservations calendar 3.1.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/simplybook\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2025-05-20T10:58:40+00:00\n"
     12"POT-Creation-Date: 2025-06-17T08:11:45+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.11.0\n"
     
    2222#. Plugin URI of the plugin
    2323#: simplybook.php
    24 msgid "https://help.simplybook.me/index.php/WordPress_plugn"
     24msgid "https://help.simplybook.me/index.php?title=WordPress_integration"
    2525msgstr ""
    2626
     
    4242#: app/controllers/AdminController.php:30
    4343#: react/build/107.js:1
    44 #: react/build/747.js:1
     44#: react/build/785.js:1
    4545#: react/src/components/Settings/SettingsMenu.jsx:16
    4646#: react/src/components/Settings/SettingsMenu.jsx:29
     
    131131msgstr ""
    132132
    133 #: app/features/Onboarding/OnboardingController.php:127
    134 #: app/features/Onboarding/OnboardingController.php:269
    135 #: app/features/Onboarding/OnboardingController.php:314
     133#: app/features/Onboarding/OnboardingController.php:130
     134#: app/features/Onboarding/OnboardingController.php:272
     135#: app/features/Onboarding/OnboardingController.php:317
    136136msgid "Please fill in all fields."
    137137msgstr ""
    138138
    139 #: app/features/Onboarding/OnboardingController.php:151
     139#: app/features/Onboarding/OnboardingController.php:154
    140140msgid "Please verify you're not a robot."
    141141msgstr ""
    142142
    143 #: app/features/Onboarding/OnboardingController.php:155
     143#: app/features/Onboarding/OnboardingController.php:158
    144144msgid "Please enter the confirmation code."
    145145msgstr ""
    146146
    147 #: app/features/Onboarding/OnboardingController.php:194
     147#: app/features/Onboarding/OnboardingController.php:197
    148148msgid "Something went wrong while saving the widget style settings. Please try again."
    149149msgstr ""
    150150
    151 #: app/features/Onboarding/OnboardingController.php:199
     151#: app/features/Onboarding/OnboardingController.php:202
    152152msgid "Successfully saved widget style settings"
    153153msgstr ""
    154154
    155 #: app/features/Onboarding/OnboardingController.php:225
     155#: app/features/Onboarding/OnboardingController.php:228
    156156msgid "Calendar page title should be available if you choose to generate this page."
    157157msgstr ""
    158158
    159 #: app/features/Onboarding/OnboardingController.php:291
    160 #: app/features/Onboarding/OnboardingController.php:333
     159#: app/features/Onboarding/OnboardingController.php:294
     160#: app/features/Onboarding/OnboardingController.php:336
    161161msgid "Unknown error occurred, please verify your credentials."
    162162msgstr ""
    163163
    164 #: app/features/Onboarding/OnboardingController.php:298
     164#: app/features/Onboarding/OnboardingController.php:301
    165165msgid "Login successful."
    166166msgstr ""
    167167
    168 #: app/features/Onboarding/OnboardingController.php:419
     168#: app/features/Onboarding/OnboardingController.php:341
     169msgid "Successfully authenticated user"
     170msgstr ""
     171
     172#: app/features/Onboarding/OnboardingController.php:406
     173msgid "Successfully requested SMS code"
     174msgstr ""
     175
     176#: app/features/Onboarding/OnboardingController.php:416
    169177msgid "Successfully finished onboarding!"
    170178msgstr ""
    171179
    172 #: app/features/Onboarding/OnboardingController.php:423
     180#: app/features/Onboarding/OnboardingController.php:420
    173181msgid "An error occurred while finishing the onboarding process"
    174182msgstr ""
    175183
     184#: app/features/Onboarding/OnboardingController.php:434
     185msgid "Successfully removed all previous data."
     186msgstr ""
     187
    176188#: app/features/Onboarding/OnboardingController.php:437
    177 msgid "Successfully removed all previous data."
    178 msgstr ""
    179 
    180 #: app/features/Onboarding/OnboardingController.php:440
    181189msgid "An error occurred while trying to remove previous data."
    182190msgstr ""
    183191
    184 #: app/features/Onboarding/OnboardingService.php:69
     192#: app/features/Onboarding/OnboardingService.php:72
    185193msgid "Please enter a valid email address and accept the terms and conditions"
    186194msgstr ""
     
    265273#: react/build/157.js:1
    266274#: react/build/182.js:1
    267 #: react/build/747.js:1
     275#: react/build/785.js:1
    268276#: react/build/792.js:1
    269277#: react/build/939.js:1
     
    292300msgstr ""
    293301
    294 #: app/http/ApiClient.php:619
    295 #: app/http/ApiClient.php:827
     302#: app/http/ApiClient.php:635
     303#: app/http/ApiClient.php:844
    296304msgid "You are not authorized to do this."
    297305msgstr ""
    298306
    299 #: app/http/ApiClient.php:625
     307#: app/http/ApiClient.php:641
    300308msgid "Too many attempts to register company, please try again in a minute."
    301309msgstr ""
    302310
    303 #: app/http/ApiClient.php:639
     311#: app/http/ApiClient.php:655
    304312msgid "Please fill in all company data."
    305313msgstr ""
    306314
    307 #: app/http/ApiClient.php:683
     315#: app/http/ApiClient.php:700
    308316msgid "Something went wrong while registering your company. Please try again."
    309317msgstr ""
    310318
    311 #: app/http/ApiClient.php:695
     319#: app/http/ApiClient.php:712
    312320msgid "Company successfully registered."
    313321msgstr ""
    314322
    315 #: app/http/ApiClient.php:728
     323#: app/http/ApiClient.php:745
    316324msgid "The company name is not allowed. Please change the company name."
    317325msgstr ""
    318326
    319 #: app/http/ApiClient.php:736
     327#: app/http/ApiClient.php:753
    320328msgid "Unknown error encountered while registering your company. Please try again."
    321329msgstr ""
    322330
    323 #: app/http/ApiClient.php:835
     331#: app/http/ApiClient.php:852
    324332msgid "Something went wrong, are you sure you started the company registration?"
    325333msgstr ""
    326334
    327 #: app/http/ApiClient.php:854
     335#: app/http/ApiClient.php:871
    328336msgid "Something went wrong while confirming your email. Please try again."
    329337msgstr ""
    330338
    331 #: app/http/ApiClient.php:862
     339#: app/http/ApiClient.php:879
    332340msgid "Email successfully confirmed."
    333341msgstr ""
    334342
    335 #: app/http/ApiClient.php:866
     343#: app/http/ApiClient.php:883
    336344msgid "Unknown error encountered while confirming your email. Please try again."
    337345msgstr ""
    338346
    339 #: app/http/ApiClient.php:868
     347#: app/http/ApiClient.php:885
    340348msgid "This confirmation code is not valid."
    341349msgstr ""
    342350
    343 #: app/http/ApiClient.php:1367
     351#: app/http/ApiClient.php:1384
    344352msgid "Failed logging in, please verify your credentials."
    345353msgstr ""
    346354
    347 #: app/http/ApiClient.php:1370
     355#: app/http/ApiClient.php:1387
    348356msgid "Unknown error"
    349357msgstr ""
    350358
    351 #: app/http/ApiClient.php:1376
     359#: app/http/ApiClient.php:1393
    352360msgid "Login failed! Please try again later."
    353361msgstr ""
    354362
    355 #: app/http/ApiClient.php:1379
     363#: app/http/ApiClient.php:1396
    356364msgid "Invalid response from SimplyBook.me"
    357365msgstr ""
    358366
    359 #: app/http/ApiClient.php:1427
     367#: app/http/ApiClient.php:1444
    360368msgid "Failed two factor authentication, please verify your credentials."
    361369msgstr ""
    362370
    363 #: app/http/ApiClient.php:1430
     371#: app/http/ApiClient.php:1447
    364372msgid "Unknown 2FA error"
    365373msgstr ""
    366374
    367 #: app/http/ApiClient.php:1437
     375#: app/http/ApiClient.php:1454
    368376msgid "Two factor authentication failed! Please try again later."
    369377msgstr ""
    370378
    371 #: app/http/ApiClient.php:1440
     379#: app/http/ApiClient.php:1457
    372380msgid "Invalid 2FA response from SimplyBook.me"
    373381msgstr ""
    374382
    375 #: app/http/ApiClient.php:1508
     383#: app/http/ApiClient.php:1525
    376384#: react/build/843.js:1
    377385#: react/src/components/Modals/SignInModal.jsx:15
     
    379387msgstr ""
    380388
    381 #: app/http/ApiClient.php:1509
     389#: app/http/ApiClient.php:1526
    382390msgid "SMS"
    383391msgstr ""
    384392
    385 #: app/http/ApiClient.php:1515
     393#: app/http/ApiClient.php:1532
    386394msgid "Unknown 2FA provider"
    387395msgstr ""
     
    14291437
    14301438#: config/fields/design.php:12
    1431 #: config/fields/design.php:152
     1439#: config/fields/design.php:161
    14321440msgid "Flexible"
    14331441msgstr ""
    14341442
    14351443#: config/fields/design.php:13
    1436 #: config/fields/design.php:150
     1444#: config/fields/design.php:159
    14371445msgid "Modern"
    14381446msgstr ""
    14391447
    14401448#: config/fields/design.php:14
    1441 #: config/fields/design.php:148
     1449#: config/fields/design.php:157
    14421450msgid "Flexible weekly"
    14431451msgstr ""
    14441452
    14451453#: config/fields/design.php:15
    1446 #: config/fields/design.php:153
     1454#: config/fields/design.php:162
    14471455msgid "Slots weekly"
    14481456msgstr ""
    14491457
    14501458#: config/fields/design.php:16
    1451 #: config/fields/design.php:156
     1459#: config/fields/design.php:165
    14521460msgid "Modern Provider"
    14531461msgstr ""
    14541462
    14551463#: config/fields/design.php:17
    1456 #: config/fields/design.php:149
     1464#: config/fields/design.php:158
    14571465msgid "Flexible Provider"
    14581466msgstr ""
    14591467
    14601468#: config/fields/design.php:18
    1461 #: config/fields/design.php:154
     1469#: config/fields/design.php:163
    14621470msgid "Weekly classes"
    14631471msgstr ""
     
    14841492
    14851493#. translators: %s - IS or IS NOT
    1486 #: config/fields/design.php:45
     1494#: config/fields/design.php:46
    14871495msgid "When selected, writing starts from the right of the page and continues to the left, proceeding from top to bottom for new lines. Your website %s set to RTL."
    14881496msgstr ""
    14891497
    1490 #: config/fields/design.php:56
     1498#: config/fields/design.php:59
    14911499msgid "Allow switch to ADA"
    14921500msgstr ""
    14931501
    1494 #: config/fields/design.php:57
     1502#: config/fields/design.php:61
    14951503msgid "This adds a button to enable accessibility mode, which increases contrast for visitors with a visual disability."
    14961504msgstr ""
    14971505
    1498 #: config/fields/design.php:66
     1506#: config/fields/design.php:73
     1507msgid "Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones."
     1508msgstr ""
     1509
     1510#: config/fields/design.php:76
    14991511msgid "Clear the session of each widget initialization"
    15001512msgstr ""
    15011513
    1502 #: config/fields/design.php:67
    1503 msgid "Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones."
    1504 msgstr ""
    1505 
    1506 #: config/fields/design.php:144
     1514#: config/fields/design.php:153
    15071515msgid "Theme"
    15081516msgstr ""
    15091517
    1510 #: config/fields/design.php:151
     1518#: config/fields/design.php:160
    15111519msgid "Default"
    15121520msgstr ""
    15131521
    1514 #: config/fields/design.php:155
     1522#: config/fields/design.php:164
    15151523msgid "Daily classes"
    15161524msgstr ""
    15171525
    1518 #: config/fields/design.php:157
     1526#: config/fields/design.php:166
    15191527msgid "As slots"
    15201528msgstr ""
    15211529
    1522 #: config/fields/design.php:158
     1530#: config/fields/design.php:167
    15231531msgid "As table"
    15241532msgstr ""
    15251533
    1526 #: config/fields/design.php:159
     1534#: config/fields/design.php:168
    15271535msgid "Block"
    15281536msgstr ""
    15291537
    1530 #: config/fields/design.php:160
     1538#: config/fields/design.php:169
    15311539msgid "List"
    15321540msgstr ""
    15331541
    1534 #: config/fields/design.php:161
     1542#: config/fields/design.php:170
    15351543msgid "Single page"
    15361544msgstr ""
    15371545
    1538 #: config/fields/design.php:162
     1546#: config/fields/design.php:171
    15391547msgid "Display calendar"
    15401548msgstr ""
    15411549
    1542 #: config/fields/design.php:163
     1550#: config/fields/design.php:172
    15431551msgid "Base theme color"
    15441552msgstr ""
    15451553
    1546 #: config/fields/design.php:164
     1554#: config/fields/design.php:173
    15471555msgid "Show only available time"
    15481556msgstr ""
    15491557
    1550 #: config/fields/design.php:165
     1558#: config/fields/design.php:174
    15511559msgid "Hide unavailable days on calendar"
    15521560msgstr ""
    15531561
    1554 #: config/fields/design.php:166
     1562#: config/fields/design.php:175
    15551563msgid "Display calendar layout sidebar"
    15561564msgstr ""
    15571565
    1558 #: config/fields/design.php:167
     1566#: config/fields/design.php:176
    15591567msgid "Image scale mode"
    15601568msgstr ""
     
    15621570#: config/fields/providers.php:13
    15631571#: config/menus.php:24
    1564 #: react/build/747.js:1
     1572#: react/build/785.js:1
    15651573msgid "Service Providers"
    15661574msgstr ""
     
    16091617
    16101618#: config/menus.php:69
    1611 #: react/build/747.js:1
     1619#: react/build/785.js:1
    16121620msgid "Bookings"
    16131621msgstr ""
     
    17751783#: react/build/157.js:1
    17761784#: react/build/182.js:1
    1777 #: react/build/747.js:1
     1785#: react/build/785.js:1
    17781786#: react/build/792.js:1
    17791787#: react/build/843.js:1
     
    17871795#: react/build/157.js:1
    17881796#: react/build/182.js:1
    1789 #: react/build/747.js:1
     1797#: react/build/785.js:1
    17901798#: react/build/792.js:1
    17911799#: react/build/843.js:1
     
    17991807#: react/build/157.js:1
    18001808#: react/build/182.js:1
    1801 #: react/build/747.js:1
     1809#: react/build/785.js:1
    18021810#: react/build/792.js:1
    18031811#: react/build/843.js:1
     
    18661874#: react/build/157.js:1
    18671875#: react/build/182.js:1
    1868 #: react/build/747.js:1
     1876#: react/build/785.js:1
    18691877#: react/build/792.js:1
    18701878#: react/build/939.js:1
     
    19221930#: react/build/792.js:1
    19231931#: react/build/939.js:1
    1924 #: react/src/components/Fields/AuthenticationField.jsx:68
    1925 #: react/src/components/Fields/AuthenticationField.jsx:71
     1932#: react/src/components/Fields/AuthenticationField.jsx:67
     1933#: react/src/components/Fields/AuthenticationField.jsx:70
    19261934msgid "Log out"
    19271935msgstr ""
     
    19771985#: react/build/843.js:1
    19781986#: react/build/939.js:1
    1979 #: react/src/components/Modals/Partials/FormLogin.jsx:177
     1987#: react/src/components/Modals/Partials/FormLogin.jsx:196
     1988#: react/src/components/Modals/Partials/FormTwoFa.jsx:152
    19801989#: react/src/components/Onboarding/OnboardingStep.jsx:206
    19811990msgid "Something went wrong"
     
    19962005#: react/build/157.js:1
    19972006#: react/build/182.js:1
    1998 #: react/build/747.js:1
     2007#: react/build/785.js:1
    19992008#: react/build/792.js:1
    20002009#: react/build/843.js:1
     
    20092018#: react/build/157.js:1
    20102019#: react/build/182.js:1
    2011 #: react/build/747.js:1
     2020#: react/build/785.js:1
    20122021#: react/build/792.js:1
    20132022#: react/build/843.js:1
     
    20222031#: react/build/157.js:1
    20232032#: react/build/182.js:1
    2024 #: react/build/747.js:1
     2033#: react/build/785.js:1
    20252034#: react/build/792.js:1
    20262035#: react/build/843.js:1
     
    20352044#: react/build/157.js:1
    20362045#: react/build/182.js:1
    2037 #: react/build/747.js:1
     2046#: react/build/785.js:1
    20382047#: react/build/792.js:1
    20392048#: react/build/843.js:1
     
    20482057#: react/build/157.js:1
    20492058#: react/build/182.js:1
    2050 #: react/build/747.js:1
     2059#: react/build/785.js:1
    20512060#: react/build/792.js:1
    20522061#: react/build/843.js:1
     
    20612070#: react/build/157.js:1
    20622071#: react/build/182.js:1
    2063 #: react/build/747.js:1
     2072#: react/build/785.js:1
    20642073#: react/build/792.js:1
    20652074#: react/build/843.js:1
     
    20742083#: react/build/157.js:1
    20752084#: react/build/182.js:1
    2076 #: react/build/747.js:1
     2085#: react/build/785.js:1
    20772086#: react/build/792.js:1
    20782087#: react/build/843.js:1
     
    20872096#: react/build/157.js:1
    20882097#: react/build/182.js:1
    2089 #: react/build/747.js:1
     2098#: react/build/785.js:1
    20902099#: react/build/792.js:1
    20912100#: react/build/843.js:1
     
    21002109#: react/build/157.js:1
    21012110#: react/build/182.js:1
    2102 #: react/build/747.js:1
     2111#: react/build/785.js:1
    21032112#: react/build/792.js:1
    21042113#: react/build/843.js:1
     
    21132122#: react/build/157.js:1
    21142123#: react/build/182.js:1
    2115 #: react/build/747.js:1
     2124#: react/build/785.js:1
    21162125#: react/build/792.js:1
    21172126#: react/build/843.js:1
     
    21262135#: react/build/157.js:1
    21272136#: react/build/182.js:1
    2128 #: react/build/747.js:1
     2137#: react/build/785.js:1
    21292138#: react/build/792.js:1
    21302139#: react/build/843.js:1
     
    21392148#: react/build/157.js:1
    21402149#: react/build/182.js:1
    2141 #: react/build/747.js:1
     2150#: react/build/785.js:1
    21422151#: react/build/792.js:1
    21432152#: react/build/843.js:1
     
    21522161#: react/build/157.js:1
    21532162#: react/build/182.js:1
    2154 #: react/build/747.js:1
     2163#: react/build/785.js:1
    21552164#: react/build/792.js:1
    21562165#: react/build/843.js:1
     
    21652174#: react/build/157.js:1
    21662175#: react/build/182.js:1
    2167 #: react/build/747.js:1
     2176#: react/build/785.js:1
    21682177#: react/build/792.js:1
    21692178#: react/build/843.js:1
     
    21782187#: react/build/157.js:1
    21792188#: react/build/182.js:1
    2180 #: react/build/747.js:1
     2189#: react/build/785.js:1
    21812190#: react/build/792.js:1
    21822191#: react/build/843.js:1
     
    21912200#: react/build/157.js:1
    21922201#: react/build/182.js:1
    2193 #: react/build/747.js:1
     2202#: react/build/785.js:1
    21942203#: react/build/792.js:1
    21952204#: react/build/843.js:1
     
    22042213#: react/build/157.js:1
    22052214#: react/build/182.js:1
    2206 #: react/build/747.js:1
     2215#: react/build/785.js:1
    22072216#: react/build/792.js:1
    22082217#: react/build/843.js:1
     
    22172226#: react/build/157.js:1
    22182227#: react/build/182.js:1
    2219 #: react/build/747.js:1
     2228#: react/build/785.js:1
    22202229#: react/build/792.js:1
    22212230#: react/build/843.js:1
     
    22302239#: react/build/157.js:1
    22312240#: react/build/182.js:1
    2232 #: react/build/747.js:1
     2241#: react/build/785.js:1
    22332242#: react/build/792.js:1
    22342243#: react/build/843.js:1
     
    22432252#: react/build/157.js:1
    22442253#: react/build/182.js:1
    2245 #: react/build/747.js:1
     2254#: react/build/785.js:1
    22462255#: react/build/792.js:1
    22472256#: react/build/843.js:1
     
    22562265#: react/build/157.js:1
    22572266#: react/build/182.js:1
    2258 #: react/build/747.js:1
     2267#: react/build/785.js:1
    22592268#: react/build/792.js:1
    22602269#: react/build/843.js:1
     
    22692278#: react/build/157.js:1
    22702279#: react/build/182.js:1
    2271 #: react/build/747.js:1
     2280#: react/build/785.js:1
    22722281#: react/build/792.js:1
    22732282#: react/build/843.js:1
     
    22822291#: react/build/157.js:1
    22832292#: react/build/182.js:1
    2284 #: react/build/747.js:1
     2293#: react/build/785.js:1
    22852294#: react/build/792.js:1
    22862295#: react/build/843.js:1
     
    22952304#: react/build/157.js:1
    22962305#: react/build/182.js:1
    2297 #: react/build/747.js:1
     2306#: react/build/785.js:1
    22982307#: react/build/792.js:1
    22992308#: react/build/843.js:1
     
    23082317#: react/build/157.js:1
    23092318#: react/build/182.js:1
    2310 #: react/build/747.js:1
     2319#: react/build/785.js:1
    23112320#: react/build/792.js:1
    23122321#: react/build/843.js:1
     
    23212330#: react/build/157.js:1
    23222331#: react/build/182.js:1
    2323 #: react/build/747.js:1
     2332#: react/build/785.js:1
    23242333#: react/build/792.js:1
    23252334#: react/build/843.js:1
     
    23342343#: react/build/157.js:1
    23352344#: react/build/182.js:1
    2336 #: react/build/747.js:1
     2345#: react/build/785.js:1
    23372346#: react/build/792.js:1
    23382347#: react/build/843.js:1
     
    23782387#: react/build/107.js:1
    23792388#: react/build/843.js:1
    2380 #: react/src/components/Modals/Partials/FormLogin.jsx:194
    2381 #: react/src/components/Modals/Partials/FormTwoFa.jsx:140
     2389#: react/src/components/Modals/Partials/FormLogin.jsx:213
     2390#: react/src/components/Modals/Partials/FormTwoFa.jsx:171
    23822391msgid "Close"
    23832392msgstr ""
     
    24232432
    24242433#: react/build/107.js:1
    2425 #: react/build/747.js:1
     2434#: react/build/785.js:1
    24262435msgid "Live Help"
    24272436msgstr ""
    24282437
    24292438#: react/build/107.js:1
    2430 #: react/build/747.js:1
     2439#: react/build/785.js:1
    24312440msgid "days left"
    24322441msgstr ""
    24332442
    24342443#: react/build/107.js:1
    2435 #: react/build/747.js:1
     2444#: react/build/785.js:1
    24362445msgid "Dashboard"
    24372446msgstr ""
    24382447
    24392448#: react/build/107.js:1
    2440 #: react/build/747.js:1
     2449#: react/build/785.js:1
    24412450msgid "Clients"
    24422451msgstr ""
    24432452
    24442453#: react/build/107.js:1
    2445 #: react/build/747.js:1
     2454#: react/build/785.js:1
    24462455msgid "Calendar"
    24472456msgstr ""
    24482457
    24492458#: react/build/107.js:1
    2450 #: react/build/747.js:1
     2459#: react/build/785.js:1
    24512460msgid "Help Center"
    24522461msgstr ""
    24532462
    24542463#: react/build/107.js:1
    2455 #: react/build/747.js:1
     2464#: react/build/785.js:1
    24562465msgid "is expired."
    24572466msgstr ""
     
    25212530msgstr ""
    25222531
    2523 #: react/build/747.js:1
     2532#: react/build/785.js:1
    25242533msgid "is expired"
    25252534msgstr ""
    25262535
    2527 #: react/build/747.js:1
     2536#: react/build/785.js:1
    25282537msgid "No tasks available."
    25292538msgstr ""
    25302539
    2531 #: react/build/747.js:1
     2540#: react/build/785.js:1
    25322541msgid "Loading tasks..."
    25332542msgstr ""
    25342543
    2535 #: react/build/747.js:1
     2544#: react/build/785.js:1
    25362545msgid "Progress"
    25372546msgstr ""
    25382547
    2539 #: react/build/747.js:1
     2548#: react/build/785.js:1
    25402549msgid "All tasks"
    25412550msgstr ""
    25422551
    2543 #: react/build/747.js:1
     2552#: react/build/785.js:1
    25442553msgid "Remaining tasks"
    25452554msgstr ""
    25462555
    2547 #: react/build/747.js:1
     2556#: react/build/785.js:1
    25482557msgid "You're all set! Great job!"
    25492558msgstr ""
    25502559
    2551 #: react/build/747.js:1
     2560#: react/build/785.js:1
    25522561msgid "You're on your way. You still have %s task open."
    25532562msgid_plural "You're on your way. You still have %s tasks open."
     
    25552564msgstr[1] ""
    25562565
    2557 #: react/build/747.js:1
     2566#: react/build/785.js:1
    25582567msgid "Not yet calculated..."
    25592568msgstr ""
    25602569
    2561 #: react/build/747.js:1
     2570#: react/build/785.js:1
    25622571msgid "Today"
    25632572msgstr ""
    25642573
    2565 #: react/build/747.js:1
     2574#: react/build/785.js:1
    25662575msgid "This week"
    25672576msgstr ""
    25682577
    2569 #: react/build/747.js:1
     2578#: react/build/785.js:1
    25702579msgid "Service Provider"
    25712580msgstr ""
    25722581
    2573 #: react/build/747.js:1
     2582#: react/build/785.js:1
    25742583msgid "Service"
    25752584msgstr ""
    25762585
    2577 #: react/build/747.js:1
     2586#: react/build/785.js:1
    25782587msgid "Most popular"
    25792588msgstr ""
    25802589
    2581 #: react/build/747.js:1
     2590#: react/build/785.js:1
    25822591msgid "Last 30 days"
    25832592msgstr ""
    25842593
    2585 #: react/build/747.js:1
     2594#: react/build/785.js:1
    25862595msgid "View Bookings"
    25872596msgstr ""
    25882597
    2589 #: react/build/747.js:1
     2598#: react/build/785.js:1
    25902599msgid "SMS Credits"
    25912600msgstr ""
    25922601
    2593 #: react/build/747.js:1
     2602#: react/build/785.js:1
    25942603msgid "SMS Gateway"
    25952604msgstr ""
    25962605
    2597 #: react/build/747.js:1
     2606#: react/build/785.js:1
    25982607msgid "Membership"
    25992608msgstr ""
    26002609
    2601 #: react/build/747.js:1
     2610#: react/build/785.js:1
    26022611msgid "Paid Events"
    26032612msgstr ""
    26042613
    2605 #: react/build/747.js:1
     2614#: react/build/785.js:1
    26062615msgid "Management"
    26072616msgstr ""
    26082617
    2609 #: react/build/747.js:1
     2618#: react/build/785.js:1
    26102619msgid "Tips & Tricks"
    26112620msgstr ""
    26122621
    2613 #: react/build/747.js:1
     2622#: react/build/785.js:1
    26142623msgid "View All"
    26152624msgstr ""
    26162625
    2617 #: react/build/747.js:1
     2626#: react/build/785.js:1
    26182627msgid "Installed"
    26192628msgstr ""
    26202629
    2621 #: react/build/747.js:1
     2630#: react/build/785.js:1
    26222631msgid "Install"
    26232632msgstr ""
    26242633
    2625 #: react/build/747.js:1
     2634#: react/build/785.js:1
    26262635msgid "Activate"
    26272636msgstr ""
    26282637
    2629 #: react/build/747.js:1
     2638#: react/build/785.js:1
    26302639msgid "Activating..."
    26312640msgstr ""
    26322641
    2633 #: react/build/747.js:1
     2642#: react/build/785.js:1
    26342643msgid "Downloading..."
    26352644msgstr ""
    26362645
    2637 #: react/build/747.js:1
     2646#: react/build/785.js:1
    26382647msgid "Other Plugins"
    26392648msgstr ""
    26402649
    2641 #: react/build/747.js:1
     2650#: react/build/785.js:1
    26422651msgid "Loading..."
    26432652msgstr ""
     
    26812690
    26822691#: react/build/843.js:1
    2683 #: react/src/components/Modals/Partials/FormTwoFa.jsx:78
     2692#: react/src/components/Modals/Partials/FormLogin.jsx:101
     2693#: react/src/components/Modals/Partials/FormTwoFa.jsx:53
     2694#: react/src/components/Modals/Partials/FormTwoFa.jsx:74
     2695msgid "An unknown error occurred, please try again."
     2696msgstr ""
     2697
     2698#: react/build/843.js:1
     2699#: react/src/components/Modals/Partials/FormTwoFa.jsx:61
     2700#: react/src/components/Modals/Partials/FormTwoFa.jsx:82
     2701msgid "An unknown error occurred. Please try again."
     2702msgstr ""
     2703
     2704#: react/build/843.js:1
     2705#: react/src/components/Modals/Partials/FormTwoFa.jsx:99
    26842706msgid "Select 2FA provider"
    26852707msgstr ""
    26862708
    26872709#: react/build/843.js:1
    2688 #: react/src/components/Modals/Partials/FormTwoFa.jsx:102
     2710#: react/src/components/Modals/Partials/FormTwoFa.jsx:123
    26892711msgid "Enter 2FA authentication code"
    26902712msgstr ""
    26912713
    26922714#: react/build/843.js:1
    2693 #: react/src/components/Modals/Partials/FormTwoFa.jsx:105
     2715#: react/src/components/Modals/Partials/FormTwoFa.jsx:126
    26942716msgid "Enter code"
    26952717msgstr ""
    26962718
    26972719#: react/build/843.js:1
    2698 #: react/src/components/Modals/Partials/FormTwoFa.jsx:122
     2720#: react/src/components/Modals/Partials/FormTwoFa.jsx:147
    26992721msgid "SMS Requested"
    27002722msgstr ""
    27012723
    27022724#: react/build/843.js:1
    2703 #: react/src/components/Modals/Partials/FormTwoFa.jsx:122
     2725#: react/src/components/Modals/Partials/FormTwoFa.jsx:147
    27042726msgid "Request SMS"
    27052727msgstr ""
    27062728
    27072729#: react/build/843.js:1
    2708 #: react/src/components/Modals/Partials/FormLogin.jsx:187
    2709 #: react/src/components/Modals/Partials/FormTwoFa.jsx:132
     2730#: react/src/components/Modals/Partials/FormLogin.jsx:206
     2731#: react/src/components/Modals/Partials/FormTwoFa.jsx:163
    27102732msgid "Submit"
    27112733msgstr ""
    27122734
    27132735#: react/build/843.js:1
    2714 #: react/src/components/Modals/Partials/FormLogin.jsx:116
     2736#: react/src/components/Modals/Partials/FormLogin.jsx:117
    27152737msgid "Company domain"
    27162738msgstr ""
    27172739
    27182740#: react/build/843.js:1
    2719 #: react/src/components/Modals/Partials/FormLogin.jsx:136
    2720 #: react/src/components/Modals/Partials/FormLogin.jsx:139
     2741#: react/src/components/Modals/Partials/FormLogin.jsx:137
     2742#: react/src/components/Modals/Partials/FormLogin.jsx:140
    27212743msgid "Company login"
    27222744msgstr ""
    27232745
    27242746#: react/build/843.js:1
    2725 #: react/src/components/Modals/Partials/FormLogin.jsx:152
    2726 #: react/src/components/Modals/Partials/FormLogin.jsx:155
     2747#: react/src/components/Modals/Partials/FormLogin.jsx:159
     2748#: react/src/components/Modals/Partials/FormLogin.jsx:162
    27272749msgid "User login or email"
    27282750msgstr ""
    27292751
    27302752#: react/build/843.js:1
    2731 #: react/src/components/Modals/Partials/FormLogin.jsx:168
    2732 #: react/src/components/Modals/Partials/FormLogin.jsx:171
     2753#: react/src/components/Modals/Partials/FormLogin.jsx:181
     2754#: react/src/components/Modals/Partials/FormLogin.jsx:184
    27332755msgid "Password"
    27342756msgstr ""
  • simplybook/tags/3.1.0/composer.json

    r3297362 r3313046  
    11{
    22    "name": "really-simple-plugins/simplybookme",
    3     "version": "3.0.0",
     3    "version": "3.1.0",
    44    "description": "Online booking system plugin for service businesses that lets your customers schedule appointments and pay for your services on your Wordpress site.",
    55    "type": "wordpress-plugin",
  • simplybook/tags/3.1.0/config/environment.php

    r3297362 r3313046  
    77    'plugin' => [
    88        'name' => 'SimplyBook.me',
    9         'version' => '3.0.0',
     9        'version' => '3.1.0',
    1010        'pro' => true,
    1111        'path' => dirname(__DIR__),
    12         'base_path' => dirname(__DIR__). '/' . plugin_basename(dirname(__DIR__)) . '.php',
    13         'assets_path' => dirname(__DIR__).'/assets/',
    14         'lang_path' => dirname(__DIR__).'/assets/languages/',
    15         'view_path' => dirname(__DIR__).'/app/views/',
    16         'feature_path' => dirname(__DIR__).'/app/features/',
    17         'react_path' => dirname(__DIR__).'/react',
     12        'base_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . plugin_basename(dirname(__DIR__)) . '.php',
     13        'assets_path' => dirname(__DIR__). DIRECTORY_SEPARATOR .'assets' . DIRECTORY_SEPARATOR,
     14        'lang_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'assets'. DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR,
     15        'view_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR,
     16        'feature_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'features' . DIRECTORY_SEPARATOR,
     17        'react_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'react',
    1818        'dir'  => plugin_basename(dirname(__DIR__)),
    19         'base_file' => plugin_basename(dirname(__DIR__)) . '/' . plugin_basename(dirname(__DIR__)) . '.php',
    20         'lang' => plugin_basename(dirname(__DIR__)) . '/assets/languages',
     19        'base_file' => plugin_basename(dirname(__DIR__)) . DIRECTORY_SEPARATOR . plugin_basename(dirname(__DIR__)) . '.php',
     20        'lang' => plugin_basename(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR . 'languages',
    2121        'url'  => plugin_dir_url(__DIR__),
    2222        'assets_url' => plugin_dir_url(__DIR__).'assets/',
     
    112112            ['key' => 'login:booking.lcn.uk', 'value' => 'login:booking.lcn.uk', 'label' => 'booking.lcn.uk'],
    113113            ['key' => 'login:booking.register365.ie', 'value' => 'login:booking.register365.ie', 'label' => 'booking.register365.ie'],
    114             ['key' => 'login:booking.register365.ie', 'value' => 'login:booking.register365.ie', 'label' => 'booking.register365.ie'],
    115114        ]
    116115    ],
  • simplybook/tags/3.1.0/config/features.php

    r3297362 r3313046  
    1313        'dependencies' => [
    1414            'Service',
     15            '\SimplyBook\Services\WidgetTrackingService',
    1516        ],
    1617    ],
     
    2021        'pro' => false,
    2122        'priorityFiles' => [
    22             'Tasks/AbstractTask',
     23            'Tasks' . DIRECTORY_SEPARATOR . 'AbstractTask',
    2324        ],
    2425    ],
     
    2829        'pro' => false,
    2930        'priorityFiles' => [
    30             'Notices/AbstractNotice',
     31            'Notices' . DIRECTORY_SEPARATOR . 'AbstractNotice',
    3132        ],
    3233    ],
  • simplybook/tags/3.1.0/config/fields/design.php

    r3297362 r3313046  
    4141            'type'     => 'checkbox',
    4242            'label'    => __('RTL', 'simplybook'),
    43             'help'     => sprintf(
    44                 /* translators: %s - IS or IS NOT */
    45                 __('When selected, writing starts from the right of the page and continues to the left, proceeding from top to bottom for new lines. Your website %s set to RTL.', 'simplybook'),
    46                 (is_rtl() ? 'IS' : 'IS NOT'),
    47             ),
     43            'tooltip'  => [
     44                'message' => sprintf(
     45                    /* translators: %s - IS or IS NOT */
     46                    __('When selected, writing starts from the right of the page and continues to the left, proceeding from top to bottom for new lines. Your website %s set to RTL.', 'simplybook'),
     47                    (is_rtl() ? 'IS' : 'IS NOT'),
     48                ),
     49                'type'    => 'info',
     50            ],
    4851            'disabled' => false,
    4952            'default'  => is_rtl(),
     
    5558            'type'     => 'checkbox',
    5659            'label'    => __('Allow switch to ADA', 'simplybook'),
    57             'help'     => __('This adds a button to enable accessibility mode, which increases contrast for visitors with a visual disability.', 'simplybook'),
     60            'tooltip'  => [
     61                'message' => __('This adds a button to enable accessibility mode, which increases contrast for visitors with a visual disability.', 'simplybook'),
     62                'type'    => 'info',
     63            ],
    5864            'disabled' => false,
    5965            'default'  => false,
     
    6470            'group_id' => 'main',
    6571            'type'     => 'checkbox',
     72            'tooltip'  => [
     73                'message' => __('Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones.', 'simplybook'),
     74                'type'    => 'info',
     75            ],
    6676            'label'    => __('Clear the session of each widget initialization', 'simplybook'),
    67             'help' => __('Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones.', 'simplybook'),
    6877            'disabled' => false,
    6978            'default'  => true,
  • simplybook/tags/3.1.0/config/fields/general.php

    r3297362 r3313046  
    1 
    21<?php
    32defined( 'ABSPATH' ) or die();
  • simplybook/tags/3.1.0/config/related.php

    r3297362 r3313046  
    99            'slug' => 'really-simple-ssl',
    1010            'options_prefix' => 'rsssl',
    11             'activation_slug' => 'really-simple-ssl/rlrsssl-really-simple-ssl.php',
     11            'activation_slug' => 'really-simple-ssl' . DIRECTORY_SEPARATOR . 'rlrsssl-really-simple-ssl.php',
    1212            'constant_free' => 'rsssl_version',
    1313            'constant_premium' => 'rsssl_pro',
     
    2020            'slug' => 'complianz-gdpr',
    2121            'options_prefix' => 'cmplz',
    22             'activation_slug' => 'complianz-gdpr/complianz-gpdr.php',
     22            'activation_slug' => 'complianz-gdpr' . DIRECTORY_SEPARATOR . 'complianz-gpdr.php',
    2323            'constant_free' => 'cmplz_version',
    2424            'constant_premium' => 'cmplz_premium',
     
    3232            'slug' => 'complianz-terms-conditions',
    3333            'options_prefix' => 'cmplz_tc',
    34             'activation_slug' => 'complianz-terms-conditions/complianz-terms-conditions.php',
     34            'activation_slug' => 'complianz-terms-conditions' . DIRECTORY_SEPARATOR . 'complianz-terms-conditions.php',
    3535            'constant_free' => 'cmplz_tc_version',
    3636            'create' => admin_url('admin.php?page=terms-conditions'),
  • simplybook/tags/3.1.0/readme.txt

    r3297401 r3313046  
    11=== SimplyBook.me - Booking and reservations calendar ===
    2 Contributors: simplybook, reallysimpleplugins, wimbraam, jeroenvdk
     2Contributors: simplybook, reallysimpleplugins, wimbraam, jeroenvdk, markwolters, rvvelthuijsen
    33Donate link: https://simplybook.me/
    44Tags: Booking, Calendar, Scheduling, Reservations, Appointments
     
    66Tested up to: 6.8
    77Requires PHP: 7.4
    8 Stable tag: 3.0.0
     8Stable tag: 3.1.0
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    4141
    4242SimplyBook.me is an advanced online booking system that creates a professional booking widget on your WordPress site where your clients can book your services at any time. You will then have access to an admin interface where you can manage your bookings and settings. On top of that you will get an admin app where you can manage all your bookings and accept payments on the go.Thousands of clients all over the world have selected our booking system to make their business easy and comfortable to use (see our testimonials). SimplyBook.me provides users with a broad range of features so that you can tailor the system to your needs, irrespective of what industry you are in.
    43 For a more detailed understanding of the SimplyBook.me service, you can explore at the following link:
    44 * <a href="https://simplybook.me/?ref=wordpress" rel="friend" title="SimplyBook" target="_blank">https://simplybook.me/?ref=wordpress</a>
     43For a more detailed understanding of the SimplyBook.me service, you can explore at the following link: <a href="https://simplybook.me/?ref=wordpress" rel="friend" title="SimplyBook" target="_blank">https://simplybook.me/</a>
    4544
    4645This plugin is developed by SimplyBook.me, is ISO27001 compliant and utilizes its API to transmit and store all information, including settings and details of bookings, as well as other personal client data, directly on SimplyBook.me. Before using the plugin, we recommend that you familiarize yourself with the privacy policy and terms of use of SimplyBook.me at the following links:
     
    6160Additionally, an online booking system offers powerful analytics that provide deep insights into customer behaviors and preferences. This data is essential for making informed adjustments to service offerings and planning effective marketing strategies. Last but not least it´s the best way to boost your sales by offering service add-ons and products for sale in the booking process, by sending tailored marketing email campaigns, offering coupons on less busy days, by prompting tips during check out and so much more, the options are endless!
    6261
    63 
    6462== Installation ==
    6563
    66 = <a href="https://help.simplybook.me/index.php/WordPress_integration" rel="friend" title="SimplyBook Wiki" target="_blank">Detailed instructions with photos here </a> =
     64= <a href="https://help.simplybook.me/index.php/WordPress_integration" rel="friend" title="SimplyBook Wiki" target="_blank">Detailed instructions with photos here</a> =
    6765
    6866
     
    9189
    9290== Changelog ==
     91= 3.1.0 =
     92* Added: markwolters and rvvelthuijsen are added as contributors.
     93* Added: Setting help texts are now shown in tooltips.
     94* Changed: Prompts to publish the widget now responds to user actions in posts.
     95* Changed: Removed unnecessary files to make the plugin package smaller.
     96* Removed: Duplicate domain option from sign-in dropdown.
     97* Fixed: Non-email usernames now accepted at login.
     98* Fixed: Console error in onboarding-start resolved.
     99* Fixed: Miscellaneous 2FA login console errors resolved.
     100* Fixed: Gutenberg block now registers correctly with API V2, resolving a console notice.
     101* Fixed: Error message now correctly shown when an invalid 2FA code is entered.
     102* Fixed: Demo widget notice now only appears when the loaded widget is actually a demo.
     103* Fixed: Unexpectedly losing connection with SimplyBook.me is now resolved.
    93104
    94105= 3.0.0 =
    95 * Major refactor of the plugin.
     106* Major refactor of the plugin by Really Simple Plugins.
     107* Added: reallysimpleplugins, wimbraam and jeroenvdk are added as contributors.
    96108
    97109= 2.3 =
  • simplybook/tags/3.1.0/simplybook.php

    r3297362 r3313046  
    88 * @wordpress-plugin
    99 * Plugin Name: SimplyBook.me - Booking and reservations calendar
    10  * Plugin URI: https://help.simplybook.me/index.php/WordPress_plugn
     10 * Plugin URI: https://help.simplybook.me/index.php?title=WordPress_integration
    1111 * Description: Simply add a booking calendar to your site to schedule bookings, reservations, appointments and to collect payments.
    12  * Version: 3.0.0
     12 * Version: 3.1.0
    1313 * Requires at least: 6.0
    1414 * Requires PHP: 7.4
  • simplybook/tags/3.1.0/vendor/composer/autoload_classmap.php

    r3297362 r3313046  
    113113    'SimplyBook\\Controllers\\SettingsController' => $baseDir . '/app/controllers/SettingsController.php',
    114114    'SimplyBook\\Controllers\\WidgetController' => $baseDir . '/app/controllers/WidgetController.php',
     115    'SimplyBook\\Controllers\\WidgetTrackingController' => $baseDir . '/app/controllers/WidgetTrackingController.php',
    115116    'SimplyBook\\Exceptions\\ApiException' => $baseDir . '/app/exceptions/ApiException.php',
    116117    'SimplyBook\\Exceptions\\BuilderException' => $baseDir . '/app/exceptions/BuilderException.php',
     
    160161    'SimplyBook\\Services\\StatisticsService' => $baseDir . '/app/services/StatisticsService.php',
    161162    'SimplyBook\\Services\\SubscriptionDataService' => $baseDir . '/app/services/SubscriptionDataService.php',
     163    'SimplyBook\\Services\\WidgetTrackingService' => $baseDir . '/app/services/WidgetTrackingService.php',
    162164    'SimplyBook\\Traits\\HasAllowlistControl' => $baseDir . '/app/traits/HasAllowlistControl.php',
    163165    'SimplyBook\\Traits\\HasNonces' => $baseDir . '/app/traits/HasNonces.php',
  • simplybook/tags/3.1.0/vendor/composer/autoload_static.php

    r3297362 r3313046  
    253253        'SimplyBook\\Controllers\\SettingsController' => __DIR__ . '/../..' . '/app/controllers/SettingsController.php',
    254254        'SimplyBook\\Controllers\\WidgetController' => __DIR__ . '/../..' . '/app/controllers/WidgetController.php',
     255        'SimplyBook\\Controllers\\WidgetTrackingController' => __DIR__ . '/../..' . '/app/controllers/WidgetTrackingController.php',
    255256        'SimplyBook\\Exceptions\\ApiException' => __DIR__ . '/../..' . '/app/exceptions/ApiException.php',
    256257        'SimplyBook\\Exceptions\\BuilderException' => __DIR__ . '/../..' . '/app/exceptions/BuilderException.php',
     
    300301        'SimplyBook\\Services\\StatisticsService' => __DIR__ . '/../..' . '/app/services/StatisticsService.php',
    301302        'SimplyBook\\Services\\SubscriptionDataService' => __DIR__ . '/../..' . '/app/services/SubscriptionDataService.php',
     303        'SimplyBook\\Services\\WidgetTrackingService' => __DIR__ . '/../..' . '/app/services/WidgetTrackingService.php',
    302304        'SimplyBook\\Traits\\HasAllowlistControl' => __DIR__ . '/../..' . '/app/traits/HasAllowlistControl.php',
    303305        'SimplyBook\\Traits\\HasNonces' => __DIR__ . '/../..' . '/app/traits/HasNonces.php',
  • simplybook/tags/3.1.0/vendor/composer/installed.php

    r3297362 r3313046  
    22    'root' => array(
    33        'name' => 'really-simple-plugins/simplybookme',
    4         'pretty_version' => '3.0.0',
    5         'version' => '3.0.0.0',
     4        'pretty_version' => '3.1.0',
     5        'version' => '3.1.0.0',
    66        'reference' => null,
    77        'type' => 'wordpress-plugin',
     
    6363        ),
    6464        'really-simple-plugins/simplybookme' => array(
    65             'pretty_version' => '3.0.0',
    66             'version' => '3.0.0.0',
     65            'pretty_version' => '3.1.0',
     66            'version' => '3.1.0.0',
    6767            'reference' => null,
    6868            'type' => 'wordpress-plugin',
  • simplybook/tags/3.1.0/vendor/composer/jetpack_autoload_classmap.php

    r3297362 r3313046  
    424424    ),
    425425    'SimplyBook\\Builders\\CompanyBuilder' => array(
    426         'version' => '3.0.0.0',
     426        'version' => '3.1.0.0',
    427427        'path'    => $baseDir . '/app/support/builders/CompanyBuilder.php'
    428428    ),
    429429    'SimplyBook\\Builders\\PageBuilder' => array(
    430         'version' => '3.0.0.0',
     430        'version' => '3.1.0.0',
    431431        'path'    => $baseDir . '/app/support/builders/PageBuilder.php'
    432432    ),
    433433    'SimplyBook\\Builders\\WidgetScriptBuilder' => array(
    434         'version' => '3.0.0.0',
     434        'version' => '3.1.0.0',
    435435        'path'    => $baseDir . '/app/support/builders/WidgetScriptBuilder.php'
    436436    ),
    437437    'SimplyBook\\Controllers\\AdminController' => array(
    438         'version' => '3.0.0.0',
     438        'version' => '3.1.0.0',
    439439        'path'    => $baseDir . '/app/controllers/AdminController.php'
    440440    ),
    441441    'SimplyBook\\Controllers\\BlockController' => array(
    442         'version' => '3.0.0.0',
     442        'version' => '3.1.0.0',
    443443        'path'    => $baseDir . '/app/controllers/BlockController.php'
    444444    ),
    445445    'SimplyBook\\Controllers\\CapabilityController' => array(
    446         'version' => '3.0.0.0',
     446        'version' => '3.1.0.0',
    447447        'path'    => $baseDir . '/app/controllers/CapabilityController.php'
    448448    ),
    449449    'SimplyBook\\Controllers\\DashboardController' => array(
    450         'version' => '3.0.0.0',
     450        'version' => '3.1.0.0',
    451451        'path'    => $baseDir . '/app/controllers/DashboardController.php'
    452452    ),
    453453    'SimplyBook\\Controllers\\DesignSettingsController' => array(
    454         'version' => '3.0.0.0',
     454        'version' => '3.1.0.0',
    455455        'path'    => $baseDir . '/app/controllers/DesignSettingsController.php'
    456456    ),
    457457    'SimplyBook\\Controllers\\ReviewController' => array(
    458         'version' => '3.0.0.0',
     458        'version' => '3.1.0.0',
    459459        'path'    => $baseDir . '/app/controllers/ReviewController.php'
    460460    ),
    461461    'SimplyBook\\Controllers\\ScheduleController' => array(
    462         'version' => '3.0.0.0',
     462        'version' => '3.1.0.0',
    463463        'path'    => $baseDir . '/app/controllers/ScheduleController.php'
    464464    ),
    465465    'SimplyBook\\Controllers\\ServicesController' => array(
    466         'version' => '3.0.0.0',
     466        'version' => '3.1.0.0',
    467467        'path'    => $baseDir . '/app/controllers/ServicesController.php'
    468468    ),
    469469    'SimplyBook\\Controllers\\SettingsController' => array(
    470         'version' => '3.0.0.0',
     470        'version' => '3.1.0.0',
    471471        'path'    => $baseDir . '/app/controllers/SettingsController.php'
    472472    ),
    473473    'SimplyBook\\Controllers\\WidgetController' => array(
    474         'version' => '3.0.0.0',
     474        'version' => '3.1.0.0',
    475475        'path'    => $baseDir . '/app/controllers/WidgetController.php'
    476476    ),
     477    'SimplyBook\\Controllers\\WidgetTrackingController' => array(
     478        'version' => '3.1.0.0',
     479        'path'    => $baseDir . '/app/controllers/WidgetTrackingController.php'
     480    ),
    477481    'SimplyBook\\Exceptions\\ApiException' => array(
    478         'version' => '3.0.0.0',
     482        'version' => '3.1.0.0',
    479483        'path'    => $baseDir . '/app/exceptions/ApiException.php'
    480484    ),
    481485    'SimplyBook\\Exceptions\\BuilderException' => array(
    482         'version' => '3.0.0.0',
     486        'version' => '3.1.0.0',
    483487        'path'    => $baseDir . '/app/exceptions/BuilderException.php'
    484488    ),
    485489    'SimplyBook\\Exceptions\\RestDataException' => array(
    486         'version' => '3.0.0.0',
     490        'version' => '3.1.0.0',
    487491        'path'    => $baseDir . '/app/exceptions/RestDataException.php'
    488492    ),
    489493    'SimplyBook\\Exceptions\\SettingsException' => array(
    490         'version' => '3.0.0.0',
     494        'version' => '3.1.0.0',
    491495        'path'    => $baseDir . '/app/exceptions/SettingsException.php'
    492496    ),
    493497    'SimplyBook\\Helpers\\Event' => array(
    494         'version' => '3.0.0.0',
     498        'version' => '3.1.0.0',
    495499        'path'    => $baseDir . '/app/support/helpers/Event.php'
    496500    ),
    497501    'SimplyBook\\Helpers\\FeatureHelper' => array(
    498         'version' => '3.0.0.0',
     502        'version' => '3.1.0.0',
    499503        'path'    => $baseDir . '/app/support/helpers/FeatureHelper.php'
    500504    ),
    501505    'SimplyBook\\Helpers\\Request' => array(
    502         'version' => '3.0.0.0',
     506        'version' => '3.1.0.0',
    503507        'path'    => $baseDir . '/app/support/helpers/Request.php'
    504508    ),
    505509    'SimplyBook\\Helpers\\Storage' => array(
    506         'version' => '3.0.0.0',
     510        'version' => '3.1.0.0',
    507511        'path'    => $baseDir . '/app/support/helpers/Storage.php'
    508512    ),
    509513    'SimplyBook\\Helpers\\Uninstall' => array(
    510         'version' => '3.0.0.0',
     514        'version' => '3.1.0.0',
    511515        'path'    => $baseDir . '/app/support/helpers/Uninstall.php'
    512516    ),
    513517    'SimplyBook\\Http\\ApiClient' => array(
    514         'version' => '3.0.0.0',
     518        'version' => '3.1.0.0',
    515519        'path'    => $baseDir . '/app/http/ApiClient.php'
    516520    ),
    517521    'SimplyBook\\Http\\DTO\\ApiResponseDTO' => array(
    518         'version' => '3.0.0.0',
     522        'version' => '3.1.0.0',
    519523        'path'    => $baseDir . '/app/http/dto/ApiResponseDTO.php'
    520524    ),
    521525    'SimplyBook\\Http\\Endpoints\\BlockEndpoints' => array(
    522         'version' => '3.0.0.0',
     526        'version' => '3.1.0.0',
    523527        'path'    => $baseDir . '/app/http/endpoints/BlockEndpoints.php'
    524528    ),
    525529    'SimplyBook\\Http\\Endpoints\\CompanyRegistrationEndpoint' => array(
    526         'version' => '3.0.0.0',
     530        'version' => '3.1.0.0',
    527531        'path'    => $baseDir . '/app/http/endpoints/CompanyRegistrationEndpoint.php'
    528532    ),
    529533    'SimplyBook\\Http\\Endpoints\\DomainEndpoint' => array(
    530         'version' => '3.0.0.0',
     534        'version' => '3.1.0.0',
    531535        'path'    => $baseDir . '/app/http/endpoints/DomainEndpoint.php'
    532536    ),
    533537    'SimplyBook\\Http\\Endpoints\\LogOutEndpoint' => array(
    534         'version' => '3.0.0.0',
     538        'version' => '3.1.0.0',
    535539        'path'    => $baseDir . '/app/http/endpoints/LogOutEndpoint.php'
    536540    ),
    537541    'SimplyBook\\Http\\Endpoints\\LoginUrlEndpoint' => array(
    538         'version' => '3.0.0.0',
     542        'version' => '3.1.0.0',
    539543        'path'    => $baseDir . '/app/http/endpoints/LoginUrlEndpoint.php'
    540544    ),
    541545    'SimplyBook\\Http\\Endpoints\\ProvidersEndpoint' => array(
    542         'version' => '3.0.0.0',
     546        'version' => '3.1.0.0',
    543547        'path'    => $baseDir . '/app/http/endpoints/ProvidersEndpoint.php'
    544548    ),
    545549    'SimplyBook\\Http\\Endpoints\\PublicThemeListEndpoint' => array(
    546         'version' => '3.0.0.0',
     550        'version' => '3.1.0.0',
    547551        'path'    => $baseDir . '/app/http/endpoints/PublicThemeListEndpoint.php'
    548552    ),
    549553    'SimplyBook\\Http\\Endpoints\\RelatedPluginEndpoints' => array(
    550         'version' => '3.0.0.0',
     554        'version' => '3.1.0.0',
    551555        'path'    => $baseDir . '/app/http/endpoints/RelatedPluginEndpoints.php'
    552556    ),
    553557    'SimplyBook\\Http\\Endpoints\\RemotePluginsEndpoint' => array(
    554         'version' => '3.0.0.0',
     558        'version' => '3.1.0.0',
    555559        'path'    => $baseDir . '/app/http/endpoints/RemotePluginsEndpoint.php'
    556560    ),
    557561    'SimplyBook\\Http\\Endpoints\\ServicesEndpoint' => array(
    558         'version' => '3.0.0.0',
     562        'version' => '3.1.0.0',
    559563        'path'    => $baseDir . '/app/http/endpoints/ServicesEndpoint.php'
    560564    ),
    561565    'SimplyBook\\Http\\Endpoints\\SettingEndpoints' => array(
    562         'version' => '3.0.0.0',
     566        'version' => '3.1.0.0',
    563567        'path'    => $baseDir . '/app/http/endpoints/SettingEndpoints.php'
    564568    ),
    565569    'SimplyBook\\Http\\Endpoints\\StatisticsEndpoint' => array(
    566         'version' => '3.0.0.0',
     570        'version' => '3.1.0.0',
    567571        'path'    => $baseDir . '/app/http/endpoints/StatisticsEndpoint.php'
    568572    ),
    569573    'SimplyBook\\Http\\Endpoints\\SubscriptionEndpoints' => array(
    570         'version' => '3.0.0.0',
     574        'version' => '3.1.0.0',
    571575        'path'    => $baseDir . '/app/http/endpoints/SubscriptionEndpoints.php'
    572576    ),
    573577    'SimplyBook\\Http\\Endpoints\\TipsTricksEndpoint' => array(
    574         'version' => '3.0.0.0',
     578        'version' => '3.1.0.0',
    575579        'path'    => $baseDir . '/app/http/endpoints/TipsTricksEndpoint.php'
    576580    ),
    577581    'SimplyBook\\Http\\Endpoints\\WaitForRegistrationEndpoint' => array(
    578         'version' => '3.0.0.0',
     582        'version' => '3.1.0.0',
    579583        'path'    => $baseDir . '/app/http/endpoints/WaitForRegistrationEndpoint.php'
    580584    ),
    581585    'SimplyBook\\Http\\Endpoints\\WidgetEndpoint' => array(
    582         'version' => '3.0.0.0',
     586        'version' => '3.1.0.0',
    583587        'path'    => $baseDir . '/app/http/endpoints/WidgetEndpoint.php'
    584588    ),
    585589    'SimplyBook\\Http\\JsonRpcClient' => array(
    586         'version' => '3.0.0.0',
     590        'version' => '3.1.0.0',
    587591        'path'    => $baseDir . '/app/http/JsonRpcClient.php'
    588592    ),
    589593    'SimplyBook\\Interfaces\\ControllerInterface' => array(
    590         'version' => '3.0.0.0',
     594        'version' => '3.1.0.0',
    591595        'path'    => $baseDir . '/app/interfaces/ControllerInterface.php'
    592596    ),
    593597    'SimplyBook\\Interfaces\\FeatureInterface' => array(
    594         'version' => '3.0.0.0',
     598        'version' => '3.1.0.0',
    595599        'path'    => $baseDir . '/app/interfaces/FeatureInterface.php'
    596600    ),
    597601    'SimplyBook\\Interfaces\\MultiEndpointInterface' => array(
    598         'version' => '3.0.0.0',
     602        'version' => '3.1.0.0',
    599603        'path'    => $baseDir . '/app/interfaces/MultiEndpointInterface.php'
    600604    ),
    601605    'SimplyBook\\Interfaces\\NoticeInterface' => array(
    602         'version' => '3.0.0.0',
     606        'version' => '3.1.0.0',
    603607        'path'    => $baseDir . '/app/interfaces/NoticeInterface.php'
    604608    ),
    605609    'SimplyBook\\Interfaces\\ProviderInterface' => array(
    606         'version' => '3.0.0.0',
     610        'version' => '3.1.0.0',
    607611        'path'    => $baseDir . '/app/interfaces/ProviderInterface.php'
    608612    ),
    609613    'SimplyBook\\Interfaces\\SingleEndpointInterface' => array(
    610         'version' => '3.0.0.0',
     614        'version' => '3.1.0.0',
    611615        'path'    => $baseDir . '/app/interfaces/SingleEndpointInterface.php'
    612616    ),
    613617    'SimplyBook\\Interfaces\\TaskInterface' => array(
    614         'version' => '3.0.0.0',
     618        'version' => '3.1.0.0',
    615619        'path'    => $baseDir . '/app/interfaces/TaskInterface.php'
    616620    ),
    617621    'SimplyBook\\Managers\\ControllerManager' => array(
    618         'version' => '3.0.0.0',
     622        'version' => '3.1.0.0',
    619623        'path'    => $baseDir . '/app/managers/ControllerManager.php'
    620624    ),
    621625    'SimplyBook\\Managers\\EndpointManager' => array(
    622         'version' => '3.0.0.0',
     626        'version' => '3.1.0.0',
    623627        'path'    => $baseDir . '/app/managers/EndpointManager.php'
    624628    ),
    625629    'SimplyBook\\Managers\\FeatureManager' => array(
    626         'version' => '3.0.0.0',
     630        'version' => '3.1.0.0',
    627631        'path'    => $baseDir . '/app/managers/FeatureManager.php'
    628632    ),
    629633    'SimplyBook\\Managers\\ProviderManager' => array(
    630         'version' => '3.0.0.0',
     634        'version' => '3.1.0.0',
    631635        'path'    => $baseDir . '/app/managers/ProviderManager.php'
    632636    ),
    633637    'SimplyBook\\Providers\\AppServiceProvider' => array(
    634         'version' => '3.0.0.0',
     638        'version' => '3.1.0.0',
    635639        'path'    => $baseDir . '/app/providers/AppServiceProvider.php'
    636640    ),
    637641    'SimplyBook\\Providers\\Provider' => array(
    638         'version' => '3.0.0.0',
     642        'version' => '3.1.0.0',
    639643        'path'    => $baseDir . '/app/providers/Provider.php'
    640644    ),
    641645    'SimplyBook\\Services\\CapabilityService' => array(
    642         'version' => '3.0.0.0',
     646        'version' => '3.1.0.0',
    643647        'path'    => $baseDir . '/app/services/CapabilityService.php'
    644648    ),
    645649    'SimplyBook\\Services\\DesignSettingsService' => array(
    646         'version' => '3.0.0.0',
     650        'version' => '3.1.0.0',
    647651        'path'    => $baseDir . '/app/services/DesignSettingsService.php'
    648652    ),
    649653    'SimplyBook\\Services\\LoginUrlService' => array(
    650         'version' => '3.0.0.0',
     654        'version' => '3.1.0.0',
    651655        'path'    => $baseDir . '/app/services/LoginUrlService.php'
    652656    ),
    653657    'SimplyBook\\Services\\RelatedPluginService' => array(
    654         'version' => '3.0.0.0',
     658        'version' => '3.1.0.0',
    655659        'path'    => $baseDir . '/app/services/RelatedPluginService.php'
    656660    ),
    657661    'SimplyBook\\Services\\StatisticsService' => array(
    658         'version' => '3.0.0.0',
     662        'version' => '3.1.0.0',
    659663        'path'    => $baseDir . '/app/services/StatisticsService.php'
    660664    ),
    661665    'SimplyBook\\Services\\SubscriptionDataService' => array(
    662         'version' => '3.0.0.0',
     666        'version' => '3.1.0.0',
    663667        'path'    => $baseDir . '/app/services/SubscriptionDataService.php'
    664668    ),
     669    'SimplyBook\\Services\\WidgetTrackingService' => array(
     670        'version' => '3.1.0.0',
     671        'path'    => $baseDir . '/app/services/WidgetTrackingService.php'
     672    ),
    665673    'SimplyBook\\Traits\\HasAllowlistControl' => array(
    666         'version' => '3.0.0.0',
     674        'version' => '3.1.0.0',
    667675        'path'    => $baseDir . '/app/traits/HasAllowlistControl.php'
    668676    ),
    669677    'SimplyBook\\Traits\\HasNonces' => array(
    670         'version' => '3.0.0.0',
     678        'version' => '3.1.0.0',
    671679        'path'    => $baseDir . '/app/traits/HasNonces.php'
    672680    ),
    673681    'SimplyBook\\Traits\\HasRestAccess' => array(
    674         'version' => '3.0.0.0',
     682        'version' => '3.1.0.0',
    675683        'path'    => $baseDir . '/app/traits/HasRestAccess.php'
    676684    ),
    677685    'SimplyBook\\Traits\\HasUserAccess' => array(
    678         'version' => '3.0.0.0',
     686        'version' => '3.1.0.0',
    679687        'path'    => $baseDir . '/app/traits/HasUserAccess.php'
    680688    ),
    681689    'SimplyBook\\Traits\\HasViews' => array(
    682         'version' => '3.0.0.0',
     690        'version' => '3.1.0.0',
    683691        'path'    => $baseDir . '/app/traits/HasViews.php'
    684692    ),
    685693    'SimplyBook\\Traits\\LegacyHelper' => array(
    686         'version' => '3.0.0.0',
     694        'version' => '3.1.0.0',
    687695        'path'    => $baseDir . '/app/traits/LegacyHelper.php'
    688696    ),
    689697    'SimplyBook\\Traits\\LegacyLoad' => array(
    690         'version' => '3.0.0.0',
     698        'version' => '3.1.0.0',
    691699        'path'    => $baseDir . '/app/traits/LegacyLoad.php'
    692700    ),
    693701    'SimplyBook\\Traits\\LegacySave' => array(
    694         'version' => '3.0.0.0',
     702        'version' => '3.1.0.0',
    695703        'path'    => $baseDir . '/app/traits/LegacySave.php'
    696704    ),
    697705    'SimplyBook\\Utility\\StringUtility' => array(
    698         'version' => '3.0.0.0',
     706        'version' => '3.1.0.0',
    699707        'path'    => $baseDir . '/app/support/utility/StringUtility.php'
    700708    ),
  • simplybook/tags/3.1.0/vendor/composer/jetpack_autoload_filemap.php

    r3297362 r3313046  
    2828    ),
    2929    '5bc9c041796e4348fc427e9381e014b6' => array(
    30         'version' => '3.0.0.0',
     30        'version' => '3.1.0.0',
    3131        'path'    => $baseDir . '/app/App.php'
    3232    ),
    3333    '2fd0677d8d23e6e7b0156d2f7d3368d4' => array(
    34         'version' => '3.0.0.0',
     34        'version' => '3.1.0.0',
    3535        'path'    => $baseDir . '/app/Plugin.php'
    3636    ),
    3737    'dac67ee3b45b7fdd52cfb86981c8c3d0' => array(
    38         'version' => '3.0.0.0',
     38        'version' => '3.1.0.0',
    3939        'path'    => $baseDir . '/helpers.php'
    4040    ),
  • simplybook/trunk/app/Plugin.php

    r3297362 r3313046  
    127127         * @deprecated 3.0.0 Use App::env('plugin.version') instead
    128128         */
    129         define('SIMPLYBOOK_VERSION', '3.0.0');
     129        define('SIMPLYBOOK_VERSION', '3.1.0');
    130130
    131131        /**
     
    193193            new Controllers\ServicesController(),
    194194            new Controllers\ReviewController(),
     195            new Controllers\WidgetTrackingController(
     196                new Services\WidgetTrackingService()
     197            ),
    195198        ]);
    196199    }
  • simplybook/trunk/app/controllers/DashboardController.php

    r3297362 r3313046  
    106106        wp_enqueue_style(
    107107            'simplybook-tailwind',
    108             App::env('plugin.react_url') . '/src/tailwind.generated.css',
     108            App::env('plugin.react_url') . '/build/tailwind.generated.css',
    109109            [],
    110110            ($chunkTranslation['version'] ?? '')
  • simplybook/trunk/app/features/Notifications/NotificationListener.php

    r3297362 r3313046  
    1919        add_action('simplybook_event_' . Event::AUTH_SUCCEEDED, [$this, 'handleSucceededAuthentication']);
    2020        add_action('simplybook_event_' . Event::CALENDAR_PUBLISHED, [$this, 'handleCalendarPublished']);
     21        add_action('simplybook_event_' . Event::CALENDAR_UNPUBLISHED, [$this, 'handleCalendarUnPublished']);
    2122        add_action('simplybook_event_' . Event::PUBLISH_WIDGET_TASK_DISMISSED, [$this, 'dismissPublishWidgetNotice']);
    2223    }
     
    5354
    5455    /**
     56     * Handle the calendar published event to update task status.
     57     */
     58    public function handleCalendarUnPublished(): void
     59    {
     60        $this->service->activate(
     61            Notices\PublishWidgetNotice::IDENTIFIER
     62        );
     63    }
     64
     65    /**
    5566     * Dismiss the publish-widget-notice.
    5667     */
  • simplybook/trunk/app/features/Onboarding/OnboardingController.php

    r3297362 r3313046  
    1111use SimplyBook\Interfaces\FeatureInterface;
    1212use SimplyBook\Exceptions\RestDataException;
     13use SimplyBook\Services\WidgetTrackingService;
    1314
    1415class OnboardingController implements FeatureInterface
    1516{
    1617    private OnboardingService $service;
    17 
    18     public function __construct(OnboardingService $service)
     18    private WidgetTrackingService $widgetService;
     19
     20    public function __construct(OnboardingService $service, WidgetTrackingService $widgetTrackingService)
    1921    {
    2022        $this->service = $service;
     23        $this->widgetService = $widgetTrackingService;
    2124    }
    2225
     
    238241        // These flags are deleted after its one time use in the Task and Notice
    239242        if ($pageCreatedSuccessfully) {
    240             $this->service->setPublishWidgetCompleted();
     243            $this->widgetService->setPublishWidgetCompleted();
    241244        }
    242245
     
    336339        $this->finishLoggingInUser($response, $companyDomain, $companyLogin);
    337340
    338         return new \WP_REST_Response([
    339             'message' => 'Successfully authenticated user',
    340         ], 200);
     341        return $this->service->sendHttpResponse([], true, esc_html__('Successfully authenticated user', 'simplybook')); // Default code 200 because React side still used request() here
    341342    }
    342343
     
    400401            );
    401402        } catch (\Exception $e) {
    402             return new \WP_REST_Response([
    403                 'message' => $e->getMessage(),
    404             ], 400);
    405         }
    406 
    407         return new \WP_REST_Response([
    408             'message' => 'Successfully requested SMS code',
    409         ], 200);
     403            return $this->service->sendHttpResponse([], false, $e->getMessage()); // Default code 200 because React side still used request() here
     404        }
     405
     406        return $this->service->sendHttpResponse([], true, esc_html__('Successfully requested SMS code', 'simplybook')); // Default code 200 because React side still used request() here
    410407    }
    411408
     
    449446     * or the Gutenberg block.
    450447     */
    451     public function validatePublishedWidget(): void
    452     {
    453         $cache = wp_cache_get('simplybook_widget_published', 'simplybook');
    454         if ($cache === true) {
    455             $this->service->setPublishWidgetCompleted();
    456             return;
    457         }
    458 
    459         global $wpdb;
    460 
    461         // Search for "simplybook widget" with a maximum of 1 character in
    462         // between. This will match both the shortcode ([simplybook_widget])
    463         // and the Gutenberg block (<!-- wp:simplybook/widget -->).
    464         $pattern = 'simplybook.{0,1}widget';
    465 
    466         // This direct SQL query is intentional, safe, and properly prepared.
    467         // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
    468         $query = $wpdb->prepare("
    469             SELECT 1
    470             FROM {$wpdb->posts}
    471             WHERE post_content REGEXP %s
    472             LIMIT 1
    473         ", $pattern);
    474 
    475         $havePosts = (bool) $wpdb->get_var($query);
    476         if (!$havePosts) {
    477             return;
    478         }
    479 
    480         $this->service->setPublishWidgetCompleted();
    481         wp_cache_set('simplybook_widget_published', true, 'simplybook');
    482     }
     448    public function validatePublishedWidget(): void {
     449        $cache = wp_cache_get( 'simplybook_widget_published', 'simplybook' );
     450        if ( $cache === true ) {
     451            $this->widgetService->setPublishWidgetCompleted();
     452
     453            return;
     454        }
     455
     456        // Check if any widgets are currently published
     457        if ( $this->widgetService->hasTrackedPosts() ) {
     458            $this->widgetService->setPublishWidgetCompleted();
     459            wp_cache_set( 'simplybook_widget_published', true, 'simplybook' );
     460        }
     461    }
    483462}
  • simplybook/trunk/app/features/Onboarding/OnboardingService.php

    r3297362 r3313046  
    11<?php namespace SimplyBook\Features\Onboarding;
    22
     3use SimplyBook\App;
    34use SimplyBook\Http\ApiClient;
    45use SimplyBook\Helpers\Storage;
     
    3031        $this->setCompletedStep(5);
    3132        $this->clearTemporaryData();
     33
     34        App::provide('client')->clearFailedAuthenticationFlag();
    3235
    3336        $completedPreviously = get_option('simplybook_onboarding_completed', false);
     
    174177    }
    175178
    176     /**
    177      * Use this method to set the "publish widget" notice and task as completed.
    178      * These flags are deleted after its one time use in the Task and Notice.
    179      */
    180     public function setPublishWidgetCompleted(bool $completed = true): void
    181     {
    182         update_option('simplybook_calendar_published_notification_completed', $completed);
    183         update_option('simplybook_calendar_published_task_completed', $completed);
    184     }
    185179}
  • simplybook/trunk/app/features/TaskManagement/TaskManagementListener.php

    r3297362 r3313046  
    2525        add_action('simplybook_event_' . Event::AUTH_FAILED, [$this, 'handleFailedAuthentication']);
    2626        add_action('simplybook_event_' . Event::CALENDAR_PUBLISHED, [$this, 'handleCalendarPublished']);
     27        add_action('simplybook_event_' . Event::CALENDAR_UNPUBLISHED, [$this, 'handleCalendarUnPublished']);
    2728        add_action('simplybook_save_design_settings', [$this, 'handleDesignSettingsSaved']);
    2829    }
     
    254255
    255256    /**
     257     * Handle the calendar published event to update task status.
     258     */
     259    public function handleCalendarUnPublished(): void
     260    {
     261        $this->service->flagTaskUrgent(
     262            Tasks\PublishWidgetTask::IDENTIFIER
     263        );
     264    }
     265
     266    /**
    256267     * Handle the after save options event to update task status.
    257268     */
  • simplybook/trunk/app/http/ApiClient.php

    r3297362 r3313046  
    77
    88use Carbon\Carbon;
     9use SimplyBook\App;
    910use SimplyBook\Helpers\Event;
    1011use SimplyBook\Helpers\Storage;
     
    117118
    118119    /**
     120     * Clear the authentication failed flag. This is used when the user has
     121     * successfully authenticated again. Currently used after successfully
     122     * logging in with the sign in modal.
     123     */
     124    public function clearFailedAuthenticationFlag(): void
     125    {
     126        $this->authenticationFailedFlag = false;
     127        delete_option($this->authenticationFailedFlagKey);
     128    }
     129
     130    /**
    119131     * Set the during onboarding flag
    120132     */
     
    232244        $headers = array(
    233245            'Content-Type'  => 'application/json',
     246            'User-Agent' => $this->getRequestUserAgent(),
    234247        );
    235248
     
    244257                        $this->refresh_token('admin');
    245258                        break;
    246                     case 'user':
    247                         $this->get_user_token();
    248                         break;
    249259                }
    250260                $token = $this->get_token($token_type);
     
    268278            $type = $type . '_refresh';
    269279        }
    270         $token = get_option("simplybook_token_" . esc_sql($type), '');
     280        $token = get_option("simplybook_token_" . $type, '');
    271281
    272282        return $this->decrypt_string($token);
     
    432442    private function automaticAuthenticationFallback(string $type)
    433443    {
    434         if ($this->authenticationFailedFlag) {
     444        // Company login can be empty for fresh accounts
     445        if ($this->authenticationFailedFlag || empty($this->get_company_login(false))) {
    435446            $this->releaseRefreshLock($type);
    436             return; // Dont even try again.
     447            return; // Dont even try (again).
    437448        }
    438449
     
    518529     * @return string
    519530     */
    520     public function get_company_login(): string {
     531    public function get_company_login(bool $create = true): string
     532    {
    521533        $login = get_option('simplybook_company_login', '');
    522534        if ( !empty($login) ) {
    523535            return $login;
     536        }
     537
     538        if ($create === false) {
     539            return ''; // Abort
    524540        }
    525541
     
    675691                    'journey_type' => 'skip_welcome_tour',
    676692                    'callback_url' => get_rest_url(get_current_blog_id(),"simplybook/v1/company_registration/$callback_url"),
     693                    'ref' => $this->getReferrer(),
    677694                ]
    678695            ),
     
    16081625    }
    16091626
     1627    /**
     1628     *
     1629     * \EXTENDIFY_PARTNER_ID will contain the required value if WordPress is
     1630     * configured using Extendify. Otherwise, use default 'wp'.
     1631     */
     1632    private function getReferrer(): string
     1633    {
     1634        return (defined('\EXTENDIFY_PARTNER_ID') ? \EXTENDIFY_PARTNER_ID : 'wp');
     1635    }
     1636
     1637    /**
     1638     * Get the user agent for the API requests.
     1639     *
     1640     * @example format SimplyBookPlugin/3.2.1 (WordPress/6.5.3; ref:
     1641     * EXTENDIFY_PARTNER_ID; +https://example.com)
     1642     */
     1643    private function getRequestUserAgent(): string
     1644    {
     1645        return "SimplyBookPlugin/" . App::env('plugin.version') . " (WordPress/" . get_bloginfo('version') . "; ref: " . $this->getReferrer() . "; +" . site_url() . ")";
     1646    }
     1647
    16101648}
  • simplybook/trunk/app/support/builders/WidgetScriptBuilder.php

    r3297362 r3313046  
    5151        }
    5252
    53         if ($this->isAuthenticated === false) {
     53        if ($this->showDemoWidget()) {
    5454            return $this->getDemoWidgetAlert() . $script;
    5555        }
     
    194194        $content = '';
    195195
    196         if ($this->isAuthenticated === false) {
     196        if ($this->showDemoWidget()) {
    197197            $content = $this->getDemoWidgetAlert();
    198198        }
     
    221221        }
    222222
    223         if (empty($widgetSettings['server'])) {
     223        if ($this->showDemoWidget($widgetSettings)) {
    224224            $widgetSettings['server'] = $this->getDemoWidgetServerUrl();
    225225        }
     
    258258    }
    259259
     260    /**
     261     * The demo widget should be shown if the server URL is not set in the
     262     * widget settings. This is used to display a demo widget when the
     263     * plugin is not configured yet.
     264     *
     265     * @internal The widget works even when the plugin lost connection to the
     266     * SimplyBook account of the user so that is not a condition to show the
     267     * demo widget.
     268     */
     269    public function showDemoWidget(?array $widgetSettings = null): bool
     270    {
     271        $widgetSettings = $widgetSettings ?? $this->widgetSettings;
     272        return empty($widgetSettings['server']);
     273    }
     274
    260275}
  • simplybook/trunk/app/support/helpers/Event.php

    r3297362 r3313046  
    2424    const AUTH_SUCCEEDED = 'auth_succeeded';
    2525    const CALENDAR_PUBLISHED = 'calendar_published';
     26    const CALENDAR_UNPUBLISHED = 'calendar_unpublished';
    2627    const PUBLISH_WIDGET_TASK_DISMISSED = 'publish_widget_task_dismissed';
    2728
  • simplybook/trunk/app/traits/LegacyHelper.php

    r3297362 r3313046  
    101101
    102102    /**
    103      * Encrypt data
    104      * @param $string
    105      * @return string
     103     * Encrypts a token using AES-256-CBC encryption with a version marker.
     104     *
     105     * This function encrypts a token string using AES-256-CBC with a random
     106     * initialization vector (IV). New tokens use the "v2:" format which separates
     107     * the IV and encrypted data with a period for better clarity.
     108     *
     109     * @param string $string The token to encrypt (should be a 64-character hex string).
     110     * @return string The encrypted token with format "v2:base64(iv).base64(encrypted)".
     111     *
     112     * @since 3.1 Uses v2 format with OPENSSL_RAW_DATA
     113     * @example
     114     * $token = "a1b2c3d4e5f6..."; // 64-character hex string
     115     * $encrypted = encrypt_string($token); // Returns "v2:abc123.xyz789"
    106116     */
    107117    public function encrypt_string($string): string
     
    112122        $iv = openssl_random_pseudo_bytes($ivLength);
    113123
    114         $encrypted = openssl_encrypt($string, 'AES-256-CBC', $key, 0, $iv);
     124        // Use OPENSSL_RAW_DATA for new v2 tokens
     125        $encrypted = openssl_encrypt($string, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
    115126
    116         return base64_encode($iv . $encrypted);
     127        // Format: v2:base64(iv).base64(encrypted)
     128        return 'v2:' . base64_encode($iv) . '.' . base64_encode($encrypted);
    117129    }
    118130
  • simplybook/trunk/app/traits/LegacyLoad.php

    r3297362 r3313046  
    33
    44use SimplyBook\App;
     5use SimplyBook\Traits\LegacyHelper;
    56
    67if ( ! defined( 'ABSPATH' ) ) {
     
    99100    }
    100101
    101     /**
    102      * Decrypt a string
    103      * @param $encrypted_string
    104      * @return string
    105      */
    106     public function decrypt_string($encrypted_string): string
    107     {
    108         $key = '7*w$9pumLw5koJc#JT6';
    109         $data = base64_decode($encrypted_string);
    110         $ivLength = openssl_cipher_iv_length('AES-256-CBC');
    111         $iv = substr($data, 0, $ivLength);
    112         $encrypted = substr($data, $ivLength);
    113 
    114         return openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv);
    115     }
     102
     103    /**
     104     * Decrypts an encrypted token string with backward compatibility support.
     105     *
     106     * This function acts as a dispatcher that automatically detects the token format
     107     * and delegates to the appropriate decryption method:
     108     * - V2 format: "v2:base64(iv).base64(encrypted)"
     109     * - Legacy format: base64(iv + encrypted)
     110     *
     111     * @param string $encrypted_string The encrypted token to decrypt.
     112     * @return string The decrypted token if valid, or an empty string if invalid.
     113     *
     114     * @since 3.1 Added support for v2 format with OPENSSL_RAW_DATA
     115     * @example
     116     * $decrypted = decrypt_string("v2: abc123.xyz789"); // Returns the original token
     117     * $decrypted = decrypt_string("legacy_encrypted_data"); // Also works with old tokens
     118     */
     119    public function decrypt_string($encrypted_string): string
     120    {
     121
     122        if (empty($encrypted_string)) {
     123            return '';
     124        }
     125
     126        $key = '7*w$9pumLw5koJc#JT6';
     127
     128        // Check if it's a v2 token (new format)
     129        if (strpos($encrypted_string, 'v2:') === 0) {
     130            return $this->decrypt_string_v2($encrypted_string, $key);
     131        }
     132
     133        return $this->decrypt_legacy_string($encrypted_string, $key);
     134    }
     135
     136    /**
     137     * Decrypts a v2 format encrypted token.
     138     *
     139     * V2 tokens use the format "v2:base64(iv).base64(encrypted)" and employ
     140     * an OPENSSL_RAW_DATA flag for decryption. This format separates the IV and
     141     * ciphertext with base64 encoding for each component.
     142     *
     143     * @param string $encrypted_string The v2 format encrypted token (prefixed with "v2:").
     144     * @return string The decrypted token if valid, or an empty string if decryption fails.
     145     *
     146     * @since 3.1
     147     */
     148    private function decrypt_string_v2(string $encrypted_string, string $key): string {
     149        $parts = explode('.', substr($encrypted_string, 3), 2);
     150        if (count($parts) !== 2) {
     151            $this->log("v2 token: invalid format — missing iv or ciphertext part.");
     152            return '';
     153        }
     154
     155        $iv = base64_decode($parts[0], true);
     156        $encrypted = base64_decode($parts[1], true);
     157
     158        if ($iv === false || $encrypted === false) {
     159            $this->log("v2 token: base64 decode failed (iv: " . ($iv === false ? 'invalid' : 'ok') . ", encrypted: " . ($encrypted === false ? 'invalid' : 'ok') . ")");
     160            return '';
     161        }
     162
     163        $decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
     164
     165        if ($decrypted === false) {
     166            $this->log("v2 token: openssl decryption failed.");
     167            return '';
     168        }
     169
     170        if (!preg_match('/^[a-f0-9]{64}$/i', $decrypted)) {
     171            $this->log("v2 token: decrypted result did not match expected 64-character hex format.");
     172            return '';
     173        }
     174
     175        return $decrypted;
     176    }
     177
     178    /**
     179     * Decrypts a legacy format encrypted token.
     180     *
     181     * Legacy tokens use the format base64(iv + encrypted) where the IV and
     182     * ciphertext are concatenated before base64 encoding. This method includes
     183     * fallback logic for double base64 encoding scenarios and uses flag=0
     184     * for OpenSSL decryption.
     185     *
     186     * @param string $encrypted_string The legacy format encrypted token.
     187     * @return string The decrypted token if valid, or an empty string if decryption fails.
     188     *
     189     * @since 3.1
     190     */
     191    private function decrypt_legacy_string(string $encrypted_string, string $key): string {
     192        // Legacy tokens
     193        $data = base64_decode($encrypted_string, true);
     194        $ivLength = openssl_cipher_iv_length('AES-256-CBC');
     195
     196        if ($data === false || strlen($data) < $ivLength) {
     197            $this->log("legacy token: decoded data too short, trying double base64 decoding...");
     198
     199            $data = base64_decode($data, true);
     200
     201            if ($data === false || strlen($data) < $ivLength) {
     202                $this->log("legacy token: double base64 decoding failed or still too short (length: " . strlen($data) . ").");
     203                return '';
     204            }
     205        }
     206
     207        $iv = substr($data, 0, $ivLength);
     208        $encrypted = substr($data, $ivLength);
     209
     210        $decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $key, 0, $iv);
     211
     212        if ($decrypted === false) {
     213            $this->log("legacy token: openssl decryption failed.");
     214            return '';
     215        }
     216
     217        if (!preg_match('/^[a-f0-9]{64}$/i', $decrypted)) {
     218            $this->log("legacy token: decrypted result did not match expected 64-character hex format.");
     219            return '';
     220        }
     221
     222        return $decrypted;
     223    }
     224
    116225
    117226    /**
  • simplybook/trunk/assets/languages/simplybook.pot

    r3297362 r3313046  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: SimplyBook.me - Booking and reservations calendar 3.0.0\n"
     5"Project-Id-Version: SimplyBook.me - Booking and reservations calendar 3.1.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/simplybook\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2025-05-20T10:58:40+00:00\n"
     12"POT-Creation-Date: 2025-06-17T08:11:45+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.11.0\n"
     
    2222#. Plugin URI of the plugin
    2323#: simplybook.php
    24 msgid "https://help.simplybook.me/index.php/WordPress_plugn"
     24msgid "https://help.simplybook.me/index.php?title=WordPress_integration"
    2525msgstr ""
    2626
     
    4242#: app/controllers/AdminController.php:30
    4343#: react/build/107.js:1
    44 #: react/build/747.js:1
     44#: react/build/785.js:1
    4545#: react/src/components/Settings/SettingsMenu.jsx:16
    4646#: react/src/components/Settings/SettingsMenu.jsx:29
     
    131131msgstr ""
    132132
    133 #: app/features/Onboarding/OnboardingController.php:127
    134 #: app/features/Onboarding/OnboardingController.php:269
    135 #: app/features/Onboarding/OnboardingController.php:314
     133#: app/features/Onboarding/OnboardingController.php:130
     134#: app/features/Onboarding/OnboardingController.php:272
     135#: app/features/Onboarding/OnboardingController.php:317
    136136msgid "Please fill in all fields."
    137137msgstr ""
    138138
    139 #: app/features/Onboarding/OnboardingController.php:151
     139#: app/features/Onboarding/OnboardingController.php:154
    140140msgid "Please verify you're not a robot."
    141141msgstr ""
    142142
    143 #: app/features/Onboarding/OnboardingController.php:155
     143#: app/features/Onboarding/OnboardingController.php:158
    144144msgid "Please enter the confirmation code."
    145145msgstr ""
    146146
    147 #: app/features/Onboarding/OnboardingController.php:194
     147#: app/features/Onboarding/OnboardingController.php:197
    148148msgid "Something went wrong while saving the widget style settings. Please try again."
    149149msgstr ""
    150150
    151 #: app/features/Onboarding/OnboardingController.php:199
     151#: app/features/Onboarding/OnboardingController.php:202
    152152msgid "Successfully saved widget style settings"
    153153msgstr ""
    154154
    155 #: app/features/Onboarding/OnboardingController.php:225
     155#: app/features/Onboarding/OnboardingController.php:228
    156156msgid "Calendar page title should be available if you choose to generate this page."
    157157msgstr ""
    158158
    159 #: app/features/Onboarding/OnboardingController.php:291
    160 #: app/features/Onboarding/OnboardingController.php:333
     159#: app/features/Onboarding/OnboardingController.php:294
     160#: app/features/Onboarding/OnboardingController.php:336
    161161msgid "Unknown error occurred, please verify your credentials."
    162162msgstr ""
    163163
    164 #: app/features/Onboarding/OnboardingController.php:298
     164#: app/features/Onboarding/OnboardingController.php:301
    165165msgid "Login successful."
    166166msgstr ""
    167167
    168 #: app/features/Onboarding/OnboardingController.php:419
     168#: app/features/Onboarding/OnboardingController.php:341
     169msgid "Successfully authenticated user"
     170msgstr ""
     171
     172#: app/features/Onboarding/OnboardingController.php:406
     173msgid "Successfully requested SMS code"
     174msgstr ""
     175
     176#: app/features/Onboarding/OnboardingController.php:416
    169177msgid "Successfully finished onboarding!"
    170178msgstr ""
    171179
    172 #: app/features/Onboarding/OnboardingController.php:423
     180#: app/features/Onboarding/OnboardingController.php:420
    173181msgid "An error occurred while finishing the onboarding process"
    174182msgstr ""
    175183
     184#: app/features/Onboarding/OnboardingController.php:434
     185msgid "Successfully removed all previous data."
     186msgstr ""
     187
    176188#: app/features/Onboarding/OnboardingController.php:437
    177 msgid "Successfully removed all previous data."
    178 msgstr ""
    179 
    180 #: app/features/Onboarding/OnboardingController.php:440
    181189msgid "An error occurred while trying to remove previous data."
    182190msgstr ""
    183191
    184 #: app/features/Onboarding/OnboardingService.php:69
     192#: app/features/Onboarding/OnboardingService.php:72
    185193msgid "Please enter a valid email address and accept the terms and conditions"
    186194msgstr ""
     
    265273#: react/build/157.js:1
    266274#: react/build/182.js:1
    267 #: react/build/747.js:1
     275#: react/build/785.js:1
    268276#: react/build/792.js:1
    269277#: react/build/939.js:1
     
    292300msgstr ""
    293301
    294 #: app/http/ApiClient.php:619
    295 #: app/http/ApiClient.php:827
     302#: app/http/ApiClient.php:635
     303#: app/http/ApiClient.php:844
    296304msgid "You are not authorized to do this."
    297305msgstr ""
    298306
    299 #: app/http/ApiClient.php:625
     307#: app/http/ApiClient.php:641
    300308msgid "Too many attempts to register company, please try again in a minute."
    301309msgstr ""
    302310
    303 #: app/http/ApiClient.php:639
     311#: app/http/ApiClient.php:655
    304312msgid "Please fill in all company data."
    305313msgstr ""
    306314
    307 #: app/http/ApiClient.php:683
     315#: app/http/ApiClient.php:700
    308316msgid "Something went wrong while registering your company. Please try again."
    309317msgstr ""
    310318
    311 #: app/http/ApiClient.php:695
     319#: app/http/ApiClient.php:712
    312320msgid "Company successfully registered."
    313321msgstr ""
    314322
    315 #: app/http/ApiClient.php:728
     323#: app/http/ApiClient.php:745
    316324msgid "The company name is not allowed. Please change the company name."
    317325msgstr ""
    318326
    319 #: app/http/ApiClient.php:736
     327#: app/http/ApiClient.php:753
    320328msgid "Unknown error encountered while registering your company. Please try again."
    321329msgstr ""
    322330
    323 #: app/http/ApiClient.php:835
     331#: app/http/ApiClient.php:852
    324332msgid "Something went wrong, are you sure you started the company registration?"
    325333msgstr ""
    326334
    327 #: app/http/ApiClient.php:854
     335#: app/http/ApiClient.php:871
    328336msgid "Something went wrong while confirming your email. Please try again."
    329337msgstr ""
    330338
    331 #: app/http/ApiClient.php:862
     339#: app/http/ApiClient.php:879
    332340msgid "Email successfully confirmed."
    333341msgstr ""
    334342
    335 #: app/http/ApiClient.php:866
     343#: app/http/ApiClient.php:883
    336344msgid "Unknown error encountered while confirming your email. Please try again."
    337345msgstr ""
    338346
    339 #: app/http/ApiClient.php:868
     347#: app/http/ApiClient.php:885
    340348msgid "This confirmation code is not valid."
    341349msgstr ""
    342350
    343 #: app/http/ApiClient.php:1367
     351#: app/http/ApiClient.php:1384
    344352msgid "Failed logging in, please verify your credentials."
    345353msgstr ""
    346354
    347 #: app/http/ApiClient.php:1370
     355#: app/http/ApiClient.php:1387
    348356msgid "Unknown error"
    349357msgstr ""
    350358
    351 #: app/http/ApiClient.php:1376
     359#: app/http/ApiClient.php:1393
    352360msgid "Login failed! Please try again later."
    353361msgstr ""
    354362
    355 #: app/http/ApiClient.php:1379
     363#: app/http/ApiClient.php:1396
    356364msgid "Invalid response from SimplyBook.me"
    357365msgstr ""
    358366
    359 #: app/http/ApiClient.php:1427
     367#: app/http/ApiClient.php:1444
    360368msgid "Failed two factor authentication, please verify your credentials."
    361369msgstr ""
    362370
    363 #: app/http/ApiClient.php:1430
     371#: app/http/ApiClient.php:1447
    364372msgid "Unknown 2FA error"
    365373msgstr ""
    366374
    367 #: app/http/ApiClient.php:1437
     375#: app/http/ApiClient.php:1454
    368376msgid "Two factor authentication failed! Please try again later."
    369377msgstr ""
    370378
    371 #: app/http/ApiClient.php:1440
     379#: app/http/ApiClient.php:1457
    372380msgid "Invalid 2FA response from SimplyBook.me"
    373381msgstr ""
    374382
    375 #: app/http/ApiClient.php:1508
     383#: app/http/ApiClient.php:1525
    376384#: react/build/843.js:1
    377385#: react/src/components/Modals/SignInModal.jsx:15
     
    379387msgstr ""
    380388
    381 #: app/http/ApiClient.php:1509
     389#: app/http/ApiClient.php:1526
    382390msgid "SMS"
    383391msgstr ""
    384392
    385 #: app/http/ApiClient.php:1515
     393#: app/http/ApiClient.php:1532
    386394msgid "Unknown 2FA provider"
    387395msgstr ""
     
    14291437
    14301438#: config/fields/design.php:12
    1431 #: config/fields/design.php:152
     1439#: config/fields/design.php:161
    14321440msgid "Flexible"
    14331441msgstr ""
    14341442
    14351443#: config/fields/design.php:13
    1436 #: config/fields/design.php:150
     1444#: config/fields/design.php:159
    14371445msgid "Modern"
    14381446msgstr ""
    14391447
    14401448#: config/fields/design.php:14
    1441 #: config/fields/design.php:148
     1449#: config/fields/design.php:157
    14421450msgid "Flexible weekly"
    14431451msgstr ""
    14441452
    14451453#: config/fields/design.php:15
    1446 #: config/fields/design.php:153
     1454#: config/fields/design.php:162
    14471455msgid "Slots weekly"
    14481456msgstr ""
    14491457
    14501458#: config/fields/design.php:16
    1451 #: config/fields/design.php:156
     1459#: config/fields/design.php:165
    14521460msgid "Modern Provider"
    14531461msgstr ""
    14541462
    14551463#: config/fields/design.php:17
    1456 #: config/fields/design.php:149
     1464#: config/fields/design.php:158
    14571465msgid "Flexible Provider"
    14581466msgstr ""
    14591467
    14601468#: config/fields/design.php:18
    1461 #: config/fields/design.php:154
     1469#: config/fields/design.php:163
    14621470msgid "Weekly classes"
    14631471msgstr ""
     
    14841492
    14851493#. translators: %s - IS or IS NOT
    1486 #: config/fields/design.php:45
     1494#: config/fields/design.php:46
    14871495msgid "When selected, writing starts from the right of the page and continues to the left, proceeding from top to bottom for new lines. Your website %s set to RTL."
    14881496msgstr ""
    14891497
    1490 #: config/fields/design.php:56
     1498#: config/fields/design.php:59
    14911499msgid "Allow switch to ADA"
    14921500msgstr ""
    14931501
    1494 #: config/fields/design.php:57
     1502#: config/fields/design.php:61
    14951503msgid "This adds a button to enable accessibility mode, which increases contrast for visitors with a visual disability."
    14961504msgstr ""
    14971505
    1498 #: config/fields/design.php:66
     1506#: config/fields/design.php:73
     1507msgid "Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones."
     1508msgstr ""
     1509
     1510#: config/fields/design.php:76
    14991511msgid "Clear the session of each widget initialization"
    15001512msgstr ""
    15011513
    1502 #: config/fields/design.php:67
    1503 msgid "Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones."
    1504 msgstr ""
    1505 
    1506 #: config/fields/design.php:144
     1514#: config/fields/design.php:153
    15071515msgid "Theme"
    15081516msgstr ""
    15091517
    1510 #: config/fields/design.php:151
     1518#: config/fields/design.php:160
    15111519msgid "Default"
    15121520msgstr ""
    15131521
    1514 #: config/fields/design.php:155
     1522#: config/fields/design.php:164
    15151523msgid "Daily classes"
    15161524msgstr ""
    15171525
    1518 #: config/fields/design.php:157
     1526#: config/fields/design.php:166
    15191527msgid "As slots"
    15201528msgstr ""
    15211529
    1522 #: config/fields/design.php:158
     1530#: config/fields/design.php:167
    15231531msgid "As table"
    15241532msgstr ""
    15251533
    1526 #: config/fields/design.php:159
     1534#: config/fields/design.php:168
    15271535msgid "Block"
    15281536msgstr ""
    15291537
    1530 #: config/fields/design.php:160
     1538#: config/fields/design.php:169
    15311539msgid "List"
    15321540msgstr ""
    15331541
    1534 #: config/fields/design.php:161
     1542#: config/fields/design.php:170
    15351543msgid "Single page"
    15361544msgstr ""
    15371545
    1538 #: config/fields/design.php:162
     1546#: config/fields/design.php:171
    15391547msgid "Display calendar"
    15401548msgstr ""
    15411549
    1542 #: config/fields/design.php:163
     1550#: config/fields/design.php:172
    15431551msgid "Base theme color"
    15441552msgstr ""
    15451553
    1546 #: config/fields/design.php:164
     1554#: config/fields/design.php:173
    15471555msgid "Show only available time"
    15481556msgstr ""
    15491557
    1550 #: config/fields/design.php:165
     1558#: config/fields/design.php:174
    15511559msgid "Hide unavailable days on calendar"
    15521560msgstr ""
    15531561
    1554 #: config/fields/design.php:166
     1562#: config/fields/design.php:175
    15551563msgid "Display calendar layout sidebar"
    15561564msgstr ""
    15571565
    1558 #: config/fields/design.php:167
     1566#: config/fields/design.php:176
    15591567msgid "Image scale mode"
    15601568msgstr ""
     
    15621570#: config/fields/providers.php:13
    15631571#: config/menus.php:24
    1564 #: react/build/747.js:1
     1572#: react/build/785.js:1
    15651573msgid "Service Providers"
    15661574msgstr ""
     
    16091617
    16101618#: config/menus.php:69
    1611 #: react/build/747.js:1
     1619#: react/build/785.js:1
    16121620msgid "Bookings"
    16131621msgstr ""
     
    17751783#: react/build/157.js:1
    17761784#: react/build/182.js:1
    1777 #: react/build/747.js:1
     1785#: react/build/785.js:1
    17781786#: react/build/792.js:1
    17791787#: react/build/843.js:1
     
    17871795#: react/build/157.js:1
    17881796#: react/build/182.js:1
    1789 #: react/build/747.js:1
     1797#: react/build/785.js:1
    17901798#: react/build/792.js:1
    17911799#: react/build/843.js:1
     
    17991807#: react/build/157.js:1
    18001808#: react/build/182.js:1
    1801 #: react/build/747.js:1
     1809#: react/build/785.js:1
    18021810#: react/build/792.js:1
    18031811#: react/build/843.js:1
     
    18661874#: react/build/157.js:1
    18671875#: react/build/182.js:1
    1868 #: react/build/747.js:1
     1876#: react/build/785.js:1
    18691877#: react/build/792.js:1
    18701878#: react/build/939.js:1
     
    19221930#: react/build/792.js:1
    19231931#: react/build/939.js:1
    1924 #: react/src/components/Fields/AuthenticationField.jsx:68
    1925 #: react/src/components/Fields/AuthenticationField.jsx:71
     1932#: react/src/components/Fields/AuthenticationField.jsx:67
     1933#: react/src/components/Fields/AuthenticationField.jsx:70
    19261934msgid "Log out"
    19271935msgstr ""
     
    19771985#: react/build/843.js:1
    19781986#: react/build/939.js:1
    1979 #: react/src/components/Modals/Partials/FormLogin.jsx:177
     1987#: react/src/components/Modals/Partials/FormLogin.jsx:196
     1988#: react/src/components/Modals/Partials/FormTwoFa.jsx:152
    19801989#: react/src/components/Onboarding/OnboardingStep.jsx:206
    19811990msgid "Something went wrong"
     
    19962005#: react/build/157.js:1
    19972006#: react/build/182.js:1
    1998 #: react/build/747.js:1
     2007#: react/build/785.js:1
    19992008#: react/build/792.js:1
    20002009#: react/build/843.js:1
     
    20092018#: react/build/157.js:1
    20102019#: react/build/182.js:1
    2011 #: react/build/747.js:1
     2020#: react/build/785.js:1
    20122021#: react/build/792.js:1
    20132022#: react/build/843.js:1
     
    20222031#: react/build/157.js:1
    20232032#: react/build/182.js:1
    2024 #: react/build/747.js:1
     2033#: react/build/785.js:1
    20252034#: react/build/792.js:1
    20262035#: react/build/843.js:1
     
    20352044#: react/build/157.js:1
    20362045#: react/build/182.js:1
    2037 #: react/build/747.js:1
     2046#: react/build/785.js:1
    20382047#: react/build/792.js:1
    20392048#: react/build/843.js:1
     
    20482057#: react/build/157.js:1
    20492058#: react/build/182.js:1
    2050 #: react/build/747.js:1
     2059#: react/build/785.js:1
    20512060#: react/build/792.js:1
    20522061#: react/build/843.js:1
     
    20612070#: react/build/157.js:1
    20622071#: react/build/182.js:1
    2063 #: react/build/747.js:1
     2072#: react/build/785.js:1
    20642073#: react/build/792.js:1
    20652074#: react/build/843.js:1
     
    20742083#: react/build/157.js:1
    20752084#: react/build/182.js:1
    2076 #: react/build/747.js:1
     2085#: react/build/785.js:1
    20772086#: react/build/792.js:1
    20782087#: react/build/843.js:1
     
    20872096#: react/build/157.js:1
    20882097#: react/build/182.js:1
    2089 #: react/build/747.js:1
     2098#: react/build/785.js:1
    20902099#: react/build/792.js:1
    20912100#: react/build/843.js:1
     
    21002109#: react/build/157.js:1
    21012110#: react/build/182.js:1
    2102 #: react/build/747.js:1
     2111#: react/build/785.js:1
    21032112#: react/build/792.js:1
    21042113#: react/build/843.js:1
     
    21132122#: react/build/157.js:1
    21142123#: react/build/182.js:1
    2115 #: react/build/747.js:1
     2124#: react/build/785.js:1
    21162125#: react/build/792.js:1
    21172126#: react/build/843.js:1
     
    21262135#: react/build/157.js:1
    21272136#: react/build/182.js:1
    2128 #: react/build/747.js:1
     2137#: react/build/785.js:1
    21292138#: react/build/792.js:1
    21302139#: react/build/843.js:1
     
    21392148#: react/build/157.js:1
    21402149#: react/build/182.js:1
    2141 #: react/build/747.js:1
     2150#: react/build/785.js:1
    21422151#: react/build/792.js:1
    21432152#: react/build/843.js:1
     
    21522161#: react/build/157.js:1
    21532162#: react/build/182.js:1
    2154 #: react/build/747.js:1
     2163#: react/build/785.js:1
    21552164#: react/build/792.js:1
    21562165#: react/build/843.js:1
     
    21652174#: react/build/157.js:1
    21662175#: react/build/182.js:1
    2167 #: react/build/747.js:1
     2176#: react/build/785.js:1
    21682177#: react/build/792.js:1
    21692178#: react/build/843.js:1
     
    21782187#: react/build/157.js:1
    21792188#: react/build/182.js:1
    2180 #: react/build/747.js:1
     2189#: react/build/785.js:1
    21812190#: react/build/792.js:1
    21822191#: react/build/843.js:1
     
    21912200#: react/build/157.js:1
    21922201#: react/build/182.js:1
    2193 #: react/build/747.js:1
     2202#: react/build/785.js:1
    21942203#: react/build/792.js:1
    21952204#: react/build/843.js:1
     
    22042213#: react/build/157.js:1
    22052214#: react/build/182.js:1
    2206 #: react/build/747.js:1
     2215#: react/build/785.js:1
    22072216#: react/build/792.js:1
    22082217#: react/build/843.js:1
     
    22172226#: react/build/157.js:1
    22182227#: react/build/182.js:1
    2219 #: react/build/747.js:1
     2228#: react/build/785.js:1
    22202229#: react/build/792.js:1
    22212230#: react/build/843.js:1
     
    22302239#: react/build/157.js:1
    22312240#: react/build/182.js:1
    2232 #: react/build/747.js:1
     2241#: react/build/785.js:1
    22332242#: react/build/792.js:1
    22342243#: react/build/843.js:1
     
    22432252#: react/build/157.js:1
    22442253#: react/build/182.js:1
    2245 #: react/build/747.js:1
     2254#: react/build/785.js:1
    22462255#: react/build/792.js:1
    22472256#: react/build/843.js:1
     
    22562265#: react/build/157.js:1
    22572266#: react/build/182.js:1
    2258 #: react/build/747.js:1
     2267#: react/build/785.js:1
    22592268#: react/build/792.js:1
    22602269#: react/build/843.js:1
     
    22692278#: react/build/157.js:1
    22702279#: react/build/182.js:1
    2271 #: react/build/747.js:1
     2280#: react/build/785.js:1
    22722281#: react/build/792.js:1
    22732282#: react/build/843.js:1
     
    22822291#: react/build/157.js:1
    22832292#: react/build/182.js:1
    2284 #: react/build/747.js:1
     2293#: react/build/785.js:1
    22852294#: react/build/792.js:1
    22862295#: react/build/843.js:1
     
    22952304#: react/build/157.js:1
    22962305#: react/build/182.js:1
    2297 #: react/build/747.js:1
     2306#: react/build/785.js:1
    22982307#: react/build/792.js:1
    22992308#: react/build/843.js:1
     
    23082317#: react/build/157.js:1
    23092318#: react/build/182.js:1
    2310 #: react/build/747.js:1
     2319#: react/build/785.js:1
    23112320#: react/build/792.js:1
    23122321#: react/build/843.js:1
     
    23212330#: react/build/157.js:1
    23222331#: react/build/182.js:1
    2323 #: react/build/747.js:1
     2332#: react/build/785.js:1
    23242333#: react/build/792.js:1
    23252334#: react/build/843.js:1
     
    23342343#: react/build/157.js:1
    23352344#: react/build/182.js:1
    2336 #: react/build/747.js:1
     2345#: react/build/785.js:1
    23372346#: react/build/792.js:1
    23382347#: react/build/843.js:1
     
    23782387#: react/build/107.js:1
    23792388#: react/build/843.js:1
    2380 #: react/src/components/Modals/Partials/FormLogin.jsx:194
    2381 #: react/src/components/Modals/Partials/FormTwoFa.jsx:140
     2389#: react/src/components/Modals/Partials/FormLogin.jsx:213
     2390#: react/src/components/Modals/Partials/FormTwoFa.jsx:171
    23822391msgid "Close"
    23832392msgstr ""
     
    24232432
    24242433#: react/build/107.js:1
    2425 #: react/build/747.js:1
     2434#: react/build/785.js:1
    24262435msgid "Live Help"
    24272436msgstr ""
    24282437
    24292438#: react/build/107.js:1
    2430 #: react/build/747.js:1
     2439#: react/build/785.js:1
    24312440msgid "days left"
    24322441msgstr ""
    24332442
    24342443#: react/build/107.js:1
    2435 #: react/build/747.js:1
     2444#: react/build/785.js:1
    24362445msgid "Dashboard"
    24372446msgstr ""
    24382447
    24392448#: react/build/107.js:1
    2440 #: react/build/747.js:1
     2449#: react/build/785.js:1
    24412450msgid "Clients"
    24422451msgstr ""
    24432452
    24442453#: react/build/107.js:1
    2445 #: react/build/747.js:1
     2454#: react/build/785.js:1
    24462455msgid "Calendar"
    24472456msgstr ""
    24482457
    24492458#: react/build/107.js:1
    2450 #: react/build/747.js:1
     2459#: react/build/785.js:1
    24512460msgid "Help Center"
    24522461msgstr ""
    24532462
    24542463#: react/build/107.js:1
    2455 #: react/build/747.js:1
     2464#: react/build/785.js:1
    24562465msgid "is expired."
    24572466msgstr ""
     
    25212530msgstr ""
    25222531
    2523 #: react/build/747.js:1
     2532#: react/build/785.js:1
    25242533msgid "is expired"
    25252534msgstr ""
    25262535
    2527 #: react/build/747.js:1
     2536#: react/build/785.js:1
    25282537msgid "No tasks available."
    25292538msgstr ""
    25302539
    2531 #: react/build/747.js:1
     2540#: react/build/785.js:1
    25322541msgid "Loading tasks..."
    25332542msgstr ""
    25342543
    2535 #: react/build/747.js:1
     2544#: react/build/785.js:1
    25362545msgid "Progress"
    25372546msgstr ""
    25382547
    2539 #: react/build/747.js:1
     2548#: react/build/785.js:1
    25402549msgid "All tasks"
    25412550msgstr ""
    25422551
    2543 #: react/build/747.js:1
     2552#: react/build/785.js:1
    25442553msgid "Remaining tasks"
    25452554msgstr ""
    25462555
    2547 #: react/build/747.js:1
     2556#: react/build/785.js:1
    25482557msgid "You're all set! Great job!"
    25492558msgstr ""
    25502559
    2551 #: react/build/747.js:1
     2560#: react/build/785.js:1
    25522561msgid "You're on your way. You still have %s task open."
    25532562msgid_plural "You're on your way. You still have %s tasks open."
     
    25552564msgstr[1] ""
    25562565
    2557 #: react/build/747.js:1
     2566#: react/build/785.js:1
    25582567msgid "Not yet calculated..."
    25592568msgstr ""
    25602569
    2561 #: react/build/747.js:1
     2570#: react/build/785.js:1
    25622571msgid "Today"
    25632572msgstr ""
    25642573
    2565 #: react/build/747.js:1
     2574#: react/build/785.js:1
    25662575msgid "This week"
    25672576msgstr ""
    25682577
    2569 #: react/build/747.js:1
     2578#: react/build/785.js:1
    25702579msgid "Service Provider"
    25712580msgstr ""
    25722581
    2573 #: react/build/747.js:1
     2582#: react/build/785.js:1
    25742583msgid "Service"
    25752584msgstr ""
    25762585
    2577 #: react/build/747.js:1
     2586#: react/build/785.js:1
    25782587msgid "Most popular"
    25792588msgstr ""
    25802589
    2581 #: react/build/747.js:1
     2590#: react/build/785.js:1
    25822591msgid "Last 30 days"
    25832592msgstr ""
    25842593
    2585 #: react/build/747.js:1
     2594#: react/build/785.js:1
    25862595msgid "View Bookings"
    25872596msgstr ""
    25882597
    2589 #: react/build/747.js:1
     2598#: react/build/785.js:1
    25902599msgid "SMS Credits"
    25912600msgstr ""
    25922601
    2593 #: react/build/747.js:1
     2602#: react/build/785.js:1
    25942603msgid "SMS Gateway"
    25952604msgstr ""
    25962605
    2597 #: react/build/747.js:1
     2606#: react/build/785.js:1
    25982607msgid "Membership"
    25992608msgstr ""
    26002609
    2601 #: react/build/747.js:1
     2610#: react/build/785.js:1
    26022611msgid "Paid Events"
    26032612msgstr ""
    26042613
    2605 #: react/build/747.js:1
     2614#: react/build/785.js:1
    26062615msgid "Management"
    26072616msgstr ""
    26082617
    2609 #: react/build/747.js:1
     2618#: react/build/785.js:1
    26102619msgid "Tips & Tricks"
    26112620msgstr ""
    26122621
    2613 #: react/build/747.js:1
     2622#: react/build/785.js:1
    26142623msgid "View All"
    26152624msgstr ""
    26162625
    2617 #: react/build/747.js:1
     2626#: react/build/785.js:1
    26182627msgid "Installed"
    26192628msgstr ""
    26202629
    2621 #: react/build/747.js:1
     2630#: react/build/785.js:1
    26222631msgid "Install"
    26232632msgstr ""
    26242633
    2625 #: react/build/747.js:1
     2634#: react/build/785.js:1
    26262635msgid "Activate"
    26272636msgstr ""
    26282637
    2629 #: react/build/747.js:1
     2638#: react/build/785.js:1
    26302639msgid "Activating..."
    26312640msgstr ""
    26322641
    2633 #: react/build/747.js:1
     2642#: react/build/785.js:1
    26342643msgid "Downloading..."
    26352644msgstr ""
    26362645
    2637 #: react/build/747.js:1
     2646#: react/build/785.js:1
    26382647msgid "Other Plugins"
    26392648msgstr ""
    26402649
    2641 #: react/build/747.js:1
     2650#: react/build/785.js:1
    26422651msgid "Loading..."
    26432652msgstr ""
     
    26812690
    26822691#: react/build/843.js:1
    2683 #: react/src/components/Modals/Partials/FormTwoFa.jsx:78
     2692#: react/src/components/Modals/Partials/FormLogin.jsx:101
     2693#: react/src/components/Modals/Partials/FormTwoFa.jsx:53
     2694#: react/src/components/Modals/Partials/FormTwoFa.jsx:74
     2695msgid "An unknown error occurred, please try again."
     2696msgstr ""
     2697
     2698#: react/build/843.js:1
     2699#: react/src/components/Modals/Partials/FormTwoFa.jsx:61
     2700#: react/src/components/Modals/Partials/FormTwoFa.jsx:82
     2701msgid "An unknown error occurred. Please try again."
     2702msgstr ""
     2703
     2704#: react/build/843.js:1
     2705#: react/src/components/Modals/Partials/FormTwoFa.jsx:99
    26842706msgid "Select 2FA provider"
    26852707msgstr ""
    26862708
    26872709#: react/build/843.js:1
    2688 #: react/src/components/Modals/Partials/FormTwoFa.jsx:102
     2710#: react/src/components/Modals/Partials/FormTwoFa.jsx:123
    26892711msgid "Enter 2FA authentication code"
    26902712msgstr ""
    26912713
    26922714#: react/build/843.js:1
    2693 #: react/src/components/Modals/Partials/FormTwoFa.jsx:105
     2715#: react/src/components/Modals/Partials/FormTwoFa.jsx:126
    26942716msgid "Enter code"
    26952717msgstr ""
    26962718
    26972719#: react/build/843.js:1
    2698 #: react/src/components/Modals/Partials/FormTwoFa.jsx:122
     2720#: react/src/components/Modals/Partials/FormTwoFa.jsx:147
    26992721msgid "SMS Requested"
    27002722msgstr ""
    27012723
    27022724#: react/build/843.js:1
    2703 #: react/src/components/Modals/Partials/FormTwoFa.jsx:122
     2725#: react/src/components/Modals/Partials/FormTwoFa.jsx:147
    27042726msgid "Request SMS"
    27052727msgstr ""
    27062728
    27072729#: react/build/843.js:1
    2708 #: react/src/components/Modals/Partials/FormLogin.jsx:187
    2709 #: react/src/components/Modals/Partials/FormTwoFa.jsx:132
     2730#: react/src/components/Modals/Partials/FormLogin.jsx:206
     2731#: react/src/components/Modals/Partials/FormTwoFa.jsx:163
    27102732msgid "Submit"
    27112733msgstr ""
    27122734
    27132735#: react/build/843.js:1
    2714 #: react/src/components/Modals/Partials/FormLogin.jsx:116
     2736#: react/src/components/Modals/Partials/FormLogin.jsx:117
    27152737msgid "Company domain"
    27162738msgstr ""
    27172739
    27182740#: react/build/843.js:1
    2719 #: react/src/components/Modals/Partials/FormLogin.jsx:136
    2720 #: react/src/components/Modals/Partials/FormLogin.jsx:139
     2741#: react/src/components/Modals/Partials/FormLogin.jsx:137
     2742#: react/src/components/Modals/Partials/FormLogin.jsx:140
    27212743msgid "Company login"
    27222744msgstr ""
    27232745
    27242746#: react/build/843.js:1
    2725 #: react/src/components/Modals/Partials/FormLogin.jsx:152
    2726 #: react/src/components/Modals/Partials/FormLogin.jsx:155
     2747#: react/src/components/Modals/Partials/FormLogin.jsx:159
     2748#: react/src/components/Modals/Partials/FormLogin.jsx:162
    27272749msgid "User login or email"
    27282750msgstr ""
    27292751
    27302752#: react/build/843.js:1
    2731 #: react/src/components/Modals/Partials/FormLogin.jsx:168
    2732 #: react/src/components/Modals/Partials/FormLogin.jsx:171
     2753#: react/src/components/Modals/Partials/FormLogin.jsx:181
     2754#: react/src/components/Modals/Partials/FormLogin.jsx:184
    27332755msgid "Password"
    27342756msgstr ""
  • simplybook/trunk/composer.json

    r3297362 r3313046  
    11{
    22    "name": "really-simple-plugins/simplybookme",
    3     "version": "3.0.0",
     3    "version": "3.1.0",
    44    "description": "Online booking system plugin for service businesses that lets your customers schedule appointments and pay for your services on your Wordpress site.",
    55    "type": "wordpress-plugin",
  • simplybook/trunk/config/environment.php

    r3297362 r3313046  
    77    'plugin' => [
    88        'name' => 'SimplyBook.me',
    9         'version' => '3.0.0',
     9        'version' => '3.1.0',
    1010        'pro' => true,
    1111        'path' => dirname(__DIR__),
    12         'base_path' => dirname(__DIR__). '/' . plugin_basename(dirname(__DIR__)) . '.php',
    13         'assets_path' => dirname(__DIR__).'/assets/',
    14         'lang_path' => dirname(__DIR__).'/assets/languages/',
    15         'view_path' => dirname(__DIR__).'/app/views/',
    16         'feature_path' => dirname(__DIR__).'/app/features/',
    17         'react_path' => dirname(__DIR__).'/react',
     12        'base_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . plugin_basename(dirname(__DIR__)) . '.php',
     13        'assets_path' => dirname(__DIR__). DIRECTORY_SEPARATOR .'assets' . DIRECTORY_SEPARATOR,
     14        'lang_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'assets'. DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR,
     15        'view_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR,
     16        'feature_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'app' . DIRECTORY_SEPARATOR . 'features' . DIRECTORY_SEPARATOR,
     17        'react_path' => dirname(__DIR__). DIRECTORY_SEPARATOR . 'react',
    1818        'dir'  => plugin_basename(dirname(__DIR__)),
    19         'base_file' => plugin_basename(dirname(__DIR__)) . '/' . plugin_basename(dirname(__DIR__)) . '.php',
    20         'lang' => plugin_basename(dirname(__DIR__)) . '/assets/languages',
     19        'base_file' => plugin_basename(dirname(__DIR__)) . DIRECTORY_SEPARATOR . plugin_basename(dirname(__DIR__)) . '.php',
     20        'lang' => plugin_basename(dirname(__DIR__)) . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR . 'languages',
    2121        'url'  => plugin_dir_url(__DIR__),
    2222        'assets_url' => plugin_dir_url(__DIR__).'assets/',
     
    112112            ['key' => 'login:booking.lcn.uk', 'value' => 'login:booking.lcn.uk', 'label' => 'booking.lcn.uk'],
    113113            ['key' => 'login:booking.register365.ie', 'value' => 'login:booking.register365.ie', 'label' => 'booking.register365.ie'],
    114             ['key' => 'login:booking.register365.ie', 'value' => 'login:booking.register365.ie', 'label' => 'booking.register365.ie'],
    115114        ]
    116115    ],
  • simplybook/trunk/config/features.php

    r3297362 r3313046  
    1313        'dependencies' => [
    1414            'Service',
     15            '\SimplyBook\Services\WidgetTrackingService',
    1516        ],
    1617    ],
     
    2021        'pro' => false,
    2122        'priorityFiles' => [
    22             'Tasks/AbstractTask',
     23            'Tasks' . DIRECTORY_SEPARATOR . 'AbstractTask',
    2324        ],
    2425    ],
     
    2829        'pro' => false,
    2930        'priorityFiles' => [
    30             'Notices/AbstractNotice',
     31            'Notices' . DIRECTORY_SEPARATOR . 'AbstractNotice',
    3132        ],
    3233    ],
  • simplybook/trunk/config/fields/design.php

    r3297362 r3313046  
    4141            'type'     => 'checkbox',
    4242            'label'    => __('RTL', 'simplybook'),
    43             'help'     => sprintf(
    44                 /* translators: %s - IS or IS NOT */
    45                 __('When selected, writing starts from the right of the page and continues to the left, proceeding from top to bottom for new lines. Your website %s set to RTL.', 'simplybook'),
    46                 (is_rtl() ? 'IS' : 'IS NOT'),
    47             ),
     43            'tooltip'  => [
     44                'message' => sprintf(
     45                    /* translators: %s - IS or IS NOT */
     46                    __('When selected, writing starts from the right of the page and continues to the left, proceeding from top to bottom for new lines. Your website %s set to RTL.', 'simplybook'),
     47                    (is_rtl() ? 'IS' : 'IS NOT'),
     48                ),
     49                'type'    => 'info',
     50            ],
    4851            'disabled' => false,
    4952            'default'  => is_rtl(),
     
    5558            'type'     => 'checkbox',
    5659            'label'    => __('Allow switch to ADA', 'simplybook'),
    57             'help'     => __('This adds a button to enable accessibility mode, which increases contrast for visitors with a visual disability.', 'simplybook'),
     60            'tooltip'  => [
     61                'message' => __('This adds a button to enable accessibility mode, which increases contrast for visitors with a visual disability.', 'simplybook'),
     62                'type'    => 'info',
     63            ],
    5864            'disabled' => false,
    5965            'default'  => false,
     
    6470            'group_id' => 'main',
    6571            'type'     => 'checkbox',
     72            'tooltip'  => [
     73                'message' => __('Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones.', 'simplybook'),
     74                'type'    => 'info',
     75            ],
    6676            'label'    => __('Clear the session of each widget initialization', 'simplybook'),
    67             'help' => __('Useful for in-store tablets, so each customer can make a new appointment without data from earlier ones.', 'simplybook'),
    6877            'disabled' => false,
    6978            'default'  => true,
  • simplybook/trunk/config/fields/general.php

    r3297362 r3313046  
    1 
    21<?php
    32defined( 'ABSPATH' ) or die();
  • simplybook/trunk/config/related.php

    r3297362 r3313046  
    99            'slug' => 'really-simple-ssl',
    1010            'options_prefix' => 'rsssl',
    11             'activation_slug' => 'really-simple-ssl/rlrsssl-really-simple-ssl.php',
     11            'activation_slug' => 'really-simple-ssl' . DIRECTORY_SEPARATOR . 'rlrsssl-really-simple-ssl.php',
    1212            'constant_free' => 'rsssl_version',
    1313            'constant_premium' => 'rsssl_pro',
     
    2020            'slug' => 'complianz-gdpr',
    2121            'options_prefix' => 'cmplz',
    22             'activation_slug' => 'complianz-gdpr/complianz-gpdr.php',
     22            'activation_slug' => 'complianz-gdpr' . DIRECTORY_SEPARATOR . 'complianz-gpdr.php',
    2323            'constant_free' => 'cmplz_version',
    2424            'constant_premium' => 'cmplz_premium',
     
    3232            'slug' => 'complianz-terms-conditions',
    3333            'options_prefix' => 'cmplz_tc',
    34             'activation_slug' => 'complianz-terms-conditions/complianz-terms-conditions.php',
     34            'activation_slug' => 'complianz-terms-conditions' . DIRECTORY_SEPARATOR . 'complianz-terms-conditions.php',
    3535            'constant_free' => 'cmplz_tc_version',
    3636            'create' => admin_url('admin.php?page=terms-conditions'),
  • simplybook/trunk/readme.txt

    r3297401 r3313046  
    11=== SimplyBook.me - Booking and reservations calendar ===
    2 Contributors: simplybook, reallysimpleplugins, wimbraam, jeroenvdk
     2Contributors: simplybook, reallysimpleplugins, wimbraam, jeroenvdk, markwolters, rvvelthuijsen
    33Donate link: https://simplybook.me/
    44Tags: Booking, Calendar, Scheduling, Reservations, Appointments
     
    66Tested up to: 6.8
    77Requires PHP: 7.4
    8 Stable tag: 3.0.0
     8Stable tag: 3.1.0
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    4141
    4242SimplyBook.me is an advanced online booking system that creates a professional booking widget on your WordPress site where your clients can book your services at any time. You will then have access to an admin interface where you can manage your bookings and settings. On top of that you will get an admin app where you can manage all your bookings and accept payments on the go.Thousands of clients all over the world have selected our booking system to make their business easy and comfortable to use (see our testimonials). SimplyBook.me provides users with a broad range of features so that you can tailor the system to your needs, irrespective of what industry you are in.
    43 For a more detailed understanding of the SimplyBook.me service, you can explore at the following link:
    44 * <a href="https://simplybook.me/?ref=wordpress" rel="friend" title="SimplyBook" target="_blank">https://simplybook.me/?ref=wordpress</a>
     43For a more detailed understanding of the SimplyBook.me service, you can explore at the following link: <a href="https://simplybook.me/?ref=wordpress" rel="friend" title="SimplyBook" target="_blank">https://simplybook.me/</a>
    4544
    4645This plugin is developed by SimplyBook.me, is ISO27001 compliant and utilizes its API to transmit and store all information, including settings and details of bookings, as well as other personal client data, directly on SimplyBook.me. Before using the plugin, we recommend that you familiarize yourself with the privacy policy and terms of use of SimplyBook.me at the following links:
     
    6160Additionally, an online booking system offers powerful analytics that provide deep insights into customer behaviors and preferences. This data is essential for making informed adjustments to service offerings and planning effective marketing strategies. Last but not least it´s the best way to boost your sales by offering service add-ons and products for sale in the booking process, by sending tailored marketing email campaigns, offering coupons on less busy days, by prompting tips during check out and so much more, the options are endless!
    6261
    63 
    6462== Installation ==
    6563
    66 = <a href="https://help.simplybook.me/index.php/WordPress_integration" rel="friend" title="SimplyBook Wiki" target="_blank">Detailed instructions with photos here </a> =
     64= <a href="https://help.simplybook.me/index.php/WordPress_integration" rel="friend" title="SimplyBook Wiki" target="_blank">Detailed instructions with photos here</a> =
    6765
    6866
     
    9189
    9290== Changelog ==
     91= 3.1.0 =
     92* Added: markwolters and rvvelthuijsen are added as contributors.
     93* Added: Setting help texts are now shown in tooltips.
     94* Changed: Prompts to publish the widget now responds to user actions in posts.
     95* Changed: Removed unnecessary files to make the plugin package smaller.
     96* Removed: Duplicate domain option from sign-in dropdown.
     97* Fixed: Non-email usernames now accepted at login.
     98* Fixed: Console error in onboarding-start resolved.
     99* Fixed: Miscellaneous 2FA login console errors resolved.
     100* Fixed: Gutenberg block now registers correctly with API V2, resolving a console notice.
     101* Fixed: Error message now correctly shown when an invalid 2FA code is entered.
     102* Fixed: Demo widget notice now only appears when the loaded widget is actually a demo.
     103* Fixed: Unexpectedly losing connection with SimplyBook.me is now resolved.
    93104
    94105= 3.0.0 =
    95 * Major refactor of the plugin.
     106* Major refactor of the plugin by Really Simple Plugins.
     107* Added: reallysimpleplugins, wimbraam and jeroenvdk are added as contributors.
    96108
    97109= 2.3 =
  • simplybook/trunk/simplybook.php

    r3297362 r3313046  
    88 * @wordpress-plugin
    99 * Plugin Name: SimplyBook.me - Booking and reservations calendar
    10  * Plugin URI: https://help.simplybook.me/index.php/WordPress_plugn
     10 * Plugin URI: https://help.simplybook.me/index.php?title=WordPress_integration
    1111 * Description: Simply add a booking calendar to your site to schedule bookings, reservations, appointments and to collect payments.
    12  * Version: 3.0.0
     12 * Version: 3.1.0
    1313 * Requires at least: 6.0
    1414 * Requires PHP: 7.4
  • simplybook/trunk/vendor/composer/autoload_classmap.php

    r3297362 r3313046  
    113113    'SimplyBook\\Controllers\\SettingsController' => $baseDir . '/app/controllers/SettingsController.php',
    114114    'SimplyBook\\Controllers\\WidgetController' => $baseDir . '/app/controllers/WidgetController.php',
     115    'SimplyBook\\Controllers\\WidgetTrackingController' => $baseDir . '/app/controllers/WidgetTrackingController.php',
    115116    'SimplyBook\\Exceptions\\ApiException' => $baseDir . '/app/exceptions/ApiException.php',
    116117    'SimplyBook\\Exceptions\\BuilderException' => $baseDir . '/app/exceptions/BuilderException.php',
     
    160161    'SimplyBook\\Services\\StatisticsService' => $baseDir . '/app/services/StatisticsService.php',
    161162    'SimplyBook\\Services\\SubscriptionDataService' => $baseDir . '/app/services/SubscriptionDataService.php',
     163    'SimplyBook\\Services\\WidgetTrackingService' => $baseDir . '/app/services/WidgetTrackingService.php',
    162164    'SimplyBook\\Traits\\HasAllowlistControl' => $baseDir . '/app/traits/HasAllowlistControl.php',
    163165    'SimplyBook\\Traits\\HasNonces' => $baseDir . '/app/traits/HasNonces.php',
  • simplybook/trunk/vendor/composer/autoload_static.php

    r3297362 r3313046  
    253253        'SimplyBook\\Controllers\\SettingsController' => __DIR__ . '/../..' . '/app/controllers/SettingsController.php',
    254254        'SimplyBook\\Controllers\\WidgetController' => __DIR__ . '/../..' . '/app/controllers/WidgetController.php',
     255        'SimplyBook\\Controllers\\WidgetTrackingController' => __DIR__ . '/../..' . '/app/controllers/WidgetTrackingController.php',
    255256        'SimplyBook\\Exceptions\\ApiException' => __DIR__ . '/../..' . '/app/exceptions/ApiException.php',
    256257        'SimplyBook\\Exceptions\\BuilderException' => __DIR__ . '/../..' . '/app/exceptions/BuilderException.php',
     
    300301        'SimplyBook\\Services\\StatisticsService' => __DIR__ . '/../..' . '/app/services/StatisticsService.php',
    301302        'SimplyBook\\Services\\SubscriptionDataService' => __DIR__ . '/../..' . '/app/services/SubscriptionDataService.php',
     303        'SimplyBook\\Services\\WidgetTrackingService' => __DIR__ . '/../..' . '/app/services/WidgetTrackingService.php',
    302304        'SimplyBook\\Traits\\HasAllowlistControl' => __DIR__ . '/../..' . '/app/traits/HasAllowlistControl.php',
    303305        'SimplyBook\\Traits\\HasNonces' => __DIR__ . '/../..' . '/app/traits/HasNonces.php',
  • simplybook/trunk/vendor/composer/installed.php

    r3297362 r3313046  
    22    'root' => array(
    33        'name' => 'really-simple-plugins/simplybookme',
    4         'pretty_version' => '3.0.0',
    5         'version' => '3.0.0.0',
     4        'pretty_version' => '3.1.0',
     5        'version' => '3.1.0.0',
    66        'reference' => null,
    77        'type' => 'wordpress-plugin',
     
    6363        ),
    6464        'really-simple-plugins/simplybookme' => array(
    65             'pretty_version' => '3.0.0',
    66             'version' => '3.0.0.0',
     65            'pretty_version' => '3.1.0',
     66            'version' => '3.1.0.0',
    6767            'reference' => null,
    6868            'type' => 'wordpress-plugin',
  • simplybook/trunk/vendor/composer/jetpack_autoload_classmap.php

    r3297362 r3313046  
    424424    ),
    425425    'SimplyBook\\Builders\\CompanyBuilder' => array(
    426         'version' => '3.0.0.0',
     426        'version' => '3.1.0.0',
    427427        'path'    => $baseDir . '/app/support/builders/CompanyBuilder.php'
    428428    ),
    429429    'SimplyBook\\Builders\\PageBuilder' => array(
    430         'version' => '3.0.0.0',
     430        'version' => '3.1.0.0',
    431431        'path'    => $baseDir . '/app/support/builders/PageBuilder.php'
    432432    ),
    433433    'SimplyBook\\Builders\\WidgetScriptBuilder' => array(
    434         'version' => '3.0.0.0',
     434        'version' => '3.1.0.0',
    435435        'path'    => $baseDir . '/app/support/builders/WidgetScriptBuilder.php'
    436436    ),
    437437    'SimplyBook\\Controllers\\AdminController' => array(
    438         'version' => '3.0.0.0',
     438        'version' => '3.1.0.0',
    439439        'path'    => $baseDir . '/app/controllers/AdminController.php'
    440440    ),
    441441    'SimplyBook\\Controllers\\BlockController' => array(
    442         'version' => '3.0.0.0',
     442        'version' => '3.1.0.0',
    443443        'path'    => $baseDir . '/app/controllers/BlockController.php'
    444444    ),
    445445    'SimplyBook\\Controllers\\CapabilityController' => array(
    446         'version' => '3.0.0.0',
     446        'version' => '3.1.0.0',
    447447        'path'    => $baseDir . '/app/controllers/CapabilityController.php'
    448448    ),
    449449    'SimplyBook\\Controllers\\DashboardController' => array(
    450         'version' => '3.0.0.0',
     450        'version' => '3.1.0.0',
    451451        'path'    => $baseDir . '/app/controllers/DashboardController.php'
    452452    ),
    453453    'SimplyBook\\Controllers\\DesignSettingsController' => array(
    454         'version' => '3.0.0.0',
     454        'version' => '3.1.0.0',
    455455        'path'    => $baseDir . '/app/controllers/DesignSettingsController.php'
    456456    ),
    457457    'SimplyBook\\Controllers\\ReviewController' => array(
    458         'version' => '3.0.0.0',
     458        'version' => '3.1.0.0',
    459459        'path'    => $baseDir . '/app/controllers/ReviewController.php'
    460460    ),
    461461    'SimplyBook\\Controllers\\ScheduleController' => array(
    462         'version' => '3.0.0.0',
     462        'version' => '3.1.0.0',
    463463        'path'    => $baseDir . '/app/controllers/ScheduleController.php'
    464464    ),
    465465    'SimplyBook\\Controllers\\ServicesController' => array(
    466         'version' => '3.0.0.0',
     466        'version' => '3.1.0.0',
    467467        'path'    => $baseDir . '/app/controllers/ServicesController.php'
    468468    ),
    469469    'SimplyBook\\Controllers\\SettingsController' => array(
    470         'version' => '3.0.0.0',
     470        'version' => '3.1.0.0',
    471471        'path'    => $baseDir . '/app/controllers/SettingsController.php'
    472472    ),
    473473    'SimplyBook\\Controllers\\WidgetController' => array(
    474         'version' => '3.0.0.0',
     474        'version' => '3.1.0.0',
    475475        'path'    => $baseDir . '/app/controllers/WidgetController.php'
    476476    ),
     477    'SimplyBook\\Controllers\\WidgetTrackingController' => array(
     478        'version' => '3.1.0.0',
     479        'path'    => $baseDir . '/app/controllers/WidgetTrackingController.php'
     480    ),
    477481    'SimplyBook\\Exceptions\\ApiException' => array(
    478         'version' => '3.0.0.0',
     482        'version' => '3.1.0.0',
    479483        'path'    => $baseDir . '/app/exceptions/ApiException.php'
    480484    ),
    481485    'SimplyBook\\Exceptions\\BuilderException' => array(
    482         'version' => '3.0.0.0',
     486        'version' => '3.1.0.0',
    483487        'path'    => $baseDir . '/app/exceptions/BuilderException.php'
    484488    ),
    485489    'SimplyBook\\Exceptions\\RestDataException' => array(
    486         'version' => '3.0.0.0',
     490        'version' => '3.1.0.0',
    487491        'path'    => $baseDir . '/app/exceptions/RestDataException.php'
    488492    ),
    489493    'SimplyBook\\Exceptions\\SettingsException' => array(
    490         'version' => '3.0.0.0',
     494        'version' => '3.1.0.0',
    491495        'path'    => $baseDir . '/app/exceptions/SettingsException.php'
    492496    ),
    493497    'SimplyBook\\Helpers\\Event' => array(
    494         'version' => '3.0.0.0',
     498        'version' => '3.1.0.0',
    495499        'path'    => $baseDir . '/app/support/helpers/Event.php'
    496500    ),
    497501    'SimplyBook\\Helpers\\FeatureHelper' => array(
    498         'version' => '3.0.0.0',
     502        'version' => '3.1.0.0',
    499503        'path'    => $baseDir . '/app/support/helpers/FeatureHelper.php'
    500504    ),
    501505    'SimplyBook\\Helpers\\Request' => array(
    502         'version' => '3.0.0.0',
     506        'version' => '3.1.0.0',
    503507        'path'    => $baseDir . '/app/support/helpers/Request.php'
    504508    ),
    505509    'SimplyBook\\Helpers\\Storage' => array(
    506         'version' => '3.0.0.0',
     510        'version' => '3.1.0.0',
    507511        'path'    => $baseDir . '/app/support/helpers/Storage.php'
    508512    ),
    509513    'SimplyBook\\Helpers\\Uninstall' => array(
    510         'version' => '3.0.0.0',
     514        'version' => '3.1.0.0',
    511515        'path'    => $baseDir . '/app/support/helpers/Uninstall.php'
    512516    ),
    513517    'SimplyBook\\Http\\ApiClient' => array(
    514         'version' => '3.0.0.0',
     518        'version' => '3.1.0.0',
    515519        'path'    => $baseDir . '/app/http/ApiClient.php'
    516520    ),
    517521    'SimplyBook\\Http\\DTO\\ApiResponseDTO' => array(
    518         'version' => '3.0.0.0',
     522        'version' => '3.1.0.0',
    519523        'path'    => $baseDir . '/app/http/dto/ApiResponseDTO.php'
    520524    ),
    521525    'SimplyBook\\Http\\Endpoints\\BlockEndpoints' => array(
    522         'version' => '3.0.0.0',
     526        'version' => '3.1.0.0',
    523527        'path'    => $baseDir . '/app/http/endpoints/BlockEndpoints.php'
    524528    ),
    525529    'SimplyBook\\Http\\Endpoints\\CompanyRegistrationEndpoint' => array(
    526         'version' => '3.0.0.0',
     530        'version' => '3.1.0.0',
    527531        'path'    => $baseDir . '/app/http/endpoints/CompanyRegistrationEndpoint.php'
    528532    ),
    529533    'SimplyBook\\Http\\Endpoints\\DomainEndpoint' => array(
    530         'version' => '3.0.0.0',
     534        'version' => '3.1.0.0',
    531535        'path'    => $baseDir . '/app/http/endpoints/DomainEndpoint.php'
    532536    ),
    533537    'SimplyBook\\Http\\Endpoints\\LogOutEndpoint' => array(
    534         'version' => '3.0.0.0',
     538        'version' => '3.1.0.0',
    535539        'path'    => $baseDir . '/app/http/endpoints/LogOutEndpoint.php'
    536540    ),
    537541    'SimplyBook\\Http\\Endpoints\\LoginUrlEndpoint' => array(
    538         'version' => '3.0.0.0',
     542        'version' => '3.1.0.0',
    539543        'path'    => $baseDir . '/app/http/endpoints/LoginUrlEndpoint.php'
    540544    ),
    541545    'SimplyBook\\Http\\Endpoints\\ProvidersEndpoint' => array(
    542         'version' => '3.0.0.0',
     546        'version' => '3.1.0.0',
    543547        'path'    => $baseDir . '/app/http/endpoints/ProvidersEndpoint.php'
    544548    ),
    545549    'SimplyBook\\Http\\Endpoints\\PublicThemeListEndpoint' => array(
    546         'version' => '3.0.0.0',
     550        'version' => '3.1.0.0',
    547551        'path'    => $baseDir . '/app/http/endpoints/PublicThemeListEndpoint.php'
    548552    ),
    549553    'SimplyBook\\Http\\Endpoints\\RelatedPluginEndpoints' => array(
    550         'version' => '3.0.0.0',
     554        'version' => '3.1.0.0',
    551555        'path'    => $baseDir . '/app/http/endpoints/RelatedPluginEndpoints.php'
    552556    ),
    553557    'SimplyBook\\Http\\Endpoints\\RemotePluginsEndpoint' => array(
    554         'version' => '3.0.0.0',
     558        'version' => '3.1.0.0',
    555559        'path'    => $baseDir . '/app/http/endpoints/RemotePluginsEndpoint.php'
    556560    ),
    557561    'SimplyBook\\Http\\Endpoints\\ServicesEndpoint' => array(
    558         'version' => '3.0.0.0',
     562        'version' => '3.1.0.0',
    559563        'path'    => $baseDir . '/app/http/endpoints/ServicesEndpoint.php'
    560564    ),
    561565    'SimplyBook\\Http\\Endpoints\\SettingEndpoints' => array(
    562         'version' => '3.0.0.0',
     566        'version' => '3.1.0.0',
    563567        'path'    => $baseDir . '/app/http/endpoints/SettingEndpoints.php'
    564568    ),
    565569    'SimplyBook\\Http\\Endpoints\\StatisticsEndpoint' => array(
    566         'version' => '3.0.0.0',
     570        'version' => '3.1.0.0',
    567571        'path'    => $baseDir . '/app/http/endpoints/StatisticsEndpoint.php'
    568572    ),
    569573    'SimplyBook\\Http\\Endpoints\\SubscriptionEndpoints' => array(
    570         'version' => '3.0.0.0',
     574        'version' => '3.1.0.0',
    571575        'path'    => $baseDir . '/app/http/endpoints/SubscriptionEndpoints.php'
    572576    ),
    573577    'SimplyBook\\Http\\Endpoints\\TipsTricksEndpoint' => array(
    574         'version' => '3.0.0.0',
     578        'version' => '3.1.0.0',
    575579        'path'    => $baseDir . '/app/http/endpoints/TipsTricksEndpoint.php'
    576580    ),
    577581    'SimplyBook\\Http\\Endpoints\\WaitForRegistrationEndpoint' => array(
    578         'version' => '3.0.0.0',
     582        'version' => '3.1.0.0',
    579583        'path'    => $baseDir . '/app/http/endpoints/WaitForRegistrationEndpoint.php'
    580584    ),
    581585    'SimplyBook\\Http\\Endpoints\\WidgetEndpoint' => array(
    582         'version' => '3.0.0.0',
     586        'version' => '3.1.0.0',
    583587        'path'    => $baseDir . '/app/http/endpoints/WidgetEndpoint.php'
    584588    ),
    585589    'SimplyBook\\Http\\JsonRpcClient' => array(
    586         'version' => '3.0.0.0',
     590        'version' => '3.1.0.0',
    587591        'path'    => $baseDir . '/app/http/JsonRpcClient.php'
    588592    ),
    589593    'SimplyBook\\Interfaces\\ControllerInterface' => array(
    590         'version' => '3.0.0.0',
     594        'version' => '3.1.0.0',
    591595        'path'    => $baseDir . '/app/interfaces/ControllerInterface.php'
    592596    ),
    593597    'SimplyBook\\Interfaces\\FeatureInterface' => array(
    594         'version' => '3.0.0.0',
     598        'version' => '3.1.0.0',
    595599        'path'    => $baseDir . '/app/interfaces/FeatureInterface.php'
    596600    ),
    597601    'SimplyBook\\Interfaces\\MultiEndpointInterface' => array(
    598         'version' => '3.0.0.0',
     602        'version' => '3.1.0.0',
    599603        'path'    => $baseDir . '/app/interfaces/MultiEndpointInterface.php'
    600604    ),
    601605    'SimplyBook\\Interfaces\\NoticeInterface' => array(
    602         'version' => '3.0.0.0',
     606        'version' => '3.1.0.0',
    603607        'path'    => $baseDir . '/app/interfaces/NoticeInterface.php'
    604608    ),
    605609    'SimplyBook\\Interfaces\\ProviderInterface' => array(
    606         'version' => '3.0.0.0',
     610        'version' => '3.1.0.0',
    607611        'path'    => $baseDir . '/app/interfaces/ProviderInterface.php'
    608612    ),
    609613    'SimplyBook\\Interfaces\\SingleEndpointInterface' => array(
    610         'version' => '3.0.0.0',
     614        'version' => '3.1.0.0',
    611615        'path'    => $baseDir . '/app/interfaces/SingleEndpointInterface.php'
    612616    ),
    613617    'SimplyBook\\Interfaces\\TaskInterface' => array(
    614         'version' => '3.0.0.0',
     618        'version' => '3.1.0.0',
    615619        'path'    => $baseDir . '/app/interfaces/TaskInterface.php'
    616620    ),
    617621    'SimplyBook\\Managers\\ControllerManager' => array(
    618         'version' => '3.0.0.0',
     622        'version' => '3.1.0.0',
    619623        'path'    => $baseDir . '/app/managers/ControllerManager.php'
    620624    ),
    621625    'SimplyBook\\Managers\\EndpointManager' => array(
    622         'version' => '3.0.0.0',
     626        'version' => '3.1.0.0',
    623627        'path'    => $baseDir . '/app/managers/EndpointManager.php'
    624628    ),
    625629    'SimplyBook\\Managers\\FeatureManager' => array(
    626         'version' => '3.0.0.0',
     630        'version' => '3.1.0.0',
    627631        'path'    => $baseDir . '/app/managers/FeatureManager.php'
    628632    ),
    629633    'SimplyBook\\Managers\\ProviderManager' => array(
    630         'version' => '3.0.0.0',
     634        'version' => '3.1.0.0',
    631635        'path'    => $baseDir . '/app/managers/ProviderManager.php'
    632636    ),
    633637    'SimplyBook\\Providers\\AppServiceProvider' => array(
    634         'version' => '3.0.0.0',
     638        'version' => '3.1.0.0',
    635639        'path'    => $baseDir . '/app/providers/AppServiceProvider.php'
    636640    ),
    637641    'SimplyBook\\Providers\\Provider' => array(
    638         'version' => '3.0.0.0',
     642        'version' => '3.1.0.0',
    639643        'path'    => $baseDir . '/app/providers/Provider.php'
    640644    ),
    641645    'SimplyBook\\Services\\CapabilityService' => array(
    642         'version' => '3.0.0.0',
     646        'version' => '3.1.0.0',
    643647        'path'    => $baseDir . '/app/services/CapabilityService.php'
    644648    ),
    645649    'SimplyBook\\Services\\DesignSettingsService' => array(
    646         'version' => '3.0.0.0',
     650        'version' => '3.1.0.0',
    647651        'path'    => $baseDir . '/app/services/DesignSettingsService.php'
    648652    ),
    649653    'SimplyBook\\Services\\LoginUrlService' => array(
    650         'version' => '3.0.0.0',
     654        'version' => '3.1.0.0',
    651655        'path'    => $baseDir . '/app/services/LoginUrlService.php'
    652656    ),
    653657    'SimplyBook\\Services\\RelatedPluginService' => array(
    654         'version' => '3.0.0.0',
     658        'version' => '3.1.0.0',
    655659        'path'    => $baseDir . '/app/services/RelatedPluginService.php'
    656660    ),
    657661    'SimplyBook\\Services\\StatisticsService' => array(
    658         'version' => '3.0.0.0',
     662        'version' => '3.1.0.0',
    659663        'path'    => $baseDir . '/app/services/StatisticsService.php'
    660664    ),
    661665    'SimplyBook\\Services\\SubscriptionDataService' => array(
    662         'version' => '3.0.0.0',
     666        'version' => '3.1.0.0',
    663667        'path'    => $baseDir . '/app/services/SubscriptionDataService.php'
    664668    ),
     669    'SimplyBook\\Services\\WidgetTrackingService' => array(
     670        'version' => '3.1.0.0',
     671        'path'    => $baseDir . '/app/services/WidgetTrackingService.php'
     672    ),
    665673    'SimplyBook\\Traits\\HasAllowlistControl' => array(
    666         'version' => '3.0.0.0',
     674        'version' => '3.1.0.0',
    667675        'path'    => $baseDir . '/app/traits/HasAllowlistControl.php'
    668676    ),
    669677    'SimplyBook\\Traits\\HasNonces' => array(
    670         'version' => '3.0.0.0',
     678        'version' => '3.1.0.0',
    671679        'path'    => $baseDir . '/app/traits/HasNonces.php'
    672680    ),
    673681    'SimplyBook\\Traits\\HasRestAccess' => array(
    674         'version' => '3.0.0.0',
     682        'version' => '3.1.0.0',
    675683        'path'    => $baseDir . '/app/traits/HasRestAccess.php'
    676684    ),
    677685    'SimplyBook\\Traits\\HasUserAccess' => array(
    678         'version' => '3.0.0.0',
     686        'version' => '3.1.0.0',
    679687        'path'    => $baseDir . '/app/traits/HasUserAccess.php'
    680688    ),
    681689    'SimplyBook\\Traits\\HasViews' => array(
    682         'version' => '3.0.0.0',
     690        'version' => '3.1.0.0',
    683691        'path'    => $baseDir . '/app/traits/HasViews.php'
    684692    ),
    685693    'SimplyBook\\Traits\\LegacyHelper' => array(
    686         'version' => '3.0.0.0',
     694        'version' => '3.1.0.0',
    687695        'path'    => $baseDir . '/app/traits/LegacyHelper.php'
    688696    ),
    689697    'SimplyBook\\Traits\\LegacyLoad' => array(
    690         'version' => '3.0.0.0',
     698        'version' => '3.1.0.0',
    691699        'path'    => $baseDir . '/app/traits/LegacyLoad.php'
    692700    ),
    693701    'SimplyBook\\Traits\\LegacySave' => array(
    694         'version' => '3.0.0.0',
     702        'version' => '3.1.0.0',
    695703        'path'    => $baseDir . '/app/traits/LegacySave.php'
    696704    ),
    697705    'SimplyBook\\Utility\\StringUtility' => array(
    698         'version' => '3.0.0.0',
     706        'version' => '3.1.0.0',
    699707        'path'    => $baseDir . '/app/support/utility/StringUtility.php'
    700708    ),
  • simplybook/trunk/vendor/composer/jetpack_autoload_filemap.php

    r3297362 r3313046  
    2828    ),
    2929    '5bc9c041796e4348fc427e9381e014b6' => array(
    30         'version' => '3.0.0.0',
     30        'version' => '3.1.0.0',
    3131        'path'    => $baseDir . '/app/App.php'
    3232    ),
    3333    '2fd0677d8d23e6e7b0156d2f7d3368d4' => array(
    34         'version' => '3.0.0.0',
     34        'version' => '3.1.0.0',
    3535        'path'    => $baseDir . '/app/Plugin.php'
    3636    ),
    3737    'dac67ee3b45b7fdd52cfb86981c8c3d0' => array(
    38         'version' => '3.0.0.0',
     38        'version' => '3.1.0.0',
    3939        'path'    => $baseDir . '/helpers.php'
    4040    ),
Note: See TracChangeset for help on using the changeset viewer.