PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / 1.7.1
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution v1.7.1
2.5.0 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 All 34 releases
fluent-booking / app / Hooks / Handlers / AdminMenuHandler.php

AdminMenuHandler.php in Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution 1.7.1, at app/Hooks/Handlers/AdminMenuHandler.php

835 lines 37.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentBooking\App\Hooks\Handlers;
4
5 use FluentBooking\App\App;
6 use FluentBooking\App\Models\Calendar;
7 use FluentBooking\App\Models\CalendarSlot;
8 use FluentBooking\App\Services\DateTimeHelper;
9 use FluentBooking\App\Services\Helper;
10 use FluentBooking\App\Services\PermissionManager;
11 use FluentBooking\App\Services\TransStrings;
12
13 class AdminMenuHandler
14 {
15 public function register()
16 {
17 add_action('admin_menu', [$this, 'add']);
18
19 add_action('admin_enqueue_scripts', function () {
20 if (!isset($_REQUEST['page']) || $_REQUEST['page'] != 'fluent-booking') { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
21 return;
22 }
23 $this->enqueueAssets();
24 }, 100);
25 }
26
27 public function add()
28 {
29 $capability = PermissionManager::getMenuPermission();
30 $menuPriority = 26;
31
32 if (defined('FLUENTCRM')) {
33 $menuPriority = 4;
34 }
35
36 add_menu_page(
37 __('Fluent Booking', 'fluent-booking'),
38 __('Fluent Booking', 'fluent-booking'),
39 $capability,
40 'fluent-booking',
41 [$this, 'render'],
42 $this->getMenuIcon(),
43 $menuPriority
44 );
45
46 add_submenu_page(
47 'fluent-booking',
48 __('Dashboard', 'fluent-booking'),
49 __('Dashboard', 'fluent-booking'),
50 $capability,
51 'fluent-booking',
52 [$this, 'render']
53 );
54
55 add_submenu_page(
56 'fluent-booking',
57 __('Calendars', 'fluent-booking'),
58 __('Calendars', 'fluent-booking'),
59 $capability,
60 'fluent-booking#/calendars',
61 [$this, 'render']
62 );
63
64 add_submenu_page(
65 'fluent-booking',
66 __('Bookings', 'fluent-booking'),
67 __('Bookings', 'fluent-booking'),
68 $capability,
69 'fluent-booking#/scheduled-events',
70 [$this, 'render']
71 );
72
73 add_submenu_page(
74 'fluent-booking',
75 __('Availability', 'fluent-booking'),
76 __('Availability', 'fluent-booking'),
77 $capability,
78 'fluent-booking#/availability',
79 [$this, 'render']
80 );
81
82 add_submenu_page(
83 'fluent-booking',
84 __('Settings', 'fluent-booking'),
85 __('Settings', 'fluent-booking'),
86 'manage_options',
87 'fluent-booking#/settings/general-settings',
88 [$this, 'render']
89 );
90 }
91
92 public function render()
93 {
94 if (!as_has_scheduled_action('fluent_booking_five_minutes_tasks')) {
95 as_schedule_recurring_action(time(), (60 * 5), 'fluent_booking_five_minutes_tasks', [], 'fluent-booking', true);
96 }
97
98 $this->changeFooter();
99 $app = App::getInstance();
100
101 $config = $app->config;
102
103 $name = $config->get('app.name');
104
105 $slug = $config->get('app.slug');
106
107 $baseUrl = Helper::getAppBaseUrl();
108
109 if (is_admin()) {
110 $baseUrl = admin_url('admin.php?page=fluent-booking#/');
111 }
112
113 $isNew = $this->isNew();
114
115 $menuItems = [
116 [
117 'key' => 'dashboard',
118 'label' => $isNew ? __('Getting Started', 'fluent-booking') : __('Dashboard', 'fluent-booking'),
119 'permalink' => $baseUrl
120 ],
121 [
122 'key' => 'calendars',
123 'label' => __('Calendars', 'fluent-booking'),
124 'permalink' => $baseUrl . 'calendars'
125 ],
126 [
127 'key' => 'scheduled-events',
128 'label' => __('Bookings', 'fluent-booking'),
129 'permalink' => $baseUrl . 'scheduled-events?period=upcoming&author=me',
130 ],
131 [
132 'key' => 'availability',
133 'label' => __('Availability', 'fluent-booking'),
134 'permalink' => $baseUrl . 'availability'
135 ]
136 ];
137
138 if (current_user_can('manage_options')) {
139 $menuItems[] = [
140 'key' => 'settings',
141 'label' => __('Settings', 'fluent-booking'),
142 'permalink' => $baseUrl . 'settings/general-settings'
143 ];
144 }
145
146 if (!defined('FLUENT_BOOKING_PRO_DIR_FILE')) {
147 $menuItems[] = [
148 'key' => 'buy',
149 'label' => __('Upgrade to Pro', 'fluent-booking'),
150 'permalink' => Helper::getUpgradeUrl()
151 ];
152 }
153
154 $menuItems = apply_filters('fluent_booking/admin_menu_items', $menuItems);
155
156 $assets = $app['url.assets'];
157
158 $portalVars = apply_filters('fluent_booking/admin_portal_vars', [
159 'name' => $name,
160 'slug' => $slug,
161 'menuItems' => $menuItems,
162 'baseUrl' => $baseUrl,
163 'logo' => $assets . 'images/logo.svg',
164 ]);
165
166 $app->view->render('admin.menu', $portalVars);
167 }
168
169 public function changeFooter()
170 {
171 add_filter('admin_footer_text', function ($content) {
172 $url = 'https://fluentbooking.com/';
173 /* translators: %s: URL of the FluentBooking website */
174 return sprintf(wp_kses(__('Thank you for using <a href="%s">FluentBooking</a>.', 'fluent-booking'), array('a' => array('href' => array()))), esc_url($url)) . '<span title="based on your WP timezone settings" style="margin-left: 10px;" data-timestamp="' . current_time('timestamp') . '" id="fcal_server_timestamp"></span>';
175 });
176
177 add_filter('update_footer', function ($text) {
178 return FLUENT_BOOKING_VERSION;
179 });
180 }
181
182 public function enqueueAssets()
183 {
184 $app = App::getInstance();
185
186 $isRtl = Helper::fluentbooking_is_rtl();
187
188 $assets = $app['url.assets'];
189
190 $slug = $app->config->get('app.slug');
191
192 $adminAppCss = 'admin/admin.css';
193 if ($isRtl) {
194 $adminAppCss = 'admin/admin-rtl.css';
195 wp_enqueue_style('fluentbooking_admin_rtl', $assets . 'admin/fluentbooking_admin_rtl.css', [], FLUENT_BOOKING_ASSETS_VERSION);
196 }
197
198 add_action('wp_print_scripts', function () {
199
200 $isSkip = apply_filters('fluent_booking/skip_no_conflict', false, 'scripts');
201
202 if ($isSkip) {
203 return;
204 }
205
206 global $wp_scripts;
207 if (!$wp_scripts) {
208 return;
209 }
210
211 $approvedSlugs = apply_filters('fluent_booking/asset_listed_slugs', [
212 '\/fluent-crm\/'
213 ]);
214
215 $approvedSlugs[] = '\/fluent-booking\/';
216 $approvedSlugs[] = '\/fluent-booking-pro\/';
217
218 $approvedSlugs = array_unique($approvedSlugs);
219
220 $approvedSlugs = implode('|', $approvedSlugs);
221
222 $pluginUrl = plugins_url();
223
224 $pluginUrl = str_replace(['http:', 'https:'], '', $pluginUrl);
225
226 foreach ($wp_scripts->queue as $script) {
227 if (empty($wp_scripts->registered[$script]) || empty($wp_scripts->registered[$script]->src)) {
228 continue;
229 }
230
231 $src = $wp_scripts->registered[$script]->src;
232 $isMatched = (strpos($src, $pluginUrl) !== false) && !preg_match('/' . $approvedSlugs . '/', $src);
233 if (!$isMatched) {
234 continue;
235 }
236 wp_dequeue_script($wp_scripts->registered[$script]->handle);
237 }
238 });
239
240 add_action('wp_print_styles', function () {
241 $isSkip = apply_filters('fluent_booking/skip_no_conflict', false, 'styles');
242
243 if ($isSkip) {
244 return;
245 }
246
247 global $wp_styles;
248 if (!$wp_styles) {
249 return;
250 }
251
252 $approvedSlugs = apply_filters('fluent_booking/asset_listed_slugs', [
253 '\/fluent-crm\/'
254 ]);
255
256 $approvedSlugs[] = '\/fluent-booking\/';
257 $approvedSlugs[] = '\/fluent-booking-pro\/';
258
259 $approvedSlugs = array_unique($approvedSlugs);
260
261 $approvedSlugs = implode('|', $approvedSlugs);
262
263 $pluginUrl = plugins_url();
264
265 $themeUrl = get_theme_root_uri();
266
267 $pluginUrl = str_replace(['http:', 'https:'], '', $pluginUrl);
268 $themeUrl = str_replace(['http:', 'https:'], '', $themeUrl);
269
270 foreach ($wp_styles->queue as $script) {
271
272 if (empty($wp_styles->registered[$script]) || empty($wp_styles->registered[$script]->src)) {
273 continue;
274 }
275
276 $src = $wp_styles->registered[$script]->src;
277 $pluginMatched = (strpos($src, $pluginUrl) !== false) && !preg_match('/' . $approvedSlugs . '/', $src);
278 $themeMatched = (strpos($src, $themeUrl) !== false) && !preg_match('/' . $approvedSlugs . '/', $src);
279
280 if (!$pluginMatched && !$themeMatched) {
281 continue;
282 }
283
284 wp_dequeue_style($wp_styles->registered[$script]->handle);
285 }
286 }, 999999);
287
288 wp_enqueue_style('fluent_booing_admin_app', $assets . $adminAppCss, [], FLUENT_BOOKING_ASSETS_VERSION, 'all');
289
290 do_action($slug . '_loading_app');
291
292 wp_enqueue_script(
293 $slug . '_admin_app',
294 $assets . 'admin/app.js',
295 array('jquery'),
296 FLUENT_BOOKING_ASSETS_VERSION,
297 true
298 );
299
300 wp_enqueue_script(
301 $slug . '_global_admin',
302 $assets . 'admin/global_admin.js',
303 array(),
304 FLUENT_BOOKING_ASSETS_VERSION,
305 true
306 );
307
308 if (function_exists('wp_enqueue_editor')) {
309 add_filter('user_can_richedit', '__return_true');
310 wp_enqueue_editor();
311 wp_enqueue_media();
312 }
313
314 wp_localize_script($slug . '_admin_app', 'fluentFrameworkAdmin', $this->getDashboardVars($app));
315 }
316
317 public function getDashboardVars($app)
318 {
319 $assets = $app['url.assets'];
320 $currentUser = get_user_by('ID', get_current_user_id());
321
322 $currentUsername = trim($currentUser->first_name . ' ' . $currentUser->last_name);
323 if (!$currentUsername) {
324 $currentUsername = $currentUser->display_name;
325 }
326
327 $isNew = $this->isNew();
328
329 $requireSlug = false;
330
331 if ($isNew) {
332 $result = $this->maybeAutoCreateCalendar($currentUser);
333 if (!$result) {
334 $requireSlug = true;
335 }
336 }
337
338 $calendarId = null;
339
340 $firstCalendar = Calendar::where('user_id', $currentUser->ID)->where('type', 'simple')->first();
341
342 if ($firstCalendar) {
343 $calendarId = $firstCalendar->id;
344 }
345
346 $hasAllAccess = false;
347 if (PermissionManager::hasAllCalendarAccess()) {
348 $hasAllAccess = true;
349 }
350
351 $eventColors = Helper::getEventColors();
352 $meetingDurations = Helper::getMeetingDurations();
353 $multiDurations = Helper::getMeetingMultiDurations();
354 $durationLookup = Helper::getDurationLookup();
355 $multiDurationLookup = Helper::getDurationLookup(true);
356 $scheduleSchema = Helper::getWeeklyScheduleSchema();
357 $bufferTimes = Helper::getBufferTimes();
358 $slotIntervals = Helper::getSlotIntervals();
359 $customFieldTypes = Helper::getCustomFieldTypes();
360 $weekSelectTimes = Helper::getWeekSelectTimes();
361 $overrideSelectTimes = Helper::getOverrideSelectTimes();
362 $statusChangingTimes = Helper::getBookingStatusChangingTimes();
363 $defaultTermsAndConditions = Helper::getDefaultTermsAndConditions();
364 $locationFields = (new CalendarSlot())->getLocationFields();
365
366 return apply_filters('fluent_booking/admin_vars', [
367 'slug' => $slug = $app->config->get('app.slug'),
368 'nonce' => wp_create_nonce($slug),
369 'rest' => $this->getRestInfo($app),
370 'brand_logo' => $this->getMenuIcon(),
371 'asset_url' => $assets,
372 'event_colors' => $eventColors,
373 'meeting_durations' => $meetingDurations,
374 'multi_durations' => $multiDurations,
375 'buffer_times' => $bufferTimes,
376 'slot_intervals' => $slotIntervals,
377 'schedule_schema' => $scheduleSchema,
378 'location_fields' => $locationFields,
379 'custom_field_types' => $customFieldTypes,
380 'week_select_times' => $weekSelectTimes,
381 'duration_lookup' => $durationLookup,
382 'multi_duration_lookup' => $multiDurationLookup,
383 'override_select_times' => $overrideSelectTimes,
384 'status_changing_times' => $statusChangingTimes,
385 'default_terms' => $defaultTermsAndConditions,
386 'me' => [
387 'id' => $currentUser->ID,
388 'calendar_id' => $calendarId,
389 'full_name' => $currentUsername,
390 'email' => $currentUser->user_email,
391 'is_admin' => $hasAllAccess,
392 'permissions' => PermissionManager::getUserPermissions($currentUser, false),
393 ],
394 'all_hosts' => Calendar::getAllHosts(),
395 'is_new' => $isNew,
396 'require_slug' => $requireSlug,
397 'site_url' => site_url('/'),
398 'upgrade_url' => Helper::getUpgradeUrl(),
399 'timezones' => DateTimeHelper::getTimeZones(true),
400 'supported_features' => apply_filters('fluent_booking/supported_featured', [
401 'multi_users' => true
402 ]),
403 'i18' => [
404 'date_time_config' => DateTimeHelper::getI18nDateTimeConfig(),
405 ],
406 'has_pro' => defined('FLUENT_BOOKING_PRO_DIR_FILE'),
407 'require_upgrade' => defined('FLUENT_BOOKING_PRO_DIR_FILE') && !defined('FLUENT_BOOKING_LITE'),
408 'dashboard_notices' => apply_filters('fluent_booking/dashboard_notices', []),
409 'trans' => TransStrings::getStrings(),
410 'date_format' => DateTimeHelper::getDateFormatter(true),
411 'time_format' => DateTimeHelper::getTimeFormatter(true),
412 'date_time_formatter' => DateTimeHelper::getDateFormatter(true) . ', ' . DateTimeHelper::getTimeFormatter(true),
413 'available_date_formats' => DateTimeHelper::getAvailableDateFormats(),
414 'admin_url' => admin_url(),
415 'is_rtl' => Helper::fluentbooking_is_rtl()
416 ]);
417 }
418
419 protected function getRestInfo($app)
420 {
421 $ns = $app->config->get('app.rest_namespace');
422 $ver = $app->config->get('app.rest_version');
423
424 return [
425 'base_url' => esc_url_raw(rest_url()),
426 'url' => rest_url($ns . '/' . $ver),
427 'nonce' => wp_create_nonce('wp_rest'),
428 'namespace' => $ns,
429 'version' => $ver
430 ];
431 }
432
433 protected function getMenuIcon()
434 {
435 return 'data:image/svg+xml;base64,' . base64_encode('<svg width="96" height="101" viewBox="0 0 96 101" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="25.5746" width="6.39365" height="15.9841" rx="3.19683" fill="white"/><rect x="63.9365" width="6.39365" height="15.9841" rx="3.19683" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M54.878 53.0655C54.544 55.6678 53.4646 58.035 51.8535 59.9427C50.1623 61.9572 47.886 63.4614 45.2863 64.1988L45.1741 64.2309L44.9203 64.2976L44.8989 64.303L24.7671 69.7V65.019C24.7671 64.9148 24.7671 64.8106 24.7778 64.7064C24.8953 62.748 26.127 61.0862 27.8476 60.3514C28.0427 60.2659 28.2431 60.1938 28.4515 60.1377L28.6412 60.0869L54.8753 53.0575V53.0655H54.878Z" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M71.1411 35.8059C70.4571 41.1467 66.6178 45.5017 61.5494 46.9391L61.4372 46.9712L61.1861 47.038H61.1834L61.162 47.0433L24.7671 56.7953V52.1144C24.7671 50.0197 26.0362 48.2216 27.8476 47.4468L28.4515 47.233L28.6385 47.1823L71.1384 35.7952V35.8059H71.1411Z" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M19.9802 11.1889H75.9246C83.4282 11.1889 89.5111 17.2718 89.5111 24.7754V70H95.9048V24.7754C95.9048 13.7406 86.9593 4.79523 75.9246 4.79523H19.9802C8.94542 4.79523 0 13.7406 0 24.7754V80.7198C0 91.7546 8.94542 100.7 19.9802 100.7L64.9524 100.7V94.3063H19.9802C12.4765 94.3063 6.39365 88.2234 6.39365 80.7198V24.7754C6.39365 17.2718 12.4765 11.1889 19.9802 11.1889Z" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M95.9524 70.7477V69.7H64.9524V100.7H66.0001L95.9524 70.7477Z" fill="white"/></svg>');
436 }
437
438 protected function isNew()
439 {
440 return apply_filters('fluent_booking/is_new', !Calendar::first());
441 }
442
443 /**
444 * @param $user \WP_User
445 * @return bool | Calendar
446 */
447 protected function maybeAutoCreateCalendar($user)
448 {
449 if (!apply_filters('fluent_booking/auto_create_calendar', false, $user)) {
450 return false;
451 }
452
453 $userName = $user->user_login;
454
455 if (is_email($userName)) {
456 $userName = explode('@', $userName);
457 $userName = $userName[0];
458 }
459
460 if (!Helper::isCalendarSlugAvailable($userName, true)) {
461 return false;
462 }
463
464 $personName = trim($user->first_name . ' ' . $user->last_name);
465
466 if (!$personName) {
467 $personName = $user->display_name;
468 }
469
470 $data = [
471 'user_id' => $user->ID,
472 'title' => $personName,
473 'slug' => $userName
474 ];
475
476 return Calendar::create($data);
477 }
478
479 public static function settingsMenuItems()
480 {
481 $app = App::getInstance();
482 $urlAssets = $app['url.assets'];
483
484 return apply_filters('fluent_booking/settings_menu_items', [
485 'general_settings' => [
486 'title' => __('General Settings', 'fluent-booking'),
487 'disable' => false,
488 'el_icon' => 'Operation',
489 'component_type' => 'StandAloneComponent',
490 'class' => 'general_settings',
491 'route' => [
492 'name' => 'general_settings'
493 ]
494 ],
495 'team_members' => [
496 'title' => __('Team', 'fluent-booking'),
497 'disable' => true,
498 'el_icon' => 'TeamIcon',
499 'component_type' => 'StandAloneComponent',
500 'class' => 'team_members',
501 'route' => [
502 'name' => 'team_members'
503 ]
504 ],
505 'google' => [
506 'title' => __('Google Calendar / Meet', 'fluent-booking'),
507 'disable' => true,
508 'icon_url' => $urlAssets . 'images/gg-calendar.svg',
509 'component_type' => 'StandAloneComponent',
510 'class' => 'configure_google_calendar',
511 'route' => [
512 'name' => 'configure-google'
513 ]
514 ],
515 'outlook' => [
516 'title' => __('Outlook Calendar / MS Teams', 'fluent-booking'),
517 'disable' => true,
518 'icon_url' => $urlAssets . 'images/ol-icon-color.svg',
519 'component_type' => 'GlobalSettingsComponent',
520 'class' => 'configure_outlook_calendar',
521 'route' => [
522 'name' => 'configure-integrations',
523 'params' => [
524 'settings_key' => 'outlook'
525 ]
526 ]
527 ],
528 'apple_calendar' => [
529 'title' => __('Apple Calendar', 'fluent-booking'),
530 'disable' => true,
531 'icon_url' => $urlAssets . 'images/a-cal.svg',
532 'component_type' => 'GlobalSettingsComponent',
533 'class' => 'configure_apple_calendar',
534 'route' => [
535 'name' => 'configure-integrations',
536 'params' => [
537 'settings_key' => 'apple_calendar'
538 ]
539 ]
540 ],
541 'next_cloud_calendar' => [
542 'title' => __('Nextcloud Calendar', 'fluent-booking'),
543 'disable' => true,
544 'icon_url' => $urlAssets . 'images/Ncloud.svg',
545 'component_type' => 'GlobalSettingsComponent',
546 'class' => 'configure_nextcloud_calendar',
547 'route' => [
548 'name' => 'configure-integrations',
549 'params' => [
550 'settings_key' => 'next_cloud_calendar'
551 ]
552 ]
553 ],
554 'zoom_meeting' => [
555 'title' => __('Zoom', 'fluent-booking'),
556 'disable' => true,
557 'icon_url' => $urlAssets . 'images/zoom.svg',
558 'component_type' => 'StandAloneComponent',
559 'class' => 'zoom_integrations',
560 'route' => [
561 'name' => 'zoom_integrations'
562 ]
563 ],
564 'twilio' => [
565 'title' => __('SMS by Twilio', 'fluent-booking'),
566 'disable' => true,
567 'icon_url' => $urlAssets . 'images/tw.svg',
568 'component_type' => 'GlobalSettingsComponent',
569 'class' => 'configure_twilio',
570 'route' => [
571 'name' => 'configure-integrations',
572 'params' => [
573 'settings_key' => 'twilio'
574 ]
575 ]
576 ],
577 'stripe' => [
578 'title' => __('Stripe', 'fluent-booking'),
579 'disable' => true,
580 'icon_url' => $urlAssets . 'images/payment-methods/stripe.svg',
581 'component_type' => 'GlobalSettingsComponent',
582 'class' => 'stripe_payment',
583 'route' => [
584 'name' => 'PaymentSettingsIndex',
585 'params' => [
586 'settings_key' => 'stripe'
587 ]
588 ]
589 ],
590 'paypal' => [
591 'title' => __('PayPal', 'fluent-booking'),
592 'disable' => true,
593 'icon_url' => $urlAssets . 'images/payment-methods/paypal.svg',
594 'component_type' => 'GlobalSettingsComponent',
595 'class' => 'paypal_payment',
596 'route' => [
597 'name' => 'PaymentSettingsIndex',
598 'params' => [
599 'settings_key' => 'paypal'
600 ]
601 ]
602 ],
603 'offline' => [
604 'title' => __('Offline Payment', 'fluent-booking'),
605 'disable' => true,
606 'icon_url' => $urlAssets . 'images/payment-methods/offline.svg',
607 'component_type' => 'GlobalSettingsComponent',
608 'class' => 'offline_payment',
609 'route' => [
610 'name' => 'PaymentSettingsIndex',
611 'params' => [
612 'settings_key' => 'offline'
613 ]
614 ]
615 ],
616 'license' => [
617 'title' => __('License', 'fluent-booking'),
618 'disable' => true,
619 'el_icon' => 'Lock',
620 'component_type' => 'StandAloneComponent',
621 'class' => 'configure_license',
622 'route' => [
623 'name' => 'license'
624 ]
625 ],
626 ]);
627 }
628
629 public static function getEventSettingsMenuItems($event)
630 {
631 return apply_filters('fluent_booking/calendar_event_setting_menu_items', [
632 'event_details' => [
633 'type' => 'route',
634 'visible' => true,
635 'disable' => false,
636 'route' => [
637 'name' => 'event_details',
638 'params' => [
639 'calendar_id' => $event->calendar_id,
640 'event_id' => $event->id
641 ]
642 ],
643 'label' => __('Event Details', 'fluent-booking'),
644 '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>'
645 ],
646 'assignment' => [
647 'type' => 'route',
648 'visible' => false,
649 'disable' => true,
650 'route' => [
651 'name' => 'assignment',
652 'params' => [
653 'calendar_id' => $event->calendar_id,
654 'event_id' => $event->id
655 ]
656 ],
657 'label' => __('Assignment', 'fluent-booking'),
658 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mr-2 h-[16px] w-[16px] stroke-[2px] ltr:mr-2 rtl:ml-2 md:mt-px" data-testid="icon-component"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg>'
659 ],
660 'availability_settings' => [
661 'type' => 'route',
662 'visible' => true,
663 'disable' => false,
664 'route' => [
665 'name' => 'availability_settings',
666 'params' => [
667 'calendar_id' => $event->calendar_id,
668 'event_id' => $event->id
669 ]
670 ],
671 'label' => __('Availability', 'fluent-booking'),
672 '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>'
673 ],
674 'limit_settings' => [
675 'type' => 'route',
676 'visible' => true,
677 'disable' => false,
678 'route' => [
679 'name' => 'limit_settings',
680 'params' => [
681 'calendar_id' => $event->calendar_id,
682 'event_id' => $event->id
683 ]
684 ],
685 'label' => __('Limits', 'fluent-booking'),
686 'elIcon' => 'Clock'
687 ],
688 'question_settings' => [
689 'type' => 'route',
690 'visible' => true,
691 'disable' => false,
692 'route' => [
693 'name' => 'question_settings',
694 'params' => [
695 'calendar_id' => $event->calendar_id,
696 'event_id' => $event->id
697 ]
698 ],
699 'label' => __('Question Settings', 'fluent-booking'),
700 '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>'
701 ],
702 'email_notification' => [
703 'type' => 'route',
704 'visible' => true,
705 'disable' => false,
706 'route' => [
707 'name' => 'email_notification',
708 'params' => [
709 'calendar_id' => $event->calendar_id,
710 'event_id' => $event->id
711 ]
712 ],
713 'label' => __('Email Notification', 'fluent-booking'),
714 'elIcon' => 'Message'
715 ],
716 'sms_notification' => [
717 'type' => 'route',
718 'visible' => true,
719 'disable' => true,
720 'route' => [
721 'name' => 'sms_notification',
722 'params' => [
723 'calendar_id' => $event->calendar_id,
724 'event_id' => $event->id
725 ]
726 ],
727 'label' => __('SMS Notification', 'fluent-booking'),
728 'elIcon' => 'Notification'
729 ],
730 'advanced_settings' => [
731 'type' => 'route',
732 'visible' => true,
733 'disable' => true,
734 'route' => [
735 'name' => 'advanced_settings',
736 'params' => [
737 'calendar_id' => $event->calendar_id,
738 'event_id' => $event->id
739 ]
740 ],
741 'label' => __('Advanced Settings', 'fluent-booking'),
742 'elIcon' => 'Operation'
743 ],
744 'payment_settings' => [
745 'type' => 'route',
746 'visible' => true,
747 'disable' => true,
748 'route' => [
749 'name' => 'payment_settings',
750 'params' => [
751 'calendar_id' => $event->calendar_id,
752 'event_id' => $event->id
753 ]
754 ],
755 'label' => __('Payment Settings', 'fluent-booking'),
756 'elIcon' => 'Money'
757 ],
758 'webhook_settings' => [
759 'type' => 'route',
760 'visible' => true,
761 'disable' => true,
762 'route' => [
763 'name' => 'webhook_settings',
764 'params' => [
765 'calendar_id' => $event->calendar_id,
766 'event_id' => $event->id
767 ]
768 ],
769 'label' => __('Webhooks Feeds', 'fluent-booking'),
770 'elIcon' => 'Link'
771 ],
772 'integrations' => [
773 'type' => 'route',
774 'visible' => true,
775 'disable' => false,
776 'route' => [
777 'name' => 'integrations',
778 'params' => [
779 'calendar_id' => $event->calendar_id,
780 'event_id' => $event->id
781 ]
782 ],
783 'label' => __('Integrations', 'fluent-booking'),
784 'elIcon' => 'Connection'
785 ]
786 ], $event);
787 }
788
789 public static function getCalendarSettingsMenuItems($calendar)
790 {
791 return apply_filters('fluent_booking/calendar_setting_menu_items', [
792 'calendar_settings' => [
793 'type' => 'route',
794 'visible' => true,
795 'disable' => false,
796 'route' => [
797 'name' => 'calendar_settings',
798 'params' => [
799 'calendar_id' => $calendar->id
800 ]
801 ],
802 'label' => __('Calendar Settings', 'fluent-booking'),
803 '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>'
804 ],
805 'remote_calendars' => [
806 'type' => 'route',
807 'visible' => true,
808 'disable' => true,
809 'route' => [
810 'name' => 'remote_calendars',
811 'params' => [
812 'calendar_id' => $calendar->id
813 ]
814 ],
815 'label' => __('Remote Calendars', 'fluent-booking'),
816 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mr-2 h-[16px] w-[16px] stroke-[2px] ltr:mr-2 rtl:ml-2 md:mt-0" data-testid="icon-component"><rect width="18" height="18" x="3" y="4" rx="2" ry="2"></rect><line x1="16" x2="16" y1="2" y2="6"></line><line x1="8" x2="8" y1="2" y2="6"></line><line x1="3" x2="21" y1="10" y2="10"></line></svg>'
817 ],
818 'zoom_meeting' => [
819 'type' => 'route',
820 'visible' => true,
821 'disable' => true,
822 'route' => [
823 'name' => 'user_zoom_integration',
824 'params' => [
825 'calendar_id' => $calendar->id
826 ]
827 ],
828 'label' => __('Zoom Integration', 'fluent-booking'),
829 'svgIcon' => '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px"><circle cx="24" cy="24" r="20" fill="#2196f3"/><path fill="#fff" d="M29,31H14c-1.657,0-3-1.343-3-3V17h15c1.657,0,3,1.343,3,3V31z"/><polygon fill="#fff" points="37,31 31,27 31,21 37,17"/></svg>'
830 ]
831 ], $calendar);
832 }
833 }
834
835