PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.6.4
Jetpack – WP Security, Backup, Speed, & Growth v12.6.4
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / extensions / blocks / calendly / calendly.php
jetpack / extensions / blocks / calendly Last commit date
calendly.php 3 years ago
calendly.php
257 lines
1 <?php
2 /**
3 * Calendly Block.
4 *
5 * @since 8.2.0
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\Calendly;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 const FEATURE_NAME = 'calendly';
16 const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
17
18 /**
19 * Registers the block for use in Gutenberg
20 * This is done via an action so that we can disable
21 * registration if we need to.
22 */
23 function register_block() {
24 Blocks::jetpack_register_block(
25 BLOCK_NAME,
26 array(
27 'render_callback' => __NAMESPACE__ . '\load_assets',
28 'plan_check' => true,
29 )
30 );
31 }
32 add_action( 'init', __NAMESPACE__ . '\register_block' );
33
34 /**
35 * Calendly block registration/dependency declaration.
36 *
37 * @param array $attr Array containing the Calendly block attributes.
38 * @param string $content String containing the Calendly block content.
39 *
40 * @return string
41 */
42 function load_assets( $attr, $content ) {
43
44 if ( is_admin() ) {
45 return;
46 }
47 $url = Jetpack_Gutenberg::validate_block_embed_url(
48 get_attribute( $attr, 'url' ),
49 array( 'calendly.com' )
50 );
51 if ( empty( $url ) ) {
52 return;
53 }
54
55 /*
56 * Enqueue necessary scripts and styles.
57 */
58 Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME );
59
60 $style = get_attribute( $attr, 'style' );
61 $hide_event_type_details = get_attribute( $attr, 'hideEventTypeDetails' );
62 $background_color = get_attribute( $attr, 'backgroundColor' );
63 $text_color = get_attribute( $attr, 'textColor' );
64 $primary_color = get_attribute( $attr, 'primaryColor' );
65 $classes = Blocks::classes( FEATURE_NAME, $attr, array( 'calendly-style-' . $style ) );
66 $block_id = wp_unique_id( 'calendly-block-' );
67 $is_amp_request = Blocks::is_amp_request();
68
69 if ( ! wp_script_is( 'jetpack-calendly-external-js' ) && ! $is_amp_request ) {
70 enqueue_calendly_js();
71 }
72
73 $base_url = $url;
74 $url = add_query_arg(
75 array(
76 'hide_event_type_details' => (int) $hide_event_type_details,
77 'background_color' => sanitize_hex_color_no_hash( $background_color ),
78 'text_color' => sanitize_hex_color_no_hash( $text_color ),
79 'primary_color' => sanitize_hex_color_no_hash( $primary_color ),
80 ),
81 $url
82 );
83
84 if ( 'link' === $style ) {
85 if ( ! wp_style_is( 'jetpack-calendly-external-css' ) ) {
86 wp_enqueue_style( 'jetpack-calendly-external-css', 'https://assets.calendly.com/assets/external/widget.css', null, JETPACK__VERSION );
87 }
88
89 // Render deprecated version of Calendly block if needed. New markup block button class before rendering here.
90 if ( false === strpos( $content, 'wp-block-jetpack-button' ) ) {
91 $content = deprecated_render_button_v1( $attr, $block_id, $classes, $url );
92 } else {
93 $content = str_replace( 'calendly-widget-id', esc_attr( $block_id ), $content );
94 $content = str_replace( $base_url, $url, $content );
95 }
96
97 if ( ! $is_amp_request ) {
98 wp_add_inline_script(
99 'jetpack-calendly-external-js',
100 sprintf( "calendly_attach_link_events( '%s' )", esc_js( $block_id ) )
101 );
102 }
103 } elseif ( $is_amp_request ) { // Inline style.
104 $content = sprintf(
105 '<div class="%1$s" id="%2$s"><a href="%3$s" role="button" target="_blank">%4$s</a></div>',
106 esc_attr( Blocks::classes( FEATURE_NAME, $attr ) ),
107 esc_attr( $block_id ),
108 esc_js( $url ),
109 wp_kses_post( get_attribute( $attr, 'submitButtonText' ) )
110 );
111 } else {
112 $content = sprintf(
113 '<div class="%1$s" id="%2$s"></div>',
114 esc_attr( $classes ),
115 esc_attr( $block_id )
116 );
117 $script = <<<JS_END
118 jetpackInitCalendly( '%s', '%s' );
119 JS_END;
120 wp_add_inline_script( 'jetpack-calendly-external-js', sprintf( $script, esc_url( $url ), esc_js( $block_id ) ) );
121 }
122
123 return $content;
124 }
125
126 /**
127 * Get filtered attributes.
128 *
129 * @param array $attributes Array containing the Calendly block attributes.
130 * @param string $attribute_name String containing the attribute name to get.
131 *
132 * @return string
133 */
134 function get_attribute( $attributes, $attribute_name ) {
135 if ( isset( $attributes[ $attribute_name ] ) ) {
136 return $attributes[ $attribute_name ];
137 }
138
139 $default_attributes = array(
140 'style' => 'inline',
141 'submitButtonText' => esc_html__( 'Schedule time with me', 'jetpack' ),
142 'backgroundColor' => 'ffffff',
143 'textColor' => '4D5055',
144 'primaryColor' => '00A2FF',
145 'hideEventTypeDetails' => false,
146 );
147
148 if ( isset( $default_attributes[ $attribute_name ] ) ) {
149 return $default_attributes[ $attribute_name ];
150 }
151 }
152
153 /**
154 * Enqueues the Calendly JS library and inline function to attach event
155 * handlers to the button.
156 *
157 * @return void
158 */
159 function enqueue_calendly_js() {
160 wp_enqueue_script(
161 'jetpack-calendly-external-js',
162 'https://assets.calendly.com/assets/external/widget.js',
163 null,
164 JETPACK__VERSION,
165 false
166 );
167
168 wp_add_inline_script(
169 'jetpack-calendly-external-js',
170 "function jetpackInitCalendly( url, elementId ) {
171 function initCalendlyWidget() {
172 if ( ! document.getElementById( elementId ) ) {
173 return;
174 }
175 Calendly.initInlineWidget({
176 url: url,
177 parentElement: document.getElementById( elementId ),
178 inlineStyles: false,
179 });
180 };
181 // For P2s only: wait until after o2 has
182 // replaced main#content to initialize widget.
183 if ( window.jQuery && window.o2 ) {
184 jQuery( 'body' ).on( 'ready_o2', function() { initCalendlyWidget() } );
185 // Else initialize widget without waiting.
186 } else {
187 document.addEventListener('DOMContentLoaded', function() {
188 initCalendlyWidget();
189 });
190 }
191 };
192
193 function calendly_attach_link_events( elementId ) {
194 var widget = document.getElementById( elementId );
195 if ( widget ) {
196 widget.addEventListener( 'click', function( event ) {
197 event.preventDefault();
198 Calendly.initPopupWidget( { url: event.target.href } );
199 } );
200 widget.addEventListener( 'keydown', function( event ) {
201 // Enter and space keys.
202 if ( event.keyCode === 13 || event.keyCode === 32 ) {
203 event.preventDefault();
204 event.target && event.target.click();
205 }
206 } );
207 }
208 }"
209 );
210 }
211
212 /**
213 * Renders a deprecated legacy version of the button HTML.
214 *
215 * @param array $attributes Array containing the Calendly block attributes.
216 * @param string $block_id The value for the ID attribute of the link.
217 * @param string $classes The CSS classes for the wrapper div.
218 * @param string $url Calendly URL for the link HREF.
219 *
220 * @return string
221 */
222 function deprecated_render_button_v1( $attributes, $block_id, $classes, $url ) {
223 // This is the legacy version, so create the full link content.
224 $submit_button_text = get_attribute( $attributes, 'submitButtonText' );
225 $submit_button_classes = get_attribute( $attributes, 'submitButtonClasses' );
226 $submit_button_text_color = get_attribute( $attributes, 'customTextButtonColor' );
227 $submit_button_background_color = get_attribute( $attributes, 'customBackgroundButtonColor' );
228
229 /*
230 * If we have some additional styles from the editor
231 * (a custom text color, custom bg color, or both )
232 * Let's add that CSS inline.
233 */
234 if ( ! empty( $submit_button_text_color ) || ! empty( $submit_button_background_color ) ) {
235 $inline_styles = sprintf(
236 '#%1$s{%2$s%3$s}',
237 esc_attr( $block_id ),
238 ! empty( $submit_button_text_color )
239 ? 'color:#' . sanitize_hex_color_no_hash( $submit_button_text_color ) . ';'
240 : '',
241 ! empty( $submit_button_background_color )
242 ? 'background-color:#' . sanitize_hex_color_no_hash( $submit_button_background_color ) . ';'
243 : ''
244 );
245 wp_add_inline_style( 'jetpack-calendly-external-css', $inline_styles );
246 }
247
248 return sprintf(
249 '<div class="wp-block-button %1$s"><a id="%2$s" class="%3$s" href="%4$s" role="button">%5$s</a></div>',
250 esc_attr( $classes ),
251 esc_attr( $block_id ),
252 ! empty( $submit_button_classes ) ? esc_attr( $submit_button_classes ) : 'wp-block-button__link',
253 esc_js( $url ),
254 wp_kses_post( $submit_button_text )
255 );
256 }
257