PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / trunk
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution vtrunk
2.4.0 2.3.0 2.2.5 2.2.0 2.1.2 2.1.1 trunk 1.10.0 1.10.01 1.10.02 1.5.0 1.5.01 1.5.02 1.5.1 1.5.10 1.5.20 1.5.21 1.5.22 1.5.23 1.5.24 1.5.25 1.6.0 1.7.0 1.7.1 1.7.2 All 33 releases
← All changes | app/Hooks/Handlers/AdminMenuHandler.php +161 -78 1.5.21trunk View file →
@@ -2,11 +2,11 @@
2 2
3 3 namespace FluentBooking\App\Hooks\Handlers;
4 4
5 5 use FluentBooking\App\App;
6 +use FluentBooking\App\Vite;
6 7 use FluentBooking\App\Models\Calendar;
7 8 use FluentBooking\App\Models\CalendarSlot;
8 -use FluentBooking\App\Models\User;
9 9 use FluentBooking\App\Services\DateTimeHelper;
10 10 use FluentBooking\App\Services\Helper;
11 11 use FluentBooking\App\Services\PermissionManager;
12 12 use FluentBooking\App\Services\TransStrings;
@@ -22,10 +22,45 @@
22 22 return;
23 23 }
24 24 $this->enqueueAssets();
25 25 }, 100);
26 +
27 + add_action('admin_head', function () {
28 + if (!isset($_REQUEST['page']) || $_REQUEST['page'] != 'fluent-booking') { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
29 + return;
30 + }
31 + $this->printThemeClass();
32 + }, 1);
26 33 }
27 34
35 + /**
36 + * Put the dark class on the document before the page paints.
37 + *
38 + * The theme is chosen in the browser, so the server cannot know it - which means
39 + * without this the first frame is always light, and somebody on dark gets a white flash
40 + * on every page load. This runs in <head>, before wp-admin's own markup, and is the
41 + * only reason it is inline rather than in global_admin.js: a file in the footer is too
42 + * late to matter, and one in the header is still a request the paint would wait on.
43 + *
44 + * `fluent_theme_mode` is the key every Fluent plugin shares (see global_admin.js), and it
45 + * holds a bare `light`, `dark` or `system`, so `system` is resolved here against the
46 + * machine's own preference. <body> does not exist yet, so only <html> is marked;
47 + * global_admin.js puts the same classes on <body> and #wpbody-content once it runs.
48 + *
49 + * @return void
50 + */
51 + public function printThemeClass()
52 + {
53 + $script = <<<'JS'
54 +(function(){try{var s=localStorage.getItem('fluent_theme_mode')||'';
55 +if(!s){s=localStorage.getItem('fcal_color_mode')==='dark'?'dark':'light';}
56 +if(s==='system'){s='system:'+(window.matchMedia&&window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light');}
57 +if(s==='dark'||s==='system:dark'){var e=document.documentElement;e.classList.add('fluent_theme_dark');e.classList.add('dark');}}catch(e){}})();
58 +JS;
59 +
60 + echo '<script id="fluent-booking-theme-class">' . $script . '</script>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
61 + }
62 +
28 63 public function add()
29 64 {
30 65 $capability = PermissionManager::getMenuPermission();
31 66 $menuPriority = 26;
@@ -83,9 +118,9 @@
83 118 add_submenu_page(
84 119 'fluent-booking',
85 120 __('Settings', 'fluent-booking'),
86 121 __('Settings', 'fluent-booking'),
87 - 'manage_options',
122 + $capability,
88 123 'fluent-booking#/settings/general-settings',
89 124 [$this, 'render']
90 125 );
91 126 }
@@ -95,9 +130,17 @@
95 130 if (!as_has_scheduled_action('fluent_booking_five_minutes_tasks')) {
96 131 as_schedule_recurring_action(time(), (60 * 5), 'fluent_booking_five_minutes_tasks', [], 'fluent-booking', true);
97 132 }
98 133
134 + // The daily task carries the summary report and the MCP record purge.
135 + // A site that never got it — a secondary blog on a network activation,
136 + // or one that lost it — would grow fcal_mcp_g_* rows forever.
137 + if (!as_has_scheduled_action('fluent_booking/daily_tasks')) {
138 + as_schedule_recurring_action(time(), (60 * 60 * 24), 'fluent_booking/daily_tasks', [], 'fluent-booking', true);
139 + }
140 +
99 141 $this->changeFooter();
142 +
100 143 $app = App::getInstance();
101 144
102 145 $config = $app->config;
103 146
@@ -126,9 +169,9 @@
126 169 ],
127 170 [
128 171 'key' => 'scheduled-events',
129 172 'label' => __('Bookings', 'fluent-booking'),
130 - 'permalink' => $baseUrl . 'scheduled-events?period=upcoming&author=me',
173 + 'permalink' => $baseUrl . 'scheduled-events',
131 174 ],
132 175 [
133 176 'key' => 'availability',
134 177 'label' => __('Availability', 'fluent-booking'),
@@ -135,10 +178,11 @@
135 178 'permalink' => $baseUrl . 'availability'
136 179 ]
137 180 ];
138 181
139 - if (current_user_can('manage_options')) {
140 - $menuItems[] = [
182 + $settingItems = [];
183 + if (PermissionManager::userCan('manage_all_data')) {
184 + $settingItems = [
141 185 'key' => 'settings',
142 186 'label' => __('Settings', 'fluent-booking'),
143 187 'permalink' => $baseUrl . 'settings/general-settings'
144 188 ];
@@ -143,16 +187,8 @@
143 187 'permalink' => $baseUrl . 'settings/general-settings'
144 188 ];
145 189 }
146 190
147 - if (!defined('FLUENT_BOOKING_PRO_DIR_FILE')) {
148 - $menuItems[] = [
149 - 'key' => 'buy',
150 - 'label' => __('Upgrade to Pro', 'fluent-booking'),
151 - 'permalink' => Helper::getUpgradeUrl()
152 - ];
153 - }
154 -
155 191 $menuItems = apply_filters('fluent_booking/admin_menu_items', $menuItems);
156 192
157 193 $assets = $app['url.assets'];
158 194
@@ -159,12 +195,16 @@
159 195 $portalVars = apply_filters('fluent_booking/admin_portal_vars', [
160 196 'name' => $name,
161 197 'slug' => $slug,
162 198 'menuItems' => $menuItems,
199 + 'settings' => $settingItems,
163 200 'baseUrl' => $baseUrl,
164 201 'logo' => $assets . 'images/logo.svg',
202 + 'dark_logo' => $assets . 'images/logo_dark.svg',
165 203 ]);
166 204
205 + do_action('fluent_booking/admin_app_rendering');
206 +
167 207 $app->view->render('admin.menu', $portalVars);
168 208 }
169 209
170 210 public function changeFooter()
@@ -185,16 +225,14 @@
185 225 $app = App::getInstance();
186 226
187 227 $isRtl = Helper::fluentbooking_is_rtl();
188 228
189 - $assets = $app['url.assets'];
229 + $slug = $app->config->get('app.slug');
190 230
191 - $slug = $app->config->get('app.slug');
231 + $assetsVersion = Vite::isDev() ? time() : FLUENT_BOOKING_ASSETS_VERSION;
192 232
193 - $adminAppCss = 'admin/admin.css';
194 233 if ($isRtl) {
195 - $adminAppCss = 'admin/admin-rtl.css';
196 - wp_enqueue_style('fluentbooking_admin_rtl', $assets . 'admin/fluentbooking_admin_rtl.css', [], FLUENT_BOOKING_ASSETS_VERSION);
234 + Vite::enqueueStyle('fluentbooking_admin_rtl', 'admin_rtl_css', [], $assetsVersion);
197 235 }
198 236
199 237 add_action('wp_print_scripts', function () {
200 238
@@ -285,27 +323,15 @@
285 323 wp_dequeue_style($wp_styles->registered[$script]->handle);
286 324 }
287 325 }, 999999);
288 326
289 - wp_enqueue_style('fluent_booing_admin_app', $assets . $adminAppCss, [], FLUENT_BOOKING_ASSETS_VERSION, 'all');
327 + Vite::enqueueStyle('fluent_booing_admin_app', 'admin_css', [], $assetsVersion, 'all');
290 328
291 - do_action($slug . '_loading_app');
329 + do_action($slug . '_loading_app'); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound
292 330
293 - wp_enqueue_script(
294 - $slug . '_admin_app',
295 - $assets . 'admin/app.js',
296 - array('jquery'),
297 - FLUENT_BOOKING_ASSETS_VERSION,
298 - true
299 - );
331 + Vite::enqueueScript($slug . '_admin_app', 'admin_app', array('jquery'), $assetsVersion);
300 332
301 - wp_enqueue_script(
302 - $slug . '_global_admin',
303 - $assets . 'admin/global_admin.js',
304 - array(),
305 - FLUENT_BOOKING_ASSETS_VERSION,
306 - true
307 - );
333 + Vite::enqueueScript($slug . '_global_admin', 'global_admin', array(), $assetsVersion);
308 334
309 335 if (function_exists('wp_enqueue_editor')) {
310 336 add_filter('user_can_richedit', '__return_true');
311 337 wp_enqueue_editor();
@@ -319,8 +345,13 @@
319 345 {
320 346 $assets = $app['url.assets'];
321 347 $currentUser = get_user_by('ID', get_current_user_id());
322 348
349 + $currentUsername = trim($currentUser->first_name . ' ' . $currentUser->last_name);
350 + if (!$currentUsername) {
351 + $currentUsername = $currentUser->display_name;
352 + }
353 +
323 354 $isNew = $this->isNew();
324 355
325 356 $requireSlug = false;
326 357
@@ -355,8 +386,9 @@
355 386 $customFieldTypes = Helper::getCustomFieldTypes();
356 387 $weekSelectTimes = Helper::getWeekSelectTimes();
357 388 $overrideSelectTimes = Helper::getOverrideSelectTimes();
358 389 $statusChangingTimes = Helper::getBookingStatusChangingTimes();
390 + $defaultTermsAndConditions = Helper::getDefaultTermsAndConditions();
359 391 $locationFields = (new CalendarSlot())->getLocationFields();
360 392
361 393 return apply_filters('fluent_booking/admin_vars', [
362 394 'slug' => $slug = $app->config->get('app.slug'),
@@ -376,12 +408,14 @@
376 408 'duration_lookup' => $durationLookup,
377 409 'multi_duration_lookup' => $multiDurationLookup,
378 410 'override_select_times' => $overrideSelectTimes,
379 411 'status_changing_times' => $statusChangingTimes,
412 + 'default_terms' => $defaultTermsAndConditions,
380 413 'me' => [
381 414 'id' => $currentUser->ID,
382 415 'calendar_id' => $calendarId,
383 - 'full_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
416 + 'full_name' => $currentUsername,
417 + 'avatar' => get_avatar_url($currentUser->ID, ['size' => 96]),
384 418 'email' => $currentUser->user_email,
385 419 'is_admin' => $hasAllAccess,
386 420 'permissions' => PermissionManager::getUserPermissions($currentUser, false),
387 421 ],
@@ -388,22 +422,34 @@
388 422 'all_hosts' => Calendar::getAllHosts(),
389 423 'is_new' => $isNew,
390 424 'require_slug' => $requireSlug,
391 425 'site_url' => site_url('/'),
426 + 'site_title' => get_bloginfo('name'),
392 427 'upgrade_url' => Helper::getUpgradeUrl(),
393 428 'timezones' => DateTimeHelper::getTimeZones(true),
429 + 'features' => Helper::getFeatures(),
394 430 'supported_features' => apply_filters('fluent_booking/supported_featured', [
395 431 'multi_users' => true
396 432 ]),
397 - 'has_pro' => defined('FLUENT_BOOKING_PRO_DIR_FILE'),
398 - 'require_upgrade' => defined('FLUENT_BOOKING_PRO_DIR_FILE') && !defined('FLUENT_BOOKING_LITE'),
399 - 'dashboard_notices' => apply_filters('fluent_booking/dashboard_notices', []),
400 - 'trans' => TransStrings::getStrings(),
401 - 'date_format' => DateTimeHelper::getDateFormatter(true),
402 - 'time_format' => DateTimeHelper::getTimeFormatter(true),
403 - 'date_time_formatter' => DateTimeHelper::getDateFormatter(true) . ', ' . DateTimeHelper::getTimeFormatter(true),
404 - 'available_date_formats' => DateTimeHelper::getAvailableDateFormats(),
405 - 'admin_url' => admin_url(),
433 + 'i18' => [
434 + 'date_time_config' => DateTimeHelper::getI18nDateTimeConfig(),
435 + ],
436 + 'has_pro' => defined('FLUENT_BOOKING_PRO_DIR_FILE'),
437 + 'require_upgrade' => defined('FLUENT_BOOKING_PRO_DIR_FILE') && !defined('FLUENT_BOOKING_LITE'),
438 + 'dashboard_notices' => apply_filters('fluent_booking/dashboard_notices', []),
439 + 'payment_methods' => apply_filters('fluent_booking/payment/get_all_methods', []),
440 + 'trans' => TransStrings::getStrings(),
441 + 'date_format' => DateTimeHelper::getDateFormatter(true),
442 + 'time_format' => DateTimeHelper::getTimeFormatter(true),
443 + 'date_time_formatter' => DateTimeHelper::getDateFormatter(true) . ', ' . DateTimeHelper::getTimeFormatter(true),
444 + 'available_date_formats' => DateTimeHelper::getAvailableDateFormats(),
445 + 'default_booking_filters' => Helper::getDefaultBookingFilters(),
446 + 'default_paginations' => Helper::getDefaultPaginations(),
447 + 'pref_settings' => Helper::getPrefSettings(),
448 + 'settings_menu_items' => static::settingsMenuItems(),
449 + 'admin_url' => admin_url(),
450 + 'is_rtl' => Helper::fluentbooking_is_rtl(),
451 + 'iframe_html' => Helper::getIframeHtml()
406 452 ]);
407 453 }
408 454
409 455 protected function getRestInfo($app)
@@ -472,9 +518,9 @@
472 518 $urlAssets = $app['url.assets'];
473 519
474 520 return apply_filters('fluent_booking/settings_menu_items', [
475 521 'general_settings' => [
476 - 'title' => __('General Settings', 'fluent-booking'),
522 + 'title' => __('General', 'fluent-booking'),
477 523 'disable' => false,
478 524 'el_icon' => 'Operation',
479 525 'component_type' => 'StandAloneComponent',
480 526 'class' => 'general_settings',
@@ -491,8 +537,44 @@
491 537 'route' => [
492 538 'name' => 'team_members'
493 539 ]
494 540 ],
541 + 'payment_settings' => [
542 + 'title' => __('Payment', 'fluent-booking'),
543 + 'disable' => true,
544 + 'el_icon' => 'Money',
545 + 'component_type' => 'PaymentSettingsComponent',
546 + 'class' => 'payment_settings',
547 + 'route' => [
548 + 'name' => 'global_payment_settings',
549 + ],
550 + 'children' => [
551 + 'payment_settings' => [
552 + 'title' => __('Settings', 'fluent-booking'),
553 + 'disable' => true,
554 + 'route' => [
555 + 'name' => 'global_payment_settings'
556 + ]
557 + ],
558 + 'payment_methods' => [
559 + 'title' => __('Payment Methods', 'fluent-booking'),
560 + 'disable' => true,
561 + 'route' => [
562 + 'name' => 'payment_methods',
563 + 'params' => [
564 + 'settings_key' => 'stripe'
565 + ]
566 + ]
567 + ],
568 + 'payment_coupons' => [
569 + 'title' => __('Coupons', 'fluent-booking'),
570 + 'disable' => true,
571 + 'route' => [
572 + 'name' => 'payment_coupons'
573 + ]
574 + ]
575 + ],
576 + ],
495 577 'google' => [
496 578 'title' => __('Google Calendar / Meet', 'fluent-booking'),
497 579 'disable' => true,
498 580 'icon_url' => $urlAssets . 'images/gg-calendar.svg',
@@ -530,9 +612,9 @@
530 612 ],
531 613 'next_cloud_calendar' => [
532 614 'title' => __('Nextcloud Calendar', 'fluent-booking'),
533 615 'disable' => true,
534 - 'icon_url' => $urlAssets . 'images/Ncloud.svg',
616 + 'svg_icon' => '<svg xmlns="http://www.w3.org/2000/svg" height="800" width="1200" viewBox="-17.0838 -18.65685 148.0596 111.9411"><path d="M57.0328 0C45.2275 0 35.2216 8.0032 32.1204 18.8466c-2.6952-5.7515-8.5359-9.781-15.2633-9.781C7.6053 9.0657 0 16.671 0 25.9228c0 9.2519 7.6052 16.8606 16.857 16.8606 6.7275 0 12.5682-4.0319 15.2635-9.7844 3.1011 10.8442 13.107 18.85 24.9123 18.85 11.718 0 21.6729-7.885 24.8533-18.607 2.745 5.622 8.5135 9.5414 15.1454 9.5414 9.2518 0 16.8605-7.6087 16.8605-16.8606 0-9.2518-7.6087-16.857-16.8605-16.857-6.632 0-12.4003 3.917-15.1454 9.5378C78.7057 7.8825 68.7507 0 57.0328 0zm0 9.8955c8.9116 0 16.0307 7.1156 16.0307 16.0272s-7.119 16.0308-16.0307 16.0308c-8.9116 0-16.0272-7.1192-16.0272-16.0308S48.1212 9.8955 57.0328 9.8955zm-40.1757 9.0657c3.9044 0 6.965 3.0571 6.965 6.9615s-3.0606 6.965-6.965 6.965-6.9616-3.0606-6.9616-6.965 3.0572-6.9615 6.9616-6.9615zm80.1744 0c3.9044 0 6.965 3.0571 6.965 6.9615s-3.0606 6.965-6.965 6.965-6.9616-3.0606-6.9616-6.965 3.0572-6.9615 6.9616-6.9615z" color="currentColor" font-weight="400" font-family="sans-serif" overflow="visible" fill="currentColor"></path><path d="M29.1085 63.7615c2.7752 0 4.3275 1.9756 4.3275 4.939 0 .2822-.2352.5174-.5174.5174h-7.4792c.047 2.6342 1.8816 4.1394 3.9983 4.1394 1.3171 0 2.2579-.5644 2.7283-.9408.2822-.1881.5174-.141.6585.1412l.1411.2352c.1411.2351.094.4703-.1411.6585-.5645.4233-1.7875 1.129-3.4338 1.129-3.0575 0-5.4094-2.2109-5.4094-5.4095.047-3.3868 2.3048-5.4094 5.1272-5.4094zm2.8693 4.4216c-.094-2.1638-1.4112-3.2457-2.9164-3.2457-1.7404 0-3.2456 1.129-3.575 3.2457zm15.584-2.9164v-3.622c0-.3292.1882-.5174.5174-.5174h.3764c.3292 0 .4703.1882.4703.5174v2.446h2.1168c.3292 0 .5174.1882.5174.5174v.1412c0 .3292-.1882.4703-.5174.4703h-2.1168v5.1743c0 2.399 1.4582 2.6812 2.2579 2.7282.4233.047.5644.1411.5644.5174v.2823c0 .3292-.141.4704-.5644.4704-2.2579 0-3.622-1.3642-3.622-3.8102zm10.7718-1.5052c1.7875 0 2.9164.7526 3.4339 1.176.2351.188.2822.4233.047.7055l-.1411.2352c-.1882.2822-.4234.2822-.7056.094-.4704-.3292-1.3641-.9407-2.5871-.9407-2.2579 0-4.0453 1.6934-4.0453 4.1864 0 2.446 1.7874 4.1394 4.0453 4.1394 1.4582 0 2.446-.6585 2.9164-1.0819.2822-.1881.4704-.141.6585.1411l.1411.1882c.1411.2822.0941.4704-.141.7056-.5175.4233-1.7876 1.317-3.6691 1.317-3.0575 0-5.4094-2.2108-5.4094-5.4094.047-3.1986 2.399-5.4564 5.4564-5.4564zm6.2562-3.3398c0-.3292-.1882-.5174.141-.5174h.3764c.3293 0 .8467.1882.8467.5174V71.664c0 1.3171.6115 1.4582 1.0819 1.5053.2352 0 .4233.141.4233.4703v.3293c0 .3293-.1411.5174-.5174.5174-.8467 0-2.352-.2822-2.352-2.54zm9.6429 3.3398c3.0104 0 5.4564 2.3048 5.4564 5.3623 0 3.1046-2.446 5.4565-5.4564 5.4565-3.0105 0-5.4565-2.352-5.4565-5.4565 0-3.0575 2.446-5.3623 5.4565-5.3623zm0 9.5958c2.2108 0 3.9982-1.7875 3.9982-4.2335 0-2.3519-1.7874-4.0923-3.9982-4.0923s-4.0454 1.7875-4.0454 4.0923c.047 2.399 1.8346 4.2335 4.0454 4.2335zm23.4722-9.5958c2.493 0 3.3868 2.0697 3.3868 2.0697h.047s-.047-.3293-.047-.7997v-4.6568c0-.3293-.1412-.5174.1881-.5174h.3763c.3293 0 .8467.1881.8467.5174v13.406c0 .3292-.1411.5174-.4704.5174h-.3292c-.3293 0-.5175-.1411-.5175-.4704v-.7997c0-.3763.0941-.6585.0941-.6585h-.047s-.8938 2.1638-3.575 2.1638c-2.7752 0-4.5157-2.2108-4.5157-5.4095-.094-3.1986 1.8345-5.3623 4.5628-5.3623zm.047 9.5958c1.7404 0 3.3398-1.223 3.3398-4.1864 0-2.1167-1.082-4.1394-3.2927-4.1394-1.8345 0-3.3398 1.5052-3.3398 4.1394.047 2.54 1.3641 4.1864 3.2927 4.1864zm-85.8923.9878h.3763c.3293 0 .5174-.1881.5174-.5174V63.7274c0-1.5993 1.7404-2.7412 3.716-2.7412 1.9757 0 3.7161 1.142 3.7161 2.7412v10.1003c0 .3293.1882.5174.5174.5174h.3763c.3293 0 .4704-.1881.4704-.5174V63.6674c0-2.6812-2.6812-3.9983-5.1272-3.9983-2.3519 0-5.0331 1.317-5.0331 3.9983v10.1603c0 .3293.1411.5174.4704.5174zm78.5073-10.3485h-.3763c-.3293 0-.5175.1882-.5175.5175v5.6916c0 1.5993-1.0348 3.0575-3.0575 3.0575-1.9756 0-3.0575-1.4582-3.0575-3.0575v-5.6916c0-.3293-.1881-.5175-.5174-.5175h-.3763c-.3293 0-.4704.1882-.4704.5175v6.068c0 2.6811 1.9756 3.9982 4.4216 3.9982 2.446 0 4.4217-1.317 4.4217-3.9983v-6.068c.047-.3292-.1412-.5174-.4704-.5174zm-46.5643-.0771c-.1152.0184-.2258.0953-.3317.2214L41.5673 66.41l-1.4249 1.6978-2.1571-2.5715-1.1705-1.3955c-.1058-.1261-.2257-.195-.35-.2058-.1244-.0107-.2533.0366-.3795.1424l-.2884.2416c-.2523.2117-.2392.446-.0276.6982l1.9045 2.2693 1.5793 1.8815-2.3124 2.7553c-.0018.002-.0029.0043-.0046.0064l-1.1668 1.39c-.2117.2523-.188.5178.0643.7295l.2885.2407c.2522.2116.481.1585.6927-.0937l1.9036-2.2693 1.425-1.6977 2.157 2.5715c.0015.0016.0032.0029.0047.0046l1.1668 1.391c.2116.2521.4763.275.7285.0633l.2885-.2416c.2522-.2117.2392-.446.0275-.6983l-1.9045-2.2692-1.5792-1.8815 2.3124-2.7553c.0017-.002.0028-.0044.0046-.0064l1.1668-1.39c.2116-.2523.1879-.5179-.0643-.7295l-.2885-.2416c-.1261-.1058-.2459-.1452-.361-.1268z" fill="currentColor"></path></svg>',
535 617 'component_type' => 'GlobalSettingsComponent',
536 618 'class' => 'configure_nextcloud_calendar',
537 619 'route' => [
538 620 'name' => 'configure-integrations',
@@ -553,9 +635,9 @@
553 635 ],
554 636 'twilio' => [
555 637 'title' => __('SMS by Twilio', 'fluent-booking'),
556 638 'disable' => true,
557 - 'icon_url' => $urlAssets . 'images/tw.svg',
639 + 'svg_icon' => '<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" viewBox="0 0 24 24" id="twilio"><path d="M0,12c0,6.64,5.359,12,12,12s12-5.36,12-12c0-6.641-5.36-12-12-12C5.381-0.008,0.008,5.352,0,11.971V12z M3.199,12c-0.014-4.846,3.904-8.786,8.75-8.801H12c4.847-0.014,8.786,3.904,8.801,8.75V12c0.015,4.847-3.904,8.786-8.75,8.801H12c-4.846,0.015-8.786-3.904-8.801-8.75V12z"></path><path d="M14.959 17.44c1.361 0 2.481-1.12 2.481-2.48 0-1.359-1.12-2.48-2.481-2.479-1.359 0-2.479 1.12-2.479 2.479C12.486 16.326 13.592 17.432 14.959 17.44zM14.959 11.52c1.361 0 2.481-1.12 2.481-2.479 0-1.361-1.12-2.481-2.481-2.481-1.359 0-2.479 1.12-2.479 2.481C12.487 10.407 13.593 11.513 14.959 11.52zM9.042 17.44c1.359 0 2.479-1.12 2.479-2.48 0-1.359-1.121-2.48-2.479-2.479-1.361 0-2.481 1.12-2.481 2.479C6.567 16.327 7.674 17.433 9.042 17.44zM9.042 11.52c1.359 0 2.479-1.12 2.479-2.479 0-1.361-1.121-2.481-2.479-2.481-1.361 0-2.481 1.12-2.481 2.481C6.567 10.408 7.675 11.513 9.042 11.52z"></path></svg>',
558 640 'component_type' => 'GlobalSettingsComponent',
559 641 'class' => 'configure_twilio',
560 642 'route' => [
561 643 'name' => 'configure-integrations',
@@ -563,34 +645,8 @@
563 645 'settings_key' => 'twilio'
564 646 ]
565 647 ]
566 648 ],
567 - 'stripe' => [
568 - 'title' => __('Stripe', 'fluent-booking'),
569 - 'disable' => true,
570 - 'icon_url' => $urlAssets . 'images/payment-methods/stripe.svg',
571 - 'component_type' => 'GlobalSettingsComponent',
572 - 'class' => 'stripe_payment',
573 - 'route' => [
574 - 'name' => 'PaymentSettingsIndex',
575 - 'params' => [
576 - 'settings_key' => 'stripe'
577 - ]
578 - ]
579 - ],
580 - 'paypal' => [
581 - 'title' => __('PayPal', 'fluent-booking'),
582 - 'disable' => true,
583 - 'icon_url' => $urlAssets . 'images/payment-methods/paypal.svg',
584 - 'component_type' => 'GlobalSettingsComponent',
585 - 'class' => 'paypal_payment',
586 - 'route' => [
587 - 'name' => 'PaymentSettingsIndex',
588 - 'params' => [
589 - 'settings_key' => 'paypal'
590 - ]
591 - ]
592 - ],
593 649 'license' => [
594 650 'title' => __('License', 'fluent-booking'),
595 651 'disable' => true,
596 652 'el_icon' => 'Lock',
@@ -598,9 +654,9 @@
598 654 'class' => 'configure_license',
599 655 'route' => [
600 656 'name' => 'license'
601 657 ]
602 - ],
658 + ]
603 659 ]);
604 660 }
605 661
606 662 public static function getEventSettingsMenuItems($event)
@@ -617,9 +673,9 @@
617 673 'event_id' => $event->id
618 674 ]
619 675 ],
620 676 'label' => __('Event Details', 'fluent-booking'),
621 - 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M8 2V5" stroke="#1B2533" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 2V5" stroke="#1B2533" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M7 13H15" stroke="#1B2533" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M7 17H12" stroke="#1B2533" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 3.5C19.33 3.68 21 4.95 21 9.65V15.83C21 19.95 20 22.01 15 22.01H9C4 22.01 3 19.95 3 15.83V9.65C3 4.95 4.67 3.69 8 3.5H16Z" stroke="#1B2533" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></svg>'
677 + 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M8 2V5" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 2V5" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M7 13H15" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M7 17H12" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 3.5C19.33 3.68 21 4.95 21 9.65V15.83C21 19.95 20 22.01 15 22.01H9C4 22.01 3 19.95 3 15.83V9.65C3 4.95 4.67 3.69 8 3.5H16Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></svg>'
622 678 ],
623 679 'assignment' => [
624 680 'type' => 'route',
625 681 'visible' => false,
@@ -645,9 +701,9 @@
645 701 'event_id' => $event->id
646 702 ]
647 703 ],
648 704 'label' => __('Availability', 'fluent-booking'),
649 - 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M6.66666 1.66699V4.16699" stroke="#445164" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M13.3333 1.66699V4.16699" stroke="#445164" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.91666 7.5752H17.0833" stroke="#445164" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M17.5 7.08366V14.167C17.5 16.667 16.25 18.3337 13.3333 18.3337H6.66667C3.75 18.3337 2.5 16.667 2.5 14.167V7.08366C2.5 4.58366 3.75 2.91699 6.66667 2.91699H13.3333C16.25 2.91699 17.5 4.58366 17.5 7.08366Z" stroke="#445164" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M13.0789 11.4167H13.0864" stroke="#445164" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M13.0789 13.9167H13.0864" stroke="#445164" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.99623 11.4167H10.0037" stroke="#445164" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.99623 13.9167H10.0037" stroke="#445164" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.91194 11.4167H6.91942" stroke="#445164" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.91194 13.9167H6.91942" stroke="#445164" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>'
705 + 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M6.66666 1.66699V4.16699" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M13.3333 1.66699V4.16699" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.91666 7.5752H17.0833" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M17.5 7.08366V14.167C17.5 16.667 16.25 18.3337 13.3333 18.3337H6.66667C3.75 18.3337 2.5 16.667 2.5 14.167V7.08366C2.5 4.58366 3.75 2.91699 6.66667 2.91699H13.3333C16.25 2.91699 17.5 4.58366 17.5 7.08366Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M13.0789 11.4167H13.0864" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M13.0789 13.9167H13.0864" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.99623 11.4167H10.0037" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.99623 13.9167H10.0037" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.91194 11.4167H6.91942" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.91194 13.9167H6.91942" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>'
650 706 ],
651 707 'limit_settings' => [
652 708 'type' => 'route',
653 709 'visible' => true,
@@ -673,9 +729,9 @@
673 729 'event_id' => $event->id
674 730 ]
675 731 ],
676 732 'label' => __('Question Settings', 'fluent-booking'),
677 - 'svgIcon' => '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 2V5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 2V5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M12 13.8714V13.6441C12 12.908 12.5061 12.5182 13.0121 12.2043C13.5061 11.9012 14 11.5115 14 10.797C14 9.8011 13.1085 9 12 9C10.8915 9 10 9.8011 10 10.797" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M11.9945 16.4587H12.0053" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 3.5C19.33 3.67504 21 4.91005 21 9.48055V15.4903C21 19.4968 20 21.5 15 21.5H9C4 21.5 3 19.4968 3 15.4903V9.48055C3 4.91005 4.67 3.68476 8 3.5H16Z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></svg>'
733 + 'svgIcon' => '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 2V5" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 2V5" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M12 13.8714V13.6441C12 12.908 12.5061 12.5182 13.0121 12.2043C13.5061 11.9012 14 11.5115 14 10.797C14 9.8011 13.1085 9 12 9C10.8915 9 10 9.8011 10 10.797" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M11.9945 16.4587H12.0053" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M16 3.5C19.33 3.67504 21 4.91005 21 9.48055V15.4903C21 19.4968 20 21.5 15 21.5H9C4 21.5 3 19.4968 3 15.4903V9.48055C3 4.91005 4.67 3.68476 8 3.5H16Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></svg>'
678 734 ],
679 735 'email_notification' => [
680 736 'type' => 'route',
681 737 'visible' => true,
@@ -703,8 +759,22 @@
703 759 ],
704 760 'label' => __('SMS Notification', 'fluent-booking'),
705 761 'elIcon' => 'Notification'
706 762 ],
763 + 'recurring_settings' => [
764 + 'type' => 'route',
765 + 'visible' => ($event->isOneToOne() || $event->isGroup()) ? true : false,
766 + 'disable' => true,
767 + 'route' => [
768 + 'name' => 'recurring_settings',
769 + 'params' => [
770 + 'calendar_id' => $event->calendar_id,
771 + 'event_id' => $event->id
772 + ]
773 + ],
774 + 'label' => __('Recurring Settings', 'fluent-booking'),
775 + 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16" fill="currentColor"><path d="M6 4H21C21.5523 4 22 4.44772 22 5V12H20V6H6V9L1 5L6 1V4ZM18 20H3C2.44772 20 2 19.5523 2 19V12H4V18H18V15L23 19L18 23V20Z"></path></svg>'
776 + ],
707 777 'advanced_settings' => [
708 778 'type' => 'route',
709 779 'visible' => true,
710 780 'disable' => true,
@@ -776,9 +846,22 @@
776 846 'calendar_id' => $calendar->id
777 847 ]
778 848 ],
779 849 'label' => __('Calendar Settings', 'fluent-booking'),
780 - 'svgIcon' => '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M2 12.8799V11.1199C2 10.0799 2.85 9.21994 3.9 9.21994C5.71 9.21994 6.45 7.93994 5.54 6.36994C5.02 5.46994 5.33 4.29994 6.24 3.77994L7.97 2.78994C8.76 2.31994 9.78 2.59994 10.25 3.38994L10.36 3.57994C11.26 5.14994 12.74 5.14994 13.65 3.57994L13.76 3.38994C14.23 2.59994 15.25 2.31994 16.04 2.78994L17.77 3.77994C18.68 4.29994 18.99 5.46994 18.47 6.36994C17.56 7.93994 18.3 9.21994 20.11 9.21994C21.15 9.21994 22.01 10.0699 22.01 11.1199V12.8799C22.01 13.9199 21.16 14.7799 20.11 14.7799C18.3 14.7799 17.56 16.0599 18.47 17.6299C18.99 18.5399 18.68 19.6999 17.77 20.2199L16.04 21.2099C15.25 21.6799 14.23 21.3999 13.76 20.6099L13.65 20.4199C12.75 18.8499 11.27 18.8499 10.36 20.4199L10.25 20.6099C9.78 21.3999 8.76 21.6799 7.97 21.2099L6.24 20.2199C5.33 19.6999 5.02 18.5299 5.54 17.6299C6.45 16.0599 5.71 14.7799 3.9 14.7799C2.85 14.7799 2 13.9199 2 12.8799Z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></svg>'
850 + 'svgIcon' => '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M2 12.8799V11.1199C2 10.0799 2.85 9.21994 3.9 9.21994C5.71 9.21994 6.45 7.93994 5.54 6.36994C5.02 5.46994 5.33 4.29994 6.24 3.77994L7.97 2.78994C8.76 2.31994 9.78 2.59994 10.25 3.38994L10.36 3.57994C11.26 5.14994 12.74 5.14994 13.65 3.57994L13.76 3.38994C14.23 2.59994 15.25 2.31994 16.04 2.78994L17.77 3.77994C18.68 4.29994 18.99 5.46994 18.47 6.36994C17.56 7.93994 18.3 9.21994 20.11 9.21994C21.15 9.21994 22.01 10.0699 22.01 11.1199V12.8799C22.01 13.9199 21.16 14.7799 20.11 14.7799C18.3 14.7799 17.56 16.0599 18.47 17.6299C18.99 18.5399 18.68 19.6999 17.77 20.2199L16.04 21.2099C15.25 21.6799 14.23 21.3999 13.76 20.6099L13.65 20.4199C12.75 18.8499 11.27 18.8499 10.36 20.4199L10.25 20.6099C9.78 21.3999 8.76 21.6799 7.97 21.2099L6.24 20.2199C5.33 19.6999 5.02 18.5299 5.54 17.6299C6.45 16.0599 5.71 14.7799 3.9 14.7799C2.85 14.7799 2 13.9199 2 12.8799Z" stroke="currentColor" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></svg>'
851 + ],
852 + 'calendar_events' => [
853 + 'type' => 'route',
854 + 'visible' => true,
855 + 'disable' => false,
856 + 'route' => [
857 + 'name' => 'calendar_events',
858 + 'params' => [
859 + 'calendar_id' => $calendar->id
860 + ]
861 + ],
862 + 'label' => __('Event Types', 'fluent-booking'),
863 + 'svgIcon' => '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8 6H21" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M8 12H21" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M8 18H21" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M3 6H3.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M3 12H3.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M3 18H3.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>'
781 864 ],
782 865 'remote_calendars' => [
783 866 'type' => 'route',
784 867 'visible' => true,