PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.3.2
Jetpack – WP Security, Backup, Speed, & Growth v12.3.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 / modules / contact-form / grunion-editor-view.php
jetpack / modules / contact-form Last commit date
css 3 years ago images 3 years ago js 3 years ago admin.php 3 years ago class-grunion-contact-form-endpoint.php 1 year ago grunion-contact-form.php 3 years ago grunion-editor-view.php 4 years ago grunion-form-view.php 3 years ago grunion-response-email-template.php 3 years ago
grunion-editor-view.php
327 lines
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
3 use Automattic\Jetpack\Assets;
4
5 /*
6 * A prototype to allow inline editing / editor views for contact forms.\
7 *
8 * Originally developed in: https://github.com/automattic/gm2016-grunion-editor
9 * Authors: Michael Arestad, Andrew Ozz, and George Stephanis
10 */
11
12 /**
13 * Grunion editor view class.
14 */
15 class Grunion_Editor_View {
16
17 /**
18 * Add hooks according to screen.
19 *
20 * @param WP_Screen $screen Data about current screen.
21 */
22 public static function add_hooks( $screen ) {
23 if ( isset( $screen->base ) && 'post' === $screen->base ) {
24 add_action( 'admin_notices', array( __CLASS__, 'handle_editor_view_js' ) );
25 add_action( 'admin_head', array( __CLASS__, 'admin_head' ) );
26 }
27 }
28
29 /**
30 * Admin header.
31 */
32 public static function admin_head() {
33 remove_action( 'media_buttons', 'grunion_media_button', 999 );
34 add_action( 'media_buttons', array( __CLASS__, 'grunion_media_button' ), 999 );
35 }
36
37 /**
38 * Render the grunion media button.
39 */
40 public static function grunion_media_button() {
41 $title = __( 'Add Contact Form', 'jetpack' );
42 ?>
43
44 <button type="button" id="insert-jetpack-contact-form" class="button" title="<?php echo esc_attr( $title ); ?>" href="javascript:;">
45 <span class="jetpack-contact-form-icon"></span>
46 <?php echo esc_html( $title ); ?>
47 </button>
48
49 <?php
50 }
51
52 /**
53 * Get external plugins.
54 *
55 * @param array $plugin_array - the plugin array.
56 *
57 * @return array
58 */
59 public static function mce_external_plugins( $plugin_array ) {
60 $plugin_array['grunion_form'] = Assets::get_file_url_for_environment(
61 '_inc/build/contact-form/js/tinymce-plugin-form-button.min.js',
62 'modules/contact-form/js/tinymce-plugin-form-button.js'
63 );
64 return $plugin_array;
65 }
66
67 /**
68 * MCE buttons.
69 *
70 * @param array $buttons - the buttons.
71 *
72 * @return array
73 */
74 public static function mce_buttons( $buttons ) {
75 $size = count( $buttons );
76 $buttons1 = array_slice( $buttons, 0, $size - 1 );
77 $buttons2 = array_slice( $buttons, $size - 1 );
78 return array_merge(
79 $buttons1,
80 array( 'grunion' ),
81 $buttons2
82 );
83 }
84
85 /**
86 * WordPress Shortcode Editor View JS Code
87 */
88 public static function handle_editor_view_js() {
89 add_action( 'admin_print_footer_scripts', array( __CLASS__, 'editor_view_js_templates' ), 1 );
90 add_filter( 'mce_external_plugins', array( __CLASS__, 'mce_external_plugins' ) );
91 add_filter( 'mce_buttons', array( __CLASS__, 'mce_buttons' ) );
92
93 wp_enqueue_style( 'grunion-editor-ui', plugins_url( 'css/editor-ui.css', __FILE__ ), array(), JETPACK__VERSION );
94 wp_style_add_data( 'grunion-editor-ui', 'rtl', 'replace' );
95 wp_enqueue_script(
96 'grunion-editor-view',
97 Assets::get_file_url_for_environment(
98 '_inc/build/contact-form/js/editor-view.min.js',
99 'modules/contact-form/js/editor-view.js'
100 ),
101 array( 'wp-util', 'jquery', 'quicktags' ),
102 JETPACK__VERSION,
103 true
104 );
105 wp_localize_script(
106 'grunion-editor-view',
107 'grunionEditorView',
108 array(
109 'inline_editing_style' => plugins_url( 'css/editor-inline-editing-style.css', __FILE__ ),
110 'inline_editing_style_rtl' => plugins_url( 'css/editor-inline-editing-style-rtl.css', __FILE__ ),
111 'dashicons_css_url' => includes_url( 'css/dashicons.css' ),
112 'default_form' => '[contact-field label="' . __( 'Name', 'jetpack' ) . '" type="name" required="true" /]' .
113 '[contact-field label="' . __( 'Email', 'jetpack' ) . '" type="email" required="true" /]' .
114 '[contact-field label="' . __( 'Website', 'jetpack' ) . '" type="url" /]' .
115 '[contact-field label="' . __( 'Message', 'jetpack' ) . '" type="textarea" /]',
116 'labels' => array(
117 'submit_button_text' => __( 'Submit', 'jetpack' ),
118 /** This filter is documented in modules/contact-form/grunion-contact-form.php */
119 'required_field_text' => apply_filters( 'jetpack_required_field_text', __( '(required)', 'jetpack' ) ),
120 'edit_close_ays' => __( 'Are you sure you\'d like to stop editing this form without saving your changes?', 'jetpack' ),
121 'quicktags_label' => __( 'contact form', 'jetpack' ),
122 'tinymce_label' => __( 'Add contact form', 'jetpack' ),
123 ),
124 )
125 );
126
127 add_editor_style( plugin_dir_url( __FILE__ ) . 'css/editor-style.css' );
128 }
129
130 /**
131 * JS Templates.
132 */
133 public static function editor_view_js_templates() {
134 ?>
135 <script type="text/html" id="tmpl-grunion-contact-form">
136 <form class="card jetpack-contact-form-shortcode-preview" action='#' method='post' class='contact-form commentsblock' onsubmit="return false;">
137 {{{ data.body }}}
138 <p class='contact-submit'>
139 <input type='submit' value='{{ data.submit_button_text }}' class='pushbutton-wide'/>
140 </p>
141 </form>
142 </script>
143
144 <script type="text/html" id="tmpl-grunion-field-email">
145 <div>
146 <label for='{{ data.id }}' class='grunion-field-label email'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
147 <input type='email' name='{{ data.id }}' id='{{ data.id }}' value='{{ data.value }}' class='{{ data.class }}' placeholder='{{ data.placeholder }}' />
148 </div>
149 </script>
150
151 <script type="text/html" id="tmpl-grunion-field-telephone">
152 <div>
153 <label for='{{ data.id }}' class='grunion-field-label telephone'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
154 <input type='tel' name='{{ data.id }}' id='{{ data.id }}' value='{{ data.value }}' class='{{ data.class }}' placeholder='{{ data.placeholder }}' />
155 </div>
156 </script>
157
158 <script type="text/html" id="tmpl-grunion-field-textarea">
159 <div>
160 <label for='contact-form-comment-{{ data.id }}' class='grunion-field-label textarea'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
161 <textarea name='{{ data.id }}' id='contact-form-comment-{{ data.id }}' rows='20' class='{{ data.class }}' placeholder='{{ data.placeholder }}'>{{ data.value }}</textarea>
162 </div>
163 </script>
164
165 <script type="text/html" id="tmpl-grunion-field-radio">
166 <div>
167 <label class='grunion-field-label'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
168 <# _.each( data.options, function( option ) { #>
169 <label class='grunion-radio-label radio'>
170 <input type='radio' name='{{ data.id }}' value='{{ option }}' class="{{ data.class }}" <# if ( option === data.value ) print( "checked='checked'" ) #> />
171 <span>{{ option }}</span>
172 </label>
173 <# }); #>
174 <div class='clear-form'></div>
175 </div>
176 </script>
177
178 <script type="text/html" id="tmpl-grunion-field-checkbox">
179 <div>
180 <label class='grunion-field-label checkbox'>
181 <input type='checkbox' name='{{ data.id }}' value='<?php esc_attr__( 'Yes', 'jetpack' ); ?>' class="{{ data.class }}" <# if ( data.value ) print( 'checked="checked"' ) #> />
182 <span>{{ data.label }}</span><# if ( data.required ) print( " <span>" + data.required + "</span>" ) #>
183 </label>
184 <div class='clear-form'></div>
185 </div>
186 </script>
187
188 <script type="text/html" id="tmpl-grunion-field-checkbox-multiple">
189 <div>
190 <label class='grunion-field-label'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
191 <# _.each( data.options, function( option ) { #>
192 <label class='grunion-checkbox-multiple-label checkbox-multiple'>
193 <input type='checkbox' name='{{ data.id }}[]' value='{{ option }}' class="{{ data.class }}" <# if ( option === data.value || _.contains( data.value, option ) ) print( "checked='checked'" ) #> />
194 <span>{{ option }}</span>
195 </label>
196 <# }); #>
197 <div class='clear-form'></div>
198 </div>
199 </script>
200
201 <script type="text/html" id="tmpl-grunion-field-select">
202 <div>
203 <label for='{{ data.id }}' class='grunion-field-label select'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
204 <select name='{{ data.id }}' id='{{ data.id }}' class="{{ data.class }}">
205 <# _.each( data.options, function( option ) { #>
206 <option <# if ( option === data.value ) print( "selected='selected'" ) #>>{{ option }}</option>
207 <# }); #>
208 </select>
209 </div>
210 </script>
211
212 <script type="text/html" id="tmpl-grunion-field-date">
213 <div>
214 <label for='{{ data.id }}' class='grunion-field-label {{ data.type }}'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
215 <input type='text' name='{{ data.id }}' id='{{ data.id }}' value='{{ data.value }}' class="{{ data.class }}" />
216 </div>
217 </script>
218
219 <script type="text/html" id="tmpl-grunion-field-text">
220 <div>
221 <label for='{{ data.id }}' class='grunion-field-label {{ data.type }}'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
222 <input type='text' name='{{ data.id }}' id='{{ data.id }}' value='{{ data.value }}' class='{{ data.class }}' placeholder='{{ data.placeholder }}' />
223 </div>
224 </script>
225
226 <script type="text/html" id="tmpl-grunion-field-url">
227 <div>
228 <label for='{{ data.id }}' class='grunion-field-label {{ data.type }}'>{{ data.label }}<# if ( data.required ) print( " <span>" + data.required + "</span>" ) #></label>
229 <input type='url' name='{{ data.id }}' id='{{ data.id }}' value='{{ data.value }}' class='{{ data.class }}' placeholder='{{ data.placeholder }}' />
230 </div>
231 </script>
232
233
234 <script type="text/html" id="tmpl-grunion-field-edit">
235 <div class="card is-compact grunion-field-edit grunion-field-{{ data.type }}" aria-label="<?php esc_attr_e( 'Form Field', 'jetpack' ); ?>">
236 <label class="grunion-name">
237 <span><?php esc_html_e( 'Field Label', 'jetpack' ); ?></span>
238 <input type="text" name="label" placeholder="<?php esc_attr_e( 'Label', 'jetpack' ); ?>" value="{{ data.label }}"/>
239 </label>
240
241 <?php
242 $grunion_field_types = array(
243 'text' => __( 'Text', 'jetpack' ),
244 'name' => __( 'Name', 'jetpack' ),
245 'email' => __( 'Email', 'jetpack' ),
246 'url' => __( 'Website', 'jetpack' ),
247 'textarea' => __( 'Textarea', 'jetpack' ),
248 'checkbox' => __( 'Checkbox', 'jetpack' ),
249 'checkbox-multiple' => __( 'Checkbox with Multiple Items', 'jetpack' ),
250 'select' => __( 'Drop down', 'jetpack' ),
251 'radio' => __( 'Radio', 'jetpack' ),
252 'date' => __( 'Date', 'jetpack' ),
253 );
254 ?>
255 <div class="grunion-type-options">
256 <label class="grunion-type">
257 <?php esc_html_e( 'Field Type', 'jetpack' ); ?>
258 <select name="type">
259 <?php foreach ( $grunion_field_types as $type => $label ) : ?>
260 <option <# if ( '<?php echo esc_js( $type ); ?>' === data.type ) print( "selected='selected'" ) #> value="<?php echo esc_attr( $type ); ?>">
261 <?php echo esc_html( $label ); ?>
262 </option>
263 <?php endforeach; ?>
264 </select>
265 </label>
266
267 <label class="grunion-required">
268 <input type="checkbox" name="required" value="1" <# if ( data.required ) print( 'checked="checked"' ) #> />
269 <span><?php esc_html_e( 'Required?', 'jetpack' ); ?></span>
270 </label>
271 </div>
272
273 <label class="grunion-options">
274 <?php esc_html_e( 'Options', 'jetpack' ); ?>
275 <ol>
276 <# if ( data.options ) { #>
277 <# _.each( data.options, function( option ) { #>
278 <li><input type="text" name="option" value="{{ option }}" /> <a class="delete-option" href="javascript:;"><span class="screen-reader-text"><?php esc_html_e( 'Delete Option', 'jetpack' ); ?></span></a></li>
279 <# }); #>
280 <# } else { #>
281 <li><input type="text" name="option" /> <a class="delete-option" href="javascript:;"><span class="screen-reader-text"><?php esc_html_e( 'Delete Option', 'jetpack' ); ?></span></a></li>
282 <li><input type="text" name="option" /> <a class="delete-option" href="javascript:;"><span class="screen-reader-text"><?php esc_html_e( 'Delete Option', 'jetpack' ); ?></span></a></li>
283 <li><input type="text" name="option" /> <a class="delete-option" href="javascript:;"><span class="screen-reader-text"><?php esc_html_e( 'Delete Option', 'jetpack' ); ?></span></a></li>
284 <# } #>
285 <li><a class="add-option" href="javascript:;"><?php esc_html_e( 'Add new option...', 'jetpack' ); ?></a></li>
286 </ol>
287 </label>
288
289 <a href="javascript:;" class="delete-field"><span class="screen-reader-text"><?php esc_html_e( 'Delete Field', 'jetpack' ); ?></span></a>
290 </div>
291 </script>
292
293 <script type="text/html" id="tmpl-grunion-field-edit-option">
294 <li><input type="text" name="option" /> <a class="delete-option" href="javascript:;"><span class="screen-reader-text"><?php esc_html_e( 'Delete Option', 'jetpack' ); ?></span></a></li>
295 </script>
296
297 <script type="text/html" id="tmpl-grunion-editor-inline">
298 <h1 id="form-settings-header" class="grunion-section-header"><?php esc_html_e( 'Contact form information', 'jetpack' ); ?></h1>
299 <section class="card grunion-form-settings" aria-labelledby="form-settings-header">
300 <label><?php esc_html_e( 'What would you like the subject of the email to be?', 'jetpack' ); ?>
301 <input type="text" name="subject" value="{{ data.subject }}" />
302 </label>
303 <label><?php esc_html_e( 'Which email address should we send the submissions to?', 'jetpack' ); ?>
304 <input type="text" name="to" value="{{ data.to }}" />
305 </label>
306 </section>
307 <h1 id="form-fields-header" class="grunion-section-header"><?php esc_html_e( 'Contact form fields', 'jetpack' ); ?></h1>
308 <section class="grunion-fields" aria-labelledby="form-fields-header">
309 {{{ data.fields }}}
310 </section>
311 <section class="grunion-controls">
312 <?php submit_button( esc_html__( 'Add Field', 'jetpack' ), 'secondary', 'add-field', false ); ?>
313
314 <div class="grunion-update-controls">
315 <?php submit_button( esc_html__( 'Cancel', 'jetpack' ), 'delete', 'cancel', false ); ?>
316 <?php submit_button( esc_html__( 'Update Form', 'jetpack' ), 'primary', 'submit', false ); ?>
317 </div>
318 </section>
319 </script>
320
321 </div>
322 <?php
323 }
324 }
325
326 add_action( 'current_screen', array( 'Grunion_Editor_View', 'add_hooks' ) );
327