GravityView  2.10.1
The best, easiest way to display Gravity Forms entries on your website.
class-admin-views.php
Go to the documentation of this file.
1 <?php
2 /**
3  * Renders all the metaboxes on Add New / Edit View post type.
4  *
5  * @package GravityView
6  * @license GPL2+
7  * @author GravityView <[email protected]>
8  * @link http://gravityview.co
9  * @copyright Copyright 2014, Katz Web Services, Inc.
10  *
11  * @since 1.0.0
12  */
13 
14 /** If this file is called directly, abort. */
15 if ( ! defined( 'ABSPATH' ) ) {
16  die;
17 }
18 
20 
21 
22 
23  function __construct() {
24  add_action( 'save_post', array( $this, 'save_postdata' ) );
25 
26  // set the blacklist field types across the entire plugin
27  add_filter( 'gravityview_blacklist_field_types', array( $this, 'default_field_blacklist' ), 10, 2 );
28 
29  // Tooltips
30  add_filter( 'gform_tooltips', array( $this, 'tooltips') );
31 
32  // adding styles and scripts
33  add_action( 'admin_enqueue_scripts', array( 'GravityView_Admin_Views', 'add_scripts_and_styles'), 999 );
34  add_filter( 'gform_noconflict_styles', array( $this, 'register_no_conflict') );
35  add_filter( 'gform_noconflict_scripts', array( $this, 'register_no_conflict') );
36  add_filter( 'gravityview_noconflict_styles', array( $this, 'register_no_conflict') );
37  add_filter( 'gravityview_noconflict_scripts', array( $this, 'register_no_conflict') );
38 
39  add_action( 'gravityview_render_directory_active_areas', array( $this, 'render_directory_active_areas'), 10, 4 );
40  add_action( 'gravityview_render_widgets_active_areas', array( $this, 'render_widgets_active_areas'), 10, 3 );
41  add_action( 'gravityview_render_field_pickers', array( $this, 'render_field_pickers'), 10, 2 );
42  add_action( 'gravityview_render_available_fields', array( $this, 'render_available_fields'), 10, 2 );
43  add_action( 'gravityview_render_available_widgets', array( $this, 'render_available_widgets') );
44  add_action( 'gravityview_render_active_areas', array( $this, 'render_active_areas'), 10, 5 );
45 
46  // Enqueue code editor and settings for manipulating HTML.
47  add_action('admin_enqueue_scripts', function() {
48 
49  $settings = wp_enqueue_code_editor( array( 'type' => 'text/html' ) );
50  });
51 
52  // @todo check if this hook is needed..
53  //add_action( 'gravityview_render_field_options', array( $this, 'render_field_options'), 10, 9 );
54 
55  // Add Connected Form column
56  add_filter('manage_gravityview_posts_columns' , array( $this, 'add_post_type_columns' ) );
57 
58  add_filter( 'gform_toolbar_menu', array( 'GravityView_Admin_Views', 'gform_toolbar_menu' ), 10, 2 );
59  add_action( 'gform_form_actions', array( 'GravityView_Admin_Views', 'gform_toolbar_menu' ), 10, 2 );
60 
61  add_action( 'manage_gravityview_posts_custom_column', array( $this, 'add_custom_column_content'), 10, 2 );
62 
63  add_action( 'restrict_manage_posts', array( $this, 'add_view_dropdown' ) );
64 
65  add_action( 'pre_get_posts', array( $this, 'filter_pre_get_posts' ) );
66 
67  add_filter( 'gravityview/support_port/localization_data', array( $this, 'suggest_support_articles' ) );
68  }
69 
70  /**
71  * When on the Add/Edit View screen, suggest most popular articles related to that
72  *
73  * @param array $localization_data Data to be passed to the Support Port JS
74  *
75  * @return array
76  */
77  function suggest_support_articles( $localization_data = array() ) {
78 
79  if( ! gravityview()->request->is_view() ) {
80  return $localization_data;
81  }
82 
83  $localization_data['suggest'] = array(
84  '57ef23539033602e61d4a560',
85  '54c67bb9e4b0512429885513',
86  '54c67bb9e4b0512429885512',
87  '54c67bbbe4b07997ea3f3f6b',
88  '54d1a33ae4b086c0c0964ce9',
89  '57ef253c9033602e61d4a563',
90  '552355bfe4b0221aadf2572b',
91  '54c67bcde4b051242988553e',
92  );
93 
94  return $localization_data;
95  }
96 
97  /**
98  * @since 1.15
99  * @param WP_Query $query
100  */
101  public function filter_pre_get_posts( &$query ) {
102  global $pagenow;
103 
104  if ( ! is_admin() ) {
105  return;
106  }
107 
108  if ( 'edit.php' !== $pagenow ) {
109  return;
110  }
111 
112  if ( ! isset( $query->query_vars['post_type'] ) ) {
113  return;
114  }
115 
116  if ( 'gravityview' !== $query->query_vars['post_type'] ) {
117  return;
118  }
119 
120  $form_id = (int) \GV\Utils::_GET( 'gravityview_form_id' );
121 
122  $meta_query = array();
123 
124  if ( $form_id ) {
125  $meta_query[] = array(
126  'key' => '_gravityview_form_id',
127  'value' => $form_id,
128  );
129  }
130 
131  $layout_id = \GV\Utils::_GET( 'gravityview_layout' );
132 
133  if ( $layout_id ) {
134  $meta_query[] = array(
135  'key' => '_gravityview_directory_template',
136  'value' => esc_attr( $layout_id ),
137  );
138  }
139 
140  $query->set( 'meta_query', $meta_query );
141  }
142 
143  /**
144  * Adds dropdown selects to filter Views by connected form and layout
145  *
146  * @return void
147  */
148  public function add_view_dropdown() {
149  $current_screen = get_current_screen();
150 
151  if( 'gravityview' !== $current_screen->post_type ) {
152  return;
153  }
154 
156  $current_form = \GV\Utils::_GET( 'gravityview_form_id' );
157 
158  // If there are no forms to select, show no forms.
159  if( ! empty( $forms ) ) { ?>
160  <label for="gravityview_form_id" class="screen-reader-text"><?php esc_html_e( 'Filter Views by form', 'gravityview' ); ?></label>
161  <select name="gravityview_form_id" id="gravityview_form_id">
162  <option value="" <?php selected( '', $current_form, true ); ?>><?php esc_html_e( 'All forms', 'gravityview' ); ?></option>
163  <?php foreach( $forms as $form ) { ?>
164  <option value="<?php echo esc_attr( $form['id'] ); ?>" <?php selected( $form['id'], $current_form, true ); ?>><?php echo esc_html( $form['title'] ); ?></option>
165  <?php } ?>
166  </select>
167  <?php }
168 
170  $current_layout = \GV\Utils::_GET( 'gravityview_layout' );
171 
172  // If there are no forms to select, show no forms.
173  if( ! empty( $layouts ) ) { ?>
174  <label for="gravityview_layout_name" class="screen-reader-text"><?php esc_html_e( 'Filter Views by layout', 'gravityview' ); ?></label>
175  <select name="gravityview_layout" id="gravityview_layout_name">
176  <option value="" <?php selected( '', $current_layout, true ); ?>><?php esc_html_e( 'All layouts', 'gravityview' ); ?></option>
177  <optgroup label="<?php esc_html_e( 'Layouts', 'gravityview' ); ?>">
178  <?php foreach( $layouts as $layout_id => $layout ) {
179  if ( in_array( $layout['type'], array( 'preset', 'internal' ), true ) ) {
180  continue;
181  }
182  ?>
183  <option value="<?php echo esc_attr( $layout_id ); ?>" <?php selected( $layout_id, $current_layout, true ); ?>><?php echo esc_html( $layout['label'] ); ?></option>
184  <?php } ?>
185  </optgroup>
186  <optgroup label="<?php esc_html_e( 'Form Presets', 'gravityview' ); ?>">
187  <?php foreach( $layouts as $layout_id => $layout ) {
188  if ( ! in_array( $layout['type'], array( 'preset' ), true ) ) {
189  continue;
190  }
191  ?>
192  <option value="<?php echo esc_attr( $layout_id ); ?>" <?php selected( $layout_id, $current_layout, true ); ?>><?php echo esc_html( $layout['label'] ); ?></option>
193  <?php } ?>
194  </optgroup>
195  </select>
196  <?php }
197  }
198 
199 
200  /**
201  * @deprecated since 1.2
202  * Start using GravityView_Render_Settings::render_setting_row
203  */
204  public static function render_setting_row( $key = '', $current_settings = array(), $override_input = null, $name = 'template_settings[%s]', $id = 'gravityview_se_%s' ) {
205  _deprecated_function( 'GravityView_Admin_Views::render_setting_row', '1.1.7', 'GravityView_Render_Settings::render_setting_row' );
207  }
208 
209  /**
210  * @deprecated since 1.2
211  * Start using GravityView_Render_Settings::render_field_option
212  */
213  public static function render_field_option( $name = '', $option, $curr_value = NULL ) {
214  _deprecated_function( 'GravityView_Admin_Views::render_field_option', '1.1.7', 'GravityView_Render_Settings::render_field_option' );
215  return GravityView_Render_Settings::render_field_option( $name, $option, $curr_value );
216  }
217 
218 
219  /**
220  * Add a GravityView menu to the Form Toolbar with connected views
221  * @param array $menu_items Menu items, as set in GFForms::top_toolbar()
222  * @param int $id ID of the current Gravity form
223  * @return array Modified array
224  */
225  public static function gform_toolbar_menu( $menu_items = array(), $id = NULL ) {
226 
227  // Don't show on Trashed forms
228  if ( 'trash' === rgget( 'filter' ) ) {
229  return $menu_items;
230  }
231 
232  $connected_views = gravityview_get_connected_views( $id, array( 'post_status' => 'any' ) );
233 
234  $priority = 0;
235 
236  if( 'form_list' === GFForms::get_page() ) {
237  $priority = 790;
238  }
239 
240  if( empty( $connected_views ) ) {
241 
242  $menu_items['gravityview'] = array(
243  'label' => esc_attr__( 'Create a View', 'gravityview' ),
244  'icon' => '<i class="fa fa-lg gv-icon-astronaut-head gv-icon"></i>', // Only appears in GF pre-2.5
245  'title' => esc_attr__( 'Create a View using this form as a data source', 'gravityview' ),
246  'url' => admin_url( 'post-new.php?post_type=gravityview&form_id=' . $id ),
247  'menu_class' => 'gv_connected_forms gf_form_toolbar_settings',
248  'priority' => $priority,
249  'capabilities' => array( 'edit_gravityviews' ),
250  );
251 
252  return $menu_items;
253  }
254 
255  $sub_menu_items = array();
256  foreach ( (array)$connected_views as $view ) {
257 
258  if( ! GVCommon::has_cap( 'edit_gravityview', $view->ID ) ) {
259  continue;
260  }
261 
262  $label = empty( $view->post_title ) ? sprintf( __('No Title (View #%d)', 'gravityview' ), $view->ID ) : $view->post_title;
263 
264  $sub_menu_items[] = array(
265  'label' => esc_attr( $label ),
266  'url' => admin_url( 'post.php?action=edit&post='.$view->ID ),
267  'icon' => '<i class="fa fa-lg gv-icon-astronaut-head gv-icon"></i>',
268  );
269  }
270 
271  // If there were no items added, then let's create the parent menu
272  if( $sub_menu_items ) {
273 
274  $sub_menu_items[] = array(
275  'label' => esc_attr__( 'Create a View', 'gravityview' ),
276  'icon' => '<span class="dashicons dashicons-plus"></span>',
277  'title' => esc_attr__( 'Create a View using this form as a data source', 'gravityview' ),
278  'url' => admin_url( 'post-new.php?post_type=gravityview&form_id=' . $id ),
279  'capabilities' => array( 'edit_gravityviews' ),
280  );
281 
282  // Make sure Gravity Forms uses the submenu; if there's only one item, it uses a link instead of a dropdown
283  $sub_menu_items[] = array(
284  'url' => '#',
285  'label' => '',
286  'menu_class' => 'hidden',
287  'capabilities' => '',
288  );
289 
290  $menu_items['gravityview'] = array(
291  'label' => __( 'Connected Views', 'gravityview' ),
292  'icon' => '<i class="fa fa-lg gv-icon-astronaut-head gv-icon"></i>',
293  'title' => __( 'GravityView Views using this form as a data source', 'gravityview' ),
294  'url' => '#',
295  'onclick' => 'return false;',
296  'menu_class' => 'gv_connected_forms gf_form_toolbar_settings',
297  'sub_menu_items' => $sub_menu_items,
298  'priority' => $priority,
299  'capabilities' => array( 'edit_gravityviews' ),
300  );
301  }
302 
303  return $menu_items;
304  }
305 
306  /**
307  * List the field types without presentation properties (on a View context)
308  *
309  * @param array $array Existing field types to add to a blacklist
310  * @param string|null $context Context for the blacklist. Default: NULL.
311  * @return array Default blacklist fields merged with existing blacklist fields
312  */
313  function default_field_blacklist( $array = array(), $context = NULL ) {
314 
315  $add = array( 'captcha', 'page' );
316 
317  // Don't allowing editing the following values:
318  if( $context === 'edit' ) {
319  $add[] = 'post_id';
320  }
321 
322  $return = array_merge( $array, $add );
323 
324  return $return;
325  }
326 
327  /**
328  * Add tooltip text for use throughout the UI
329  * @param array $tooltips Array of Gravity Forms tooltips
330  * @return array Modified tooltips array
331  */
332  public function tooltips( $tooltips = array() ) {
333 
334  $gv_tooltips = array();
335 
336  // Generate tooltips for View settings
337  $default_args = \GV\View_Settings::defaults( true );
338 
339  foreach ( $default_args as $key => $arg ) {
340 
341  // If an arg has `tooltip` defined, but it's false, don't display a tooltip
342  if( isset( $arg['tooltip'] ) && empty( $arg['tooltip'] ) ) { continue; }
343 
344  // By default, use `tooltip` if defined.
345  $tooltip = empty( $arg['tooltip'] ) ? NULL : $arg['tooltip'];
346 
347  // If there's no tooltip set, continue
348  if( empty( $tooltip ) ) {
349  continue;
350  }
351 
352  // Add the tooltip
353  $gv_tooltips[ 'gv_'.$key ] = array(
354  'title' => $arg['label'],
355  'value' => $tooltip,
356  );
357 
358  }
359 
360  $gv_tooltips['gv_css_merge_tags'] = array(
361  'title' => __('CSS Merge Tags', 'gravityview'),
362  'value' => sprintf( __( 'Developers: The CSS classes will be sanitized using the %ssanitize_title_with_dashes()%s function.', 'gravityview'), '<code>', '</code>' )
363  );
364 
365  /**
366  * @filter `gravityview_tooltips` The tooltips GravityView adds to the Gravity Forms tooltip array
367  * @param array $gv_tooltips Associative array with unique keys containing array of `title` and `value` keys, as expected by `gform_tooltips` filter
368  * @deprecated Renamed to `gravityview/metaboxes/tooltips`
369  */
370  $gv_tooltips = apply_filters( 'gravityview_tooltips', $gv_tooltips );
371 
372  /**
373  * @filter `gravityview/metaboxes/tooltips` The tooltips GravityView adds to the Gravity Forms tooltip array
374  * @param array $gv_tooltips Associative array with unique keys containing array of `title` and `value` keys, as expected by `gform_tooltips` filter
375  */
376  $gv_tooltips = apply_filters( 'gravityview/metaboxes/tooltips', $gv_tooltips );
377 
378  foreach ( $gv_tooltips as $key => $tooltip ) {
379 
380  $title = empty( $tooltip['title'] ) ? '' : '<h6>'.esc_html( $tooltip['title'] ) .'</h6>';
381 
382  $tooltips[ $key ] = $title . wpautop( esc_html( $tooltip['value'] ) );
383  }
384 
385  return $tooltips;
386  }
387 
388  /**
389  * Add the Data Source information
390  *
391  * @param null $column_name
392  * @param $post_id
393  *
394  * @return void
395  */
396  public function add_custom_column_content( $column_name = NULL, $post_id ) {
397 
398  $output = '';
399 
400  switch ( $column_name ) {
401  case 'gv_template':
402 
403  $template_id = gravityview_get_template_id( $post_id );
404 
405  // All Views should have a connected form. If it doesn't, that's not right.
406  if ( empty( $template_id ) ) {
407  gravityview()->log->error( 'View ID {view_id} does not have a connected template.', array( 'view_id' => $post_id ) );
408  break;
409  }
410 
412 
413  $template = isset( $templates[ $template_id ] ) ? $templates[ $template_id ] : false;
414 
415  // Generate backup if label doesn't exist: `example_name` => `Example Name`
416  $template_id_pretty = ucwords( implode( ' ', explode( '_', $template_id ) ) );
417 
418  $output = $template ? $template['label'] : $template_id_pretty;
419 
420  break;
421 
422  case 'gv_connected_form':
423 
424  $form_id = gravityview_get_form_id( $post_id );
425 
426  // All Views should have a connected form. If it doesn't, that's not right.
427  if ( empty( $form_id ) ) {
428  gravityview()->log->error( 'View ID {view_id} does not have a connected GF form.', array( 'view_id' => $post_id ) );
429  $output = __( 'Not connected.', 'gravityview' );
430  break;
431  }
432 
434 
435  if ( ! $form ) {
436  gravityview()->log->error( 'Connected form not found: Form #{form_id}', array( 'form_id' => $form_id ) );
437 
438  $output = __( 'The connected form can not be found; it may no longer exist.', 'gravityview' );
439  } else {
440  $output = self::get_connected_form_links( $form );
441  }
442 
443  break;
444  }
445 
446  echo $output;
447  }
448 
449 
450  /**
451  * Get HTML links relating to a connected form, like Edit, Entries, Settings, Preview
452  * @param array|int $form Gravity Forms forms array, or the form ID
453  * @param boolean $include_form_link Whether to include the bold name of the form in the output
454  * @return string HTML links
455  */
456  static public function get_connected_form_links( $form, $include_form_link = true ) {
457 
458  // Either the form is empty or the form ID is 0, not yet set.
459  if( empty( $form ) ) {
460  return '';
461  }
462 
463  // The $form is passed as the form ID
464  if( !is_array( $form ) ) {
466  }
467 
468  $form_id = $form['id'];
469  $links = array();
470 
471  if( GVCommon::has_cap( 'gravityforms_edit_forms' ) ) {
472  $form_url = admin_url( sprintf( 'admin.php?page=gf_edit_forms&amp;id=%d', $form_id ) );
473  $form_link = '<strong class="gv-form-title">'.gravityview_get_link( $form_url, $form['title'], 'class=row-title' ).'</strong>';
474  $links[] = '<span>'.gravityview_get_link( $form_url, __('Edit Form', 'gravityview') ).'</span>';
475  } else {
476  $form_link = '<strong class="gv-form-title">'. esc_html( $form['title'] ). '</strong>';
477  }
478 
479  if( GVCommon::has_cap( 'gravityforms_view_entries' ) ) {
480  $entries_url = admin_url( sprintf( 'admin.php?page=gf_entries&amp;id=%d', $form_id ) );
481  $links[] = '<span>'.gravityview_get_link( $entries_url, __('Entries', 'gravityview') ).'</span>';
482  }
483 
484  if( GVCommon::has_cap( array( 'gravityforms_edit_settings', 'gravityview_view_settings' ) ) ) {
485  $settings_url = admin_url( sprintf( 'admin.php?page=gf_edit_forms&amp;view=settings&amp;id=%d', $form_id ) );
486  $links[] = '<span>'.gravityview_get_link( $settings_url, __('Settings', 'gravityview'), 'title='.__('Edit settings for this form', 'gravityview') ).'</span>';
487  }
488 
489  if( GVCommon::has_cap( array("gravityforms_edit_forms", "gravityforms_create_form", "gravityforms_preview_forms") ) ) {
490  $preview_url = site_url( sprintf( '?gf_page=preview&amp;id=%d', $form_id ) );
491  $links[] = '<span>'.gravityview_get_link( $preview_url, __('Preview Form', 'gravityview'), 'title='.__('Preview this form', 'gravityview') ).'</span>';
492  }
493 
494  $output = '';
495 
496  if( !empty( $include_form_link ) ) {
497  $output .= $form_link;
498  }
499 
500  /**
501  * @filter `gravityview_connected_form_links` Modify the links shown in the Connected Form links
502  * @since 1.6
503  * @param array $links Links to show
504  * @param array $form Gravity Forms form array
505  */
506  $links = apply_filters( 'gravityview_connected_form_links', $links, $form );
507 
508  $css_class = 'row-actions';
509 
510  // Is Screen Options > View mode set to "Extended view"? If so, keep actions visible.
511  if( 'excerpt' === get_user_setting( 'posts_list_mode', 'list' ) ) {
512  $css_class = 'row-actions visible';
513  }
514 
515  $output .= '<div class="' . $css_class . '">'. implode( ' | ', $links ) .'</div>';
516 
517  return $output;
518  }
519 
520  /**
521  * Add the Data Source column to the Views page
522  * @param array $columns Columns array
523  */
524  public function add_post_type_columns( $columns ) {
525 
526  // Get the date column and save it for later to add back in.
527  // This adds it after the Data Source column.
528  // This way, we don't need to do array_slice, array_merge, etc.
529  $date = $columns['date'];
530  unset( $columns['date'] );
531 
532  $data_source_required_caps = array(
533  'gravityforms_edit_forms',
534  'gravityforms_view_entries',
535  'gravityforms_edit_settings',
536  'gravityview_view_settings',
537  'gravityforms_create_form',
538  'gravityforms_preview_forms',
539  );
540 
541  if( GVCommon::has_cap( $data_source_required_caps ) ) {
542  $columns['gv_connected_form'] = __( 'Data Source', 'gravityview' );
543  }
544 
545  $columns['gv_template'] = _x( 'Template', 'Column title that shows what template is being used for Views', 'gravityview' );
546 
547  // Add the date back in.
548  $columns['date'] = $date;
549 
550  return $columns;
551  }
552 
553  /**
554  * Save View configuration
555  *
556  * @param int $post_id Currently saved Post ID
557  * @return void
558  */
559  function save_postdata( $post_id ) {
560 
561  if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ){
562  return;
563  }
564 
565  // validate post_type
566  if ( ! isset( $_POST['post_type'] ) || 'gravityview' != $_POST['post_type'] ) {
567  return;
568  }
569 
570  // validate user can edit and save View
571  if ( ! GVCommon::has_cap( 'edit_gravityview', $post_id ) ) {
572  gravityview()->log->error( 'Current user does not have the capability to edit View {view_id}', array( 'view_id' => $post_id, 'data' => wp_get_current_user() ) );
573  return;
574  }
575 
576  gravityview()->log->debug( '[save_postdata] Saving View post type.', array( 'data' => $_POST ) );
577 
578  $statii = array();
579 
580  // check if this is a start fresh View
581  if ( isset( $_POST['gravityview_select_form_nonce'] ) && wp_verify_nonce( $_POST['gravityview_select_form_nonce'], 'gravityview_select_form' ) ) {
582 
583  $form_id = !empty( $_POST['gravityview_form_id'] ) ? $_POST['gravityview_form_id'] : '';
584  // save form id
585  $statii['form_id'] = update_post_meta( $post_id, '_gravityview_form_id', $form_id );
586 
587  }
588 
589  if( false === GVCommon::has_cap( 'gravityforms_create_form' ) && empty( $statii['form_id'] ) ) {
590  gravityview()->log->error( 'Current user does not have the capability to create a new Form.', array( 'data' => wp_get_current_user() ) );
591  return;
592  }
593 
594  // Was this a start fresh?
595  if ( ! empty( $_POST['gravityview_form_id_start_fresh'] ) ) {
596  $statii['start_fresh'] = add_post_meta( $post_id, '_gravityview_start_fresh', 1 );
597  } else {
598  $statii['start_fresh'] = delete_post_meta( $post_id, '_gravityview_start_fresh' );
599  }
600 
601  // Check if we have a template id
602  if ( isset( $_POST['gravityview_select_template_nonce'] ) && wp_verify_nonce( $_POST['gravityview_select_template_nonce'], 'gravityview_select_template' ) ) {
603 
604  $template_id = !empty( $_POST['gravityview_directory_template'] ) ? $_POST['gravityview_directory_template'] : '';
605 
606  // now save template id
607  $statii['directory_template'] = update_post_meta( $post_id, '_gravityview_directory_template', $template_id );
608  }
609 
610 
611  // save View Configuration metabox
612  if ( isset( $_POST['gravityview_view_configuration_nonce'] ) && wp_verify_nonce( $_POST['gravityview_view_configuration_nonce'], 'gravityview_view_configuration' ) ) {
613 
614  // template settings
615  if( empty( $_POST['template_settings'] ) ) {
616  $_POST['template_settings'] = array();
617  }
618  $statii['template_settings'] = update_post_meta( $post_id, '_gravityview_template_settings', $_POST['template_settings'] );
619 
620  // guard against unloaded View configuration page
621  if ( isset( $_POST['gv_fields'] ) && isset( $_POST['gv_fields_done'] ) ) {
622  $fields = array();
623 
624  if ( ! empty( $_POST['gv_fields'] ) ) {
626  }
627 
628  $fields = wp_slash( $fields );
629 
630  $statii['directory_fields'] = update_post_meta( $post_id, '_gravityview_directory_fields', $fields );
631  }
632 
633  // Directory Visible Widgets
634  if( empty( $_POST['widgets'] ) ) {
635  $_POST['widgets'] = array();
636  }
637  $statii['directory_widgets'] = gravityview_set_directory_widgets( $post_id, $_POST['widgets'] );
638 
639  } // end save view configuration
640 
641  /**
642  * @action `gravityview_view_saved` After a View has been saved in the admin
643  * @param int $post_id ID of the View that has been saved
644  * @param array $statii Array of statuses of the post meta saving processes. If saving worked, each key should be mapped to a value of the post ID (`directory_widgets` => `124`). If failed (or didn't change), the value will be false.
645  * @since 1.17.2
646  */
647  do_action('gravityview_view_saved', $post_id, $statii );
648 
649  gravityview()->log->debug( '[save_postdata] Update Post Meta Statuses (also returns false if nothing changed)', array( 'data' => array_map( 'intval', $statii ) ) );
650  }
651 
652  /**
653  * @deprecated 1.1.6
654  */
655  function render_label() {
656  _deprecated_function( 'GravityView_Admin_Views::render_label()', '1.1.6', 'Use the GravityView_Admin_View_Field class instead.' );
657  }
658 
659  /**
660  * Render html for displaying available fields based on a Form ID
661  *
662  * @see GravityView_Ajax::get_available_fields_html() Triggers `gravityview_render_available_fields` action
663  *
664  * @param int $form Gravity Forms Form ID (default: '')
665  * @param string $context (default: 'single')
666  *
667  * @return void
668  */
669  function render_available_fields( $form = 0, $context = 'single' ) {
670 
671  // Determine if form is a preset and convert it to an array with fields
672  $form = ( is_string( $form ) && preg_match( '/^preset_/', $form ) ) ? GravityView_Ajax::pre_get_form_fields( $form ) : $form;
673 
674  /**
675  * @filter `gravityview_blacklist_field_types` Modify the types of fields that shouldn't be shown in a View.
676  * @param[in,out] array $blacklist_field_types Array of field types to block for this context.
677  * @param[in] string $context View context ('single', 'directory', or 'edit')
678  */
679  $blacklist_field_types = apply_filters( 'gravityview_blacklist_field_types', array(), $context );
680 
681  if ( ! is_array( $blacklist_field_types ) ) {
682 
683  gravityview()->log->error( '$blacklist_field_types is not an array', array( 'data' => print_r( $blacklist_field_types, true ) ) );
684 
685  $blacklist_field_types = array();
686  }
687 
688  $fields = $this->get_available_fields( $form, $context );
689 
690  $output = '';
691 
692  if( !empty( $fields ) ) {
693 
694  foreach( $fields as $id => $details ) {
695 
696  if( in_array( $details['type'], (array) $blacklist_field_types ) ) {
697  continue;
698  }
699 
700  // Edit mode only allows editing the parent fields, not single inputs.
701  if( $context === 'edit' && ! empty( $details['parent'] ) ) {
702  continue;
703  }
704 
705  $output .= new GravityView_Admin_View_Field( $details['label'], $id, $details, array(), $form );
706 
707  } // End foreach
708  }
709 
710  echo $output;
711 
712  // For the EDIT view we only want to allow the form fields.
713  if( $context === 'edit' ) {
714  return;
715  }
716 
717  $this->render_additional_fields( $form, $context );
718  }
719 
720  /**
721  * Render html for displaying additional fields based on a Form ID
722  *
723  * @param int $form Gravity Forms Form ID (default: '')
724  * @param string $context (default: 'single')
725  * @return void
726  */
727  public function render_additional_fields( $form = 0, $context = 'single' ) {
728 
729  $additional_fields = array(
730  array(
731  'label_text' => __( 'Add All Form Fields', 'gravityview' ),
732  'desc' => __('Insert all the form fields at once.', 'gravityview'),
733  'field_id' => 'all-fields',
734  'label_type' => 'field',
735  'input_type' => null,
736  'field_options' => null,
737  'settings_html' => null,
738  'icon' => 'dashicons-plus-alt',
739  )
740  );
741 
742  /**
743  * @filter `gravityview_additional_fields` non-standard Fields to show at the bottom of the field picker
744  * @param array $additional_fields Associative array of field arrays, with `label_text`, `desc`, `field_id`, `label_type`, `input_type`, `field_options`, and `settings_html` keys
745  */
746  $additional_fields = apply_filters( 'gravityview_additional_fields', $additional_fields );
747 
748  foreach ( (array) $additional_fields as $item ) {
749 
750  // Prevent items from not having index set
751  $item = wp_parse_args( $item, array(
752  'label_text' => null,
753  'field_id' => null,
754  'label_type' => null,
755  'input_type' => null,
756  'field_options' => null,
757  'settings_html' => null,
758  'icon' => null,
759  ));
760 
761  // Backward compat.
762  if( !empty( $item['field_options'] ) ) {
763  // Use settings_html from now on.
764  $item['settings_html'] = $item['field_options'];
765  }
766 
767  // Render a label for each of them
768  echo new GravityView_Admin_View_Field( $item['label_text'], $item['field_id'], $item, $settings = array(), $form );
769 
770  }
771 
772  }
773 
774  /**
775  * Retrieve the default fields id, label and type
776  * @param string|array $form form_ID or form object
777  * @param string $zone Either 'single', 'directory', 'header', 'footer'
778  * @return array
779  */
780  function get_entry_default_fields($form, $zone) {
781 
782  $entry_default_fields = array();
783 
784  // if in zone directory or single
785  if( in_array( $zone, array( 'directory', 'single' ), true ) ) {
786 
787  $meta_fields = GravityView_Fields::get_all( array( 'meta', 'gravityview', 'add-ons' ) );
788 
789  $entry_default_fields = array();
790 
791  foreach ( $meta_fields as $meta_field ) {
792  $entry_default_fields += $meta_field->as_array();
793  }
794  }
795 
796  /**
797  * @filter `gravityview_entry_default_fields` Modify the default fields for each zone and context
798  * @param array $entry_default_fields Array of fields shown by default
799  * @param string|array $form form_ID or form object
800  * @param string $zone Either 'single', 'directory', 'header', 'footer'
801  */
802  return apply_filters( 'gravityview_entry_default_fields', $entry_default_fields, $form, $zone);
803  }
804 
805  /**
806  * Calculate the available fields
807  * @param string|array $form form_ID or form object
808  * @param string $zone Either 'single', 'directory', 'header', 'footer'
809  * @return array fields
810  */
811  function get_available_fields( $form = '', $zone = NULL ) {
812 
813  if( empty( $form ) ) {
814  gravityview()->log->error( '$form is empty' );
815  return array();
816  }
817 
818  // get form fields
819  $fields = gravityview_get_form_fields( $form, true );
820 
821  // get meta fields ( only if form was already created )
822  if( !is_array( $form ) ) {
823  $meta_fields = gravityview_get_entry_meta( $form );
824  } else {
825  $meta_fields = array();
826  }
827 
828  // get default fields
829  $default_fields = $this->get_entry_default_fields( $form, $zone );
830 
831  //merge without loosing the keys
832  $fields = $fields + $meta_fields + $default_fields;
833 
834  // Move Custom Content to top
835  if ( isset( $fields['custom'] ) ) {
836  $fields = array( 'custom' => $fields['custom'] ) + $fields;
837  }
838 
839  $gv_fields = GravityView_Fields::get_all();
840 
841  foreach ( $fields as &$field ) {
842  foreach ( $gv_fields as $gv_field ) {
843  if ( \GV\Utils::get( $field, 'type' ) === $gv_field->name ) {
844  $field['icon'] = \GV\Utils::get( $gv_field, 'icon' );
845  }
846  }
847  }
848 
849  /**
850  * @filter `gravityview/admin/available_fields` Modify the available fields that can be used in a View.
851  * @param[in,out] array $fields The fields.
852  * @param string|array $form form_ID or form object
853  * @param string $zone Either 'single', 'directory', 'header', 'footer'
854  */
855  return apply_filters( 'gravityview/admin/available_fields', $fields, $form, $zone );
856  }
857 
858 
859  /**
860  * Render html for displaying available widgets
861  * @return string html
862  */
864 
865  $widgets = \GV\Widget::registered();
866 
867  if ( empty( $widgets ) ) {
868  return;
869  }
870 
871  foreach ( $widgets as $id => $details ) {
872  echo new GravityView_Admin_View_Widget( $details['label'], $id, $details );
873  }
874 
875  }
876 
877  /**
878  * Get the list of registered widgets. Each item is used to instantiate a GravityView_Admin_View_Widget object
879  * @deprecated Use \GV\Widget::registered()
880  * @since 1.13.1
881  * @return array
882  */
884 
885  _deprecated_function( __METHOD__, '2.0', '\GV\Widget::registered()' );
886 
887  return \GV\Widget::registered();
888  }
889 
890  /**
891  * Generic function to render rows and columns of active areas for widgets & fields
892  * @param string $template_id The current slug of the selected View template
893  * @param string $type Either 'widget' or 'field'
894  * @param string $zone Either 'single', 'directory', 'edit', 'header', 'footer'
895  * @param array $rows The layout structure: rows, columns and areas
896  * @param array $values Saved objects
897  * @return void
898  */
899  function render_active_areas( $template_id, $type, $zone, $rows, $values ) {
900  global $post;
901 
902  if( $type === 'widget' ) {
903  $button_label = __( 'Add Widget', 'gravityview' );
904  } else {
905  $button_label = __( 'Add Field', 'gravityview' );
906  }
907 
908  /**
909  * @internal Don't rely on this filter! This is for internal use and may change.
910  *
911  * @since 2.8.1
912  *
913  * @param string $button_label Text for button: "Add Widget" or "Add Field"
914  * @param array $atts {
915  * @type string $type 'widget' or 'field'
916  * @type string $template_id The current slug of the selected View template
917  * @type string $zone Where is this button being shown? Either 'single', 'directory', 'edit', 'header', 'footer'
918  * }
919  */
920  $button_label = apply_filters( 'gravityview/admin/add_button_label', $button_label, array( 'type' => $type, 'template_id' => $template_id, 'zone' => $zone ) );
921 
922  $available_items = array();
923 
924  $view = \GV\View::from_post( $post );
925  $form_id = null;
926 
927  // if saved values, get available fields to label everyone
928  if( !empty( $values ) && ( !empty( $post->ID ) || !empty( $_POST['template_id'] ) ) ) {
929 
930  if( !empty( $_POST['template_id'] ) ) {
931  $form = GravityView_Ajax::pre_get_form_fields( $_POST['template_id'] );
932  } else {
933  $form_id = $form = gravityview_get_form_id( $post->ID );
934  }
935 
936  if ( 'field' === $type ) {
937  $available_items[ $form ] = $this->get_available_fields( $form, $zone );
938 
939  $joined_forms = gravityview_get_joined_forms( $post->ID );
940 
941  foreach ( $joined_forms as $form ) {
942  $available_items[ $form->ID ] = $this->get_available_fields( $form->ID, $zone );
943  }
944  } else {
945  $available_items[ $form ] = \GV\Widget::registered();
946  }
947  }
948 
949  foreach( $rows as $row ) :
950  foreach( $row as $col => $areas ) :
951  $column = ($col == '2-2') ? '1-2' : $col; ?>
952 
953  <div class="gv-grid-col-<?php echo esc_attr( $column ); ?>">
954 
955  <?php foreach( $areas as $area ) : ?>
956 
957  <div class="gv-droppable-area" data-areaid="<?php echo esc_attr( $zone .'_'. $area['areaid'] ); ?>" data-context="<?php echo esc_attr( $zone ); ?>">
958  <p class="gv-droppable-area-title" <?php if ( 'widget' === $type && empty( $area['subtitle'] ) ) { echo ' style="margin: 0; padding: 0;"'; } ?>>
959  <strong <?php if ( 'widget' === $type ) { echo 'class="screen-reader-text"'; } ?>><?php echo esc_html( $area['title'] ); ?></strong>
960 
961  <?php if ( 'widget' !== $type ) { ?>
962  <a class="clear-all-fields alignright" role="button" href="#" data-areaid="<?php echo esc_attr( $zone .'_'. $area['areaid'] ); ?>"><?php esc_html_e( 'Clear all fields', 'gravityview' ); ?></a>
963  <?php } ?>
964 
965  <?php if ( ! empty( $area['subtitle'] ) ) { ?>
966  <span class="gv-droppable-area-subtitle"><span class="gf_tooltip gv_tooltip tooltip" title="<?php echo esc_attr( $area['subtitle'] ); ?>"></span></span>
967  <?php } ?>
968  </p>
969  <div class="active-drop-container active-drop-container-<?php echo esc_attr( $type ); ?>">
970  <div class="active-drop active-drop-<?php echo esc_attr( $type ); ?>" data-areaid="<?php echo esc_attr( $zone .'_'. $area['areaid'] ); ?>"><?php // render saved fields
971  if( ! empty( $values[ $zone .'_'. $area['areaid'] ] ) ) {
972 
973  foreach( $values[ $zone .'_'. $area['areaid'] ] as $uniqid => $field ) {
974 
975  // Maybe has a form ID
976  $form_id = empty( $field['form_id'] ) ? $form_id : $field['form_id'];
977 
978  $input_type = NULL;
979 
980  if ( $form_id ) {
981  $original_item = isset( $available_items[ $form_id ] [ $field['id'] ] ) ? $available_items[ $form_id ] [ $field['id'] ] : false ;
982  } else {
983  $original_item = isset( $available_items[ $field['id'] ] ) ? $available_items[ $field['id'] ] : false ;
984  }
985 
986  if ( !$original_item ) {
987  gravityview()->log->error( 'An item was not available when rendering the output; maybe it was added by a plugin that is now de-activated.', array(' data' => array('available_items' => $available_items, 'field' => $field ) ) );
988 
989  $original_item = $field;
990  } else {
991  $input_type = isset( $original_item['type'] ) ? $original_item['type'] : NULL;
992  }
993 
994  // Field options dialog box
995  $field_options = GravityView_Render_Settings::render_field_options( $form_id, $type, $template_id, $field['id'], $original_item['label'], $zone .'_'. $area['areaid'], $input_type, $uniqid, $field, $zone, $original_item );
996 
997  $item = array(
998  'input_type' => $input_type,
999  'settings_html' => $field_options,
1000  'label_type' => $type,
1001  );
1002 
1003  // Merge the values with the current item to pass things like widget descriptions and original field names
1004  if ( $original_item ) {
1005  $item = wp_parse_args( $item, $original_item );
1006  }
1007 
1008  switch( $type ) {
1009  case 'widget':
1010  echo new GravityView_Admin_View_Widget( $item['label'], $field['id'], $item, $field );
1011  break;
1012  default:
1013  echo new GravityView_Admin_View_Field( $field['label'], $field['id'], $item, $field, $form_id );
1014  }
1015  }
1016 
1017  } // End if zone is not empty ?></div>
1018  <div class="gv-droppable-area-action">
1019  <a href="#" class="gv-add-field button button-link button-hero" title=""
1020  data-objecttype="<?php echo esc_attr( $type ); ?>"
1021  data-areaid="<?php echo esc_attr( $zone . '_' . $area['areaid'] ); ?>"
1022  data-context="<?php echo esc_attr( $zone ); ?>"
1023  data-formid="<?php echo $view ? esc_attr( $view->form ? $view->form->ID : '' ) : ''; ?>"><?php echo '<span class="dashicons dashicons-plus-alt"></span>' . esc_html( $button_label ); ?></a>
1024  </div>
1025  </div>
1026  </div>
1027 
1028  <?php endforeach; ?>
1029 
1030  </div>
1031  <?php endforeach;
1032  endforeach;
1033  }
1034 
1035  /**
1036  * Render the widget active areas
1037  *
1038  * @param string $template_id The current slug of the selected View template
1039  * @param string $zone Either 'header' or 'footer'
1040  * @param string $post_id Current Post ID (view)
1041  *
1042  * @return string html
1043  */
1044  function render_widgets_active_areas( $template_id = '', $zone = '', $post_id = '' ) {
1045 
1046  $default_widget_areas = \GV\Widget::get_default_widget_areas();
1047 
1048  $widgets = array();
1049  if ( ! empty( $post_id ) ) {
1050  if ( 'auto-draft' === get_post_status( $post_id ) ) {
1051  // This is a new View, prefill the widgets
1052  $widgets = array(
1053  'header_top' => array(
1054  substr( md5( microtime( true ) ), 0, 13 ) => array (
1055  'id' => 'search_bar',
1056  'label' => __( 'Search Bar', 'gravityview' ),
1057  'search_layout' => 'horizontal',
1058  'search_clear' => '0',
1059  'search_fields' => '[{"field":"search_all","input":"input_text"}]',
1060  'search_mode' => 'any',
1061  ),
1062  ),
1063  'header_left' => array(
1064  substr( md5( microtime( true ) ), 0, 13 ) => array(
1065  'id' => 'page_info',
1066  'label' => __( 'Show Pagination Info', 'gravityview' ),
1067  ),
1068  ),
1069  'header_right' => array(
1070  substr( md5( microtime( true ) ), 0, 13 ) => array(
1071  'id' => 'page_links',
1072  'label' => __( 'Page Links', 'gravityview' ),
1073  'show_all' => '0',
1074  ),
1075  ),
1076  'footer_right' => array(
1077  substr( md5( microtime( true ) ), 0, 13 ) => array(
1078  'id' => 'page_links',
1079  'label' => __( 'Page Links', 'gravityview' ),
1080  'show_all' => '0',
1081  ),
1082  ),
1083  );
1084 
1085  /**
1086  * @filter `gravityview/view/widgets/default` Modify the default widgets for new Views
1087  * @param[in,out] array $widgets A Widget configuration array
1088  * @param string $zone The widget zone that's being requested
1089  * @param int $post_id The auto-draft post ID
1090  */
1091  $widgets = apply_filters( 'gravityview/view/widgets/default', $widgets, $template_id, $zone, $post_id );
1092  } else {
1093  $widgets = gravityview_get_directory_widgets( $post_id );
1094  }
1095  }
1096 
1097  ob_start();
1098  ?>
1099 
1100  <div class="gv-grid gv-grid-pad gv-grid-border" id="directory-<?php echo $zone; ?>-widgets">
1101  <?php $this->render_active_areas( $template_id, 'widget', $zone, $default_widget_areas, $widgets ); ?>
1102  </div>
1103 
1104  <?php
1105  $output = ob_get_clean();
1106 
1107  echo $output;
1108 
1109  return $output;
1110  }
1111 
1112  /**
1113  * Renders "Add Field" tooltips
1114  *
1115  * @since 2.0.11
1116  *
1117  * @param string $context "directory", "single", or "edit"
1118  * @param array $form_ids (default: array) Array of form IDs
1119  *
1120  * @return void
1121  */
1122  function render_field_pickers( $context = 'directory', $form_ids = array() ) {
1123 
1124  global $post;
1125 
1126  if ( $post ) {
1127  $source_form_id = gravityview_get_form_id( $post->ID );
1128  if ( $source_form_id ) {
1129  $form_ids[] = $source_form_id;
1130  }
1131 
1132  $joined_forms = \GV\View::get_joined_forms( $post->ID );
1133  foreach ( $joined_forms as $joined_form ) {
1134  $form_ids[] = $joined_form->ID;
1135  }
1136  }
1137  foreach ( array_unique( $form_ids ) as $form_id ) {
1138  $filter_field_id = sprintf( 'gv-field-filter-%s-%s', $context, $form_id );
1139 
1140  ?>
1141  <div id="<?php echo esc_html( $context ); ?>-available-fields-<?php echo esc_attr( $form_id ); ?>" class="hide-if-js gv-tooltip">
1142  <button class="close" role="button" aria-label="<?php esc_html_e( 'Close', 'gravityview' ); ?>"><i class="dashicons dashicons-dismiss"></i></button>
1143 
1144  <div class="gv-field-filter-form">
1145  <label class="screen-reader-text" for="<?php echo esc_html( $filter_field_id ); ?>"><?php esc_html_e( 'Filter Fields:', 'gravityview' ); ?></label>
1146  <input type="search" class="widefat gv-field-filter" aria-controls="<?php echo $filter_field_id; ?>" id="<?php echo esc_html( $filter_field_id ); ?>" placeholder="<?php esc_html_e( 'Filter fields by name or label', 'gravityview' ); ?>" />
1147  <div class="button-group">
1148  <span role="button" class="button button-large gv-items-picker gv-items-picker--grid" data-value="grid"><i class="dashicons dashicons-grid-view "></i></span>
1149  <span role="button" class="button button-large gv-items-picker gv-items-picker--list active" data-value="list"><i class="dashicons dashicons-list-view"></i></span>
1150  </div>
1151  </div>
1152 
1153  <div id="available-fields-<?php echo $filter_field_id; ?>" aria-live="polite" role="listbox" class="gv-items-picker-container">
1154  <?php do_action( 'gravityview_render_available_fields', $form_id, $context ); ?>
1155  </div>
1156 
1157  <div class="gv-no-results hidden description"><?php esc_html_e( 'No fields were found matching the search.', 'gravityview' ); ?></div>
1158  </div>
1159  <?php
1160  }
1161  }
1162 
1163  /**
1164  * Render the Template Active Areas and configured active fields for a given template id and post id
1165  *
1166  * @param string $template_id (default: '') Template ID, like `default_list`, `default_table`, `preset_business_data`, etc. {@see GravityView_Template::__construct()}
1167  * @param string $post_id (default: '')
1168  * @param string $context (default: 'single')
1169  * @return string HTML of the active areas
1170  */
1171  function render_directory_active_areas( $template_id = '', $context = 'single', $post_id = '', $echo = false ) {
1172  if( empty( $template_id ) ) {
1173  gravityview()->log->debug( '[render_directory_active_areas] {template_id} is empty', array( 'template_id' => $template_id ) );
1174  return '';
1175  }
1176 
1177  /**
1178  * @filter `gravityview_template_active_areas`
1179  * @see GravityView_Template::assign_active_areas()
1180  * @param array $template_areas Empty array, to be filled in by the template class
1181  * @param string $template_id Template ID, like `default_list`, `default_table`, `preset_business_data`, etc. {@see GravityView_Template::__construct()}
1182  * @param string $context Current View context: `directory`, `single`, or `edit` (default: 'single')
1183  */
1184  $template_areas = apply_filters( 'gravityview_template_active_areas', array(), $template_id, $context );
1185 
1186  if( empty( $template_areas ) ) {
1187 
1188  gravityview()->log->debug( '[render_directory_active_areas] No areas defined. Maybe template {template_id} is disabled.', array( 'data' => $template_id ) );
1189  $output = '<div>';
1190  $output .= '<h2 class="description" style="font-size: 16px; margin:0">'. sprintf( esc_html__( 'This View is configured using the %s View type, which is disabled.', 'gravityview' ), '<em>'.$template_id.'</em>' ) .'</h2>';
1191  $output .= '<p class="description" style="font-size: 14px; margin:0 0 1em 0;padding:0">'.esc_html__('The data is not lost; re-activate the associated plugin and the configuration will re-appear.', 'gravityview').'</p>';
1192  $output .= '</div>';
1193  } else {
1194 
1195  $fields = '';
1196  if ( ! empty( $post_id ) ) {
1197  $fields = gravityview_get_directory_fields( $post_id );
1198  }
1199 
1200  ob_start();
1201  $this->render_active_areas( $template_id, 'field', $context, $template_areas, $fields );
1202  $output = ob_get_clean();
1203 
1204  }
1205 
1206  if( $echo ) {
1207  echo $output;
1208  }
1209 
1210  return $output;
1211  }
1212 
1213  /**
1214  * Enqueue scripts and styles at Views editor
1215  *
1216  * @param mixed $hook
1217  * @return void
1218  */
1219  static function add_scripts_and_styles( $hook ) {
1220  global $plugin_page, $pagenow;
1221 
1222  $script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
1223  $is_widgets_page = ( $pagenow === 'widgets.php' );
1224 
1225  // Add legacy (2.4 and older) Gravity Forms tooltip script/style
1226  if ( gravityview()->plugin->is_GF_25() && gravityview()->request->is_admin( '', 'single' ) ) {
1227  wp_dequeue_script( 'gform_tooltip_init' );
1228  wp_dequeue_style( 'gform_tooltip' );
1229  wp_enqueue_style( 'gravityview_gf_tooltip', plugins_url( 'assets/css/gf_tooltip.css', GRAVITYVIEW_FILE ), array(), \GV\Plugin::$version );
1230  wp_enqueue_script( 'gravityview_gf_tooltip', plugins_url( 'assets/js/gf_tooltip' . $script_debug . '.js', GRAVITYVIEW_FILE ), array(), \GV\Plugin::$version );
1231  }
1232 
1233  // Add the GV font (with the Astronaut)
1234  wp_enqueue_style( 'gravityview_global', plugins_url('assets/css/admin-global.css', GRAVITYVIEW_FILE), array(), \GV\Plugin::$version );
1235  wp_register_style( 'gravityview_views_styles', plugins_url( 'assets/css/admin-views.css', GRAVITYVIEW_FILE ), array( 'dashicons', 'wp-jquery-ui-dialog' ), \GV\Plugin::$version );
1236 
1237  wp_register_script( 'gravityview-jquery-cookie', plugins_url('assets/lib/jquery.cookie/jquery.cookie.min.js', GRAVITYVIEW_FILE), array( 'jquery' ), \GV\Plugin::$version, true );
1238 
1239  if( GFForms::get_page() === 'form_list' ) {
1240  wp_enqueue_style( 'gravityview_views_styles' );
1241  return;
1242  }
1243 
1244  // Don't process any scripts below here if it's not a GravityView page.
1245  if( ! gravityview()->request->is_admin( $hook, 'single' ) && ! $is_widgets_page ) {
1246  return;
1247  }
1248 
1249  wp_enqueue_script( 'jquery-ui-datepicker' );
1250  wp_enqueue_style( 'gravityview_views_datepicker', plugins_url('assets/css/admin-datepicker.css', GRAVITYVIEW_FILE), \GV\Plugin::$version );
1251 
1252  // Enqueue scripts
1253  wp_enqueue_script( 'gravityview_views_scripts', plugins_url( 'assets/js/admin-views' . $script_debug . '.js', GRAVITYVIEW_FILE ), array( 'jquery-ui-tabs', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-sortable', 'jquery-ui-tooltip', 'jquery-ui-dialog', 'gravityview-jquery-cookie', 'jquery-ui-datepicker', 'underscore' ), \GV\Plugin::$version );
1254 
1255  wp_localize_script('gravityview_views_scripts', 'gvGlobals', array(
1256  'cookiepath' => COOKIEPATH,
1257  'admin_cookiepath' => ADMIN_COOKIE_PATH,
1258  'passed_form_id' => (bool) \GV\Utils::_GET( 'form_id' ),
1259  'nonce' => wp_create_nonce( 'gravityview_ajaxviews' ),
1260  'label_viewname' => __( 'Enter View name here', 'gravityview' ),
1261  'label_reorder_search_fields' => __( 'Reorder Search Fields', 'gravityview' ),
1262  'label_add_search_field' => __( 'Add Search Field', 'gravityview' ),
1263  'label_remove_search_field' => __( 'Remove Search Field', 'gravityview' ),
1264  'label_close' => __( 'Close', 'gravityview' ),
1265  'label_cancel' => __( 'Cancel', 'gravityview' ),
1266  'label_continue' => __( 'Continue', 'gravityview' ),
1267  'label_ok' => __( 'Ok', 'gravityview' ),
1268  'label_publisherror' => __( 'Error while creating the View for you. Check the settings or contact GravityView support.', 'gravityview' ),
1269  'loading_text' => esc_html__( 'Loading&hellip;', 'gravityview' ),
1270  'loading_error' => esc_html__( 'There was an error loading dynamic content.', 'gravityview' ),
1271  'field_loaderror' => __( 'Error while adding the field. Please try again or contact GravityView support.', 'gravityview' ),
1272  'remove_all_fields' => __( 'Would you like to remove all fields in this zone?', 'gravityview' ),
1273  ));
1274 
1275  wp_enqueue_style( 'gravityview_views_styles' );
1276 
1277  // Enqueue scripts needed for merge tags
1278  self::enqueue_gravity_forms_scripts();
1279 
1280  // 2.5 changed how Merge Tags are enqueued
1281  if ( is_callable( array( 'GFCommon', 'output_hooks_javascript') ) ) {
1282  GFCommon::output_hooks_javascript();
1283  }
1284  }
1285 
1286  /**
1287  * Enqueue Gravity Forms scripts, needed for Merge Tags
1288  *
1289  * @since 1.0.5-beta
1290  *
1291  * @return void
1292  */
1293  static function enqueue_gravity_forms_scripts() {
1294  GFForms::register_scripts();
1295 
1296  $scripts = array(
1297  'sack',
1298  'gform_gravityforms',
1299  'gform_forms',
1300  'gform_form_admin',
1301  'jquery-ui-autocomplete'
1302  );
1303 
1304  if ( wp_is_mobile() ) {
1305  $scripts[] = 'jquery-touch-punch';
1306  }
1307 
1308  wp_enqueue_script( $scripts );
1309  }
1310 
1311  /**
1312  * Add GravityView scripts and styles to Gravity Forms and GravityView No-Conflict modes
1313  *
1314  * @param array $registered Existing scripts or styles that have been registered (array of the handles)
1315  *
1316  * @return array
1317  */
1318  function register_no_conflict( $registered ) {
1319 
1320  $allowed_dependencies = array();
1321 
1322  $filter = current_filter();
1323 
1324  if ( preg_match( '/script/ism', $filter ) ) {
1325 
1326  $allowed_dependencies = array(
1327  'jquery-ui-core',
1328  'jquery-ui-dialog',
1329  'jquery-ui-tabs',
1330  'jquery-ui-draggable',
1331  'jquery-ui-droppable',
1332  'jquery-ui-sortable',
1333  'jquery-ui-tooltip',
1334  'gravityview_views_scripts',
1335  'gravityview-support',
1336  'gravityview-jquery-cookie',
1337  'gravityview_views_datepicker',
1338  'gravityview_gf_tooltip',
1339  'sack',
1340  'gform_gravityforms',
1341  'gform_forms',
1342  'gform_form_admin',
1343  'jquery-ui-autocomplete',
1344  );
1345 
1346  } elseif ( preg_match( '/style/ism', $filter ) ) {
1347 
1348  $allowed_dependencies = array(
1349  'dashicons',
1350  'wp-jquery-ui-dialog',
1351  'gravityview_views_styles',
1352  'gravityview_global',
1353  'gravityview_views_datepicker',
1354  'gravityview_gf_tooltip',
1355  );
1356  }
1357 
1358  return array_merge( $registered, $allowed_dependencies );
1359  }
1360 
1361 
1362 }
1363 
static _GET( $name, $default=null)
Grab a value from the _GET superglobal or default.
$forms
Definition: data-source.php:19
gravityview_set_directory_widgets( $post_id, $widgets=array())
Set the widgets, as configured for a View.
static render_field_options( $form_id, $field_type, $template_id, $field_id, $field_label, $area, $input_type=NULL, $uniqid='', $current='', $context='single', $item=array())
Render Field Options html (shown through a dialog box)
get_entry_default_fields($form, $zone)
Retrieve the default fields id, label and type.
static registered()
Return all registered widgets.
if(! isset( $gravityview)||empty( $gravityview->template)) $template
The entry loop for the list output.
suggest_support_articles( $localization_data=array())
When on the Add/Edit View screen, suggest most popular articles related to that.
gravityview_get_directory_fields( $post_id, $apply_filter=true)
Get the field configuration for the View.
static render_setting_row( $key='', $current_settings=array(), $override_input=null, $name='template_settings[%s]', $id='gravityview_se_%s')
Output a table row for view settings.
gravityview_get_entry_meta( $form_id, $only_default_column=true)
get extra fields from entry meta
static gform_toolbar_menu( $menu_items=array(), $id=NULL)
Add a GravityView menu to the Form Toolbar with connected views.
static get_connected_form_links( $form, $include_form_link=true)
Get HTML links relating to a connected form, like Edit, Entries, Settings, Preview.
gravityview_get_form( $form_id)
Returns the form object for a given Form ID.
gravityview_get_directory_widgets( $post_id)
Get the widgets, as configured for a View.
static get_default_widget_areas()
Default widget areas.
tooltips( $tooltips=array())
Add tooltip text for use throughout the UI.
add_view_dropdown()
Adds dropdown selects to filter Views by connected form and layout.
gravityview()
Definition: _stubs.php:26
$templates
global $post
Definition: delete-entry.php:7
add_custom_column_content( $column_name=NULL, $post_id)
Add the Data Source information.
get( $key, $default=null)
Retrieve a setting.
If this file is called directly, abort.
if(gravityview() ->plugin->is_GF_25()) $form
render_widgets_active_areas( $template_id='', $zone='', $post_id='')
Render the widget active areas.
gravityview_get_forms( $active=true, $trash=false, $order_by='date_created', $order='ASC')
Alias of GFAPI::get_forms()
new GravityView_Admin_Views
static render_field_option( $name='', $option, $curr_value=NULL)
$current_settings
render_active_areas( $template_id, $type, $zone, $rows, $values)
Generic function to render rows and columns of active areas for widgets & fields. ...
render_directory_active_areas( $template_id='', $context='single', $post_id='', $echo=false)
Render the Template Active Areas and configured active fields for a given template id and post id...
gravityview_get_form_fields( $form='', $add_default_properties=false, $include_parent_field=true)
Return array of fields&#39; id and label, for a given Form ID.
static render_setting_row( $key='', $current_settings=array(), $override_input=null, $name='template_settings[%s]', $id='gravityview_se_%s')
$gv_field
Definition: time.php:11
static pre_get_form_fields( $template_id='')
Get the the form fields for a preset (no form created yet)
Definition: class-ajax.php:317
register_no_conflict( $registered)
Add GravityView scripts and styles to Gravity Forms and GravityView No-Conflict modes.
gravityview_get_connected_views( $form_id, $args=array())
Get the views for a particular form.
gravityview_get_form_id( $view_id)
Get the connected form ID from a View ID.
add_post_type_columns( $columns)
Add the Data Source column to the Views page.
get_registered_widgets()
Get the list of registered widgets.
const GRAVITYVIEW_FILE
Full path to the GravityView file "GRAVITYVIEW_FILE" "./gravityview.php".
Definition: gravityview.php:31
gravityview_get_registered_templates()
Get all available preset templates.
render_field_pickers( $context='directory', $form_ids=array())
Renders "Add Field" tooltips.
if(empty( $field_settings['email_field'])) $settings
default_field_blacklist( $array=array(), $context=NULL)
List the field types without presentation properties (on a View context)
if(empty( $created_by)) $form_id
_gravityview_process_posted_fields()
Maybe convert jQuery-serialized fields into array, otherwise return $_POST[&#39;fields&#39;] array...
static get( $array, $key, $default=null)
Grab a value from an array or an object or default.
render_available_widgets()
Render html for displaying available widgets.
static get_all( $groups='')
Get all fields.
gravityview_get_template_id( $post_id)
Get the template ID (list, table, datatables, map) for a View.
static get_joined_forms( $post_id)
Get joined forms associated with a view In no particular order.
static defaults( $detailed=false, $group=null)
Retrieve the default View settings.
gravityview_get_joined_forms( $view_id)
Get joined forms associated with a view.
static has_cap( $caps='', $object_id=null, $user_id=null)
Alias of GravityView_Roles_Capabilities::has_cap()
static add_scripts_and_styles( $hook)
Enqueue scripts and styles at Views editor.
get_available_fields( $form='', $zone=NULL)
Calculate the available fields.
$current_form
Definition: data-source.php:13
static enqueue_gravity_forms_scripts()
Enqueue Gravity Forms scripts, needed for Merge Tags.
static render_field_option( $name='', $option=array(), $curr_value=NULL)
Handle rendering a field option form element.
static from_post( $post)
Construct a instance from a .
render_available_fields( $form=0, $context='single')
Render html for displaying available fields based on a Form ID.
$field
Definition: gquiz_grade.php:11
save_postdata( $post_id)
Save View configuration.
render_additional_fields( $form=0, $context='single')
Render html for displaying additional fields based on a Form ID.
$title