PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.5.1
Jetpack – WP Security, Backup, Speed, & Growth v14.5.1
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
265 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 $json_encode_flags = JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP;
118 if ( get_option( 'blog_charset' ) === 'UTF-8' ) {
119 $json_encode_flags |= JSON_UNESCAPED_UNICODE;
120 }
121 wp_add_inline_script(
122 'jetpack-calendly-external-js',
123 sprintf(
124 $script,
125 wp_json_encode( esc_url_raw( $url ), $json_encode_flags ),
126 wp_json_encode( $block_id, $json_encode_flags )
127 )
128 );
129 }
130
131 return $content;
132 }
133
134 /**
135 * Get filtered attributes.
136 *
137 * @param array $attributes Array containing the Calendly block attributes.
138 * @param string $attribute_name String containing the attribute name to get.
139 *
140 * @return string
141 */
142 function get_attribute( $attributes, $attribute_name ) {
143 if ( isset( $attributes[ $attribute_name ] ) ) {
144 return $attributes[ $attribute_name ];
145 }
146
147 $default_attributes = array(
148 'style' => 'inline',
149 'submitButtonText' => esc_html__( 'Schedule time with me', 'jetpack' ),
150 'backgroundColor' => 'ffffff',
151 'textColor' => '4D5055',
152 'primaryColor' => '00A2FF',
153 'hideEventTypeDetails' => false,
154 );
155
156 if ( isset( $default_attributes[ $attribute_name ] ) ) {
157 return $default_attributes[ $attribute_name ];
158 }
159 }
160
161 /**
162 * Enqueues the Calendly JS library and inline function to attach event
163 * handlers to the button.
164 *
165 * @return void
166 */
167 function enqueue_calendly_js() {
168 wp_enqueue_script(
169 'jetpack-calendly-external-js',
170 'https://assets.calendly.com/assets/external/widget.js',
171 null,
172 JETPACK__VERSION,
173 false
174 );
175
176 wp_add_inline_script(
177 'jetpack-calendly-external-js',
178 "function jetpackInitCalendly( url, elementId ) {
179 function initCalendlyWidget() {
180 if ( ! document.getElementById( elementId ) ) {
181 return;
182 }
183 Calendly.initInlineWidget({
184 url: url,
185 parentElement: document.getElementById( elementId ),
186 inlineStyles: false,
187 });
188 };
189 // For P2s only: wait until after o2 has
190 // replaced main#content to initialize widget.
191 if ( window.jQuery && window.o2 ) {
192 jQuery( 'body' ).on( 'ready_o2', function() { initCalendlyWidget() } );
193 // Else initialize widget without waiting.
194 } else {
195 document.addEventListener('DOMContentLoaded', function() {
196 initCalendlyWidget();
197 });
198 }
199 };
200
201 function calendly_attach_link_events( elementId ) {
202 var widget = document.getElementById( elementId );
203 if ( widget ) {
204 widget.addEventListener( 'click', function( event ) {
205 event.preventDefault();
206 Calendly.initPopupWidget( { url: event.target.href } );
207 } );
208 widget.addEventListener( 'keydown', function( event ) {
209 // Enter and space keys.
210 if ( event.keyCode === 13 || event.keyCode === 32 ) {
211 event.preventDefault();
212 event.target && event.target.click();
213 }
214 } );
215 }
216 }"
217 );
218 }
219
220 /**
221 * Renders a deprecated legacy version of the button HTML.
222 *
223 * @param array $attributes Array containing the Calendly block attributes.
224 * @param string $block_id The value for the ID attribute of the link.
225 * @param string $classes The CSS classes for the wrapper div.
226 * @param string $url Calendly URL for the link HREF.
227 *
228 * @return string
229 */
230 function deprecated_render_button_v1( $attributes, $block_id, $classes, $url ) {
231 // This is the legacy version, so create the full link content.
232 $submit_button_text = get_attribute( $attributes, 'submitButtonText' );
233 $submit_button_classes = get_attribute( $attributes, 'submitButtonClasses' );
234 $submit_button_text_color = get_attribute( $attributes, 'customTextButtonColor' );
235 $submit_button_background_color = get_attribute( $attributes, 'customBackgroundButtonColor' );
236
237 /*
238 * If we have some additional styles from the editor
239 * (a custom text color, custom bg color, or both )
240 * Let's add that CSS inline.
241 */
242 if ( ! empty( $submit_button_text_color ) || ! empty( $submit_button_background_color ) ) {
243 $inline_styles = sprintf(
244 '#%1$s{%2$s%3$s}',
245 esc_attr( $block_id ),
246 ! empty( $submit_button_text_color )
247 ? 'color:#' . sanitize_hex_color_no_hash( $submit_button_text_color ) . ';'
248 : '',
249 ! empty( $submit_button_background_color )
250 ? 'background-color:#' . sanitize_hex_color_no_hash( $submit_button_background_color ) . ';'
251 : ''
252 );
253 wp_add_inline_style( 'jetpack-calendly-external-css', $inline_styles );
254 }
255
256 return sprintf(
257 '<div class="wp-block-button %1$s"><a id="%2$s" class="%3$s" href="%4$s" role="button">%5$s</a></div>',
258 esc_attr( $classes ),
259 esc_attr( $block_id ),
260 ! empty( $submit_button_classes ) ? esc_attr( $submit_button_classes ) : 'wp-block-button__link',
261 esc_js( $url ),
262 wp_kses_post( $submit_button_text )
263 );
264 }
265