PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.0.2
Jetpack – WP Security, Backup, Speed, & Growth v13.0.2
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 2 years ago
calendly.php
264 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 /**
16 * Registers the block for use in Gutenberg
17 * This is done via an action so that we can disable
18 * registration if we need to.
19 */
20 function register_block() {
21 Blocks::jetpack_register_block(
22 __DIR__,
23 array(
24 'render_callback' => __NAMESPACE__ . '\load_assets',
25 'plan_check' => true,
26 )
27 );
28 }
29 add_action( 'init', __NAMESPACE__ . '\register_block' );
30
31 /**
32 * Calendly block registration/dependency declaration.
33 *
34 * @param array $attr Array containing the Calendly block attributes.
35 * @param string $content String containing the Calendly block content.
36 *
37 * @return string
38 */
39 function load_assets( $attr, $content ) {
40
41 if ( is_admin() ) {
42 return;
43 }
44 $url = Jetpack_Gutenberg::validate_block_embed_url(
45 get_attribute( $attr, 'url' ),
46 array( 'calendly.com' )
47 );
48 if ( empty( $url ) ) {
49 return;
50 }
51
52 /*
53 * Enqueue necessary scripts and styles.
54 */
55 Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
56
57 $style = get_attribute( $attr, 'style' );
58 $hide_event_type_details = get_attribute( $attr, 'hideEventTypeDetails' );
59 $background_color = get_attribute( $attr, 'backgroundColor' );
60 $text_color = get_attribute( $attr, 'textColor' );
61 $primary_color = get_attribute( $attr, 'primaryColor' );
62 $classes = Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr, array( 'calendly-style-' . $style ) );
63 $block_id = wp_unique_id( 'calendly-block-' );
64 $is_amp_request = Blocks::is_amp_request();
65
66 if ( ! wp_script_is( 'jetpack-calendly-external-js' ) && ! $is_amp_request ) {
67 enqueue_calendly_js();
68 }
69
70 $base_url = $url;
71 $url = add_query_arg(
72 array(
73 'hide_event_type_details' => (int) $hide_event_type_details,
74 'background_color' => sanitize_hex_color_no_hash( $background_color ),
75 'text_color' => sanitize_hex_color_no_hash( $text_color ),
76 'primary_color' => sanitize_hex_color_no_hash( $primary_color ),
77 ),
78 $url
79 );
80
81 if ( 'link' === $style ) {
82 if ( ! wp_style_is( 'jetpack-calendly-external-css' ) ) {
83 wp_enqueue_style( 'jetpack-calendly-external-css', 'https://assets.calendly.com/assets/external/widget.css', null, JETPACK__VERSION );
84 }
85
86 // Render deprecated version of Calendly block if needed. New markup block button class before rendering here.
87 if ( ! str_contains( $content, 'wp-block-jetpack-button' ) ) {
88 $content = deprecated_render_button_v1( $attr, $block_id, $classes, $url );
89 } else {
90 $content = str_replace( 'calendly-widget-id', esc_attr( $block_id ), $content );
91 $content = str_replace( $base_url, $url, $content );
92 }
93
94 if ( ! $is_amp_request ) {
95 wp_add_inline_script(
96 'jetpack-calendly-external-js',
97 sprintf( "calendly_attach_link_events( '%s' )", esc_js( $block_id ) )
98 );
99 }
100 } elseif ( $is_amp_request ) { // Inline style.
101 $content = sprintf(
102 '<div class="%1$s" id="%2$s"><a href="%3$s" role="button" target="_blank">%4$s</a></div>',
103 esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
104 esc_attr( $block_id ),
105 esc_js( $url ),
106 wp_kses_post( get_attribute( $attr, 'submitButtonText' ) )
107 );
108 } else {
109 $content = sprintf(
110 '<div class="%1$s" id="%2$s"></div>',
111 esc_attr( $classes ),
112 esc_attr( $block_id )
113 );
114 $script = <<<JS_END
115 jetpackInitCalendly( %s, %s );
116 JS_END;
117 wp_add_inline_script(
118 'jetpack-calendly-external-js',
119 sprintf(
120 $script,
121 wp_json_encode(
122 esc_url_raw( $url ),
123 JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP
124 ),
125 wp_json_encode( $block_id, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP )
126 )
127 );
128 }
129
130 return $content;
131 }
132
133 /**
134 * Get filtered attributes.
135 *
136 * @param array $attributes Array containing the Calendly block attributes.
137 * @param string $attribute_name String containing the attribute name to get.
138 *
139 * @return string
140 */
141 function get_attribute( $attributes, $attribute_name ) {
142 if ( isset( $attributes[ $attribute_name ] ) ) {
143 return $attributes[ $attribute_name ];
144 }
145
146 $default_attributes = array(
147 'style' => 'inline',
148 'submitButtonText' => esc_html__( 'Schedule time with me', 'jetpack' ),
149 'backgroundColor' => 'ffffff',
150 'textColor' => '4D5055',
151 'primaryColor' => '00A2FF',
152 'hideEventTypeDetails' => false,
153 );
154
155 if ( isset( $default_attributes[ $attribute_name ] ) ) {
156 return $default_attributes[ $attribute_name ];
157 }
158 }
159
160 /**
161 * Enqueues the Calendly JS library and inline function to attach event
162 * handlers to the button.
163 *
164 * @return void
165 */
166 function enqueue_calendly_js() {
167 wp_enqueue_script(
168 'jetpack-calendly-external-js',
169 'https://assets.calendly.com/assets/external/widget.js',
170 null,
171 JETPACK__VERSION,
172 false
173 );
174
175 wp_add_inline_script(
176 'jetpack-calendly-external-js',
177 "function jetpackInitCalendly( url, elementId ) {
178 function initCalendlyWidget() {
179 if ( ! document.getElementById( elementId ) ) {
180 return;
181 }
182 Calendly.initInlineWidget({
183 url: url,
184 parentElement: document.getElementById( elementId ),
185 inlineStyles: false,
186 });
187 };
188 // For P2s only: wait until after o2 has
189 // replaced main#content to initialize widget.
190 if ( window.jQuery && window.o2 ) {
191 jQuery( 'body' ).on( 'ready_o2', function() { initCalendlyWidget() } );
192 // Else initialize widget without waiting.
193 } else {
194 document.addEventListener('DOMContentLoaded', function() {
195 initCalendlyWidget();
196 });
197 }
198 };
199
200 function calendly_attach_link_events( elementId ) {
201 var widget = document.getElementById( elementId );
202 if ( widget ) {
203 widget.addEventListener( 'click', function( event ) {
204 event.preventDefault();
205 Calendly.initPopupWidget( { url: event.target.href } );
206 } );
207 widget.addEventListener( 'keydown', function( event ) {
208 // Enter and space keys.
209 if ( event.keyCode === 13 || event.keyCode === 32 ) {
210 event.preventDefault();
211 event.target && event.target.click();
212 }
213 } );
214 }
215 }"
216 );
217 }
218
219 /**
220 * Renders a deprecated legacy version of the button HTML.
221 *
222 * @param array $attributes Array containing the Calendly block attributes.
223 * @param string $block_id The value for the ID attribute of the link.
224 * @param string $classes The CSS classes for the wrapper div.
225 * @param string $url Calendly URL for the link HREF.
226 *
227 * @return string
228 */
229 function deprecated_render_button_v1( $attributes, $block_id, $classes, $url ) {
230 // This is the legacy version, so create the full link content.
231 $submit_button_text = get_attribute( $attributes, 'submitButtonText' );
232 $submit_button_classes = get_attribute( $attributes, 'submitButtonClasses' );
233 $submit_button_text_color = get_attribute( $attributes, 'customTextButtonColor' );
234 $submit_button_background_color = get_attribute( $attributes, 'customBackgroundButtonColor' );
235
236 /*
237 * If we have some additional styles from the editor
238 * (a custom text color, custom bg color, or both )
239 * Let's add that CSS inline.
240 */
241 if ( ! empty( $submit_button_text_color ) || ! empty( $submit_button_background_color ) ) {
242 $inline_styles = sprintf(
243 '#%1$s{%2$s%3$s}',
244 esc_attr( $block_id ),
245 ! empty( $submit_button_text_color )
246 ? 'color:#' . sanitize_hex_color_no_hash( $submit_button_text_color ) . ';'
247 : '',
248 ! empty( $submit_button_background_color )
249 ? 'background-color:#' . sanitize_hex_color_no_hash( $submit_button_background_color ) . ';'
250 : ''
251 );
252 wp_add_inline_style( 'jetpack-calendly-external-css', $inline_styles );
253 }
254
255 return sprintf(
256 '<div class="wp-block-button %1$s"><a id="%2$s" class="%3$s" href="%4$s" role="button">%5$s</a></div>',
257 esc_attr( $classes ),
258 esc_attr( $block_id ),
259 ! empty( $submit_button_classes ) ? esc_attr( $submit_button_classes ) : 'wp-block-button__link',
260 esc_js( $url ),
261 wp_kses_post( $submit_button_text )
262 );
263 }
264