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' ) ),
);
}