PluginProbe
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution / 1.5.25
Fluent Booking – The Ultimate Appointments Scheduling, Events Booking, Events Calendar Solution v1.5.25
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.25, at app/Services/Integrations/Elementor/Widgets/FcalCalendar.php

606 lines 27.6 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 $events = CalendarSlot::where('calendar_id', $selectedCalId)
317 ->whereIn('id', $eventIds)
318 ->get();
319
320 $calendar = Calendar::find($selectedCalId);
321
322 if (!$calendar || !$events) {
323 return [];
324 }
325
326 $formattedData = [
327 'user_profile' => $calendar->getAuthorProfile(),
328 'events' => $this->formatEvents($events),
329 ];
330
331 $formattedData['user_profile']['description'] = $calendar->description;
332
333 return $formattedData;
334 }
335
336
337 private function formatEvents($events)
338 {
339 $formattedEvents = [];
340 foreach ($events as $event) {
341 $event->description = $event->getDescription();
342 $formattedEvents[] = [
343 'title' => $event->title,
344 'color_schema' => $event->color_schema,
345 'short_description' => Helper::excerpt($event->description),
346 'durations' => $event->getAvailableDurations(),
347 ];
348 }
349
350 return $formattedEvents;
351 }
352
353
354 /**
355 * Render currency widget output on the frontend.
356 *
357 * @access protected
358 */
359 protected function render()
360 {
361 $settings = $this->get_settings_for_display();
362 $events = $this->getCalendarEvents($settings['selected_cal_id'], $settings['selected_event_ids']);
363
364 $blockEditor = new BlockEditorHandler();
365
366 $hostInfo = true;
367 if ($settings['show_host_info'] == 'yes') {
368 $hostInfo = false;
369 }
370
371 $attributes = [
372 'calendarId' => $settings['selected_cal_id'],
373 'eventIds' => $settings['selected_event_ids'],
374 'title' => $settings['title'],
375 'description' => $settings['description'],
376 'headerImage' => $settings['header_image'],
377 'hideInfo' => $hostInfo
378 ];
379
380 if (\Elementor\Plugin::$instance->editor->is_edit_mode()) :
381 // Output for editor
382 ?>
383 <style>
384 .fcal_calendar_wrapper .fcal_calendar_header {
385 text-align: center;
386 display: flex;
387 flex-direction: column;
388 align-items: center;
389 justify-content: center;
390 margin-bottom: 30px;
391 }
392 .fcal_calendar_wrapper .fcal_calendar_header .fcal_person_avatar {
393 display: inline-block;
394 }
395 .fcal_calendar_wrapper .fcal_calendar_header .fcal_person_avatar img {
396 max-width: 74px;
397 max-height: 74px;
398 width: 100%;
399 object-fit: cover;
400 border-radius: 8px;
401 }
402 .fcal_calendar_wrapper .fcal_calendar_header .fcal_calendar_title {
403 font-size: 1.5rem;
404 margin: 6px 0 0.2rem 0;
405 line-height: 1.2;
406 color: #1b2533;
407 font-weight: 500;
408 }
409 .fcal_calendar_wrapper .fcal_calendar_header .fcal_calendar_description {
410 font-size: 14px;
411 line-height: 20px;
412 color: #6b7280;
413 font-weight: 400;
414 }
415 .fcal_slots_wrap {
416 margin-top: 1rem;
417 }
418 .fcal_slots {
419 display: grid;
420 grid-template-columns: 1fr;
421 border: 1px solid #d6dae1;
422 border-radius: 8px;
423 overflow: hidden;
424 }
425 .fcal_slots .fcal_slot:last-child {
426 border-bottom: none;
427 }
428 .fcal_slot {
429 border-bottom: 1px solid #d6dae1;
430 padding: 16px 24px;
431 transition: 0.3s;
432 background: #ffffff;
433 }
434 .fcal_slot > .fcal_card {
435 text-decoration: none;
436 display: flex;
437 align-items: center;
438 justify-content: space-between;
439 }
440 .fcal_slot h2 {
441 font-size: 16px;
442 font-weight: 700;
443 line-height: 24px;
444 position: relative;
445 margin: 0;
446 color: #1B2533;
447 padding-left: 19px;
448 }
449 .fcal_slot h2 .fcal_slot_color_schema {
450 width: 10px;
451 height: 10px;
452 border-radius: 50%;
453 position: absolute;
454 left: 0;
455 top: 8px;
456 }
457 .fcal_slot .fcal_description {
458 font-size: 16px;
459 font-weight: 400;
460 line-height: 24px;
461 color: #6b7280;
462 margin: 0 0 7px;
463 padding-left: 19px;
464 }
465 .fcal_slot .fcal_slot_duration {
466 font-size: 12px;
467 font-weight: 500;
468 line-height: 18px;
469 margin: 0;
470 display: inline-flex;
471 align-items: center;
472 gap: 7px;
473 color: #445164;
474 padding-left: 19px;
475 }
476 .fcal_slot .book_now {
477 border: 1px solid #d6dae1;
478 color: #1b2533;
479 font-size: 14px;
480 font-weight: 500;
481 line-height: 20px;
482 display: inline-flex;
483 align-items: center;
484 border-radius: 8px;
485 background: transparent;
486 padding: 7px 16px 7px 16px;
487 transition: 0.3s;
488 gap: 8px;
489 position: relative;
490 }
491 .fcal_author_header {
492 text-align: center;
493 }
494 .fcal_author_header img {
495 width: 96px;
496 height: 96px;
497 object-fit: cover;
498 border-radius: 8px;
499 display: block;
500 margin: auto auto 10px auto;
501 }
502 .fcal_author_header h1 {
503 font-size: 20px;
504 font-weight: 700;
505 line-height: 28px;
506 margin: 0;
507 color: #1b2533;
508 }
509 .fcal_author_header p {
510 font-size: 16px;
511 line-height: 24px;
512 margin: 8px 0 0 0;
513 color: #6b7280;
514 }
515 </style>
516 <div class="fcal_calendar_wrapper">
517 <div class="fcal_cals_wrap">
518 <div class="fcal_calendar_header">
519 <?php if ($settings['header_image']) : ?>
520 <div class="fcal_person_avatar">
521 <img decoding="async" src="<?php echo esc_url($settings['header_image']['url']); ?>" alt="<?php echo esc_html($settings['title']); ?>">
522 </div>
523 <?php endif;
524 if ($settings['title']) : ?>
525 <h2 class="fcal_calendar_title"><?php echo esc_html($settings['title']); ?></h2>
526 <?php
527 endif;
528 if ($settings['description']) : ?>
529 <div class="fcal_calendar_description">
530 <?php echo esc_html($settings['description']); ?>
531 </div>
532 <?php endif; ?>
533 </div>
534 </div>
535
536 <?php
537 if (isset($events['events']) && !empty($events['events'])) : ?>
538 <div class="fluent_booking_team_view">
539 <?php if (!$hostInfo) : ?>
540 <div class="fcal_author_header">
541 <img src="<?php echo esc_url($events['user_profile']['avatar']); ?>" alt="<?php echo esc_attr($events['user_profile']['name']); ?>">
542 <div class="author_info">
543 <h1><?php echo esc_html($events['user_profile']['name']); ?></h1>
544 <?php if ($events['user_profile']['description']) : ?>
545 <p class="fcal_description"><?php echo esc_html($events['user_profile']['description']); ?></p>
546 <?php endif; ?>
547 </div>
548 </div>
549 <?php endif; ?>
550 <div class="fcal_slots_wrap">
551 <div class="fcal_slots">
552 <?php foreach ($events['events'] as $event) : ?>
553 <div class="fcal_slot">
554 <div class="fcal_card fcal_event_card">
555 <div class="fcal_slot_content">
556 <h2>
557 <span class="fcal_slot_color_schema" style="background: <?php echo esc_attr($event['color_schema']); ?>"></span>
558 <?php echo esc_html($event['title']); ?>
559 </h2>
560 <p class="fcal_description">
561 <?php echo esc_html($event['short_description']); ?>
562 </p>
563 <?php foreach ($event['durations'] as $duration) : ?>
564 <span class="fcal_slot_duration">
565 <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14"
566 viewBox="0 0 14 14"
567 fill="none">
568 <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"
569 stroke="#445164" stroke-linecap="round"
570 stroke-linejoin="round"></path>
571 <path d="M9.16418 8.855L7.35585 7.77584C7.04085 7.58917 6.78418 7.14 6.78418 6.7725V4.38084"
572 stroke="#445164" stroke-linecap="round"
573 stroke-linejoin="round"></path>
574 </svg>
575 <?php echo esc_html($duration); ?>
576 </span>
577 <?php endforeach; ?>
578 </div>
579 <span class="book_now">
580 Book Now
581 </span>
582 </div>
583 </div>
584 <?php endforeach; ?>
585 </div>
586 </div>
587 </div>
588 <?php else : ?>
589 <div class="fcal_empty"><?php esc_html_e('Please Select the Event(s)', 'fluent-booking-pro'); ?></div>
590 <?php endif; ?>
591 </div>
592 <?php else :
593 // Output for frontend
594 echo $blockEditor->fcalRenderCalendarManagementBlock($attributes);
595 endif;
596 ?>
597 <?php
598
599 }
600
601 public function content_template()
602 {
603
604 }
605 }
606