PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / 1.5.23
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution v1.5.23
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
fluent-booking / app / Services / Integrations / Elementor / Widgets / FcalCalendar.php

FcalCalendar.php in Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution 1.5.23, at app/Services/Integrations/Elementor/Widgets/FcalCalendar.php

600 lines 27.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\Services\Integrations\Elementor\Widgets;
4
5 use FluentBooking\App\Models\Calendar;
6 use FluentBooking\App\Hooks\Handlers\BlockEditorHandler;
7 use FluentBooking\App\Models\CalendarSlot;
8 use FluentBooking\App\Services\Helper;
9
10 class FcalCalendar extends \Elementor\Widget_Base
11 {
12
13 /**
14 * Get widget name.
15 *
16 * @return string Widget name.
17 */
18 public function get_name()
19 {
20 return 'fluentbooking-calendar';
21 }
22
23 /**
24 * Get widget title.
25 *
26 * @return string Widget title.
27 */
28 public function get_title()
29 {
30 return esc_html__('Calendar', 'fluent-booking-pro');
31 }
32
33 /**
34 * Get widget icon.
35 *
36 * @return string Widget icon.
37 */
38 public function get_icon()
39 {
40 return 'fluent-booking-icon';
41 }
42
43 /**
44 * Get widget categories.
45 *
46 * @return array Widget categories.
47 */
48 public function get_categories()
49 {
50 return ['fluentbooking'];
51 }
52
53 /**
54 * Get widget keywords.
55 *
56 * @return array Widget keywords.
57 */
58 public function get_keywords()
59 {
60 return ['fluent', 'booking', 'calendar', 'team', 'event'];
61 }
62
63 /**
64 * Register FluentBooking widget controls.
65 *
66 * @access protected
67 */
68 protected function register_controls()
69 {
70
71 $this->start_controls_section(
72 'content_section',
73 [
74 'label' => esc_html__('Content', 'fluent-booking-pro'),
75 'tab' => \Elementor\Controls_Manager::TAB_CONTENT,
76 ]
77 );
78 $this->add_control(
79 'title',
80 [
81 'label' => esc_html__('Title', 'fluent-booking-pro'),
82 'type' => \Elementor\Controls_Manager::TEXT,
83 'placeholder' => esc_html__('Enter title here', 'fluent-booking-pro'),
84 ]
85 );
86 $this->add_control(
87 'description',
88 [
89 'label' => esc_html__('Description', 'fluent-booking-pro'),
90 'type' => \Elementor\Controls_Manager::TEXTAREA,
91 'rows' => 4,
92 'placeholder' => esc_html__('Enter description here', 'fluent-booking-pro'),
93 ]
94 );
95 $this->add_control(
96 'header_image',
97 [
98 'label' => esc_html__('Choose Header Image', 'fluent-booking-pro'),
99 'type' => \Elementor\Controls_Manager::MEDIA
100 ]
101 );
102 $this->add_control(
103 'show_host_info',
104 [
105 'label' => esc_html__('Host Info', 'fluent-booking-pro'),
106 'type' => \Elementor\Controls_Manager::SWITCHER,
107 'label_on' => esc_html__('Show', 'fluent-booking-pro'),
108 'label_off' => esc_html__('Hide', 'fluent-booking-pro'),
109 'return_value' => 'yes',
110 'default' => 'yes',
111 ]
112 );
113
114 $this->add_control(
115 'selected_cal_id',
116 [
117 'label' => esc_html__('Select Calendar', 'fluent-booking-pro'),
118 'type' => \Elementor\Controls_Manager::SELECT,
119 'label_block' => true,
120 'options' => $this->getCalendars()
121 ]
122 );
123
124 $this->add_control(
125 'selected_event_ids',
126 [
127 'label' => esc_html__('Select Events', 'fluent-booking-pro'),
128 'type' => \Elementor\Controls_Manager::SELECT2,
129 'label_block' => true,
130 'multiple' => true,
131 'options' => []
132 ]
133 );
134
135 $this->end_controls_section();
136
137 $this->styleSettings();
138 }
139
140 private function styleSettings()
141 {
142 $this->start_controls_section(
143 'content_style',
144 [
145 'label' => esc_html__('Style', 'fluent-booking-pro'),
146 'tab' => \Elementor\Controls_Manager::TAB_STYLE,
147 ]
148 );
149 $this->add_control('fcal_primary_color',
150 [
151 'label' => esc_html__('Primary Color', 'fluent-booking-pro'),
152 'type' => \Elementor\Controls_Manager::COLOR,
153 'selectors' => [
154 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day .is-today,
155 {{WRAPPER}} .fcal_slot_picker .fcal_spot_lists .fcal_spot.fcal_spot_selected .fcal_spot_name' => 'color: {{VALUE}}',
156 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day .is-today:before' => 'background: {{VALUE}}',
157 '{{WRAPPER}} .fcal_slot_picker .fcal_spot_lists .fcal_spot .fcal_spot_confirm' => 'background: {{VALUE}}',
158 '{{WRAPPER}} .calendar_nav .fcal_nav_active svg' => 'color: {{VALUE}}',
159 '{{WRAPPER}} .fcal_timezone_select .svelte-select.focused' => 'border-color: {{VALUE}} !important',
160 '{{WRAPPER}} .fcal_timezone_select .svelte-select .svelte-select-list .item.active' => 'border-color: {{VALUE}} !important',
161 '{{WRAPPER}} .fcal_slot_picker .fcal_spot_lists .fcal_spot.fcal_spot_selected' => 'border-color: {{VALUE}}',
162 '{{WRAPPER}} .fcal_slot_picker .fcal_spot_lists .fcal_spot:hover' => 'border-color: {{VALUE}}',
163 '{{WRAPPER}} .fcal_timezone_select .svelte-select .svelte-select-list .item.hover' => 'background: {{VALUE}} !important',
164 '{{WRAPPER}} .fcal_slot_picker .fcal_spot_lists .fcal_spot:before' => 'background: {{VALUE}} !important',
165 '{{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content input:focus' => 'border-color: {{VALUE}} !important',
166 '{{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content select:focus' => 'border-color: {{VALUE}} !important',
167 '{{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content textarea:focus' => 'border-color: {{VALUE}} !important',
168 '{{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item button' => 'border-color: {{VALUE}}; background: {{VALUE}};',
169 '{{WRAPPER}} span.fcal_host_badge' => 'color: {{VALUE}}',
170 '{{WRAPPER}} span.fcal_host_badge:before' => 'background: {{VALUE}}',
171 '{{WRAPPER}} .fcal_normal_booking_footer a' => 'color: {{VALUE}}',
172 '{{WRAPPER}} .fcal_timezone_select .svelte-select.list-open:before' => 'border-bottom-color: {{VALUE}}; border-left-color: {{VALUE}}',
173 '{{WRAPPER}} .fcal_loading_dates_inner .wrapper .cube' => 'background-color: {{VALUE}}',
174 '{{WRAPPER}} .fcal_calendar_inner .fcal_icon_item .fcal_multi_duration .fcal_duration.is_selected' => 'background-color: {{VALUE}}',
175 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day.day-enabled:hover span' => 'background-color: {{VALUE}}',
176 '{{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_radio_group .fcal_radio_icon::before,
177 {{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .fcal_date_event_details .fcal_date_event_details_header .fcal_back button.fcal_svg:hover' => 'background: {{VALUE}}',
178 '{{WRAPPER}} .fcal_no_availability button' => 'background-color: {{VALUE}}',
179 '{{WRAPPER}} .fcal_slot button svg path' => 'stroke: {{VALUE}}',
180 '{{WRAPPER}} .fcal_slot_wrapper .fcal_back .fcal_back_btn:hover,
181 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_radio_group input:checked ~ .fcal_radio_icon,
182 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_custom_checkbox input:checked ~ .checkbox_mark,
183 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_custom_checkbox input:focus ~ .checkbox_mark' => 'border-color: {{VALUE}}',
184 '{{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_custom_checkbox input:checked ~ .checkbox_mark' => 'background: {{VALUE}}'
185 ],
186 ]
187 );
188 $this->add_control('fcal_border_color',
189 [
190 'label' => esc_html__('Border Color', 'fluent-booking-pro'),
191 'type' => \Elementor\Controls_Manager::COLOR,
192 'selectors' => [
193 '{{WRAPPER}} .fcal_calendar_inner .fcal_side' => 'border-right-color: {{VALUE}}',
194 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .fcal_date_event_details .fcal_date_event_details_header' => 'border-bottom-color: {{VALUE}}',
195 '{{WRAPPER}} {{WRAPPER}} .fcal_payment_items table tbody td' => 'border-bottom-color: {{VALUE}} !important',
196 '{{WRAPPER}} .fcal_wrap .fcal_calendar_inner,
197 {{WRAPPER}} .fcal_slot_picker .fcal_slot_picker_header .fcal_slot_picker_header_action, {{WRAPPER}} .fcal_slot_picker .fcal_spot_lists .fcal_spot,
198 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content select,
199 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content textarea,
200 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content input,
201 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_radio_group .fcal_radio_icon,
202 {{WRAPPER}} .fcal_booking_form_wrap .fcal_booking_form .fcal_form_item .fcal_input_content .fcal_custom_checkbox .checkbox_mark,
203 {{WRAPPER}} .fcal_payment_items table' => 'border-color: {{VALUE}}',
204 '{{WRAPPER}} .fcal_timezone_select .svelte-select,
205 {{WRAPPER}} .fcal_slot_picker .fcal_slot_picker_header .fcal_back .fcal_svg,
206 {{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .fcal_date_event_details .fcal_date_event_details_header .fcal_back button.fcal_svg' => 'border-color: {{VALUE}} !important',
207 '{{WRAPPER}} .fcal_slot' => 'border-bottom-color: {{VALUE}}',
208 '{{WRAPPER}} .fcal_slots,
209 {{WRAPPER}} .fcal_slot .book_now' => 'border-color: {{VALUE}}'
210 ],
211 ]
212 );
213 $this->add_control(
214 'avatar-radius',
215 [
216 'label' => esc_html__('Avatar Radius', 'fluent-booking-pro'),
217 'type' => \Elementor\Controls_Manager::DIMENSIONS,
218 'size_units' => ['px', '%', 'em', 'rem', 'custom'],
219 'default' => [
220 'top' => 8,
221 'right' => 8,
222 'bottom' => 8,
223 'left' => 8,
224 'unit' => 'px',
225 'isLinked' => true,
226 ],
227 'selectors' => [
228 '{{WRAPPER}} .fcal_calendar_inner .fcal_side .fcal_author_avatar img,
229 {{WRAPPER}} .fcal_author_header img,
230 {{WRAPPER}} .fcal_calendar_wrapper .fcal_calendar_header .fcal_person_avatar img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
231 ],
232 'condition' => [
233 'show_host_info' => 'yes',
234 ],
235 ]
236 );
237
238 $this->add_control(
239 'date-radius',
240 [
241 'label' => esc_html__('Date Radius', 'fluent-booking-pro'),
242 'type' => \Elementor\Controls_Manager::DIMENSIONS,
243 'size_units' => ['px', '%', 'em', 'rem', 'custom'],
244 'default' => [
245 'top' => 4,
246 'right' => 4,
247 'bottom' => 4,
248 'left' => 4,
249 'unit' => 'px',
250 'isLinked' => true,
251 ],
252 'selectors' => [
253 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day.day-enabled span' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}} !important;',
254 ],
255 ]
256 );
257
258 $this->add_control('enabled_date_background',
259 [
260 'label' => esc_html__('Enabled Date Background', 'fluent-booking-pro'),
261 'type' => \Elementor\Controls_Manager::COLOR,
262 'selectors' => [
263 '{{WRAPPER}} .fcal_payment_items table thead th' => 'background-color: {{VALUE}}',
264 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day.day-enabled span' => 'background-color: {{VALUE}}',
265 '{{WRAPPER}} .fcal_calendar_inner .fcal_icon_item .fcal_multi_duration .fcal_duration:not(.is_selected)' => 'background-color: {{VALUE}}',
266 ],
267 ]
268 );
269 $this->add_control('enabled_date_color',
270 [
271 'label' => esc_html__('Enabled Date Color', 'fluent-booking-pro'),
272 'type' => \Elementor\Controls_Manager::COLOR,
273 'selectors' => [
274 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day.day-enabled span' => 'color: {{VALUE}}',
275 ],
276 ]
277 );
278 $this->add_control('disabled_date_color',
279 [
280 'label' => esc_html__('Disabled Date Color', 'fluent-booking-pro'),
281 'type' => \Elementor\Controls_Manager::COLOR,
282 'selectors' => [
283 '{{WRAPPER}} .fcal_calendar_inner .fcal_date_wrapper .calendar .day.day-disabled' => 'color: {{VALUE}}',
284 ],
285 ]
286 );
287
288 $this->end_controls_section();
289 }
290
291 private function getCalendars()
292 {
293 $calendars = Calendar::with(['events' => function ($query) {
294 $query->where('status', 'active');
295 }])->where('status', 'active')->get();
296
297 $formattedValue = [];
298
299 if (empty($calendars)) {
300 return $formattedValue;
301 }
302
303 foreach ($calendars as $calendar) {
304 $formattedValue[$calendar->id] = $calendar->title;
305 }
306
307 return $formattedValue;
308 }
309
310 private function getCalendarEvents($selectedCalId, $eventIds)
311 {
312 if (empty($eventIds) || empty($selectedCalId)) {
313 return [];
314 }
315
316 $calendar = Calendar::findOrFail($selectedCalId);
317 $events = CalendarSlot::where('calendar_id', $selectedCalId)
318 ->whereIn('id', $eventIds)
319 ->get();
320
321 $formattedData = [
322 'user_profile' => $calendar->getAuthorProfile(),
323 'events' => $this->formatEvents($events),
324 ];
325 $formattedData['user_profile']['description'] = $calendar->description;
326
327 return $formattedData;
328 }
329
330
331 private function formatEvents($events)
332 {
333 $formattedEvents = [];
334 foreach ($events as $event) {
335 $event->description = $event->getDescription();
336 $formattedEvents[] = [
337 'title' => $event->title,
338 'color_schema' => $event->color_schema,
339 'short_description' => Helper::excerpt($event->description),
340 'durations' => $event->getAvailableDurations(),
341 ];
342 }
343
344 return $formattedEvents;
345 }
346
347
348 /**
349 * Render currency widget output on the frontend.
350 *
351 * @access protected
352 */
353 protected function render()
354 {
355 $settings = $this->get_settings_for_display();
356 $events = $this->getCalendarEvents($settings['selected_cal_id'], $settings['selected_event_ids']);
357
358 $blockEditor = new BlockEditorHandler();
359
360 $hostInfo = true;
361 if ($settings['show_host_info'] == 'yes') {
362 $hostInfo = false;
363 }
364
365 $attributes = [
366 'calendarId' => $settings['selected_cal_id'],
367 'eventIds' => $settings['selected_event_ids'],
368 'title' => $settings['title'],
369 'description' => $settings['description'],
370 'headerImage' => $settings['header_image'],
371 'hideInfo' => $hostInfo
372 ];
373
374 if (\Elementor\Plugin::$instance->editor->is_edit_mode()) :
375 // Output for editor
376 ?>
377 <style>
378 .fcal_calendar_wrapper .fcal_calendar_header {
379 text-align: center;
380 display: flex;
381 flex-direction: column;
382 align-items: center;
383 justify-content: center;
384 margin-bottom: 30px;
385 }
386 .fcal_calendar_wrapper .fcal_calendar_header .fcal_person_avatar {
387 display: inline-block;
388 }
389 .fcal_calendar_wrapper .fcal_calendar_header .fcal_person_avatar img {
390 max-width: 74px;
391 max-height: 74px;
392 width: 100%;
393 object-fit: cover;
394 border-radius: 8px;
395 }
396 .fcal_calendar_wrapper .fcal_calendar_header .fcal_calendar_title {
397 font-size: 1.5rem;
398 margin: 6px 0 0.2rem 0;
399 line-height: 1.2;
400 color: #1b2533;
401 font-weight: 500;
402 }
403 .fcal_calendar_wrapper .fcal_calendar_header .fcal_calendar_description {
404 font-size: 14px;
405 line-height: 20px;
406 color: #6b7280;
407 font-weight: 400;
408 }
409 .fcal_slots_wrap {
410 margin-top: 1rem;
411 }
412 .fcal_slots {
413 display: grid;
414 grid-template-columns: 1fr;
415 border: 1px solid #d6dae1;
416 border-radius: 8px;
417 overflow: hidden;
418 }
419 .fcal_slots .fcal_slot:last-child {
420 border-bottom: none;
421 }
422 .fcal_slot {
423 border-bottom: 1px solid #d6dae1;
424 padding: 16px 24px;
425 transition: 0.3s;
426 background: #ffffff;
427 }
428 .fcal_slot > .fcal_card {
429 text-decoration: none;
430 display: flex;
431 align-items: center;
432 justify-content: space-between;
433 }
434 .fcal_slot h2 {
435 font-size: 16px;
436 font-weight: 700;
437 line-height: 24px;
438 position: relative;
439 margin: 0;
440 color: #1B2533;
441 padding-left: 19px;
442 }
443 .fcal_slot h2 .fcal_slot_color_schema {
444 width: 10px;
445 height: 10px;
446 border-radius: 50%;
447 position: absolute;
448 left: 0;
449 top: 8px;
450 }
451 .fcal_slot .fcal_description {
452 font-size: 16px;
453 font-weight: 400;
454 line-height: 24px;
455 color: #6b7280;
456 margin: 0 0 7px;
457 padding-left: 19px;
458 }
459 .fcal_slot .fcal_slot_duration {
460 font-size: 12px;
461 font-weight: 500;
462 line-height: 18px;
463 margin: 0;
464 display: inline-flex;
465 align-items: center;
466 gap: 7px;
467 color: #445164;
468 padding-left: 19px;
469 }
470 .fcal_slot .book_now {
471 border: 1px solid #d6dae1;
472 color: #1b2533;
473 font-size: 14px;
474 font-weight: 500;
475 line-height: 20px;
476 display: inline-flex;
477 align-items: center;
478 border-radius: 8px;
479 background: transparent;
480 padding: 7px 16px 7px 16px;
481 transition: 0.3s;
482 gap: 8px;
483 position: relative;
484 }
485 .fcal_author_header {
486 text-align: center;
487 }
488 .fcal_author_header img {
489 width: 96px;
490 height: 96px;
491 object-fit: cover;
492 border-radius: 8px;
493 display: block;
494 margin: auto auto 10px auto;
495 }
496 .fcal_author_header h1 {
497 font-size: 20px;
498 font-weight: 700;
499 line-height: 28px;
500 margin: 0;
501 color: #1b2533;
502 }
503 .fcal_author_header p {
504 font-size: 16px;
505 line-height: 24px;
506 margin: 8px 0 0 0;
507 color: #6b7280;
508 }
509 </style>
510 <div class="fcal_calendar_wrapper">
511 <div class="fcal_cals_wrap">
512 <div class="fcal_calendar_header">
513 <?php if ($settings['header_image']) : ?>
514 <div class="fcal_person_avatar">
515 <img decoding="async" src="<?php echo esc_url($settings['header_image']['url']); ?>" alt="<?php echo esc_html($settings['title']); ?>">
516 </div>
517 <?php endif;
518 if ($settings['title']) : ?>
519 <h2 class="fcal_calendar_title"><?php echo esc_html($settings['title']); ?></h2>
520 <?php
521 endif;
522 if ($settings['description']) : ?>
523 <div class="fcal_calendar_description">
524 <?php echo esc_html($settings['description']); ?>
525 </div>
526 <?php endif; ?>
527 </div>
528 </div>
529
530 <?php
531 if (isset($events['events']) && !empty($events['events'])) : ?>
532 <div class="fluent_booking_team_view">
533 <?php if (!$hostInfo) : ?>
534 <div class="fcal_author_header">
535 <img src="<?php echo esc_url($events['user_profile']['avatar']); ?>" alt="<?php echo esc_attr($events['user_profile']['name']); ?>">
536 <div class="author_info">
537 <h1><?php echo esc_html($events['user_profile']['name']); ?></h1>
538 <?php if ($events['user_profile']['description']) : ?>
539 <p class="fcal_description"><?php echo esc_html($events['user_profile']['description']); ?></p>
540 <?php endif; ?>
541 </div>
542 </div>
543 <?php endif; ?>
544 <div class="fcal_slots_wrap">
545 <div class="fcal_slots">
546 <?php foreach ($events['events'] as $event) : ?>
547 <div class="fcal_slot">
548 <div class="fcal_card fcal_event_card">
549 <div class="fcal_slot_content">
550 <h2>
551 <span class="fcal_slot_color_schema" style="background: <?php echo esc_attr($event['color_schema']); ?>"></span>
552 <?php echo esc_html($event['title']); ?>
553 </h2>
554 <p class="fcal_description">
555 <?php echo esc_html($event['short_description']); ?>
556 </p>
557 <?php foreach ($event['durations'] as $duration) : ?>
558 <span class="fcal_slot_duration">
559 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14"
560 viewBox="0 0 14 14"
561 fill="none">
562 <path d="M12.8334 7C12.8334 10.22 10.22 12.8333 7.00002 12.8333C3.78002 12.8333 1.16669 10.22 1.16669 7C1.16669 3.78 3.78002 1.16666 7.00002 1.16666C10.22 1.16666 12.8334 3.78 12.8334 7Z"
563 stroke="#445164" stroke-linecap="round"
564 stroke-linejoin="round"></path>
565 <path d="M9.16418 8.855L7.35585 7.77584C7.04085 7.58917 6.78418 7.14 6.78418 6.7725V4.38084"
566 stroke="#445164" stroke-linecap="round"
567 stroke-linejoin="round"></path>
568 </svg>
569 <?php echo esc_html($duration); ?>
570 </span>
571 <?php endforeach; ?>
572 </div>
573 <span class="book_now">
574 Book Now
575 </span>
576 </div>
577 </div>
578 <?php endforeach; ?>
579 </div>
580 </div>
581 </div>
582 <?php else : ?>
583 <div class="fcal_empty"><?php esc_html_e('Please Select the Event(s)', 'fluent-booking-pro'); ?></div>
584 <?php endif; ?>
585 </div>
586 <?php else :
587 // Output for frontend
588 echo $blockEditor->fcalRenderCalendarManagementBlock($attributes);
589 endif;
590 ?>
591 <?php
592
593 }
594
595 public function content_template()
596 {
597
598 }
599 }
600