diff --git a/.travis.yml b/.travis.yml index 117c93d87a..44dda8c286 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,27 +2,27 @@ language: php matrix: include: - - php: 5.3 + - php: '5.3' env: WP_VERSION=4.7.6 dist: precise - - php: 5.3 + - php: '5.3' env: WP_VERSION=latest dist: precise - - php: 5.6 + - php: '5.6' env: WP_VERSION=latest - - php: 5.6 + - php: '5.6' env: WP_TRAVISCI=phpcs - - php: 7.0 + - php: '7.0' env: WP_VERSION=latest - - php: 7.0 - env: WP_VERSION=nightly - - php: 7.1 + - php: '7.1' + env: WP_VERSION=latest + - php: '7.2' env: WP_VERSION=latest - - php: 7.2 + - php: '7.3' env: WP_VERSION=latest + - php: '7.3' + env: WP_VERSION=nightly fast_finish: true - allow_failures: - - php: 7.2 branches: only: @@ -88,4 +88,4 @@ script: if [[ "$WP_TRAVISCI" == "phpcs" ]] ; then cd $OG_DIR grunt phpcs - fi \ No newline at end of file + fi diff --git a/fieldmanager.php b/fieldmanager.php index f6fc45bee1..befc0d4d9f 100644 --- a/fieldmanager.php +++ b/fieldmanager.php @@ -3,7 +3,7 @@ * Fieldmanager Base Plugin File. * * @package Fieldmanager - * @version 1.2.4 + * @version 1.2.5-beta2 */ /* @@ -11,14 +11,14 @@ Plugin URI: https://github.com/alleyinteractive/wordpress-fieldmanager Description: Add fields to WordPress programatically. Author: Alley -Version: 1.2.4 +Version: 1.2.5-beta2 Author URI: https://www.alley.co/ */ /** * Current version of Fieldmanager. */ -define( 'FM_VERSION', '1.2.4' ); +define( 'FM_VERSION', '1.2.5-beta2' ); /** * Filesystem path to Fieldmanager. @@ -160,6 +160,17 @@ function fieldmanager_get_template( $tpl_slug ) { * @param bool $admin Deprecated. */ function fm_add_script( $handle, $path = false, $deps = array(), $ver = false, $in_footer = false, $data_object = '', $data = array(), $plugin_dir = '', $admin = true ) { + // Ensure the Fieldmanager loader has been enqueued. + Fieldmanager_Util_Assets::instance()->add_script( + array( + 'handle' => 'fm_loader', + 'path' => 'js/fieldmanager-loader.js', + 'deps' => array( 'jquery' ), + 'ver' => FM_VERSION, + ) + ); + + // Enqueue the requested script. Fieldmanager_Util_Assets::instance()->add_script( compact( 'handle', 'path', 'deps', 'ver', 'in_footer', 'data_object', 'data', 'plugin_dir' ) ); } diff --git a/js/fieldmanager-autocomplete.js b/js/fieldmanager-autocomplete.js index b6630f06f8..cfce666966 100644 --- a/js/fieldmanager-autocomplete.js +++ b/js/fieldmanager-autocomplete.js @@ -80,9 +80,10 @@ fm.autocomplete = { } } ); } -} +}; + +fmLoadModule( fm.autocomplete.enable_autocomplete ); -$( document ).ready( fm.autocomplete.enable_autocomplete ); $( document ).on( 'fm_collapsible_toggle fm_added_element fm_displayif_toggle fm_activate_tab', fm.autocomplete.enable_autocomplete ); } ) ( jQuery ); diff --git a/js/fieldmanager-colorpicker.js b/js/fieldmanager-colorpicker.js index 4d6fc278f8..dcbc59cefe 100644 --- a/js/fieldmanager-colorpicker.js +++ b/js/fieldmanager-colorpicker.js @@ -4,9 +4,10 @@ init: function() { $( '.fm-colorpicker-popup:visible' ).wpColorPicker(); } - } + }; + + fmLoadModule( fm.colorpicker.init ); - $( document ).ready( fm.colorpicker.init ); $( document ).on( 'fm_collapsible_toggle fm_added_element fm_displayif_toggle fm_activate_tab', fm.colorpicker.init ); -} )( jQuery ); \ No newline at end of file +} )( jQuery ); diff --git a/js/fieldmanager-datepicker.js b/js/fieldmanager-datepicker.js index cc785253ee..52f2b16064 100644 --- a/js/fieldmanager-datepicker.js +++ b/js/fieldmanager-datepicker.js @@ -8,8 +8,9 @@ } } ); } - } + }; + + fmLoadModule( fm.datepicker.add_datepicker ); - $( document ).ready( fm.datepicker.add_datepicker ); $( document ).on( 'fm_collapsible_toggle fm_added_element fm_displayif_toggle fm_activate_tab', fm.datepicker.add_datepicker ); -} ) ( jQuery ); \ No newline at end of file +} ) ( jQuery ); diff --git a/js/fieldmanager-draggablepost.js b/js/fieldmanager-draggablepost.js index de9fac0061..f364c83f64 100644 --- a/js/fieldmanager-draggablepost.js +++ b/js/fieldmanager-draggablepost.js @@ -1,5 +1,5 @@ (function($) { - $(document).ready(function() { + function draggablePostInit() { resetEmptyMessages(); $('.sortables').sortable({ connectWith: '.sortables', @@ -19,7 +19,7 @@ setTimeout(function() { resetEmptyMessages(); populateHiddenElements(); }, 10); } }); - }); + } function resetEmptyMessages() { $('.post-bin').each(function(i) { if ($(this).find('.draggable-post').length > 0) { @@ -40,4 +40,6 @@ $('#' + input_name).val(post_ids.join(',')); }); } -})(jQuery); \ No newline at end of file + + fmLoadModule( draggablePostInit ); +})(jQuery); diff --git a/js/fieldmanager-group-tabs.js b/js/fieldmanager-group-tabs.js index b1c9398581..e94bf78fac 100644 --- a/js/fieldmanager-group-tabs.js +++ b/js/fieldmanager-group-tabs.js @@ -8,9 +8,9 @@ var FieldmanagerGroupTabs; */ init: function() { - this.bindEvents(); + FieldmanagerGroupTabs.bindEvents(); - this.restoreSelectedTabs(); + FieldmanagerGroupTabs.restoreSelectedTabs(); }, @@ -164,10 +164,5 @@ var FieldmanagerGroupTabs; }; - $(document).ready( function(){ - - FieldmanagerGroupTabs.init(); - - }); - + fmLoadModule( FieldmanagerGroupTabs.init ); } )( jQuery ); diff --git a/js/fieldmanager-loader.js b/js/fieldmanager-loader.js new file mode 100644 index 0000000000..348ef6fc10 --- /dev/null +++ b/js/fieldmanager-loader.js @@ -0,0 +1,25 @@ +/** + * A wrapper for DOM ready handlers in the global wp object and jQuery, + * with a shim fallback that mimics the behavior of wp.domReady. + * Ensures that metaboxes have loaded before initializing functionality. + * @param {function} callback - The callback function to execute when the DOM is ready. + */ +function fmLoadModule( callback ) { + if ( 'object' === typeof wp && 'function' === typeof wp.domReady ) { + wp.domReady( callback ); + } else if ( jQuery ) { + jQuery( document ).ready( callback ); + } else { + // Shim wp.domReady. + if ( + document.readyState === 'complete' || // DOMContentLoaded + Images/Styles/etc loaded, so we call directly. + document.readyState === 'interactive' // DOMContentLoaded fires at this point, so we call directly. + ) { + callback(); + return; + } + + // DOMContentLoaded has not fired yet, delay callback until then. + document.addEventListener( 'DOMContentLoaded', callback ); + } +} diff --git a/js/fieldmanager-post.js b/js/fieldmanager-post.js index d9868d15e2..ceb2d2604a 100644 --- a/js/fieldmanager-post.js +++ b/js/fieldmanager-post.js @@ -12,7 +12,7 @@ var fm_show_post_type = function( $element, post_type ) { var fm_show_post_date = function( $element, post_date ) { if ( $element.data( 'showPostDate' ) == 1 ) { $element.parent().siblings('.fmjs-post-date').remove(); - $element.parent().siblings(".fmjs-remove, .fmjs-clear").after('
' + post_date + '
'); + $element.parent().siblings(".fmjs-remove, .fmjs-clear").after('
' + post_date + '
'); } } @@ -35,22 +35,22 @@ var fm_typeahead_action = function( $element ) { }); } }, - updater: function ( item ) { + updater: function ( item ) { // Get the post ID and post type and store them in data attributes $element.data( 'id', fm_typeahead_results[item]['id'] ); $element.data( 'postType', fm_typeahead_results[item]['post_type'] ); $element.data( 'postDate', fm_typeahead_results[item]['post_date'] ); - + // If the clear handle is enabled, show it $element.parent().siblings('.fmjs-clear').show(); - + // Show the selected post type and/or date after the clear/remove handle fm_show_post_type($element, fm_typeahead_results[item]['post_type']); fm_show_post_date($element, fm_typeahead_results[item]['post_date']); - + // Trigger that the update happened in case any other functions want to execute something here $element.trigger( 'fm_post_update', [item, fm_typeahead_results[item]] ); - + // Remove the post type and/or date from the title and return the title for the text field return fm_typeahead_results[item]['post_title']; }, @@ -58,24 +58,24 @@ var fm_typeahead_action = function( $element ) { } ); } -$( document ).ready( function () { +function fm_post_init() { $( '.fm-post-element' ).each( function( index ) { // Enable typeahead for each post field fm_typeahead_action( $( this ) ); - + // Show the post type, date and/or clear handle (if exists) if the field is not empty and those fields are specified for display - if ( $( this ).data('postType') != '' ) { + if ( $( this ).data('postType') != '' ) { fm_show_post_type( $( this ), $( this ).data('postType') ); } - - if ( $( this ).data('postDate') != '' ) { + + if ( $( this ).data('postDate') != '' ) { fm_show_post_date( $( this ), $( this ).data('postDate') ); } - - if ( $( this ).data('id') != '' ) { + + if ( $( this ).data('id') != '' ) { $( this ).parent().siblings('.fmjs-clear').show(); } - + } ); $( "#post" ).submit( function( e ) { $( '.fm-post-element' ).each( function( index ) { @@ -90,6 +90,8 @@ $( document ).ready( function () { $post_element = $(event.target).find( '.fm-post-element' ); if ( $post_element.length != 0 ) fm_typeahead_action( $post_element ); } ); -} ); +} + +fmLoadModule( fm_post_init ); -} )( jQuery ); \ No newline at end of file +} )( jQuery ); diff --git a/js/fieldmanager-quickedit.js b/js/fieldmanager-quickedit.js index e6cc68c012..0ba53cf4fa 100644 --- a/js/fieldmanager-quickedit.js +++ b/js/fieldmanager-quickedit.js @@ -1,6 +1,6 @@ ( function( $ ) { - $( document ).ready( function() { + function fm_quickedit_init() { if ( typeof( inlineEditPost ) == 'undefined' ) { return; } @@ -29,6 +29,7 @@ } ); } } - } ); + } -} )( jQuery ); \ No newline at end of file + fmLoadModule( fm_quickedit_init ); +} )( jQuery ); diff --git a/js/fieldmanager-select.js b/js/fieldmanager-select.js index 24a7ed8d84..83d07e4e6d 100644 --- a/js/fieldmanager-select.js +++ b/js/fieldmanager-select.js @@ -42,7 +42,7 @@ fm_reset_chosen = function( $fm_text_field, fm_text_field_val ) { } ); } -$( document ).ready( function() { +function fm_select_init() { // Track changes to the chosen text field linked to the select in order to update options via Ajax // Used for taxonomy-based fields where preload is disabled @@ -99,6 +99,8 @@ $( document ).ready( function() { if( $this_select_field.data("taxonomy") != "" && $this_select_field.data("taxonomyPreload") == false ) fm_select_clear_terms( $this_select_field, $(this).parents('.chosen-choices'), true ); } ); -} ); +} + +fmLoadModule( fm_select_init ); -} )( jQuery ); \ No newline at end of file +} )( jQuery ); diff --git a/js/fieldmanager.js b/js/fieldmanager.js index 14684fd66b..5f99973e99 100644 --- a/js/fieldmanager.js +++ b/js/fieldmanager.js @@ -173,7 +173,7 @@ fm_remove = function( $element ) { fm_renumber( $wrapper ); } -$( document ).ready( function () { +var fm_init = function () { $( document ).on( 'click', '.fm-add-another', function( e ) { e.preventDefault(); fm_add_another( $( this ) ); @@ -276,6 +276,8 @@ $( document ).ready( function () { init_sortable(); $( document ).on( 'fm_activate_tab', init_sortable ); -} ); +}; + +fmLoadModule( fm_init ); } )( jQuery ); diff --git a/js/grid.js b/js/grid.js index c4af498e7a..8841b652b4 100644 --- a/js/grid.js +++ b/js/grid.js @@ -107,8 +107,6 @@ $( document ).on( 'fm_collapsible_toggle fm_added_element fm_displayif_toggle fm $.fm_grid_init(); } ); -$( document ).ready( function() { - $.fm_grid_init(); -} ); +fmLoadModule( $.fm_grid_init ); -})( jQuery ); \ No newline at end of file +})( jQuery ); diff --git a/js/richtext.js b/js/richtext.js index 0b6ad0cc3a..29f29ddb06 100644 --- a/js/richtext.js +++ b/js/richtext.js @@ -151,10 +151,12 @@ * On document.load, init the editors and make the global meta box drag-drop * event reload the editors. */ - $( function() { - fm.richtextarea.add_rte_to_visible_textareas(); - $( '.meta-box-sortables' ).on( 'sortstop', function( e, obj ) { - fm.richtextarea.reload_editors( e, obj.item[0] ); - } ); - } ); -} ) ( jQuery ); \ No newline at end of file + fmLoadModule( + function() { + fm.richtextarea.add_rte_to_visible_textareas(); + $( '.meta-box-sortables' ).on( 'sortstop', function( e, obj ) { + fm.richtextarea.reload_editors( e, obj.item[0] ); + } ); + } + ); +} ) ( jQuery ); diff --git a/package.json b/package.json index 478e171154..d9068f76be 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "Fieldmanager", "description": "Fieldmanager is a comprehensive toolkit for building forms, metaboxes, and custom admin screens for WordPress.", - "version": "1.2.4", - "repository" : { - "type" : "git", - "url" : "https://github.com/alleyinteractive/wordpress-fieldmanager" + "version": "1.2.5-beta2", + "repository": { + "type": "git", + "url": "https://github.com/alleyinteractive/wordpress-fieldmanager" }, "license": "GPL-2.0", "devDependencies": { diff --git a/php/class-fieldmanager-autocomplete.php b/php/class-fieldmanager-autocomplete.php index 2c9cc08d1f..c0551b7983 100644 --- a/php/class-fieldmanager-autocomplete.php +++ b/php/class-fieldmanager-autocomplete.php @@ -77,9 +77,9 @@ public function __construct( $label = '', $options = array() ) { fm_add_script( 'fm_autocomplete_js', 'js/fieldmanager-autocomplete.js', - array( 'fieldmanager_script', 'jquery-ui-autocomplete' ), - '1.0.6', - false, + array( 'fm_loader', 'fieldmanager_script', 'jquery-ui-autocomplete' ), + FM_VERSION, + true, 'fm_search', array( 'nonce' => wp_create_nonce( 'fm_search_nonce' ), diff --git a/php/class-fieldmanager-colorpicker.php b/php/class-fieldmanager-colorpicker.php index a98758094d..8cfe9897e3 100644 --- a/php/class-fieldmanager-colorpicker.php +++ b/php/class-fieldmanager-colorpicker.php @@ -36,7 +36,7 @@ class Fieldmanager_Colorpicker extends Fieldmanager_Field { * @param array $options The options. */ public function __construct( $label = '', $options = array() ) { - fm_add_script( 'fm_colorpicker', 'js/fieldmanager-colorpicker.js', array( 'jquery', 'wp-color-picker' ), '1.0', true ); + fm_add_script( 'fm_colorpicker', 'js/fieldmanager-colorpicker.js', array( 'fm_loader', 'jquery', 'wp-color-picker' ), FM_VERSION, true ); fm_add_style( 'wp-color-picker' ); $this->sanitize = 'sanitize_hex_color'; diff --git a/php/class-fieldmanager-datepicker.php b/php/class-fieldmanager-datepicker.php index ec835c60e3..379dd8ebb8 100644 --- a/php/class-fieldmanager-datepicker.php +++ b/php/class-fieldmanager-datepicker.php @@ -70,7 +70,7 @@ class Fieldmanager_Datepicker extends Fieldmanager_Field { */ public function __construct( $label = '', $options = array() ) { fm_add_style( 'fm-jquery-ui', 'css/jquery-ui/jquery-ui-1.10.2.custom.min.css' ); - fm_add_script( 'fm_datepicker', 'js/fieldmanager-datepicker.js', array( 'fieldmanager_script', 'jquery-ui-datepicker' ) ); + fm_add_script( 'fm_datepicker', 'js/fieldmanager-datepicker.js', array( 'fm_loader', 'fieldmanager_script', 'jquery-ui-datepicker' ), FM_VERSION, true ); parent::__construct( $label, $options ); if ( empty( $this->js_opts ) ) { diff --git a/php/class-fieldmanager-draggablepost.php b/php/class-fieldmanager-draggablepost.php index a3f2b4950d..9b239d7e2b 100644 --- a/php/class-fieldmanager-draggablepost.php +++ b/php/class-fieldmanager-draggablepost.php @@ -57,8 +57,8 @@ public function __construct( $label = '', $options = array() ) { // Refuse to allow more than one instance of this field type. $this->limit = 1; - fm_add_script( 'fm_draggablepost_js', 'js/fieldmanager-draggablepost.js', array( 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-sortable' ) ); - fm_add_style( 'fm_draggablepost_css', 'css/fieldmanager-draggablepost.css' ); + fm_add_script( 'fm_draggablepost_js', 'js/fieldmanager-draggablepost.js', array( 'fm_loader', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-sortable' ), FM_VERSION, true ); + fm_add_style( 'fm_draggablepost_css', 'css/fieldmanager-draggablepost.css', array(), FM_VERSION ); } /** diff --git a/php/class-fieldmanager-field.php b/php/class-fieldmanager-field.php index f267506fd0..ca6c7f32c8 100644 --- a/php/class-fieldmanager-field.php +++ b/php/class-fieldmanager-field.php @@ -409,8 +409,8 @@ public function __construct( $label = '', $options = array() ) { // Only enqueue base assets once, and only when we have a field. if ( ! self::$enqueued_base_assets ) { - fm_add_script( 'fieldmanager_script', 'js/fieldmanager.js', array( 'jquery', 'jquery-ui-sortable' ), '1.2.1' ); - fm_add_style( 'fieldmanager_style', 'css/fieldmanager.css', array(), '1.0.4' ); + fm_add_script( 'fieldmanager_script', 'js/fieldmanager.js', array( 'fm_loader', 'jquery', 'jquery-ui-sortable' ), FM_VERSION ); + fm_add_style( 'fieldmanager_style', 'css/fieldmanager.css', array(), FM_VERSION ); self::$enqueued_base_assets = true; } } diff --git a/php/class-fieldmanager-grid.php b/php/class-fieldmanager-grid.php index 07b5e44b83..76ef5fe341 100644 --- a/php/class-fieldmanager-grid.php +++ b/php/class-fieldmanager-grid.php @@ -55,7 +55,7 @@ public function __construct( $label = '', $options = array() ) { fm_add_script( 'handsontable', 'js/grid/jquery.handsontable.js' ); fm_add_script( 'contextmenu', 'js/grid/lib/jQuery-contextMenu/jquery.contextMenu.js' ); fm_add_script( 'ui_position', 'js/grid/lib/jQuery-contextMenu/jquery.ui.position.js' ); - fm_add_script( 'grid', 'js/grid.js' ); + fm_add_script( 'grid', 'js/grid.js', array( 'fm_loader', 'handsontable', 'contextmenu', 'ui_position' ), FM_VERSION, true ); fm_add_style( 'context_menu_css', 'js/grid/lib/jQuery-contextMenu/jquery.contextMenu.css' ); fm_add_style( 'handsontable_css', 'js/grid/jquery.handsontable.css' ); } diff --git a/php/class-fieldmanager-group.php b/php/class-fieldmanager-group.php index 6020f77240..4fa73830a2 100644 --- a/php/class-fieldmanager-group.php +++ b/php/class-fieldmanager-group.php @@ -196,8 +196,8 @@ public function __construct( $label = '', $options = array() ) { // Add the tab JS and CSS if it is needed. if ( $this->tabbed ) { fm_add_script( 'jquery-hoverintent', 'js/jquery.hoverIntent.js', array( 'jquery' ), '1.8.1' ); - fm_add_script( 'fm_group_tabs_js', 'js/fieldmanager-group-tabs.js', array( 'jquery', 'jquery-hoverintent' ), '1.0.4' ); - fm_add_style( 'fm_group_tabs_css', 'css/fieldmanager-group-tabs.css', array(), '1.0.5' ); + fm_add_script( 'fm_group_tabs_js', 'js/fieldmanager-group-tabs.js', array( 'fm_loader', 'jquery', 'jquery-hoverintent' ), FM_VERSION, true ); + fm_add_style( 'fm_group_tabs_css', 'css/fieldmanager-group-tabs.css', array(), FM_VERSION ); } } diff --git a/php/class-fieldmanager-media.php b/php/class-fieldmanager-media.php index 77e7744afe..31ef5d33de 100644 --- a/php/class-fieldmanager-media.php +++ b/php/class-fieldmanager-media.php @@ -107,7 +107,7 @@ public function __construct( $label = '', $options = array() ) { $this->remove_media_label = __( 'remove', 'fieldmanager' ); if ( ! self::$has_registered_media ) { - fm_add_script( 'fm_media', 'js/media/fieldmanager-media.js', array( 'jquery' ), '1.0.4' ); + fm_add_script( 'fm_media', 'js/media/fieldmanager-media.js', array( 'jquery' ), FM_VERSION, true ); if ( did_action( 'admin_print_scripts' ) ) { $this->admin_print_scripts(); } else { diff --git a/php/class-fieldmanager-options.php b/php/class-fieldmanager-options.php index aa90afe3ff..a901952514 100644 --- a/php/class-fieldmanager-options.php +++ b/php/class-fieldmanager-options.php @@ -76,7 +76,7 @@ public function __construct( $label = '', $options = array() ) { } // Add the options CSS. - fm_add_style( 'fm_options_css', 'css/fieldmanager-options.css' ); + fm_add_style( 'fm_options_css', 'css/fieldmanager-options.css', array(), FM_VERSION ); } /** diff --git a/php/class-fieldmanager-richtextarea.php b/php/class-fieldmanager-richtextarea.php index b0a3e530d8..d34f6857c3 100644 --- a/php/class-fieldmanager-richtextarea.php +++ b/php/class-fieldmanager-richtextarea.php @@ -104,7 +104,7 @@ public function __construct( $label = '', $options = array() ) { $this->sanitize = array( $this, 'sanitize' ); // 'utils' provides getUserSetting(). - fm_add_script( 'fm_richtext', 'js/richtext.js', array( 'jquery', 'fieldmanager_script', 'utils' ), '1.0.8' ); + fm_add_script( 'fm_richtext', 'js/richtext.js', array( 'fm_loader', 'jquery', 'fieldmanager_script', 'utils' ), FM_VERSION, true ); parent::__construct( $label, $options ); } diff --git a/php/class-fieldmanager-select.php b/php/class-fieldmanager-select.php index 8f9b30bd56..87efd826b0 100644 --- a/php/class-fieldmanager-select.php +++ b/php/class-fieldmanager-select.php @@ -59,9 +59,9 @@ public function __construct( $label = '', $options = array() ) { fm_add_script( 'fm_select_js', 'js/fieldmanager-select.js', - array(), - '1.0.2', - false, + array( 'fm_loader' ), + FM_VERSION, + true, 'fm_select', array( 'nonce' => wp_create_nonce( 'fm_search_terms_nonce' ), diff --git a/php/context/class-fieldmanager-context-quickedit.php b/php/context/class-fieldmanager-context-quickedit.php index eef4374858..bdaaa0c044 100644 --- a/php/context/class-fieldmanager-context-quickedit.php +++ b/php/context/class-fieldmanager-context-quickedit.php @@ -93,7 +93,7 @@ public function __construct( $title, $post_types, $column_display_callback, $col $post_type = ! isset( $_GET['post_type'] ) ? 'post' : sanitize_text_field( wp_unslash( $_GET['post_type'] ) ); // WPCS: input var okay. if ( in_array( $post_type, $this->post_types ) ) { - fm_add_script( 'quickedit-js', 'js/fieldmanager-quickedit.js' ); + fm_add_script( 'quickedit-js', 'js/fieldmanager-quickedit.js', array( 'fm_loader' ), FM_VERSION, true ); } } diff --git a/php/util/class-fieldmanager-util-assets.php b/php/util/class-fieldmanager-util-assets.php index aa13f29429..1612f3a804 100644 --- a/php/util/class-fieldmanager-util-assets.php +++ b/php/util/class-fieldmanager-util-assets.php @@ -93,7 +93,10 @@ public function enqueue_assets() { */ protected function pre_enqueue_script( $args ) { if ( did_action( 'admin_enqueue_scripts' ) || did_action( 'wp_enqueue_scripts' ) ) { - $this->enqueue_script( $args ); + // Ensure the script isn't already enqueued before performing the enqueue action. + if ( ! wp_script_is( $args['handle'], 'enqueued' ) ) { + $this->enqueue_script( $args ); + } } else { $this->scripts[ $args['handle'] ] = $args; $this->hook_enqueue(); diff --git a/tests/php/test-fieldmanager-script-loading.php b/tests/php/test-fieldmanager-script-loading.php index 81b6051b09..3240d30f6c 100644 --- a/tests/php/test-fieldmanager-script-loading.php +++ b/tests/php/test-fieldmanager-script-loading.php @@ -33,15 +33,15 @@ public function setUp() { */ public function script_data() { return array( - array( 'fieldmanager_script', array( 'jquery', 'jquery-ui-sortable' ) ), - array( 'fm_autocomplete_js', array( 'fieldmanager_script', 'jquery-ui-autocomplete' ) ), - array( 'fm_datepicker', array( 'fieldmanager_script', 'jquery-ui-datepicker' ) ), - array( 'fm_group_tabs_js', array( 'jquery', 'jquery-hoverintent' ) ), + array( 'fieldmanager_script', array( 'fm_loader', 'jquery', 'jquery-ui-sortable' ) ), + array( 'fm_autocomplete_js', array( 'fm_loader', 'fieldmanager_script', 'jquery-ui-autocomplete' ) ), + array( 'fm_datepicker', array( 'fm_loader', 'fieldmanager_script', 'jquery-ui-datepicker' ) ), + array( 'fm_group_tabs_js', array( 'fm_loader', 'jquery', 'jquery-hoverintent' ) ), array( 'fm_media', array( 'jquery' ) ), - array( 'fm_richtext', array( 'jquery', 'fieldmanager_script', 'utils' ) ), - array( 'fm_select_js', array() ), - array( 'grid', array() ), - array( 'fm_colorpicker', array( 'jquery', 'wp-color-picker' ) ), + array( 'fm_richtext', array( 'fm_loader', 'jquery', 'fieldmanager_script', 'utils' ) ), + array( 'fm_select_js', array( 'fm_loader' ) ), + array( 'grid', array( 'fm_loader', 'handsontable', 'contextmenu', 'ui_position' ) ), + array( 'fm_colorpicker', array( 'fm_loader', 'jquery', 'wp-color-picker' ) ), ); }