Compare commits
4 Commits
bremenwahl
...
piratenpar
| Author | SHA1 | Date | |
|---|---|---|---|
|
7d6435f56e
|
|||
|
|
6a9f1c6f2d | ||
|
d963cfbfbf
|
|||
|
8515ff9587
|
1
wp-content/plugins/PT-kandidaten
Submodule
25
wp-content/plugins/advanced-custom-fields/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Advanced Custom Fields
|
||||
|
||||
Welcome to the official Advanced Custom Fields repository on GitHub. ACF is a WordPress plugin used to take full control of your edit screens & custom field data.
|
||||
|
||||
Looking for ACF version 4? Please use the [previous ACF repository](https://github.com/elliotcondon/acf).
|
||||
|
||||
Upgrading from ACF version 4? Please read our [Upgrading from v4 to v5 guide](https://www.advancedcustomfields.com/resources/upgrading-v4-v5/).
|
||||
|
||||
## Documentation
|
||||
|
||||
Do you need help getting started with ACF, or do you have questions about one of the ACF features? You can [search through our documentation here](https://www.advancedcustomfields.com/resources). If you don't find the answers you're looking for, you can [submit a support ticket](https://support.advancedcustomfields.com/new-ticket/) or start a new forum thread in the [support forum](https://support.advancedcustomfields.com/).
|
||||
|
||||
## Support
|
||||
|
||||
This repository is not suitable for support. Please don't use our issue tracker for support requests, but for core issues only.
|
||||
Support can take place in the appropriate channels:
|
||||
|
||||
* Email based ticket system
|
||||
* Community forum
|
||||
|
||||
These channels can be accessed from our [support website](https://support.advancedcustomfields.com/).
|
||||
|
||||
## Contributing
|
||||
|
||||
If you have a patch, or stumbled upon an issue with ACF core, you can contribute this back to the code. Please create a new github issue with as much information as possible.
|
||||
680
wp-content/plugins/advanced-custom-fields/acf.php
Normal file
@@ -0,0 +1,680 @@
|
||||
<?php
|
||||
/*
|
||||
Plugin Name: Advanced Custom Fields
|
||||
Plugin URI: https://www.advancedcustomfields.com
|
||||
Description: Customize WordPress with powerful, professional and intuitive fields.
|
||||
Version: 5.8.3
|
||||
Author: Elliot Condon
|
||||
Author URI: https://www.advancedcustomfields.com
|
||||
Text Domain: acf
|
||||
Domain Path: /lang
|
||||
*/
|
||||
|
||||
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
|
||||
|
||||
if( ! class_exists('ACF') ) :
|
||||
|
||||
class ACF {
|
||||
|
||||
/** @var string The plugin version number */
|
||||
var $version = '5.8.3';
|
||||
|
||||
/** @var array The plugin settings array */
|
||||
var $settings = array();
|
||||
|
||||
/** @var array The plugin data array */
|
||||
var $data = array();
|
||||
|
||||
/** @var array Storage for class instances */
|
||||
var $instances = array();
|
||||
|
||||
|
||||
/*
|
||||
* __construct
|
||||
*
|
||||
* A dummy constructor to ensure ACF is only initialized once
|
||||
*
|
||||
* @type function
|
||||
* @date 23/06/12
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param N/A
|
||||
* @return N/A
|
||||
*/
|
||||
|
||||
function __construct() {
|
||||
|
||||
/* Do nothing here */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* The real constructor to initialize ACF
|
||||
*
|
||||
* @type function
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function initialize() {
|
||||
|
||||
// vars
|
||||
$version = $this->version;
|
||||
$basename = plugin_basename( __FILE__ );
|
||||
$path = plugin_dir_path( __FILE__ );
|
||||
$url = plugin_dir_url( __FILE__ );
|
||||
$slug = dirname($basename);
|
||||
|
||||
|
||||
// settings
|
||||
$this->settings = array(
|
||||
|
||||
// basic
|
||||
'name' => __('Advanced Custom Fields', 'acf'),
|
||||
'version' => $version,
|
||||
|
||||
// urls
|
||||
'file' => __FILE__,
|
||||
'basename' => $basename,
|
||||
'path' => $path,
|
||||
'url' => $url,
|
||||
'slug' => $slug,
|
||||
|
||||
// options
|
||||
'show_admin' => true,
|
||||
'show_updates' => true,
|
||||
'stripslashes' => false,
|
||||
'local' => true,
|
||||
'json' => true,
|
||||
'save_json' => '',
|
||||
'load_json' => array(),
|
||||
'default_language' => '',
|
||||
'current_language' => '',
|
||||
'capability' => 'manage_options',
|
||||
'uploader' => 'wp',
|
||||
'autoload' => false,
|
||||
'l10n' => true,
|
||||
'l10n_textdomain' => '',
|
||||
'google_api_key' => '',
|
||||
'google_api_client' => '',
|
||||
'enqueue_google_maps' => true,
|
||||
'enqueue_select2' => true,
|
||||
'enqueue_datepicker' => true,
|
||||
'enqueue_datetimepicker' => true,
|
||||
'select2_version' => 4,
|
||||
'row_index_offset' => 1,
|
||||
'remove_wp_meta_box' => true
|
||||
);
|
||||
|
||||
|
||||
// constants
|
||||
$this->define( 'ACF', true );
|
||||
$this->define( 'ACF_VERSION', $version );
|
||||
$this->define( 'ACF_PATH', $path );
|
||||
|
||||
// Include utility functions.
|
||||
include_once( ACF_PATH . 'includes/acf-utility-functions.php');
|
||||
|
||||
// Include previous API functions.
|
||||
acf_include('includes/api/api-helpers.php');
|
||||
acf_include('includes/api/api-template.php');
|
||||
acf_include('includes/api/api-term.php');
|
||||
|
||||
// Include classes.
|
||||
acf_include('includes/class-acf-data.php');
|
||||
|
||||
// Include functions.
|
||||
acf_include('includes/acf-helper-functions.php');
|
||||
acf_include('includes/acf-hook-functions.php');
|
||||
acf_include('includes/acf-field-functions.php');
|
||||
acf_include('includes/acf-field-group-functions.php');
|
||||
acf_include('includes/acf-form-functions.php');
|
||||
acf_include('includes/acf-meta-functions.php');
|
||||
acf_include('includes/acf-post-functions.php');
|
||||
acf_include('includes/acf-user-functions.php');
|
||||
acf_include('includes/acf-value-functions.php');
|
||||
acf_include('includes/acf-input-functions.php');
|
||||
|
||||
// fields
|
||||
acf_include('includes/fields.php');
|
||||
acf_include('includes/fields/class-acf-field.php');
|
||||
|
||||
|
||||
// locations
|
||||
acf_include('includes/locations.php');
|
||||
acf_include('includes/locations/class-acf-location.php');
|
||||
|
||||
|
||||
// core
|
||||
acf_include('includes/assets.php');
|
||||
acf_include('includes/compatibility.php');
|
||||
acf_include('includes/deprecated.php');
|
||||
acf_include('includes/json.php');
|
||||
acf_include('includes/l10n.php');
|
||||
acf_include('includes/local-fields.php');
|
||||
acf_include('includes/local-meta.php');
|
||||
acf_include('includes/loop.php');
|
||||
acf_include('includes/media.php');
|
||||
acf_include('includes/revisions.php');
|
||||
acf_include('includes/updates.php');
|
||||
acf_include('includes/upgrades.php');
|
||||
acf_include('includes/validation.php');
|
||||
|
||||
// ajax
|
||||
acf_include('includes/ajax/class-acf-ajax.php');
|
||||
acf_include('includes/ajax/class-acf-ajax-check-screen.php');
|
||||
acf_include('includes/ajax/class-acf-ajax-user-setting.php');
|
||||
acf_include('includes/ajax/class-acf-ajax-upgrade.php');
|
||||
|
||||
// forms
|
||||
acf_include('includes/forms/form-attachment.php');
|
||||
acf_include('includes/forms/form-comment.php');
|
||||
acf_include('includes/forms/form-customizer.php');
|
||||
acf_include('includes/forms/form-front.php');
|
||||
acf_include('includes/forms/form-nav-menu.php');
|
||||
acf_include('includes/forms/form-post.php');
|
||||
acf_include('includes/forms/form-gutenberg.php');
|
||||
acf_include('includes/forms/form-taxonomy.php');
|
||||
acf_include('includes/forms/form-user.php');
|
||||
acf_include('includes/forms/form-widget.php');
|
||||
|
||||
|
||||
// admin
|
||||
if( is_admin() ) {
|
||||
acf_include('includes/admin/admin.php');
|
||||
acf_include('includes/admin/admin-field-group.php');
|
||||
acf_include('includes/admin/admin-field-groups.php');
|
||||
acf_include('includes/admin/admin-notices.php');
|
||||
acf_include('includes/admin/admin-tools.php');
|
||||
acf_include('includes/admin/admin-upgrade.php');
|
||||
acf_include('includes/admin/settings-info.php');
|
||||
}
|
||||
|
||||
|
||||
// pro
|
||||
acf_include('pro/acf-pro.php');
|
||||
|
||||
// Include tests.
|
||||
if( defined('ACF_DEV') && ACF_DEV ) {
|
||||
acf_include('tests/tests.php');
|
||||
}
|
||||
|
||||
// actions
|
||||
add_action('init', array($this, 'init'), 5);
|
||||
add_action('init', array($this, 'register_post_types'), 5);
|
||||
add_action('init', array($this, 'register_post_status'), 5);
|
||||
|
||||
|
||||
// filters
|
||||
add_filter('posts_where', array($this, 'posts_where'), 10, 2 );
|
||||
//add_filter('posts_request', array($this, 'posts_request'), 10, 1 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* init
|
||||
*
|
||||
* This function will run after all plugins and theme functions have been included
|
||||
*
|
||||
* @type action (init)
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param N/A
|
||||
* @return N/A
|
||||
*/
|
||||
|
||||
function init() {
|
||||
|
||||
// bail early if too early
|
||||
// ensures all plugins have a chance to add fields, etc
|
||||
if( !did_action('plugins_loaded') ) return;
|
||||
|
||||
|
||||
// bail early if already init
|
||||
if( acf_has_done('init') ) return;
|
||||
|
||||
|
||||
// vars
|
||||
$major = intval( acf_get_setting('version') );
|
||||
|
||||
|
||||
// update url
|
||||
// - allow another plugin to modify dir (maybe force SSL)
|
||||
acf_update_setting('url', plugin_dir_url( __FILE__ ));
|
||||
|
||||
|
||||
// textdomain
|
||||
acf_load_textdomain();
|
||||
|
||||
// include 3rd party support
|
||||
acf_include('includes/third-party.php');
|
||||
|
||||
// include wpml support
|
||||
if( defined('ICL_SITEPRESS_VERSION') ) {
|
||||
acf_include('includes/wpml.php');
|
||||
}
|
||||
|
||||
// fields
|
||||
acf_include('includes/fields/class-acf-field-text.php');
|
||||
acf_include('includes/fields/class-acf-field-textarea.php');
|
||||
acf_include('includes/fields/class-acf-field-number.php');
|
||||
acf_include('includes/fields/class-acf-field-range.php');
|
||||
acf_include('includes/fields/class-acf-field-email.php');
|
||||
acf_include('includes/fields/class-acf-field-url.php');
|
||||
acf_include('includes/fields/class-acf-field-password.php');
|
||||
|
||||
acf_include('includes/fields/class-acf-field-image.php');
|
||||
acf_include('includes/fields/class-acf-field-file.php');
|
||||
acf_include('includes/fields/class-acf-field-wysiwyg.php');
|
||||
acf_include('includes/fields/class-acf-field-oembed.php');
|
||||
|
||||
acf_include('includes/fields/class-acf-field-select.php');
|
||||
acf_include('includes/fields/class-acf-field-checkbox.php');
|
||||
acf_include('includes/fields/class-acf-field-radio.php');
|
||||
acf_include('includes/fields/class-acf-field-button-group.php');
|
||||
acf_include('includes/fields/class-acf-field-true_false.php');
|
||||
|
||||
acf_include('includes/fields/class-acf-field-link.php');
|
||||
acf_include('includes/fields/class-acf-field-post_object.php');
|
||||
acf_include('includes/fields/class-acf-field-page_link.php');
|
||||
acf_include('includes/fields/class-acf-field-relationship.php');
|
||||
acf_include('includes/fields/class-acf-field-taxonomy.php');
|
||||
acf_include('includes/fields/class-acf-field-user.php');
|
||||
|
||||
acf_include('includes/fields/class-acf-field-google-map.php');
|
||||
acf_include('includes/fields/class-acf-field-date_picker.php');
|
||||
acf_include('includes/fields/class-acf-field-date_time_picker.php');
|
||||
acf_include('includes/fields/class-acf-field-time_picker.php');
|
||||
acf_include('includes/fields/class-acf-field-color_picker.php');
|
||||
|
||||
acf_include('includes/fields/class-acf-field-message.php');
|
||||
acf_include('includes/fields/class-acf-field-accordion.php');
|
||||
acf_include('includes/fields/class-acf-field-tab.php');
|
||||
acf_include('includes/fields/class-acf-field-group.php');
|
||||
do_action('acf/include_field_types', $major);
|
||||
|
||||
|
||||
// locations
|
||||
acf_include('includes/locations/class-acf-location-post-type.php');
|
||||
acf_include('includes/locations/class-acf-location-post-template.php');
|
||||
acf_include('includes/locations/class-acf-location-post-status.php');
|
||||
acf_include('includes/locations/class-acf-location-post-format.php');
|
||||
acf_include('includes/locations/class-acf-location-post-category.php');
|
||||
acf_include('includes/locations/class-acf-location-post-taxonomy.php');
|
||||
acf_include('includes/locations/class-acf-location-post.php');
|
||||
acf_include('includes/locations/class-acf-location-page-template.php');
|
||||
acf_include('includes/locations/class-acf-location-page-type.php');
|
||||
acf_include('includes/locations/class-acf-location-page-parent.php');
|
||||
acf_include('includes/locations/class-acf-location-page.php');
|
||||
acf_include('includes/locations/class-acf-location-current-user.php');
|
||||
acf_include('includes/locations/class-acf-location-current-user-role.php');
|
||||
acf_include('includes/locations/class-acf-location-user-form.php');
|
||||
acf_include('includes/locations/class-acf-location-user-role.php');
|
||||
acf_include('includes/locations/class-acf-location-taxonomy.php');
|
||||
acf_include('includes/locations/class-acf-location-attachment.php');
|
||||
acf_include('includes/locations/class-acf-location-comment.php');
|
||||
acf_include('includes/locations/class-acf-location-widget.php');
|
||||
acf_include('includes/locations/class-acf-location-nav-menu.php');
|
||||
acf_include('includes/locations/class-acf-location-nav-menu-item.php');
|
||||
do_action('acf/include_location_rules', $major);
|
||||
|
||||
|
||||
// local fields
|
||||
do_action('acf/include_fields', $major);
|
||||
|
||||
|
||||
// action for 3rd party
|
||||
do_action('acf/init');
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_post_types
|
||||
*
|
||||
* This function will register post types and statuses
|
||||
*
|
||||
* @type function
|
||||
* @date 22/10/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function register_post_types() {
|
||||
|
||||
// vars
|
||||
$cap = acf_get_setting('capability');
|
||||
|
||||
|
||||
// register post type 'acf-field-group'
|
||||
register_post_type('acf-field-group', array(
|
||||
'labels' => array(
|
||||
'name' => __( 'Field Groups', 'acf' ),
|
||||
'singular_name' => __( 'Field Group', 'acf' ),
|
||||
'add_new' => __( 'Add New' , 'acf' ),
|
||||
'add_new_item' => __( 'Add New Field Group' , 'acf' ),
|
||||
'edit_item' => __( 'Edit Field Group' , 'acf' ),
|
||||
'new_item' => __( 'New Field Group' , 'acf' ),
|
||||
'view_item' => __( 'View Field Group', 'acf' ),
|
||||
'search_items' => __( 'Search Field Groups', 'acf' ),
|
||||
'not_found' => __( 'No Field Groups found', 'acf' ),
|
||||
'not_found_in_trash' => __( 'No Field Groups found in Trash', 'acf' ),
|
||||
),
|
||||
'public' => false,
|
||||
'show_ui' => true,
|
||||
'_builtin' => false,
|
||||
'capability_type' => 'post',
|
||||
'capabilities' => array(
|
||||
'edit_post' => $cap,
|
||||
'delete_post' => $cap,
|
||||
'edit_posts' => $cap,
|
||||
'delete_posts' => $cap,
|
||||
),
|
||||
'hierarchical' => true,
|
||||
'rewrite' => false,
|
||||
'query_var' => false,
|
||||
'supports' => array('title'),
|
||||
'show_in_menu' => false,
|
||||
));
|
||||
|
||||
|
||||
// register post type 'acf-field'
|
||||
register_post_type('acf-field', array(
|
||||
'labels' => array(
|
||||
'name' => __( 'Fields', 'acf' ),
|
||||
'singular_name' => __( 'Field', 'acf' ),
|
||||
'add_new' => __( 'Add New' , 'acf' ),
|
||||
'add_new_item' => __( 'Add New Field' , 'acf' ),
|
||||
'edit_item' => __( 'Edit Field' , 'acf' ),
|
||||
'new_item' => __( 'New Field' , 'acf' ),
|
||||
'view_item' => __( 'View Field', 'acf' ),
|
||||
'search_items' => __( 'Search Fields', 'acf' ),
|
||||
'not_found' => __( 'No Fields found', 'acf' ),
|
||||
'not_found_in_trash' => __( 'No Fields found in Trash', 'acf' ),
|
||||
),
|
||||
'public' => false,
|
||||
'show_ui' => false,
|
||||
'_builtin' => false,
|
||||
'capability_type' => 'post',
|
||||
'capabilities' => array(
|
||||
'edit_post' => $cap,
|
||||
'delete_post' => $cap,
|
||||
'edit_posts' => $cap,
|
||||
'delete_posts' => $cap,
|
||||
),
|
||||
'hierarchical' => true,
|
||||
'rewrite' => false,
|
||||
'query_var' => false,
|
||||
'supports' => array('title'),
|
||||
'show_in_menu' => false,
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register_post_status
|
||||
*
|
||||
* This function will register custom post statuses
|
||||
*
|
||||
* @type function
|
||||
* @date 22/10/2015
|
||||
* @since 5.3.2
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
function register_post_status() {
|
||||
|
||||
// acf-disabled
|
||||
register_post_status('acf-disabled', array(
|
||||
'label' => __( 'Inactive', 'acf' ),
|
||||
'public' => true,
|
||||
'exclude_from_search' => false,
|
||||
'show_in_admin_all_list' => true,
|
||||
'show_in_admin_status_list' => true,
|
||||
'label_count' => _n_noop( 'Inactive <span class="count">(%s)</span>', 'Inactive <span class="count">(%s)</span>', 'acf' ),
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* posts_where
|
||||
*
|
||||
* This function will add in some new parameters to the WP_Query args allowing fields to be found via key / name
|
||||
*
|
||||
* @type filter
|
||||
* @date 5/12/2013
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param $where (string)
|
||||
* @param $wp_query (object)
|
||||
* @return $where (string)
|
||||
*/
|
||||
|
||||
function posts_where( $where, $wp_query ) {
|
||||
|
||||
// global
|
||||
global $wpdb;
|
||||
|
||||
|
||||
// acf_field_key
|
||||
if( $field_key = $wp_query->get('acf_field_key') ) {
|
||||
$where .= $wpdb->prepare(" AND {$wpdb->posts}.post_name = %s", $field_key );
|
||||
}
|
||||
|
||||
// acf_field_name
|
||||
if( $field_name = $wp_query->get('acf_field_name') ) {
|
||||
$where .= $wpdb->prepare(" AND {$wpdb->posts}.post_excerpt = %s", $field_name );
|
||||
}
|
||||
|
||||
// acf_group_key
|
||||
if( $group_key = $wp_query->get('acf_group_key') ) {
|
||||
$where .= $wpdb->prepare(" AND {$wpdb->posts}.post_name = %s", $group_key );
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $where;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* define
|
||||
*
|
||||
* This function will safely define a constant
|
||||
*
|
||||
* @type function
|
||||
* @date 3/5/17
|
||||
* @since 5.5.13
|
||||
*
|
||||
* @param $name (string)
|
||||
* @param $value (mixed)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function define( $name, $value = true ) {
|
||||
|
||||
if( !defined($name) ) {
|
||||
define( $name, $value );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* has_setting
|
||||
*
|
||||
* Returns true if has setting.
|
||||
*
|
||||
* @date 2/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string $name
|
||||
* @return boolean
|
||||
*/
|
||||
|
||||
function has_setting( $name ) {
|
||||
return isset($this->settings[ $name ]);
|
||||
}
|
||||
|
||||
/**
|
||||
* get_setting
|
||||
*
|
||||
* Returns a setting.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $name
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
function get_setting( $name ) {
|
||||
return isset($this->settings[ $name ]) ? $this->settings[ $name ] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* update_setting
|
||||
*
|
||||
* Updates a setting.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function update_setting( $name, $value ) {
|
||||
$this->settings[ $name ] = $value;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_data
|
||||
*
|
||||
* Returns data.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $name
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
function get_data( $name ) {
|
||||
return isset($this->data[ $name ]) ? $this->data[ $name ] : null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* set_data
|
||||
*
|
||||
* Sets data.
|
||||
*
|
||||
* @date 28/09/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
function set_data( $name, $value ) {
|
||||
$this->data[ $name ] = $value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_instance
|
||||
*
|
||||
* Returns an instance.
|
||||
*
|
||||
* @date 13/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param string $class The instance class name.
|
||||
* @return object
|
||||
*/
|
||||
|
||||
function get_instance( $class ) {
|
||||
$name = strtolower($class);
|
||||
return isset($this->instances[ $name ]) ? $this->instances[ $name ] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* new_instance
|
||||
*
|
||||
* Creates and stores an instance.
|
||||
*
|
||||
* @date 13/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param string $class The instance class name.
|
||||
* @return object
|
||||
*/
|
||||
|
||||
function new_instance( $class ) {
|
||||
$instance = new $class();
|
||||
$name = strtolower($class);
|
||||
$this->instances[ $name ] = $instance;
|
||||
return $instance;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* acf
|
||||
*
|
||||
* The main function responsible for returning the one true acf Instance to functions everywhere.
|
||||
* Use this function like you would a global variable, except without needing to declare the global.
|
||||
*
|
||||
* Example: <?php $acf = acf(); ?>
|
||||
*
|
||||
* @type function
|
||||
* @date 4/09/13
|
||||
* @since 4.3.0
|
||||
*
|
||||
* @param N/A
|
||||
* @return (object)
|
||||
*/
|
||||
|
||||
function acf() {
|
||||
|
||||
// globals
|
||||
global $acf;
|
||||
|
||||
|
||||
// initialize
|
||||
if( !isset($acf) ) {
|
||||
$acf = new ACF();
|
||||
$acf->initialize();
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return $acf;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// initialize
|
||||
acf();
|
||||
|
||||
|
||||
endif; // class_exists check
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,437 @@
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Dark mode
|
||||
*
|
||||
* WordPress plugin: https://en-au.wordpress.org/plugins/dark-mode/
|
||||
* Github Documentation: https://github.com/danieltj27/Dark-Mode/wiki/Help:-Plugin-Compatibility-Guide
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
// Dark Mode Colours.
|
||||
$white: #ffffff;
|
||||
$black: #000000;
|
||||
$blue: #0073aa;
|
||||
$medium-blue: #00a0d2;
|
||||
$clear: transparent;
|
||||
|
||||
$accent-red: #dc3232;
|
||||
$accent-orange: #f56e28;
|
||||
$accent-yellow: #ffb900;
|
||||
$accent-green: #46b450;
|
||||
$accent-blue: $blue;
|
||||
$accent-purple: #826eb4;
|
||||
|
||||
$base-grey: #23282d;
|
||||
$light-grey: #bbc8d4;
|
||||
$heavy-grey: #37444c;
|
||||
$dark-grey: #32373c;
|
||||
$ultra-grey: #191f25;
|
||||
$dark-silver: #50626f;
|
||||
$base-blue: #2e74aa;
|
||||
$light-blue: #4092d2;
|
||||
$dark-blue: #2c5f88;
|
||||
$ultra-blue: #1f3f58;
|
||||
$bright-blue: #30ceff;
|
||||
|
||||
$editor-lavender: #c678dd;
|
||||
$editor-sunglo: #e06c75;
|
||||
$editor-olivine: #98c379;
|
||||
|
||||
// Custom variables.
|
||||
$body_text: #bbc8d4;
|
||||
$body_background: #23282d;
|
||||
$body_background2: #191f25;
|
||||
$postbox_background: #32373c;
|
||||
$postbox_border: #191f25;
|
||||
$postbox_divider: #23282d;
|
||||
$input_background: #50626f;
|
||||
$input_text: #fff;
|
||||
$input_border: #191f25;
|
||||
|
||||
// Mixins.
|
||||
@mixin dark-text() {
|
||||
color: $body_text;
|
||||
}
|
||||
@mixin dark-heading() {
|
||||
color: $body_text;
|
||||
}
|
||||
@mixin dark-border() {
|
||||
border-color: $postbox_border;
|
||||
}
|
||||
@mixin dark-background() {
|
||||
background: $body_background;
|
||||
}
|
||||
@mixin darker-background() {
|
||||
background: darken($body_background, 5%);
|
||||
}
|
||||
@mixin dark-postbox() {
|
||||
background-color: $postbox_background;
|
||||
border-color: $postbox_border;
|
||||
color: $body_text;
|
||||
}
|
||||
@mixin dark-postbox-block() {
|
||||
background-color: #2d3136;
|
||||
border-color: $postbox_divider;
|
||||
}
|
||||
@mixin dark-divider() {
|
||||
border-color: $postbox_divider;
|
||||
}
|
||||
@mixin dark-input() {
|
||||
background-color: $input_background;
|
||||
border-color: $input_border;
|
||||
color: $input_text;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Global
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
// acf-box
|
||||
.acf-box {
|
||||
@include dark-postbox();
|
||||
|
||||
.title,
|
||||
.footer {
|
||||
@include dark-divider();
|
||||
}
|
||||
|
||||
h2 {
|
||||
@include dark-heading();
|
||||
}
|
||||
|
||||
table, tbody, tr {
|
||||
background: transparent !important;
|
||||
}
|
||||
}
|
||||
|
||||
// thead
|
||||
.acf-thead {
|
||||
@include dark-heading();
|
||||
@include dark-border();
|
||||
}
|
||||
.acf-tfoot {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
|
||||
// table clear
|
||||
.acf-table.-clear,
|
||||
.acf-table.-clear tr {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
// loading overlay
|
||||
.acf-loading-overlay {
|
||||
background: rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Fields
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
// fields
|
||||
.acf-fields {
|
||||
|
||||
// field
|
||||
> .acf-field {
|
||||
@include dark-divider();
|
||||
}
|
||||
}
|
||||
|
||||
// fields (left)
|
||||
.acf-fields.-left {
|
||||
|
||||
> .acf-field {
|
||||
&:before {
|
||||
background: rgba(0,0,0,0.1);
|
||||
@include dark-divider();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// fields (border)
|
||||
.acf-fields.-border {
|
||||
@include dark-postbox();
|
||||
}
|
||||
|
||||
// width
|
||||
.acf-field[data-width] + .acf-field[data-width] {
|
||||
@include dark-divider();
|
||||
}
|
||||
|
||||
// text
|
||||
.acf-input-prepend,
|
||||
.acf-input-append {
|
||||
@include dark-postbox();
|
||||
}
|
||||
|
||||
// tab
|
||||
.acf-tab-wrap {
|
||||
|
||||
}
|
||||
|
||||
.acf-fields > .acf-tab-wrap {
|
||||
@include dark-postbox();
|
||||
|
||||
.acf-tab-group {
|
||||
@include dark-postbox-block();
|
||||
|
||||
li {
|
||||
a {
|
||||
@include dark-postbox-block();
|
||||
|
||||
&:hover {
|
||||
@include dark-postbox-block();
|
||||
@include dark-text();
|
||||
}
|
||||
}
|
||||
|
||||
&.active a {
|
||||
@include dark-postbox();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.acf-fields.-sidebar {
|
||||
&:before {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
.acf-fields.-sidebar.-left {
|
||||
&:before {
|
||||
@include dark-postbox-block();
|
||||
background: $body_background;
|
||||
}
|
||||
> .acf-tab-wrap.-left {
|
||||
.acf-tab-group li a {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
|
||||
.acf-tab-group li.active a {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// file
|
||||
.acf-file-uploader {
|
||||
|
||||
.show-if-value {
|
||||
@include dark-postbox();
|
||||
|
||||
.file-icon {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// acf-oembed
|
||||
.acf-oembed {
|
||||
@include dark-postbox-block();
|
||||
|
||||
.title {
|
||||
@include dark-input();
|
||||
}
|
||||
}
|
||||
|
||||
// gallery
|
||||
.acf-gallery {
|
||||
@include dark-postbox-block();
|
||||
|
||||
.acf-gallery-main {
|
||||
@include dark-background();
|
||||
}
|
||||
|
||||
.acf-gallery-attachment {
|
||||
.margin {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
.acf-gallery-side {
|
||||
@include dark-postbox-block();
|
||||
|
||||
.acf-gallery-side-info {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
.acf-gallery-toolbar {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
// button group
|
||||
.acf-button-group {
|
||||
|
||||
label:not(.selected) {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
// switch
|
||||
.acf-switch:not(.-on) {
|
||||
@include dark-postbox-block();
|
||||
.acf-switch-slider {
|
||||
@include dark-input();
|
||||
}
|
||||
}
|
||||
|
||||
// link
|
||||
.acf-link .link-wrap {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
|
||||
// relationship
|
||||
.acf-relationship {
|
||||
.filters {
|
||||
@include dark-postbox();
|
||||
}
|
||||
.selection {
|
||||
@include dark-postbox-block();
|
||||
.choices,
|
||||
.choices-list,
|
||||
.values {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// checkbox
|
||||
.acf-taxonomy-field .categorychecklist-holder {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
|
||||
// google map
|
||||
.acf-google-map {
|
||||
@include dark-postbox-block();
|
||||
|
||||
.title {
|
||||
@include dark-input();
|
||||
}
|
||||
}
|
||||
|
||||
// accordion
|
||||
.acf-accordion {
|
||||
@include dark-postbox();
|
||||
}
|
||||
.acf-field.acf-accordion .acf-accordion-content > .acf-fields {
|
||||
@include dark-border();
|
||||
}
|
||||
|
||||
// flexible content
|
||||
.acf-flexible-content {
|
||||
.layout {
|
||||
@include dark-postbox();
|
||||
|
||||
.acf-fc-layout-handle {
|
||||
@include dark-postbox-block();
|
||||
|
||||
.acf-fc-layout-order {
|
||||
@include dark-postbox();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// repeater
|
||||
#wpbody .acf-table {
|
||||
@include dark-postbox-block();
|
||||
|
||||
> tbody,
|
||||
> thead {
|
||||
> tr {
|
||||
background: transparent;
|
||||
|
||||
> td,
|
||||
> th {
|
||||
@include dark-border();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Select
|
||||
.acf-field select {
|
||||
optgroup, optgroup:nth-child(2n) {
|
||||
background: $input_background;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Field Group
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
// fields
|
||||
#acf-field-group-fields {
|
||||
|
||||
// field list
|
||||
.acf-field-list-wrap {
|
||||
@include dark-postbox();
|
||||
}
|
||||
|
||||
.acf-field-list {
|
||||
.no-fields-message {
|
||||
@include dark-postbox();
|
||||
}
|
||||
}
|
||||
|
||||
// field
|
||||
.acf-field-object {
|
||||
@include dark-postbox();
|
||||
@include dark-divider();
|
||||
|
||||
|
||||
table, tbody, tr, td, th {
|
||||
background: transparent;
|
||||
@include dark-divider();
|
||||
}
|
||||
|
||||
.acf-field {
|
||||
.acf-label {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
// sortable
|
||||
&.ui-sortable-helper {
|
||||
@include dark-border();
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&.ui-sortable-placeholder {
|
||||
@include dark-postbox-block();
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.acf-field-object + .acf-field-object-tab::before,
|
||||
.acf-field-object + .acf-field-object-accordion::before {
|
||||
@include dark-postbox-block();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Admin: Tools
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
// tools
|
||||
.acf-meta-box-wrap {
|
||||
|
||||
.acf-fields {
|
||||
@include dark-input();
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,600 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Global
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#adv-settings .show-field-keys label {
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
|
||||
#acf-field-group-fields > .inside,
|
||||
#acf-field-group-locations > .inside,
|
||||
#acf-field-group-options > .inside {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.acf-field {
|
||||
|
||||
p.description {
|
||||
font-style: normal;
|
||||
font-size: 12px;
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Postbox: Publish
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#minor-publishing-actions,
|
||||
#misc-publishing-actions #visibility {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#minor-publishing {
|
||||
border-bottom: 0 none;
|
||||
}
|
||||
|
||||
#misc-pub-section {
|
||||
border-bottom: 0 none;
|
||||
}
|
||||
|
||||
#misc-publishing-actions .misc-pub-section {
|
||||
border-bottom-color: #F5F5F5;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Postbox: Fields
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#acf-field-group-fields {
|
||||
border: 0 none;
|
||||
box-shadow: none;
|
||||
|
||||
|
||||
/* metabox */
|
||||
> .handlediv,
|
||||
> .hndle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* links */
|
||||
a {
|
||||
text-decoration: none;
|
||||
|
||||
&:active,
|
||||
&:focus {
|
||||
outline: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* table header */
|
||||
.li-field-order { width: 20%; }
|
||||
.li-field-label { width: 30%; }
|
||||
.li-field-name { width: 25%; }
|
||||
.li-field-type { width: 25%; }
|
||||
.li-field-key { display: none; }
|
||||
|
||||
|
||||
/* show keys */
|
||||
&.show-field-keys {
|
||||
|
||||
.li-field-label,
|
||||
.li-field-name,
|
||||
.li-field-type,
|
||||
.li-field-key { width: 20%; }
|
||||
.li-field-key { display: block; }
|
||||
}
|
||||
|
||||
|
||||
/* fields */
|
||||
.acf-field-list-wrap {
|
||||
border: #DFDFDF solid 1px;
|
||||
}
|
||||
|
||||
.acf-field-list {
|
||||
background: #F9F9F9;
|
||||
margin-top: -1px;
|
||||
|
||||
/* no fields */
|
||||
.no-fields-message {
|
||||
padding: 15px 15px;
|
||||
background: #fff;
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* empty */
|
||||
&.-empty {
|
||||
.no-fields-message {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* field object */
|
||||
.acf-field-object {
|
||||
border-top: #F0F0F0 solid 1px;
|
||||
background: #fff;
|
||||
|
||||
/* sortable */
|
||||
&.ui-sortable-helper {
|
||||
border-top-color: #fff;
|
||||
box-shadow: 0 0 0 1px #DFDFDF, 0 1px 4px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
&.ui-sortable-placeholder {
|
||||
box-shadow: 0 -1px 0 0 #DFDFDF;
|
||||
visibility: visible !important;
|
||||
background: #F9F9F9;
|
||||
border-top-color: transparent;
|
||||
min-height: 54px;
|
||||
|
||||
// hide tab field separator
|
||||
&:after, &:before {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* meta */
|
||||
> .meta {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* handle */
|
||||
> .handle {
|
||||
|
||||
a {
|
||||
-webkit-transition: none;
|
||||
-moz-transition: none;
|
||||
-o-transition: none;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
li {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
.acf-icon {
|
||||
margin: 1px 0 0;
|
||||
cursor: move;
|
||||
background: transparent;
|
||||
float: left;
|
||||
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
width: 28px;
|
||||
font-size: 13px;
|
||||
color: #444;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
strong {
|
||||
display: block;
|
||||
padding-bottom: 6px;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
min-height: 14px;
|
||||
}
|
||||
|
||||
.row-options {
|
||||
visibility: hidden;
|
||||
|
||||
a {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
a.delete-field {
|
||||
color: #a00;
|
||||
|
||||
&:hover { color: #f00; }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* open */
|
||||
&.open {
|
||||
|
||||
+ .acf-field-object {
|
||||
border-top-color: #E1E1E1;
|
||||
}
|
||||
|
||||
> .handle {
|
||||
background: $acf_blue;
|
||||
border: darken($acf_blue, 2%) solid 1px;
|
||||
text-shadow: #268FBB 0 1px 0;
|
||||
color: #fff;
|
||||
position: relative;
|
||||
margin: -1px -1px 0 -1px;
|
||||
|
||||
a {
|
||||
color: #fff !important;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
}
|
||||
|
||||
.acf-icon {
|
||||
border-color: #fff;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.acf-required {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
// debug
|
||||
&[data-save="meta"] {
|
||||
> .handle {
|
||||
border-left: #ffb700 solid 5px !important;
|
||||
}
|
||||
}
|
||||
|
||||
&[data-save="settings"] {
|
||||
> .handle {
|
||||
border-left: #0ec563 solid 5px !important;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/* hover */
|
||||
&:hover, &.-hover {
|
||||
|
||||
> .handle {
|
||||
|
||||
.row-options {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* settings */
|
||||
> .settings {
|
||||
display: none;
|
||||
width: 100%;
|
||||
|
||||
> .acf-table {
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* conditional logic */
|
||||
.rule-groups {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Postbox: Locations
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.rule-groups {
|
||||
|
||||
h4 {
|
||||
margin: 15px 0 5px;
|
||||
}
|
||||
|
||||
.rule-group {
|
||||
margin: 0 0 5px;
|
||||
|
||||
h4 {
|
||||
margin: 0 0 3px;
|
||||
}
|
||||
|
||||
td.param {
|
||||
width: 35%;
|
||||
}
|
||||
|
||||
td.operator {
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
td.add {
|
||||
width: 40px;
|
||||
}
|
||||
|
||||
td.remove {
|
||||
width: 28px;
|
||||
vertical-align: middle;
|
||||
|
||||
a {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
tr:hover td.remove a {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
/* Don't allow user to delete the first field group */
|
||||
&:first-child tr:first-child td.remove a {
|
||||
visibility: hidden !important;
|
||||
}
|
||||
|
||||
// empty select
|
||||
select:empty {
|
||||
background: #f8f8f8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Options
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#acf-field-group-options tr[data-name="hide_on_screen"] li {
|
||||
float: left;
|
||||
width: 33%;
|
||||
}
|
||||
|
||||
@media (max-width: 1100px) {
|
||||
|
||||
#acf-field-group-options tr[data-name="hide_on_screen"] li {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Conditional Logic
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
table.conditional-logic-rules {
|
||||
background: transparent;
|
||||
border: 0 none;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
table.conditional-logic-rules tbody td {
|
||||
background: transparent;
|
||||
border: 0 none !important;
|
||||
padding: 5px 2px !important;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Field: Tab
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-field-object-tab {
|
||||
|
||||
// hide setting
|
||||
.acf-field-setting-name,
|
||||
.acf-field-setting-instructions,
|
||||
.acf-field-setting-required,
|
||||
.acf-field-setting-warning,
|
||||
.acf-field-setting-wrapper {
|
||||
display: none;
|
||||
}
|
||||
|
||||
// hide name
|
||||
.li-field-name {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
// add spacer
|
||||
.acf-field-object + & {
|
||||
|
||||
&:before {
|
||||
display: block;
|
||||
content: "";
|
||||
height: 5px;
|
||||
width: 100%;
|
||||
background: #f9f9f9;
|
||||
border-bottom: #f0f0f0 solid 1px;
|
||||
}
|
||||
}
|
||||
|
||||
p:first-child {
|
||||
margin: 0.5em 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Field: Accordion
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-field-object-accordion {
|
||||
@extend .acf-field-object-tab;
|
||||
|
||||
// show settings
|
||||
.acf-field-setting-instructions {
|
||||
display: table-row;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Field: Message
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-field-object-message tr[data-name="name"],
|
||||
.acf-field-object-message tr[data-name="instructions"],
|
||||
.acf-field-object-message tr[data-name="required"] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.acf-field-object-message .li-field-name {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.acf-field-object-message textarea {
|
||||
height: 175px !important;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Field: Separator
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-field-object-separator tr[data-name="name"],
|
||||
.acf-field-object-separator tr[data-name="instructions"],
|
||||
.acf-field-object-separator tr[data-name="required"] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Field: Date Picker
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-field-object-date-picker,
|
||||
.acf-field-object-time-picker,
|
||||
.acf-field-object-date-time-picker {
|
||||
|
||||
.acf-radio-list {
|
||||
|
||||
li {
|
||||
line-height: 25px;
|
||||
}
|
||||
|
||||
span {
|
||||
display: inline-block;
|
||||
min-width: 10em;
|
||||
}
|
||||
|
||||
input[type="text"] {
|
||||
width: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.acf-field-object-date-time-picker {
|
||||
|
||||
.acf-radio-list {
|
||||
|
||||
span {
|
||||
min-width: 15em;
|
||||
}
|
||||
|
||||
input[type="text"] {
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Slug
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
#slugdiv {
|
||||
|
||||
.inside {
|
||||
padding: 12px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
input[type="text"] {
|
||||
width: 100%;
|
||||
height: 28px;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* RTL
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
html[dir="rtl"] .acf-field-object.open > .handle {
|
||||
margin: -1px -1px 0;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .acf-field-object.open > .handle .acf-icon {
|
||||
float: right;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .acf-field-object.open > .handle .li-field-order {
|
||||
padding-left: 0 !important;
|
||||
padding-right: 15px !important;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Device
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
@media only screen and (max-width: 850px) {
|
||||
|
||||
tr.acf-field,
|
||||
td.acf-label,
|
||||
td.acf-input {
|
||||
display: block !important;
|
||||
width: auto !important;
|
||||
border: 0 none !important;
|
||||
}
|
||||
|
||||
tr.acf-field {
|
||||
border-top: #ededed solid 1px !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
|
||||
td.acf-label {
|
||||
background: transparent !important;
|
||||
padding-bottom: 0 !important;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* User
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.form-table > tbody {
|
||||
|
||||
/* field */
|
||||
> .acf-field {
|
||||
|
||||
/* label */
|
||||
> .acf-label {
|
||||
padding: 20px 10px 20px 0;
|
||||
width: 210px;
|
||||
|
||||
/* rtl */
|
||||
html[dir="rtl"] & {
|
||||
padding: 20px 0 20px 10px;
|
||||
}
|
||||
|
||||
label {
|
||||
font-size: 14px;
|
||||
color: #23282d;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* input */
|
||||
> .acf-input {
|
||||
padding: 15px 10px;
|
||||
|
||||
/* rtl */
|
||||
html[dir="rtl"] & {
|
||||
padding: 15px 10px 15px 5%;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* tab wrap */
|
||||
> .acf-tab-wrap td {
|
||||
padding: 15px 5% 15px 0;
|
||||
|
||||
/* rtl */
|
||||
html[dir="rtl"] & {
|
||||
padding: 15px 0 15px 5%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* misc */
|
||||
.form-table th.acf-th {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#your-profile,
|
||||
#createuser {
|
||||
|
||||
/* override for user css */
|
||||
.acf-field input[type="text"],
|
||||
.acf-field input[type="password"],
|
||||
.acf-field input[type="number"],
|
||||
.acf-field input[type="search"],
|
||||
.acf-field input[type="email"],
|
||||
.acf-field input[type="url"],
|
||||
.acf-field select {
|
||||
max-width: 25em;
|
||||
}
|
||||
|
||||
.acf-field textarea {
|
||||
max-width: 500px;
|
||||
}
|
||||
|
||||
|
||||
/* allow sub fields to display correctly */
|
||||
.acf-field .acf-field input[type="text"],
|
||||
.acf-field .acf-field input[type="password"],
|
||||
.acf-field .acf-field input[type="number"],
|
||||
.acf-field .acf-field input[type="search"],
|
||||
.acf-field .acf-field input[type="email"],
|
||||
.acf-field .acf-field input[type="url"],
|
||||
.acf-field .acf-field textarea,
|
||||
.acf-field .acf-field select {
|
||||
max-width: none;
|
||||
}
|
||||
}
|
||||
|
||||
#registerform {
|
||||
|
||||
h2 {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.acf-field {
|
||||
margin-top: 0;
|
||||
|
||||
.acf-label {
|
||||
margin-bottom: 0;
|
||||
|
||||
label {
|
||||
font-weight: normal;
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
.acf-input {
|
||||
input {
|
||||
font-size: 24px;
|
||||
padding: 5px;
|
||||
height: auto;
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
p.submit {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Term
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
// add term
|
||||
#acf-term-fields {
|
||||
padding-right: 5%;
|
||||
|
||||
> .acf-field {
|
||||
|
||||
> .acf-label {
|
||||
margin: 0;
|
||||
|
||||
label {
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
p.submit .spinner,
|
||||
p.submit .acf-spinner {
|
||||
vertical-align: top;
|
||||
float: none;
|
||||
margin: 4px 4px 0;
|
||||
}
|
||||
|
||||
|
||||
// edit term
|
||||
#edittag .acf-fields.-left {
|
||||
|
||||
> .acf-field {
|
||||
padding-left: 220px;
|
||||
|
||||
&:before {
|
||||
width: 209px;
|
||||
}
|
||||
|
||||
> .acf-label {
|
||||
width: 220px;
|
||||
margin-left: -220px;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
> .acf-input {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#edittag > .acf-fields.-left {
|
||||
width: 96%;
|
||||
|
||||
> .acf-field {
|
||||
|
||||
> .acf-label {
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Comment
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.editcomment td:first-child {
|
||||
white-space: nowrap;
|
||||
width: 131px;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Widget
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
#widgets-right .widget .acf-field .description {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.acf-widget-fields {
|
||||
|
||||
> .acf-field {
|
||||
|
||||
.acf-label {
|
||||
margin-bottom: 5px;
|
||||
|
||||
label {
|
||||
font-weight: normal;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Nav Menu
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-menu-settings {
|
||||
border-top: 1px solid #eee;
|
||||
margin-top: 2em;
|
||||
|
||||
// seamless
|
||||
&.-seamless {
|
||||
border-top: none;
|
||||
margin-top: 15px;
|
||||
|
||||
> h2 { display: none; }
|
||||
}
|
||||
|
||||
// Fix relationship conflict.
|
||||
.list li {
|
||||
display: block;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.acf-menu-item-fields {
|
||||
margin-right: 10px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Attachment Form (single)
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
#post .compat-attachment-fields {
|
||||
|
||||
.compat-field-acf-form-data {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&,
|
||||
> tbody,
|
||||
> tbody > tr,
|
||||
> tbody > tr > th,
|
||||
> tbody > tr > td {
|
||||
display: block;
|
||||
}
|
||||
|
||||
> tbody > .acf-field {
|
||||
margin: 15px 0;
|
||||
|
||||
> .acf-label {
|
||||
margin: 0;
|
||||
|
||||
label {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
p {
|
||||
margin: 0 0 3px !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> .acf-input {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Gutenberg
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
#editor {
|
||||
|
||||
// main column is split into "editor" and "metaboxes".
|
||||
// remove WP flex that pushed metaboxes to bottom.
|
||||
.edit-post-visual-editor,
|
||||
.edit-post-layout__metaboxes {
|
||||
flex-basis: 0%;
|
||||
flex-grow: 0;
|
||||
}
|
||||
|
||||
// metabox wrap
|
||||
.edit-post-layout__metaboxes {
|
||||
background: transparent;
|
||||
border-top: 0 none;
|
||||
margin-top: 0;
|
||||
padding: 30px;
|
||||
|
||||
@media screen and (min-width: 600px) {
|
||||
padding: 46px;
|
||||
}
|
||||
|
||||
.edit-post-meta-boxes-area {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
// make postbox look like a classic box.
|
||||
.postbox {
|
||||
border: #e2e4e7 solid 1px;
|
||||
border-bottom: none;
|
||||
margin: 0 0 20px;
|
||||
}
|
||||
}
|
||||
|
||||
// improve handle style
|
||||
.postbox {
|
||||
.handlediv {
|
||||
height: 46px;
|
||||
width: auto;
|
||||
padding: 0 14px 0 5px;
|
||||
}
|
||||
.hndle {
|
||||
color: #191e23 !important;
|
||||
font-size: 13px;
|
||||
line-height: 16px;
|
||||
|
||||
.acf-hndle-cog {
|
||||
line-height: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
// change icons to match gutenberg sidebar accordions
|
||||
.handlediv .toggle-indicator {
|
||||
color: #191e23;
|
||||
}
|
||||
.handlediv .toggle-indicator:before {
|
||||
content: "\f343";
|
||||
font-size: 18px;
|
||||
width: auto;
|
||||
}
|
||||
&.closed .handlediv .toggle-indicator:before {
|
||||
content: "\f347";
|
||||
}
|
||||
}
|
||||
|
||||
// acf-input-wrap
|
||||
.acf-input-prepend,
|
||||
.acf-input-append {
|
||||
box-sizing: border-box;
|
||||
height: 28px;
|
||||
}
|
||||
|
||||
// accordion
|
||||
.acf-accordion {
|
||||
padding: 0 !important;
|
||||
|
||||
.acf-accordion-title {
|
||||
color: #191e23;
|
||||
font-weight: 600;
|
||||
|
||||
&:hover {
|
||||
background: #f8f9f9;
|
||||
}
|
||||
|
||||
label {
|
||||
font-weight: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// table
|
||||
.acf-table {
|
||||
box-sizing: border-box;
|
||||
|
||||
.acf-row-handle {
|
||||
width: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
// main error message
|
||||
.components-notice-list .acf-notice.-error {
|
||||
margin: 0 0 5px;
|
||||
min-height: 50px;
|
||||
padding: 6px 12px;
|
||||
border-left: 4px solid #00a0d2;
|
||||
color: #191e23;
|
||||
background-color: #f9e2e2;
|
||||
border-left-color: #d94f4f;
|
||||
|
||||
p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.acf-notice-dismiss {
|
||||
top: 15px;
|
||||
right: 15px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Confirm remove
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-temp-remove {
|
||||
position: relative;
|
||||
opacity: 1;
|
||||
-webkit-transition: all 0.25s ease;
|
||||
-moz-transition: all 0.25s ease;
|
||||
-o-transition: all 0.25s ease;
|
||||
transition: all 0.25s ease;
|
||||
overflow: hidden;
|
||||
|
||||
/* overlay prevents hover */
|
||||
&:after {
|
||||
display: block;
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 99;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
*
|
||||
* Conditional Logic
|
||||
*
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
/* Hide */
|
||||
.hidden-by-conditional-logic {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
/* Hide (appear empty) */
|
||||
.hidden-by-conditional-logic.appear-empty {
|
||||
display: table-cell !important;
|
||||
}
|
||||
|
||||
.hidden-by-conditional-logic.appear-empty .acf-input {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
*
|
||||
* 3rd Party
|
||||
*
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
/* Tabify shows hidden postboxes */
|
||||
.acf-postbox.acf-hidden {
|
||||
display: none !important;
|
||||
}
|
||||
@@ -0,0 +1,505 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Media Model
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* WP sets tables to act as divs. ACF uses tables, so these muct be reset */
|
||||
.media-modal .compat-attachment-fields td.acf-input {
|
||||
|
||||
table {
|
||||
display: table;
|
||||
table-layout: auto;
|
||||
|
||||
tbody {
|
||||
display: table-row-group;
|
||||
}
|
||||
|
||||
tr {
|
||||
display: table-row;
|
||||
}
|
||||
|
||||
td, th {
|
||||
display: table-cell;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* field widths floats */
|
||||
.media-modal .compat-attachment-fields > tbody > .acf-field {
|
||||
margin: 5px 0;
|
||||
|
||||
> .acf-label {
|
||||
min-width: 30%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
float: left;
|
||||
text-align: right;
|
||||
display: block;
|
||||
float: left;
|
||||
|
||||
> label {
|
||||
padding-top: 6px;
|
||||
margin: 0;
|
||||
color: #666666;
|
||||
font-weight: 400;
|
||||
line-height: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
> .acf-input {
|
||||
width: 65%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
float: right;
|
||||
display: block;
|
||||
}
|
||||
|
||||
p.description {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* restricted selection (copy of WP .upload-errors)*/
|
||||
.acf-selection-error {
|
||||
background: #ffebe8;
|
||||
border: 1px solid #c00;
|
||||
border-radius: 3px;
|
||||
padding: 8px;
|
||||
margin: 20px 0 0;
|
||||
|
||||
.selection-error-label {
|
||||
background: #CC0000;
|
||||
border-radius: 3px;
|
||||
color: #fff;
|
||||
font-weight: bold;
|
||||
margin-right: 8px;
|
||||
padding: 2px 4px;
|
||||
}
|
||||
|
||||
.selection-error-message {
|
||||
color: #b44;
|
||||
display: block;
|
||||
padding-top: 8px;
|
||||
word-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* disabled attachment */
|
||||
.media-modal .attachment.acf-disabled {
|
||||
|
||||
.thumbnail {
|
||||
opacity: 0.25 !important;
|
||||
}
|
||||
|
||||
.attachment-preview:before {
|
||||
background: rgba(0,0,0,0.15);
|
||||
z-index: 1;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* misc */
|
||||
.media-modal {
|
||||
|
||||
/* compat-item */
|
||||
.compat-field-acf-form-data,
|
||||
.compat-field-acf-blank {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
|
||||
/* allow line breaks in upload error */
|
||||
.upload-error-message {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
|
||||
/* fix required span */
|
||||
.acf-required {
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
float: none !important;
|
||||
color: #f00 !important;
|
||||
}
|
||||
|
||||
|
||||
/* sidebar */
|
||||
.media-sidebar {
|
||||
|
||||
.compat-item{
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* mobile md */
|
||||
@media (max-width: 900px) {
|
||||
|
||||
/* label */
|
||||
.setting span,
|
||||
.compat-attachment-fields > tbody > .acf-field > .acf-label {
|
||||
width: 98%;
|
||||
float: none;
|
||||
text-align: left;
|
||||
min-height: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/* field */
|
||||
.setting input,
|
||||
.setting textarea,
|
||||
.compat-attachment-fields > tbody > .acf-field > .acf-input {
|
||||
float: none;
|
||||
height: auto;
|
||||
max-width: none;
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Media Model (expand details)
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.media-modal .acf-expand-details {
|
||||
float: right;
|
||||
padding: 1px 10px;
|
||||
margin-right: 6px;
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
color: #AAAAAA;
|
||||
font-size: 12px;
|
||||
|
||||
&:focus, &:active {
|
||||
outline: 0 none;
|
||||
box-shadow: none;
|
||||
color: #AAAAAA;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: #666666 !important;
|
||||
}
|
||||
|
||||
span {
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.acf-icon {
|
||||
margin: 0 4px 0 0;
|
||||
}
|
||||
|
||||
&:hover .acf-icon {
|
||||
border-color: #AAAAAA;
|
||||
}
|
||||
|
||||
.is-open { display: none; }
|
||||
.is-closed { display: block; }
|
||||
|
||||
|
||||
/* mobile sm */
|
||||
@media (max-width: $sm) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* expanded */
|
||||
.media-modal.acf-expanded {
|
||||
|
||||
/* toggle */
|
||||
.acf-expand-details {
|
||||
.is-open { display: block; }
|
||||
.is-closed { display: none; }
|
||||
|
||||
}
|
||||
|
||||
// Components.
|
||||
.attachments-browser .media-toolbar,
|
||||
.attachments-browser .attachments { right: 740px; }
|
||||
.media-sidebar { width: 708px; }
|
||||
|
||||
// Sidebar.
|
||||
.media-sidebar {
|
||||
|
||||
// Attachment info.
|
||||
.attachment-info {
|
||||
.thumbnail {
|
||||
float: left;
|
||||
max-height: none;
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
max-height: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.details {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
// Label
|
||||
.attachment-info .thumbnail,
|
||||
.attachment-details .setting span,
|
||||
.compat-attachment-fields > tbody > .acf-field > .acf-label {
|
||||
min-width: 20%;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
// Input
|
||||
.attachment-info .details,
|
||||
.attachment-details .setting input,
|
||||
.attachment-details .setting textarea,
|
||||
.attachment-details .setting + .description,
|
||||
.compat-attachment-fields > tbody > .acf-field > .acf-input {
|
||||
min-width: 77%;
|
||||
}
|
||||
}
|
||||
|
||||
// Screen: Medium.
|
||||
@media (max-width: 900px) {
|
||||
|
||||
// Components.
|
||||
.attachments-browser .media-toolbar { display: none; }
|
||||
.attachments { display: none; }
|
||||
.media-sidebar { width: auto; max-width: none !important; bottom: 0 !important; }
|
||||
|
||||
// Sidebar.
|
||||
.media-sidebar {
|
||||
|
||||
// Attachment info.
|
||||
.attachment-info {
|
||||
.thumbnail {
|
||||
min-width: 0;
|
||||
max-width: none;
|
||||
width: 30%;
|
||||
}
|
||||
|
||||
.details {
|
||||
min-width: 0;
|
||||
max-width: none;
|
||||
width: 67%;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Screen: small.
|
||||
@media (max-width: 640px) {
|
||||
|
||||
// Sidebar.
|
||||
.media-sidebar {
|
||||
|
||||
// Attachment info.
|
||||
.attachment-info {
|
||||
.thumbnail, .details {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* ACF Media Model
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-media-modal {
|
||||
|
||||
/* hide embed settings */
|
||||
.media-embed {
|
||||
|
||||
.setting.align,
|
||||
.setting.link-to {
|
||||
display: none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// only allow for devices larger than mobile
|
||||
@media screen and (min-width: 1024px) {
|
||||
|
||||
// - requires long selector to override WP core
|
||||
.media-modal-content .media-frame .media-toolbar-secondary {
|
||||
max-width: none;
|
||||
|
||||
select.attachment-filters {
|
||||
width: auto;
|
||||
min-width: 150px;
|
||||
max-width: none;
|
||||
margin: 11px 6px 0 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* ACF Media Model (Select Mode)
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-media-modal.-select {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
*
|
||||
* ACF Media Model (Edit Mode)
|
||||
*
|
||||
*---------------------------------------------------------------------------------------------*/
|
||||
|
||||
.acf-media-modal.-edit {
|
||||
|
||||
/* resize modal */
|
||||
left: 15%;
|
||||
right: 15%;
|
||||
top: 100px;
|
||||
bottom: 100px;
|
||||
|
||||
|
||||
/* hide elements */
|
||||
.media-frame-menu,
|
||||
.media-frame-router,
|
||||
.media-frame-content .attachments,
|
||||
.media-frame-content .media-toolbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* full width */
|
||||
.media-frame-title,
|
||||
.media-frame-content,
|
||||
.media-frame-toolbar,
|
||||
.media-sidebar {
|
||||
width: auto;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
|
||||
/* tidy up incorrect distance */
|
||||
.media-frame-content {
|
||||
top: 50px;
|
||||
}
|
||||
|
||||
|
||||
/* title box shadow (to match media grid) */
|
||||
.media-frame-title {
|
||||
border-bottom: 1px solid #DFDFDF;
|
||||
box-shadow: 0 4px 4px -4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
|
||||
/* sidebar */
|
||||
.media-sidebar {
|
||||
|
||||
padding: 0 16px;
|
||||
|
||||
/* WP details */
|
||||
.attachment-details {
|
||||
|
||||
overflow: visible;
|
||||
|
||||
/* hide 'Attachment Details' heading */
|
||||
> h3, > h2 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* remove overflow */
|
||||
.attachment-info {
|
||||
background: #fff;
|
||||
border-bottom: #dddddd solid 1px;
|
||||
padding: 16px;
|
||||
margin: 0 -16px 16px;
|
||||
}
|
||||
|
||||
/* move thumbnail */
|
||||
.thumbnail {
|
||||
margin: 0 16px 0 0;
|
||||
}
|
||||
|
||||
.setting {
|
||||
margin: 0 0 5px;
|
||||
|
||||
span {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* ACF fields */
|
||||
.compat-attachment-fields {
|
||||
|
||||
> tbody > .acf-field {
|
||||
margin: 0 0 5px;
|
||||
|
||||
p.description {
|
||||
margin-top: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* WP required message */
|
||||
.media-types-required-info { display: none; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* mobile md */
|
||||
@media (max-width: 900px) {
|
||||
top: 30px;
|
||||
right: 30px;
|
||||
bottom: 30px;
|
||||
left: 30px;
|
||||
}
|
||||
|
||||
|
||||
/* mobile sm */
|
||||
@media (max-width: 640px) {
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.media-frame-content {
|
||||
top: 40px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Mixins
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
@mixin clearfix() {
|
||||
&:after {
|
||||
display: block;
|
||||
clear: both;
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
|
||||
@mixin border-box() {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@mixin centered() {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
@mixin animate( $properties: 'all' ) {
|
||||
-webkit-transition: $properties 0.3s ease; // Safari 3.2+, Chrome
|
||||
-moz-transition: $properties 0.3s ease; // Firefox 4-15
|
||||
-o-transition: $properties 0.3s ease; // Opera 10.5–12.00
|
||||
transition: $properties 0.3s ease; // Firefox 16+, Opera 12.50+
|
||||
}
|
||||
|
||||
@mixin rtl() {
|
||||
html[dir="rtl"] & {
|
||||
text-align: right;
|
||||
@content;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
// Postbox.
|
||||
|
||||
// Gutenberg specific styles.
|
||||
#editor {
|
||||
|
||||
// Postbox container.
|
||||
.edit-post-layout__metaboxes {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
// Alter postbox to look like panel component.
|
||||
.postbox {
|
||||
color: #444;
|
||||
|
||||
.handlediv {
|
||||
color: #191e23 !important;
|
||||
height: 46px;
|
||||
width: auto;
|
||||
padding: 0 14px 0 5px;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
.hndle {
|
||||
color: #191e23 !important;
|
||||
font-size: 13px;
|
||||
line-height: normal;
|
||||
padding: 15px;
|
||||
|
||||
&:hover {
|
||||
background: #f2f4f5;
|
||||
}
|
||||
.acf-hndle-cog {
|
||||
line-height: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
// change icons to match gutenberg sidebar accordions
|
||||
.handlediv .toggle-indicator {
|
||||
color: inherit;
|
||||
&:before {
|
||||
content: "\f343";
|
||||
font-size: 18px;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
&.closed .handlediv .toggle-indicator:before {
|
||||
content: "\f347";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*--------------------------------------------------------------------------------------------
|
||||
*
|
||||
* Vars
|
||||
*
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
/* colors */
|
||||
$acf_blue: #2a9bd9;
|
||||
$acf_notice: #2a9bd9;
|
||||
$acf_error: #F55E4F;
|
||||
$acf_success: #46b450;
|
||||
$acf_warning: #fd8d3b;
|
||||
|
||||
/* acf-field */
|
||||
$field_padding: 15px 12px;
|
||||
$field_padding_x: 12px;
|
||||
$field_padding_y: 15px;
|
||||
$fp: 15px 12px;
|
||||
$fy: 15px;
|
||||
$fx: 12px;
|
||||
|
||||
/* responsive */
|
||||
$md: 880px;
|
||||
$sm: 640px;
|
||||
@@ -0,0 +1 @@
|
||||
@import "dark";
|
||||
@@ -0,0 +1,3 @@
|
||||
@import "variables";
|
||||
@import "mixins";
|
||||
@import "field-group";
|
||||
@@ -0,0 +1,3 @@
|
||||
@import "variables";
|
||||
@import "mixins";
|
||||
@import "global";
|
||||
@@ -0,0 +1,7 @@
|
||||
@import "variables";
|
||||
@import "mixins";
|
||||
@import "fields";
|
||||
@import "forms";
|
||||
@import "media";
|
||||
@import "input";
|
||||
@import "postbox";
|
||||
@@ -0,0 +1,761 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* acf.newCompatibility
|
||||
*
|
||||
* Inserts a new __proto__ object compatibility layer
|
||||
*
|
||||
* @date 15/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param object instance The object to modify.
|
||||
* @param object compatibilty Optional. The compatibilty layer.
|
||||
* @return object compatibilty
|
||||
*/
|
||||
|
||||
acf.newCompatibility = function( instance, compatibilty ){
|
||||
|
||||
// defaults
|
||||
compatibilty = compatibilty || {};
|
||||
|
||||
// inherit __proto_-
|
||||
compatibilty.__proto__ = instance.__proto__;
|
||||
|
||||
// inject
|
||||
instance.__proto__ = compatibilty;
|
||||
|
||||
// reference
|
||||
instance.compatibility = compatibilty;
|
||||
|
||||
// return
|
||||
return compatibilty;
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getCompatibility
|
||||
*
|
||||
* Returns the compatibility layer for a given instance
|
||||
*
|
||||
* @date 13/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param object instance The object to look in.
|
||||
* @return object|null compatibility The compatibility object or null on failure.
|
||||
*/
|
||||
|
||||
acf.getCompatibility = function( instance ) {
|
||||
return instance.compatibility || null;
|
||||
};
|
||||
|
||||
/**
|
||||
* acf (compatibility)
|
||||
*
|
||||
* Compatibility layer for the acf object
|
||||
*
|
||||
* @date 15/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var _acf = acf.newCompatibility(acf, {
|
||||
|
||||
// storage
|
||||
l10n: {},
|
||||
o: {},
|
||||
fields: {},
|
||||
|
||||
// changed function names
|
||||
update: acf.set,
|
||||
add_action: acf.addAction,
|
||||
remove_action: acf.removeAction,
|
||||
do_action: acf.doAction,
|
||||
add_filter: acf.addFilter,
|
||||
remove_filter: acf.removeFilter,
|
||||
apply_filters: acf.applyFilters,
|
||||
parse_args: acf.parseArgs,
|
||||
disable_el: acf.disable,
|
||||
disable_form: acf.disable,
|
||||
enable_el: acf.enable,
|
||||
enable_form: acf.enable,
|
||||
update_user_setting: acf.updateUserSetting,
|
||||
prepare_for_ajax: acf.prepareForAjax,
|
||||
is_ajax_success: acf.isAjaxSuccess,
|
||||
remove_el: acf.remove,
|
||||
remove_tr: acf.remove,
|
||||
str_replace: acf.strReplace,
|
||||
render_select: acf.renderSelect,
|
||||
get_uniqid: acf.uniqid,
|
||||
serialize_form: acf.serialize,
|
||||
esc_html: acf.strEscape,
|
||||
str_sanitize: acf.strSanitize,
|
||||
|
||||
});
|
||||
|
||||
_acf._e = function( k1, k2 ){
|
||||
|
||||
// defaults
|
||||
k1 = k1 || '';
|
||||
k2 = k2 || '';
|
||||
|
||||
// compability
|
||||
var compatKey = k2 ? k1 + '.' + k2 : k1;
|
||||
var compats = {
|
||||
'image.select': 'Select Image',
|
||||
'image.edit': 'Edit Image',
|
||||
'image.update': 'Update Image'
|
||||
};
|
||||
if( compats[compatKey] ) {
|
||||
return acf.__(compats[compatKey]);
|
||||
}
|
||||
|
||||
// try k1
|
||||
var string = this.l10n[ k1 ] || '';
|
||||
|
||||
// try k2
|
||||
if( k2 ) {
|
||||
string = string[ k2 ] || '';
|
||||
}
|
||||
|
||||
// return
|
||||
return string;
|
||||
};
|
||||
|
||||
_acf.get_selector = function( s ) {
|
||||
|
||||
// vars
|
||||
var selector = '.acf-field';
|
||||
|
||||
// bail early if no search
|
||||
if( !s ) {
|
||||
return selector;
|
||||
}
|
||||
|
||||
// compatibility with object
|
||||
if( $.isPlainObject(s) ) {
|
||||
if( $.isEmptyObject(s) ) {
|
||||
return selector;
|
||||
} else {
|
||||
for( var k in s ) { s = s[k]; break; }
|
||||
}
|
||||
}
|
||||
|
||||
// append
|
||||
selector += '-' + s;
|
||||
|
||||
// replace underscores (split/join replaces all and is faster than regex!)
|
||||
selector = acf.strReplace('_', '-', selector);
|
||||
|
||||
// remove potential double up
|
||||
selector = acf.strReplace('field-field-', 'field-', selector);
|
||||
|
||||
// return
|
||||
return selector;
|
||||
};
|
||||
|
||||
_acf.get_fields = function( s, $el, all ){
|
||||
|
||||
// args
|
||||
var args = {
|
||||
is: s || '',
|
||||
parent: $el || false,
|
||||
suppressFilters: all || false,
|
||||
};
|
||||
|
||||
// change 'field_123' to '.acf-field-123'
|
||||
if( args.is ) {
|
||||
args.is = this.get_selector( args.is );
|
||||
}
|
||||
|
||||
// return
|
||||
return acf.findFields(args);
|
||||
};
|
||||
|
||||
_acf.get_field = function( s, $el ){
|
||||
|
||||
// get fields
|
||||
var $fields = this.get_fields.apply(this, arguments);
|
||||
|
||||
// return
|
||||
if( $fields.length ) {
|
||||
return $fields.first();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
_acf.get_closest_field = function( $el, s ){
|
||||
return $el.closest( this.get_selector(s) );
|
||||
};
|
||||
|
||||
_acf.get_field_wrap = function( $el ){
|
||||
return $el.closest( this.get_selector() );
|
||||
};
|
||||
|
||||
_acf.get_field_key = function( $field ){
|
||||
return $field.data('key');
|
||||
};
|
||||
|
||||
_acf.get_field_type = function( $field ){
|
||||
return $field.data('type');
|
||||
};
|
||||
|
||||
_acf.get_data = function( $el, defaults ){
|
||||
return acf.parseArgs( $el.data(), defaults );
|
||||
};
|
||||
|
||||
_acf.maybe_get = function( obj, key, value ){
|
||||
|
||||
// default
|
||||
if( value === undefined ) {
|
||||
value = null;
|
||||
}
|
||||
|
||||
// get keys
|
||||
keys = String(key).split('.');
|
||||
|
||||
// acf.isget
|
||||
for( var i = 0; i < keys.length; i++ ) {
|
||||
if( !obj.hasOwnProperty(keys[i]) ) {
|
||||
return value;
|
||||
}
|
||||
obj = obj[ keys[i] ];
|
||||
}
|
||||
return obj;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* hooks
|
||||
*
|
||||
* Modify add_action and add_filter functions to add compatibility with changed $field parameter
|
||||
* Using the acf.add_action() or acf.add_filter() functions will interpret new field parameters as jQuery $field
|
||||
*
|
||||
* @date 12/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var compatibleArgument = function( arg ){
|
||||
return ( arg instanceof acf.Field ) ? arg.$el : arg;
|
||||
};
|
||||
|
||||
var compatibleArguments = function( args ){
|
||||
return acf.arrayArgs( args ).map( compatibleArgument );
|
||||
}
|
||||
|
||||
var compatibleCallback = function( origCallback ){
|
||||
return function(){
|
||||
|
||||
// convert to compatible arguments
|
||||
if( arguments.length ) {
|
||||
var args = compatibleArguments(arguments);
|
||||
|
||||
// add default argument for 'ready', 'append' and 'load' events
|
||||
} else {
|
||||
var args = [ $(document) ];
|
||||
}
|
||||
|
||||
// return
|
||||
return origCallback.apply(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
_acf.add_action = function( action, callback, priority, context ){
|
||||
|
||||
// handle multiple actions
|
||||
var actions = action.split(' ');
|
||||
var length = actions.length;
|
||||
if( length > 1 ) {
|
||||
for( var i = 0; i < length; i++) {
|
||||
action = actions[i];
|
||||
_acf.add_action.apply(this, arguments);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
// single
|
||||
var callback = compatibleCallback(callback);
|
||||
return acf.addAction.apply(this, arguments);
|
||||
};
|
||||
|
||||
_acf.add_filter = function( action, callback, priority, context ){
|
||||
var callback = compatibleCallback(callback);
|
||||
return acf.addFilter.apply(this, arguments);
|
||||
};
|
||||
|
||||
/*
|
||||
* acf.model
|
||||
*
|
||||
* This model acts as a scafold for action.event driven modules
|
||||
*
|
||||
* @type object
|
||||
* @date 8/09/2014
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param (object)
|
||||
* @return (object)
|
||||
*/
|
||||
|
||||
_acf.model = {
|
||||
actions: {},
|
||||
filters: {},
|
||||
events: {},
|
||||
extend: function( args ){
|
||||
|
||||
// extend
|
||||
var model = $.extend( {}, this, args );
|
||||
|
||||
// setup actions
|
||||
$.each(model.actions, function( name, callback ){
|
||||
model._add_action( name, callback );
|
||||
});
|
||||
|
||||
// setup filters
|
||||
$.each(model.filters, function( name, callback ){
|
||||
model._add_filter( name, callback );
|
||||
});
|
||||
|
||||
// setup events
|
||||
$.each(model.events, function( name, callback ){
|
||||
model._add_event( name, callback );
|
||||
});
|
||||
|
||||
// return
|
||||
return model;
|
||||
},
|
||||
|
||||
_add_action: function( name, callback ) {
|
||||
|
||||
// split
|
||||
var model = this,
|
||||
data = name.split(' ');
|
||||
|
||||
// add missing priority
|
||||
var name = data[0] || '',
|
||||
priority = data[1] || 10;
|
||||
|
||||
// add action
|
||||
acf.add_action(name, model[ callback ], priority, model);
|
||||
|
||||
},
|
||||
|
||||
_add_filter: function( name, callback ) {
|
||||
|
||||
// split
|
||||
var model = this,
|
||||
data = name.split(' ');
|
||||
|
||||
// add missing priority
|
||||
var name = data[0] || '',
|
||||
priority = data[1] || 10;
|
||||
|
||||
// add action
|
||||
acf.add_filter(name, model[ callback ], priority, model);
|
||||
},
|
||||
|
||||
_add_event: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this,
|
||||
i = name.indexOf(' '),
|
||||
event = (i > 0) ? name.substr(0,i) : name,
|
||||
selector = (i > 0) ? name.substr(i+1) : '';
|
||||
|
||||
// event
|
||||
var fn = function( e ){
|
||||
|
||||
// append $el to event object
|
||||
e.$el = $(this);
|
||||
|
||||
// append $field to event object (used in field group)
|
||||
if( acf.field_group ) {
|
||||
e.$field = e.$el.closest('.acf-field-object');
|
||||
}
|
||||
|
||||
// event
|
||||
if( typeof model.event === 'function' ) {
|
||||
e = model.event( e );
|
||||
}
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, arguments);
|
||||
|
||||
};
|
||||
|
||||
// add event
|
||||
if( selector ) {
|
||||
$(document).on(event, selector, fn);
|
||||
} else {
|
||||
$(document).on(event, fn);
|
||||
}
|
||||
},
|
||||
|
||||
get: function( name, value ){
|
||||
|
||||
// defaults
|
||||
value = value || null;
|
||||
|
||||
// get
|
||||
if( typeof this[ name ] !== 'undefined' ) {
|
||||
value = this[ name ];
|
||||
}
|
||||
|
||||
// return
|
||||
return value;
|
||||
},
|
||||
|
||||
set: function( name, value ){
|
||||
|
||||
// set
|
||||
this[ name ] = value;
|
||||
|
||||
// function for 3rd party
|
||||
if( typeof this[ '_set_' + name ] === 'function' ) {
|
||||
this[ '_set_' + name ].apply(this);
|
||||
}
|
||||
|
||||
// return for chaining
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* field
|
||||
*
|
||||
* This model sets up many of the field's interactions
|
||||
*
|
||||
* @type function
|
||||
* @date 21/02/2014
|
||||
* @since 3.5.1
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
_acf.field = acf.model.extend({
|
||||
type: '',
|
||||
o: {},
|
||||
$field: null,
|
||||
_add_action: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this;
|
||||
|
||||
// update name
|
||||
name = name + '_field/type=' + model.type;
|
||||
|
||||
// add action
|
||||
acf.add_action(name, function( $field ){
|
||||
|
||||
// focus
|
||||
model.set('$field', $field);
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, arguments);
|
||||
});
|
||||
},
|
||||
|
||||
_add_filter: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this;
|
||||
|
||||
// update name
|
||||
name = name + '_field/type=' + model.type;
|
||||
|
||||
// add action
|
||||
acf.add_filter(name, function( $field ){
|
||||
|
||||
// focus
|
||||
model.set('$field', $field);
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, arguments);
|
||||
});
|
||||
},
|
||||
|
||||
_add_event: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this,
|
||||
event = name.substr(0,name.indexOf(' ')),
|
||||
selector = name.substr(name.indexOf(' ')+1),
|
||||
context = acf.get_selector(model.type);
|
||||
|
||||
// add event
|
||||
$(document).on(event, context + ' ' + selector, function( e ){
|
||||
|
||||
// vars
|
||||
var $el = $(this);
|
||||
var $field = acf.get_closest_field( $el, model.type );
|
||||
|
||||
// bail early if no field
|
||||
if( !$field.length ) return;
|
||||
|
||||
// focus
|
||||
if( !$field.is(model.$field) ) {
|
||||
model.set('$field', $field);
|
||||
}
|
||||
|
||||
// append to event
|
||||
e.$el = $el;
|
||||
e.$field = $field;
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, [e]);
|
||||
});
|
||||
},
|
||||
|
||||
_set_$field: function(){
|
||||
|
||||
// callback
|
||||
if( typeof this.focus === 'function' ) {
|
||||
this.focus();
|
||||
}
|
||||
},
|
||||
|
||||
// depreciated
|
||||
doFocus: function( $field ){
|
||||
return this.set('$field', $field);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* validation
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 15/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var _validation = acf.newCompatibility(acf.validation, {
|
||||
remove_error: function( $field ){
|
||||
acf.getField( $field ).removeError();
|
||||
},
|
||||
add_warning: function( $field, message ){
|
||||
acf.getField( $field ).showNotice({
|
||||
text: message,
|
||||
type: 'warning',
|
||||
timeout: 1000
|
||||
});
|
||||
},
|
||||
fetch: acf.validateForm,
|
||||
enableSubmit: acf.enableSubmit,
|
||||
disableSubmit: acf.disableSubmit,
|
||||
showSpinner: acf.showSpinner,
|
||||
hideSpinner: acf.hideSpinner,
|
||||
unlockForm: acf.unlockForm,
|
||||
lockForm: acf.lockForm
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* tooltip
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 15/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
_acf.tooltip = {
|
||||
|
||||
tooltip: function( text, $el ){
|
||||
|
||||
var tooltip = acf.newTooltip({
|
||||
text: text,
|
||||
target: $el
|
||||
});
|
||||
|
||||
// return
|
||||
return tooltip.$el;
|
||||
},
|
||||
|
||||
temp: function( text, $el ){
|
||||
|
||||
var tooltip = acf.newTooltip({
|
||||
text: text,
|
||||
target: $el,
|
||||
timeout: 250
|
||||
});
|
||||
},
|
||||
|
||||
confirm: function( $el, callback, text, button_y, button_n ){
|
||||
|
||||
var tooltip = acf.newTooltip({
|
||||
confirm: true,
|
||||
text: text,
|
||||
target: $el,
|
||||
confirm: function(){
|
||||
callback(true);
|
||||
},
|
||||
cancel: function(){
|
||||
callback(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
confirm_remove: function( $el, callback ){
|
||||
|
||||
var tooltip = acf.newTooltip({
|
||||
confirmRemove: true,
|
||||
target: $el,
|
||||
confirm: function(){
|
||||
callback(true);
|
||||
},
|
||||
cancel: function(){
|
||||
callback(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* tooltip
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 15/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
_acf.media = new acf.Model({
|
||||
activeFrame: false,
|
||||
actions: {
|
||||
'new_media_popup': 'onNewMediaPopup'
|
||||
},
|
||||
|
||||
frame: function(){
|
||||
return this.activeFrame;
|
||||
},
|
||||
|
||||
onNewMediaPopup: function( popup ){
|
||||
this.activeFrame = popup.frame;
|
||||
},
|
||||
|
||||
popup: function( props ){
|
||||
|
||||
// update props
|
||||
if( props.mime_types ) {
|
||||
props.allowedTypes = props.mime_types;
|
||||
}
|
||||
if( props.id ) {
|
||||
props.attachment = props.id;
|
||||
}
|
||||
|
||||
// new
|
||||
var popup = acf.newMediaPopup( props );
|
||||
|
||||
// append
|
||||
/*
|
||||
if( props.selected ) {
|
||||
popup.selected = props.selected;
|
||||
}
|
||||
*/
|
||||
|
||||
// return
|
||||
return popup.frame;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Select2
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 11/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
_acf.select2 = {
|
||||
init: function( $select, args, $field ){
|
||||
|
||||
// compatible args
|
||||
if( args.allow_null ) {
|
||||
args.allowNull = args.allow_null;
|
||||
}
|
||||
if( args.ajax_action ) {
|
||||
args.ajaxAction = args.ajax_action;
|
||||
}
|
||||
if( $field ) {
|
||||
args.field = acf.getField($field);
|
||||
}
|
||||
|
||||
// return
|
||||
return acf.newSelect2( $select, args );
|
||||
},
|
||||
|
||||
destroy: function( $select ){
|
||||
return acf.getInstance( $select ).destroy();
|
||||
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* postbox
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 11/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
_acf.postbox = {
|
||||
render: function( args ){
|
||||
|
||||
// compatible args
|
||||
if( args.edit_url ) {
|
||||
args.editLink = args.edit_url;
|
||||
}
|
||||
if( args.edit_title ) {
|
||||
args.editTitle = args.edit_title;
|
||||
}
|
||||
|
||||
// return
|
||||
return acf.newPostbox( args );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.screen
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 11/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.newCompatibility(acf.screen, {
|
||||
update: function(){
|
||||
return this.set.apply(this, arguments);
|
||||
},
|
||||
fetch: acf.screen.check
|
||||
});
|
||||
_acf.ajax = acf.screen;
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,447 @@
|
||||
(function($, undefined){
|
||||
|
||||
var __ = acf.__;
|
||||
|
||||
var parseString = function( val ){
|
||||
return val ? '' + val : '';
|
||||
};
|
||||
|
||||
var isEqualTo = function( v1, v2 ){
|
||||
return ( parseString(v1).toLowerCase() === parseString(v2).toLowerCase() );
|
||||
};
|
||||
|
||||
var isEqualToNumber = function( v1, v2 ){
|
||||
return ( parseFloat(v1) === parseFloat(v2) );
|
||||
};
|
||||
|
||||
var isGreaterThan = function( v1, v2 ){
|
||||
return ( parseFloat(v1) > parseFloat(v2) );
|
||||
};
|
||||
|
||||
var isLessThan = function( v1, v2 ){
|
||||
return ( parseFloat(v1) < parseFloat(v2) );
|
||||
};
|
||||
|
||||
var inArray = function( v1, array ){
|
||||
|
||||
// cast all values as string
|
||||
array = array.map(function(v2){
|
||||
return parseString(v2);
|
||||
});
|
||||
|
||||
return (array.indexOf( v1 ) > -1);
|
||||
}
|
||||
|
||||
var containsString = function( haystack, needle ){
|
||||
return ( parseString(haystack).indexOf( parseString(needle) ) > -1 );
|
||||
};
|
||||
|
||||
var matchesPattern = function( v1, pattern ){
|
||||
var regexp = new RegExp(parseString(pattern), 'gi');
|
||||
return parseString(v1).match( regexp );
|
||||
};
|
||||
|
||||
/**
|
||||
* hasValue
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var HasValue = acf.Condition.extend({
|
||||
type: 'hasValue',
|
||||
operator: '!=empty',
|
||||
label: __('Has any value'),
|
||||
fieldTypes: [ 'text', 'textarea', 'number', 'range', 'email', 'url', 'password', 'image', 'file', 'wysiwyg', 'oembed', 'select', 'checkbox', 'radio', 'button_group', 'link', 'post_object', 'page_link', 'relationship', 'taxonomy', 'user', 'google_map', 'date_picker', 'date_time_picker', 'time_picker', 'color_picker' ],
|
||||
match: function( rule, field ){
|
||||
return (field.val() ? true : false);
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
return '<input type="text" disabled="" />';
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( HasValue );
|
||||
|
||||
/**
|
||||
* hasValue
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var HasNoValue = HasValue.extend({
|
||||
type: 'hasNoValue',
|
||||
operator: '==empty',
|
||||
label: __('Has no value'),
|
||||
match: function( rule, field ){
|
||||
return !HasValue.prototype.match.apply(this, arguments);
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( HasNoValue );
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* EqualTo
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var EqualTo = acf.Condition.extend({
|
||||
type: 'equalTo',
|
||||
operator: '==',
|
||||
label: __('Value is equal to'),
|
||||
fieldTypes: [ 'text', 'textarea', 'number', 'range', 'email', 'url', 'password' ],
|
||||
match: function( rule, field ){
|
||||
if( $.isNumeric(rule.value) ) {
|
||||
return isEqualToNumber( rule.value, field.val() );
|
||||
} else {
|
||||
return isEqualTo( rule.value, field.val() );
|
||||
}
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
return '<input type="text" />';
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( EqualTo );
|
||||
|
||||
/**
|
||||
* NotEqualTo
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var NotEqualTo = EqualTo.extend({
|
||||
type: 'notEqualTo',
|
||||
operator: '!=',
|
||||
label: __('Value is not equal to'),
|
||||
match: function( rule, field ){
|
||||
return !EqualTo.prototype.match.apply(this, arguments);
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( NotEqualTo );
|
||||
|
||||
/**
|
||||
* PatternMatch
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var PatternMatch = acf.Condition.extend({
|
||||
type: 'patternMatch',
|
||||
operator: '==pattern',
|
||||
label: __('Value matches pattern'),
|
||||
fieldTypes: [ 'text', 'textarea', 'email', 'url', 'password', 'wysiwyg' ],
|
||||
match: function( rule, field ){
|
||||
return matchesPattern( field.val(), rule.value );
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
return '<input type="text" placeholder="[a-z0-9]" />';
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( PatternMatch );
|
||||
|
||||
/**
|
||||
* Contains
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var Contains = acf.Condition.extend({
|
||||
type: 'contains',
|
||||
operator: '==contains',
|
||||
label: __('Value contains'),
|
||||
fieldTypes: [ 'text', 'textarea', 'number', 'email', 'url', 'password', 'wysiwyg', 'oembed', 'select' ],
|
||||
match: function( rule, field ){
|
||||
return containsString( field.val(), rule.value );
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
return '<input type="text" />';
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( Contains );
|
||||
|
||||
/**
|
||||
* TrueFalseEqualTo
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var TrueFalseEqualTo = EqualTo.extend({
|
||||
type: 'trueFalseEqualTo',
|
||||
choiceType: 'select',
|
||||
fieldTypes: [ 'true_false' ],
|
||||
choices: function( field ){
|
||||
return [
|
||||
{
|
||||
id: 1,
|
||||
text: __('Checked')
|
||||
}
|
||||
];
|
||||
},
|
||||
});
|
||||
|
||||
acf.registerConditionType( TrueFalseEqualTo );
|
||||
|
||||
/**
|
||||
* TrueFalseNotEqualTo
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var TrueFalseNotEqualTo = NotEqualTo.extend({
|
||||
type: 'trueFalseNotEqualTo',
|
||||
choiceType: 'select',
|
||||
fieldTypes: [ 'true_false' ],
|
||||
choices: function( field ){
|
||||
return [
|
||||
{
|
||||
id: 1,
|
||||
text: __('Checked')
|
||||
}
|
||||
];
|
||||
},
|
||||
});
|
||||
|
||||
acf.registerConditionType( TrueFalseNotEqualTo );
|
||||
|
||||
/**
|
||||
* SelectEqualTo
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var SelectEqualTo = acf.Condition.extend({
|
||||
type: 'selectEqualTo',
|
||||
operator: '==',
|
||||
label: __('Value is equal to'),
|
||||
fieldTypes: [ 'select', 'checkbox', 'radio', 'button_group' ],
|
||||
match: function( rule, field ){
|
||||
var val = field.val();
|
||||
if( val instanceof Array ) {
|
||||
return inArray( rule.value, val );
|
||||
} else {
|
||||
return isEqualTo( rule.value, val );
|
||||
}
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
|
||||
// vars
|
||||
var choices = [];
|
||||
var lines = fieldObject.$setting('choices textarea').val().split("\n");
|
||||
|
||||
// allow null
|
||||
if( fieldObject.$input('allow_null').prop('checked') ) {
|
||||
choices.push({
|
||||
id: '',
|
||||
text: __('Null')
|
||||
});
|
||||
}
|
||||
|
||||
// loop
|
||||
lines.map(function( line ){
|
||||
|
||||
// split
|
||||
line = line.split(':');
|
||||
|
||||
// default label to value
|
||||
line[1] = line[1] || line[0];
|
||||
|
||||
// append
|
||||
choices.push({
|
||||
id: $.trim( line[0] ),
|
||||
text: $.trim( line[1] )
|
||||
});
|
||||
});
|
||||
|
||||
// return
|
||||
return choices;
|
||||
},
|
||||
});
|
||||
|
||||
acf.registerConditionType( SelectEqualTo );
|
||||
|
||||
/**
|
||||
* SelectNotEqualTo
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var SelectNotEqualTo = SelectEqualTo.extend({
|
||||
type: 'selectNotEqualTo',
|
||||
operator: '!=',
|
||||
label: __('Value is not equal to'),
|
||||
match: function( rule, field ){
|
||||
return !SelectEqualTo.prototype.match.apply(this, arguments);
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( SelectNotEqualTo );
|
||||
|
||||
/**
|
||||
* GreaterThan
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var GreaterThan = acf.Condition.extend({
|
||||
type: 'greaterThan',
|
||||
operator: '>',
|
||||
label: __('Value is greater than'),
|
||||
fieldTypes: [ 'number', 'range' ],
|
||||
match: function( rule, field ){
|
||||
var val = field.val();
|
||||
if( val instanceof Array ) {
|
||||
val = val.length;
|
||||
}
|
||||
return isGreaterThan( val, rule.value );
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
return '<input type="number" />';
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( GreaterThan );
|
||||
|
||||
|
||||
/**
|
||||
* LessThan
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var LessThan = GreaterThan.extend({
|
||||
type: 'lessThan',
|
||||
operator: '<',
|
||||
label: __('Value is less than'),
|
||||
match: function( rule, field ){
|
||||
var val = field.val();
|
||||
if( val instanceof Array ) {
|
||||
val = val.length;
|
||||
}
|
||||
return isLessThan( val, rule.value );
|
||||
},
|
||||
choices: function( fieldObject ){
|
||||
return '<input type="number" />';
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerConditionType( LessThan );
|
||||
|
||||
/**
|
||||
* SelectedGreaterThan
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var SelectionGreaterThan = GreaterThan.extend({
|
||||
type: 'selectionGreaterThan',
|
||||
label: __('Selection is greater than'),
|
||||
fieldTypes: [ 'checkbox', 'select', 'post_object', 'page_link', 'relationship', 'taxonomy', 'user' ],
|
||||
});
|
||||
|
||||
acf.registerConditionType( SelectionGreaterThan );
|
||||
|
||||
/**
|
||||
* SelectedGreaterThan
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var SelectionLessThan = LessThan.extend({
|
||||
type: 'selectionLessThan',
|
||||
label: __('Selection is less than'),
|
||||
fieldTypes: [ 'checkbox', 'select', 'post_object', 'page_link', 'relationship', 'taxonomy', 'user' ],
|
||||
});
|
||||
|
||||
acf.registerConditionType( SelectionLessThan );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,249 @@
|
||||
(function($, undefined){
|
||||
|
||||
// vars
|
||||
var storage = [];
|
||||
|
||||
/**
|
||||
* acf.Condition
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 23/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.Condition = acf.Model.extend({
|
||||
|
||||
type: '', // used for model name
|
||||
operator: '==', // rule operator
|
||||
label: '', // label shown when editing fields
|
||||
choiceType: 'input', // input, select
|
||||
fieldTypes: [], // auto connect this conditions with these field types
|
||||
|
||||
data: {
|
||||
conditions: false, // the parent instance
|
||||
field: false, // the field which we query against
|
||||
rule: {} // the rule [field, operator, value]
|
||||
},
|
||||
|
||||
events: {
|
||||
'change': 'change',
|
||||
'keyup': 'change',
|
||||
'enableField': 'change',
|
||||
'disableField': 'change'
|
||||
},
|
||||
|
||||
setup: function( props ){
|
||||
$.extend(this.data, props);
|
||||
},
|
||||
|
||||
getEventTarget: function( $el, event ){
|
||||
return $el || this.get('field').$el;
|
||||
},
|
||||
|
||||
change: function( e, $el ){
|
||||
this.get('conditions').change( e );
|
||||
},
|
||||
|
||||
match: function( rule, field ){
|
||||
return false;
|
||||
},
|
||||
|
||||
calculate: function(){
|
||||
return this.match( this.get('rule'), this.get('field') );
|
||||
},
|
||||
|
||||
choices: function( field ){
|
||||
return '<input type="text" />';
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* acf.newCondition
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.newCondition = function( rule, conditions ){
|
||||
|
||||
// currently setting up conditions for fieldX, this field is the 'target'
|
||||
var target = conditions.get('field');
|
||||
|
||||
// use the 'target' to find the 'trigger' field.
|
||||
// - this field is used to setup the conditional logic events
|
||||
var field = target.getField( rule.field );
|
||||
|
||||
// bail ealry if no target or no field (possible if field doesn't exist due to HTML error)
|
||||
if( !target || !field ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// vars
|
||||
var args = {
|
||||
rule: rule,
|
||||
target: target,
|
||||
conditions: conditions,
|
||||
field: field
|
||||
};
|
||||
|
||||
// vars
|
||||
var fieldType = field.get('type');
|
||||
var operator = rule.operator;
|
||||
|
||||
// get avaibale conditions
|
||||
var conditionTypes = acf.getConditionTypes({
|
||||
fieldType: fieldType,
|
||||
operator: operator,
|
||||
});
|
||||
|
||||
// instantiate
|
||||
var model = conditionTypes[0] || acf.Condition;
|
||||
|
||||
// instantiate
|
||||
var condition = new model( args );
|
||||
|
||||
// return
|
||||
return condition;
|
||||
};
|
||||
|
||||
/**
|
||||
* mid
|
||||
*
|
||||
* Calculates the model ID for a field type
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string type
|
||||
* @return string
|
||||
*/
|
||||
|
||||
var modelId = function( type ) {
|
||||
return acf.strPascalCase( type || '' ) + 'Condition';
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.registerConditionType
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.registerConditionType = function( model ){
|
||||
|
||||
// vars
|
||||
var proto = model.prototype;
|
||||
var type = proto.type;
|
||||
var mid = modelId( type );
|
||||
|
||||
// store model
|
||||
acf.models[ mid ] = model;
|
||||
|
||||
// store reference
|
||||
storage.push( type );
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getConditionType
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getConditionType = function( type ){
|
||||
var mid = modelId( type );
|
||||
return acf.models[ mid ] || false;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf.registerConditionForFieldType
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.registerConditionForFieldType = function( conditionType, fieldType ){
|
||||
|
||||
// get model
|
||||
var model = acf.getConditionType( conditionType );
|
||||
|
||||
// append
|
||||
if( model ) {
|
||||
model.prototype.fieldTypes.push( fieldType );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getConditionTypes
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getConditionTypes = function( args ){
|
||||
|
||||
// defaults
|
||||
args = acf.parseArgs(args, {
|
||||
fieldType: '',
|
||||
operator: ''
|
||||
});
|
||||
|
||||
// clonse available types
|
||||
var types = [];
|
||||
|
||||
// loop
|
||||
storage.map(function( type ){
|
||||
|
||||
// vars
|
||||
var model = acf.getConditionType(type);
|
||||
var ProtoFieldTypes = model.prototype.fieldTypes;
|
||||
var ProtoOperator = model.prototype.operator;
|
||||
|
||||
// check fieldType
|
||||
if( args.fieldType && ProtoFieldTypes.indexOf( args.fieldType ) === -1 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// check operator
|
||||
if( args.operator && ProtoOperator !== args.operator ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// append
|
||||
types.push( model );
|
||||
});
|
||||
|
||||
// return
|
||||
return types;
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,306 @@
|
||||
(function($, undefined){
|
||||
|
||||
// vars
|
||||
var CONTEXT = 'conditional_logic';
|
||||
|
||||
/**
|
||||
* conditionsManager
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var conditionsManager = new acf.Model({
|
||||
|
||||
id: 'conditionsManager',
|
||||
|
||||
priority: 20, // run actions later
|
||||
|
||||
actions: {
|
||||
'new_field': 'onNewField',
|
||||
},
|
||||
|
||||
onNewField: function( field ){
|
||||
if( field.has('conditions') ) {
|
||||
field.getConditions().render();
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* acf.Field.prototype.getField
|
||||
*
|
||||
* Finds a field that is related to another field
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var getSiblingField = function( field, key ){
|
||||
|
||||
// find sibling (very fast)
|
||||
var fields = acf.getFields({
|
||||
key: key,
|
||||
sibling: field.$el,
|
||||
suppressFilters: true,
|
||||
});
|
||||
|
||||
// find sibling-children (fast)
|
||||
// needed for group fields, accordions, etc
|
||||
if( !fields.length ) {
|
||||
fields = acf.getFields({
|
||||
key: key,
|
||||
parent: field.$el.parent(),
|
||||
suppressFilters: true,
|
||||
});
|
||||
}
|
||||
|
||||
// return
|
||||
if( fields.length ) {
|
||||
return fields[0];
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
acf.Field.prototype.getField = function( key ){
|
||||
|
||||
// get sibling field
|
||||
var field = getSiblingField( this, key );
|
||||
|
||||
// return early
|
||||
if( field ) {
|
||||
return field;
|
||||
}
|
||||
|
||||
// move up through each parent and try again
|
||||
var parents = this.parents();
|
||||
for( var i = 0; i < parents.length; i++ ) {
|
||||
|
||||
// get sibling field
|
||||
field = getSiblingField( parents[i], key );
|
||||
|
||||
// return early
|
||||
if( field ) {
|
||||
return field;
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return false;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* acf.Field.prototype.getConditions
|
||||
*
|
||||
* Returns the field's conditions instance
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.Field.prototype.getConditions = function(){
|
||||
|
||||
// instantiate
|
||||
if( !this.conditions ) {
|
||||
this.conditions = new Conditions( this );
|
||||
}
|
||||
|
||||
// return
|
||||
return this.conditions;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Conditions
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
var timeout = false;
|
||||
var Conditions = acf.Model.extend({
|
||||
|
||||
id: 'Conditions',
|
||||
|
||||
data: {
|
||||
field: false, // The field with "data-conditions" (target).
|
||||
timeStamp: false, // Reference used during "change" event.
|
||||
groups: [], // The groups of condition instances.
|
||||
},
|
||||
|
||||
setup: function( field ){
|
||||
|
||||
// data
|
||||
this.data.field = field;
|
||||
|
||||
// vars
|
||||
var conditions = field.get('conditions');
|
||||
|
||||
// detect groups
|
||||
if( conditions instanceof Array ) {
|
||||
|
||||
// detect groups
|
||||
if( conditions[0] instanceof Array ) {
|
||||
|
||||
// loop
|
||||
conditions.map(function(rules, i){
|
||||
this.addRules( rules, i );
|
||||
}, this);
|
||||
|
||||
// detect rules
|
||||
} else {
|
||||
this.addRules( conditions );
|
||||
}
|
||||
|
||||
// detect rule
|
||||
} else {
|
||||
this.addRule( conditions );
|
||||
}
|
||||
},
|
||||
|
||||
change: function( e ){
|
||||
|
||||
// this function may be triggered multiple times per event due to multiple condition classes
|
||||
// compare timestamp to allow only 1 trigger per event
|
||||
if( this.get('timeStamp') === e.timeStamp ) {
|
||||
return false;
|
||||
} else {
|
||||
this.set('timeStamp', e.timeStamp, true);
|
||||
}
|
||||
|
||||
// render condition and store result
|
||||
var changed = this.render();
|
||||
},
|
||||
|
||||
render: function(){
|
||||
return this.calculate() ? this.show() : this.hide();
|
||||
},
|
||||
|
||||
show: function(){
|
||||
return this.get('field').showEnable(this.cid, CONTEXT);
|
||||
},
|
||||
|
||||
hide: function(){
|
||||
return this.get('field').hideDisable(this.cid, CONTEXT);
|
||||
},
|
||||
|
||||
calculate: function(){
|
||||
|
||||
// vars
|
||||
var pass = false;
|
||||
|
||||
// loop
|
||||
this.getGroups().map(function( group ){
|
||||
|
||||
// igrnore this group if another group passed
|
||||
if( pass ) return;
|
||||
|
||||
// find passed
|
||||
var passed = group.filter(function(condition){
|
||||
return condition.calculate();
|
||||
});
|
||||
|
||||
// if all conditions passed, update the global var
|
||||
if( passed.length == group.length ) {
|
||||
pass = true;
|
||||
}
|
||||
});
|
||||
|
||||
return pass;
|
||||
},
|
||||
|
||||
hasGroups: function(){
|
||||
return this.data.groups != null;
|
||||
},
|
||||
|
||||
getGroups: function(){
|
||||
return this.data.groups;
|
||||
},
|
||||
|
||||
addGroup: function(){
|
||||
var group = [];
|
||||
this.data.groups.push( group );
|
||||
return group;
|
||||
},
|
||||
|
||||
hasGroup: function( i ){
|
||||
return this.data.groups[i] != null;
|
||||
},
|
||||
|
||||
getGroup: function( i ){
|
||||
return this.data.groups[i];
|
||||
},
|
||||
|
||||
removeGroup: function( i ){
|
||||
this.data.groups[i].delete;
|
||||
return this;
|
||||
},
|
||||
|
||||
addRules: function( rules, group ){
|
||||
rules.map(function( rule ){
|
||||
this.addRule( rule, group );
|
||||
}, this);
|
||||
},
|
||||
|
||||
addRule: function( rule, group ){
|
||||
|
||||
// defaults
|
||||
group = group || 0;
|
||||
|
||||
// vars
|
||||
var groupArray;
|
||||
|
||||
// get group
|
||||
if( this.hasGroup(group) ) {
|
||||
groupArray = this.getGroup(group);
|
||||
} else {
|
||||
groupArray = this.addGroup();
|
||||
}
|
||||
|
||||
// instantiate
|
||||
var condition = acf.newCondition( rule, this );
|
||||
|
||||
// bail ealry if condition failed (field did not exist)
|
||||
if( !condition ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// add rule
|
||||
groupArray.push(condition);
|
||||
},
|
||||
|
||||
hasRule: function(){
|
||||
|
||||
},
|
||||
|
||||
getRule: function( rule, group ){
|
||||
|
||||
// defaults
|
||||
rule = rule || 0;
|
||||
group = group || 0;
|
||||
|
||||
return this.data.groups[ group ][ rule ];
|
||||
},
|
||||
|
||||
removeRule: function(){
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,232 @@
|
||||
(function($, undefined){
|
||||
|
||||
var i = 0;
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'accordion',
|
||||
|
||||
wait: '',
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-fields:first');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// bail early if is cell
|
||||
if( this.$el.is('td') ) return;
|
||||
|
||||
// enpoint
|
||||
if( this.get('endpoint') ) {
|
||||
return this.remove();
|
||||
}
|
||||
|
||||
// vars
|
||||
var $field = this.$el;
|
||||
var $label = this.$labelWrap()
|
||||
var $input = this.$inputWrap();
|
||||
var $wrap = this.$control();
|
||||
var $instructions = $input.children('.description');
|
||||
|
||||
// force description into label
|
||||
if( $instructions.length ) {
|
||||
$label.append( $instructions );
|
||||
}
|
||||
|
||||
// table
|
||||
if( this.$el.is('tr') ) {
|
||||
|
||||
// vars
|
||||
var $table = this.$el.closest('table');
|
||||
var $newLabel = $('<div class="acf-accordion-title"/>');
|
||||
var $newInput = $('<div class="acf-accordion-content"/>');
|
||||
var $newTable = $('<table class="' + $table.attr('class') + '"/>');
|
||||
var $newWrap = $('<tbody/>');
|
||||
|
||||
// dom
|
||||
$newLabel.append( $label.html() );
|
||||
$newTable.append( $newWrap );
|
||||
$newInput.append( $newTable );
|
||||
$input.append( $newLabel );
|
||||
$input.append( $newInput );
|
||||
|
||||
// modify
|
||||
$label.remove();
|
||||
$wrap.remove();
|
||||
$input.attr('colspan', 2);
|
||||
|
||||
// update vars
|
||||
$label = $newLabel;
|
||||
$input = $newInput;
|
||||
$wrap = $newWrap;
|
||||
}
|
||||
|
||||
// add classes
|
||||
$field.addClass('acf-accordion');
|
||||
$label.addClass('acf-accordion-title');
|
||||
$input.addClass('acf-accordion-content');
|
||||
|
||||
// index
|
||||
i++;
|
||||
|
||||
// multi-expand
|
||||
if( this.get('multi_expand') ) {
|
||||
$field.attr('multi-expand', 1);
|
||||
}
|
||||
|
||||
// open
|
||||
var order = acf.getPreference('this.accordions') || [];
|
||||
if( order[i-1] !== undefined ) {
|
||||
this.set('open', order[i-1]);
|
||||
}
|
||||
|
||||
if( this.get('open') ) {
|
||||
$field.addClass('-open');
|
||||
$input.css('display', 'block'); // needed for accordion to close smoothly
|
||||
}
|
||||
|
||||
// add icon
|
||||
$label.prepend( accordionManager.iconHtml({ open: this.get('open') }) );
|
||||
|
||||
// classes
|
||||
// - remove 'inside' which is a #poststuff WP class
|
||||
var $parent = $field.parent();
|
||||
$wrap.addClass( $parent.hasClass('-left') ? '-left' : '' );
|
||||
$wrap.addClass( $parent.hasClass('-clear') ? '-clear' : '' );
|
||||
|
||||
// append
|
||||
$wrap.append( $field.nextUntil('.acf-field-accordion', '.acf-field') );
|
||||
|
||||
// clean up
|
||||
$wrap.removeAttr('data-open data-multi_expand data-endpoint');
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
|
||||
/**
|
||||
* accordionManager
|
||||
*
|
||||
* Events manager for the acf accordion
|
||||
*
|
||||
* @date 14/2/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var accordionManager = new acf.Model({
|
||||
|
||||
actions: {
|
||||
'unload': 'onUnload'
|
||||
},
|
||||
|
||||
events: {
|
||||
'click .acf-accordion-title': 'onClick',
|
||||
'invalidField .acf-accordion': 'onInvalidField'
|
||||
},
|
||||
|
||||
isOpen: function( $el ) {
|
||||
return $el.hasClass('-open');
|
||||
},
|
||||
|
||||
toggle: function( $el ){
|
||||
if( this.isOpen($el) ) {
|
||||
this.close( $el );
|
||||
} else {
|
||||
this.open( $el );
|
||||
}
|
||||
},
|
||||
|
||||
iconHtml: function( props ){
|
||||
|
||||
// Determine icon.
|
||||
//if( acf.isGutenberg() ) {
|
||||
// var icon = props.open ? 'arrow-up-alt2' : 'arrow-down-alt2';
|
||||
//} else {
|
||||
var icon = props.open ? 'arrow-down' : 'arrow-right';
|
||||
//}
|
||||
|
||||
// Return HTML.
|
||||
return '<i class="acf-accordion-icon dashicons dashicons-' + icon + '"></i>';
|
||||
},
|
||||
|
||||
open: function( $el ){
|
||||
|
||||
// open
|
||||
$el.find('.acf-accordion-content:first').slideDown().css('display', 'block');
|
||||
$el.find('.acf-accordion-icon:first').replaceWith( this.iconHtml({ open: true }) );
|
||||
$el.addClass('-open');
|
||||
|
||||
// action
|
||||
acf.doAction('show', $el);
|
||||
|
||||
// close siblings
|
||||
if( !$el.attr('multi-expand') ) {
|
||||
$el.siblings('.acf-accordion.-open').each(function(){
|
||||
accordionManager.close( $(this) );
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
close: function( $el ){
|
||||
|
||||
// close
|
||||
$el.find('.acf-accordion-content:first').slideUp();
|
||||
$el.find('.acf-accordion-icon:first').replaceWith( this.iconHtml({ open: false }) );
|
||||
$el.removeClass('-open');
|
||||
|
||||
// action
|
||||
acf.doAction('hide', $el);
|
||||
},
|
||||
|
||||
onClick: function( e, $el ){
|
||||
|
||||
// prevent Defailt
|
||||
e.preventDefault();
|
||||
|
||||
// open close
|
||||
this.toggle( $el.parent() );
|
||||
|
||||
},
|
||||
|
||||
onInvalidField: function( e, $el ){
|
||||
|
||||
// bail early if already focused
|
||||
if( this.busy ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// disable functionality for 1sec (allow next validation to work)
|
||||
this.busy = true;
|
||||
this.setTimeout(function(){
|
||||
this.busy = false;
|
||||
}, 1000);
|
||||
|
||||
// open accordion
|
||||
this.open( $el );
|
||||
},
|
||||
|
||||
onUnload: function( e ){
|
||||
|
||||
// vars
|
||||
var order = [];
|
||||
|
||||
// loop
|
||||
$('.acf-accordion').each(function(){
|
||||
var open = $(this).hasClass('-open') ? 1 : 0;
|
||||
order.push(open);
|
||||
});
|
||||
|
||||
// set
|
||||
if( order.length ) {
|
||||
acf.setPreference('this.accordions', order);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,45 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'button_group',
|
||||
|
||||
events: {
|
||||
'click input[type="radio"]': 'onClick'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-button-group');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input:checked');
|
||||
},
|
||||
|
||||
setValue: function( val ){
|
||||
this.$('input[value="' + val + '"]').prop('checked', true).trigger('change');
|
||||
},
|
||||
|
||||
onClick: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var $label = $el.parent('label');
|
||||
var selected = $label.hasClass('selected');
|
||||
|
||||
// remove previous selected
|
||||
this.$('.selected').removeClass('selected');
|
||||
|
||||
// add active class
|
||||
$label.addClass('selected');
|
||||
|
||||
// allow null
|
||||
if( this.get('allow_null') && selected ) {
|
||||
$label.removeClass('selected');
|
||||
$el.prop('checked', false).trigger('change');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,97 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'checkbox',
|
||||
|
||||
events: {
|
||||
'change input': 'onChange',
|
||||
'click .acf-add-checkbox': 'onClickAdd',
|
||||
'click .acf-checkbox-toggle': 'onClickToggle',
|
||||
'click .acf-checkbox-custom': 'onClickCustom'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-checkbox-list');
|
||||
},
|
||||
|
||||
$toggle: function(){
|
||||
return this.$('.acf-checkbox-toggle');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="hidden"]');
|
||||
},
|
||||
|
||||
$inputs: function(){
|
||||
return this.$('input[type="checkbox"]').not('.acf-checkbox-toggle');
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
var val = [];
|
||||
this.$(':checked').each(function(){
|
||||
val.push( $(this).val() );
|
||||
});
|
||||
return val.length ? val : false;
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var checked = $el.prop('checked');
|
||||
var $toggle = this.$toggle();
|
||||
|
||||
// selected
|
||||
if( checked ) {
|
||||
$el.parent().addClass('selected');
|
||||
} else {
|
||||
$el.parent().removeClass('selected');
|
||||
}
|
||||
|
||||
// determine if all inputs are checked
|
||||
if( $toggle.length ) {
|
||||
var $inputs = this.$inputs();
|
||||
|
||||
// all checked
|
||||
if( $inputs.not(':checked').length == 0 ) {
|
||||
$toggle.prop('checked', true);
|
||||
} else {
|
||||
$toggle.prop('checked', false);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onClickAdd: function( e, $el ){
|
||||
var html = '<li><input class="acf-checkbox-custom" type="checkbox" checked="checked" /><input type="text" name="' + this.getInputName() + '[]" /></li>';
|
||||
$el.parent('li').before( html );
|
||||
},
|
||||
|
||||
onClickToggle: function( e, $el ){
|
||||
var checked = $el.prop('checked');
|
||||
var $inputs = this.$inputs();
|
||||
$inputs.prop('checked', checked);
|
||||
},
|
||||
|
||||
onClickCustom: function( e, $el ){
|
||||
var checked = $el.prop('checked');
|
||||
var $text = $el.next('input[type="text"]');
|
||||
|
||||
// checked
|
||||
if( checked ) {
|
||||
$text.prop('disabled', false);
|
||||
|
||||
// not checked
|
||||
} else {
|
||||
$text.prop('disabled', true);
|
||||
|
||||
// remove
|
||||
if( $text.val() == '' ) {
|
||||
$el.parent('li').remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,64 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'color_picker',
|
||||
|
||||
wait: 'load',
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-color-picker');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="hidden"]');
|
||||
},
|
||||
|
||||
$inputText: function(){
|
||||
return this.$('input[type="text"]');
|
||||
},
|
||||
|
||||
setValue: function( val ){
|
||||
|
||||
// update input (with change)
|
||||
acf.val( this.$input(), val );
|
||||
|
||||
// update iris
|
||||
this.$inputText().iris('color', val);
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $input = this.$input();
|
||||
var $inputText = this.$inputText();
|
||||
|
||||
// event
|
||||
var onChange = function( e ){
|
||||
|
||||
// timeout is required to ensure the $input val is correct
|
||||
setTimeout(function(){
|
||||
acf.val( $input, $inputText.val() );
|
||||
}, 1);
|
||||
}
|
||||
|
||||
// args
|
||||
var args = {
|
||||
defaultColor: false,
|
||||
palettes: true,
|
||||
hide: true,
|
||||
change: onChange,
|
||||
clear: onChange
|
||||
};
|
||||
|
||||
// filter
|
||||
var args = acf.applyFilters('color_picker_args', args, this);
|
||||
|
||||
// initialize
|
||||
$inputText.wpColorPicker( args );
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,157 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'date_picker',
|
||||
|
||||
events: {
|
||||
'blur input[type="text"]': 'onBlur'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-date-picker');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="hidden"]');
|
||||
},
|
||||
|
||||
$inputText: function(){
|
||||
return this.$('input[type="text"]');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// save_format: compatibility with ACF < 5.0.0
|
||||
if( this.has('save_format') ) {
|
||||
return this.initializeCompatibility();
|
||||
}
|
||||
|
||||
// vars
|
||||
var $input = this.$input();
|
||||
var $inputText = this.$inputText();
|
||||
|
||||
// args
|
||||
var args = {
|
||||
dateFormat: this.get('date_format'),
|
||||
altField: $input,
|
||||
altFormat: 'yymmdd',
|
||||
changeYear: true,
|
||||
yearRange: "-100:+100",
|
||||
changeMonth: true,
|
||||
showButtonPanel: true,
|
||||
firstDay: this.get('first_day')
|
||||
};
|
||||
|
||||
// filter
|
||||
args = acf.applyFilters('date_picker_args', args, this);
|
||||
|
||||
// add date picker
|
||||
acf.newDatePicker( $inputText, args );
|
||||
|
||||
// action
|
||||
acf.doAction('date_picker_init', $inputText, args, this);
|
||||
|
||||
},
|
||||
|
||||
initializeCompatibility: function(){
|
||||
|
||||
// vars
|
||||
var $input = this.$input();
|
||||
var $inputText = this.$inputText();
|
||||
|
||||
// get and set value from alt field
|
||||
$inputText.val( $input.val() );
|
||||
|
||||
// args
|
||||
var args = {
|
||||
dateFormat: this.get('date_format'),
|
||||
altField: $input,
|
||||
altFormat: this.get('save_format'),
|
||||
changeYear: true,
|
||||
yearRange: "-100:+100",
|
||||
changeMonth: true,
|
||||
showButtonPanel: true,
|
||||
firstDay: this.get('first_day')
|
||||
};
|
||||
|
||||
// filter for 3rd party customization
|
||||
args = acf.applyFilters('date_picker_args', args, this);
|
||||
|
||||
// backup
|
||||
var dateFormat = args.dateFormat;
|
||||
|
||||
// change args.dateFormat
|
||||
args.dateFormat = this.get('save_format');
|
||||
|
||||
// add date picker
|
||||
acf.newDatePicker( $inputText, args );
|
||||
|
||||
// now change the format back to how it should be.
|
||||
$inputText.datepicker( 'option', 'dateFormat', dateFormat );
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('date_picker_init', $inputText, args, this);
|
||||
},
|
||||
|
||||
onBlur: function(){
|
||||
if( !this.$inputText().val() ) {
|
||||
acf.val( this.$input(), '' );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
|
||||
// manager
|
||||
var datePickerManager = new acf.Model({
|
||||
priority: 5,
|
||||
wait: 'ready',
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var locale = acf.get('locale');
|
||||
var rtl = acf.get('rtl');
|
||||
var l10n = acf.get('datePickerL10n');
|
||||
|
||||
// bail ealry if no l10n
|
||||
if( !l10n ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bail ealry if no datepicker library
|
||||
if( typeof $.datepicker === 'undefined' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// rtl
|
||||
l10n.isRTL = rtl;
|
||||
|
||||
// append
|
||||
$.datepicker.regional[ locale ] = l10n;
|
||||
$.datepicker.setDefaults(l10n);
|
||||
}
|
||||
});
|
||||
|
||||
// add
|
||||
acf.newDatePicker = function( $input, args ){
|
||||
|
||||
// bail ealry if no datepicker library
|
||||
if( typeof $.datepicker === 'undefined' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// defaults
|
||||
args = args || {};
|
||||
|
||||
// initialize
|
||||
$input.datepicker( args );
|
||||
|
||||
// wrap the datepicker (only if it hasn't already been wrapped)
|
||||
if( $('body > #ui-datepicker-div').exists() ) {
|
||||
$('body > #ui-datepicker-div').wrap('<div class="acf-ui-datepicker" />');
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,99 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.models.DatePickerField.extend({
|
||||
|
||||
type: 'date_time_picker',
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-date-time-picker');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $input = this.$input();
|
||||
var $inputText = this.$inputText();
|
||||
|
||||
// args
|
||||
var args = {
|
||||
dateFormat: this.get('date_format'),
|
||||
timeFormat: this.get('time_format'),
|
||||
altField: $input,
|
||||
altFieldTimeOnly: false,
|
||||
altFormat: 'yy-mm-dd',
|
||||
altTimeFormat: 'HH:mm:ss',
|
||||
changeYear: true,
|
||||
yearRange: "-100:+100",
|
||||
changeMonth: true,
|
||||
showButtonPanel: true,
|
||||
firstDay: this.get('first_day'),
|
||||
controlType: 'select',
|
||||
oneLine: true
|
||||
};
|
||||
|
||||
// filter
|
||||
args = acf.applyFilters('date_time_picker_args', args, this);
|
||||
|
||||
// add date time picker
|
||||
acf.newDateTimePicker( $inputText, args );
|
||||
|
||||
// action
|
||||
acf.doAction('date_time_picker_init', $inputText, args, this);
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
|
||||
// manager
|
||||
var dateTimePickerManager = new acf.Model({
|
||||
priority: 5,
|
||||
wait: 'ready',
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var locale = acf.get('locale');
|
||||
var rtl = acf.get('rtl');
|
||||
var l10n = acf.get('dateTimePickerL10n');
|
||||
|
||||
// bail ealry if no l10n
|
||||
if( !l10n ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bail ealry if no datepicker library
|
||||
if( typeof $.timepicker === 'undefined' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// rtl
|
||||
l10n.isRTL = rtl;
|
||||
|
||||
// append
|
||||
$.timepicker.regional[ locale ] = l10n;
|
||||
$.timepicker.setDefaults(l10n);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// add
|
||||
acf.newDateTimePicker = function( $input, args ){
|
||||
|
||||
// bail ealry if no datepicker library
|
||||
if( typeof $.timepicker === 'undefined' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// defaults
|
||||
args = args || {};
|
||||
|
||||
// initialize
|
||||
$input.datetimepicker( args );
|
||||
|
||||
// wrap the datepicker (only if it hasn't already been wrapped)
|
||||
if( $('body > #ui-datepicker-div').exists() ) {
|
||||
$('body > #ui-datepicker-div').wrap('<div class="acf-ui-datepicker" />');
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,120 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.models.ImageField.extend({
|
||||
|
||||
type: 'file',
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-file-uploader');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="hidden"]');
|
||||
},
|
||||
|
||||
validateAttachment: function( attachment ){
|
||||
|
||||
// defaults
|
||||
attachment = attachment || {};
|
||||
|
||||
// WP attachment
|
||||
if( attachment.id !== undefined ) {
|
||||
attachment = attachment.attributes;
|
||||
}
|
||||
|
||||
// args
|
||||
attachment = acf.parseArgs(attachment, {
|
||||
url: '',
|
||||
alt: '',
|
||||
title: '',
|
||||
filename: '',
|
||||
filesizeHumanReadable: '',
|
||||
icon: '/wp-includes/images/media/default.png'
|
||||
});
|
||||
|
||||
// return
|
||||
return attachment;
|
||||
},
|
||||
|
||||
render: function( attachment ){
|
||||
|
||||
// vars
|
||||
attachment = this.validateAttachment( attachment );
|
||||
|
||||
// update image
|
||||
this.$('img').attr({
|
||||
src: attachment.icon,
|
||||
alt: attachment.alt,
|
||||
title: attachment.title
|
||||
});
|
||||
|
||||
// update elements
|
||||
this.$('[data-name="title"]').text( attachment.title );
|
||||
this.$('[data-name="filename"]').text( attachment.filename ).attr( 'href', attachment.url );
|
||||
this.$('[data-name="filesize"]').text( attachment.filesizeHumanReadable );
|
||||
|
||||
// vars
|
||||
var val = attachment.id || '';
|
||||
|
||||
// update val
|
||||
acf.val( this.$input(), val );
|
||||
|
||||
// update class
|
||||
if( val ) {
|
||||
this.$control().addClass('has-value');
|
||||
} else {
|
||||
this.$control().removeClass('has-value');
|
||||
}
|
||||
},
|
||||
|
||||
selectAttachment: function(){
|
||||
|
||||
// vars
|
||||
var parent = this.parent();
|
||||
var multiple = (parent && parent.get('type') === 'repeater');
|
||||
|
||||
// new frame
|
||||
var frame = acf.newMediaPopup({
|
||||
mode: 'select',
|
||||
title: acf.__('Select File'),
|
||||
field: this.get('key'),
|
||||
multiple: multiple,
|
||||
library: this.get('library'),
|
||||
allowedTypes: this.get('mime_types'),
|
||||
select: $.proxy(function( attachment, i ) {
|
||||
if( i > 0 ) {
|
||||
this.append( attachment, parent );
|
||||
} else {
|
||||
this.render( attachment );
|
||||
}
|
||||
}, this)
|
||||
});
|
||||
},
|
||||
|
||||
editAttachment: function(){
|
||||
|
||||
// vars
|
||||
var val = this.val();
|
||||
|
||||
// bail early if no val
|
||||
if( !val ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// popup
|
||||
var frame = acf.newMediaPopup({
|
||||
mode: 'edit',
|
||||
title: acf.__('Edit File'),
|
||||
button: acf.__('Update File'),
|
||||
attachment: val,
|
||||
field: this.get('key'),
|
||||
select: $.proxy(function( attachment, i ) {
|
||||
this.render( attachment );
|
||||
}, this)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,553 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'google_map',
|
||||
|
||||
map: false,
|
||||
|
||||
wait: 'load',
|
||||
|
||||
events: {
|
||||
'click a[data-name="clear"]': 'onClickClear',
|
||||
'click a[data-name="locate"]': 'onClickLocate',
|
||||
'click a[data-name="search"]': 'onClickSearch',
|
||||
'keydown .search': 'onKeydownSearch',
|
||||
'keyup .search': 'onKeyupSearch',
|
||||
'focus .search': 'onFocusSearch',
|
||||
'blur .search': 'onBlurSearch',
|
||||
'showField': 'onShow'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-google-map');
|
||||
},
|
||||
|
||||
$input: function( name ){
|
||||
return this.$('input[data-name="' + (name || 'address') + '"]');
|
||||
},
|
||||
|
||||
$search: function(){
|
||||
return this.$('.search');
|
||||
},
|
||||
|
||||
$canvas: function(){
|
||||
return this.$('.canvas');
|
||||
},
|
||||
|
||||
addClass: function( name ){
|
||||
this.$control().addClass( name );
|
||||
},
|
||||
|
||||
removeClass: function( name ){
|
||||
this.$control().removeClass( name );
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
|
||||
// defaults
|
||||
var val = {
|
||||
lat: '',
|
||||
lng: '',
|
||||
address: ''
|
||||
};
|
||||
|
||||
// loop
|
||||
this.$('input[type="hidden"]').each(function(){
|
||||
val[ $(this).data('name') ] = $(this).val();
|
||||
});
|
||||
|
||||
// return false if no lat/lng
|
||||
if( !val.lat || !val.lng ) {
|
||||
val = false;
|
||||
}
|
||||
|
||||
// return
|
||||
return val;
|
||||
},
|
||||
|
||||
setValue: function( val ){
|
||||
|
||||
// defaults
|
||||
val = acf.parseArgs(val, {
|
||||
lat: '',
|
||||
lng: '',
|
||||
address: ''
|
||||
});
|
||||
|
||||
// loop
|
||||
for( var name in val ) {
|
||||
acf.val( this.$input(name), val[name] );
|
||||
}
|
||||
|
||||
// return false if no lat/lng
|
||||
if( !val.lat || !val.lng ) {
|
||||
val = false;
|
||||
}
|
||||
|
||||
// render
|
||||
this.renderVal( val );
|
||||
|
||||
// action
|
||||
var latLng = this.newLatLng( val.lat, val.lng );
|
||||
acf.doAction('google_map_change', latLng, this.map, this);
|
||||
},
|
||||
|
||||
renderVal: function( val ){
|
||||
|
||||
// has value
|
||||
if( val ) {
|
||||
this.addClass('-value');
|
||||
this.setPosition( val.lat, val.lng );
|
||||
this.map.marker.setVisible( true );
|
||||
|
||||
// no value
|
||||
} else {
|
||||
this.removeClass('-value');
|
||||
this.map.marker.setVisible( false );
|
||||
}
|
||||
|
||||
// search
|
||||
this.$search().val( val.address );
|
||||
},
|
||||
|
||||
setPosition: function( lat, lng ){
|
||||
|
||||
// vars
|
||||
var latLng = this.newLatLng( lat, lng );
|
||||
|
||||
// update marker
|
||||
this.map.marker.setPosition( latLng );
|
||||
|
||||
// show marker
|
||||
this.map.marker.setVisible( true );
|
||||
|
||||
// center
|
||||
this.center();
|
||||
|
||||
// return
|
||||
return this;
|
||||
},
|
||||
|
||||
center: function(){
|
||||
|
||||
// vars
|
||||
var position = this.map.marker.getPosition();
|
||||
var lat = this.get('lat');
|
||||
var lng = this.get('lng');
|
||||
|
||||
// if marker exists, center on the marker
|
||||
if( position ) {
|
||||
lat = position.lat();
|
||||
lng = position.lng();
|
||||
}
|
||||
|
||||
// latlng
|
||||
var latLng = this.newLatLng( lat, lng );
|
||||
|
||||
// set center of map
|
||||
this.map.setCenter( latLng );
|
||||
},
|
||||
|
||||
getSearchVal: function(){
|
||||
return this.$search().val();
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// Ensure Google API is loaded and then initialize map.
|
||||
withAPI( this.initializeMap.bind(this) );
|
||||
},
|
||||
|
||||
newLatLng: function( lat, lng ){
|
||||
return new google.maps.LatLng( parseFloat(lat), parseFloat(lng) );
|
||||
},
|
||||
|
||||
initializeMap: function(){
|
||||
|
||||
// vars
|
||||
var zoom = this.get('zoom');
|
||||
var lat = this.get('lat');
|
||||
var lng = this.get('lng');
|
||||
|
||||
// Create Map.
|
||||
var mapArgs = {
|
||||
scrollwheel: false,
|
||||
zoom: parseInt( zoom ),
|
||||
center: this.newLatLng(lat, lng),
|
||||
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
||||
marker: {
|
||||
draggable: true,
|
||||
raiseOnDrag: true
|
||||
},
|
||||
autocomplete: {}
|
||||
};
|
||||
mapArgs = acf.applyFilters('google_map_args', mapArgs, this);
|
||||
var map = new google.maps.Map( this.$canvas()[0], mapArgs );
|
||||
|
||||
// Create Marker.
|
||||
var markerArgs = acf.parseArgs(mapArgs.marker, {
|
||||
draggable: true,
|
||||
raiseOnDrag: true,
|
||||
map: map
|
||||
});
|
||||
markerArgs = acf.applyFilters('google_map_marker_args', markerArgs, this);
|
||||
var marker = new google.maps.Marker( markerArgs );
|
||||
|
||||
// Maybe Create Autocomplete.
|
||||
var autocomplete = false;
|
||||
if( acf.isset(google, 'maps', 'places', 'Autocomplete') ) {
|
||||
var autocompleteArgs = mapArgs.autocomplete || {};
|
||||
autocompleteArgs = acf.applyFilters('google_map_autocomplete_args', autocompleteArgs, this);
|
||||
autocomplete = new google.maps.places.Autocomplete( this.$search()[0], autocompleteArgs );
|
||||
autocomplete.bindTo('bounds', map);
|
||||
}
|
||||
|
||||
// Add map events.
|
||||
this.addMapEvents( this, map, marker, autocomplete );
|
||||
|
||||
// Append references.
|
||||
map.acf = this;
|
||||
map.marker = marker;
|
||||
map.autocomplete = autocomplete;
|
||||
this.map = map;
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('google_map_init', map, marker, this);
|
||||
|
||||
// set position
|
||||
var val = this.getValue();
|
||||
this.renderVal( val );
|
||||
},
|
||||
|
||||
addMapEvents: function( field, map, marker, autocomplete ){
|
||||
|
||||
// Click map.
|
||||
google.maps.event.addListener( map, 'click', function( e ) {
|
||||
|
||||
// vars
|
||||
var lat = e.latLng.lat();
|
||||
var lng = e.latLng.lng();
|
||||
|
||||
// search
|
||||
field.searchPosition( lat, lng );
|
||||
});
|
||||
|
||||
// Drag marker.
|
||||
google.maps.event.addListener( marker, 'dragend', function(){
|
||||
|
||||
// vars
|
||||
var position = this.getPosition();
|
||||
var lat = position.lat();
|
||||
var lng = position.lng();
|
||||
|
||||
// search
|
||||
field.searchPosition( lat, lng );
|
||||
});
|
||||
|
||||
// Autocomplete search.
|
||||
if( autocomplete ) {
|
||||
|
||||
// autocomplete event place_changed is triggered each time the input changes
|
||||
// customize the place object with the current "search value" to allow users controll over the address text
|
||||
google.maps.event.addListener(autocomplete, 'place_changed', function() {
|
||||
var place = this.getPlace();
|
||||
place.address = field.getSearchVal();
|
||||
field.setPlace( place );
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
searchPosition: function( lat, lng ){
|
||||
|
||||
// vars
|
||||
var latLng = this.newLatLng( lat, lng );
|
||||
var $wrap = this.$control();
|
||||
|
||||
// set position
|
||||
this.setPosition( lat, lng );
|
||||
|
||||
// add class
|
||||
$wrap.addClass('-loading');
|
||||
|
||||
// callback
|
||||
var callback = $.proxy(function( results, status ){
|
||||
|
||||
// remove class
|
||||
$wrap.removeClass('-loading');
|
||||
|
||||
// vars
|
||||
var address = '';
|
||||
|
||||
// validate
|
||||
if( status != google.maps.GeocoderStatus.OK ) {
|
||||
console.log('Geocoder failed due to: ' + status);
|
||||
} else if( !results[0] ) {
|
||||
console.log('No results found');
|
||||
} else {
|
||||
address = results[0].formatted_address;
|
||||
}
|
||||
|
||||
// update val
|
||||
this.val({
|
||||
lat: lat,
|
||||
lng: lng,
|
||||
address: address
|
||||
});
|
||||
|
||||
}, this);
|
||||
|
||||
// query
|
||||
geocoder.geocode({ 'latLng' : latLng }, callback);
|
||||
},
|
||||
|
||||
setPlace: function( place ){
|
||||
|
||||
// bail if no place
|
||||
if( !place ) return this;
|
||||
|
||||
// search name if no geometry
|
||||
// - possible when hitting enter in search address
|
||||
if( place.name && !place.geometry ) {
|
||||
this.searchAddress(place.name);
|
||||
return this;
|
||||
}
|
||||
|
||||
// vars
|
||||
var lat = place.geometry.location.lat();
|
||||
var lng = place.geometry.location.lng();
|
||||
var address = place.address || place.formatted_address;
|
||||
|
||||
// update
|
||||
this.setValue({
|
||||
lat: lat,
|
||||
lng: lng,
|
||||
address: address
|
||||
});
|
||||
|
||||
// return
|
||||
return this;
|
||||
},
|
||||
|
||||
searchAddress: function( address ){
|
||||
|
||||
// is address latLng?
|
||||
var latLng = address.split(',');
|
||||
if( latLng.length == 2 ) {
|
||||
|
||||
// vars
|
||||
var lat = latLng[0];
|
||||
var lng = latLng[1];
|
||||
|
||||
// check
|
||||
if( $.isNumeric(lat) && $.isNumeric(lng) ) {
|
||||
return this.searchPosition( lat, lng );
|
||||
}
|
||||
}
|
||||
|
||||
// vars
|
||||
var $wrap = this.$control();
|
||||
|
||||
// add class
|
||||
$wrap.addClass('-loading');
|
||||
|
||||
// callback
|
||||
var callback = this.proxy(function( results, status ){
|
||||
|
||||
// remove class
|
||||
$wrap.removeClass('-loading');
|
||||
|
||||
// vars
|
||||
var lat = '';
|
||||
var lng = '';
|
||||
|
||||
// validate
|
||||
if( status != google.maps.GeocoderStatus.OK ) {
|
||||
console.log('Geocoder failed due to: ' + status);
|
||||
} else if( !results[0] ) {
|
||||
console.log('No results found');
|
||||
} else {
|
||||
lat = results[0].geometry.location.lat();
|
||||
lng = results[0].geometry.location.lng();
|
||||
//address = results[0].formatted_address;
|
||||
}
|
||||
|
||||
// update val
|
||||
this.val({
|
||||
lat: lat,
|
||||
lng: lng,
|
||||
address: address
|
||||
});
|
||||
|
||||
//acf.doAction('google_map_geocode_results', results, status, this.$el, this);
|
||||
|
||||
});
|
||||
|
||||
// query
|
||||
geocoder.geocode({ 'address' : address }, callback);
|
||||
},
|
||||
|
||||
searchLocation: function(){
|
||||
|
||||
// Try HTML5 geolocation
|
||||
if( !navigator.geolocation ) {
|
||||
return alert( acf.__('Sorry, this browser does not support geolocation') );
|
||||
}
|
||||
|
||||
// vars
|
||||
var $wrap = this.$control();
|
||||
|
||||
// add class
|
||||
$wrap.addClass('-loading');
|
||||
|
||||
// callback
|
||||
var onSuccess = $.proxy(function( results, status ){
|
||||
|
||||
// remove class
|
||||
$wrap.removeClass('-loading');
|
||||
|
||||
// vars
|
||||
var lat = results.coords.latitude;
|
||||
var lng = results.coords.longitude;
|
||||
|
||||
// search;
|
||||
this.searchPosition( lat, lng );
|
||||
|
||||
}, this);
|
||||
|
||||
var onFailure = function( error ){
|
||||
$wrap.removeClass('-loading');
|
||||
}
|
||||
|
||||
// try query
|
||||
navigator.geolocation.getCurrentPosition( onSuccess, onFailure );
|
||||
},
|
||||
|
||||
onClickClear: function( e, $el ){
|
||||
this.val( false );
|
||||
},
|
||||
|
||||
onClickLocate: function( e, $el ){
|
||||
this.searchLocation();
|
||||
},
|
||||
|
||||
onClickSearch: function( e, $el ){
|
||||
this.searchAddress( this.$search().val() );
|
||||
},
|
||||
|
||||
onFocusSearch: function( e, $el ){
|
||||
this.removeClass('-value');
|
||||
this.onKeyupSearch.apply(this, arguments);
|
||||
},
|
||||
|
||||
onBlurSearch: function( e, $el ){
|
||||
|
||||
// timeout to allow onClickLocate event
|
||||
this.setTimeout(function(){
|
||||
this.removeClass('-search');
|
||||
if( $el.val() ) {
|
||||
this.addClass('-value');
|
||||
}
|
||||
}, 100);
|
||||
},
|
||||
|
||||
onKeyupSearch: function( e, $el ){
|
||||
if( $el.val() ) {
|
||||
this.addClass('-search');
|
||||
} else {
|
||||
this.removeClass('-search');
|
||||
}
|
||||
},
|
||||
|
||||
onKeydownSearch: function( e, $el ){
|
||||
|
||||
// prevent form from submitting
|
||||
if( e.which == 13 ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
onMousedown: function(){
|
||||
|
||||
/*
|
||||
// clear timeout in 1ms (onMousedown will run before onBlurSearch)
|
||||
this.setTimeout(function(){
|
||||
clearTimeout( this.get('timeout') );
|
||||
}, 1);
|
||||
*/
|
||||
},
|
||||
|
||||
onShow: function(){
|
||||
|
||||
// bail early if no map
|
||||
// - possible if JS API was not loaded
|
||||
if( !this.map ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// center map when it is shown (by a tab / collapsed row)
|
||||
// - use delay to avoid rendering issues with browsers (ensures div is visible)
|
||||
this.setTimeout( this.center, 10 );
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
// Vars.
|
||||
var loading = false;
|
||||
var geocoder = false;
|
||||
|
||||
/**
|
||||
* withAPI
|
||||
*
|
||||
* Loads the Google Maps API library and troggers callback.
|
||||
*
|
||||
* @date 28/3/19
|
||||
* @since 5.7.14
|
||||
*
|
||||
* @param function callback The callback to excecute.
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function withAPI( callback ) {
|
||||
|
||||
// Check if geocoder exists.
|
||||
if( geocoder ) {
|
||||
return callback();
|
||||
}
|
||||
|
||||
// Check if geocoder API exists.
|
||||
if( acf.isset(window, 'google', 'maps', 'Geocoder') ) {
|
||||
geocoder = new google.maps.Geocoder();
|
||||
return callback();
|
||||
}
|
||||
|
||||
// Geocoder will need to be loaded. Hook callback to action.
|
||||
acf.addAction( 'google_map_api_loaded', callback );
|
||||
|
||||
// Bail early if already loading API.
|
||||
if( loading ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// load api
|
||||
var url = acf.get('google_map_api');
|
||||
if( url ) {
|
||||
|
||||
// Set loading status.
|
||||
loading = true;
|
||||
|
||||
// Load API
|
||||
$.ajax({
|
||||
url: url,
|
||||
dataType: 'script',
|
||||
cache: true,
|
||||
success: function(){
|
||||
geocoder = new google.maps.Geocoder();
|
||||
acf.doAction('google_map_api_loaded');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,198 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'image',
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-image-uploader');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="hidden"]');
|
||||
},
|
||||
|
||||
events: {
|
||||
'click a[data-name="add"]': 'onClickAdd',
|
||||
'click a[data-name="edit"]': 'onClickEdit',
|
||||
'click a[data-name="remove"]': 'onClickRemove',
|
||||
'change input[type="file"]': 'onChange'
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// add attribute to form
|
||||
if( this.get('uploader') === 'basic' ) {
|
||||
this.$el.closest('form').attr('enctype', 'multipart/form-data');
|
||||
}
|
||||
},
|
||||
|
||||
validateAttachment: function( attachment ){
|
||||
|
||||
// defaults
|
||||
attachment = attachment || {};
|
||||
|
||||
// WP attachment
|
||||
if( attachment.id !== undefined ) {
|
||||
attachment = attachment.attributes;
|
||||
}
|
||||
|
||||
// args
|
||||
attachment = acf.parseArgs(attachment, {
|
||||
url: '',
|
||||
alt: '',
|
||||
title: '',
|
||||
caption: '',
|
||||
description: '',
|
||||
width: 0,
|
||||
height: 0
|
||||
});
|
||||
|
||||
// preview size
|
||||
var url = acf.isget(attachment, 'sizes', this.get('preview_size'), 'url');
|
||||
if( url !== null ) {
|
||||
attachment.url = url;
|
||||
}
|
||||
|
||||
// return
|
||||
return attachment;
|
||||
},
|
||||
|
||||
render: function( attachment ){
|
||||
|
||||
// vars
|
||||
attachment = this.validateAttachment( attachment );
|
||||
|
||||
// update image
|
||||
this.$('img').attr({
|
||||
src: attachment.url,
|
||||
alt: attachment.alt,
|
||||
title: attachment.title
|
||||
});
|
||||
|
||||
// vars
|
||||
var val = attachment.id || '';
|
||||
|
||||
// update val
|
||||
this.val( val );
|
||||
|
||||
// update class
|
||||
if( val ) {
|
||||
this.$control().addClass('has-value');
|
||||
} else {
|
||||
this.$control().removeClass('has-value');
|
||||
}
|
||||
},
|
||||
|
||||
// create a new repeater row and render value
|
||||
append: function( attachment, parent ){
|
||||
|
||||
// create function to find next available field within parent
|
||||
var getNext = function( field, parent ){
|
||||
|
||||
// find existing file fields within parent
|
||||
var fields = acf.getFields({
|
||||
key: field.get('key'),
|
||||
parent: parent.$el
|
||||
});
|
||||
|
||||
// find the first field with no value
|
||||
for( var i = 0; i < fields.length; i++ ) {
|
||||
if( !fields[i].val() ) {
|
||||
return fields[i];
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return false;
|
||||
}
|
||||
|
||||
// find existing file fields within parent
|
||||
var field = getNext( this, parent );
|
||||
|
||||
// add new row if no available field
|
||||
if( !field ) {
|
||||
parent.$('.acf-button:last').trigger('click');
|
||||
field = getNext( this, parent );
|
||||
}
|
||||
|
||||
// render
|
||||
if( field ) {
|
||||
field.render( attachment );
|
||||
}
|
||||
},
|
||||
|
||||
selectAttachment: function(){
|
||||
|
||||
// vars
|
||||
var parent = this.parent();
|
||||
var multiple = (parent && parent.get('type') === 'repeater');
|
||||
|
||||
// new frame
|
||||
var frame = acf.newMediaPopup({
|
||||
mode: 'select',
|
||||
type: 'image',
|
||||
title: acf.__('Select Image'),
|
||||
field: this.get('key'),
|
||||
multiple: multiple,
|
||||
library: this.get('library'),
|
||||
allowedTypes: this.get('mime_types'),
|
||||
select: $.proxy(function( attachment, i ) {
|
||||
if( i > 0 ) {
|
||||
this.append( attachment, parent );
|
||||
} else {
|
||||
this.render( attachment );
|
||||
}
|
||||
}, this)
|
||||
});
|
||||
},
|
||||
|
||||
editAttachment: function(){
|
||||
|
||||
// vars
|
||||
var val = this.val();
|
||||
|
||||
// bail early if no val
|
||||
if( !val ) return;
|
||||
|
||||
// popup
|
||||
var frame = acf.newMediaPopup({
|
||||
mode: 'edit',
|
||||
title: acf.__('Edit Image'),
|
||||
button: acf.__('Update Image'),
|
||||
attachment: val,
|
||||
field: this.get('key'),
|
||||
select: $.proxy(function( attachment, i ) {
|
||||
this.render( attachment );
|
||||
}, this)
|
||||
});
|
||||
},
|
||||
|
||||
removeAttachment: function(){
|
||||
this.render( false );
|
||||
},
|
||||
|
||||
onClickAdd: function( e, $el ){
|
||||
this.selectAttachment();
|
||||
},
|
||||
|
||||
onClickEdit: function( e, $el ){
|
||||
this.editAttachment();
|
||||
},
|
||||
|
||||
onClickRemove: function( e, $el ){
|
||||
this.removeAttachment();
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
var $hiddenInput = this.$input();
|
||||
|
||||
acf.getFileInputData($el, function( data ){
|
||||
$hiddenInput.val( $.param(data) );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,191 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'link',
|
||||
|
||||
events: {
|
||||
'click a[data-name="add"]': 'onClickEdit',
|
||||
'click a[data-name="edit"]': 'onClickEdit',
|
||||
'click a[data-name="remove"]': 'onClickRemove',
|
||||
'change .link-node': 'onChange',
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-link');
|
||||
},
|
||||
|
||||
$node: function(){
|
||||
return this.$('.link-node');
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
|
||||
// vars
|
||||
var $node = this.$node();
|
||||
|
||||
// return false if empty
|
||||
if( !$node.attr('href') ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// return
|
||||
return {
|
||||
title: $node.html(),
|
||||
url: $node.attr('href'),
|
||||
target: $node.attr('target')
|
||||
};
|
||||
},
|
||||
|
||||
setValue: function( val ){
|
||||
|
||||
// default
|
||||
val = acf.parseArgs(val, {
|
||||
title: '',
|
||||
url: '',
|
||||
target: ''
|
||||
});
|
||||
|
||||
// vars
|
||||
var $div = this.$control();
|
||||
var $node = this.$node();
|
||||
|
||||
// remove class
|
||||
$div.removeClass('-value -external');
|
||||
|
||||
// add class
|
||||
if( val.url ) $div.addClass('-value');
|
||||
if( val.target === '_blank' ) $div.addClass('-external');
|
||||
|
||||
// update text
|
||||
this.$('.link-title').html( val.title );
|
||||
this.$('.link-url').attr('href', val.url).html( val.url );
|
||||
|
||||
// update node
|
||||
$node.html(val.title);
|
||||
$node.attr('href', val.url);
|
||||
$node.attr('target', val.target);
|
||||
|
||||
// update inputs
|
||||
this.$('.input-title').val( val.title );
|
||||
this.$('.input-target').val( val.target );
|
||||
this.$('.input-url').val( val.url ).trigger('change');
|
||||
},
|
||||
|
||||
onClickEdit: function( e, $el ){
|
||||
acf.wpLink.open( this.$node() );
|
||||
},
|
||||
|
||||
onClickRemove: function( e, $el ){
|
||||
this.setValue( false );
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
|
||||
// get the changed value
|
||||
var val = this.getValue();
|
||||
|
||||
// update inputs
|
||||
this.setValue(val);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
|
||||
// manager
|
||||
acf.wpLink = new acf.Model({
|
||||
|
||||
getNodeValue: function(){
|
||||
var $node = this.get('node');
|
||||
return {
|
||||
title: $node.html(),
|
||||
url: $node.attr('href'),
|
||||
target: $node.attr('target')
|
||||
};
|
||||
},
|
||||
|
||||
setNodeValue: function( val ){
|
||||
var $node = this.get('node');
|
||||
$node.html( val.title );
|
||||
$node.attr('href', val.url);
|
||||
$node.attr('target', val.target);
|
||||
$node.trigger('change');
|
||||
},
|
||||
|
||||
getInputValue: function(){
|
||||
return {
|
||||
title: $('#wp-link-text').val(),
|
||||
url: $('#wp-link-url').val(),
|
||||
target: $('#wp-link-target').prop('checked') ? '_blank' : ''
|
||||
};
|
||||
},
|
||||
|
||||
setInputValue: function( val ){
|
||||
$('#wp-link-text').val( val.title );
|
||||
$('#wp-link-url').val( val.url );
|
||||
$('#wp-link-target').prop('checked', val.target === '_blank' );
|
||||
},
|
||||
|
||||
open: function( $node ){
|
||||
|
||||
// add events
|
||||
this.on('wplink-open', 'onOpen');
|
||||
this.on('wplink-close', 'onClose');
|
||||
|
||||
// set node
|
||||
this.set('node', $node);
|
||||
|
||||
// create textarea
|
||||
var $textarea = $('<textarea id="acf-link-textarea" style="display:none;"></textarea>');
|
||||
$('body').append( $textarea );
|
||||
|
||||
// vars
|
||||
var val = this.getNodeValue();
|
||||
|
||||
// open popup
|
||||
wpLink.open( 'acf-link-textarea', val.url, val.title, null );
|
||||
|
||||
},
|
||||
|
||||
onOpen: function(){
|
||||
|
||||
// always show title (WP will hide title if empty)
|
||||
$('#wp-link-wrap').addClass('has-text-field');
|
||||
|
||||
// set inputs
|
||||
var val = this.getNodeValue();
|
||||
this.setInputValue( val );
|
||||
},
|
||||
|
||||
close: function(){
|
||||
wpLink.close();
|
||||
},
|
||||
|
||||
onClose: function(){
|
||||
|
||||
// bail early if no node
|
||||
// needed due to WP triggering this event twice
|
||||
if( !this.has('node') ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// remove events
|
||||
this.off('wplink-open');
|
||||
this.off('wplink-close');
|
||||
|
||||
// set value
|
||||
var val = this.getInputValue();
|
||||
this.setNodeValue( val );
|
||||
|
||||
// remove textarea
|
||||
$('#acf-link-textarea').remove();
|
||||
|
||||
// reset
|
||||
this.set('node', null);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,163 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'oembed',
|
||||
|
||||
events: {
|
||||
'click [data-name="clear-button"]': 'onClickClear',
|
||||
'keypress .input-search': 'onKeypressSearch',
|
||||
'keyup .input-search': 'onKeyupSearch',
|
||||
'change .input-search': 'onChangeSearch'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-oembed');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('.input-value');
|
||||
},
|
||||
|
||||
$search: function(){
|
||||
return this.$('.input-search');
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
return this.$input().val();
|
||||
},
|
||||
|
||||
getSearchVal: function(){
|
||||
return this.$search().val();
|
||||
},
|
||||
|
||||
setValue: function( val ){
|
||||
|
||||
// class
|
||||
if( val ) {
|
||||
this.$control().addClass('has-value');
|
||||
} else {
|
||||
this.$control().removeClass('has-value');
|
||||
}
|
||||
|
||||
acf.val( this.$input(), val );
|
||||
},
|
||||
|
||||
showLoading: function( show ){
|
||||
acf.showLoading( this.$('.canvas') );
|
||||
},
|
||||
|
||||
hideLoading: function(){
|
||||
acf.hideLoading( this.$('.canvas') );
|
||||
},
|
||||
|
||||
maybeSearch: function(){
|
||||
|
||||
// vars
|
||||
var prevUrl = this.val();
|
||||
var url = this.getSearchVal();
|
||||
|
||||
// no value
|
||||
if( !url ) {
|
||||
return this.clear();
|
||||
}
|
||||
|
||||
// fix missing 'http://' - causes the oembed code to error and fail
|
||||
if( url.substr(0, 4) != 'http' ) {
|
||||
url = 'http://' + url;
|
||||
}
|
||||
|
||||
// bail early if no change
|
||||
if( url === prevUrl ) return;
|
||||
|
||||
// clear existing timeout
|
||||
var timeout = this.get('timeout');
|
||||
if( timeout ) {
|
||||
clearTimeout( timeout );
|
||||
}
|
||||
|
||||
// set new timeout
|
||||
var callback = $.proxy(this.search, this, url);
|
||||
this.set('timeout', setTimeout(callback, 300));
|
||||
|
||||
},
|
||||
|
||||
search: function( url ){
|
||||
|
||||
// ajax
|
||||
var ajaxData = {
|
||||
action: 'acf/fields/oembed/search',
|
||||
s: url,
|
||||
field_key: this.get('key')
|
||||
};
|
||||
|
||||
// clear existing timeout
|
||||
var xhr = this.get('xhr');
|
||||
if( xhr ) {
|
||||
xhr.abort();
|
||||
}
|
||||
|
||||
// loading
|
||||
this.showLoading();
|
||||
|
||||
// query
|
||||
var xhr = $.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
success: function( json ){
|
||||
|
||||
// error
|
||||
if( !json || !json.html ) {
|
||||
json = {
|
||||
url: false,
|
||||
html: ''
|
||||
}
|
||||
}
|
||||
|
||||
// update vars
|
||||
this.val( json.url );
|
||||
this.$('.canvas-media').html( json.html );
|
||||
},
|
||||
complete: function(){
|
||||
this.hideLoading();
|
||||
}
|
||||
});
|
||||
|
||||
this.set('xhr', xhr);
|
||||
},
|
||||
|
||||
clear: function(){
|
||||
this.val('');
|
||||
this.$search().val('');
|
||||
this.$('.canvas-media').html('');
|
||||
},
|
||||
|
||||
onClickClear: function( e, $el ){
|
||||
this.clear();
|
||||
},
|
||||
|
||||
onKeypressSearch: function( e, $el ){
|
||||
if( e.which == 13 ) {
|
||||
e.preventDefault();
|
||||
this.maybeSearch();
|
||||
}
|
||||
},
|
||||
|
||||
onKeyupSearch: function( e, $el ){
|
||||
if( $el.val() ) {
|
||||
this.maybeSearch();
|
||||
}
|
||||
},
|
||||
|
||||
onChangeSearch: function( e, $el ){
|
||||
this.maybeSearch();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,9 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.models.SelectField.extend({
|
||||
type: 'page_link',
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,9 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.models.SelectField.extend({
|
||||
type: 'post_object',
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,68 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'radio',
|
||||
|
||||
events: {
|
||||
'click input[type="radio"]': 'onClick',
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-radio-list');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input:checked');
|
||||
},
|
||||
|
||||
$inputText: function(){
|
||||
return this.$('input[type="text"]');
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
var val = this.$input().val();
|
||||
if( val === 'other' && this.get('other_choice') ) {
|
||||
val = this.$inputText().val();
|
||||
}
|
||||
return val;
|
||||
},
|
||||
|
||||
onClick: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var $label = $el.parent('label');
|
||||
var selected = $label.hasClass('selected');
|
||||
var val = $el.val();
|
||||
|
||||
// remove previous selected
|
||||
this.$('.selected').removeClass('selected');
|
||||
|
||||
// add active class
|
||||
$label.addClass('selected');
|
||||
|
||||
// allow null
|
||||
if( this.get('allow_null') && selected ) {
|
||||
$label.removeClass('selected');
|
||||
$el.prop('checked', false).trigger('change');
|
||||
val = false;
|
||||
}
|
||||
|
||||
// other
|
||||
if( this.get('other_choice') ) {
|
||||
|
||||
// enable
|
||||
if( val === 'other' ) {
|
||||
this.$inputText().prop('disabled', false);
|
||||
|
||||
// disable
|
||||
} else {
|
||||
this.$inputText().prop('disabled', true);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,42 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'range',
|
||||
|
||||
events: {
|
||||
'input input[type="range"]': 'onChange',
|
||||
'change input': 'onChange'
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="range"]');
|
||||
},
|
||||
|
||||
$inputAlt: function(){
|
||||
return this.$('input[type="number"]');
|
||||
},
|
||||
|
||||
setValue: function( val ){
|
||||
this.busy = true;
|
||||
|
||||
// Update range input (with change).
|
||||
acf.val( this.$input(), val );
|
||||
|
||||
// Update alt input (without change).
|
||||
// Read in input value to inherit min/max validation.
|
||||
acf.val( this.$inputAlt(), this.$input().val(), true );
|
||||
|
||||
this.busy = false;
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
if( !this.busy ) {
|
||||
this.setValue( $el.val() );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,380 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'relationship',
|
||||
|
||||
events: {
|
||||
'keypress [data-filter]': 'onKeypressFilter',
|
||||
'change [data-filter]': 'onChangeFilter',
|
||||
'keyup [data-filter]': 'onChangeFilter',
|
||||
'click .choices-list .acf-rel-item': 'onClickAdd',
|
||||
'click [data-name="remove_item"]': 'onClickRemove',
|
||||
'mouseover': 'onHover'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-relationship');
|
||||
},
|
||||
|
||||
$list: function( list ) {
|
||||
return this.$('.' + list + '-list');
|
||||
},
|
||||
|
||||
$listItems: function( list ) {
|
||||
return this.$list( list ).find('.acf-rel-item');
|
||||
},
|
||||
|
||||
$listItem: function( list, id ) {
|
||||
return this.$list( list ).find('.acf-rel-item[data-id="' + id + '"]');
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
var val = [];
|
||||
this.$listItems('values').each(function(){
|
||||
val.push( $(this).data('id') );
|
||||
});
|
||||
return val.length ? val : false;
|
||||
},
|
||||
|
||||
newChoice: function( props ){
|
||||
return [
|
||||
'<li>',
|
||||
'<span data-id="' + props.id + '" class="acf-rel-item">' + props.text + '</span>',
|
||||
'</li>'
|
||||
].join('');
|
||||
},
|
||||
|
||||
newValue: function( props ){
|
||||
return [
|
||||
'<li>',
|
||||
'<input type="hidden" name="' + this.getInputName() + '[]" value="' + props.id + '" />',
|
||||
'<span data-id="' + props.id + '" class="acf-rel-item">' + props.text,
|
||||
'<a href="#" class="acf-icon -minus small dark" data-name="remove_item"></a>',
|
||||
'</span>',
|
||||
'</li>'
|
||||
].join('');
|
||||
},
|
||||
|
||||
addSortable: function( self ){
|
||||
|
||||
// sortable
|
||||
this.$list('values').sortable({
|
||||
items: 'li',
|
||||
forceHelperSize: true,
|
||||
forcePlaceholderSize: true,
|
||||
scroll: true,
|
||||
update: function(){
|
||||
self.$input().trigger('change');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// scroll
|
||||
var onScroll = this.proxy(function(e){
|
||||
|
||||
// bail early if no more results
|
||||
if( this.get('loading') || !this.get('more') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Scrolled to bottom
|
||||
var $list = this.$list('choices');
|
||||
var scrollTop = Math.ceil( $list.scrollTop() );
|
||||
var scrollHeight = Math.ceil( $list[0].scrollHeight );
|
||||
var innerHeight = Math.ceil( $list.innerHeight() );
|
||||
var paged = this.get('paged') || 1;
|
||||
if( (scrollTop + innerHeight) >= scrollHeight ) {
|
||||
|
||||
// update paged
|
||||
this.set('paged', (paged+1));
|
||||
|
||||
// fetch
|
||||
this.fetch();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
this.$list('choices').scrollTop(0).on('scroll', onScroll);
|
||||
|
||||
// fetch
|
||||
this.fetch();
|
||||
},
|
||||
|
||||
onHover: function( e ){
|
||||
|
||||
// only once
|
||||
$().off(e);
|
||||
|
||||
// add sortable
|
||||
this.addSortable( this );
|
||||
},
|
||||
|
||||
onKeypressFilter: function( e, $el ){
|
||||
|
||||
// don't submit form
|
||||
if( e.which == 13 ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
onChangeFilter: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var val = $el.val();
|
||||
var filter = $el.data('filter');
|
||||
|
||||
// Bail early if filter has not changed
|
||||
if( this.get(filter) === val ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// update attr
|
||||
this.set(filter, val);
|
||||
|
||||
// reset paged
|
||||
this.set('paged', 1);
|
||||
|
||||
// fetch
|
||||
if( $el.is('select') ) {
|
||||
this.fetch();
|
||||
|
||||
// search must go through timeout
|
||||
} else {
|
||||
this.maybeFetch();
|
||||
}
|
||||
},
|
||||
|
||||
onClickAdd: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var val = this.val();
|
||||
var max = parseInt( this.get('max') );
|
||||
|
||||
// can be added?
|
||||
if( $el.hasClass('disabled') ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// validate
|
||||
if( max > 0 && val && val.length >= max ) {
|
||||
|
||||
// add notice
|
||||
this.showNotice({
|
||||
text: acf.__('Maximum values reached ( {max} values )').replace('{max}', max),
|
||||
type: 'warning'
|
||||
});
|
||||
return false;
|
||||
}
|
||||
|
||||
// disable
|
||||
$el.addClass('disabled');
|
||||
|
||||
// add
|
||||
var html = this.newValue({
|
||||
id: $el.data('id'),
|
||||
text: $el.html()
|
||||
});
|
||||
this.$list('values').append( html )
|
||||
|
||||
// trigger change
|
||||
this.$input().trigger('change');
|
||||
},
|
||||
|
||||
onClickRemove: function( e, $el ){
|
||||
|
||||
// Prevent default here because generic handler wont be triggered.
|
||||
e.preventDefault();
|
||||
|
||||
// vars
|
||||
var $span = $el.parent();
|
||||
var $li = $span.parent();
|
||||
var id = $span.data('id');
|
||||
|
||||
// remove value
|
||||
$li.remove();
|
||||
|
||||
// show choice
|
||||
this.$listItem('choices', id).removeClass('disabled');
|
||||
|
||||
// trigger change
|
||||
this.$input().trigger('change');
|
||||
},
|
||||
|
||||
maybeFetch: function(){
|
||||
|
||||
// vars
|
||||
var timeout = this.get('timeout');
|
||||
|
||||
// abort timeout
|
||||
if( timeout ) {
|
||||
clearTimeout( timeout );
|
||||
}
|
||||
|
||||
// fetch
|
||||
timeout = this.setTimeout(this.fetch, 300);
|
||||
this.set('timeout', timeout);
|
||||
},
|
||||
|
||||
getAjaxData: function(){
|
||||
|
||||
// load data based on element attributes
|
||||
var ajaxData = this.$control().data();
|
||||
for( var name in ajaxData ) {
|
||||
ajaxData[ name ] = this.get( name );
|
||||
}
|
||||
|
||||
// extra
|
||||
ajaxData.action = 'acf/fields/relationship/query';
|
||||
ajaxData.field_key = this.get('key');
|
||||
|
||||
// Filter.
|
||||
ajaxData = acf.applyFilters( 'relationship_ajax_data', ajaxData, this );
|
||||
|
||||
// return
|
||||
return ajaxData;
|
||||
},
|
||||
|
||||
fetch: function(){
|
||||
|
||||
// abort XHR if this field is already loading AJAX data
|
||||
var xhr = this.get('xhr');
|
||||
if( xhr ) {
|
||||
xhr.abort();
|
||||
}
|
||||
|
||||
// add to this.o
|
||||
var ajaxData = this.getAjaxData();
|
||||
|
||||
// clear html if is new query
|
||||
var $choiceslist = this.$list( 'choices' );
|
||||
if( ajaxData.paged == 1 ) {
|
||||
$choiceslist.html('');
|
||||
}
|
||||
|
||||
// loading
|
||||
var $loading = $('<li><i class="acf-loading"></i> ' + acf.__('Loading') + '</li>');
|
||||
$choiceslist.append($loading);
|
||||
this.set('loading', true);
|
||||
|
||||
// callback
|
||||
var onComplete = function(){
|
||||
this.set('loading', false);
|
||||
$loading.remove();
|
||||
};
|
||||
|
||||
var onSuccess = function( json ){
|
||||
|
||||
// no results
|
||||
if( !json || !json.results || !json.results.length ) {
|
||||
|
||||
// prevent pagination
|
||||
this.set('more', false);
|
||||
|
||||
// add message
|
||||
if( this.get('paged') == 1 ) {
|
||||
this.$list('choices').append('<li>' + acf.__('No matches found') + '</li>');
|
||||
}
|
||||
|
||||
// return
|
||||
return;
|
||||
}
|
||||
|
||||
// set more (allows pagination scroll)
|
||||
this.set('more', json.more );
|
||||
|
||||
// get new results
|
||||
var html = this.walkChoices(json.results);
|
||||
var $html = $( html );
|
||||
|
||||
// apply .disabled to left li's
|
||||
var val = this.val();
|
||||
if( val && val.length ) {
|
||||
val.map(function( id ){
|
||||
$html.find('.acf-rel-item[data-id="' + id + '"]').addClass('disabled');
|
||||
});
|
||||
}
|
||||
|
||||
// append
|
||||
$choiceslist.append( $html );
|
||||
|
||||
// merge together groups
|
||||
var $prevLabel = false;
|
||||
var $prevList = false;
|
||||
|
||||
$choiceslist.find('.acf-rel-label').each(function(){
|
||||
|
||||
var $label = $(this);
|
||||
var $list = $label.siblings('ul');
|
||||
|
||||
if( $prevLabel && $prevLabel.text() == $label.text() ) {
|
||||
$prevList.append( $list.children() );
|
||||
$(this).parent().remove();
|
||||
return;
|
||||
}
|
||||
|
||||
// update vars
|
||||
$prevLabel = $label;
|
||||
$prevList = $list;
|
||||
});
|
||||
};
|
||||
|
||||
// get results
|
||||
var xhr = $.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
context: this,
|
||||
success: onSuccess,
|
||||
complete: onComplete
|
||||
});
|
||||
|
||||
// set
|
||||
this.set('xhr', xhr);
|
||||
},
|
||||
|
||||
walkChoices: function( data ){
|
||||
|
||||
// walker
|
||||
var walk = function( data ){
|
||||
|
||||
// vars
|
||||
var html = '';
|
||||
|
||||
// is array
|
||||
if( $.isArray(data) ) {
|
||||
data.map(function(item){
|
||||
html += walk( item );
|
||||
});
|
||||
|
||||
// is item
|
||||
} else if( $.isPlainObject(data) ) {
|
||||
|
||||
// group
|
||||
if( data.children !== undefined ) {
|
||||
|
||||
html += '<li><span class="acf-rel-label">' + data.text + '</span><ul class="acf-bl">';
|
||||
html += walk( data.children );
|
||||
html += '</ul></li>';
|
||||
|
||||
// single
|
||||
} else {
|
||||
html += '<li><span class="acf-rel-item" data-id="' + data.id + '">' + data.text + '</span></li>';
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return html;
|
||||
};
|
||||
|
||||
return walk( data );
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,57 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'select',
|
||||
|
||||
select2: false,
|
||||
|
||||
wait: 'load',
|
||||
|
||||
events: {
|
||||
'removeField': 'onRemove'
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('select');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $select = this.$input();
|
||||
|
||||
// inherit data
|
||||
this.inherit( $select );
|
||||
|
||||
// select2
|
||||
if( this.get('ui') ) {
|
||||
|
||||
// populate ajax_data (allowing custom attribute to already exist)
|
||||
var ajaxAction = this.get('ajax_action');
|
||||
if( !ajaxAction ) {
|
||||
ajaxAction = 'acf/fields/' + this.get('type') + '/query';
|
||||
}
|
||||
|
||||
// select2
|
||||
this.select2 = acf.newSelect2($select, {
|
||||
field: this,
|
||||
ajax: this.get('ajax'),
|
||||
multiple: this.get('multiple'),
|
||||
placeholder: this.get('placeholder'),
|
||||
allowNull: this.get('allow_null'),
|
||||
ajaxAction: ajaxAction,
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
onRemove: function(){
|
||||
if( this.select2 ) {
|
||||
this.select2.destroy();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,505 @@
|
||||
(function($, undefined){
|
||||
|
||||
// vars
|
||||
var CONTEXT = 'tab';
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'tab',
|
||||
|
||||
wait: '',
|
||||
|
||||
tabs: false,
|
||||
|
||||
tab: false,
|
||||
|
||||
findFields: function(){
|
||||
return this.$el.nextUntil('.acf-field-tab', '.acf-field');
|
||||
},
|
||||
|
||||
getFields: function(){
|
||||
return acf.getFields( this.findFields() );
|
||||
},
|
||||
|
||||
findTabs: function(){
|
||||
return this.$el.prevAll('.acf-tab-wrap:first');
|
||||
},
|
||||
|
||||
findTab: function(){
|
||||
return this.$('.acf-tab-button');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// bail early if is td
|
||||
if( this.$el.is('td') ) {
|
||||
this.events = {};
|
||||
return false;
|
||||
}
|
||||
|
||||
// vars
|
||||
var $tabs = this.findTabs();
|
||||
var $tab = this.findTab();
|
||||
var settings = acf.parseArgs($tab.data(), {
|
||||
endpoint: false,
|
||||
placement: '',
|
||||
before: this.$el
|
||||
});
|
||||
|
||||
// create wrap
|
||||
if( !$tabs.length || settings.endpoint ) {
|
||||
this.tabs = new Tabs( settings );
|
||||
} else {
|
||||
this.tabs = $tabs.data('acf');
|
||||
}
|
||||
|
||||
// add tab
|
||||
this.tab = this.tabs.addTab($tab, this);
|
||||
},
|
||||
|
||||
isActive: function(){
|
||||
return this.tab.isActive();
|
||||
},
|
||||
|
||||
showFields: function(){
|
||||
|
||||
// show fields
|
||||
this.getFields().map(function( field ){
|
||||
field.show( this.cid, CONTEXT );
|
||||
field.hiddenByTab = false;
|
||||
}, this);
|
||||
|
||||
},
|
||||
|
||||
hideFields: function(){
|
||||
|
||||
// hide fields
|
||||
this.getFields().map(function( field ){
|
||||
field.hide( this.cid, CONTEXT );
|
||||
field.hiddenByTab = this.tab;
|
||||
}, this);
|
||||
|
||||
},
|
||||
|
||||
show: function( lockKey ){
|
||||
|
||||
// show field and store result
|
||||
var visible = acf.Field.prototype.show.apply(this, arguments);
|
||||
|
||||
// check if now visible
|
||||
if( visible ) {
|
||||
|
||||
// show tab
|
||||
this.tab.show();
|
||||
|
||||
// check active tabs
|
||||
this.tabs.refresh();
|
||||
}
|
||||
|
||||
// return
|
||||
return visible;
|
||||
},
|
||||
|
||||
hide: function( lockKey ){
|
||||
|
||||
// hide field and store result
|
||||
var hidden = acf.Field.prototype.hide.apply(this, arguments);
|
||||
|
||||
// check if now hidden
|
||||
if( hidden ) {
|
||||
|
||||
// hide tab
|
||||
this.tab.hide();
|
||||
|
||||
// reset tabs if this was active
|
||||
if( this.isActive() ) {
|
||||
this.tabs.reset();
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return hidden;
|
||||
},
|
||||
|
||||
enable: function( lockKey ){
|
||||
|
||||
// enable fields
|
||||
this.getFields().map(function( field ){
|
||||
field.enable( CONTEXT );
|
||||
});
|
||||
},
|
||||
|
||||
disable: function( lockKey ){
|
||||
|
||||
// disable fields
|
||||
this.getFields().map(function( field ){
|
||||
field.disable( CONTEXT );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
|
||||
/**
|
||||
* tabs
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 8/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var i = 0;
|
||||
var Tabs = acf.Model.extend({
|
||||
|
||||
tabs: [],
|
||||
|
||||
active: false,
|
||||
|
||||
actions: {
|
||||
'refresh': 'onRefresh'
|
||||
},
|
||||
|
||||
data: {
|
||||
before: false,
|
||||
placement: 'top',
|
||||
index: 0,
|
||||
initialized: false,
|
||||
},
|
||||
|
||||
setup: function( settings ){
|
||||
|
||||
// data
|
||||
$.extend(this.data, settings);
|
||||
|
||||
// define this prop to avoid scope issues
|
||||
this.tabs = [];
|
||||
this.active = false;
|
||||
|
||||
// vars
|
||||
var placement = this.get('placement');
|
||||
var $before = this.get('before');
|
||||
var $parent = $before.parent();
|
||||
|
||||
// add sidebar for left placement
|
||||
if( placement == 'left' && $parent.hasClass('acf-fields') ) {
|
||||
$parent.addClass('-sidebar');
|
||||
}
|
||||
|
||||
// create wrap
|
||||
if( $before.is('tr') ) {
|
||||
this.$el = $('<tr class="acf-tab-wrap"><td colspan="2"><ul class="acf-hl acf-tab-group"></ul></td></tr>');
|
||||
} else {
|
||||
this.$el = $('<div class="acf-tab-wrap -' + placement + '"><ul class="acf-hl acf-tab-group"></ul></div>');
|
||||
}
|
||||
|
||||
// append
|
||||
$before.before( this.$el );
|
||||
|
||||
// set index
|
||||
this.set('index', i, true);
|
||||
i++;
|
||||
},
|
||||
|
||||
initializeTabs: function(){
|
||||
|
||||
// find first visible tab
|
||||
var tab = this.getVisible().shift();
|
||||
|
||||
// remember previous tab state
|
||||
var order = acf.getPreference('this.tabs') || [];
|
||||
var groupIndex = this.get('index');
|
||||
var tabIndex = order[ groupIndex ];
|
||||
|
||||
if( this.tabs[ tabIndex ] && this.tabs[ tabIndex ].isVisible() ) {
|
||||
tab = this.tabs[ tabIndex ];
|
||||
}
|
||||
|
||||
// select
|
||||
if( tab ) {
|
||||
this.selectTab( tab );
|
||||
} else {
|
||||
this.closeTabs();
|
||||
}
|
||||
|
||||
// set local variable used by tabsManager
|
||||
this.set('initialized', true);
|
||||
},
|
||||
|
||||
getVisible: function(){
|
||||
return this.tabs.filter(function( tab ){
|
||||
return tab.isVisible();
|
||||
});
|
||||
},
|
||||
|
||||
getActive: function(){
|
||||
return this.active;
|
||||
},
|
||||
|
||||
setActive: function( tab ){
|
||||
return this.active = tab;
|
||||
},
|
||||
|
||||
hasActive: function(){
|
||||
return (this.active !== false);
|
||||
},
|
||||
|
||||
isActive: function( tab ){
|
||||
var active = this.getActive();
|
||||
return (active && active.cid === tab.cid);
|
||||
},
|
||||
|
||||
closeActive: function(){
|
||||
if( this.hasActive() ) {
|
||||
this.closeTab( this.getActive() );
|
||||
}
|
||||
},
|
||||
|
||||
openTab: function( tab ){
|
||||
|
||||
// close existing tab
|
||||
this.closeActive();
|
||||
|
||||
// open
|
||||
tab.open();
|
||||
|
||||
// set active
|
||||
this.setActive( tab );
|
||||
},
|
||||
|
||||
closeTab: function( tab ){
|
||||
|
||||
// close
|
||||
tab.close();
|
||||
|
||||
// set active
|
||||
this.setActive( false );
|
||||
},
|
||||
|
||||
closeTabs: function(){
|
||||
this.tabs.map( this.closeTab, this );
|
||||
},
|
||||
|
||||
selectTab: function( tab ){
|
||||
|
||||
// close other tabs
|
||||
this.tabs.map(function( t ){
|
||||
if( tab.cid !== t.cid ) {
|
||||
this.closeTab( t );
|
||||
}
|
||||
}, this);
|
||||
|
||||
// open
|
||||
this.openTab( tab );
|
||||
|
||||
},
|
||||
|
||||
addTab: function( $a, field ){
|
||||
|
||||
// create <li>
|
||||
var $li = $('<li></li>');
|
||||
|
||||
// append <a>
|
||||
$li.append( $a );
|
||||
|
||||
// append
|
||||
this.$('ul').append( $li );
|
||||
|
||||
// initialize
|
||||
var tab = new Tab({
|
||||
$el: $li,
|
||||
field: field,
|
||||
group: this,
|
||||
});
|
||||
|
||||
// store
|
||||
this.tabs.push( tab );
|
||||
|
||||
// return
|
||||
return tab;
|
||||
},
|
||||
|
||||
reset: function(){
|
||||
|
||||
// close existing tab
|
||||
this.closeActive();
|
||||
|
||||
// find and active a tab
|
||||
return this.refresh();
|
||||
},
|
||||
|
||||
refresh: function(){
|
||||
|
||||
// bail early if active already exists
|
||||
if( this.hasActive() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// find next active tab
|
||||
var tab = this.getVisible().shift();
|
||||
|
||||
// open tab
|
||||
if( tab ) {
|
||||
this.openTab( tab );
|
||||
}
|
||||
|
||||
// return
|
||||
return tab;
|
||||
},
|
||||
|
||||
onRefresh: function(){
|
||||
|
||||
// only for left placements
|
||||
if( this.get('placement') !== 'left' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var $parent = this.$el.parent();
|
||||
var $list = this.$el.children('ul');
|
||||
var attribute = $parent.is('td') ? 'height' : 'min-height';
|
||||
|
||||
// find height (minus 1 for border-bottom)
|
||||
var height = $list.position().top + $list.outerHeight(true) - 1;
|
||||
|
||||
// add css
|
||||
$parent.css(attribute, height);
|
||||
}
|
||||
});
|
||||
|
||||
var Tab = acf.Model.extend({
|
||||
|
||||
group: false,
|
||||
|
||||
field: false,
|
||||
|
||||
events: {
|
||||
'click a': 'onClick'
|
||||
},
|
||||
|
||||
index: function(){
|
||||
return this.$el.index();
|
||||
},
|
||||
|
||||
isVisible: function(){
|
||||
return acf.isVisible( this.$el );
|
||||
},
|
||||
|
||||
isActive: function(){
|
||||
return this.$el.hasClass('active');
|
||||
},
|
||||
|
||||
open: function(){
|
||||
|
||||
// add class
|
||||
this.$el.addClass('active');
|
||||
|
||||
// show field
|
||||
this.field.showFields();
|
||||
},
|
||||
|
||||
close: function(){
|
||||
|
||||
// remove class
|
||||
this.$el.removeClass('active');
|
||||
|
||||
// hide field
|
||||
this.field.hideFields();
|
||||
},
|
||||
|
||||
onClick: function( e, $el ){
|
||||
|
||||
// prevent default
|
||||
e.preventDefault();
|
||||
|
||||
// toggle
|
||||
this.toggle();
|
||||
},
|
||||
|
||||
toggle: function(){
|
||||
|
||||
// bail early if already active
|
||||
if( this.isActive() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// toggle this tab
|
||||
this.group.openTab( this );
|
||||
}
|
||||
});
|
||||
|
||||
var tabsManager = new acf.Model({
|
||||
|
||||
priority: 50,
|
||||
|
||||
actions: {
|
||||
'prepare': 'render',
|
||||
'append': 'render',
|
||||
'unload': 'onUnload',
|
||||
'invalid_field': 'onInvalidField'
|
||||
},
|
||||
|
||||
findTabs: function(){
|
||||
return $('.acf-tab-wrap');
|
||||
},
|
||||
|
||||
getTabs: function(){
|
||||
return acf.getInstances( this.findTabs() );
|
||||
},
|
||||
|
||||
render: function( $el ){
|
||||
this.getTabs().map(function( tabs ){
|
||||
if( !tabs.get('initialized') ) {
|
||||
tabs.initializeTabs();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onInvalidField: function( field ){
|
||||
|
||||
// bail early if busy
|
||||
if( this.busy ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// ignore if not hidden by tab
|
||||
if( !field.hiddenByTab ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// toggle tab
|
||||
field.hiddenByTab.toggle();
|
||||
|
||||
// ignore other invalid fields
|
||||
this.busy = true;
|
||||
this.setTimeout(function(){
|
||||
this.busy = false;
|
||||
}, 100);
|
||||
},
|
||||
|
||||
onUnload: function(){
|
||||
|
||||
// vars
|
||||
var order = [];
|
||||
|
||||
// loop
|
||||
this.getTabs().map(function( group ){
|
||||
var active = group.hasActive() ? group.getActive().index() : 0;
|
||||
order.push(active);
|
||||
});
|
||||
|
||||
// bail if no tabs
|
||||
if( !order.length ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// update
|
||||
acf.setPreference('this.tabs', order);
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,321 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'taxonomy',
|
||||
|
||||
data: {
|
||||
'ftype': 'select'
|
||||
},
|
||||
|
||||
select2: false,
|
||||
|
||||
wait: 'load',
|
||||
|
||||
events: {
|
||||
'click a[data-name="add"]': 'onClickAdd',
|
||||
'click input[type="radio"]': 'onClickRadio',
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-taxonomy-field');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.getRelatedPrototype().$input.apply(this, arguments);
|
||||
},
|
||||
|
||||
getRelatedType: function(){
|
||||
|
||||
// vars
|
||||
var fieldType = this.get('ftype');
|
||||
|
||||
// normalize
|
||||
if( fieldType == 'multi_select' ) {
|
||||
fieldType = 'select';
|
||||
}
|
||||
|
||||
// return
|
||||
return fieldType;
|
||||
|
||||
},
|
||||
|
||||
getRelatedPrototype: function(){
|
||||
return acf.getFieldType( this.getRelatedType() ).prototype;
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
return this.getRelatedPrototype().getValue.apply(this, arguments);
|
||||
},
|
||||
|
||||
setValue: function(){
|
||||
return this.getRelatedPrototype().setValue.apply(this, arguments);
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
this.getRelatedPrototype().initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
onRemove: function(){
|
||||
if( this.select2 ) {
|
||||
this.select2.destroy();
|
||||
}
|
||||
},
|
||||
|
||||
onClickAdd: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var field = this;
|
||||
var popup = false;
|
||||
var $form = false;
|
||||
var $name = false;
|
||||
var $parent = false;
|
||||
var $button = false;
|
||||
var $message = false;
|
||||
var notice = false;
|
||||
|
||||
// step 1.
|
||||
var step1 = function(){
|
||||
|
||||
// popup
|
||||
popup = acf.newPopup({
|
||||
title: $el.attr('title'),
|
||||
loading: true,
|
||||
width: '300px'
|
||||
});
|
||||
|
||||
// ajax
|
||||
var ajaxData = {
|
||||
action: 'acf/fields/taxonomy/add_term',
|
||||
field_key: field.get('key')
|
||||
};
|
||||
|
||||
// get HTML
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
type: 'post',
|
||||
dataType: 'html',
|
||||
success: step2
|
||||
});
|
||||
};
|
||||
|
||||
// step 2.
|
||||
var step2 = function( html ){
|
||||
|
||||
// update popup
|
||||
popup.loading(false);
|
||||
popup.content(html);
|
||||
|
||||
// vars
|
||||
$form = popup.$('form');
|
||||
$name = popup.$('input[name="term_name"]');
|
||||
$parent = popup.$('select[name="term_parent"]');
|
||||
$button = popup.$('.acf-submit-button');
|
||||
|
||||
// focus
|
||||
$name.focus();
|
||||
|
||||
// submit form
|
||||
popup.on('submit', 'form', step3);
|
||||
};
|
||||
|
||||
// step 3.
|
||||
var step3 = function( e, $el ){
|
||||
|
||||
// prevent
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
// basic validation
|
||||
if( $name.val() === '' ) {
|
||||
$name.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
// disable
|
||||
acf.startButtonLoading( $button );
|
||||
|
||||
// ajax
|
||||
var ajaxData = {
|
||||
action: 'acf/fields/taxonomy/add_term',
|
||||
field_key: field.get('key'),
|
||||
term_name: $name.val(),
|
||||
term_parent: $parent.length ? $parent.val() : 0
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
success: step4
|
||||
});
|
||||
};
|
||||
|
||||
// step 4.
|
||||
var step4 = function( json ){
|
||||
|
||||
// enable
|
||||
acf.stopButtonLoading( $button );
|
||||
|
||||
// remove prev notice
|
||||
if( notice ) {
|
||||
notice.remove();
|
||||
}
|
||||
|
||||
// success
|
||||
if( acf.isAjaxSuccess(json) ) {
|
||||
|
||||
// clear name
|
||||
$name.val('');
|
||||
|
||||
// update term lists
|
||||
step5( json.data );
|
||||
|
||||
// notice
|
||||
notice = acf.newNotice({
|
||||
type: 'success',
|
||||
text: acf.getAjaxMessage(json),
|
||||
target: $form,
|
||||
timeout: 2000,
|
||||
dismiss: false
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
// notice
|
||||
notice = acf.newNotice({
|
||||
type: 'error',
|
||||
text: acf.getAjaxError(json),
|
||||
target: $form,
|
||||
timeout: 2000,
|
||||
dismiss: false
|
||||
});
|
||||
}
|
||||
|
||||
// focus
|
||||
$name.focus();
|
||||
};
|
||||
|
||||
// step 5.
|
||||
var step5 = function( term ){
|
||||
|
||||
// update parent dropdown
|
||||
var $option = $('<option value="' + term.term_id + '">' + term.term_label + '</option>');
|
||||
if( term.term_parent ) {
|
||||
$parent.children('option[value="' + term.term_parent + '"]').after( $option );
|
||||
} else {
|
||||
$parent.append( $option );
|
||||
}
|
||||
|
||||
// add this new term to all taxonomy field
|
||||
var fields = acf.getFields({
|
||||
type: 'taxonomy'
|
||||
});
|
||||
|
||||
fields.map(function( otherField ){
|
||||
if( otherField.get('taxonomy') == field.get('taxonomy') ) {
|
||||
otherField.appendTerm( term );
|
||||
}
|
||||
});
|
||||
|
||||
// select
|
||||
field.selectTerm( term.term_id );
|
||||
};
|
||||
|
||||
// run
|
||||
step1();
|
||||
},
|
||||
|
||||
appendTerm: function( term ){
|
||||
|
||||
if( this.getRelatedType() == 'select' ) {
|
||||
this.appendTermSelect( term );
|
||||
} else {
|
||||
this.appendTermCheckbox( term );
|
||||
}
|
||||
},
|
||||
|
||||
appendTermSelect: function( term ){
|
||||
|
||||
this.select2.addOption({
|
||||
id: term.term_id,
|
||||
text: term.term_label
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
appendTermCheckbox: function( term ){
|
||||
|
||||
// vars
|
||||
var name = this.$('[name]:first').attr('name');
|
||||
var $ul = this.$('ul:first');
|
||||
|
||||
// allow multiple selection
|
||||
if( this.getRelatedType() == 'checkbox' ) {
|
||||
name += '[]';
|
||||
}
|
||||
|
||||
// create new li
|
||||
var $li = $([
|
||||
'<li data-id="' + term.term_id + '">',
|
||||
'<label>',
|
||||
'<input type="' + this.get('ftype') + '" value="' + term.term_id + '" name="' + name + '" /> ',
|
||||
'<span>' + term.term_name + '</span>',
|
||||
'</label>',
|
||||
'</li>'
|
||||
].join(''));
|
||||
|
||||
// find parent
|
||||
if( term.term_parent ) {
|
||||
|
||||
// vars
|
||||
var $parent = $ul.find('li[data-id="' + term.term_parent + '"]');
|
||||
|
||||
// update vars
|
||||
$ul = $parent.children('ul');
|
||||
|
||||
// create ul
|
||||
if( !$ul.exists() ) {
|
||||
$ul = $('<ul class="children acf-bl"></ul>');
|
||||
$parent.append( $ul );
|
||||
}
|
||||
}
|
||||
|
||||
// append
|
||||
$ul.append( $li );
|
||||
},
|
||||
|
||||
selectTerm: function( id ){
|
||||
if( this.getRelatedType() == 'select' ) {
|
||||
this.select2.selectOption( id );
|
||||
} else {
|
||||
var $input = this.$('input[value="' + id + '"]');
|
||||
$input.prop('checked', true).trigger('change');
|
||||
}
|
||||
},
|
||||
|
||||
onClickRadio: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var $label = $el.parent('label');
|
||||
var selected = $label.hasClass('selected');
|
||||
|
||||
// remove previous selected
|
||||
this.$('.selected').removeClass('selected');
|
||||
|
||||
// add active class
|
||||
$label.addClass('selected');
|
||||
|
||||
// allow null
|
||||
if( this.get('allow_null') && selected ) {
|
||||
$label.removeClass('selected');
|
||||
$el.prop('checked', false).trigger('change');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,77 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.models.DatePickerField.extend({
|
||||
|
||||
type: 'time_picker',
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-time-picker');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $input = this.$input();
|
||||
var $inputText = this.$inputText();
|
||||
|
||||
// args
|
||||
var args = {
|
||||
timeFormat: this.get('time_format'),
|
||||
altField: $input,
|
||||
altFieldTimeOnly: false,
|
||||
altTimeFormat: 'HH:mm:ss',
|
||||
showButtonPanel: true,
|
||||
controlType: 'select',
|
||||
oneLine: true,
|
||||
closeText: acf.get('dateTimePickerL10n').selectText,
|
||||
timeOnly: true,
|
||||
};
|
||||
|
||||
// add custom 'Close = Select' functionality
|
||||
args.onClose = function( value, dp_instance, t_instance ){
|
||||
|
||||
// vars
|
||||
var $close = dp_instance.dpDiv.find('.ui-datepicker-close');
|
||||
|
||||
// if clicking close button
|
||||
if( !value && $close.is(':hover') ) {
|
||||
t_instance._updateDateTime();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// filter
|
||||
args = acf.applyFilters('time_picker_args', args, this);
|
||||
|
||||
// add date time picker
|
||||
acf.newTimePicker( $inputText, args );
|
||||
|
||||
// action
|
||||
acf.doAction('time_picker_init', $inputText, args, this);
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
|
||||
// add
|
||||
acf.newTimePicker = function( $input, args ){
|
||||
|
||||
// bail ealry if no datepicker library
|
||||
if( typeof $.timepicker === 'undefined' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// defaults
|
||||
args = args || {};
|
||||
|
||||
// initialize
|
||||
$input.timepicker( args );
|
||||
|
||||
// wrap the datepicker (only if it hasn't already been wrapped)
|
||||
if( $('body > #ui-datepicker-div').exists() ) {
|
||||
$('body > #ui-datepicker-div').wrap('<div class="acf-ui-datepicker" />');
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,95 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'true_false',
|
||||
|
||||
events: {
|
||||
'change .acf-switch-input': 'onChange',
|
||||
'focus .acf-switch-input': 'onFocus',
|
||||
'blur .acf-switch-input': 'onBlur',
|
||||
'keypress .acf-switch-input': 'onKeypress'
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="checkbox"]');
|
||||
},
|
||||
|
||||
$switch: function(){
|
||||
return this.$('.acf-switch');
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
return this.$input().prop('checked') ? 1 : 0;
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
this.render();
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// vars
|
||||
var $switch = this.$switch();
|
||||
|
||||
// bail ealry if no $switch
|
||||
if( !$switch.length ) return;
|
||||
|
||||
// vars
|
||||
var $on = $switch.children('.acf-switch-on');
|
||||
var $off = $switch.children('.acf-switch-off');
|
||||
var width = Math.max( $on.width(), $off.width() );
|
||||
|
||||
// bail ealry if no width
|
||||
if( !width ) return;
|
||||
|
||||
// set widths
|
||||
$on.css( 'min-width', width );
|
||||
$off.css( 'min-width', width );
|
||||
|
||||
},
|
||||
|
||||
switchOn: function() {
|
||||
this.$input().prop('checked', true);
|
||||
this.$switch().addClass('-on');
|
||||
},
|
||||
|
||||
switchOff: function() {
|
||||
this.$input().prop('checked', false);
|
||||
this.$switch().removeClass('-on');
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
if( $el.prop('checked') ) {
|
||||
this.switchOn();
|
||||
} else {
|
||||
this.switchOff();
|
||||
}
|
||||
},
|
||||
|
||||
onFocus: function( e, $el ){
|
||||
this.$switch().addClass('-focus');
|
||||
},
|
||||
|
||||
onBlur: function( e, $el ){
|
||||
this.$switch().removeClass('-focus');
|
||||
},
|
||||
|
||||
onKeypress: function( e, $el ){
|
||||
|
||||
// left
|
||||
if( e.keyCode === 37 ) {
|
||||
return this.switchOff();
|
||||
}
|
||||
|
||||
// right
|
||||
if( e.keyCode === 39 ) {
|
||||
return this.switchOn();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,64 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'url',
|
||||
|
||||
events: {
|
||||
'keyup input[type="url"]': 'onkeyup'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-input-wrap');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('input[type="url"]');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
this.render();
|
||||
},
|
||||
|
||||
isValid: function(){
|
||||
|
||||
// vars
|
||||
var val = this.val();
|
||||
|
||||
// bail early if no val
|
||||
if( !val ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// url
|
||||
if( val.indexOf('://') !== -1 ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// protocol relative url
|
||||
if( val.indexOf('//') === 0 ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// return
|
||||
return false;
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// add class
|
||||
if( this.isValid() ) {
|
||||
this.$control().addClass('-valid');
|
||||
} else {
|
||||
this.$control().removeClass('-valid');
|
||||
}
|
||||
},
|
||||
|
||||
onkeyup: function( e, $el ){
|
||||
this.render();
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,9 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.models.SelectField.extend({
|
||||
type: 'user',
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,102 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Field = acf.Field.extend({
|
||||
|
||||
type: 'wysiwyg',
|
||||
|
||||
wait: 'load',
|
||||
|
||||
events: {
|
||||
'mousedown .acf-editor-wrap.delay': 'onMousedown',
|
||||
'unmountField': 'disableEditor',
|
||||
'remountField': 'enableEditor',
|
||||
'removeField': 'disableEditor'
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.acf-editor-wrap');
|
||||
},
|
||||
|
||||
$input: function(){
|
||||
return this.$('textarea');
|
||||
},
|
||||
|
||||
getMode: function(){
|
||||
return this.$control().hasClass('tmce-active') ? 'visual' : 'text';
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// initializeEditor if no delay
|
||||
if( !this.$control().hasClass('delay') ) {
|
||||
this.initializeEditor();
|
||||
}
|
||||
},
|
||||
|
||||
initializeEditor: function(){
|
||||
|
||||
// vars
|
||||
var $wrap = this.$control();
|
||||
var $textarea = this.$input();
|
||||
var args = {
|
||||
tinymce: true,
|
||||
quicktags: true,
|
||||
toolbar: this.get('toolbar'),
|
||||
mode: this.getMode(),
|
||||
field: this
|
||||
};
|
||||
|
||||
// generate new id
|
||||
var oldId = $textarea.attr('id');
|
||||
var newId = acf.uniqueId('acf-editor-');
|
||||
|
||||
// store copy of textarea data
|
||||
var data = $textarea.data();
|
||||
|
||||
// rename
|
||||
acf.rename({
|
||||
target: $wrap,
|
||||
search: oldId,
|
||||
replace: newId,
|
||||
destructive: true
|
||||
});
|
||||
|
||||
// update id
|
||||
this.set('id', newId, true);
|
||||
|
||||
// initialize
|
||||
acf.tinymce.initialize( newId, args );
|
||||
|
||||
// apply data to new textarea (acf.rename creates a new textarea element due to destructive mode)
|
||||
// fixes bug where conditional logic "disabled" is lost during "screen_check"
|
||||
this.$input().data(data);
|
||||
},
|
||||
|
||||
onMousedown: function( e ){
|
||||
|
||||
// prevent default
|
||||
e.preventDefault();
|
||||
|
||||
// remove delay class
|
||||
var $wrap = this.$control();
|
||||
$wrap.removeClass('delay');
|
||||
$wrap.find('.acf-editor-toolbar').remove();
|
||||
|
||||
// initialize
|
||||
this.initializeEditor();
|
||||
},
|
||||
|
||||
enableEditor: function(){
|
||||
if( this.getMode() == 'visual' ) {
|
||||
acf.tinymce.enable( this.get('id') );
|
||||
}
|
||||
},
|
||||
|
||||
disableEditor: function(){
|
||||
acf.tinymce.destroy( this.get('id') );
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldType( Field );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,524 @@
|
||||
(function($, undefined){
|
||||
|
||||
// vars
|
||||
var storage = [];
|
||||
|
||||
/**
|
||||
* acf.Field
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 23/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.Field = acf.Model.extend({
|
||||
|
||||
// field type
|
||||
type: '',
|
||||
|
||||
// class used to avoid nested event triggers
|
||||
eventScope: '.acf-field',
|
||||
|
||||
// initialize events on 'ready'
|
||||
wait: 'ready',
|
||||
|
||||
/**
|
||||
* setup
|
||||
*
|
||||
* Called during the constructor function to setup this field ready for initialization
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param jQuery $field The field element.
|
||||
* @return void
|
||||
*/
|
||||
|
||||
setup: function( $field ){
|
||||
|
||||
// set $el
|
||||
this.$el = $field;
|
||||
|
||||
// inherit $field data
|
||||
this.inherit( $field );
|
||||
|
||||
// inherit controll data
|
||||
this.inherit( this.$control() );
|
||||
},
|
||||
|
||||
/**
|
||||
* val
|
||||
*
|
||||
* Sets or returns the field's value
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param mixed val Optional. The value to set
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
val: function( val ){
|
||||
if( val !== undefined ) {
|
||||
return this.setValue( val );
|
||||
} else {
|
||||
return this.prop('disabled') ? null : this.getValue();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* getValue
|
||||
*
|
||||
* returns the field's value
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
getValue: function(){
|
||||
return this.$input().val();
|
||||
},
|
||||
|
||||
/**
|
||||
* setValue
|
||||
*
|
||||
* sets the field's value and returns true if changed
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param mixed val
|
||||
* @return boolean. True if changed.
|
||||
*/
|
||||
|
||||
setValue: function( val ){
|
||||
return acf.val( this.$input(), val );
|
||||
},
|
||||
|
||||
/**
|
||||
* __
|
||||
*
|
||||
* i18n helper to be removed
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
__: function( string ){
|
||||
return acf._e( this.type, string );
|
||||
},
|
||||
|
||||
/**
|
||||
* $control
|
||||
*
|
||||
* returns the control jQuery element used for inheriting data. Uses this.control setting.
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
$control: function(){
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* $input
|
||||
*
|
||||
* returns the input jQuery element used for saving values. Uses this.input setting.
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
$input: function(){
|
||||
return this.$('[name]:first');
|
||||
},
|
||||
|
||||
/**
|
||||
* $inputWrap
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 12/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
$inputWrap: function(){
|
||||
return this.$('.acf-input:first');
|
||||
},
|
||||
|
||||
/**
|
||||
* $inputWrap
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 12/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
$labelWrap: function(){
|
||||
return this.$('.acf-label:first');
|
||||
},
|
||||
|
||||
/**
|
||||
* getInputName
|
||||
*
|
||||
* Returns the field's input name
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return string
|
||||
*/
|
||||
|
||||
getInputName: function(){
|
||||
return this.$input().attr('name') || '';
|
||||
},
|
||||
|
||||
/**
|
||||
* parent
|
||||
*
|
||||
* returns the field's parent field or false on failure.
|
||||
*
|
||||
* @date 8/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return object|false
|
||||
*/
|
||||
|
||||
parent: function() {
|
||||
|
||||
// vars
|
||||
var parents = this.parents();
|
||||
|
||||
// return
|
||||
return parents.length ? parents[0] : false;
|
||||
},
|
||||
|
||||
/**
|
||||
* parents
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 9/7/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
parents: function(){
|
||||
|
||||
// vars
|
||||
var $parents = this.$el.parents('.acf-field');
|
||||
|
||||
// convert
|
||||
var parents = acf.getFields( $parents );
|
||||
|
||||
// return
|
||||
return parents;
|
||||
},
|
||||
|
||||
show: function( lockKey, context ){
|
||||
|
||||
// show field and store result
|
||||
var changed = acf.show( this.$el, lockKey );
|
||||
|
||||
// do action if visibility has changed
|
||||
if( changed ) {
|
||||
this.prop('hidden', false);
|
||||
acf.doAction('show_field', this, context);
|
||||
}
|
||||
|
||||
// return
|
||||
return changed;
|
||||
},
|
||||
|
||||
hide: function( lockKey, context ){
|
||||
|
||||
// hide field and store result
|
||||
var changed = acf.hide( this.$el, lockKey );
|
||||
|
||||
// do action if visibility has changed
|
||||
if( changed ) {
|
||||
this.prop('hidden', true);
|
||||
acf.doAction('hide_field', this, context);
|
||||
}
|
||||
|
||||
// return
|
||||
return changed;
|
||||
},
|
||||
|
||||
enable: function( lockKey, context ){
|
||||
|
||||
// enable field and store result
|
||||
var changed = acf.enable( this.$el, lockKey );
|
||||
|
||||
// do action if disabled has changed
|
||||
if( changed ) {
|
||||
this.prop('disabled', false);
|
||||
acf.doAction('enable_field', this, context);
|
||||
}
|
||||
|
||||
// return
|
||||
return changed;
|
||||
},
|
||||
|
||||
disable: function( lockKey, context ){
|
||||
|
||||
// disabled field and store result
|
||||
var changed = acf.disable( this.$el, lockKey );
|
||||
|
||||
// do action if disabled has changed
|
||||
if( changed ) {
|
||||
this.prop('disabled', true);
|
||||
acf.doAction('disable_field', this, context);
|
||||
}
|
||||
|
||||
// return
|
||||
return changed;
|
||||
},
|
||||
|
||||
showEnable: function( lockKey, context ){
|
||||
|
||||
// enable
|
||||
this.enable.apply(this, arguments);
|
||||
|
||||
// show and return true if changed
|
||||
return this.show.apply(this, arguments);
|
||||
},
|
||||
|
||||
hideDisable: function( lockKey, context ){
|
||||
|
||||
// disable
|
||||
this.disable.apply(this, arguments);
|
||||
|
||||
// hide and return true if changed
|
||||
return this.hide.apply(this, arguments);
|
||||
},
|
||||
|
||||
showNotice: function( props ){
|
||||
|
||||
// ensure object
|
||||
if( typeof props !== 'object' ) {
|
||||
props = { text: props };
|
||||
}
|
||||
|
||||
// remove old notice
|
||||
if( this.notice ) {
|
||||
this.notice.remove();
|
||||
}
|
||||
|
||||
// create new notice
|
||||
props.target = this.$inputWrap();
|
||||
this.notice = acf.newNotice( props );
|
||||
},
|
||||
|
||||
removeNotice: function( timeout ){
|
||||
if( this.notice ) {
|
||||
this.notice.away( timeout || 0 );
|
||||
this.notice = false;
|
||||
}
|
||||
},
|
||||
|
||||
showError: function( message ){
|
||||
|
||||
// add class
|
||||
this.$el.addClass('acf-error');
|
||||
|
||||
// add message
|
||||
if( message !== undefined ) {
|
||||
this.showNotice({
|
||||
text: message,
|
||||
type: 'error',
|
||||
dismiss: false
|
||||
});
|
||||
}
|
||||
|
||||
// action
|
||||
acf.doAction('invalid_field', this);
|
||||
|
||||
// add event
|
||||
this.$el.one('focus change', 'input, select, textarea', $.proxy( this.removeError, this ));
|
||||
},
|
||||
|
||||
removeError: function(){
|
||||
|
||||
// remove class
|
||||
this.$el.removeClass('acf-error');
|
||||
|
||||
// remove notice
|
||||
this.removeNotice( 250 );
|
||||
|
||||
// action
|
||||
acf.doAction('valid_field', this);
|
||||
},
|
||||
|
||||
trigger: function( name, args, bubbles ){
|
||||
|
||||
// allow some events to bubble
|
||||
if( name == 'invalidField' ) {
|
||||
bubbles = true;
|
||||
}
|
||||
|
||||
// return
|
||||
return acf.Model.prototype.trigger.apply(this, [name, args, bubbles]);
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* newField
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.newField = function( $field ){
|
||||
|
||||
// vars
|
||||
var type = $field.data('type');
|
||||
var mid = modelId( type );
|
||||
var model = acf.models[ mid ] || acf.Field;
|
||||
|
||||
// instantiate
|
||||
var field = new model( $field );
|
||||
|
||||
// actions
|
||||
acf.doAction('new_field', field);
|
||||
|
||||
// return
|
||||
return field;
|
||||
};
|
||||
|
||||
/**
|
||||
* mid
|
||||
*
|
||||
* Calculates the model ID for a field type
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string type
|
||||
* @return string
|
||||
*/
|
||||
|
||||
var modelId = function( type ) {
|
||||
return acf.strPascalCase( type || '' ) + 'Field';
|
||||
};
|
||||
|
||||
/**
|
||||
* registerFieldType
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.registerFieldType = function( model ){
|
||||
|
||||
// vars
|
||||
var proto = model.prototype;
|
||||
var type = proto.type;
|
||||
var mid = modelId( type );
|
||||
|
||||
// store model
|
||||
acf.models[ mid ] = model;
|
||||
|
||||
// store reference
|
||||
storage.push( type );
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getFieldType
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getFieldType = function( type ){
|
||||
var mid = modelId( type );
|
||||
return acf.models[ mid ] || false;
|
||||
}
|
||||
|
||||
/**
|
||||
* acf.getFieldTypes
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getFieldTypes = function( args ){
|
||||
|
||||
// defaults
|
||||
args = acf.parseArgs(args, {
|
||||
category: '',
|
||||
// hasValue: true
|
||||
});
|
||||
|
||||
// clonse available types
|
||||
var types = [];
|
||||
|
||||
// loop
|
||||
storage.map(function( type ){
|
||||
|
||||
// vars
|
||||
var model = acf.getFieldType(type);
|
||||
var proto = model.prototype;
|
||||
|
||||
// check operator
|
||||
if( args.category && proto.category !== args.category ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// append
|
||||
types.push( model );
|
||||
});
|
||||
|
||||
// return
|
||||
return types;
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,372 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* findFields
|
||||
*
|
||||
* Returns a jQuery selection object of acf fields.
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object $args {
|
||||
* Optional. Arguments to find fields.
|
||||
*
|
||||
* @type string key The field's key (data-attribute).
|
||||
* @type string name The field's name (data-attribute).
|
||||
* @type string type The field's type (data-attribute).
|
||||
* @type string is jQuery selector to compare against.
|
||||
* @type jQuery parent jQuery element to search within.
|
||||
* @type jQuery sibling jQuery element to search alongside.
|
||||
* @type limit int The number of fields to find.
|
||||
* @type suppressFilters bool Whether to allow filters to add/remove results. Default behaviour will ignore clone fields.
|
||||
* }
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
acf.findFields = function( args ){
|
||||
|
||||
// vars
|
||||
var selector = '.acf-field';
|
||||
var $fields = false;
|
||||
|
||||
// args
|
||||
args = acf.parseArgs(args, {
|
||||
key: '',
|
||||
name: '',
|
||||
type: '',
|
||||
is: '',
|
||||
parent: false,
|
||||
sibling: false,
|
||||
limit: false,
|
||||
visible: false,
|
||||
suppressFilters: false,
|
||||
});
|
||||
|
||||
// filter args
|
||||
if( !args.suppressFilters ) {
|
||||
args = acf.applyFilters('find_fields_args', args);
|
||||
}
|
||||
|
||||
// key
|
||||
if( args.key ) {
|
||||
selector += '[data-key="' + args.key + '"]';
|
||||
}
|
||||
|
||||
// type
|
||||
if( args.type ) {
|
||||
selector += '[data-type="' + args.type + '"]';
|
||||
}
|
||||
|
||||
// name
|
||||
if( args.name ) {
|
||||
selector += '[data-name="' + args.name + '"]';
|
||||
}
|
||||
|
||||
// is
|
||||
if( args.is ) {
|
||||
selector += args.is;
|
||||
}
|
||||
|
||||
// visibility
|
||||
if( args.visible ) {
|
||||
selector += ':visible';
|
||||
}
|
||||
|
||||
// query
|
||||
if( args.parent ) {
|
||||
$fields = args.parent.find( selector );
|
||||
} else if( args.sibling ) {
|
||||
$fields = args.sibling.siblings( selector );
|
||||
} else {
|
||||
$fields = $( selector );
|
||||
}
|
||||
|
||||
// filter
|
||||
if( !args.suppressFilters ) {
|
||||
$fields = $fields.not('.acf-clone .acf-field');
|
||||
$fields = acf.applyFilters('find_fields', $fields);
|
||||
}
|
||||
|
||||
// limit
|
||||
if( args.limit ) {
|
||||
$fields = $fields.slice( 0, args.limit );
|
||||
}
|
||||
|
||||
// return
|
||||
return $fields;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* findField
|
||||
*
|
||||
* Finds a specific field with jQuery
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string key The field's key.
|
||||
* @param jQuery $parent jQuery element to search within.
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
acf.findField = function( key, $parent ){
|
||||
return acf.findFields({
|
||||
key: key,
|
||||
limit: 1,
|
||||
parent: $parent,
|
||||
suppressFilters: true
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* getField
|
||||
*
|
||||
* Returns a field instance
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param jQuery|string $field jQuery element or field key.
|
||||
* @return object
|
||||
*/
|
||||
|
||||
acf.getField = function( $field ){
|
||||
|
||||
// allow jQuery
|
||||
if( $field instanceof jQuery ) {
|
||||
|
||||
// find fields
|
||||
} else {
|
||||
$field = acf.findField( $field );
|
||||
}
|
||||
|
||||
// instantiate
|
||||
var field = $field.data('acf');
|
||||
if( !field ) {
|
||||
field = acf.newField( $field );
|
||||
}
|
||||
|
||||
// return
|
||||
return field;
|
||||
};
|
||||
|
||||
/**
|
||||
* getFields
|
||||
*
|
||||
* Returns multiple field instances
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param jQuery|object $fields jQuery elements or query args.
|
||||
* @return array
|
||||
*/
|
||||
|
||||
acf.getFields = function( $fields ){
|
||||
|
||||
// allow jQuery
|
||||
if( $fields instanceof jQuery ) {
|
||||
|
||||
// find fields
|
||||
} else {
|
||||
$fields = acf.findFields( $fields );
|
||||
}
|
||||
|
||||
// loop
|
||||
var fields = [];
|
||||
$fields.each(function(){
|
||||
var field = acf.getField( $(this) );
|
||||
fields.push( field );
|
||||
});
|
||||
|
||||
// return
|
||||
return fields;
|
||||
};
|
||||
|
||||
/**
|
||||
* findClosestField
|
||||
*
|
||||
* Returns the closest jQuery field element
|
||||
*
|
||||
* @date 9/4/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param jQuery $el
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
acf.findClosestField = function( $el ){
|
||||
return $el.closest('.acf-field');
|
||||
};
|
||||
|
||||
/**
|
||||
* getClosestField
|
||||
*
|
||||
* Returns the closest field instance
|
||||
*
|
||||
* @date 22/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param jQuery $el
|
||||
* @return object
|
||||
*/
|
||||
|
||||
acf.getClosestField = function( $el ){
|
||||
var $field = acf.findClosestField( $el );
|
||||
return this.getField( $field );
|
||||
};
|
||||
|
||||
/**
|
||||
* addGlobalFieldAction
|
||||
*
|
||||
* Sets up callback logic for global field actions
|
||||
*
|
||||
* @date 15/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param string action
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var addGlobalFieldAction = function( action ){
|
||||
|
||||
// vars
|
||||
var globalAction = action;
|
||||
var pluralAction = action + '_fields'; // ready_fields
|
||||
var singleAction = action + '_field'; // ready_field
|
||||
|
||||
// global action
|
||||
var globalCallback = function( $el /*, arg1, arg2, etc*/ ){
|
||||
//console.log( action, arguments );
|
||||
|
||||
// get args [$el, ...]
|
||||
var args = acf.arrayArgs( arguments );
|
||||
var extraArgs = args.slice(1);
|
||||
|
||||
// find fields
|
||||
var fields = acf.getFields({ parent: $el });
|
||||
|
||||
// check
|
||||
if( fields.length ) {
|
||||
|
||||
// pluralAction
|
||||
var pluralArgs = [ pluralAction, fields ].concat( extraArgs );
|
||||
acf.doAction.apply(null, pluralArgs);
|
||||
}
|
||||
};
|
||||
|
||||
// plural action
|
||||
var pluralCallback = function( fields /*, arg1, arg2, etc*/ ){
|
||||
//console.log( pluralAction, arguments );
|
||||
|
||||
// get args [fields, ...]
|
||||
var args = acf.arrayArgs( arguments );
|
||||
var extraArgs = args.slice(1);
|
||||
|
||||
// loop
|
||||
fields.map(function( field, i ){
|
||||
//setTimeout(function(){
|
||||
// singleAction
|
||||
var singleArgs = [ singleAction, field ].concat( extraArgs );
|
||||
acf.doAction.apply(null, singleArgs);
|
||||
//}, i * 100);
|
||||
});
|
||||
};
|
||||
|
||||
// add actions
|
||||
acf.addAction(globalAction, globalCallback);
|
||||
acf.addAction(pluralAction, pluralCallback);
|
||||
|
||||
// also add single action
|
||||
addSingleFieldAction( action );
|
||||
}
|
||||
|
||||
/**
|
||||
* addSingleFieldAction
|
||||
*
|
||||
* Sets up callback logic for single field actions
|
||||
*
|
||||
* @date 15/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param string action
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var addSingleFieldAction = function( action ){
|
||||
|
||||
// vars
|
||||
var singleAction = action + '_field'; // ready_field
|
||||
var singleEvent = action + 'Field'; // readyField
|
||||
|
||||
// single action
|
||||
var singleCallback = function( field /*, arg1, arg2, etc*/ ){
|
||||
//console.log( singleAction, arguments );
|
||||
|
||||
// get args [field, ...]
|
||||
var args = acf.arrayArgs( arguments );
|
||||
var extraArgs = args.slice(1);
|
||||
|
||||
// action variations (ready_field/type=image)
|
||||
var variations = ['type', 'name', 'key'];
|
||||
variations.map(function( variation ){
|
||||
|
||||
// vars
|
||||
var prefix = '/' + variation + '=' + field.get(variation);
|
||||
|
||||
// singleAction
|
||||
args = [ singleAction + prefix , field ].concat( extraArgs );
|
||||
acf.doAction.apply(null, args);
|
||||
});
|
||||
|
||||
// event
|
||||
if( singleFieldEvents.indexOf(action) > -1 ) {
|
||||
field.trigger(singleEvent, extraArgs);
|
||||
}
|
||||
};
|
||||
|
||||
// add actions
|
||||
acf.addAction(singleAction, singleCallback);
|
||||
}
|
||||
|
||||
// vars
|
||||
var globalFieldActions = [ 'prepare', 'ready', 'load', 'append', 'remove', 'unmount', 'remount', 'sortstart', 'sortstop', 'show', 'hide', 'unload' ];
|
||||
var singleFieldActions = [ 'valid', 'invalid', 'enable', 'disable', 'new' ];
|
||||
var singleFieldEvents = [ 'remove', 'unmount', 'remount', 'sortstart', 'sortstop', 'show', 'hide', 'unload', 'valid', 'invalid', 'enable', 'disable' ];
|
||||
|
||||
// add
|
||||
globalFieldActions.map( addGlobalFieldAction );
|
||||
singleFieldActions.map( addSingleFieldAction );
|
||||
|
||||
/**
|
||||
* fieldsEventManager
|
||||
*
|
||||
* Manages field actions and events
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param void
|
||||
* @param void
|
||||
*/
|
||||
|
||||
var fieldsEventManager = new acf.Model({
|
||||
id: 'fieldsEventManager',
|
||||
events: {
|
||||
'click .acf-field a[href="#"]': 'onClick',
|
||||
'change .acf-field': 'onChange'
|
||||
},
|
||||
onClick: function( e ){
|
||||
|
||||
// prevent default of any link with an href of #
|
||||
e.preventDefault();
|
||||
},
|
||||
onChange: function(){
|
||||
|
||||
// preview hack allows post to save with no title or content
|
||||
$('#_acf_changed').val(1);
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,361 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* refreshHelper
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 1/7/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var refreshHelper = new acf.Model({
|
||||
priority: 90,
|
||||
timeout: 0,
|
||||
actions: {
|
||||
'new_field': 'refresh',
|
||||
'show_field': 'refresh',
|
||||
'hide_field': 'refresh',
|
||||
'remove_field': 'refresh'
|
||||
},
|
||||
refresh: function(){
|
||||
clearTimeout( this.timeout );
|
||||
this.timeout = setTimeout(function(){
|
||||
acf.doAction('refresh');
|
||||
}, 0);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* mountHelper
|
||||
*
|
||||
* Adds compatiblity for the 'unmount' and 'remount' actions added in 5.8.0
|
||||
*
|
||||
* @date 7/3/19
|
||||
* @since 5.7.14
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
var mountHelper = new acf.Model({
|
||||
priority: 1,
|
||||
actions: {
|
||||
'sortstart': 'onSortstart',
|
||||
'sortstop': 'onSortstop'
|
||||
},
|
||||
onSortstart: function( $item ){
|
||||
acf.doAction('unmount', $item);
|
||||
},
|
||||
onSortstop: function( $item ){
|
||||
acf.doAction('remount', $item);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* sortableHelper
|
||||
*
|
||||
* Adds compatibility for sorting a <tr> element
|
||||
*
|
||||
* @date 6/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var sortableHelper = new acf.Model({
|
||||
actions: {
|
||||
'sortstart': 'onSortstart'
|
||||
},
|
||||
onSortstart: function( $item, $placeholder ){
|
||||
|
||||
// if $item is a tr, apply some css to the elements
|
||||
if( $item.is('tr') ) {
|
||||
|
||||
// replace $placeholder children with a single td
|
||||
// fixes "width calculation issues" due to conditional logic hiding some children
|
||||
$placeholder.html('<td style="padding:0;" colspan="' + $placeholder.children().length + '"></td>');
|
||||
|
||||
// add helper class to remove absolute positioning
|
||||
$item.addClass('acf-sortable-tr-helper');
|
||||
|
||||
// set fixed widths for children
|
||||
$item.children().each(function(){
|
||||
$(this).width( $(this).width() );
|
||||
});
|
||||
|
||||
// mimic height
|
||||
$placeholder.height( $item.height() + 'px' );
|
||||
|
||||
// remove class
|
||||
$item.removeClass('acf-sortable-tr-helper');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* duplicateHelper
|
||||
*
|
||||
* Fixes browser bugs when duplicating an element
|
||||
*
|
||||
* @date 6/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var duplicateHelper = new acf.Model({
|
||||
actions: {
|
||||
'after_duplicate': 'onAfterDuplicate'
|
||||
},
|
||||
onAfterDuplicate: function( $el, $el2 ){
|
||||
|
||||
// get original values
|
||||
var vals = [];
|
||||
$el.find('select').each(function(i){
|
||||
vals.push( $(this).val() );
|
||||
});
|
||||
|
||||
// set duplicate values
|
||||
$el2.find('select').each(function(i){
|
||||
$(this).val( vals[i] );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* tableHelper
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 6/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var tableHelper = new acf.Model({
|
||||
|
||||
id: 'tableHelper',
|
||||
|
||||
priority: 20,
|
||||
|
||||
actions: {
|
||||
'refresh': 'renderTables'
|
||||
},
|
||||
|
||||
renderTables: function( $el ){
|
||||
|
||||
// loop
|
||||
var self = this;
|
||||
$('.acf-table:visible').each(function(){
|
||||
self.renderTable( $(this) );
|
||||
});
|
||||
},
|
||||
|
||||
renderTable: function( $table ){
|
||||
|
||||
// vars
|
||||
var $ths = $table.find('> thead > tr:visible > th[data-key]');
|
||||
var $tds = $table.find('> tbody > tr:visible > td[data-key]');
|
||||
|
||||
// bail early if no thead
|
||||
if( !$ths.length || !$tds.length ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// visiblity
|
||||
$ths.each(function( i ){
|
||||
|
||||
// vars
|
||||
var $th = $(this);
|
||||
var key = $th.data('key');
|
||||
var $cells = $tds.filter('[data-key="' + key + '"]');
|
||||
var $hidden = $cells.filter('.acf-hidden');
|
||||
|
||||
// always remove empty and allow cells to be hidden
|
||||
$cells.removeClass('acf-empty');
|
||||
|
||||
// hide $th if all cells are hidden
|
||||
if( $cells.length === $hidden.length ) {
|
||||
acf.hide( $th );
|
||||
|
||||
// force all hidden cells to appear empty
|
||||
} else {
|
||||
acf.show( $th );
|
||||
$hidden.addClass('acf-empty');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// clear width
|
||||
$ths.css('width', 'auto');
|
||||
|
||||
// get visible
|
||||
$ths = $ths.not('.acf-hidden');
|
||||
|
||||
// vars
|
||||
var availableWidth = 100;
|
||||
var colspan = $ths.length;
|
||||
|
||||
// set custom widths first
|
||||
var $fixedWidths = $ths.filter('[data-width]');
|
||||
$fixedWidths.each(function(){
|
||||
var width = $(this).data('width');
|
||||
$(this).css('width', width + '%');
|
||||
availableWidth -= width;
|
||||
});
|
||||
|
||||
// set auto widths
|
||||
var $auoWidths = $ths.not('[data-width]');
|
||||
if( $auoWidths.length ) {
|
||||
var width = availableWidth / $auoWidths.length;
|
||||
$auoWidths.css('width', width + '%');
|
||||
availableWidth = 0;
|
||||
}
|
||||
|
||||
// avoid stretching issue
|
||||
if( availableWidth > 0 ) {
|
||||
$ths.last().css('width', 'auto');
|
||||
}
|
||||
|
||||
|
||||
// update colspan on collapsed
|
||||
$tds.filter('.-collapsed-target').each(function(){
|
||||
|
||||
// vars
|
||||
var $td = $(this);
|
||||
|
||||
// check if collapsed
|
||||
if( $td.parent().hasClass('-collapsed') ) {
|
||||
$td.attr('colspan', $ths.length);
|
||||
} else {
|
||||
$td.removeAttr('colspan');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* fieldsHelper
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 6/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var fieldsHelper = new acf.Model({
|
||||
|
||||
id: 'fieldsHelper',
|
||||
|
||||
priority: 30,
|
||||
|
||||
actions: {
|
||||
'refresh': 'renderGroups'
|
||||
},
|
||||
|
||||
renderGroups: function(){
|
||||
|
||||
// loop
|
||||
var self = this;
|
||||
$('.acf-fields:visible').each(function(){
|
||||
self.renderGroup( $(this) );
|
||||
});
|
||||
},
|
||||
|
||||
renderGroup: function( $el ){
|
||||
|
||||
// vars
|
||||
var top = 0;
|
||||
var height = 0;
|
||||
var $row = $();
|
||||
|
||||
// get fields
|
||||
var $fields = $el.children('.acf-field[data-width]:visible');
|
||||
|
||||
// bail early if no fields
|
||||
if( !$fields.length ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bail ealry if is .-left
|
||||
if( $el.hasClass('-left') ) {
|
||||
$fields.removeAttr('data-width');
|
||||
$fields.css('width', 'auto');
|
||||
return false;
|
||||
}
|
||||
|
||||
// reset fields
|
||||
$fields.removeClass('-r0 -c0').css({'min-height': 0});
|
||||
|
||||
// loop
|
||||
$fields.each(function( i ){
|
||||
|
||||
// vars
|
||||
var $field = $(this);
|
||||
var position = $field.position();
|
||||
var thisTop = Math.ceil( position.top );
|
||||
var thisLeft = Math.ceil( position.left );
|
||||
|
||||
// detect change in row
|
||||
if( $row.length && thisTop > top ) {
|
||||
|
||||
// set previous heights
|
||||
$row.css({'min-height': height+'px'});
|
||||
|
||||
// update position due to change in row above
|
||||
position = $field.position();
|
||||
thisTop = Math.ceil( position.top );
|
||||
thisLeft = Math.ceil( position.left );
|
||||
|
||||
// reset vars
|
||||
top = 0;
|
||||
height = 0;
|
||||
$row = $();
|
||||
}
|
||||
|
||||
// rtl
|
||||
if( acf.get('rtl') ) {
|
||||
thisLeft = Math.ceil( $field.parent().width() - (position.left + $field.outerWidth()) );
|
||||
}
|
||||
|
||||
// add classes
|
||||
if( thisTop == 0 ) {
|
||||
$field.addClass('-r0');
|
||||
} else if( thisLeft == 0 ) {
|
||||
$field.addClass('-c0');
|
||||
}
|
||||
|
||||
// get height after class change
|
||||
// - add 1 for subpixel rendering
|
||||
var thisHeight = Math.ceil( $field.outerHeight() ) + 1;
|
||||
|
||||
// set height
|
||||
height = Math.max( height, thisHeight );
|
||||
|
||||
// set y
|
||||
top = Math.max( top, thisTop );
|
||||
|
||||
// append
|
||||
$row = $row.add( $field );
|
||||
});
|
||||
|
||||
// clean up
|
||||
if( $row.length ) {
|
||||
$row.css({'min-height': height+'px'});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
252
wp-content/plugins/advanced-custom-fields/assets/build/js/_acf-hooks.js
Executable file
@@ -0,0 +1,252 @@
|
||||
( function( window, undefined ) {
|
||||
"use strict";
|
||||
|
||||
/**
|
||||
* Handles managing all events for whatever you plug it into. Priorities for hooks are based on lowest to highest in
|
||||
* that, lowest priority hooks are fired first.
|
||||
*/
|
||||
var EventManager = function() {
|
||||
/**
|
||||
* Maintain a reference to the object scope so our public methods never get confusing.
|
||||
*/
|
||||
var MethodsAvailable = {
|
||||
removeFilter : removeFilter,
|
||||
applyFilters : applyFilters,
|
||||
addFilter : addFilter,
|
||||
removeAction : removeAction,
|
||||
doAction : doAction,
|
||||
addAction : addAction,
|
||||
storage : getStorage
|
||||
};
|
||||
|
||||
/**
|
||||
* Contains the hooks that get registered with this EventManager. The array for storage utilizes a "flat"
|
||||
* object literal such that looking up the hook utilizes the native object literal hash.
|
||||
*/
|
||||
var STORAGE = {
|
||||
actions : {},
|
||||
filters : {}
|
||||
};
|
||||
|
||||
function getStorage() {
|
||||
|
||||
return STORAGE;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds an action to the event manager.
|
||||
*
|
||||
* @param action Must contain namespace.identifier
|
||||
* @param callback Must be a valid callback function before this action is added
|
||||
* @param [priority=10] Used to control when the function is executed in relation to other callbacks bound to the same hook
|
||||
* @param [context] Supply a value to be used for this
|
||||
*/
|
||||
function addAction( action, callback, priority, context ) {
|
||||
if( typeof action === 'string' && typeof callback === 'function' ) {
|
||||
priority = parseInt( ( priority || 10 ), 10 );
|
||||
_addHook( 'actions', action, callback, priority, context );
|
||||
}
|
||||
|
||||
return MethodsAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs an action if it exists. You can pass as many arguments as you want to this function; the only rule is
|
||||
* that the first argument must always be the action.
|
||||
*/
|
||||
function doAction( /* action, arg1, arg2, ... */ ) {
|
||||
var args = Array.prototype.slice.call( arguments );
|
||||
var action = args.shift();
|
||||
|
||||
if( typeof action === 'string' ) {
|
||||
_runHook( 'actions', action, args );
|
||||
}
|
||||
|
||||
return MethodsAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified action if it contains a namespace.identifier & exists.
|
||||
*
|
||||
* @param action The action to remove
|
||||
* @param [callback] Callback function to remove
|
||||
*/
|
||||
function removeAction( action, callback ) {
|
||||
if( typeof action === 'string' ) {
|
||||
_removeHook( 'actions', action, callback );
|
||||
}
|
||||
|
||||
return MethodsAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a filter to the event manager.
|
||||
*
|
||||
* @param filter Must contain namespace.identifier
|
||||
* @param callback Must be a valid callback function before this action is added
|
||||
* @param [priority=10] Used to control when the function is executed in relation to other callbacks bound to the same hook
|
||||
* @param [context] Supply a value to be used for this
|
||||
*/
|
||||
function addFilter( filter, callback, priority, context ) {
|
||||
if( typeof filter === 'string' && typeof callback === 'function' ) {
|
||||
priority = parseInt( ( priority || 10 ), 10 );
|
||||
_addHook( 'filters', filter, callback, priority, context );
|
||||
}
|
||||
|
||||
return MethodsAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a filter if it exists. You should only ever pass 1 argument to be filtered. The only rule is that
|
||||
* the first argument must always be the filter.
|
||||
*/
|
||||
function applyFilters( /* filter, filtered arg, arg2, ... */ ) {
|
||||
var args = Array.prototype.slice.call( arguments );
|
||||
var filter = args.shift();
|
||||
|
||||
if( typeof filter === 'string' ) {
|
||||
return _runHook( 'filters', filter, args );
|
||||
}
|
||||
|
||||
return MethodsAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified filter if it contains a namespace.identifier & exists.
|
||||
*
|
||||
* @param filter The action to remove
|
||||
* @param [callback] Callback function to remove
|
||||
*/
|
||||
function removeFilter( filter, callback ) {
|
||||
if( typeof filter === 'string') {
|
||||
_removeHook( 'filters', filter, callback );
|
||||
}
|
||||
|
||||
return MethodsAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the specified hook by resetting the value of it.
|
||||
*
|
||||
* @param type Type of hook, either 'actions' or 'filters'
|
||||
* @param hook The hook (namespace.identifier) to remove
|
||||
* @private
|
||||
*/
|
||||
function _removeHook( type, hook, callback, context ) {
|
||||
if ( !STORAGE[ type ][ hook ] ) {
|
||||
return;
|
||||
}
|
||||
if ( !callback ) {
|
||||
STORAGE[ type ][ hook ] = [];
|
||||
} else {
|
||||
var handlers = STORAGE[ type ][ hook ];
|
||||
var i;
|
||||
if ( !context ) {
|
||||
for ( i = handlers.length; i--; ) {
|
||||
if ( handlers[i].callback === callback ) {
|
||||
handlers.splice( i, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for ( i = handlers.length; i--; ) {
|
||||
var handler = handlers[i];
|
||||
if ( handler.callback === callback && handler.context === context) {
|
||||
handlers.splice( i, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the hook to the appropriate storage container
|
||||
*
|
||||
* @param type 'actions' or 'filters'
|
||||
* @param hook The hook (namespace.identifier) to add to our event manager
|
||||
* @param callback The function that will be called when the hook is executed.
|
||||
* @param priority The priority of this hook. Must be an integer.
|
||||
* @param [context] A value to be used for this
|
||||
* @private
|
||||
*/
|
||||
function _addHook( type, hook, callback, priority, context ) {
|
||||
var hookObject = {
|
||||
callback : callback,
|
||||
priority : priority,
|
||||
context : context
|
||||
};
|
||||
|
||||
// Utilize 'prop itself' : http://jsperf.com/hasownproperty-vs-in-vs-undefined/19
|
||||
var hooks = STORAGE[ type ][ hook ];
|
||||
if( hooks ) {
|
||||
hooks.push( hookObject );
|
||||
hooks = _hookInsertSort( hooks );
|
||||
}
|
||||
else {
|
||||
hooks = [ hookObject ];
|
||||
}
|
||||
|
||||
STORAGE[ type ][ hook ] = hooks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use an insert sort for keeping our hooks organized based on priority. This function is ridiculously faster
|
||||
* than bubble sort, etc: http://jsperf.com/javascript-sort
|
||||
*
|
||||
* @param hooks The custom array containing all of the appropriate hooks to perform an insert sort on.
|
||||
* @private
|
||||
*/
|
||||
function _hookInsertSort( hooks ) {
|
||||
var tmpHook, j, prevHook;
|
||||
for( var i = 1, len = hooks.length; i < len; i++ ) {
|
||||
tmpHook = hooks[ i ];
|
||||
j = i;
|
||||
while( ( prevHook = hooks[ j - 1 ] ) && prevHook.priority > tmpHook.priority ) {
|
||||
hooks[ j ] = hooks[ j - 1 ];
|
||||
--j;
|
||||
}
|
||||
hooks[ j ] = tmpHook;
|
||||
}
|
||||
|
||||
return hooks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the specified hook. If it is an action, the value is not modified but if it is a filter, it is.
|
||||
*
|
||||
* @param type 'actions' or 'filters'
|
||||
* @param hook The hook ( namespace.identifier ) to be ran.
|
||||
* @param args Arguments to pass to the action/filter. If it's a filter, args is actually a single parameter.
|
||||
* @private
|
||||
*/
|
||||
function _runHook( type, hook, args ) {
|
||||
var handlers = STORAGE[ type ][ hook ];
|
||||
|
||||
if ( !handlers ) {
|
||||
return (type === 'filters') ? args[0] : false;
|
||||
}
|
||||
|
||||
var i = 0, len = handlers.length;
|
||||
if ( type === 'filters' ) {
|
||||
for ( ; i < len; i++ ) {
|
||||
args[ 0 ] = handlers[ i ].callback.apply( handlers[ i ].context, args );
|
||||
}
|
||||
} else {
|
||||
for ( ; i < len; i++ ) {
|
||||
handlers[ i ].callback.apply( handlers[ i ].context, args );
|
||||
}
|
||||
}
|
||||
|
||||
return ( type === 'filters' ) ? args[ 0 ] : true;
|
||||
}
|
||||
|
||||
// return all of the publicly available methods
|
||||
return MethodsAvailable;
|
||||
|
||||
};
|
||||
|
||||
// instantiate
|
||||
acf.hooks = new EventManager();
|
||||
|
||||
} )( window );
|
||||
@@ -0,0 +1,832 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* acf.newMediaPopup
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.newMediaPopup = function( args ){
|
||||
|
||||
// args
|
||||
var popup = null;
|
||||
var args = acf.parseArgs(args, {
|
||||
mode: 'select', // 'select', 'edit'
|
||||
title: '', // 'Upload Image'
|
||||
button: '', // 'Select Image'
|
||||
type: '', // 'image', ''
|
||||
field: false, // field instance
|
||||
allowedTypes: '', // '.jpg, .png, etc'
|
||||
library: 'all', // 'all', 'uploadedTo'
|
||||
multiple: false, // false, true, 'add'
|
||||
attachment: 0, // the attachment to edit
|
||||
autoOpen: true, // open the popup automatically
|
||||
open: function(){}, // callback after close
|
||||
select: function(){}, // callback after select
|
||||
close: function(){} // callback after close
|
||||
});
|
||||
|
||||
// initialize
|
||||
if( args.mode == 'edit' ) {
|
||||
popup = new acf.models.EditMediaPopup( args );
|
||||
} else {
|
||||
popup = new acf.models.SelectMediaPopup( args );
|
||||
}
|
||||
|
||||
// open popup (allow frame customization before opening)
|
||||
if( args.autoOpen ) {
|
||||
setTimeout(function(){
|
||||
popup.open();
|
||||
}, 1);
|
||||
}
|
||||
|
||||
// action
|
||||
acf.doAction('new_media_popup', popup);
|
||||
|
||||
// return
|
||||
return popup;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* getPostID
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var getPostID = function() {
|
||||
var postID = acf.get('post_id');
|
||||
return $.isNumeric(postID) ? postID : 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* acf.getMimeTypes
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 11/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getMimeTypes = function(){
|
||||
return this.get('mimeTypes');
|
||||
};
|
||||
|
||||
acf.getMimeType = function( name ){
|
||||
|
||||
// vars
|
||||
var allTypes = acf.getMimeTypes();
|
||||
|
||||
// search
|
||||
if( allTypes[name] !== undefined ) {
|
||||
return allTypes[name];
|
||||
}
|
||||
|
||||
// some types contain a mixed key such as "jpg|jpeg|jpe"
|
||||
for( var key in allTypes ) {
|
||||
if( key.indexOf(name) !== -1 ) {
|
||||
return allTypes[key];
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return false;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* MediaPopup
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var MediaPopup = acf.Model.extend({
|
||||
|
||||
id: 'MediaPopup',
|
||||
data: {},
|
||||
defaults: {},
|
||||
frame: false,
|
||||
|
||||
setup: function( props ){
|
||||
$.extend(this.data, props);
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var options = this.getFrameOptions();
|
||||
|
||||
// add states
|
||||
this.addFrameStates( options );
|
||||
|
||||
// create frame
|
||||
var frame = wp.media( options );
|
||||
|
||||
// add args reference
|
||||
frame.acf = this;
|
||||
|
||||
// add events
|
||||
this.addFrameEvents( frame, options );
|
||||
|
||||
// strore frame
|
||||
this.frame = frame;
|
||||
},
|
||||
|
||||
open: function(){
|
||||
this.frame.open();
|
||||
},
|
||||
|
||||
close: function(){
|
||||
this.frame.close();
|
||||
},
|
||||
|
||||
remove: function(){
|
||||
this.frame.detach();
|
||||
this.frame.remove();
|
||||
},
|
||||
|
||||
getFrameOptions: function(){
|
||||
|
||||
// vars
|
||||
var options = {
|
||||
title: this.get('title'),
|
||||
multiple: this.get('multiple'),
|
||||
library: {},
|
||||
states: []
|
||||
};
|
||||
|
||||
// type
|
||||
if( this.get('type') ) {
|
||||
options.library.type = this.get('type');
|
||||
}
|
||||
|
||||
// type
|
||||
if( this.get('library') === 'uploadedTo' ) {
|
||||
options.library.uploadedTo = getPostID();
|
||||
}
|
||||
|
||||
// attachment
|
||||
if( this.get('attachment') ) {
|
||||
options.library.post__in = [ this.get('attachment') ];
|
||||
}
|
||||
|
||||
// button
|
||||
if( this.get('button') ) {
|
||||
options.button = {
|
||||
text: this.get('button')
|
||||
};
|
||||
}
|
||||
|
||||
// return
|
||||
return options;
|
||||
},
|
||||
|
||||
addFrameStates: function( options ){
|
||||
|
||||
// create query
|
||||
var Query = wp.media.query( options.library );
|
||||
|
||||
// add _acfuploader
|
||||
// this is super wack!
|
||||
// if you add _acfuploader to the options.library args, new uploads will not be added to the library view.
|
||||
// this has been traced back to the wp.media.model.Query initialize function (which can't be overriden)
|
||||
// Adding any custom args will cause the Attahcments to not observe the uploader queue
|
||||
// To bypass this security issue, we add in the args AFTER the Query has been initialized
|
||||
// options.library._acfuploader = settings.field;
|
||||
if( this.get('field') && acf.isset(Query, 'mirroring', 'args') ) {
|
||||
Query.mirroring.args._acfuploader = this.get('field');
|
||||
}
|
||||
|
||||
// add states
|
||||
options.states.push(
|
||||
|
||||
// main state
|
||||
new wp.media.controller.Library({
|
||||
library: Query,
|
||||
multiple: this.get('multiple'),
|
||||
title: this.get('title'),
|
||||
priority: 20,
|
||||
filterable: 'all',
|
||||
editable: true,
|
||||
allowLocalEdits: true
|
||||
})
|
||||
|
||||
);
|
||||
|
||||
// edit image functionality (added in WP 3.9)
|
||||
if( acf.isset(wp, 'media', 'controller', 'EditImage') ) {
|
||||
options.states.push( new wp.media.controller.EditImage() );
|
||||
}
|
||||
},
|
||||
|
||||
addFrameEvents: function( frame, options ){
|
||||
|
||||
// log all events
|
||||
//frame.on('all', function( e ) {
|
||||
// console.log( 'frame all: %o', e );
|
||||
//});
|
||||
|
||||
// add class
|
||||
frame.on('open',function() {
|
||||
this.$el.closest('.media-modal').addClass('acf-media-modal -' + this.acf.get('mode') );
|
||||
}, frame);
|
||||
|
||||
// edit image view
|
||||
// source: media-views.js:2410 editImageContent()
|
||||
frame.on('content:render:edit-image', function(){
|
||||
|
||||
var image = this.state().get('image');
|
||||
var view = new wp.media.view.EditImage({ model: image, controller: this }).render();
|
||||
this.content.set( view );
|
||||
|
||||
// after creating the wrapper view, load the actual editor via an ajax call
|
||||
view.loadEditor();
|
||||
|
||||
}, frame);
|
||||
|
||||
// update toolbar button
|
||||
//frame.on( 'toolbar:create:select', function( toolbar ) {
|
||||
// toolbar.view = new wp.media.view.Toolbar.Select({
|
||||
// text: frame.options._button,
|
||||
// controller: this
|
||||
// });
|
||||
//}, frame );
|
||||
|
||||
// on select
|
||||
frame.on('select', function() {
|
||||
|
||||
// vars
|
||||
var selection = frame.state().get('selection');
|
||||
|
||||
// if selecting images
|
||||
if( selection ) {
|
||||
|
||||
// loop
|
||||
selection.each(function( attachment, i ){
|
||||
frame.acf.get('select').apply( frame.acf, [attachment, i] );
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// on close
|
||||
frame.on('close',function(){
|
||||
|
||||
// callback and remove
|
||||
setTimeout(function(){
|
||||
frame.acf.get('close').apply( frame.acf );
|
||||
frame.acf.remove();
|
||||
}, 1);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* acf.models.SelectMediaPopup
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.models.SelectMediaPopup = MediaPopup.extend({
|
||||
id: 'SelectMediaPopup',
|
||||
setup: function( props ){
|
||||
|
||||
// default button
|
||||
if( !props.button ) {
|
||||
props.button = acf._x('Select', 'verb');
|
||||
}
|
||||
|
||||
// parent
|
||||
MediaPopup.prototype.setup.apply(this, arguments);
|
||||
},
|
||||
|
||||
addFrameEvents: function( frame, options ){
|
||||
|
||||
// plupload
|
||||
// adds _acfuploader param to validate uploads
|
||||
if( acf.isset(_wpPluploadSettings, 'defaults', 'multipart_params') ) {
|
||||
|
||||
// add _acfuploader so that Uploader will inherit
|
||||
_wpPluploadSettings.defaults.multipart_params._acfuploader = this.get('field');
|
||||
|
||||
// remove acf_field so future Uploaders won't inherit
|
||||
frame.on('open', function(){
|
||||
delete _wpPluploadSettings.defaults.multipart_params._acfuploader;
|
||||
});
|
||||
}
|
||||
|
||||
// browse
|
||||
frame.on('content:activate:browse', function(){
|
||||
|
||||
// vars
|
||||
var toolbar = false;
|
||||
|
||||
// populate above vars making sure to allow for failure
|
||||
// perhaps toolbar does not exist because the frame open is Upload Files
|
||||
try {
|
||||
toolbar = frame.content.get().toolbar;
|
||||
} catch(e) {
|
||||
console.log(e);
|
||||
return;
|
||||
}
|
||||
|
||||
// callback
|
||||
frame.acf.customizeFilters.apply(frame.acf, [toolbar]);
|
||||
});
|
||||
|
||||
// parent
|
||||
MediaPopup.prototype.addFrameEvents.apply(this, arguments);
|
||||
|
||||
},
|
||||
|
||||
customizeFilters: function( toolbar ){
|
||||
|
||||
// vars
|
||||
var filters = toolbar.get('filters');
|
||||
|
||||
// image
|
||||
if( this.get('type') == 'image' ) {
|
||||
|
||||
// update all
|
||||
filters.filters.all.text = acf.__('All images');
|
||||
|
||||
// remove some filters
|
||||
delete filters.filters.audio;
|
||||
delete filters.filters.video;
|
||||
delete filters.filters.image;
|
||||
|
||||
// update all filters to show images
|
||||
$.each(filters.filters, function( i, filter ){
|
||||
filter.props.type = filter.props.type || 'image';
|
||||
});
|
||||
}
|
||||
|
||||
// specific types
|
||||
if( this.get('allowedTypes') ) {
|
||||
|
||||
// convert ".jpg, .png" into ["jpg", "png"]
|
||||
var allowedTypes = this.get('allowedTypes').split(' ').join('').split('.').join('').split(',');
|
||||
|
||||
// loop
|
||||
allowedTypes.map(function( name ){
|
||||
|
||||
// get type
|
||||
var mimeType = acf.getMimeType( name );
|
||||
|
||||
// bail early if no type
|
||||
if( !mimeType ) return;
|
||||
|
||||
// create new filter
|
||||
var newFilter = {
|
||||
text: mimeType,
|
||||
props: {
|
||||
status: null,
|
||||
type: mimeType,
|
||||
uploadedTo: null,
|
||||
orderby: 'date',
|
||||
order: 'DESC'
|
||||
},
|
||||
priority: 20
|
||||
};
|
||||
|
||||
// append
|
||||
filters.filters[ mimeType ] = newFilter;
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
// uploaded to post
|
||||
if( this.get('library') === 'uploadedTo' ) {
|
||||
|
||||
// vars
|
||||
var uploadedTo = this.frame.options.library.uploadedTo;
|
||||
|
||||
// remove some filters
|
||||
delete filters.filters.unattached;
|
||||
delete filters.filters.uploaded;
|
||||
|
||||
// add uploadedTo to filters
|
||||
$.each(filters.filters, function( i, filter ){
|
||||
filter.text += ' (' + acf.__('Uploaded to this post') + ')';
|
||||
filter.props.uploadedTo = uploadedTo;
|
||||
});
|
||||
}
|
||||
|
||||
// add _acfuploader to filters
|
||||
var field = this.get('field');
|
||||
$.each(filters.filters, function( k, filter ){
|
||||
filter.props._acfuploader = field;
|
||||
});
|
||||
|
||||
// add _acfuplaoder to search
|
||||
var search = toolbar.get('search');
|
||||
search.model.attributes._acfuploader = field;
|
||||
|
||||
// render (custom function added to prototype)
|
||||
if( filters.renderFilters ) {
|
||||
filters.renderFilters();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* acf.models.EditMediaPopup
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 10/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.models.EditMediaPopup = MediaPopup.extend({
|
||||
id: 'SelectMediaPopup',
|
||||
setup: function( props ){
|
||||
|
||||
// default button
|
||||
if( !props.button ) {
|
||||
props.button = acf._x('Update', 'verb');
|
||||
}
|
||||
|
||||
// parent
|
||||
MediaPopup.prototype.setup.apply(this, arguments);
|
||||
},
|
||||
|
||||
addFrameEvents: function( frame, options ){
|
||||
|
||||
// add class
|
||||
frame.on('open',function() {
|
||||
|
||||
// add class
|
||||
this.$el.closest('.media-modal').addClass('acf-expanded');
|
||||
|
||||
// set to browse
|
||||
if( this.content.mode() != 'browse' ) {
|
||||
this.content.mode('browse');
|
||||
}
|
||||
|
||||
// set selection
|
||||
var state = this.state();
|
||||
var selection = state.get('selection');
|
||||
var attachment = wp.media.attachment( frame.acf.get('attachment') );
|
||||
selection.add( attachment );
|
||||
|
||||
}, frame);
|
||||
|
||||
// parent
|
||||
MediaPopup.prototype.addFrameEvents.apply(this, arguments);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* customizePrototypes
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 11/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var customizePrototypes = new acf.Model({
|
||||
id: 'customizePrototypes',
|
||||
wait: 'ready',
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// bail early if no media views
|
||||
if( !acf.isset(window, 'wp', 'media', 'view') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// fix bug where CPT without "editor" does not set post.id setting which then prevents uploadedTo from working
|
||||
var postID = getPostID();
|
||||
if( postID && acf.isset(wp, 'media', 'view', 'settings', 'post') ) {
|
||||
wp.media.view.settings.post.id = postID;
|
||||
}
|
||||
|
||||
// customize
|
||||
this.customizeAttachmentsButton();
|
||||
this.customizeAttachmentsRouter();
|
||||
this.customizeAttachmentFilters();
|
||||
this.customizeAttachmentCompat();
|
||||
this.customizeAttachmentLibrary();
|
||||
},
|
||||
|
||||
customizeAttachmentsButton: function(){
|
||||
|
||||
// validate
|
||||
if( !acf.isset(wp, 'media', 'view', 'Button') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Extend
|
||||
var Button = wp.media.view.Button;
|
||||
wp.media.view.Button = Button.extend({
|
||||
|
||||
// Fix bug where "Select" button appears blank after editing an image.
|
||||
// Do this by simplifying Button initialize function and avoid deleting this.options.
|
||||
initialize: function() {
|
||||
var options = _.defaults( this.options, this.defaults );
|
||||
this.model = new Backbone.Model( options );
|
||||
this.listenTo( this.model, 'change', this.render );
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
customizeAttachmentsRouter: function(){
|
||||
|
||||
// validate
|
||||
if( !acf.isset(wp, 'media', 'view', 'Router') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var Parent = wp.media.view.Router;
|
||||
|
||||
// extend
|
||||
wp.media.view.Router = Parent.extend({
|
||||
|
||||
addExpand: function(){
|
||||
|
||||
// vars
|
||||
var $a = $([
|
||||
'<a href="#" class="acf-expand-details">',
|
||||
'<span class="is-closed"><span class="acf-icon -left small grey"></span>' + acf.__('Expand Details') + '</span>',
|
||||
'<span class="is-open"><span class="acf-icon -right small grey"></span>' + acf.__('Collapse Details') + '</span>',
|
||||
'</a>'
|
||||
].join(''));
|
||||
|
||||
// add events
|
||||
$a.on('click', function( e ){
|
||||
e.preventDefault();
|
||||
var $div = $(this).closest('.media-modal');
|
||||
if( $div.hasClass('acf-expanded') ) {
|
||||
$div.removeClass('acf-expanded');
|
||||
} else {
|
||||
$div.addClass('acf-expanded');
|
||||
}
|
||||
});
|
||||
|
||||
// append
|
||||
this.$el.append( $a );
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// initialize
|
||||
Parent.prototype.initialize.apply( this, arguments );
|
||||
|
||||
// add buttons
|
||||
this.addExpand();
|
||||
|
||||
// return
|
||||
return this;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
customizeAttachmentFilters: function(){
|
||||
|
||||
// validate
|
||||
if( !acf.isset(wp, 'media', 'view', 'AttachmentFilters', 'All') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var Parent = wp.media.view.AttachmentFilters.All;
|
||||
|
||||
// renderFilters
|
||||
// copied from media-views.js:6939
|
||||
Parent.prototype.renderFilters = function(){
|
||||
|
||||
// Build `<option>` elements.
|
||||
this.$el.html( _.chain( this.filters ).map( function( filter, value ) {
|
||||
return {
|
||||
el: $( '<option></option>' ).val( value ).html( filter.text )[0],
|
||||
priority: filter.priority || 50
|
||||
};
|
||||
}, this ).sortBy('priority').pluck('el').value() );
|
||||
|
||||
};
|
||||
},
|
||||
|
||||
customizeAttachmentCompat: function(){
|
||||
|
||||
// validate
|
||||
if( !acf.isset(wp, 'media', 'view', 'AttachmentCompat') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var AttachmentCompat = wp.media.view.AttachmentCompat;
|
||||
var timeout = false;
|
||||
|
||||
// extend
|
||||
wp.media.view.AttachmentCompat = AttachmentCompat.extend({
|
||||
|
||||
render: function() {
|
||||
|
||||
// WP bug
|
||||
// When multiple media frames exist on the same page (WP content, WYSIWYG, image, file ),
|
||||
// WP creates multiple instances of this AttachmentCompat view.
|
||||
// Each instance will attempt to render when a new modal is created.
|
||||
// Use a property to avoid this and only render once per instance.
|
||||
if( this.rendered ) {
|
||||
return this;
|
||||
}
|
||||
|
||||
// render HTML
|
||||
AttachmentCompat.prototype.render.apply( this, arguments );
|
||||
|
||||
// when uploading, render is called twice.
|
||||
// ignore first render by checking for #acf-form-data element
|
||||
if( !this.$('#acf-form-data').length ) {
|
||||
return this;
|
||||
}
|
||||
|
||||
// clear timeout
|
||||
clearTimeout( timeout );
|
||||
|
||||
// setTimeout
|
||||
timeout = setTimeout($.proxy(function(){
|
||||
this.rendered = true;
|
||||
acf.doAction('append', this.$el);
|
||||
}, this), 50);
|
||||
|
||||
// return
|
||||
return this;
|
||||
},
|
||||
|
||||
save: function( event ) {
|
||||
var data = {};
|
||||
|
||||
if ( event ) {
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
//_.each( this.$el.serializeArray(), function( pair ) {
|
||||
// data[ pair.name ] = pair.value;
|
||||
//});
|
||||
|
||||
// Serialize data more thoroughly to allow chckbox inputs to save.
|
||||
data = acf.serializeForAjax(this.$el);
|
||||
|
||||
this.controller.trigger( 'attachment:compat:waiting', ['waiting'] );
|
||||
this.model.saveCompat( data ).always( _.bind( this.postSave, this ) );
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
customizeAttachmentLibrary: function(){
|
||||
|
||||
// validate
|
||||
if( !acf.isset(wp, 'media', 'view', 'Attachment', 'Library') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var AttachmentLibrary = wp.media.view.Attachment.Library;
|
||||
|
||||
// extend
|
||||
wp.media.view.Attachment.Library = AttachmentLibrary.extend({
|
||||
|
||||
render: function() {
|
||||
|
||||
// vars
|
||||
var popup = acf.isget(this, 'controller', 'acf');
|
||||
var attributes = acf.isget(this, 'model', 'attributes');
|
||||
|
||||
// check vars exist to avoid errors
|
||||
if( popup && attributes ) {
|
||||
|
||||
// show errors
|
||||
if( attributes.acf_errors ) {
|
||||
this.$el.addClass('acf-disabled');
|
||||
}
|
||||
|
||||
// disable selected
|
||||
var selected = popup.get('selected');
|
||||
if( selected && selected.indexOf(attributes.id) > -1 ) {
|
||||
this.$el.addClass('acf-selected');
|
||||
}
|
||||
}
|
||||
|
||||
// render
|
||||
return AttachmentLibrary.prototype.render.apply( this, arguments );
|
||||
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
* toggleSelection
|
||||
*
|
||||
* This function is called before an attachment is selected
|
||||
* A good place to check for errors and prevent the 'select' function from being fired
|
||||
*
|
||||
* @type function
|
||||
* @date 29/09/2016
|
||||
* @since 5.4.0
|
||||
*
|
||||
* @param options (object)
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
toggleSelection: function( options ) {
|
||||
|
||||
// vars
|
||||
// source: wp-includes/js/media-views.js:2880
|
||||
var collection = this.collection,
|
||||
selection = this.options.selection,
|
||||
model = this.model,
|
||||
single = selection.single();
|
||||
|
||||
|
||||
// vars
|
||||
var frame = this.controller;
|
||||
var errors = acf.isget(this, 'model', 'attributes', 'acf_errors');
|
||||
var $sidebar = frame.$el.find('.media-frame-content .media-sidebar');
|
||||
|
||||
// remove previous error
|
||||
$sidebar.children('.acf-selection-error').remove();
|
||||
|
||||
// show attachment details
|
||||
$sidebar.children().removeClass('acf-hidden');
|
||||
|
||||
// add message
|
||||
if( frame && errors ) {
|
||||
|
||||
// vars
|
||||
var filename = acf.isget(this, 'model', 'attributes', 'filename');
|
||||
|
||||
// hide attachment details
|
||||
// Gallery field continues to show previously selected attachment...
|
||||
$sidebar.children().addClass('acf-hidden');
|
||||
|
||||
// append message
|
||||
$sidebar.prepend([
|
||||
'<div class="acf-selection-error">',
|
||||
'<span class="selection-error-label">' + acf.__('Restricted') +'</span>',
|
||||
'<span class="selection-error-filename">' + filename + '</span>',
|
||||
'<span class="selection-error-message">' + errors + '</span>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
|
||||
// reset selection (unselects all attachments)
|
||||
selection.reset();
|
||||
|
||||
// set single (attachment displayed in sidebar)
|
||||
selection.single( model );
|
||||
|
||||
// return and prevent 'select' form being fired
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
// return
|
||||
return AttachmentLibrary.prototype.toggleSelection.apply( this, arguments );
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,908 @@
|
||||
(function($, undefined){
|
||||
|
||||
// Cached regex to split keys for `addEvent`.
|
||||
var delegateEventSplitter = /^(\S+)\s*(.*)$/;
|
||||
|
||||
/**
|
||||
* extend
|
||||
*
|
||||
* Helper function to correctly set up the prototype chain for subclasses
|
||||
* Heavily inspired by backbone.js
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object protoProps New properties for this object.
|
||||
* @return function.
|
||||
*/
|
||||
|
||||
var extend = function( protoProps ) {
|
||||
|
||||
// vars
|
||||
var Parent = this;
|
||||
var Child;
|
||||
|
||||
// The constructor function for the new subclass is either defined by you
|
||||
// (the "constructor" property in your `extend` definition), or defaulted
|
||||
// by us to simply call the parent constructor.
|
||||
if( protoProps && protoProps.hasOwnProperty('constructor') ) {
|
||||
Child = protoProps.constructor;
|
||||
} else {
|
||||
Child = function(){ return Parent.apply(this, arguments); };
|
||||
}
|
||||
|
||||
// Add static properties to the constructor function, if supplied.
|
||||
$.extend(Child, Parent);
|
||||
|
||||
// Set the prototype chain to inherit from `parent`, without calling
|
||||
// `parent`'s constructor function and add the prototype properties.
|
||||
Child.prototype = Object.create(Parent.prototype);
|
||||
$.extend(Child.prototype, protoProps);
|
||||
Child.prototype.constructor = Child;
|
||||
|
||||
// Set a convenience property in case the parent's prototype is needed later.
|
||||
//Child.prototype.__parent__ = Parent.prototype;
|
||||
|
||||
// return
|
||||
return Child;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Model
|
||||
*
|
||||
* Base class for all inheritence
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object props
|
||||
* @return function.
|
||||
*/
|
||||
|
||||
var Model = acf.Model = function(){
|
||||
|
||||
// generate uique client id
|
||||
this.cid = acf.uniqueId('acf');
|
||||
|
||||
// set vars to avoid modifying prototype
|
||||
this.data = $.extend(true, {}, this.data);
|
||||
|
||||
// pass props to setup function
|
||||
this.setup.apply(this, arguments);
|
||||
|
||||
// store on element (allow this.setup to create this.$el)
|
||||
if( this.$el && !this.$el.data('acf') ) {
|
||||
this.$el.data('acf', this);
|
||||
}
|
||||
|
||||
// initialize
|
||||
var initialize = function(){
|
||||
this.initialize();
|
||||
this.addEvents();
|
||||
this.addActions();
|
||||
this.addFilters();
|
||||
};
|
||||
|
||||
// initialize on action
|
||||
if( this.wait && !acf.didAction(this.wait) ) {
|
||||
this.addAction(this.wait, initialize);
|
||||
|
||||
// initialize now
|
||||
} else {
|
||||
initialize.apply(this);
|
||||
}
|
||||
};
|
||||
|
||||
// Attach all inheritable methods to the Model prototype.
|
||||
$.extend(Model.prototype, {
|
||||
|
||||
// Unique model id
|
||||
id: '',
|
||||
|
||||
// Unique client id
|
||||
cid: '',
|
||||
|
||||
// jQuery element
|
||||
$el: null,
|
||||
|
||||
// Data specific to this instance
|
||||
data: {},
|
||||
|
||||
// toggle used when changing data
|
||||
busy: false,
|
||||
changed: false,
|
||||
|
||||
// Setup events hooks
|
||||
events: {},
|
||||
actions: {},
|
||||
filters: {},
|
||||
|
||||
// class used to avoid nested event triggers
|
||||
eventScope: '',
|
||||
|
||||
// action to wait until initialize
|
||||
wait: false,
|
||||
|
||||
// action priority default
|
||||
priority: 10,
|
||||
|
||||
/**
|
||||
* get
|
||||
*
|
||||
* Gets a specific data value
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
get: function( name ) {
|
||||
return this.data[name];
|
||||
},
|
||||
|
||||
/**
|
||||
* has
|
||||
*
|
||||
* Returns `true` if the data exists and is not null
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @return boolean
|
||||
*/
|
||||
|
||||
has: function( name ) {
|
||||
return this.get(name) != null;
|
||||
},
|
||||
|
||||
/**
|
||||
* set
|
||||
*
|
||||
* Sets a specific data value
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param mixed value
|
||||
* @return this
|
||||
*/
|
||||
|
||||
set: function( name, value, silent ) {
|
||||
|
||||
// bail if unchanged
|
||||
var prevValue = this.get(name);
|
||||
if( prevValue == value ) {
|
||||
return this;
|
||||
}
|
||||
|
||||
// set data
|
||||
this.data[ name ] = value;
|
||||
|
||||
// trigger events
|
||||
if( !silent ) {
|
||||
this.changed = true;
|
||||
this.trigger('changed:' + name, [value, prevValue]);
|
||||
this.trigger('changed', [name, value, prevValue]);
|
||||
}
|
||||
|
||||
// return
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* inherit
|
||||
*
|
||||
* Inherits the data from a jQuery element
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param jQuery $el
|
||||
* @return this
|
||||
*/
|
||||
|
||||
inherit: function( data ){
|
||||
|
||||
// allow jQuery
|
||||
if( data instanceof jQuery ) {
|
||||
data = data.data();
|
||||
}
|
||||
|
||||
// extend
|
||||
$.extend(this.data, data);
|
||||
|
||||
// return
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* prop
|
||||
*
|
||||
* mimics the jQuery prop function
|
||||
*
|
||||
* @date 4/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
prop: function(){
|
||||
return this.$el.prop.apply(this.$el, arguments);
|
||||
},
|
||||
|
||||
/**
|
||||
* setup
|
||||
*
|
||||
* Run during constructor function
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
setup: function( props ){
|
||||
$.extend(this, props);
|
||||
},
|
||||
|
||||
/**
|
||||
* initialize
|
||||
*
|
||||
* Also run during constructor function
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
initialize: function(){},
|
||||
|
||||
/**
|
||||
* addElements
|
||||
*
|
||||
* Adds multiple jQuery elements to this object
|
||||
*
|
||||
* @date 9/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
addElements: function( elements ){
|
||||
elements = elements || this.elements || null;
|
||||
if( !elements || !Object.keys(elements).length ) return false;
|
||||
for( var i in elements ) {
|
||||
this.addElement( i, elements[i] );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* addElement
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 9/5/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
addElement: function( name, selector){
|
||||
this[ '$' + name ] = this.$( selector );
|
||||
},
|
||||
|
||||
/**
|
||||
* addEvents
|
||||
*
|
||||
* Adds multiple event handlers
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object events {event1 : callback, event2 : callback, etc }
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
addEvents: function( events ){
|
||||
events = events || this.events || null;
|
||||
if( !events ) return false;
|
||||
for( var key in events ) {
|
||||
var match = key.match(delegateEventSplitter);
|
||||
this.on(match[1], match[2], events[key]);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* removeEvents
|
||||
*
|
||||
* Removes multiple event handlers
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object events {event1 : callback, event2 : callback, etc }
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
removeEvents: function( events ){
|
||||
events = events || this.events || null;
|
||||
if( !events ) return false;
|
||||
for( var key in events ) {
|
||||
var match = key.match(delegateEventSplitter);
|
||||
this.off(match[1], match[2], events[key]);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* getEventTarget
|
||||
*
|
||||
* Returns a jQUery element to tigger an event on
|
||||
*
|
||||
* @date 5/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param jQuery $el The default jQuery element. Optional.
|
||||
* @param string event The event name. Optional.
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
getEventTarget: function( $el, event ){
|
||||
return $el || this.$el || $(document);
|
||||
},
|
||||
|
||||
/**
|
||||
* validateEvent
|
||||
*
|
||||
* Returns true if the event target's closest $el is the same as this.$el
|
||||
* Requires both this.el and this.$el to be defined
|
||||
*
|
||||
* @date 5/6/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
validateEvent: function( e ){
|
||||
if( this.eventScope ) {
|
||||
return $( e.target ).closest( this.eventScope ).is( this.$el );
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* proxyEvent
|
||||
*
|
||||
* Returns a new event callback function scoped to this model
|
||||
*
|
||||
* @date 29/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param function callback
|
||||
* @return function
|
||||
*/
|
||||
|
||||
proxyEvent: function( callback ){
|
||||
return this.proxy(function(e){
|
||||
|
||||
// validate
|
||||
if( !this.validateEvent(e) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// construct args
|
||||
var args = acf.arrayArgs( arguments );
|
||||
var extraArgs = args.slice(1);
|
||||
var eventArgs = [ e, $(e.currentTarget) ].concat( extraArgs );
|
||||
|
||||
// callback
|
||||
callback.apply(this, eventArgs);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* on
|
||||
*
|
||||
* Adds an event handler similar to jQuery
|
||||
* Uses the instance 'cid' to namespace event
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
on: function( a1, a2, a3, a4 ){
|
||||
|
||||
// vars
|
||||
var $el, event, selector, callback, args;
|
||||
|
||||
// find args
|
||||
if( a1 instanceof jQuery ) {
|
||||
|
||||
// 1. args( $el, event, selector, callback )
|
||||
if( a4 ) {
|
||||
$el = a1; event = a2; selector = a3; callback = a4;
|
||||
|
||||
// 2. args( $el, event, callback )
|
||||
} else {
|
||||
$el = a1; event = a2; callback = a3;
|
||||
}
|
||||
} else {
|
||||
|
||||
// 3. args( event, selector, callback )
|
||||
if( a3 ) {
|
||||
event = a1; selector = a2; callback = a3;
|
||||
|
||||
// 4. args( event, callback )
|
||||
} else {
|
||||
event = a1; callback = a2;
|
||||
}
|
||||
}
|
||||
|
||||
// element
|
||||
$el = this.getEventTarget( $el );
|
||||
|
||||
// modify callback
|
||||
if( typeof callback === 'string' ) {
|
||||
callback = this.proxyEvent( this[callback] );
|
||||
}
|
||||
|
||||
// modify event
|
||||
event = event + '.' + this.cid;
|
||||
|
||||
// args
|
||||
if( selector ) {
|
||||
args = [ event, selector, callback ];
|
||||
} else {
|
||||
args = [ event, callback ];
|
||||
}
|
||||
|
||||
// on()
|
||||
$el.on.apply($el, args);
|
||||
},
|
||||
|
||||
/**
|
||||
* off
|
||||
*
|
||||
* Removes an event handler similar to jQuery
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
off: function( a1, a2 ,a3 ){
|
||||
|
||||
// vars
|
||||
var $el, event, selector, args;
|
||||
|
||||
// find args
|
||||
if( a1 instanceof jQuery ) {
|
||||
|
||||
// 1. args( $el, event, selector )
|
||||
if( a3 ) {
|
||||
$el = a1; event = a2; selector = a3;
|
||||
|
||||
// 2. args( $el, event )
|
||||
} else {
|
||||
$el = a1; event = a2;
|
||||
}
|
||||
} else {
|
||||
|
||||
// 3. args( event, selector )
|
||||
if( a2 ) {
|
||||
event = a1; selector = a2;
|
||||
|
||||
// 4. args( event )
|
||||
} else {
|
||||
event = a1;
|
||||
}
|
||||
}
|
||||
|
||||
// element
|
||||
$el = this.getEventTarget( $el );
|
||||
|
||||
// modify event
|
||||
event = event + '.' + this.cid;
|
||||
|
||||
// args
|
||||
if( selector ) {
|
||||
args = [ event, selector ];
|
||||
} else {
|
||||
args = [ event ];
|
||||
}
|
||||
|
||||
// off()
|
||||
$el.off.apply($el, args);
|
||||
},
|
||||
|
||||
/**
|
||||
* trigger
|
||||
*
|
||||
* Triggers an event similar to jQuery
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
trigger: function( name, args, bubbles ){
|
||||
var $el = this.getEventTarget();
|
||||
if( bubbles ) {
|
||||
$el.trigger.apply( $el, arguments );
|
||||
} else {
|
||||
$el.triggerHandler.apply( $el, arguments );
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
/**
|
||||
* addActions
|
||||
*
|
||||
* Adds multiple action handlers
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object actions {action1 : callback, action2 : callback, etc }
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
addActions: function( actions ){
|
||||
actions = actions || this.actions || null;
|
||||
if( !actions ) return false;
|
||||
for( var i in actions ) {
|
||||
this.addAction( i, actions[i] );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* removeActions
|
||||
*
|
||||
* Removes multiple action handlers
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object actions {action1 : callback, action2 : callback, etc }
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
removeActions: function( actions ){
|
||||
actions = actions || this.actions || null;
|
||||
if( !actions ) return false;
|
||||
for( var i in actions ) {
|
||||
this.removeAction( i, actions[i] );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* addAction
|
||||
*
|
||||
* Adds an action using the wp.hooks library
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
addAction: function( name, callback, priority ){
|
||||
//console.log('addAction', name, priority);
|
||||
// defaults
|
||||
priority = priority || this.priority;
|
||||
|
||||
// modify callback
|
||||
if( typeof callback === 'string' ) {
|
||||
callback = this[ callback ];
|
||||
}
|
||||
|
||||
// add
|
||||
acf.addAction(name, callback, priority, this);
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* removeAction
|
||||
*
|
||||
* Remove an action using the wp.hooks library
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
removeAction: function( name, callback ){
|
||||
acf.removeAction(name, this[ callback ]);
|
||||
},
|
||||
|
||||
/**
|
||||
* addFilters
|
||||
*
|
||||
* Adds multiple filter handlers
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object filters {filter1 : callback, filter2 : callback, etc }
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
addFilters: function( filters ){
|
||||
filters = filters || this.filters || null;
|
||||
if( !filters ) return false;
|
||||
for( var i in filters ) {
|
||||
this.addFilter( i, filters[i] );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* addFilter
|
||||
*
|
||||
* Adds a filter using the wp.hooks library
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
addFilter: function( name, callback, priority ){
|
||||
|
||||
// defaults
|
||||
priority = priority || this.priority;
|
||||
|
||||
// modify callback
|
||||
if( typeof callback === 'string' ) {
|
||||
callback = this[ callback ];
|
||||
}
|
||||
|
||||
// add
|
||||
acf.addFilter(name, callback, priority, this);
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* removeFilters
|
||||
*
|
||||
* Removes multiple filter handlers
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object filters {filter1 : callback, filter2 : callback, etc }
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
removeFilters: function( filters ){
|
||||
filters = filters || this.filters || null;
|
||||
if( !filters ) return false;
|
||||
for( var i in filters ) {
|
||||
this.removeFilter( i, filters[i] );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* removeFilter
|
||||
*
|
||||
* Remove a filter using the wp.hooks library
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string name
|
||||
* @param string callback
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
removeFilter: function( name, callback ){
|
||||
acf.removeFilter(name, this[ callback ]);
|
||||
},
|
||||
|
||||
/**
|
||||
* $
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 16/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
$: function( selector ){
|
||||
return this.$el.find( selector );
|
||||
},
|
||||
|
||||
/**
|
||||
* remove
|
||||
*
|
||||
* Removes the element and listenters
|
||||
*
|
||||
* @date 19/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
remove: function(){
|
||||
this.removeEvents();
|
||||
this.removeActions();
|
||||
this.removeFilters();
|
||||
this.$el.remove();
|
||||
},
|
||||
|
||||
/**
|
||||
* setTimeout
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 16/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
setTimeout: function( callback, milliseconds ){
|
||||
return setTimeout( this.proxy(callback), milliseconds );
|
||||
},
|
||||
|
||||
/**
|
||||
* time
|
||||
*
|
||||
* used for debugging
|
||||
*
|
||||
* @date 7/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
time: function(){
|
||||
console.time( this.id || this.cid );
|
||||
},
|
||||
|
||||
/**
|
||||
* timeEnd
|
||||
*
|
||||
* used for debugging
|
||||
*
|
||||
* @date 7/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
timeEnd: function(){
|
||||
console.timeEnd( this.id || this.cid );
|
||||
},
|
||||
|
||||
/**
|
||||
* show
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 15/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
show: function(){
|
||||
acf.show( this.$el );
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* hide
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 15/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
hide: function(){
|
||||
acf.hide( this.$el );
|
||||
},
|
||||
|
||||
/**
|
||||
* proxy
|
||||
*
|
||||
* Returns a new function scoped to this model
|
||||
*
|
||||
* @date 29/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param function callback
|
||||
* @return function
|
||||
*/
|
||||
|
||||
proxy: function( callback ){
|
||||
return $.proxy( callback, this );
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
// Set up inheritance for the model
|
||||
Model.extend = extend;
|
||||
|
||||
// Global model storage
|
||||
acf.models = {};
|
||||
|
||||
/**
|
||||
* acf.getInstance
|
||||
*
|
||||
* This function will get an instance from an element
|
||||
*
|
||||
* @date 5/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getInstance = function( $el ){
|
||||
return $el.data('acf');
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getInstances
|
||||
*
|
||||
* This function will get an array of instances from multiple elements
|
||||
*
|
||||
* @date 5/3/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getInstances = function( $el ){
|
||||
var instances = [];
|
||||
$el.each(function(){
|
||||
instances.push( acf.getInstance( $(this) ) );
|
||||
});
|
||||
return instances;
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,146 @@
|
||||
(function($, undefined){
|
||||
|
||||
var Notice = acf.Model.extend({
|
||||
|
||||
data: {
|
||||
text: '',
|
||||
type: '',
|
||||
timeout: 0,
|
||||
dismiss: true,
|
||||
target: false,
|
||||
close: function(){}
|
||||
},
|
||||
|
||||
events: {
|
||||
'click .acf-notice-dismiss': 'onClickClose',
|
||||
},
|
||||
|
||||
tmpl: function(){
|
||||
return '<div class="acf-notice"></div>';
|
||||
},
|
||||
|
||||
setup: function( props ){
|
||||
$.extend(this.data, props);
|
||||
this.$el = $(this.tmpl());
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// render
|
||||
this.render();
|
||||
|
||||
// show
|
||||
this.show();
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// class
|
||||
this.type( this.get('type') );
|
||||
|
||||
// text
|
||||
this.html( '<p>' + this.get('text') + '</p>' );
|
||||
|
||||
// close
|
||||
if( this.get('dismiss') ) {
|
||||
this.$el.append('<a href="#" class="acf-notice-dismiss acf-icon -cancel small"></a>');
|
||||
this.$el.addClass('-dismiss');
|
||||
}
|
||||
|
||||
// timeout
|
||||
var timeout = this.get('timeout');
|
||||
if( timeout ) {
|
||||
this.away( timeout );
|
||||
}
|
||||
},
|
||||
|
||||
update: function( props ){
|
||||
|
||||
// update
|
||||
$.extend(this.data, props);
|
||||
|
||||
// re-initialize
|
||||
this.initialize();
|
||||
|
||||
// refresh events
|
||||
this.removeEvents();
|
||||
this.addEvents();
|
||||
},
|
||||
|
||||
show: function(){
|
||||
var $target = this.get('target');
|
||||
if( $target ) {
|
||||
$target.prepend( this.$el );
|
||||
}
|
||||
},
|
||||
|
||||
hide: function(){
|
||||
this.$el.remove();
|
||||
},
|
||||
|
||||
away: function( timeout ){
|
||||
this.setTimeout(function(){
|
||||
acf.remove( this.$el );
|
||||
}, timeout );
|
||||
},
|
||||
|
||||
type: function( type ){
|
||||
|
||||
// remove prev type
|
||||
var prevType = this.get('type');
|
||||
if( prevType ) {
|
||||
this.$el.removeClass('-' + prevType);
|
||||
}
|
||||
|
||||
// add new type
|
||||
this.$el.addClass('-' + type);
|
||||
|
||||
// backwards compatibility
|
||||
if( type == 'error' ) {
|
||||
this.$el.addClass('acf-error-message');
|
||||
}
|
||||
},
|
||||
|
||||
html: function( html ){
|
||||
this.$el.html( html );
|
||||
},
|
||||
|
||||
text: function( text ){
|
||||
this.$('p').html( text );
|
||||
},
|
||||
|
||||
onClickClose: function( e, $el ){
|
||||
e.preventDefault();
|
||||
this.get('close').apply(this, arguments);
|
||||
this.remove();
|
||||
}
|
||||
});
|
||||
|
||||
acf.newNotice = function( props ){
|
||||
|
||||
// ensure object
|
||||
if( typeof props !== 'object' ) {
|
||||
props = { text: props };
|
||||
}
|
||||
|
||||
// instantiate
|
||||
return new Notice( props );
|
||||
};
|
||||
|
||||
var noticeManager = new acf.Model({
|
||||
wait: 'prepare',
|
||||
priority: 1,
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $notice = $('.acf-admin-notice');
|
||||
|
||||
// move to avoid WP flicker
|
||||
if( $notice.length ) {
|
||||
$('h1:first').after( $notice );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,34 @@
|
||||
(function($, undefined){
|
||||
|
||||
var panel = new acf.Model({
|
||||
|
||||
events: {
|
||||
'click .acf-panel-title': 'onClick',
|
||||
},
|
||||
|
||||
onClick: function( e, $el ){
|
||||
e.preventDefault();
|
||||
this.toggle( $el.parent() );
|
||||
},
|
||||
|
||||
isOpen: function( $el ) {
|
||||
return $el.hasClass('-open');
|
||||
},
|
||||
|
||||
toggle: function( $el ){
|
||||
this.isOpen($el) ? this.close( $el ) : this.open( $el );
|
||||
},
|
||||
|
||||
open: function( $el ){
|
||||
$el.addClass('-open');
|
||||
$el.find('.acf-panel-title i').attr('class', 'dashicons dashicons-arrow-down');
|
||||
},
|
||||
|
||||
close: function( $el ){
|
||||
$el.removeClass('-open');
|
||||
$el.find('.acf-panel-title i').attr('class', 'dashicons dashicons-arrow-right');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,121 @@
|
||||
(function($, undefined){
|
||||
|
||||
acf.models.Popup = acf.Model.extend({
|
||||
|
||||
data: {
|
||||
title: '',
|
||||
content: '',
|
||||
width: 0,
|
||||
height: 0,
|
||||
loading: false,
|
||||
},
|
||||
|
||||
events: {
|
||||
'click [data-event="close"]': 'onClickClose',
|
||||
'click .acf-close-popup': 'onClickClose',
|
||||
},
|
||||
|
||||
setup: function( props ){
|
||||
$.extend(this.data, props);
|
||||
this.$el = $(this.tmpl());
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
this.render();
|
||||
this.open();
|
||||
},
|
||||
|
||||
tmpl: function(){
|
||||
return [
|
||||
'<div id="acf-popup">',
|
||||
'<div class="acf-popup-box acf-box">',
|
||||
'<div class="title"><h3></h3><a href="#" class="acf-icon -cancel grey" data-event="close"></a></div>',
|
||||
'<div class="inner"></div>',
|
||||
'<div class="loading"><i class="acf-loading"></i></div>',
|
||||
'</div>',
|
||||
'<div class="bg" data-event="close"></div>',
|
||||
'</div>'
|
||||
].join('');
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// vars
|
||||
var title = this.get('title');
|
||||
var content = this.get('content');
|
||||
var loading = this.get('loading');
|
||||
var width = this.get('width');
|
||||
var height = this.get('height');
|
||||
|
||||
// html
|
||||
this.title( title );
|
||||
this.content( content );
|
||||
|
||||
// width
|
||||
if( width ) {
|
||||
this.$('.acf-popup-box').css('width', width);
|
||||
}
|
||||
|
||||
// height
|
||||
if( height ) {
|
||||
this.$('.acf-popup-box').css('min-height', height);
|
||||
}
|
||||
|
||||
// loading
|
||||
this.loading( loading );
|
||||
|
||||
// action
|
||||
acf.doAction('append', this.$el);
|
||||
|
||||
},
|
||||
|
||||
update: function( props ){
|
||||
this.data = acf.parseArgs(props, this.data);
|
||||
this.render();
|
||||
},
|
||||
|
||||
title: function( title ){
|
||||
this.$('.title:first h3').html( title );
|
||||
},
|
||||
|
||||
content: function( content ){
|
||||
this.$('.inner:first').html( content );
|
||||
},
|
||||
|
||||
loading: function( show ){
|
||||
var $loading = this.$('.loading:first');
|
||||
show ? $loading.show() : $loading.hide();
|
||||
},
|
||||
|
||||
open: function(){
|
||||
$('body').append( this.$el );
|
||||
},
|
||||
|
||||
close: function(){
|
||||
this.remove();
|
||||
},
|
||||
|
||||
onClickClose: function( e, $el ){
|
||||
e.preventDefault();
|
||||
this.close();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* newPopup
|
||||
*
|
||||
* Creates a new Popup with the supplied props
|
||||
*
|
||||
* @date 17/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param object props
|
||||
* @return object
|
||||
*/
|
||||
|
||||
acf.newPopup = function( props ){
|
||||
return new acf.models.Popup( props );
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,212 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* postboxManager
|
||||
*
|
||||
* Manages postboxes on the screen.
|
||||
*
|
||||
* @date 25/5/19
|
||||
* @since 5.8.1
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
var postboxManager = new acf.Model({
|
||||
wait: 'prepare',
|
||||
priority: 1,
|
||||
initialize: function(){
|
||||
(acf.get('postboxes') || []).map( acf.newPostbox );
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* acf.getPostbox
|
||||
*
|
||||
* Returns a postbox instance.
|
||||
*
|
||||
* @date 23/9/18
|
||||
* @since 5.7.7
|
||||
*
|
||||
* @param mixed $el Either a jQuery element or the postbox id.
|
||||
* @return object
|
||||
*/
|
||||
acf.getPostbox = function( $el ){
|
||||
|
||||
// allow string parameter
|
||||
if( typeof arguments[0] == 'string' ) {
|
||||
$el = $('#' + arguments[0]);
|
||||
}
|
||||
|
||||
// return instance
|
||||
return acf.getInstance( $el );
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getPostboxes
|
||||
*
|
||||
* Returns an array of postbox instances.
|
||||
*
|
||||
* @date 23/9/18
|
||||
* @since 5.7.7
|
||||
*
|
||||
* @param void
|
||||
* @return array
|
||||
*/
|
||||
acf.getPostboxes = function(){
|
||||
return acf.getInstances( $('.acf-postbox') );
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.newPostbox
|
||||
*
|
||||
* Returns a new postbox instance for the given props.
|
||||
*
|
||||
* @date 20/9/18
|
||||
* @since 5.7.6
|
||||
*
|
||||
* @param object props The postbox properties.
|
||||
* @return object
|
||||
*/
|
||||
acf.newPostbox = function( props ){
|
||||
return new acf.models.Postbox( props );
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.models.Postbox
|
||||
*
|
||||
* The postbox model.
|
||||
*
|
||||
* @date 20/9/18
|
||||
* @since 5.7.6
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
acf.models.Postbox = acf.Model.extend({
|
||||
|
||||
data: {
|
||||
id: '',
|
||||
key: '',
|
||||
style: 'default',
|
||||
label: 'top',
|
||||
edit: ''
|
||||
},
|
||||
|
||||
setup: function( props ){
|
||||
|
||||
// compatibilty
|
||||
if( props.editLink ) {
|
||||
props.edit = props.editLink;
|
||||
}
|
||||
|
||||
// extend data
|
||||
$.extend(this.data, props);
|
||||
|
||||
// set $el
|
||||
this.$el = this.$postbox();
|
||||
},
|
||||
|
||||
$postbox: function(){
|
||||
return $('#' + this.get('id'));
|
||||
},
|
||||
|
||||
$hide: function(){
|
||||
return $('#' + this.get('id') + '-hide');
|
||||
},
|
||||
|
||||
$hideLabel: function(){
|
||||
return this.$hide().parent();
|
||||
},
|
||||
|
||||
$hndle: function(){
|
||||
return this.$('> .hndle');
|
||||
},
|
||||
|
||||
$inside: function(){
|
||||
return this.$('> .inside');
|
||||
},
|
||||
|
||||
isVisible: function(){
|
||||
return this.$el.hasClass('acf-hidden');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// Add default class.
|
||||
this.$el.addClass('acf-postbox');
|
||||
|
||||
// Remove 'hide-if-js class.
|
||||
// This class is added by WP to postboxes that are hidden via the "Screen Options" tab.
|
||||
this.$el.removeClass('hide-if-js');
|
||||
|
||||
// Add field group style class (ignore in block editor).
|
||||
if( acf.get('editor') !== 'block' ) {
|
||||
var style = this.get('style');
|
||||
if( style !== 'default' ) {
|
||||
this.$el.addClass( style );
|
||||
}
|
||||
}
|
||||
|
||||
// Add .inside class.
|
||||
this.$inside().addClass('acf-fields').addClass('-' + this.get('label'));
|
||||
|
||||
// Append edit link.
|
||||
var edit = this.get('edit');
|
||||
if( edit ) {
|
||||
this.$hndle().append('<a href="' + edit + '" class="dashicons dashicons-admin-generic acf-hndle-cog acf-js-tooltip" title="' + acf.__('Edit field group') + '"></a>');
|
||||
}
|
||||
|
||||
// Show postbox.
|
||||
this.show();
|
||||
},
|
||||
|
||||
show: function(){
|
||||
|
||||
// Show label.
|
||||
this.$hideLabel().show();
|
||||
|
||||
// toggle on checkbox
|
||||
this.$hide().prop('checked', true);
|
||||
|
||||
// Show postbox
|
||||
this.$el.show().removeClass('acf-hidden');
|
||||
},
|
||||
|
||||
enable: function(){
|
||||
acf.enable( this.$el, 'postbox' );
|
||||
},
|
||||
|
||||
showEnable: function(){
|
||||
this.show();
|
||||
this.enable();
|
||||
},
|
||||
|
||||
hide: function(){
|
||||
|
||||
// Hide label.
|
||||
this.$hideLabel().hide();
|
||||
|
||||
// Hide postbox
|
||||
this.$el.hide().addClass('acf-hidden');
|
||||
},
|
||||
|
||||
disable: function(){
|
||||
acf.disable( this.$el, 'postbox' );
|
||||
},
|
||||
|
||||
hideDisable: function(){
|
||||
this.hide();
|
||||
this.disable();
|
||||
},
|
||||
|
||||
html: function( html ){
|
||||
|
||||
// Update HTML.
|
||||
this.$inside().html( html );
|
||||
|
||||
// Do action.
|
||||
acf.doAction('append', this.$el);
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,593 @@
|
||||
(function($, undefined){
|
||||
|
||||
acf.screen = new acf.Model({
|
||||
|
||||
active: true,
|
||||
|
||||
xhr: false,
|
||||
|
||||
timeout: false,
|
||||
|
||||
wait: 'load',
|
||||
|
||||
events: {
|
||||
'change #page_template': 'onChange',
|
||||
'change #parent_id': 'onChange',
|
||||
'change #post-formats-select': 'onChange',
|
||||
'change .categorychecklist': 'onChange',
|
||||
'change .tagsdiv': 'onChange',
|
||||
'change .acf-taxonomy-field[data-save="1"]': 'onChange',
|
||||
'change #product-type': 'onChange'
|
||||
},
|
||||
|
||||
isPost: function(){
|
||||
return acf.get('screen') === 'post';
|
||||
},
|
||||
|
||||
isUser: function(){
|
||||
return acf.get('screen') === 'user';
|
||||
},
|
||||
|
||||
isTaxonomy: function(){
|
||||
return acf.get('screen') === 'taxonomy';
|
||||
},
|
||||
|
||||
isAttachment: function(){
|
||||
return acf.get('screen') === 'attachment';
|
||||
},
|
||||
|
||||
isNavMenu: function(){
|
||||
return acf.get('screen') === 'nav_menu';
|
||||
},
|
||||
|
||||
isWidget: function(){
|
||||
return acf.get('screen') === 'widget';
|
||||
},
|
||||
|
||||
isComment: function(){
|
||||
return acf.get('screen') === 'comment';
|
||||
},
|
||||
|
||||
getPageTemplate: function(){
|
||||
var $el = $('#page_template');
|
||||
return $el.length ? $el.val() : null;
|
||||
},
|
||||
|
||||
getPageParent: function( e, $el ){
|
||||
var $el = $('#parent_id');
|
||||
return $el.length ? $el.val() : null;
|
||||
},
|
||||
|
||||
getPageType: function( e, $el ){
|
||||
return this.getPageParent() ? 'child' : 'parent';
|
||||
},
|
||||
|
||||
getPostType: function(){
|
||||
return $('#post_type').val();
|
||||
},
|
||||
|
||||
getPostFormat: function( e, $el ){
|
||||
var $el = $('#post-formats-select input:checked');
|
||||
if( $el.length ) {
|
||||
var val = $el.val();
|
||||
return (val == '0') ? 'standard' : val;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
getPostCoreTerms: function(){
|
||||
|
||||
// vars
|
||||
var terms = {};
|
||||
|
||||
// serialize WP taxonomy postboxes
|
||||
var data = acf.serialize( $('.categorydiv, .tagsdiv') );
|
||||
|
||||
// use tax_input (tag, custom-taxonomy) when possible.
|
||||
// this data is already formatted in taxonomy => [terms].
|
||||
if( data.tax_input ) {
|
||||
terms = data.tax_input;
|
||||
}
|
||||
|
||||
// append "category" which uses a different name
|
||||
if( data.post_category ) {
|
||||
terms.category = data.post_category;
|
||||
}
|
||||
|
||||
// convert any string values (tags) into array format
|
||||
for( var tax in terms ) {
|
||||
if( !acf.isArray(terms[tax]) ) {
|
||||
terms[tax] = terms[tax].split(/,[\s]?/);
|
||||
}
|
||||
}
|
||||
|
||||
// return
|
||||
return terms;
|
||||
},
|
||||
|
||||
getPostTerms: function(){
|
||||
|
||||
// Get core terms.
|
||||
var terms = this.getPostCoreTerms();
|
||||
|
||||
// loop over taxonomy fields and add their values
|
||||
acf.getFields({type: 'taxonomy'}).map(function( field ){
|
||||
|
||||
// ignore fields that don't save
|
||||
if( !field.get('save') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var val = field.val();
|
||||
var tax = field.get('taxonomy');
|
||||
|
||||
// check val
|
||||
if( val ) {
|
||||
|
||||
// ensure terms exists
|
||||
terms[ tax ] = terms[ tax ] || [];
|
||||
|
||||
// ensure val is an array
|
||||
val = acf.isArray(val) ? val : [val];
|
||||
|
||||
// append
|
||||
terms[ tax ] = terms[ tax ].concat( val );
|
||||
}
|
||||
});
|
||||
|
||||
// add WC product type
|
||||
if( (productType = this.getProductType()) !== null ) {
|
||||
terms.product_type = [productType];
|
||||
}
|
||||
|
||||
// remove duplicate values
|
||||
for( var tax in terms ) {
|
||||
terms[tax] = acf.uniqueArray(terms[tax]);
|
||||
}
|
||||
|
||||
// return
|
||||
return terms;
|
||||
},
|
||||
|
||||
getProductType: function(){
|
||||
var $el = $('#product-type');
|
||||
return $el.length ? $el.val() : null;
|
||||
},
|
||||
|
||||
check: function(){
|
||||
|
||||
// bail early if not for post
|
||||
if( acf.get('screen') !== 'post' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// abort XHR if is already loading AJAX data
|
||||
if( this.xhr ) {
|
||||
this.xhr.abort();
|
||||
}
|
||||
|
||||
// vars
|
||||
var ajaxData = acf.parseArgs(this.data, {
|
||||
action: 'acf/ajax/check_screen',
|
||||
screen: acf.get('screen'),
|
||||
exists: []
|
||||
});
|
||||
|
||||
// post id
|
||||
if( this.isPost() ) {
|
||||
ajaxData.post_id = acf.get('post_id');
|
||||
}
|
||||
|
||||
// post type
|
||||
if( (postType = this.getPostType()) !== null ) {
|
||||
ajaxData.post_type = postType;
|
||||
}
|
||||
|
||||
// page template
|
||||
if( (pageTemplate = this.getPageTemplate()) !== null ) {
|
||||
ajaxData.page_template = pageTemplate;
|
||||
}
|
||||
|
||||
// page parent
|
||||
if( (pageParent = this.getPageParent()) !== null ) {
|
||||
ajaxData.page_parent = pageParent;
|
||||
}
|
||||
|
||||
// page type
|
||||
if( (pageType = this.getPageType()) !== null ) {
|
||||
ajaxData.page_type = pageType;
|
||||
}
|
||||
|
||||
// post format
|
||||
if( (postFormat = this.getPostFormat()) !== null ) {
|
||||
ajaxData.post_format = postFormat;
|
||||
}
|
||||
|
||||
// post terms
|
||||
if( (postTerms = this.getPostTerms()) !== null ) {
|
||||
ajaxData.post_terms = postTerms;
|
||||
}
|
||||
|
||||
// add array of existing postboxes to increase performance and reduce JSON HTML
|
||||
acf.getPostboxes().map(function( postbox ){
|
||||
ajaxData.exists.push( postbox.get('key') );
|
||||
});
|
||||
|
||||
// filter
|
||||
ajaxData = acf.applyFilters('check_screen_args', ajaxData);
|
||||
|
||||
// success
|
||||
var onSuccess = function( json ){
|
||||
|
||||
// Check success.
|
||||
if( acf.isAjaxSuccess(json) ) {
|
||||
|
||||
// Render post screen.
|
||||
if( acf.get('screen') == 'post' ) {
|
||||
this.renderPostScreen( json.data );
|
||||
|
||||
// Render user screen.
|
||||
} else if( acf.get('screen') == 'user' ) {
|
||||
this.renderUserScreen( json.data );
|
||||
}
|
||||
}
|
||||
|
||||
// action
|
||||
acf.doAction('check_screen_complete', json.data, ajaxData);
|
||||
};
|
||||
|
||||
// ajax
|
||||
this.xhr = $.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax( ajaxData ),
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
context: this,
|
||||
success: onSuccess
|
||||
});
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
this.setTimeout(this.check, 1);
|
||||
},
|
||||
|
||||
renderPostScreen: function( data ){
|
||||
|
||||
// vars
|
||||
var visible = [];
|
||||
|
||||
// Helper function to copy events
|
||||
var copyEvents = function( $from, $to ){
|
||||
var events = $._data($from[0]).events;
|
||||
for( var type in events ) {
|
||||
for( var i = 0; i < events[type].length; i++ ) {
|
||||
$to.on( type, events[type][i].handler );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function to sort metabox.
|
||||
var sortMetabox = function( id, ids ){
|
||||
|
||||
// Find position of id within ids.
|
||||
var index = ids.indexOf( id );
|
||||
|
||||
// Bail early if index not found.
|
||||
if( index == -1 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Loop over metaboxes behind (in reverse order).
|
||||
for( var i = index-1; i >= 0; i-- ) {
|
||||
if( $('#'+ids[i]).length ) {
|
||||
return $('#'+ids[i]).after( $('#'+id) );
|
||||
}
|
||||
}
|
||||
|
||||
// Loop over metaboxes infront.
|
||||
for( var i = index+1; i < ids.length; i++ ) {
|
||||
if( $('#'+ids[i]).length ) {
|
||||
return $('#'+ids[i]).before( $('#'+id) );
|
||||
}
|
||||
}
|
||||
|
||||
// Return false if not sorted.
|
||||
return false;
|
||||
};
|
||||
|
||||
// Show these postboxes.
|
||||
data.results.map(function( result, i ){
|
||||
|
||||
// vars
|
||||
var postbox = acf.getPostbox( result.id );
|
||||
|
||||
// Create postbox if doesn't exist.
|
||||
if( !postbox ) {
|
||||
|
||||
// Create it.
|
||||
var $postbox = $([
|
||||
'<div id="' + result.id + '" class="postbox">',
|
||||
'<button type="button" class="handlediv" aria-expanded="false">',
|
||||
'<span class="screen-reader-text">Toggle panel: ' + result.title + '</span>',
|
||||
'<span class="toggle-indicator" aria-hidden="true"></span>',
|
||||
'</button>',
|
||||
'<h2 class="hndle ui-sortable-handle">',
|
||||
'<span>' + result.title + '</span>',
|
||||
'</h2>',
|
||||
'<div class="inside">',
|
||||
result.html,
|
||||
'</div>',
|
||||
'</div>'
|
||||
].join(''));
|
||||
|
||||
// Create new hide toggle.
|
||||
if( $('#adv-settings').length ) {
|
||||
var $prefs = $('#adv-settings .metabox-prefs');
|
||||
var $label = $([
|
||||
'<label for="' + result.id + '-hide">',
|
||||
'<input class="hide-postbox-tog" name="' + result.id + '-hide" type="checkbox" id="' + result.id + '-hide" value="' + result.id + '" checked="checked">',
|
||||
' ' + result.title,
|
||||
'</label>'
|
||||
].join(''));
|
||||
|
||||
// Copy default WP events onto checkbox.
|
||||
copyEvents( $prefs.find('input').first(), $label.find('input') );
|
||||
|
||||
// Append hide label
|
||||
$prefs.append( $label );
|
||||
}
|
||||
|
||||
// Append metabox to the bottom of "side-sortables".
|
||||
if( result.position === 'side' ) {
|
||||
$('#' + result.position + '-sortables').append( $postbox );
|
||||
|
||||
// Prepend metabox to the top of "normal-sortbables".
|
||||
} else {
|
||||
$('#' + result.position + '-sortables').prepend( $postbox );
|
||||
}
|
||||
|
||||
// Position metabox amongst existing ACF metaboxes within the same location.
|
||||
var order = [];
|
||||
data.results.map(function( _result ){
|
||||
if( result.position === _result.position && $('#' + result.position + '-sortables #' + _result.id).length ) {
|
||||
order.push( _result.id );
|
||||
}
|
||||
});
|
||||
sortMetabox(result.id, order)
|
||||
|
||||
// Check 'sorted' for user preference.
|
||||
if( data.sorted ) {
|
||||
|
||||
// Loop over each position (acf_after_title, side, normal).
|
||||
for( var position in data.sorted ) {
|
||||
|
||||
// Explode string into array of ids.
|
||||
var order = data.sorted[position].split(',');
|
||||
|
||||
// Position metabox relative to order.
|
||||
if( sortMetabox(result.id, order) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Copy default WP events onto metabox.
|
||||
var $submitdiv = $('#submitdiv');
|
||||
if( $('#submitdiv').length ) {
|
||||
copyEvents( $submitdiv.children('.handlediv'), $postbox.children('.handlediv') );
|
||||
copyEvents( $submitdiv.children('.hndle'), $postbox.children('.hndle') );
|
||||
}
|
||||
|
||||
// Initalize it (modifies HTML).
|
||||
postbox = acf.newPostbox( result );
|
||||
|
||||
// Trigger action.
|
||||
acf.doAction('append', $postbox);
|
||||
acf.doAction('append_postbox', postbox);
|
||||
}
|
||||
|
||||
// show postbox
|
||||
postbox.showEnable();
|
||||
|
||||
// Do action.
|
||||
acf.doAction('show_postbox', postbox);
|
||||
|
||||
// append
|
||||
visible.push( result.id );
|
||||
});
|
||||
|
||||
// Hide these postboxes.
|
||||
acf.getPostboxes().map(function( postbox ){
|
||||
if( visible.indexOf( postbox.get('id') ) === -1 ) {
|
||||
postbox.hideDisable();
|
||||
|
||||
// Do action.
|
||||
acf.doAction('hide_postbox', postbox);
|
||||
}
|
||||
});
|
||||
|
||||
// Update style.
|
||||
$('#acf-style').html( data.style );
|
||||
},
|
||||
|
||||
renderUserScreen: function( json ){
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* gutenScreen
|
||||
*
|
||||
* Adds compatibility with the Gutenberg edit screen.
|
||||
*
|
||||
* @date 11/12/18
|
||||
* @since 5.8.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
var gutenScreen = new acf.Model({
|
||||
|
||||
// Wait until load to avoid 'core' issues when loading taxonomies.
|
||||
wait: 'load',
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// Bail early if not Gutenberg.
|
||||
if( !acf.isGutenberg() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Listen for changes.
|
||||
wp.data.subscribe(this.proxy(this.onChange));
|
||||
|
||||
// Customize "acf.screen.get" functions.
|
||||
acf.screen.getPageTemplate = this.getPageTemplate;
|
||||
acf.screen.getPageParent = this.getPageParent;
|
||||
acf.screen.getPostType = this.getPostType;
|
||||
acf.screen.getPostFormat = this.getPostFormat;
|
||||
acf.screen.getPostCoreTerms = this.getPostCoreTerms;
|
||||
|
||||
// Disable unload
|
||||
acf.unload.disable();
|
||||
|
||||
// Add actions.
|
||||
//this.addAction( 'append_postbox', acf.screen.refreshAvailableMetaBoxesPerLocation );
|
||||
},
|
||||
|
||||
onChange: function(){
|
||||
|
||||
// Get edits.
|
||||
var edits = wp.data.select( 'core/editor' ).getPostEdits();
|
||||
|
||||
// Check specific attributes.
|
||||
var attributes = [
|
||||
'template',
|
||||
'parent',
|
||||
'format'
|
||||
];
|
||||
|
||||
// Append taxonomy attributes.
|
||||
var taxonomies = wp.data.select( 'core' ).getTaxonomies() || [];
|
||||
taxonomies.map(function( taxonomy ){
|
||||
attributes.push( taxonomy.rest_base );
|
||||
});
|
||||
|
||||
// Filter out attributes that have not changed.
|
||||
attributes = attributes.filter(this.proxy(function( attr ){
|
||||
return ( edits[attr] !== undefined && edits[attr] !== this.get(attr) );
|
||||
}));
|
||||
|
||||
// Trigger change if has attributes.
|
||||
if( attributes.length ) {
|
||||
this.triggerChange( edits )
|
||||
}
|
||||
},
|
||||
|
||||
triggerChange: function( edits ){
|
||||
|
||||
// Update this.data if edits are provided.
|
||||
if( edits !== undefined ) {
|
||||
this.data = edits;
|
||||
}
|
||||
|
||||
// Check screen.
|
||||
acf.screen.check();
|
||||
},
|
||||
|
||||
getPageTemplate: function(){
|
||||
return wp.data.select( 'core/editor' ).getEditedPostAttribute( 'template' );
|
||||
},
|
||||
|
||||
getPageParent: function( e, $el ){
|
||||
return wp.data.select( 'core/editor' ).getEditedPostAttribute( 'parent' );
|
||||
},
|
||||
|
||||
getPostType: function(){
|
||||
return wp.data.select( 'core/editor' ).getEditedPostAttribute( 'type' );
|
||||
},
|
||||
|
||||
getPostFormat: function( e, $el ){
|
||||
return wp.data.select( 'core/editor' ).getEditedPostAttribute( 'format' );
|
||||
},
|
||||
|
||||
getPostCoreTerms: function(){
|
||||
|
||||
// vars
|
||||
var terms = {};
|
||||
|
||||
// Loop over taxonomies.
|
||||
var taxonomies = wp.data.select( 'core' ).getTaxonomies() || [];
|
||||
taxonomies.map(function( taxonomy ){
|
||||
|
||||
// Append selected taxonomies to terms object.
|
||||
var postTerms = wp.data.select( 'core/editor' ).getEditedPostAttribute( taxonomy.rest_base );
|
||||
if( postTerms ) {
|
||||
terms[ taxonomy.slug ] = postTerms;
|
||||
}
|
||||
});
|
||||
|
||||
// return
|
||||
return terms;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* acf.screen.refreshAvailableMetaBoxesPerLocation
|
||||
*
|
||||
* Refreshes the WP data state based on metaboxes found in the DOM.
|
||||
*
|
||||
* Caution. Not safe to use.
|
||||
* Causes duplicate dispatch listeners when saving post resulting in duplicate postmeta.
|
||||
*
|
||||
* @date 6/3/19
|
||||
* @since 5.7.13
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
acf.screen.refreshAvailableMetaBoxesPerLocation = function() {
|
||||
|
||||
// Extract vars.
|
||||
var select = wp.data.select( 'core/edit-post' );
|
||||
var dispatch = wp.data.dispatch( 'core/edit-post' );
|
||||
|
||||
// Load current metabox locations and data.
|
||||
var data = {};
|
||||
select.getActiveMetaBoxLocations().map(function( location ){
|
||||
data[ location ] = select.getMetaBoxesPerLocation( location );
|
||||
});
|
||||
|
||||
// Generate flat array of existing ids.
|
||||
var ids = [];
|
||||
for( var k in data ) {
|
||||
ids = ids.concat( data[k].map(function(m){ return m.id; }) );
|
||||
}
|
||||
|
||||
// Append ACF metaboxes.
|
||||
acf.getPostboxes().map(function( postbox ){
|
||||
|
||||
// Ignore if already exists in data.
|
||||
if( ids.indexOf( postbox.get('id') ) !== -1 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get metabox location looking at parent form.
|
||||
var location = postbox.$el.closest('form').attr('class').replace('metabox-location-', '');
|
||||
|
||||
// Ensure location exists.
|
||||
data[ location ] = data[ location ] || [];
|
||||
|
||||
// Append.
|
||||
data[ location ].push({
|
||||
id: postbox.get('id'),
|
||||
title: postbox.get('title')
|
||||
});
|
||||
});
|
||||
|
||||
// Update state.
|
||||
dispatch.setAvailableMetaBoxesPerLocation(data);
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,793 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* acf.newSelect2
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 13/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.newSelect2 = function( $select, props ){
|
||||
|
||||
// defaults
|
||||
props = acf.parseArgs(props, {
|
||||
allowNull: false,
|
||||
placeholder: '',
|
||||
multiple: false,
|
||||
field: false,
|
||||
ajax: false,
|
||||
ajaxAction: '',
|
||||
ajaxData: function( data ){ return data; },
|
||||
ajaxResults: function( json ){ return json; },
|
||||
});
|
||||
|
||||
// initialize
|
||||
if( getVersion() == 4 ) {
|
||||
var select2 = new Select2_4( $select, props );
|
||||
} else {
|
||||
var select2 = new Select2_3( $select, props );
|
||||
}
|
||||
|
||||
// actions
|
||||
acf.doAction('new_select2', select2);
|
||||
|
||||
// return
|
||||
return select2;
|
||||
};
|
||||
|
||||
/**
|
||||
* getVersion
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 13/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
function getVersion() {
|
||||
|
||||
// v4
|
||||
if( acf.isset(window, 'jQuery', 'fn', 'select2', 'amd') ) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
// v3
|
||||
if( acf.isset(window, 'Select2') ) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
// return
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Select2
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 13/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var Select2 = acf.Model.extend({
|
||||
|
||||
setup: function( $select, props ){
|
||||
$.extend(this.data, props);
|
||||
this.$el = $select;
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
},
|
||||
|
||||
selectOption: function( value ){
|
||||
var $option = this.getOption( value );
|
||||
if( !$option.prop('selected') ) {
|
||||
$option.prop('selected', true).trigger('change');
|
||||
}
|
||||
},
|
||||
|
||||
unselectOption: function( value ){
|
||||
var $option = this.getOption( value );
|
||||
if( $option.prop('selected') ) {
|
||||
$option.prop('selected', false).trigger('change');
|
||||
}
|
||||
},
|
||||
|
||||
getOption: function( value ){
|
||||
return this.$('option[value="' + value + '"]');
|
||||
},
|
||||
|
||||
addOption: function( option ){
|
||||
|
||||
// defaults
|
||||
option = acf.parseArgs(option, {
|
||||
id: '',
|
||||
text: '',
|
||||
selected: false
|
||||
});
|
||||
|
||||
// vars
|
||||
var $option = this.getOption( option.id );
|
||||
|
||||
// append
|
||||
if( !$option.length ) {
|
||||
$option = $('<option></option>');
|
||||
$option.html( option.text );
|
||||
$option.attr('value', option.id);
|
||||
$option.prop('selected', option.selected);
|
||||
this.$el.append($option);
|
||||
}
|
||||
|
||||
// chain
|
||||
return $option;
|
||||
},
|
||||
|
||||
getValue: function(){
|
||||
|
||||
// vars
|
||||
var val = [];
|
||||
var $options = this.$el.find('option:selected');
|
||||
|
||||
// bail early if no selected
|
||||
if( !$options.exists() ) {
|
||||
return val;
|
||||
}
|
||||
|
||||
// sort by attribute
|
||||
$options = $options.sort(function(a, b) {
|
||||
return +a.getAttribute('data-i') - +b.getAttribute('data-i');
|
||||
});
|
||||
|
||||
// loop
|
||||
$options.each(function(){
|
||||
var $el = $(this);
|
||||
val.push({
|
||||
$el: $el,
|
||||
id: $el.attr('value'),
|
||||
text: $el.text(),
|
||||
});
|
||||
});
|
||||
|
||||
// return
|
||||
return val;
|
||||
|
||||
},
|
||||
|
||||
mergeOptions: function(){
|
||||
|
||||
},
|
||||
|
||||
getChoices: function(){
|
||||
|
||||
// callback
|
||||
var crawl = function( $parent ){
|
||||
|
||||
// vars
|
||||
var choices = [];
|
||||
|
||||
// loop
|
||||
$parent.children().each(function(){
|
||||
|
||||
// vars
|
||||
var $child = $(this);
|
||||
|
||||
// optgroup
|
||||
if( $child.is('optgroup') ) {
|
||||
|
||||
choices.push({
|
||||
text: $child.attr('label'),
|
||||
children: crawl( $child )
|
||||
});
|
||||
|
||||
// option
|
||||
} else {
|
||||
|
||||
choices.push({
|
||||
id: $child.attr('value'),
|
||||
text: $child.text()
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// return
|
||||
return choices;
|
||||
};
|
||||
|
||||
// crawl
|
||||
return crawl( this.$el );
|
||||
},
|
||||
|
||||
decodeChoices: function( choices ){
|
||||
|
||||
// callback
|
||||
var crawl = function( items ){
|
||||
items.map(function( item ){
|
||||
item.text = acf.decode( item.text );
|
||||
if( item.children ) {
|
||||
item.children = crawl( item.children );
|
||||
}
|
||||
return item;
|
||||
});
|
||||
return items;
|
||||
};
|
||||
|
||||
// crawl
|
||||
return crawl( choices );
|
||||
},
|
||||
|
||||
getAjaxData: function( params ){
|
||||
|
||||
// vars
|
||||
var ajaxData = {
|
||||
action: this.get('ajaxAction'),
|
||||
s: params.term || '',
|
||||
paged: params.page || 1
|
||||
};
|
||||
|
||||
// field helper
|
||||
var field = this.get('field');
|
||||
if( field ) {
|
||||
ajaxData.field_key = field.get('key');
|
||||
}
|
||||
|
||||
// callback
|
||||
var callback = this.get('ajaxData');
|
||||
if( callback ) {
|
||||
ajaxData = callback.apply( this, [ajaxData, params] );
|
||||
}
|
||||
|
||||
// filter
|
||||
ajaxData = acf.applyFilters( 'select2_ajax_data', ajaxData, this.data, this.$el, (field || false), this );
|
||||
|
||||
// return
|
||||
return acf.prepareForAjax(ajaxData);
|
||||
},
|
||||
|
||||
getAjaxResults: function( json, params ){
|
||||
|
||||
// defaults
|
||||
json = acf.parseArgs(json, {
|
||||
results: false,
|
||||
more: false,
|
||||
});
|
||||
|
||||
// decode
|
||||
if( json.results ) {
|
||||
json.results = this.decodeChoices(json.results);
|
||||
}
|
||||
|
||||
// callback
|
||||
var callback = this.get('ajaxResults');
|
||||
if( callback ) {
|
||||
json = callback.apply( this, [json, params] );
|
||||
}
|
||||
|
||||
// filter
|
||||
json = acf.applyFilters( 'select2_ajax_results', json, params, this );
|
||||
|
||||
// return
|
||||
return json;
|
||||
},
|
||||
|
||||
processAjaxResults: function( json, params ){
|
||||
|
||||
// vars
|
||||
var json = this.getAjaxResults( json, params );
|
||||
|
||||
// change more to pagination
|
||||
if( json.more ) {
|
||||
json.pagination = { more: true };
|
||||
}
|
||||
|
||||
// merge together groups
|
||||
setTimeout($.proxy(this.mergeOptions, this), 1);
|
||||
|
||||
// return
|
||||
return json;
|
||||
},
|
||||
|
||||
destroy: function(){
|
||||
|
||||
// destroy via api
|
||||
if( this.$el.data('select2') ) {
|
||||
this.$el.select2('destroy');
|
||||
}
|
||||
|
||||
// destory via HTML (duplicating HTML does not contain data)
|
||||
this.$el.siblings('.select2-container').remove();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Select2_4
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 13/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var Select2_4 = Select2.extend({
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $select = this.$el;
|
||||
var options = {
|
||||
width: '100%',
|
||||
allowClear: this.get('allowNull'),
|
||||
placeholder: this.get('placeholder'),
|
||||
multiple: this.get('multiple'),
|
||||
data: [],
|
||||
escapeMarkup: function( m ){ return m; }
|
||||
};
|
||||
|
||||
// multiple
|
||||
if( options.multiple ) {
|
||||
|
||||
// reorder options
|
||||
this.getValue().map(function( item ){
|
||||
item.$el.detach().appendTo( $select );
|
||||
});
|
||||
}
|
||||
|
||||
// remove conflicting atts
|
||||
$select.removeData('ajax');
|
||||
$select.removeAttr('data-ajax');
|
||||
|
||||
// ajax
|
||||
if( this.get('ajax') ) {
|
||||
|
||||
options.ajax = {
|
||||
url: acf.get('ajaxurl'),
|
||||
delay: 250,
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
cache: false,
|
||||
data: $.proxy(this.getAjaxData, this),
|
||||
processResults: $.proxy(this.processAjaxResults, this),
|
||||
};
|
||||
}
|
||||
|
||||
// filter for 3rd party customization
|
||||
//options = acf.applyFilters( 'select2_args', options, $select, this );
|
||||
var field = this.get('field');
|
||||
options = acf.applyFilters( 'select2_args', options, $select, this.data, (field || false), this );
|
||||
|
||||
// add select2
|
||||
$select.select2( options );
|
||||
|
||||
// get container (Select2 v4 does not return this from constructor)
|
||||
var $container = $select.next('.select2-container');
|
||||
|
||||
// multiple
|
||||
if( options.multiple ) {
|
||||
|
||||
// vars
|
||||
var $ul = $container.find('ul');
|
||||
|
||||
// sortable
|
||||
$ul.sortable({
|
||||
stop: function( e ) {
|
||||
|
||||
// loop
|
||||
$ul.find('.select2-selection__choice').each(function() {
|
||||
|
||||
// vars
|
||||
var $option = $( $(this).data('data').element );
|
||||
|
||||
// detach and re-append to end
|
||||
$option.detach().appendTo( $select );
|
||||
});
|
||||
|
||||
// trigger change on input (JS error if trigger on select)
|
||||
$select.trigger('change');
|
||||
}
|
||||
});
|
||||
|
||||
// on select, move to end
|
||||
$select.on('select2:select', this.proxy(function( e ){
|
||||
this.getOption( e.params.data.id ).detach().appendTo( this.$el );
|
||||
}));
|
||||
}
|
||||
|
||||
// add class
|
||||
$container.addClass('-acf');
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('select2_init', $select, options, this.data, (field || false), this);
|
||||
},
|
||||
|
||||
mergeOptions: function(){
|
||||
|
||||
// vars
|
||||
var $prevOptions = false;
|
||||
var $prevGroup = false;
|
||||
|
||||
// loop
|
||||
$('.select2-results__option[role="group"]').each(function(){
|
||||
|
||||
// vars
|
||||
var $options = $(this).children('ul');
|
||||
var $group = $(this).children('strong');
|
||||
|
||||
// compare to previous
|
||||
if( $prevGroup && $prevGroup.text() === $group.text() ) {
|
||||
$prevOptions.append( $options.children() );
|
||||
$(this).remove();
|
||||
return;
|
||||
}
|
||||
|
||||
// update vars
|
||||
$prevOptions = $options;
|
||||
$prevGroup = $group;
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
/**
|
||||
* Select2_3
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 13/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var Select2_3 = Select2.extend({
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $select = this.$el;
|
||||
var value = this.getValue();
|
||||
var multiple = this.get('multiple');
|
||||
var options = {
|
||||
width: '100%',
|
||||
allowClear: this.get('allowNull'),
|
||||
placeholder: this.get('placeholder'),
|
||||
separator: '||',
|
||||
multiple: this.get('multiple'),
|
||||
data: this.getChoices(),
|
||||
escapeMarkup: function( m ){ return m; },
|
||||
dropdownCss: {
|
||||
'z-index': '999999999'
|
||||
},
|
||||
initSelection: function( element, callback ) {
|
||||
if( multiple ) {
|
||||
callback( value );
|
||||
} else {
|
||||
callback( value.shift() );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// get hidden input
|
||||
var $input = $select.siblings('input');
|
||||
if( !$input.length ) {
|
||||
$input = $('<input type="hidden" />');
|
||||
$select.before( $input );
|
||||
}
|
||||
|
||||
// set input value
|
||||
inputValue = value.map(function(item){ return item.id }).join('||');
|
||||
$input.val( inputValue );
|
||||
|
||||
// multiple
|
||||
if( options.multiple ) {
|
||||
|
||||
// reorder options
|
||||
value.map(function( item ){
|
||||
item.$el.detach().appendTo( $select );
|
||||
});
|
||||
}
|
||||
|
||||
// remove blank option as we have a clear all button
|
||||
if( options.allowClear ) {
|
||||
options.data = options.data.filter(function(item){
|
||||
return item.id !== '';
|
||||
});
|
||||
}
|
||||
|
||||
// remove conflicting atts
|
||||
$select.removeData('ajax');
|
||||
$select.removeAttr('data-ajax');
|
||||
|
||||
// ajax
|
||||
if( this.get('ajax') ) {
|
||||
|
||||
options.ajax = {
|
||||
url: acf.get('ajaxurl'),
|
||||
quietMillis: 250,
|
||||
dataType: 'json',
|
||||
type: 'post',
|
||||
cache: false,
|
||||
data: $.proxy(this.getAjaxData, this),
|
||||
results: $.proxy(this.processAjaxResults, this),
|
||||
};
|
||||
}
|
||||
|
||||
// filter for 3rd party customization
|
||||
var field = this.get('field');
|
||||
options = acf.applyFilters( 'select2_args', options, $select, this.data, (field || false), this );
|
||||
|
||||
// add select2
|
||||
$input.select2( options );
|
||||
|
||||
// get container
|
||||
var $container = $input.select2('container');
|
||||
|
||||
// helper to find this select's option
|
||||
var getOption = $.proxy(this.getOption, this);
|
||||
|
||||
// multiple
|
||||
if( options.multiple ) {
|
||||
|
||||
// vars
|
||||
var $ul = $container.find('ul');
|
||||
|
||||
// sortable
|
||||
$ul.sortable({
|
||||
stop: function() {
|
||||
|
||||
// loop
|
||||
$ul.find('.select2-search-choice').each(function() {
|
||||
|
||||
// vars
|
||||
var data = $(this).data('select2Data');
|
||||
var $option = getOption( data.id );
|
||||
|
||||
// detach and re-append to end
|
||||
$option.detach().appendTo( $select );
|
||||
});
|
||||
|
||||
// trigger change on input (JS error if trigger on select)
|
||||
$select.trigger('change');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// on select, create option and move to end
|
||||
$input.on('select2-selecting', function( e ){
|
||||
|
||||
// vars
|
||||
var item = e.choice;
|
||||
var $option = getOption( item.id );
|
||||
|
||||
// create if doesn't exist
|
||||
if( !$option.length ) {
|
||||
$option = $('<option value="' + item.id + '">' + item.text + '</option>');
|
||||
}
|
||||
|
||||
// detach and re-append to end
|
||||
$option.detach().appendTo( $select );
|
||||
});
|
||||
|
||||
// add class
|
||||
$container.addClass('-acf');
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('select2_init', $select, options, this.data, (field || false), this);
|
||||
|
||||
// change
|
||||
$input.on('change', function(){
|
||||
var val = $input.val();
|
||||
if( val.indexOf('||') ) {
|
||||
val = val.split('||');
|
||||
}
|
||||
$select.val( val ).trigger('change');
|
||||
});
|
||||
|
||||
// hide select
|
||||
$select.hide();
|
||||
},
|
||||
|
||||
mergeOptions: function(){
|
||||
|
||||
// vars
|
||||
var $prevOptions = false;
|
||||
var $prevGroup = false;
|
||||
|
||||
// loop
|
||||
$('#select2-drop .select2-result-with-children').each(function(){
|
||||
|
||||
// vars
|
||||
var $options = $(this).children('ul');
|
||||
var $group = $(this).children('.select2-result-label');
|
||||
|
||||
// compare to previous
|
||||
if( $prevGroup && $prevGroup.text() === $group.text() ) {
|
||||
$prevGroup.append( $options.children() );
|
||||
$(this).remove();
|
||||
return;
|
||||
}
|
||||
|
||||
// update vars
|
||||
$prevOptions = $options;
|
||||
$prevGroup = $group;
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
getAjaxData: function( term, page ){
|
||||
|
||||
// create Select2 v4 params
|
||||
var params = {
|
||||
term: term,
|
||||
page: page
|
||||
}
|
||||
|
||||
// return
|
||||
return Select2.prototype.getAjaxData.apply(this, [params]);
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
|
||||
// manager
|
||||
var select2Manager = new acf.Model({
|
||||
priority: 5,
|
||||
wait: 'prepare',
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var locale = acf.get('locale');
|
||||
var rtl = acf.get('rtl');
|
||||
var l10n = acf.get('select2L10n');
|
||||
var version = getVersion();
|
||||
|
||||
// bail ealry if no l10n
|
||||
if( !l10n ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bail early if 'en'
|
||||
if( locale.indexOf('en') === 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// initialize
|
||||
if( version == 4 ) {
|
||||
this.addTranslations4();
|
||||
} else if( version == 3 ) {
|
||||
this.addTranslations3();
|
||||
}
|
||||
},
|
||||
|
||||
addTranslations4: function(){
|
||||
|
||||
// vars
|
||||
var l10n = acf.get('select2L10n');
|
||||
var locale = acf.get('locale');
|
||||
|
||||
// modify local to match html[lang] attribute (used by Select2)
|
||||
locale = locale.replace('_', '-');
|
||||
|
||||
// select2L10n
|
||||
var select2L10n = {
|
||||
errorLoading: function () {
|
||||
return l10n.load_fail;
|
||||
},
|
||||
inputTooLong: function (args) {
|
||||
var overChars = args.input.length - args.maximum;
|
||||
if( overChars > 1 ) {
|
||||
return l10n.input_too_long_n.replace( '%d', overChars );
|
||||
}
|
||||
return l10n.input_too_long_1;
|
||||
},
|
||||
inputTooShort: function( args ){
|
||||
var remainingChars = args.minimum - args.input.length;
|
||||
if( remainingChars > 1 ) {
|
||||
return l10n.input_too_short_n.replace( '%d', remainingChars );
|
||||
}
|
||||
return l10n.input_too_short_1;
|
||||
},
|
||||
loadingMore: function () {
|
||||
return l10n.load_more;
|
||||
},
|
||||
maximumSelected: function( args ) {
|
||||
var maximum = args.maximum;
|
||||
if( maximum > 1 ) {
|
||||
return l10n.selection_too_long_n.replace( '%d', maximum );
|
||||
}
|
||||
return l10n.selection_too_long_1;
|
||||
},
|
||||
noResults: function () {
|
||||
return l10n.matches_0;
|
||||
},
|
||||
searching: function () {
|
||||
return l10n.searching;
|
||||
}
|
||||
};
|
||||
|
||||
// append
|
||||
jQuery.fn.select2.amd.define('select2/i18n/' + locale, [], function(){
|
||||
return select2L10n;
|
||||
});
|
||||
},
|
||||
|
||||
addTranslations3: function(){
|
||||
|
||||
// vars
|
||||
var l10n = acf.get('select2L10n');
|
||||
var locale = acf.get('locale');
|
||||
|
||||
// modify local to match html[lang] attribute (used by Select2)
|
||||
locale = locale.replace('_', '-');
|
||||
|
||||
// select2L10n
|
||||
var select2L10n = {
|
||||
formatMatches: function( matches ) {
|
||||
if( matches > 1 ) {
|
||||
return l10n.matches_n.replace( '%d', matches );
|
||||
}
|
||||
return l10n.matches_1;
|
||||
},
|
||||
formatNoMatches: function() {
|
||||
return l10n.matches_0;
|
||||
},
|
||||
formatAjaxError: function() {
|
||||
return l10n.load_fail;
|
||||
},
|
||||
formatInputTooShort: function( input, min ) {
|
||||
var remainingChars = min - input.length;
|
||||
if( remainingChars > 1 ) {
|
||||
return l10n.input_too_short_n.replace( '%d', remainingChars );
|
||||
}
|
||||
return l10n.input_too_short_1;
|
||||
},
|
||||
formatInputTooLong: function( input, max ) {
|
||||
var overChars = input.length - max;
|
||||
if( overChars > 1 ) {
|
||||
return l10n.input_too_long_n.replace( '%d', overChars );
|
||||
}
|
||||
return l10n.input_too_long_1;
|
||||
},
|
||||
formatSelectionTooBig: function( maximum ) {
|
||||
if( maximum > 1 ) {
|
||||
return l10n.selection_too_long_n.replace( '%d', maximum );
|
||||
}
|
||||
return l10n.selection_too_long_1;
|
||||
},
|
||||
formatLoadMore: function() {
|
||||
return l10n.load_more;
|
||||
},
|
||||
formatSearching: function() {
|
||||
return l10n.searching;
|
||||
}
|
||||
};
|
||||
|
||||
// ensure locales exists
|
||||
$.fn.select2.locales = $.fn.select2.locales || {};
|
||||
|
||||
// append
|
||||
$.fn.select2.locales[ locale ] = select2L10n;
|
||||
$.extend($.fn.select2.defaults, select2L10n);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,398 @@
|
||||
(function($, undefined){
|
||||
|
||||
acf.tinymce = {
|
||||
|
||||
/*
|
||||
* defaults
|
||||
*
|
||||
* This function will return default mce and qt settings
|
||||
*
|
||||
* @type function
|
||||
* @date 18/8/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
defaults: function(){
|
||||
|
||||
// bail early if no tinyMCEPreInit
|
||||
if( typeof tinyMCEPreInit === 'undefined' ) return false;
|
||||
|
||||
// vars
|
||||
var defaults = {
|
||||
tinymce: tinyMCEPreInit.mceInit.acf_content,
|
||||
quicktags: tinyMCEPreInit.qtInit.acf_content
|
||||
};
|
||||
|
||||
// return
|
||||
return defaults;
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
* initialize
|
||||
*
|
||||
* This function will initialize the tinymce and quicktags instances
|
||||
*
|
||||
* @type function
|
||||
* @date 18/8/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
initialize: function( id, args ){
|
||||
|
||||
// defaults
|
||||
args = acf.parseArgs(args, {
|
||||
tinymce: true,
|
||||
quicktags: true,
|
||||
toolbar: 'full',
|
||||
mode: 'visual', // visual,text
|
||||
field: false
|
||||
});
|
||||
|
||||
// tinymce
|
||||
if( args.tinymce ) {
|
||||
this.initializeTinymce( id, args );
|
||||
}
|
||||
|
||||
// quicktags
|
||||
if( args.quicktags ) {
|
||||
this.initializeQuicktags( id, args );
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
* initializeTinymce
|
||||
*
|
||||
* This function will initialize the tinymce instance
|
||||
*
|
||||
* @type function
|
||||
* @date 18/8/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
initializeTinymce: function( id, args ){
|
||||
|
||||
// vars
|
||||
var $textarea = $('#'+id);
|
||||
var defaults = this.defaults();
|
||||
var toolbars = acf.get('toolbars');
|
||||
var field = args.field || false;
|
||||
var $field = field.$el || false;
|
||||
|
||||
// bail early
|
||||
if( typeof tinymce === 'undefined' ) return false;
|
||||
if( !defaults ) return false;
|
||||
|
||||
// check if exists
|
||||
if( tinymce.get(id) ) {
|
||||
return this.enable( id );
|
||||
}
|
||||
|
||||
// settings
|
||||
var init = $.extend( {}, defaults.tinymce, args.tinymce );
|
||||
init.id = id;
|
||||
init.selector = '#' + id;
|
||||
|
||||
// toolbar
|
||||
var toolbar = args.toolbar;
|
||||
if( toolbar && toolbars && toolbars[toolbar] ) {
|
||||
|
||||
for( var i = 1; i <= 4; i++ ) {
|
||||
init[ 'toolbar' + i ] = toolbars[toolbar][i] || '';
|
||||
}
|
||||
}
|
||||
|
||||
// event
|
||||
init.setup = function( ed ){
|
||||
|
||||
ed.on('change', function(e) {
|
||||
ed.save(); // save to textarea
|
||||
$textarea.trigger('change');
|
||||
});
|
||||
|
||||
// Fix bug where Gutenberg does not hear "mouseup" event and tries to select multiple blocks.
|
||||
ed.on('mouseup', function(e) {
|
||||
var event = new MouseEvent('mouseup');
|
||||
window.dispatchEvent(event);
|
||||
});
|
||||
|
||||
// Temporarily comment out. May not be necessary due to wysiwyg field actions.
|
||||
//ed.on('unload', function(e) {
|
||||
// acf.tinymce.remove( id );
|
||||
//});
|
||||
};
|
||||
|
||||
// disable wp_autoresize_on (no solution yet for fixed toolbar)
|
||||
init.wp_autoresize_on = false;
|
||||
|
||||
// Enable wpautop allowing value to save without <p> tags.
|
||||
// Only if the "TinyMCE Advanced" plugin hasn't already set this functionality.
|
||||
if( !init.tadv_noautop ) {
|
||||
init.wpautop = true;
|
||||
}
|
||||
|
||||
// hook for 3rd party customization
|
||||
init = acf.applyFilters('wysiwyg_tinymce_settings', init, id, field);
|
||||
|
||||
// z-index fix (caused too many conflicts)
|
||||
//if( acf.isset(tinymce,'ui','FloatPanel') ) {
|
||||
// tinymce.ui.FloatPanel.zIndex = 900000;
|
||||
//}
|
||||
|
||||
// store settings
|
||||
tinyMCEPreInit.mceInit[ id ] = init;
|
||||
|
||||
// visual tab is active
|
||||
if( args.mode == 'visual' ) {
|
||||
|
||||
// init
|
||||
var result = tinymce.init( init );
|
||||
|
||||
// get editor
|
||||
var ed = tinymce.get( id );
|
||||
|
||||
// validate
|
||||
if( !ed ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// add reference
|
||||
ed.acf = args.field;
|
||||
|
||||
// action
|
||||
acf.doAction('wysiwyg_tinymce_init', ed, ed.id, init, field);
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
* initializeQuicktags
|
||||
*
|
||||
* This function will initialize the quicktags instance
|
||||
*
|
||||
* @type function
|
||||
* @date 18/8/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
initializeQuicktags: function( id, args ){
|
||||
|
||||
// vars
|
||||
var defaults = this.defaults();
|
||||
|
||||
// bail early
|
||||
if( typeof quicktags === 'undefined' ) return false;
|
||||
if( !defaults ) return false;
|
||||
|
||||
// settings
|
||||
var init = $.extend( {}, defaults.quicktags, args.quicktags );
|
||||
init.id = id;
|
||||
|
||||
// filter
|
||||
var field = args.field || false;
|
||||
var $field = field.$el || false;
|
||||
init = acf.applyFilters('wysiwyg_quicktags_settings', init, init.id, field);
|
||||
|
||||
// store settings
|
||||
tinyMCEPreInit.qtInit[ id ] = init;
|
||||
|
||||
// init
|
||||
var ed = quicktags( init );
|
||||
|
||||
// validate
|
||||
if( !ed ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// generate HTML
|
||||
this.buildQuicktags( ed );
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('wysiwyg_quicktags_init', ed, ed.id, init, field);
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
* buildQuicktags
|
||||
*
|
||||
* This function will build the quicktags HTML
|
||||
*
|
||||
* @type function
|
||||
* @date 18/8/17
|
||||
* @since 5.6.0
|
||||
*
|
||||
* @param $post_id (int)
|
||||
* @return $post_id (int)
|
||||
*/
|
||||
|
||||
buildQuicktags: function( ed ){
|
||||
|
||||
var canvas, name, settings, theButtons, html, ed, id, i, use, instanceId,
|
||||
defaults = ',strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,';
|
||||
|
||||
canvas = ed.canvas;
|
||||
name = ed.name;
|
||||
settings = ed.settings;
|
||||
html = '';
|
||||
theButtons = {};
|
||||
use = '';
|
||||
instanceId = ed.id;
|
||||
|
||||
// set buttons
|
||||
if ( settings.buttons ) {
|
||||
use = ','+settings.buttons+',';
|
||||
}
|
||||
|
||||
for ( i in edButtons ) {
|
||||
if ( ! edButtons[i] ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
id = edButtons[i].id;
|
||||
if ( use && defaults.indexOf( ',' + id + ',' ) !== -1 && use.indexOf( ',' + id + ',' ) === -1 ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( ! edButtons[i].instance || edButtons[i].instance === instanceId ) {
|
||||
theButtons[id] = edButtons[i];
|
||||
|
||||
if ( edButtons[i].html ) {
|
||||
html += edButtons[i].html( name + '_' );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( use && use.indexOf(',dfw,') !== -1 ) {
|
||||
theButtons.dfw = new QTags.DFWButton();
|
||||
html += theButtons.dfw.html( name + '_' );
|
||||
}
|
||||
|
||||
if ( 'rtl' === document.getElementsByTagName( 'html' )[0].dir ) {
|
||||
theButtons.textdirection = new QTags.TextDirectionButton();
|
||||
html += theButtons.textdirection.html( name + '_' );
|
||||
}
|
||||
|
||||
ed.toolbar.innerHTML = html;
|
||||
ed.theButtons = theButtons;
|
||||
|
||||
if ( typeof jQuery !== 'undefined' ) {
|
||||
jQuery( document ).triggerHandler( 'quicktags-init', [ ed ] );
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
disable: function( id ){
|
||||
this.destroyTinymce( id );
|
||||
},
|
||||
|
||||
remove: function( id ){
|
||||
this.destroyTinymce( id );
|
||||
},
|
||||
|
||||
destroy: function( id ){
|
||||
this.destroyTinymce( id );
|
||||
},
|
||||
|
||||
destroyTinymce: function( id ){
|
||||
|
||||
// bail early
|
||||
if( typeof tinymce === 'undefined' ) return false;
|
||||
|
||||
// get editor
|
||||
var ed = tinymce.get( id );
|
||||
|
||||
// bail early if no editor
|
||||
if( !ed ) return false;
|
||||
|
||||
// save
|
||||
ed.save();
|
||||
|
||||
// destroy editor
|
||||
ed.destroy();
|
||||
|
||||
// return
|
||||
return true;
|
||||
},
|
||||
|
||||
enable: function( id ){
|
||||
this.enableTinymce( id );
|
||||
},
|
||||
|
||||
enableTinymce: function( id ){
|
||||
|
||||
// bail early
|
||||
if( typeof switchEditors === 'undefined' ) return false;
|
||||
|
||||
// bail ealry if not initialized
|
||||
if( typeof tinyMCEPreInit.mceInit[ id ] === 'undefined' ) return false;
|
||||
|
||||
// toggle
|
||||
switchEditors.go( id, 'tmce');
|
||||
|
||||
// return
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
var editorManager = new acf.Model({
|
||||
|
||||
// hook in before fieldsEventManager, conditions, etc
|
||||
priority: 5,
|
||||
|
||||
actions: {
|
||||
'prepare': 'onPrepare',
|
||||
'ready': 'onReady',
|
||||
},
|
||||
onPrepare: function(){
|
||||
|
||||
// find hidden editor which may exist within a field
|
||||
var $div = $('#acf-hidden-wp-editor');
|
||||
|
||||
// move to footer
|
||||
if( $div.exists() ) {
|
||||
$div.appendTo('body');
|
||||
}
|
||||
},
|
||||
onReady: function(){
|
||||
|
||||
// Restore wp.editor functions used by tinymce removed in WP5.
|
||||
if( acf.isset(window,'wp','oldEditor') ) {
|
||||
wp.editor.autop = wp.oldEditor.autop;
|
||||
wp.editor.removep = wp.oldEditor.removep;
|
||||
}
|
||||
|
||||
// bail early if no tinymce
|
||||
if( !acf.isset(window,'tinymce','on') ) return;
|
||||
|
||||
// restore default activeEditor
|
||||
tinymce.on('AddEditor', function( data ){
|
||||
|
||||
// vars
|
||||
var editor = data.editor;
|
||||
|
||||
// bail early if not 'acf'
|
||||
if( editor.id.substr(0, 3) !== 'acf' ) return;
|
||||
|
||||
// override if 'content' exists
|
||||
editor = tinymce.editors.content || editor;
|
||||
|
||||
// update vars
|
||||
tinymce.activeEditor = editor;
|
||||
wpActiveEditor = editor.id;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,324 @@
|
||||
(function($, undefined){
|
||||
|
||||
acf.newTooltip = function( props ){
|
||||
|
||||
// ensure object
|
||||
if( typeof props !== 'object' ) {
|
||||
props = { text: props };
|
||||
}
|
||||
|
||||
// confirmRemove
|
||||
if( props.confirmRemove !== undefined ) {
|
||||
|
||||
props.textConfirm = acf.__('Remove');
|
||||
props.textCancel = acf.__('Cancel');
|
||||
return new TooltipConfirm( props );
|
||||
|
||||
// confirm
|
||||
} else if( props.confirm !== undefined ) {
|
||||
|
||||
return new TooltipConfirm( props );
|
||||
|
||||
// default
|
||||
} else {
|
||||
return new Tooltip( props );
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
var Tooltip = acf.Model.extend({
|
||||
|
||||
data: {
|
||||
text: '',
|
||||
timeout: 0,
|
||||
target: null
|
||||
},
|
||||
|
||||
tmpl: function(){
|
||||
return '<div class="acf-tooltip"></div>';
|
||||
},
|
||||
|
||||
setup: function( props ){
|
||||
$.extend(this.data, props);
|
||||
this.$el = $(this.tmpl());
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// render
|
||||
this.render();
|
||||
|
||||
// append
|
||||
this.show();
|
||||
|
||||
// position
|
||||
this.position();
|
||||
|
||||
// timeout
|
||||
var timeout = this.get('timeout');
|
||||
if( timeout ) {
|
||||
setTimeout( $.proxy(this.fade, this), timeout );
|
||||
}
|
||||
},
|
||||
|
||||
update: function( props ){
|
||||
$.extend(this.data, props);
|
||||
this.initialize();
|
||||
},
|
||||
|
||||
render: function(){
|
||||
this.html( this.get('text') );
|
||||
},
|
||||
|
||||
show: function(){
|
||||
$('body').append( this.$el );
|
||||
},
|
||||
|
||||
hide: function(){
|
||||
this.$el.remove();
|
||||
},
|
||||
|
||||
fade: function(){
|
||||
|
||||
// add class
|
||||
this.$el.addClass('acf-fade-up');
|
||||
|
||||
// remove
|
||||
this.setTimeout(function(){
|
||||
this.remove();
|
||||
}, 250);
|
||||
},
|
||||
|
||||
html: function( html ){
|
||||
this.$el.html( html );
|
||||
},
|
||||
|
||||
position: function(){
|
||||
|
||||
// vars
|
||||
var $tooltip = this.$el;
|
||||
var $target = this.get('target');
|
||||
if( !$target ) return;
|
||||
|
||||
// Reset position.
|
||||
$tooltip.removeClass('right left bottom top').css({ top: 0, left: 0 });
|
||||
|
||||
// Declare tollerance to edge of screen.
|
||||
var tolerance = 10;
|
||||
|
||||
// Find target position.
|
||||
var targetWidth = $target.outerWidth();
|
||||
var targetHeight = $target.outerHeight();
|
||||
var targetTop = $target.offset().top;
|
||||
var targetLeft = $target.offset().left;
|
||||
|
||||
// Find tooltip position.
|
||||
var tooltipWidth = $tooltip.outerWidth();
|
||||
var tooltipHeight = $tooltip.outerHeight();
|
||||
var tooltipTop = $tooltip.offset().top; // Should be 0, but WP media grid causes this to be 32 (toolbar padding).
|
||||
|
||||
// Assume default top alignment.
|
||||
var top = targetTop - tooltipHeight - tooltipTop;
|
||||
var left = targetLeft + (targetWidth / 2) - (tooltipWidth / 2);
|
||||
|
||||
// Check if too far left.
|
||||
if( left < tolerance ) {
|
||||
$tooltip.addClass('right');
|
||||
left = targetLeft + targetWidth;
|
||||
top = targetTop + (targetHeight / 2) - (tooltipHeight / 2) - tooltipTop;
|
||||
|
||||
// Check if too far right.
|
||||
} else if( (left + tooltipWidth + tolerance) > $(window).width() ) {
|
||||
$tooltip.addClass('left');
|
||||
left = targetLeft - tooltipWidth;
|
||||
top = targetTop + (targetHeight / 2) - (tooltipHeight / 2) - tooltipTop;
|
||||
|
||||
// Check if too far up.
|
||||
} else if( top - $(window).scrollTop() < tolerance ) {
|
||||
$tooltip.addClass('bottom');
|
||||
top = targetTop + targetHeight - tooltipTop;
|
||||
|
||||
// No colision with edges.
|
||||
} else {
|
||||
$tooltip.addClass('top');
|
||||
}
|
||||
|
||||
// update css
|
||||
$tooltip.css({ 'top': top, 'left': left });
|
||||
}
|
||||
});
|
||||
|
||||
var TooltipConfirm = Tooltip.extend({
|
||||
|
||||
data: {
|
||||
text: '',
|
||||
textConfirm: '',
|
||||
textCancel: '',
|
||||
target: null,
|
||||
targetConfirm: true,
|
||||
confirm: function(){},
|
||||
cancel: function(){},
|
||||
context: false
|
||||
},
|
||||
|
||||
events: {
|
||||
'click [data-event="cancel"]': 'onCancel',
|
||||
'click [data-event="confirm"]': 'onConfirm',
|
||||
},
|
||||
|
||||
addEvents: function(){
|
||||
|
||||
// add events
|
||||
acf.Model.prototype.addEvents.apply(this);
|
||||
|
||||
// vars
|
||||
var $document = $(document);
|
||||
var $target = this.get('target');
|
||||
|
||||
// add global 'cancel' click event
|
||||
// - use timeout to avoid the current 'click' event triggering the onCancel function
|
||||
this.setTimeout(function(){
|
||||
this.on( $document, 'click', 'onCancel' );
|
||||
});
|
||||
|
||||
// add target 'confirm' click event
|
||||
// - allow setting to control this feature
|
||||
if( this.get('targetConfirm') ) {
|
||||
this.on( $target, 'click', 'onConfirm' );
|
||||
}
|
||||
},
|
||||
|
||||
removeEvents: function(){
|
||||
|
||||
// remove events
|
||||
acf.Model.prototype.removeEvents.apply(this);
|
||||
|
||||
// vars
|
||||
var $document = $(document);
|
||||
var $target = this.get('target');
|
||||
|
||||
// remove custom events
|
||||
this.off( $document, 'click' );
|
||||
this.off( $target, 'click' );
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// defaults
|
||||
var text = this.get('text') || acf.__('Are you sure?');
|
||||
var textConfirm = this.get('textConfirm') || acf.__('Yes');
|
||||
var textCancel = this.get('textCancel') || acf.__('No');
|
||||
|
||||
// html
|
||||
var html = [
|
||||
text,
|
||||
'<a href="#" data-event="confirm">' + textConfirm + '</a>',
|
||||
'<a href="#" data-event="cancel">' + textCancel + '</a>'
|
||||
].join(' ');
|
||||
|
||||
// html
|
||||
this.html( html );
|
||||
|
||||
// class
|
||||
this.$el.addClass('-confirm');
|
||||
},
|
||||
|
||||
onCancel: function( e, $el ){
|
||||
|
||||
// prevent default
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
// callback
|
||||
var callback = this.get('cancel');
|
||||
var context = this.get('context') || this;
|
||||
callback.apply( context, arguments );
|
||||
|
||||
//remove
|
||||
this.remove();
|
||||
},
|
||||
|
||||
onConfirm: function( e, $el ){
|
||||
|
||||
// prevent default
|
||||
e.preventDefault();
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
// callback
|
||||
var callback = this.get('confirm');
|
||||
var context = this.get('context') || this;
|
||||
callback.apply( context, arguments );
|
||||
|
||||
//remove
|
||||
this.remove();
|
||||
}
|
||||
});
|
||||
|
||||
// storage
|
||||
acf.models.Tooltip = Tooltip;
|
||||
acf.models.TooltipConfirm = TooltipConfirm;
|
||||
|
||||
|
||||
/**
|
||||
* tooltipManager
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 17/4/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var tooltipHoverHelper = new acf.Model({
|
||||
|
||||
tooltip: false,
|
||||
|
||||
events: {
|
||||
'mouseenter .acf-js-tooltip': 'showTitle',
|
||||
'mouseup .acf-js-tooltip': 'hideTitle',
|
||||
'mouseleave .acf-js-tooltip': 'hideTitle'
|
||||
},
|
||||
|
||||
showTitle: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var title = $el.attr('title');
|
||||
|
||||
// bail ealry if no title
|
||||
if( !title ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// clear title to avoid default browser tooltip
|
||||
$el.attr('title', '');
|
||||
|
||||
// create
|
||||
if( !this.tooltip ) {
|
||||
this.tooltip = acf.newTooltip({
|
||||
text: title,
|
||||
target: $el
|
||||
});
|
||||
|
||||
// update
|
||||
} else {
|
||||
this.tooltip.update({
|
||||
text: title,
|
||||
target: $el
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
hideTitle: function( e, $el ){
|
||||
|
||||
// hide tooltip
|
||||
this.tooltip.hide();
|
||||
|
||||
// restore title
|
||||
$el.attr('title', this.tooltip.get('text'));
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,62 @@
|
||||
(function($, undefined){
|
||||
|
||||
acf.unload = new acf.Model({
|
||||
|
||||
wait: 'load',
|
||||
active: true,
|
||||
changed: false,
|
||||
|
||||
actions: {
|
||||
'validation_failure': 'startListening',
|
||||
'validation_success': 'stopListening'
|
||||
},
|
||||
|
||||
events: {
|
||||
'change form .acf-field': 'startListening',
|
||||
'submit form': 'stopListening'
|
||||
},
|
||||
|
||||
enable: function(){
|
||||
this.active = true;
|
||||
},
|
||||
|
||||
disable: function(){
|
||||
this.active = false;
|
||||
},
|
||||
|
||||
reset: function(){
|
||||
this.stopListening();
|
||||
},
|
||||
|
||||
startListening: function(){
|
||||
|
||||
// bail ealry if already changed, not active
|
||||
if( this.changed || !this.active ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// update
|
||||
this.changed = true;
|
||||
|
||||
// add event
|
||||
$(window).on('beforeunload', this.onUnload);
|
||||
|
||||
},
|
||||
|
||||
stopListening: function(){
|
||||
|
||||
// update
|
||||
this.changed = false;
|
||||
|
||||
// remove event
|
||||
$(window).off('beforeunload', this.onUnload);
|
||||
|
||||
},
|
||||
|
||||
onUnload: function(){
|
||||
return acf.__('The changes you made will be lost if you navigate away from this page');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
2188
wp-content/plugins/advanced-custom-fields/assets/build/js/_acf.js
Normal file
@@ -0,0 +1,281 @@
|
||||
(function($, undefined){
|
||||
|
||||
var _acf = acf.getCompatibility( acf );
|
||||
|
||||
/**
|
||||
* fieldGroupCompatibility
|
||||
*
|
||||
* Compatibility layer for extinct acf.field_group
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
_acf.field_group = {
|
||||
|
||||
save_field: function( $field, type ){
|
||||
type = (type !== undefined) ? type : 'settings';
|
||||
acf.getFieldObject( $field ).save( type );
|
||||
},
|
||||
|
||||
delete_field: function( $field, animate ){
|
||||
animate = (animate !== undefined) ? animate : true;
|
||||
acf.getFieldObject( $field ).delete({
|
||||
animate: animate
|
||||
});
|
||||
},
|
||||
|
||||
update_field_meta: function( $field, name, value ){
|
||||
acf.getFieldObject( $field ).prop( name, value );
|
||||
},
|
||||
|
||||
delete_field_meta: function( $field, name ){
|
||||
acf.getFieldObject( $field ).prop( name, null );
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* fieldGroupCompatibility.field_object
|
||||
*
|
||||
* Compatibility layer for extinct acf.field_group.field_object
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
_acf.field_group.field_object = acf.model.extend({
|
||||
|
||||
// vars
|
||||
type: '',
|
||||
o: {},
|
||||
$field: null,
|
||||
$settings: null,
|
||||
|
||||
tag: function( tag ) {
|
||||
|
||||
// vars
|
||||
var type = this.type;
|
||||
|
||||
|
||||
// explode, add 'field' and implode
|
||||
// - open => open_field
|
||||
// - change_type => change_field_type
|
||||
var tags = tag.split('_');
|
||||
tags.splice(1, 0, 'field');
|
||||
tag = tags.join('_');
|
||||
|
||||
|
||||
// add type
|
||||
if( type ) {
|
||||
tag += '/type=' + type;
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return tag;
|
||||
|
||||
},
|
||||
|
||||
selector: function(){
|
||||
|
||||
// vars
|
||||
var selector = '.acf-field-object';
|
||||
var type = this.type;
|
||||
|
||||
|
||||
// add type
|
||||
if( type ) {
|
||||
selector += '-' + type;
|
||||
selector = acf.str_replace('_', '-', selector);
|
||||
}
|
||||
|
||||
|
||||
// return
|
||||
return selector;
|
||||
|
||||
},
|
||||
|
||||
_add_action: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this;
|
||||
|
||||
|
||||
// add action
|
||||
acf.add_action( this.tag(name), function( $field ){
|
||||
|
||||
// focus
|
||||
model.set('$field', $field);
|
||||
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, arguments);
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
_add_filter: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this;
|
||||
|
||||
|
||||
// add action
|
||||
acf.add_filter( this.tag(name), function( $field ){
|
||||
|
||||
// focus
|
||||
model.set('$field', $field);
|
||||
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, arguments);
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
_add_event: function( name, callback ) {
|
||||
|
||||
// vars
|
||||
var model = this;
|
||||
var event = name.substr(0,name.indexOf(' '));
|
||||
var selector = name.substr(name.indexOf(' ')+1);
|
||||
var context = this.selector();
|
||||
|
||||
|
||||
// add event
|
||||
$(document).on(event, context + ' ' + selector, function( e ){
|
||||
|
||||
// append $el to event object
|
||||
e.$el = $(this);
|
||||
e.$field = e.$el.closest('.acf-field-object');
|
||||
|
||||
|
||||
// focus
|
||||
model.set('$field', e.$field);
|
||||
|
||||
|
||||
// callback
|
||||
model[ callback ].apply(model, [e]);
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
_set_$field: function(){
|
||||
|
||||
// vars
|
||||
this.o = this.$field.data();
|
||||
|
||||
|
||||
// els
|
||||
this.$settings = this.$field.find('> .settings > table > tbody');
|
||||
|
||||
|
||||
// focus
|
||||
this.focus();
|
||||
|
||||
},
|
||||
|
||||
focus: function(){
|
||||
|
||||
// do nothing
|
||||
|
||||
},
|
||||
|
||||
setting: function( name ) {
|
||||
|
||||
return this.$settings.find('> .acf-field-setting-' + name);
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* field
|
||||
*
|
||||
* This model fires actions and filters for registered fields
|
||||
*
|
||||
* @type function
|
||||
* @date 21/02/2014
|
||||
* @since 3.5.1
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
var actionManager = new acf.Model({
|
||||
|
||||
actions: {
|
||||
'open_field_object': 'onOpenFieldObject',
|
||||
'close_field_object': 'onCloseFieldObject',
|
||||
'add_field_object': 'onAddFieldObject',
|
||||
'duplicate_field_object': 'onDuplicateFieldObject',
|
||||
'delete_field_object': 'onDeleteFieldObject',
|
||||
'change_field_object_type': 'onChangeFieldObjectType',
|
||||
'change_field_object_label': 'onChangeFieldObjectLabel',
|
||||
'change_field_object_name': 'onChangeFieldObjectName',
|
||||
'change_field_object_parent': 'onChangeFieldObjectParent',
|
||||
'sortstop_field_object': 'onChangeFieldObjectParent'
|
||||
},
|
||||
|
||||
onOpenFieldObject: function( field ){
|
||||
acf.doAction('open_field', field.$el);
|
||||
acf.doAction('open_field/type=' + field.get('type'), field.$el);
|
||||
|
||||
acf.doAction('render_field_settings', field.$el);
|
||||
acf.doAction('render_field_settings/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onCloseFieldObject: function( field ){
|
||||
acf.doAction('close_field', field.$el);
|
||||
acf.doAction('close_field/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onAddFieldObject: function( field ){
|
||||
acf.doAction('add_field', field.$el);
|
||||
acf.doAction('add_field/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onDuplicateFieldObject: function( field ){
|
||||
acf.doAction('duplicate_field', field.$el);
|
||||
acf.doAction('duplicate_field/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onDeleteFieldObject: function( field ){
|
||||
acf.doAction('delete_field', field.$el);
|
||||
acf.doAction('delete_field/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onChangeFieldObjectType: function( field ){
|
||||
acf.doAction('change_field_type', field.$el);
|
||||
acf.doAction('change_field_type/type=' + field.get('type'), field.$el);
|
||||
|
||||
acf.doAction('render_field_settings', field.$el);
|
||||
acf.doAction('render_field_settings/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onChangeFieldObjectLabel: function( field ){
|
||||
acf.doAction('change_field_label', field.$el);
|
||||
acf.doAction('change_field_label/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onChangeFieldObjectName: function( field ){
|
||||
acf.doAction('change_field_name', field.$el);
|
||||
acf.doAction('change_field_name/type=' + field.get('type'), field.$el);
|
||||
},
|
||||
|
||||
onChangeFieldObjectParent: function( field ){
|
||||
acf.doAction('update_field_parent', field.$el);
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,403 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* ConditionalLogicFieldSetting
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 3/2/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var ConditionalLogicFieldSetting = acf.FieldSetting.extend({
|
||||
type: '',
|
||||
name: 'conditional_logic',
|
||||
events: {
|
||||
'change .conditions-toggle': 'onChangeToggle',
|
||||
'click .add-conditional-group': 'onClickAddGroup',
|
||||
'focus .condition-rule-field': 'onFocusField',
|
||||
'change .condition-rule-field': 'onChangeField',
|
||||
'change .condition-rule-operator': 'onChangeOperator',
|
||||
'click .add-conditional-rule': 'onClickAdd',
|
||||
'click .remove-conditional-rule': 'onClickRemove'
|
||||
},
|
||||
|
||||
$rule: false,
|
||||
|
||||
scope: function( $rule ){
|
||||
this.$rule = $rule;
|
||||
return this;
|
||||
},
|
||||
|
||||
ruleData: function( name, value ){
|
||||
return this.$rule.data.apply( this.$rule, arguments );
|
||||
},
|
||||
|
||||
$input: function( name ){
|
||||
return this.$rule.find('.condition-rule-' + name);
|
||||
},
|
||||
|
||||
$td: function( name ){
|
||||
return this.$rule.find('td.' + name);
|
||||
},
|
||||
|
||||
$toggle: function(){
|
||||
return this.$('.conditions-toggle');
|
||||
},
|
||||
|
||||
$control: function(){
|
||||
return this.$('.rule-groups');
|
||||
},
|
||||
|
||||
$groups: function(){
|
||||
return this.$('.rule-group');
|
||||
},
|
||||
|
||||
$rules: function(){
|
||||
return this.$('.rule');
|
||||
},
|
||||
|
||||
open: function(){
|
||||
var $div = this.$control();
|
||||
$div.show();
|
||||
acf.enable( $div );
|
||||
},
|
||||
|
||||
close: function(){
|
||||
var $div = this.$control();
|
||||
$div.hide();
|
||||
acf.disable( $div );
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// show
|
||||
if( this.$toggle().prop('checked') ) {
|
||||
this.renderRules();
|
||||
this.open();
|
||||
|
||||
// hide
|
||||
} else {
|
||||
this.close();
|
||||
}
|
||||
},
|
||||
|
||||
renderRules: function(){
|
||||
|
||||
// vars
|
||||
var self = this;
|
||||
|
||||
// loop
|
||||
this.$rules().each(function(){
|
||||
self.renderRule( $(this) );
|
||||
});
|
||||
},
|
||||
|
||||
renderRule: function( $rule ){
|
||||
this.scope( $rule );
|
||||
this.renderField();
|
||||
this.renderOperator();
|
||||
this.renderValue();
|
||||
},
|
||||
|
||||
renderField: function(){
|
||||
|
||||
// vars
|
||||
var choices = [];
|
||||
var validFieldTypes = [];
|
||||
var cid = this.fieldObject.cid;
|
||||
var $select = this.$input('field');
|
||||
|
||||
// loop
|
||||
acf.getFieldObjects().map(function( fieldObject ){
|
||||
|
||||
// vars
|
||||
var choice = {
|
||||
id: fieldObject.getKey(),
|
||||
text: fieldObject.getLabel()
|
||||
};
|
||||
|
||||
// bail early if is self
|
||||
if( fieldObject.cid === cid ) {
|
||||
choice.text += acf.__('(this field)');
|
||||
choice.disabled = true;
|
||||
}
|
||||
|
||||
// get selected field conditions
|
||||
var conditionTypes = acf.getConditionTypes({
|
||||
fieldType: fieldObject.getType()
|
||||
});
|
||||
|
||||
// bail early if no types
|
||||
if( !conditionTypes.length ) {
|
||||
choice.disabled = true;
|
||||
}
|
||||
|
||||
// calulate indents
|
||||
var indents = fieldObject.getParents().length;
|
||||
choice.text = '- '.repeat(indents) + choice.text;
|
||||
|
||||
// append
|
||||
choices.push(choice);
|
||||
});
|
||||
|
||||
// allow for scenario where only one field exists
|
||||
if( !choices.length ) {
|
||||
choices.push({
|
||||
id: '',
|
||||
text: acf.__('No toggle fields available'),
|
||||
});
|
||||
}
|
||||
|
||||
// render
|
||||
acf.renderSelect( $select, choices );
|
||||
|
||||
// set
|
||||
this.ruleData('field', $select.val());
|
||||
},
|
||||
|
||||
renderOperator: function(){
|
||||
|
||||
// bail early if no field selected
|
||||
if( !this.ruleData('field') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var $select = this.$input('operator');
|
||||
var val = $select.val();
|
||||
var choices = [];
|
||||
|
||||
// set saved value on first render
|
||||
// - this allows the 2nd render to correctly select an option
|
||||
if( $select.val() === null ) {
|
||||
acf.renderSelect($select, [{
|
||||
id: this.ruleData('operator'),
|
||||
text: ''
|
||||
}]);
|
||||
}
|
||||
|
||||
// get selected field
|
||||
var $field = acf.findFieldObject( this.ruleData('field') );
|
||||
var field = acf.getFieldObject( $field );
|
||||
|
||||
// get selected field conditions
|
||||
var conditionTypes = acf.getConditionTypes({
|
||||
fieldType: field.getType()
|
||||
});
|
||||
|
||||
// html
|
||||
conditionTypes.map(function( model ){
|
||||
choices.push({
|
||||
id: model.prototype.operator,
|
||||
text: acf.strEscape(model.prototype.label)
|
||||
});
|
||||
});
|
||||
|
||||
// render
|
||||
acf.renderSelect( $select, choices );
|
||||
|
||||
// set
|
||||
this.ruleData('operator', $select.val());
|
||||
},
|
||||
|
||||
renderValue: function(){
|
||||
|
||||
// bail early if no field selected
|
||||
if( !this.ruleData('field') || !this.ruleData('operator') ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// vars
|
||||
var $select = this.$input('value');
|
||||
var $td = this.$td('value');
|
||||
var val = $select.val();
|
||||
|
||||
// get selected field
|
||||
var $field = acf.findFieldObject( this.ruleData('field') );
|
||||
var field = acf.getFieldObject( $field );
|
||||
|
||||
// get selected field conditions
|
||||
var conditionTypes = acf.getConditionTypes({
|
||||
fieldType: field.getType(),
|
||||
operator: this.ruleData('operator')
|
||||
});
|
||||
|
||||
// html
|
||||
var conditionType = conditionTypes[0].prototype;
|
||||
var choices = conditionType.choices( field );
|
||||
|
||||
// create html: array
|
||||
if( choices instanceof Array ) {
|
||||
var $newSelect = $('<select></select>');
|
||||
acf.renderSelect( $newSelect, choices );
|
||||
|
||||
// create html: string (<input />)
|
||||
} else {
|
||||
var $newSelect = $(choices);
|
||||
}
|
||||
|
||||
// append
|
||||
$select.detach();
|
||||
$td.html( $newSelect );
|
||||
|
||||
// copy attrs
|
||||
// timeout needed to avoid browser bug where "disabled" attribute is not applied
|
||||
setTimeout(function(){
|
||||
['class', 'name', 'id'].map(function( attr ){
|
||||
$newSelect.attr( attr, $select.attr(attr));
|
||||
});
|
||||
}, 0);
|
||||
|
||||
// select existing value (if not a disabled input)
|
||||
if( !$newSelect.prop('disabled') ) {
|
||||
acf.val( $newSelect, val, true );
|
||||
}
|
||||
|
||||
// set
|
||||
this.ruleData('value', $newSelect.val());
|
||||
},
|
||||
|
||||
onChangeToggle: function(){
|
||||
this.render();
|
||||
},
|
||||
|
||||
onClickAddGroup: function( e, $el ){
|
||||
this.addGroup();
|
||||
},
|
||||
|
||||
addGroup: function(){
|
||||
|
||||
// vars
|
||||
var $group = this.$('.rule-group:last');
|
||||
|
||||
// duplicate
|
||||
var $group2 = acf.duplicate( $group );
|
||||
|
||||
// update h4
|
||||
$group2.find('h4').text( acf.__('or') );
|
||||
|
||||
// remove all tr's except the first one
|
||||
$group2.find('tr').not(':first').remove();
|
||||
|
||||
// save field
|
||||
this.fieldObject.save();
|
||||
},
|
||||
|
||||
onFocusField: function( e, $el ){
|
||||
this.renderField();
|
||||
},
|
||||
|
||||
onChangeField: function( e, $el ){
|
||||
|
||||
// scope
|
||||
this.scope( $el.closest('.rule') );
|
||||
|
||||
// set data
|
||||
this.ruleData('field', $el.val());
|
||||
|
||||
// render
|
||||
this.renderOperator();
|
||||
this.renderValue();
|
||||
},
|
||||
|
||||
onChangeOperator: function( e, $el ){
|
||||
|
||||
// scope
|
||||
this.scope( $el.closest('.rule') );
|
||||
|
||||
// set data
|
||||
this.ruleData('operator', $el.val());
|
||||
|
||||
// render
|
||||
this.renderValue();
|
||||
},
|
||||
|
||||
onClickAdd: function( e, $el ){
|
||||
|
||||
// duplciate
|
||||
var $rule = acf.duplicate( $el.closest('.rule') );
|
||||
|
||||
// render
|
||||
this.renderRule( $rule );
|
||||
},
|
||||
|
||||
onClickRemove: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var $rule = $el.closest('.rule');
|
||||
|
||||
// save field
|
||||
this.fieldObject.save();
|
||||
|
||||
// remove group
|
||||
if( $rule.siblings('.rule').length == 0 ) {
|
||||
$rule.closest('.rule-group').remove();
|
||||
}
|
||||
|
||||
// remove
|
||||
$rule.remove();
|
||||
}
|
||||
});
|
||||
|
||||
acf.registerFieldSetting( ConditionalLogicFieldSetting );
|
||||
|
||||
|
||||
/**
|
||||
* conditionalLogicHelper
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 20/4/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var conditionalLogicHelper = new acf.Model({
|
||||
actions: {
|
||||
'duplicate_field_objects': 'onDuplicateFieldObjects',
|
||||
},
|
||||
|
||||
onDuplicateFieldObjects: function( children, newField, prevField ){
|
||||
|
||||
// vars
|
||||
var data = {};
|
||||
var $selects = $();
|
||||
|
||||
// reference change in key
|
||||
children.map(function( child ){
|
||||
|
||||
// store reference of changed key
|
||||
data[ child.get('prevKey') ] = child.get('key');
|
||||
|
||||
// append condition select
|
||||
$selects = $selects.add( child.$('.condition-rule-field') );
|
||||
});
|
||||
|
||||
// loop
|
||||
$selects.each(function(){
|
||||
|
||||
// vars
|
||||
var $select = $(this);
|
||||
var val = $select.val();
|
||||
|
||||
// bail early if val is not a ref key
|
||||
if( !val || !data[val] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// modify selected option
|
||||
$select.find('option:selected').attr('value', data[val]);
|
||||
|
||||
// set new val
|
||||
$select.val( data[val] );
|
||||
|
||||
});
|
||||
},
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,808 @@
|
||||
(function($, undefined){
|
||||
|
||||
acf.FieldObject = acf.Model.extend({
|
||||
|
||||
// class used to avoid nested event triggers
|
||||
eventScope: '.acf-field-object',
|
||||
|
||||
// events
|
||||
events: {
|
||||
'click .edit-field': 'onClickEdit',
|
||||
'click .delete-field': 'onClickDelete',
|
||||
'click .duplicate-field': 'duplicate',
|
||||
'click .move-field': 'move',
|
||||
|
||||
'change .field-type': 'onChangeType',
|
||||
'change .field-required': 'onChangeRequired',
|
||||
'blur .field-label': 'onChangeLabel',
|
||||
'blur .field-name': 'onChangeName',
|
||||
|
||||
'change': 'onChange',
|
||||
'changed': 'onChanged',
|
||||
},
|
||||
|
||||
// data
|
||||
data: {
|
||||
|
||||
// Similar to ID, but used for HTML puposes.
|
||||
// It is possbile for a new field to have an ID of 0, but an id of 'field_123' */
|
||||
id: 0,
|
||||
|
||||
// The field key ('field_123')
|
||||
key: '',
|
||||
|
||||
// The field type (text, image, etc)
|
||||
type: '',
|
||||
|
||||
// The $post->ID of this field
|
||||
//ID: 0,
|
||||
|
||||
// The field's parent
|
||||
//parent: 0,
|
||||
|
||||
// The menu order
|
||||
//menu_order: 0
|
||||
},
|
||||
|
||||
setup: function( $field ){
|
||||
|
||||
// set $el
|
||||
this.$el = $field;
|
||||
|
||||
// inherit $field data (id, key, type)
|
||||
this.inherit( $field );
|
||||
|
||||
// load additional props
|
||||
// - this won't trigger 'changed'
|
||||
this.prop('ID');
|
||||
this.prop('parent');
|
||||
this.prop('menu_order');
|
||||
},
|
||||
|
||||
$input: function( name ){
|
||||
return $('#' + this.getInputId() + '-' + name);
|
||||
},
|
||||
|
||||
$meta: function(){
|
||||
return this.$('.meta:first');
|
||||
},
|
||||
|
||||
$handle: function(){
|
||||
return this.$('.handle:first');
|
||||
},
|
||||
|
||||
$settings: function(){
|
||||
return this.$('.settings:first');
|
||||
},
|
||||
|
||||
$setting: function( name ){
|
||||
return this.$('.acf-field-settings:first > .acf-field-setting-' + name);
|
||||
},
|
||||
|
||||
getParent: function(){
|
||||
return acf.getFieldObjects({ child: this.$el, limit: 1 }).pop();
|
||||
},
|
||||
|
||||
getParents: function(){
|
||||
return acf.getFieldObjects({ child: this.$el });
|
||||
},
|
||||
|
||||
getFields: function(){
|
||||
return acf.getFieldObjects({ parent: this.$el });
|
||||
},
|
||||
|
||||
getInputName: function(){
|
||||
return 'acf_fields[' + this.get('id') + ']';
|
||||
},
|
||||
|
||||
getInputId: function(){
|
||||
return 'acf_fields-' + this.get('id');
|
||||
},
|
||||
|
||||
newInput: function( name, value ){
|
||||
|
||||
// vars
|
||||
var inputId = this.getInputId();
|
||||
var inputName = this.getInputName();
|
||||
|
||||
// append name
|
||||
if( name ) {
|
||||
inputId += '-'+name;
|
||||
inputName += '['+name+']';
|
||||
}
|
||||
|
||||
// create input (avoid HTML + JSON value issues)
|
||||
var $input = $('<input />').attr({
|
||||
id: inputId,
|
||||
name: inputName,
|
||||
value: value
|
||||
});
|
||||
this.$('> .meta').append( $input );
|
||||
|
||||
// return
|
||||
return $input;
|
||||
},
|
||||
|
||||
getProp: function( name ){
|
||||
|
||||
// check data
|
||||
if( this.has(name) ) {
|
||||
return this.get(name);
|
||||
}
|
||||
|
||||
// get input value
|
||||
var $input = this.$input( name );
|
||||
var value = $input.length ? $input.val() : null;
|
||||
|
||||
// set data silently (cache)
|
||||
this.set(name, value, true);
|
||||
|
||||
// return
|
||||
return value;
|
||||
},
|
||||
|
||||
setProp: function( name, value ) {
|
||||
|
||||
// get input
|
||||
var $input = this.$input( name );
|
||||
var prevVal = $input.val();
|
||||
|
||||
// create if new
|
||||
if( !$input.length ) {
|
||||
$input = this.newInput( name, value );
|
||||
}
|
||||
|
||||
// remove
|
||||
if( value === null ) {
|
||||
$input.remove();
|
||||
|
||||
// update
|
||||
} else {
|
||||
$input.val( value );
|
||||
}
|
||||
|
||||
//console.log('setProp', name, value, this);
|
||||
|
||||
// set data silently (cache)
|
||||
if( !this.has(name) ) {
|
||||
//console.log('setting silently');
|
||||
this.set(name, value, true);
|
||||
|
||||
// set data allowing 'change' event to fire
|
||||
} else {
|
||||
//console.log('setting loudly!');
|
||||
this.set(name, value);
|
||||
}
|
||||
|
||||
// return
|
||||
return this;
|
||||
|
||||
},
|
||||
|
||||
prop: function( name, value ){
|
||||
if( value !== undefined ) {
|
||||
return this.setProp( name, value );
|
||||
} else {
|
||||
return this.getProp( name );
|
||||
}
|
||||
},
|
||||
|
||||
props: function( props ){
|
||||
Object.keys( props ).map(function( key ){
|
||||
this.setProp( key, props[key] );
|
||||
}, this);
|
||||
},
|
||||
|
||||
getLabel: function(){
|
||||
|
||||
// get label with empty default
|
||||
var label = this.prop('label');
|
||||
if( label === '' ) {
|
||||
label = acf.__('(no label)')
|
||||
}
|
||||
|
||||
// return
|
||||
return label;
|
||||
},
|
||||
|
||||
getName: function(){
|
||||
return this.prop('name');
|
||||
},
|
||||
|
||||
getType: function(){
|
||||
return this.prop('type');
|
||||
},
|
||||
|
||||
getTypeLabel: function(){
|
||||
var type = this.prop('type');
|
||||
var types = acf.get('fieldTypes');
|
||||
return ( types[type] ) ? types[type].label : type;
|
||||
},
|
||||
|
||||
getKey: function(){
|
||||
return this.prop('key');
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
// do nothing
|
||||
},
|
||||
|
||||
render: function(){
|
||||
|
||||
// vars
|
||||
var $handle = this.$('.handle:first');
|
||||
var menu_order = this.prop('menu_order');
|
||||
var label = this.getLabel();
|
||||
var name = this.prop('name');
|
||||
var type = this.getTypeLabel();
|
||||
var key = this.prop('key');
|
||||
var required = this.$input('required').prop('checked');
|
||||
|
||||
// update menu order
|
||||
$handle.find('.acf-icon').html( parseInt(menu_order) + 1 );
|
||||
|
||||
// update required
|
||||
if( required ) {
|
||||
label += ' <span class="acf-required">*</span>';
|
||||
}
|
||||
|
||||
// update label
|
||||
$handle.find('.li-field-label strong a').html( label );
|
||||
|
||||
// update name
|
||||
$handle.find('.li-field-name').text( name );
|
||||
|
||||
// update type
|
||||
$handle.find('.li-field-type').text( type );
|
||||
|
||||
// update key
|
||||
$handle.find('.li-field-key').text( key );
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('render_field_object', this);
|
||||
},
|
||||
|
||||
refresh: function(){
|
||||
acf.doAction('refresh_field_object', this);
|
||||
},
|
||||
|
||||
isOpen: function() {
|
||||
return this.$el.hasClass('open');
|
||||
},
|
||||
|
||||
onClickEdit: function( e ){
|
||||
this.isOpen() ? this.close() : this.open();
|
||||
},
|
||||
|
||||
open: function(){
|
||||
|
||||
// vars
|
||||
var $settings = this.$el.children('.settings');
|
||||
|
||||
// open
|
||||
$settings.slideDown();
|
||||
this.$el.addClass('open');
|
||||
|
||||
// action (open)
|
||||
acf.doAction('open_field_object', this);
|
||||
this.trigger('openFieldObject');
|
||||
|
||||
// action (show)
|
||||
acf.doAction('show', $settings);
|
||||
},
|
||||
|
||||
close: function(){
|
||||
|
||||
// vars
|
||||
var $settings = this.$el.children('.settings');
|
||||
|
||||
// close
|
||||
$settings.slideUp();
|
||||
this.$el.removeClass('open');
|
||||
|
||||
// action (close)
|
||||
acf.doAction('close_field_object', this);
|
||||
this.trigger('closeFieldObject');
|
||||
|
||||
// action (hide)
|
||||
acf.doAction('hide', $settings);
|
||||
},
|
||||
|
||||
serialize: function(){
|
||||
return acf.serialize( this.$el, this.getInputName() );
|
||||
},
|
||||
|
||||
save: function( type ){
|
||||
|
||||
// defaults
|
||||
type = type || 'settings'; // meta, settings
|
||||
|
||||
// vars
|
||||
var save = this.getProp('save');
|
||||
|
||||
// bail if already saving settings
|
||||
if( save === 'settings' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// prop
|
||||
this.setProp('save', type);
|
||||
|
||||
// debug
|
||||
this.$el.attr('data-save', type);
|
||||
|
||||
// action
|
||||
acf.doAction('save_field_object', this, type);
|
||||
},
|
||||
|
||||
submit: function(){
|
||||
|
||||
// vars
|
||||
var inputName = this.getInputName();
|
||||
var save = this.get('save');
|
||||
|
||||
// close
|
||||
if( this.isOpen() ) {
|
||||
this.close();
|
||||
}
|
||||
|
||||
// allow all inputs to save
|
||||
if( save == 'settings' ) {
|
||||
// do nothing
|
||||
|
||||
// allow only meta inputs to save
|
||||
} else if( save == 'meta' ) {
|
||||
this.$('> .settings [name^="' + inputName + '"]').remove();
|
||||
|
||||
// prevent all inputs from saving
|
||||
} else {
|
||||
this.$('[name^="' + inputName + '"]').remove();
|
||||
}
|
||||
|
||||
// action
|
||||
acf.doAction('submit_field_object', this);
|
||||
},
|
||||
|
||||
onChange: function( e, $el ){
|
||||
|
||||
// save settings
|
||||
this.save();
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('change_field_object', this);
|
||||
},
|
||||
|
||||
onChanged: function( e, $el, name, value ){
|
||||
|
||||
// ignore 'save'
|
||||
if( name == 'save' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// save meta
|
||||
if( ['menu_order', 'parent'].indexOf(name) > -1 ) {
|
||||
this.save('meta');
|
||||
|
||||
// save field
|
||||
} else {
|
||||
this.save();
|
||||
}
|
||||
|
||||
// render
|
||||
if( ['menu_order', 'label', 'required', 'name', 'type', 'key'].indexOf(name) > -1 ) {
|
||||
this.render();
|
||||
}
|
||||
|
||||
// action for 3rd party customization
|
||||
acf.doAction('change_field_object_' + name, this, value);
|
||||
},
|
||||
|
||||
onChangeLabel: function( e, $el ){
|
||||
|
||||
// set
|
||||
var label = $el.val();
|
||||
this.set('label', label);
|
||||
|
||||
// render name
|
||||
if( this.prop('name') == '' ) {
|
||||
var name = acf.applyFilters('generate_field_object_name', acf.strSanitize(label), this);
|
||||
this.prop('name', name);
|
||||
}
|
||||
},
|
||||
|
||||
onChangeName: function( e, $el){
|
||||
|
||||
// set
|
||||
var name = $el.val();
|
||||
this.set('name', name);
|
||||
|
||||
// error
|
||||
if( name.substr(0, 6) === 'field_' ) {
|
||||
alert( acf.__('The string "field_" may not be used at the start of a field name') );
|
||||
}
|
||||
},
|
||||
|
||||
onChangeRequired: function( e, $el ){
|
||||
|
||||
// set
|
||||
var required = $el.prop('checked') ? 1 : 0;
|
||||
this.set('required', required);
|
||||
},
|
||||
|
||||
delete: function( args ){
|
||||
|
||||
// defaults
|
||||
args = acf.parseArgs(args, {
|
||||
animate: true
|
||||
});
|
||||
|
||||
// add to remove list
|
||||
var id = this.prop('ID');
|
||||
|
||||
if( id ) {
|
||||
var $input = $('#_acf_delete_fields');
|
||||
var newVal = $input.val() + '|' + id;
|
||||
$input.val( newVal );
|
||||
}
|
||||
|
||||
// action
|
||||
acf.doAction('delete_field_object', this);
|
||||
|
||||
// animate
|
||||
if( args.animate ) {
|
||||
this.removeAnimate();
|
||||
} else {
|
||||
this.remove();
|
||||
}
|
||||
},
|
||||
|
||||
onClickDelete: function( e, $el ){
|
||||
|
||||
// add class
|
||||
this.$el.addClass('-hover');
|
||||
|
||||
// add tooltip
|
||||
var self = this;
|
||||
var tooltip = acf.newTooltip({
|
||||
confirmRemove: true,
|
||||
target: $el,
|
||||
confirm: function(){
|
||||
self.delete( true );
|
||||
},
|
||||
cancel: function(){
|
||||
self.$el.removeClass('-hover');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
removeAnimate: function(){
|
||||
|
||||
// vars
|
||||
var field = this;
|
||||
var $list = this.$el.parent();
|
||||
var $fields = acf.findFieldObjects({
|
||||
sibling: this.$el
|
||||
});
|
||||
|
||||
// remove
|
||||
acf.remove({
|
||||
target: this.$el,
|
||||
endHeight: $fields.length ? 0 : 50,
|
||||
complete: function(){
|
||||
field.remove();
|
||||
acf.doAction('removed_field_object', field, $list);
|
||||
}
|
||||
});
|
||||
|
||||
// action
|
||||
acf.doAction('remove_field_object', field, $list);
|
||||
},
|
||||
|
||||
duplicate: function(){
|
||||
|
||||
// vars
|
||||
var newKey = acf.uniqid('field_');
|
||||
|
||||
// duplicate
|
||||
var $newField = acf.duplicate({
|
||||
target: this.$el,
|
||||
search: this.get('id'),
|
||||
replace: newKey,
|
||||
});
|
||||
|
||||
// set new key
|
||||
$newField.attr('data-key', newKey);
|
||||
|
||||
// get instance
|
||||
var newField = acf.getFieldObject( $newField );
|
||||
|
||||
// open / close
|
||||
if( this.isOpen() ) {
|
||||
this.close();
|
||||
} else {
|
||||
newField.open();
|
||||
}
|
||||
|
||||
// focus label
|
||||
var $label = newField.$setting('label input');
|
||||
setTimeout(function(){
|
||||
$label.focus();
|
||||
}, 251);
|
||||
|
||||
// update newField label / name
|
||||
var label = newField.prop('label');
|
||||
var name = newField.prop('name');
|
||||
var end = name.split('_').pop();
|
||||
var copy = acf.__('copy');
|
||||
|
||||
// increase suffix "1"
|
||||
if( $.isNumeric(end) ) {
|
||||
var i = (end*1) + 1;
|
||||
label = label.replace( end, i );
|
||||
name = name.replace( end, i );
|
||||
|
||||
// increase suffix "(copy1)"
|
||||
} else if( end.indexOf(copy) === 0 ) {
|
||||
var i = end.replace(copy, '') * 1;
|
||||
i = i ? i+1 : 2;
|
||||
|
||||
// replace
|
||||
label = label.replace( end, copy + i );
|
||||
name = name.replace( end, copy + i );
|
||||
|
||||
// add default "(copy)"
|
||||
} else {
|
||||
label += ' (' + copy + ')';
|
||||
name += '_' + copy;
|
||||
}
|
||||
|
||||
newField.prop('ID', 0);
|
||||
newField.prop('label', label);
|
||||
newField.prop('name', name);
|
||||
newField.prop('key', newKey);
|
||||
|
||||
// action
|
||||
acf.doAction('duplicate_field_object', this, newField);
|
||||
acf.doAction('append_field_object', newField);
|
||||
},
|
||||
|
||||
wipe: function(){
|
||||
|
||||
// vars
|
||||
var prevId = this.get('id');
|
||||
var prevKey = this.get('key');
|
||||
var newKey = acf.uniqid('field_');
|
||||
|
||||
// rename
|
||||
acf.rename({
|
||||
target: this.$el,
|
||||
search: prevId,
|
||||
replace: newKey,
|
||||
});
|
||||
|
||||
// data
|
||||
this.set('id', newKey);
|
||||
this.set('prevId', prevId);
|
||||
this.set('prevKey', prevKey);
|
||||
|
||||
// props
|
||||
this.prop('key', newKey);
|
||||
this.prop('ID', 0);
|
||||
|
||||
// attr
|
||||
this.$el.attr('data-key', newKey);
|
||||
this.$el.attr('data-id', newKey);
|
||||
|
||||
// action
|
||||
acf.doAction('wipe_field_object', this);
|
||||
},
|
||||
|
||||
move: function(){
|
||||
|
||||
// helper
|
||||
var hasChanged = function( field ){
|
||||
return (field.get('save') == 'settings');
|
||||
};
|
||||
|
||||
// vars
|
||||
var changed = hasChanged(this);
|
||||
|
||||
// has sub fields changed
|
||||
if( !changed ) {
|
||||
acf.getFieldObjects({
|
||||
parent: this.$el
|
||||
}).map(function( field ){
|
||||
changed = hasChanged(field) || field.changed;
|
||||
});
|
||||
}
|
||||
|
||||
// bail early if changed
|
||||
if( changed ) {
|
||||
alert( acf.__('This field cannot be moved until its changes have been saved') );
|
||||
return;
|
||||
}
|
||||
|
||||
// step 1.
|
||||
var id = this.prop('ID');
|
||||
var field = this;
|
||||
var popup = false;
|
||||
var step1 = function(){
|
||||
|
||||
// popup
|
||||
popup = acf.newPopup({
|
||||
title: acf.__('Move Custom Field'),
|
||||
loading: true,
|
||||
width: '300px'
|
||||
});
|
||||
|
||||
// ajax
|
||||
var ajaxData = {
|
||||
action: 'acf/field_group/move_field',
|
||||
field_id: id
|
||||
};
|
||||
|
||||
// get HTML
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
type: 'post',
|
||||
dataType: 'html',
|
||||
success: step2
|
||||
});
|
||||
};
|
||||
|
||||
var step2 = function( html ){
|
||||
|
||||
// update popup
|
||||
popup.loading(false);
|
||||
popup.content(html);
|
||||
|
||||
// submit form
|
||||
popup.on('submit', 'form', step3);
|
||||
};
|
||||
|
||||
var step3 = function( e, $el ){
|
||||
|
||||
// prevent
|
||||
e.preventDefault();
|
||||
|
||||
// disable
|
||||
acf.startButtonLoading( popup.$('.button') );
|
||||
|
||||
// ajax
|
||||
var ajaxData = {
|
||||
action: 'acf/field_group/move_field',
|
||||
field_id: id,
|
||||
field_group_id: popup.$('select').val()
|
||||
};
|
||||
|
||||
// get HTML
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
type: 'post',
|
||||
dataType: 'html',
|
||||
success: step4
|
||||
});
|
||||
};
|
||||
|
||||
var step4 = function( html ){
|
||||
|
||||
// update popup
|
||||
popup.content(html);
|
||||
|
||||
// remove element
|
||||
field.removeAnimate();
|
||||
};
|
||||
|
||||
// start
|
||||
step1();
|
||||
|
||||
},
|
||||
|
||||
onChangeType: function( e, $el ){
|
||||
|
||||
// clea previous timout
|
||||
if( this.changeTimeout ) {
|
||||
clearTimeout(this.changeTimeout);
|
||||
}
|
||||
|
||||
// set new timeout
|
||||
// - prevents changing type multiple times whilst user types in newType
|
||||
this.changeTimeout = this.setTimeout(function(){
|
||||
this.changeType( $el.val() );
|
||||
}, 300);
|
||||
},
|
||||
|
||||
changeType: function( newType ){
|
||||
|
||||
// vars
|
||||
var prevType = this.prop('type');
|
||||
var prevClass = acf.strSlugify( 'acf-field-object-' + prevType );
|
||||
var newClass = acf.strSlugify( 'acf-field-object-' + newType );
|
||||
|
||||
// update props
|
||||
this.$el.removeClass(prevClass).addClass(newClass);
|
||||
this.$el.attr('data-type', newType);
|
||||
this.$el.data('type', newType);
|
||||
|
||||
// abort XHR if this field is already loading AJAX data
|
||||
if( this.has('xhr') ) {
|
||||
this.get('xhr').abort();
|
||||
}
|
||||
|
||||
// store settings
|
||||
var $tbody = this.$('> .settings > table > tbody');
|
||||
var $settings = $tbody.children('[data-setting="' + prevType + '"]');
|
||||
this.set( 'settings-' + prevType, $settings );
|
||||
$settings.detach();
|
||||
|
||||
// show settings
|
||||
if( this.has('settings-' + newType) ) {
|
||||
var $newSettings = this.get('settings-' + newType);
|
||||
this.$setting('conditional_logic').before( $newSettings );
|
||||
this.set('type', newType);
|
||||
//this.refresh();
|
||||
return;
|
||||
}
|
||||
|
||||
// load settings
|
||||
var $loading = $('<tr class="acf-field"><td class="acf-label"></td><td class="acf-input"><div class="acf-loading"></div></td></tr>');
|
||||
this.$setting('conditional_logic').before( $loading );
|
||||
|
||||
// ajax
|
||||
var ajaxData = {
|
||||
action: 'acf/field_group/render_field_settings',
|
||||
field: this.serialize(),
|
||||
prefix: this.getInputName()
|
||||
};
|
||||
|
||||
// ajax
|
||||
var xhr = $.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxData),
|
||||
type: 'post',
|
||||
dataType: 'html',
|
||||
context: this,
|
||||
success: function( html ){
|
||||
|
||||
// bail early if no settings
|
||||
if( !html ) return;
|
||||
|
||||
// append settings
|
||||
$loading.after( html );
|
||||
|
||||
// events
|
||||
acf.doAction('append', $tbody);
|
||||
},
|
||||
complete: function(){
|
||||
// also triggered by xhr.abort();
|
||||
$loading.remove();
|
||||
this.set('type', newType);
|
||||
//this.refresh();
|
||||
}
|
||||
});
|
||||
|
||||
// set
|
||||
this.set('xhr', xhr);
|
||||
|
||||
},
|
||||
|
||||
updateParent: function(){
|
||||
|
||||
// vars
|
||||
var ID = acf.get('post_id');
|
||||
|
||||
// check parent
|
||||
var parent = this.getParent();
|
||||
if( parent ) {
|
||||
ID = parseInt(parent.prop('ID')) || parent.prop('key');
|
||||
}
|
||||
|
||||
// update
|
||||
this.prop('parent', ID);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,468 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* acf.findFieldObject
|
||||
*
|
||||
* Returns a single fieldObject $el for a given field key
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param string key The field key
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
acf.findFieldObject = function( key ){
|
||||
return acf.findFieldObjects({
|
||||
key: key,
|
||||
limit: 1
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.findFieldObjects
|
||||
*
|
||||
* Returns an array of fieldObject $el for the given args
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param object args
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
acf.findFieldObjects = function( args ){
|
||||
|
||||
// vars
|
||||
args = args || {};
|
||||
var selector = '.acf-field-object';
|
||||
var $fields = false;
|
||||
|
||||
// args
|
||||
args = acf.parseArgs(args, {
|
||||
id: '',
|
||||
key: '',
|
||||
type: '',
|
||||
limit: false,
|
||||
list: null,
|
||||
parent: false,
|
||||
sibling: false,
|
||||
child: false,
|
||||
});
|
||||
|
||||
// id
|
||||
if( args.id ) {
|
||||
selector += '[data-id="' + args.id + '"]';
|
||||
}
|
||||
|
||||
// key
|
||||
if( args.key ) {
|
||||
selector += '[data-key="' + args.key + '"]';
|
||||
}
|
||||
|
||||
// type
|
||||
if( args.type ) {
|
||||
selector += '[data-type="' + args.type + '"]';
|
||||
}
|
||||
|
||||
// query
|
||||
if( args.list ) {
|
||||
$fields = args.list.children( selector );
|
||||
} else if( args.parent ) {
|
||||
$fields = args.parent.find( selector );
|
||||
} else if( args.sibling ) {
|
||||
$fields = args.sibling.siblings( selector );
|
||||
} else if( args.child ) {
|
||||
$fields = args.child.parents( selector );
|
||||
} else {
|
||||
$fields = $( selector );
|
||||
}
|
||||
|
||||
// limit
|
||||
if( args.limit ) {
|
||||
$fields = $fields.slice( 0, args.limit );
|
||||
}
|
||||
|
||||
// return
|
||||
return $fields;
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getFieldObject
|
||||
*
|
||||
* Returns a single fieldObject instance for a given $el|key
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param string|jQuery $field The field $el or key
|
||||
* @return jQuery
|
||||
*/
|
||||
|
||||
acf.getFieldObject = function( $field ){
|
||||
|
||||
// allow key
|
||||
if( typeof $field === 'string' ) {
|
||||
$field = acf.findFieldObject( $field );
|
||||
}
|
||||
|
||||
// instantiate
|
||||
var field = $field.data('acf');
|
||||
if( !field ) {
|
||||
field = acf.newFieldObject( $field );
|
||||
}
|
||||
|
||||
// return
|
||||
return field;
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getFieldObjects
|
||||
*
|
||||
* Returns an array of fieldObject instances for the given args
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param object args
|
||||
* @return array
|
||||
*/
|
||||
|
||||
acf.getFieldObjects = function( args ){
|
||||
|
||||
// query
|
||||
var $fields = acf.findFieldObjects( args );
|
||||
|
||||
// loop
|
||||
var fields = [];
|
||||
$fields.each(function(){
|
||||
var field = acf.getFieldObject( $(this) );
|
||||
fields.push( field );
|
||||
});
|
||||
|
||||
// return
|
||||
return fields;
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.newFieldObject
|
||||
*
|
||||
* Initializes and returns a new FieldObject instance
|
||||
*
|
||||
* @date 1/2/18
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param jQuery $field The field $el
|
||||
* @return object
|
||||
*/
|
||||
|
||||
acf.newFieldObject = function( $field ){
|
||||
|
||||
// instantiate
|
||||
var field = new acf.FieldObject( $field );
|
||||
|
||||
// action
|
||||
acf.doAction('new_field_object', field);
|
||||
|
||||
// return
|
||||
return field;
|
||||
};
|
||||
|
||||
/**
|
||||
* actionManager
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var eventManager = new acf.Model({
|
||||
|
||||
priority: 5,
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// actions
|
||||
var actions = [
|
||||
'prepare',
|
||||
'ready',
|
||||
'append',
|
||||
'remove'
|
||||
];
|
||||
|
||||
// loop
|
||||
actions.map(function( action ){
|
||||
this.addFieldActions( action );
|
||||
}, this);
|
||||
},
|
||||
|
||||
addFieldActions: function( action ){
|
||||
|
||||
// vars
|
||||
var pluralAction = action + '_field_objects'; // ready_field_objects
|
||||
var singleAction = action + '_field_object'; // ready_field_object
|
||||
var singleEvent = action + 'FieldObject'; // readyFieldObject
|
||||
|
||||
// global action
|
||||
var callback = function( $el /*, arg1, arg2, etc*/ ){
|
||||
|
||||
// vars
|
||||
var fieldObjects = acf.getFieldObjects({ parent: $el });
|
||||
|
||||
// call plural
|
||||
if( fieldObjects.length ) {
|
||||
|
||||
/// get args [$el, arg1]
|
||||
var args = acf.arrayArgs( arguments );
|
||||
|
||||
// modify args [pluralAction, fields, arg1]
|
||||
args.splice(0, 1, pluralAction, fieldObjects);
|
||||
acf.doAction.apply(null, args);
|
||||
}
|
||||
};
|
||||
|
||||
// plural action
|
||||
var pluralCallback = function( fieldObjects /*, arg1, arg2, etc*/ ){
|
||||
|
||||
/// get args [fields, arg1]
|
||||
var args = acf.arrayArgs( arguments );
|
||||
|
||||
// modify args [singleAction, fields, arg1]
|
||||
args.unshift(singleAction);
|
||||
|
||||
// loop
|
||||
fieldObjects.map(function( fieldObject ){
|
||||
|
||||
// modify args [singleAction, field, arg1]
|
||||
args[1] = fieldObject;
|
||||
acf.doAction.apply(null, args);
|
||||
});
|
||||
};
|
||||
|
||||
// single action
|
||||
var singleCallback = function( fieldObject /*, arg1, arg2, etc*/ ){
|
||||
|
||||
/// get args [$field, arg1]
|
||||
var args = acf.arrayArgs( arguments );
|
||||
|
||||
// modify args [singleAction, $field, arg1]
|
||||
args.unshift(singleAction);
|
||||
|
||||
// action variations (ready_field/type=image)
|
||||
var variations = ['type', 'name', 'key'];
|
||||
variations.map(function( variation ){
|
||||
args[0] = singleAction + '/' + variation + '=' + fieldObject.get(variation);
|
||||
acf.doAction.apply(null, args);
|
||||
});
|
||||
|
||||
// modify args [arg1]
|
||||
args.splice(0, 2);
|
||||
|
||||
// event
|
||||
fieldObject.trigger(singleEvent, args);
|
||||
};
|
||||
|
||||
// add actions
|
||||
acf.addAction(action, callback, 5);
|
||||
acf.addAction(pluralAction, pluralCallback, 5);
|
||||
acf.addAction(singleAction, singleCallback, 5);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* fieldManager
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 4/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var fieldManager = new acf.Model({
|
||||
|
||||
id: 'fieldManager',
|
||||
|
||||
events: {
|
||||
'submit #post': 'onSubmit',
|
||||
'mouseenter .acf-field-list': 'onHoverSortable',
|
||||
'click .add-field': 'onClickAdd',
|
||||
},
|
||||
|
||||
actions: {
|
||||
'removed_field_object': 'onRemovedField',
|
||||
'sortstop_field_object': 'onReorderField',
|
||||
'delete_field_object': 'onDeleteField',
|
||||
'change_field_object_type': 'onChangeFieldType',
|
||||
'duplicate_field_object': 'onDuplicateField'
|
||||
},
|
||||
|
||||
onSubmit: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var fields = acf.getFieldObjects();
|
||||
|
||||
// loop
|
||||
fields.map(function( field ){
|
||||
field.submit();
|
||||
});
|
||||
},
|
||||
|
||||
setFieldMenuOrder: function( field ){
|
||||
this.renderFields( field.$el.parent() );
|
||||
},
|
||||
|
||||
onHoverSortable: function( e, $el ){
|
||||
|
||||
// bail early if already sortable
|
||||
if( $el.hasClass('ui-sortable') ) return;
|
||||
|
||||
// sortable
|
||||
$el.sortable({
|
||||
handle: '.acf-sortable-handle',
|
||||
connectWith: '.acf-field-list',
|
||||
start: function( e, ui ){
|
||||
var field = acf.getFieldObject( ui.item );
|
||||
ui.placeholder.height( ui.item.height() );
|
||||
acf.doAction('sortstart_field_object', field, $el);
|
||||
},
|
||||
update: function( e, ui ){
|
||||
var field = acf.getFieldObject( ui.item );
|
||||
acf.doAction('sortstop_field_object', field, $el);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
onRemovedField: function( field, $list ){
|
||||
this.renderFields( $list );
|
||||
},
|
||||
|
||||
onReorderField: function( field, $list ){
|
||||
field.updateParent();
|
||||
this.renderFields( $list );
|
||||
},
|
||||
|
||||
onDeleteField: function( field ){
|
||||
|
||||
// delete children
|
||||
field.getFields().map(function( child ){
|
||||
child.delete({ animate: false });
|
||||
});
|
||||
},
|
||||
|
||||
onChangeFieldType: function( field ){
|
||||
// this caused sub fields to disapear if changing type back...
|
||||
//this.onDeleteField( field );
|
||||
},
|
||||
|
||||
onDuplicateField: function( field, newField ){
|
||||
|
||||
// check for children
|
||||
var children = newField.getFields();
|
||||
if( children.length ) {
|
||||
|
||||
// loop
|
||||
children.map(function( child ){
|
||||
|
||||
// wipe field
|
||||
child.wipe();
|
||||
|
||||
// update parent
|
||||
child.updateParent();
|
||||
});
|
||||
|
||||
// action
|
||||
acf.doAction('duplicate_field_objects', children, newField, field);
|
||||
}
|
||||
|
||||
// set menu order
|
||||
this.setFieldMenuOrder( newField );
|
||||
},
|
||||
|
||||
renderFields: function( $list ){
|
||||
|
||||
// vars
|
||||
var fields = acf.getFieldObjects({
|
||||
list: $list
|
||||
});
|
||||
|
||||
// no fields
|
||||
if( !fields.length ) {
|
||||
$list.addClass('-empty');
|
||||
return;
|
||||
}
|
||||
|
||||
// has fields
|
||||
$list.removeClass('-empty');
|
||||
|
||||
// prop
|
||||
fields.map(function( field, i ){
|
||||
field.prop('menu_order', i);
|
||||
});
|
||||
},
|
||||
|
||||
onClickAdd: function( e, $el ){
|
||||
var $list = $el.closest('.acf-tfoot').siblings('.acf-field-list');
|
||||
this.addField( $list );
|
||||
},
|
||||
|
||||
addField: function( $list ){
|
||||
|
||||
// vars
|
||||
var html = $('#tmpl-acf-field').html();
|
||||
var $el = $(html);
|
||||
var prevId = $el.data('id');
|
||||
var newKey = acf.uniqid('field_');
|
||||
|
||||
// duplicate
|
||||
var $newField = acf.duplicate({
|
||||
target: $el,
|
||||
search: prevId,
|
||||
replace: newKey,
|
||||
append: function( $el, $el2 ){
|
||||
$list.append( $el2 );
|
||||
}
|
||||
});
|
||||
|
||||
// get instance
|
||||
var newField = acf.getFieldObject( $newField );
|
||||
|
||||
// props
|
||||
newField.prop('key', newKey);
|
||||
newField.prop('ID', 0);
|
||||
newField.prop('label', '');
|
||||
newField.prop('name', '');
|
||||
|
||||
// attr
|
||||
$newField.attr('data-key', newKey);
|
||||
$newField.attr('data-id', newKey);
|
||||
|
||||
// update parent prop
|
||||
newField.updateParent();
|
||||
|
||||
// focus label
|
||||
var $label = newField.$input('label');
|
||||
setTimeout(function(){
|
||||
$label.focus();
|
||||
}, 251);
|
||||
|
||||
// open
|
||||
newField.open();
|
||||
|
||||
// set menu order
|
||||
this.renderFields( $list );
|
||||
|
||||
// action
|
||||
acf.doAction('add_field_object', newField);
|
||||
acf.doAction('append_field_object', newField);
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,104 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* locationManager
|
||||
*
|
||||
* Field group location rules functionality
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var locationManager = new acf.Model({
|
||||
|
||||
id: 'locationManager',
|
||||
wait: 'ready',
|
||||
|
||||
events: {
|
||||
'click .add-location-rule': 'onClickAddRule',
|
||||
'click .add-location-group': 'onClickAddGroup',
|
||||
'click .remove-location-rule': 'onClickRemoveRule',
|
||||
'change .refresh-location-rule': 'onChangeRemoveRule'
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
this.$el = $('#acf-field-group-locations');
|
||||
},
|
||||
|
||||
onClickAddRule: function( e, $el ){
|
||||
this.addRule( $el.closest('tr') );
|
||||
},
|
||||
|
||||
onClickRemoveRule: function( e, $el ){
|
||||
this.removeRule( $el.closest('tr') );
|
||||
},
|
||||
|
||||
onChangeRemoveRule: function( e, $el ){
|
||||
this.changeRule( $el.closest('tr') );
|
||||
},
|
||||
|
||||
onClickAddGroup: function( e, $el ){
|
||||
this.addGroup();
|
||||
},
|
||||
|
||||
addRule: function( $tr ){
|
||||
acf.duplicate( $tr );
|
||||
},
|
||||
|
||||
removeRule: function( $tr ){
|
||||
if( $tr.siblings('tr').length == 0 ) {
|
||||
$tr.closest('.rule-group').remove();
|
||||
} else {
|
||||
$tr.remove();
|
||||
}
|
||||
},
|
||||
|
||||
changeRule: function( $rule ){
|
||||
|
||||
// vars
|
||||
var $group = $rule.closest('.rule-group');
|
||||
var prefix = $rule.find('td.param select').attr('name').replace('[param]', '');
|
||||
|
||||
// ajaxdata
|
||||
var ajaxdata = {};
|
||||
ajaxdata.action = 'acf/field_group/render_location_rule';
|
||||
ajaxdata.rule = acf.serialize( $rule, prefix );
|
||||
ajaxdata.rule.id = $rule.data('id');
|
||||
ajaxdata.rule.group = $group.data('id');
|
||||
|
||||
// temp disable
|
||||
acf.disable( $rule.find('td.value') );
|
||||
|
||||
// ajax
|
||||
$.ajax({
|
||||
url: acf.get('ajaxurl'),
|
||||
data: acf.prepareForAjax(ajaxdata),
|
||||
type: 'post',
|
||||
dataType: 'html',
|
||||
success: function( html ){
|
||||
if( !html ) return;
|
||||
$rule.replaceWith( html );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
addGroup: function(){
|
||||
|
||||
// vars
|
||||
var $group = this.$('.rule-group:last');
|
||||
|
||||
// duplicate
|
||||
$group2 = acf.duplicate( $group );
|
||||
|
||||
// update h4
|
||||
$group2.find('h4').text( acf.__('or') );
|
||||
|
||||
// remove all tr's except the first one
|
||||
$group2.find('tr').not(':first').remove();
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,248 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* mid
|
||||
*
|
||||
* Calculates the model ID for a field type
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param string type
|
||||
* @return string
|
||||
*/
|
||||
|
||||
var modelId = function( type ) {
|
||||
return acf.strPascalCase( type || '' ) + 'FieldSetting';
|
||||
};
|
||||
|
||||
/**
|
||||
* registerFieldType
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.registerFieldSetting = function( model ){
|
||||
var proto = model.prototype;
|
||||
var mid = modelId(proto.type + ' ' + proto.name);
|
||||
this.models[ mid ] = model;
|
||||
};
|
||||
|
||||
/**
|
||||
* newField
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 14/12/17
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.newFieldSetting = function( field ){
|
||||
|
||||
// vars
|
||||
var type = field.get('setting') || '';
|
||||
var name = field.get('name') || '';
|
||||
var mid = modelId( type + ' ' + name );
|
||||
var model = acf.models[ mid ] || null;
|
||||
|
||||
// bail ealry if no setting
|
||||
if( model === null ) return false;
|
||||
|
||||
// instantiate
|
||||
var setting = new model( field );
|
||||
|
||||
// return
|
||||
return setting;
|
||||
};
|
||||
|
||||
/**
|
||||
* acf.getFieldSetting
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 19/4/18
|
||||
* @since 5.6.9
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.getFieldSetting = function( field ) {
|
||||
|
||||
// allow jQuery
|
||||
if( field instanceof jQuery ) {
|
||||
field = acf.getField(field);
|
||||
}
|
||||
|
||||
// return
|
||||
return field.setting;
|
||||
};
|
||||
|
||||
/**
|
||||
* settingsManager
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 6/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
var settingsManager = new acf.Model({
|
||||
actions: {
|
||||
'new_field': 'onNewField'
|
||||
},
|
||||
onNewField: function( field ){
|
||||
field.setting = acf.newFieldSetting( field );
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* acf.FieldSetting
|
||||
*
|
||||
* description
|
||||
*
|
||||
* @date 6/1/18
|
||||
* @since 5.6.5
|
||||
*
|
||||
* @param type $var Description. Default.
|
||||
* @return type Description.
|
||||
*/
|
||||
|
||||
acf.FieldSetting = acf.Model.extend({
|
||||
|
||||
field: false,
|
||||
type: '',
|
||||
name: '',
|
||||
wait: 'ready',
|
||||
eventScope: '.acf-field',
|
||||
|
||||
events: {
|
||||
'change': 'render'
|
||||
},
|
||||
|
||||
setup: function( field ){
|
||||
|
||||
// vars
|
||||
var $field = field.$el;
|
||||
|
||||
// set props
|
||||
this.$el = $field;
|
||||
this.field = field;
|
||||
this.$fieldObject = $field.closest('.acf-field-object');
|
||||
this.fieldObject = acf.getFieldObject( this.$fieldObject );
|
||||
|
||||
// inherit data
|
||||
$.extend(this.data, field.data);
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
this.render();
|
||||
},
|
||||
|
||||
render: function(){
|
||||
// do nothing
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
* Date Picker
|
||||
*
|
||||
* This field type requires some extra logic for its settings
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
var DisplayFormatFieldSetting = acf.FieldSetting.extend({
|
||||
type: '',
|
||||
name: '',
|
||||
render: function(){
|
||||
var $input = this.$('input[type="radio"]:checked');
|
||||
if( $input.val() != 'other' ) {
|
||||
this.$('input[type="text"]').val( $input.val() );
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var DatePickerDisplayFormatFieldSetting = DisplayFormatFieldSetting.extend({
|
||||
type: 'date_picker',
|
||||
name: 'display_format'
|
||||
});
|
||||
|
||||
var DatePickerReturnFormatFieldSetting = DisplayFormatFieldSetting.extend({
|
||||
type: 'date_picker',
|
||||
name: 'return_format'
|
||||
});
|
||||
|
||||
acf.registerFieldSetting( DatePickerDisplayFormatFieldSetting );
|
||||
acf.registerFieldSetting( DatePickerReturnFormatFieldSetting );
|
||||
|
||||
/*
|
||||
* Date Time Picker
|
||||
*
|
||||
* This field type requires some extra logic for its settings
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
var DateTimePickerDisplayFormatFieldSetting = DisplayFormatFieldSetting.extend({
|
||||
type: 'date_time_picker',
|
||||
name: 'display_format'
|
||||
});
|
||||
|
||||
var DateTimePickerReturnFormatFieldSetting = DisplayFormatFieldSetting.extend({
|
||||
type: 'date_time_picker',
|
||||
name: 'return_format'
|
||||
});
|
||||
|
||||
acf.registerFieldSetting( DateTimePickerDisplayFormatFieldSetting );
|
||||
acf.registerFieldSetting( DateTimePickerReturnFormatFieldSetting );
|
||||
|
||||
/*
|
||||
* Time Picker
|
||||
*
|
||||
* This field type requires some extra logic for its settings
|
||||
*
|
||||
* @type function
|
||||
* @date 24/10/13
|
||||
* @since 5.0.0
|
||||
*
|
||||
* @param n/a
|
||||
* @return n/a
|
||||
*/
|
||||
|
||||
var TimePickerDisplayFormatFieldSetting = DisplayFormatFieldSetting.extend({
|
||||
type: 'time_picker',
|
||||
name: 'display_format'
|
||||
});
|
||||
|
||||
var TimePickerReturnFormatFieldSetting = DisplayFormatFieldSetting.extend({
|
||||
name: 'time_picker',
|
||||
name: 'return_format'
|
||||
});
|
||||
|
||||
acf.registerFieldSetting( TimePickerDisplayFormatFieldSetting );
|
||||
acf.registerFieldSetting( TimePickerReturnFormatFieldSetting );
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,182 @@
|
||||
(function($, undefined){
|
||||
|
||||
/**
|
||||
* fieldGroupManager
|
||||
*
|
||||
* Generic field group functionality
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var fieldGroupManager = new acf.Model({
|
||||
|
||||
id: 'fieldGroupManager',
|
||||
|
||||
events: {
|
||||
'submit #post': 'onSubmit',
|
||||
'click a[href="#"]': 'onClick',
|
||||
'click .submitdelete': 'onClickTrash',
|
||||
},
|
||||
|
||||
filters: {
|
||||
'find_fields_args': 'filterFindFieldArgs'
|
||||
},
|
||||
|
||||
onSubmit: function( e, $el ){
|
||||
|
||||
// vars
|
||||
var $title = $('#titlewrap #title');
|
||||
|
||||
// empty
|
||||
if( !$title.val() ) {
|
||||
|
||||
// prevent default
|
||||
e.preventDefault();
|
||||
|
||||
// unlock form
|
||||
acf.unlockForm( $el );
|
||||
|
||||
// alert
|
||||
alert( acf.__('Field group title is required') );
|
||||
|
||||
// focus
|
||||
$title.focus();
|
||||
}
|
||||
},
|
||||
|
||||
onClick: function( e ){
|
||||
e.preventDefault();
|
||||
},
|
||||
|
||||
onClickTrash: function( e ){
|
||||
var result = confirm( acf.__('Move to trash. Are you sure?') );
|
||||
if( !result ) {
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
|
||||
filterFindFieldArgs: function( args ){
|
||||
args.visible = true;
|
||||
return args;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* screenOptionsManager
|
||||
*
|
||||
* Screen options functionality
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var screenOptionsManager = new acf.Model({
|
||||
|
||||
id: 'screenOptionsManager',
|
||||
wait: 'prepare',
|
||||
|
||||
events: {
|
||||
'change': 'onChange'
|
||||
},
|
||||
|
||||
initialize: function(){
|
||||
|
||||
// vars
|
||||
var $div = $('#adv-settings');
|
||||
var $append = $('#acf-append-show-on-screen');
|
||||
|
||||
// append
|
||||
$div.find('.metabox-prefs').append( $append.html() );
|
||||
$div.find('.metabox-prefs br').remove();
|
||||
|
||||
// clean up
|
||||
$append.remove();
|
||||
|
||||
// initialize
|
||||
this.$el = $('#acf-field-key-hide');
|
||||
|
||||
// render
|
||||
this.render();
|
||||
},
|
||||
|
||||
isChecked: function(){
|
||||
return this.$el.prop('checked');
|
||||
},
|
||||
|
||||
onChange: function( e, $el ) {
|
||||
var val = this.isChecked() ? 1 : 0;
|
||||
acf.updateUserSetting('show_field_keys', val);
|
||||
this.render();
|
||||
},
|
||||
|
||||
render: function(){
|
||||
if( this.isChecked() ) {
|
||||
$('#acf-field-group-fields').addClass('show-field-keys');
|
||||
} else {
|
||||
$('#acf-field-group-fields').removeClass('show-field-keys');
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* appendFieldManager
|
||||
*
|
||||
* Appends fields together
|
||||
*
|
||||
* @date 15/12/17
|
||||
* @since 5.7.0
|
||||
*
|
||||
* @param void
|
||||
* @return void
|
||||
*/
|
||||
|
||||
var appendFieldManager = new acf.Model({
|
||||
|
||||
actions: {
|
||||
'new_field' : 'onNewField'
|
||||
},
|
||||
|
||||
onNewField: function( field ){
|
||||
|
||||
// bail ealry if not append
|
||||
if( !field.has('append') ) return;
|
||||
|
||||
// vars
|
||||
var append = field.get('append');
|
||||
var $sibling = field.$el.siblings('[data-name="' + append + '"]').first();
|
||||
|
||||
// bail early if no sibling
|
||||
if( !$sibling.length ) return;
|
||||
|
||||
// ul
|
||||
var $div = $sibling.children('.acf-input');
|
||||
var $ul = $div.children('ul');
|
||||
|
||||
// create ul
|
||||
if( !$ul.length ) {
|
||||
$div.wrapInner('<ul class="acf-hl"><li></li></ul>');
|
||||
$ul = $div.children('ul');
|
||||
}
|
||||
|
||||
// li
|
||||
var html = field.$('.acf-input').html();
|
||||
var $li = $('<li>' + html + '</li>');
|
||||
$ul.append( $li );
|
||||
$ul.attr('data-cols', $ul.children().length );
|
||||
|
||||
// clean up
|
||||
field.remove();
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,7 @@
|
||||
// @codekit-prepend "_field-group.js";
|
||||
// @codekit-prepend "_field-group-field.js";
|
||||
// @codekit-prepend "_field-group-settings.js";
|
||||
// @codekit-prepend "_field-group-conditions.js";
|
||||
// @codekit-prepend "_field-group-fields.js";
|
||||
// @codekit-prepend "_field-group-locations.js";
|
||||
// @codekit-prepend "_field-group-compatibility.js";
|
||||
7
wp-content/plugins/advanced-custom-fields/assets/build/js/acf-field-group.min.js
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
// @codekit-prepend "_field-group.js";
|
||||
// @codekit-prepend "_field-group-field.js";
|
||||
// @codekit-prepend "_field-group-settings.js";
|
||||
// @codekit-prepend "_field-group-conditions.js";
|
||||
// @codekit-prepend "_field-group-fields.js";
|
||||
// @codekit-prepend "_field-group-locations.js";
|
||||
// @codekit-prepend "_field-group-compatibility.js";
|
||||
@@ -0,0 +1,45 @@
|
||||
// @codekit-prepend "_acf.js";
|
||||
// @codekit-prepend "_acf-hooks.js";
|
||||
// @codekit-prepend "_acf-model.js";
|
||||
// @codekit-prepend "_acf-popup.js";
|
||||
// @codekit-prepend "_acf-unload.js";
|
||||
// @codekit-prepend "_acf-panel.js";
|
||||
// @codekit-prepend "_acf-notice.js";
|
||||
// @codekit-prepend "_acf-postbox.js";
|
||||
// @codekit-prepend "_acf-tooltip.js";
|
||||
// @codekit-prepend "_acf-field.js";
|
||||
// @codekit-prepend "_acf-fields.js";
|
||||
// @codekit-prepend "_acf-field-accordion.js";
|
||||
// @codekit-prepend "_acf-field-button-group.js";
|
||||
// @codekit-prepend "_acf-field-checkbox.js";
|
||||
// @codekit-prepend "_acf-field-color-picker.js";
|
||||
// @codekit-prepend "_acf-field-date-picker.js";
|
||||
// @codekit-prepend "_acf-field-date-time-picker.js";
|
||||
// @codekit-prepend "_acf-field-google-map.js";
|
||||
// @codekit-prepend "_acf-field-image.js";
|
||||
// @codekit-prepend "_acf-field-file.js";
|
||||
// @codekit-prepend "_acf-field-link.js";
|
||||
// @codekit-prepend "_acf-field-oembed.js";
|
||||
// @codekit-prepend "_acf-field-radio.js";
|
||||
// @codekit-prepend "_acf-field-range.js";
|
||||
// @codekit-prepend "_acf-field-relationship.js";
|
||||
// @codekit-prepend "_acf-field-select.js";
|
||||
// @codekit-prepend "_acf-field-tab.js";
|
||||
// @codekit-prepend "_acf-field-post-object.js";
|
||||
// @codekit-prepend "_acf-field-page-link.js";
|
||||
// @codekit-prepend "_acf-field-user.js";
|
||||
// @codekit-prepend "_acf-field-taxonomy.js";
|
||||
// @codekit-prepend "_acf-field-time-picker.js";
|
||||
// @codekit-prepend "_acf-field-true-false.js";
|
||||
// @codekit-prepend "_acf-field-url.js";
|
||||
// @codekit-prepend "_acf-field-wysiwyg.js";
|
||||
// @codekit-prepend "_acf-condition.js";
|
||||
// @codekit-prepend "_acf-conditions.js";
|
||||
// @codekit-prepend "_acf-condition-types.js";
|
||||
// @codekit-prepend "_acf-media.js";
|
||||
// @codekit-prepend "_acf-screen.js";
|
||||
// @codekit-prepend "_acf-select2.js";
|
||||
// @codekit-prepend "_acf-tinymce.js";
|
||||
// @codekit-prepend "_acf-validation.js";
|
||||
// @codekit-prepend "_acf-helpers.js";
|
||||
// @codekit-prepend "_acf-compatibility";
|
||||
45
wp-content/plugins/advanced-custom-fields/assets/build/js/acf-input.min.js
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
// @codekit-prepend "_acf.js";
|
||||
// @codekit-prepend "_acf-hooks.js";
|
||||
// @codekit-prepend "_acf-model.js";
|
||||
// @codekit-prepend "_acf-popup.js";
|
||||
// @codekit-prepend "_acf-unload.js";
|
||||
// @codekit-prepend "_acf-panel.js";
|
||||
// @codekit-prepend "_acf-notice.js";
|
||||
// @codekit-prepend "_acf-postbox.js";
|
||||
// @codekit-prepend "_acf-tooltip.js";
|
||||
// @codekit-prepend "_acf-field.js";
|
||||
// @codekit-prepend "_acf-fields.js";
|
||||
// @codekit-prepend "_acf-field-accordion.js";
|
||||
// @codekit-prepend "_acf-field-button-group.js";
|
||||
// @codekit-prepend "_acf-field-checkbox.js";
|
||||
// @codekit-prepend "_acf-field-color-picker.js";
|
||||
// @codekit-prepend "_acf-field-date-picker.js";
|
||||
// @codekit-prepend "_acf-field-date-time-picker.js";
|
||||
// @codekit-prepend "_acf-field-google-map.js";
|
||||
// @codekit-prepend "_acf-field-image.js";
|
||||
// @codekit-prepend "_acf-field-file.js";
|
||||
// @codekit-prepend "_acf-field-link.js";
|
||||
// @codekit-prepend "_acf-field-oembed.js";
|
||||
// @codekit-prepend "_acf-field-radio.js";
|
||||
// @codekit-prepend "_acf-field-range.js";
|
||||
// @codekit-prepend "_acf-field-relationship.js";
|
||||
// @codekit-prepend "_acf-field-select.js";
|
||||
// @codekit-prepend "_acf-field-tab.js";
|
||||
// @codekit-prepend "_acf-field-post-object.js";
|
||||
// @codekit-prepend "_acf-field-page-link.js";
|
||||
// @codekit-prepend "_acf-field-user.js";
|
||||
// @codekit-prepend "_acf-field-taxonomy.js";
|
||||
// @codekit-prepend "_acf-field-time-picker.js";
|
||||
// @codekit-prepend "_acf-field-true-false.js";
|
||||
// @codekit-prepend "_acf-field-url.js";
|
||||
// @codekit-prepend "_acf-field-wysiwyg.js";
|
||||
// @codekit-prepend "_acf-condition.js";
|
||||
// @codekit-prepend "_acf-conditions.js";
|
||||
// @codekit-prepend "_acf-condition-types.js";
|
||||
// @codekit-prepend "_acf-media.js";
|
||||
// @codekit-prepend "_acf-screen.js";
|
||||
// @codekit-prepend "_acf-select2.js";
|
||||
// @codekit-prepend "_acf-tinymce.js";
|
||||
// @codekit-prepend "_acf-validation.js";
|
||||
// @codekit-prepend "_acf-helpers.js";
|
||||
// @codekit-prepend "_acf-compatibility";
|
||||
48
wp-content/plugins/advanced-custom-fields/assets/font/LICENSE.txt
Executable file
@@ -0,0 +1,48 @@
|
||||
Font license info
|
||||
|
||||
|
||||
## Entypo
|
||||
|
||||
Copyright (C) 2012 by Daniel Bruce
|
||||
|
||||
Author: Daniel Bruce
|
||||
License: SIL (http://scripts.sil.org/OFL)
|
||||
Homepage: http://www.entypo.com
|
||||
|
||||
|
||||
## Typicons
|
||||
|
||||
(c) Stephen Hutchings 2012
|
||||
|
||||
Author: Stephen Hutchings
|
||||
License: SIL (http://scripts.sil.org/OFL)
|
||||
Homepage: http://typicons.com/
|
||||
|
||||
|
||||
## Font Awesome
|
||||
|
||||
Copyright (C) 2016 by Dave Gandy
|
||||
|
||||
Author: Dave Gandy
|
||||
License: SIL ()
|
||||
Homepage: http://fortawesome.github.com/Font-Awesome/
|
||||
|
||||
|
||||
## Elusive
|
||||
|
||||
Copyright (C) 2013 by Aristeides Stathopoulos
|
||||
|
||||
Author: Aristeides Stathopoulos
|
||||
License: SIL (http://scripts.sil.org/OFL)
|
||||
Homepage: http://aristeides.com/
|
||||
|
||||
|
||||
## Modern Pictograms
|
||||
|
||||
Copyright (c) 2012 by John Caserta. All rights reserved.
|
||||
|
||||
Author: John Caserta
|
||||
License: SIL (http://scripts.sil.org/OFL)
|
||||
Homepage: http://thedesignoffice.org/project/modern-pictograms/
|
||||
|
||||
|
||||
75
wp-content/plugins/advanced-custom-fields/assets/font/README.txt
Executable file
@@ -0,0 +1,75 @@
|
||||
This webfont is generated by http://fontello.com open source project.
|
||||
|
||||
|
||||
================================================================================
|
||||
Please, note, that you should obey original font licenses, used to make this
|
||||
webfont pack. Details available in LICENSE.txt file.
|
||||
|
||||
- Usually, it's enough to publish content of LICENSE.txt file somewhere on your
|
||||
site in "About" section.
|
||||
|
||||
- If your project is open-source, usually, it will be ok to make LICENSE.txt
|
||||
file publicly available in your repository.
|
||||
|
||||
- Fonts, used in Fontello, don't require a clickable link on your site.
|
||||
But any kind of additional authors crediting is welcome.
|
||||
================================================================================
|
||||
|
||||
|
||||
Comments on archive content
|
||||
---------------------------
|
||||
|
||||
- /font/* - fonts in different formats
|
||||
|
||||
- /css/* - different kinds of css, for all situations. Should be ok with
|
||||
twitter bootstrap. Also, you can skip <i> style and assign icon classes
|
||||
directly to text elements, if you don't mind about IE7.
|
||||
|
||||
- demo.html - demo file, to show your webfont content
|
||||
|
||||
- LICENSE.txt - license info about source fonts, used to build your one.
|
||||
|
||||
- config.json - keeps your settings. You can import it back into fontello
|
||||
anytime, to continue your work
|
||||
|
||||
|
||||
Why so many CSS files ?
|
||||
-----------------------
|
||||
|
||||
Because we like to fit all your needs :)
|
||||
|
||||
- basic file, <your_font_name>.css - is usually enough, it contains @font-face
|
||||
and character code definitions
|
||||
|
||||
- *-ie7.css - if you need IE7 support, but still don't wish to put char codes
|
||||
directly into html
|
||||
|
||||
- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face
|
||||
rules, but still wish to benefit from css generation. That can be very
|
||||
convenient for automated asset build systems. When you need to update font -
|
||||
no need to manually edit files, just override old version with archive
|
||||
content. See fontello source code for examples.
|
||||
|
||||
- *-embedded.css - basic css file, but with embedded WOFF font, to avoid
|
||||
CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain.
|
||||
We strongly recommend to resolve this issue by `Access-Control-Allow-Origin`
|
||||
server headers. But if you ok with dirty hack - this file is for you. Note,
|
||||
that data url moved to separate @font-face to avoid problems with <IE9, when
|
||||
string is too long.
|
||||
|
||||
- animate.css - use it to get ideas about spinner rotation animation.
|
||||
|
||||
|
||||
Attention for server setup
|
||||
--------------------------
|
||||
|
||||
You MUST setup server to reply with proper `mime-types` for font files -
|
||||
otherwise some browsers will fail to show fonts.
|
||||
|
||||
Usually, `apache` already has necessary settings, but `nginx` and other
|
||||
webservers should be tuned. Here is list of mime types for our file extensions:
|
||||
|
||||
- `application/vnd.ms-fontobject` - eot
|
||||
- `application/x-font-woff` - woff
|
||||
- `application/x-font-ttf` - ttf
|
||||
- `image/svg+xml` - svg
|
||||
BIN
wp-content/plugins/advanced-custom-fields/assets/font/acf.eot
Executable file
48
wp-content/plugins/advanced-custom-fields/assets/font/acf.svg
Executable file
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata>
|
||||
<defs>
|
||||
<font id="acf" horiz-adv-x="1000" >
|
||||
<font-face font-family="acf" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
|
||||
<missing-glyph horiz-adv-x="1000" />
|
||||
<glyph glyph-name="plus" unicode="" d="M550 400q30 0 30-50t-30-50l-210 0 0-210q0-30-50-30t-50 30l0 210-210 0q-30 0-30 50t30 50l210 0 0 210q0 30 50 30t50-30l0-210 210 0z" horiz-adv-x="580" />
|
||||
|
||||
<glyph glyph-name="minus" unicode="" d="M550 400q30 0 30-50t-30-50l-520 0q-30 0-30 50t30 50l520 0z" horiz-adv-x="580" />
|
||||
|
||||
<glyph glyph-name="cancel" unicode="" d="M452 194q18-18 18-43t-18-43q-18-16-43-16t-43 16l-132 152-132-152q-18-16-43-16t-43 16q-16 18-16 43t16 43l138 156-138 158q-16 18-16 43t16 43q18 16 43 16t43-16l132-152 132 152q18 16 43 16t43-16q18-18 18-43t-18-43l-138-158z" horiz-adv-x="470" />
|
||||
|
||||
<glyph glyph-name="pencil" unicode="" d="M938 605q22-22 22-55t-22-55l-570-570q-22-21-60-38t-73-17l-235 0 0 234q0 35 17 74t38 60l570 570q23 22 55 22t55-22z m-794-426l65-64 431 433-64 63z m91-205q14 0 33 8-10 10-27 26t-50 50-56 56l-22 22q-9-21-9-32l0-78 52-52 79 0z m74 40l432 432-63 64-433-431z m469 469l67 67-165 165-67-66z" horiz-adv-x="960" />
|
||||
|
||||
<glyph glyph-name="location" unicode="" d="M250 750q104 0 177-73t73-177q0-106-62-243t-126-223l-62-84q-10 12-27 35t-60 89-76 130-60 147-27 149q0 104 73 177t177 73z m0-388q56 0 96 40t40 96-40 95-96 39-95-39-39-95 39-96 95-40z" horiz-adv-x="500" />
|
||||
|
||||
<glyph glyph-name="down" unicode="" d="M564 422l-234-224q-18-18-40-18t-40 18l-234 224q-16 16-16 41t16 41q38 38 78 0l196-188 196 188q40 38 78 0 16-16 16-41t-16-41z" horiz-adv-x="580" />
|
||||
|
||||
<glyph glyph-name="left" unicode="" d="M242 626q14 16 39 16t41-16q38-36 0-80l-186-196 186-194q38-44 0-80-16-16-40-16t-40 16l-226 236q-16 16-16 38 0 24 16 40 206 214 226 236z" horiz-adv-x="341" />
|
||||
|
||||
<glyph glyph-name="right" unicode="" d="M98 626l226-236q16-16 16-40 0-22-16-38l-226-236q-16-16-40-16t-40 16q-36 36 0 80l186 194-186 196q-36 44 0 80 16 16 41 16t39-16z" horiz-adv-x="340" />
|
||||
|
||||
<glyph glyph-name="up" unicode="" d="M564 280q16-16 16-41t-16-41q-38-38-78 0l-196 188-196-188q-40-38-78 0-16 16-16 41t16 41l234 224q16 16 40 16t40-16z" horiz-adv-x="580" />
|
||||
|
||||
<glyph glyph-name="sync" unicode="" d="M843 261q0-3 0-4-36-150-150-243t-267-93q-81 0-157 31t-136 88l-72-72q-11-11-25-11t-25 11-11 25v250q0 14 11 25t25 11h250q14 0 25-11t10-25-10-25l-77-77q40-36 90-57t105-20q74 0 139 37t104 99q6 10 30 66 4 13 16 13h107q8 0 13-6t5-12z m14 446v-250q0-14-10-25t-26-11h-250q-14 0-25 11t-10 25 10 25l77 77q-82 77-194 77-75 0-140-37t-104-99q-6-10-29-66-5-13-17-13h-111q-7 0-13 6t-5 12v4q36 150 151 243t268 93q81 0 158-31t137-88l72 72q11 11 25 11t26-11 10-25z" horiz-adv-x="857.1" />
|
||||
|
||||
<glyph glyph-name="globe" unicode="" d="M480 830q200 0 340-141t140-339q0-200-140-340t-340-140q-198 0-339 140t-141 340q0 198 141 339t339 141z m410-480q0 132-78 239t-202 149q-18-24-16-32 4-38 18-51t30-7l32 12t20 2q22-24 0-47t-45-56-1-77q34-64 96-64 28-2 43-36t17-66q10-80-14-140-22-44 14-76 86 112 86 250z m-466 404q-112-14-199-84t-127-174q6 0 22-2t28-3 26-4 24-8 12-13q4-12-14-45t-18-61q0-30 38-56t38-46q0-28 8-68t8-44q0-12 36-54t52-42q10 0 11 22t-2 54-3 40q0 32 14 74 12 42 59 70t55 46q16 34 9 61t-17 43-34 28-41 17-37 9-22 4q-16 6-42 7t-36-3-27 11-17 29q0 10 15 27t35 37 28 30q8 14 17 21t22 16 27 21q4 4 25 17t27 23z m-72-794q66-20 128-20 128 0 226 68-26 44-118 34-24-2-65-17t-47-17q-74-16-76-16-12-2-26-14t-22-18z" horiz-adv-x="960" />
|
||||
|
||||
<glyph glyph-name="picture" unicode="" d="M0-68l0 836 1000 0 0-836-1000 0z m76 78l848 0 0 680-848 0 0-680z m90 80l0 59 150 195 102-86 193 291 223-228 0-231-668 0z m0 416q0 37 24 62t62 24q33 0 58-24t24-62q0-33-24-57t-58-25q-37 0-62 25t-24 57z" horiz-adv-x="1000" />
|
||||
|
||||
<glyph glyph-name="check" unicode="" d="M249 0q-34 0-56 28l-180 236q-16 24-12 52t26 46 51 14 47-28l118-154 296 474q16 24 43 30t53-8q24-16 30-43t-8-53l-350-560q-20-32-56-32z" horiz-adv-x="667" />
|
||||
|
||||
<glyph glyph-name="dot-3" unicode="" d="M110 460q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-33-77t-77-33-77 33-33 77q0 46 32 78t78 32z m350 0q46 0 78-32t32-78q0-44-32-77t-78-33-78 33-32 77q0 46 32 78t78 32z" horiz-adv-x="920" />
|
||||
|
||||
<glyph glyph-name="arrow-combo" unicode="" d="M230 850l230-364-460 0z m0-1000l-230 366 460 0z" horiz-adv-x="460" />
|
||||
|
||||
<glyph glyph-name="arrow-down" unicode="" d="M540 587l-269-473-271 473 540 0z" horiz-adv-x="540" />
|
||||
|
||||
<glyph glyph-name="arrow-up" unicode="" d="M0 114l269 473 271-473-540 0z" horiz-adv-x="540" />
|
||||
|
||||
<glyph glyph-name="search" unicode="" d="M772 78q30-34 6-62l-46-46q-36-32-68 0l-190 190q-74-42-156-42-128 0-223 95t-95 223 90 219 218 91 224-95 96-223q0-88-46-162z m-678 358q0-88 68-156t156-68 151 63 63 153q0 88-68 155t-156 67-151-63-63-151z" horiz-adv-x="789" />
|
||||
|
||||
<glyph glyph-name="link-ext" unicode="" d="M786 332v-178q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h393q7 0 12-5t5-13v-36q0-8-5-13t-12-5h-393q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v178q0 8 5 13t13 5h36q8 0 13-5t5-13z m214 482v-285q0-15-11-25t-25-11-25 11l-98 98-364-364q-5-6-13-6t-12 6l-64 64q-6 5-6 12t6 13l364 364-98 98q-11 11-11 25t11 25 25 11h285q15 0 25-11t11-25z" horiz-adv-x="1000" />
|
||||
</font>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
BIN
wp-content/plugins/advanced-custom-fields/assets/font/acf.ttf
Executable file
BIN
wp-content/plugins/advanced-custom-fields/assets/font/acf.woff
Executable file
BIN
wp-content/plugins/advanced-custom-fields/assets/font/acf.woff2
Executable file
124
wp-content/plugins/advanced-custom-fields/assets/font/config.json
Executable file
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"name": "acf",
|
||||
"css_prefix_text": "acf-icon-",
|
||||
"css_use_suffix": false,
|
||||
"hinting": true,
|
||||
"units_per_em": 1000,
|
||||
"ascent": 850,
|
||||
"glyphs": [
|
||||
{
|
||||
"uid": "a73c5deb486c8d66249811642e5d719a",
|
||||
"css": "sync",
|
||||
"code": 59401,
|
||||
"src": "fontawesome"
|
||||
},
|
||||
{
|
||||
"uid": "7222571caa5c15f83dcfd447c58d68d9",
|
||||
"css": "search",
|
||||
"code": 59409,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "14017aae737730faeda4a6fd8fb3a5f0",
|
||||
"css": "check",
|
||||
"code": 59404,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "c709da589c923ba3c2ad48d9fc563e93",
|
||||
"css": "cancel",
|
||||
"code": 59394,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "70370693ada58ef0a60fa0984fe8d52a",
|
||||
"css": "plus",
|
||||
"code": 59392,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "1256e3054823e304d7e452a589cf8bb8",
|
||||
"css": "minus",
|
||||
"code": 59393,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "a42b598e4298f3319b25a2702a02e7ff",
|
||||
"css": "location",
|
||||
"code": 59396,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "0a3192de65a73ca1501b073ad601f87d",
|
||||
"css": "arrow-combo",
|
||||
"code": 59406,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "8704cd847a47b64265b8bb110c8b4d62",
|
||||
"css": "down",
|
||||
"code": 59397,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "c311c48d79488965b0fab7f9cd12b6b5",
|
||||
"css": "left",
|
||||
"code": 59398,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "749e7d90a9182938180f1d2d8c33584e",
|
||||
"css": "right",
|
||||
"code": 59399,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "9c7ff134960bb5a82404e4aeaab366d9",
|
||||
"css": "up",
|
||||
"code": 59400,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "6a12c2b74456ea21cc984e11dec227a1",
|
||||
"css": "globe",
|
||||
"code": 59402,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "d10920db2e79c997c5e783279291970c",
|
||||
"css": "dot-3",
|
||||
"code": 59405,
|
||||
"src": "entypo"
|
||||
},
|
||||
{
|
||||
"uid": "1e77a2yvsq3owssduo2lcgsiven57iv5",
|
||||
"css": "pencil",
|
||||
"code": 59395,
|
||||
"src": "typicons"
|
||||
},
|
||||
{
|
||||
"uid": "8ax1xqcbzz1hobyd4i7f0unwib1bztip",
|
||||
"css": "arrow-down",
|
||||
"code": 59407,
|
||||
"src": "modernpics"
|
||||
},
|
||||
{
|
||||
"uid": "6ipws8y9gej6vbloufvhi5qux7rluf64",
|
||||
"css": "arrow-up",
|
||||
"code": 59408,
|
||||
"src": "modernpics"
|
||||
},
|
||||
{
|
||||
"uid": "a1be363d4de9be39857893d4134f6215",
|
||||
"css": "picture",
|
||||
"code": 59403,
|
||||
"src": "elusive"
|
||||
},
|
||||
{
|
||||
"uid": "e15f0d620a7897e2035c18c80142f6d9",
|
||||
"css": "link-ext",
|
||||
"code": 61582,
|
||||
"src": "fontawesome"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 84 B |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
650
wp-content/plugins/advanced-custom-fields/assets/inc/datepicker/jquery-ui.css
vendored
Normal file
@@ -0,0 +1,650 @@
|
||||
/*! jQuery UI - v1.11.4 - 2016-05-31
|
||||
* http://jqueryui.com
|
||||
* Includes: core.css, datepicker.css, theme.css
|
||||
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=%22Open%20Sans%22%2C%E2%80%8B%20sans-serif&fsDefault=14px&fwDefault=normal&cornerRadius=3&bgColorHeader=%23ffffff&bgTextureHeader=highlight_soft&borderColorHeader=%23ffffff&fcHeader=%23222222&iconColorHeader=%23DDDDDD&bgColorContent=%23ffffff&bgTextureContent=flat&borderColorContent=%23E1E1E1&fcContent=%23444444&iconColorContent=%23444444&bgColorDefault=%23F9F9F9&bgTextureDefault=flat&borderColorDefault=%23F0F0F0&fcDefault=%23444444&iconColorDefault=%23444444&bgColorHover=%2398b7e8&bgTextureHover=flat&borderColorHover=%2398b7e8&fcHover=%23ffffff&iconColorHover=%23ffffff&bgColorActive=%233875d7&bgTextureActive=flat&borderColorActive=%233875d7&fcActive=%23ffffff&iconColorActive=%23ffffff&bgColorHighlight=%23ffffff&bgTextureHighlight=flat&borderColorHighlight=%23aaaaaa&fcHighlight=%23444444&iconColorHighlight=%23444444&bgColorError=%23E14D43&bgTextureError=flat&borderColorError=%23E14D43&fcError=%23ffffff&iconColorError=%23ffffff&bgColorOverlay=%23ffffff&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px&bgImgOpacityHeader=0&bgImgOpacityContent=&bgImgOpacityDefault=0&bgImgOpacityHover=0&bgImgOpacityActive=0&bgImgOpacityHighlight=0&bgImgOpacityError=0
|
||||
* Copyright jQuery Foundation and other contributors; Licensed MIT */
|
||||
|
||||
/* Layout helpers
|
||||
----------------------------------*/
|
||||
.ui-helper-hidden {
|
||||
display: none;
|
||||
}
|
||||
.ui-helper-hidden-accessible {
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
.ui-helper-reset {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
line-height: 1.3;
|
||||
text-decoration: none;
|
||||
font-size: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
.ui-helper-clearfix:before,
|
||||
.ui-helper-clearfix:after {
|
||||
content: "";
|
||||
display: table;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.ui-helper-clearfix:after {
|
||||
clear: both;
|
||||
}
|
||||
.ui-helper-clearfix {
|
||||
min-height: 0; /* support: IE7 */
|
||||
}
|
||||
.ui-helper-zfix {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
filter:Alpha(Opacity=0); /* support: IE8 */
|
||||
}
|
||||
|
||||
.ui-front {
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-disabled {
|
||||
cursor: default !important;
|
||||
}
|
||||
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon {
|
||||
display: block;
|
||||
text-indent: -99999px;
|
||||
overflow: hidden;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.ui-datepicker {
|
||||
width: 17em;
|
||||
padding: .2em .2em 0;
|
||||
display: none;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-header {
|
||||
position: relative;
|
||||
padding: .2em 0;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev,
|
||||
.ui-datepicker .ui-datepicker-next {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
width: 1.8em;
|
||||
height: 1.8em;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev-hover,
|
||||
.ui-datepicker .ui-datepicker-next-hover {
|
||||
top: 1px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev {
|
||||
left: 2px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-next {
|
||||
right: 2px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev-hover {
|
||||
left: 1px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-next-hover {
|
||||
right: 1px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev span,
|
||||
.ui-datepicker .ui-datepicker-next span {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
margin-left: -8px;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-title {
|
||||
margin: 0 2.3em;
|
||||
line-height: 1.8em;
|
||||
text-align: center;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-title select {
|
||||
font-size: 1em;
|
||||
margin: 1px 0;
|
||||
}
|
||||
.ui-datepicker select.ui-datepicker-month,
|
||||
.ui-datepicker select.ui-datepicker-year {
|
||||
width: 45%;
|
||||
}
|
||||
.ui-datepicker table {
|
||||
width: 100%;
|
||||
font-size: .9em;
|
||||
border-collapse: collapse;
|
||||
margin: 0 0 .4em;
|
||||
}
|
||||
.ui-datepicker th {
|
||||
padding: .7em .3em;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
border: 0;
|
||||
}
|
||||
.ui-datepicker td {
|
||||
border: 0;
|
||||
padding: 1px;
|
||||
}
|
||||
.ui-datepicker td span,
|
||||
.ui-datepicker td a {
|
||||
display: block;
|
||||
padding: .2em;
|
||||
text-align: right;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-buttonpane {
|
||||
background-image: none;
|
||||
margin: .7em 0 0 0;
|
||||
padding: 0 .2em;
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-buttonpane button {
|
||||
float: right;
|
||||
margin: .5em .2em .4em;
|
||||
cursor: pointer;
|
||||
padding: .2em .6em .3em .6em;
|
||||
width: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* with multiple calendars */
|
||||
.ui-datepicker.ui-datepicker-multi {
|
||||
width: auto;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-group {
|
||||
float: left;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-group table {
|
||||
width: 95%;
|
||||
margin: 0 auto .4em;
|
||||
}
|
||||
.ui-datepicker-multi-2 .ui-datepicker-group {
|
||||
width: 50%;
|
||||
}
|
||||
.ui-datepicker-multi-3 .ui-datepicker-group {
|
||||
width: 33.3%;
|
||||
}
|
||||
.ui-datepicker-multi-4 .ui-datepicker-group {
|
||||
width: 25%;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
|
||||
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
|
||||
border-left-width: 0;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-buttonpane {
|
||||
clear: left;
|
||||
}
|
||||
.ui-datepicker-row-break {
|
||||
clear: both;
|
||||
width: 100%;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
/* RTL support */
|
||||
.ui-datepicker-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-prev {
|
||||
right: 2px;
|
||||
left: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-next {
|
||||
left: 2px;
|
||||
right: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-prev:hover {
|
||||
right: 1px;
|
||||
left: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-next:hover {
|
||||
left: 1px;
|
||||
right: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane {
|
||||
clear: right;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
|
||||
float: left;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
|
||||
.ui-datepicker-rtl .ui-datepicker-group {
|
||||
float: right;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
|
||||
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
|
||||
border-right-width: 0;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.acf-ui-datepicker .ui-widget {
|
||||
font-family: inherit;
|
||||
font-size: 14px;
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget .ui-widget {
|
||||
font-size: 1em;
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget input,
|
||||
.acf-ui-datepicker .ui-widget select,
|
||||
.acf-ui-datepicker .ui-widget textarea,
|
||||
.acf-ui-datepicker .ui-widget button {
|
||||
font-family: inherit;
|
||||
font-size: 1em;
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget-content {
|
||||
border: 1px solid #E1E1E1;
|
||||
background: #ffffff;
|
||||
color: #444444;
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget-content a {
|
||||
color: #444444;
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget-header {
|
||||
border: 1px solid #ffffff;
|
||||
background: #ffffff url("images/ui-bg_highlight-soft_0_ffffff_1x100.png") 50% 50% repeat-x;
|
||||
color: #222222;
|
||||
font-weight: bold;
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget-header a {
|
||||
color: #222222;
|
||||
}
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.acf-ui-datepicker .ui-state-default,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-default,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-default {
|
||||
border: 1px solid #F0F0F0;
|
||||
background: #F9F9F9;
|
||||
font-weight: normal;
|
||||
color: #444444;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-default a,
|
||||
.acf-ui-datepicker .ui-state-default a:link,
|
||||
.acf-ui-datepicker .ui-state-default a:visited {
|
||||
color: #444444;
|
||||
text-decoration: none;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-hover,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-hover,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-hover,
|
||||
.acf-ui-datepicker .ui-state-focus,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-focus,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-focus {
|
||||
border: 1px solid #98b7e8;
|
||||
background: #98b7e8;
|
||||
font-weight: normal;
|
||||
color: #ffffff;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-hover a,
|
||||
.acf-ui-datepicker .ui-state-hover a:hover,
|
||||
.acf-ui-datepicker .ui-state-hover a:link,
|
||||
.acf-ui-datepicker .ui-state-hover a:visited,
|
||||
.acf-ui-datepicker .ui-state-focus a,
|
||||
.acf-ui-datepicker .ui-state-focus a:hover,
|
||||
.acf-ui-datepicker .ui-state-focus a:link,
|
||||
.acf-ui-datepicker .ui-state-focus a:visited {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-active,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-active,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-active {
|
||||
border: 1px solid #3875d7;
|
||||
background: #3875d7;
|
||||
font-weight: normal;
|
||||
color: #ffffff;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-active a,
|
||||
.acf-ui-datepicker .ui-state-active a:link,
|
||||
.acf-ui-datepicker .ui-state-active a:visited {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.acf-ui-datepicker .ui-state-highlight,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-highlight,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-highlight {
|
||||
border: 1px solid #aaaaaa;
|
||||
background: #ffffff;
|
||||
color: #444444;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-highlight a,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-highlight a,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-highlight a {
|
||||
color: #444444;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-error,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-error,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-error {
|
||||
border: 1px solid #E14D43;
|
||||
background: #E14D43;
|
||||
color: #ffffff;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-error a,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-error a,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-error a {
|
||||
color: #ffffff;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-error-text,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-error-text,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-error-text {
|
||||
color: #ffffff;
|
||||
}
|
||||
.acf-ui-datepicker .ui-priority-primary,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-priority-primary,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-priority-primary {
|
||||
font-weight: bold;
|
||||
}
|
||||
.acf-ui-datepicker .ui-priority-secondary,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-priority-secondary,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
filter:Alpha(Opacity=70); /* support: IE8 */
|
||||
font-weight: normal;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-disabled,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-state-disabled,
|
||||
.acf-ui-datepicker .ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
filter:Alpha(Opacity=35); /* support: IE8 */
|
||||
background-image: none;
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-disabled .ui-icon {
|
||||
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
|
||||
}
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.acf-ui-datepicker .ui-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.acf-ui-datepicker .ui-icon,
|
||||
.acf-ui-datepicker .ui-widget-content .ui-icon {
|
||||
background-image: url("images/ui-icons_444444_256x240.png");
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget-header .ui-icon {
|
||||
background-image: url("images/ui-icons_DDDDDD_256x240.png");
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-default .ui-icon {
|
||||
background-image: url("images/ui-icons_444444_256x240.png");
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-hover .ui-icon,
|
||||
.acf-ui-datepicker .ui-state-focus .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-active .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-highlight .ui-icon {
|
||||
background-image: url("images/ui-icons_444444_256x240.png");
|
||||
}
|
||||
.acf-ui-datepicker .ui-state-error .ui-icon,
|
||||
.acf-ui-datepicker .ui-state-error-text .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
.acf-ui-datepicker .ui-icon-blank { background-position: 16px 16px; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-n { background-position: 0 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-ne { background-position: -16px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-e { background-position: -32px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-se { background-position: -48px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-s { background-position: -64px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-sw { background-position: -80px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-w { background-position: -96px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-1-nw { background-position: -112px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-2-n-s { background-position: -128px 0; }
|
||||
.acf-ui-datepicker .ui-icon-carat-2-e-w { background-position: -144px 0; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-s { background-position: -64px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-s { background-position: -64px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.acf-ui-datepicker .ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-extlink { background-position: -32px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-newwin { background-position: -48px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-refresh { background-position: -64px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.acf-ui-datepicker .ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.acf-ui-datepicker .ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-document { background-position: -32px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-document-b { background-position: -48px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-note { background-position: -64px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-comment { background-position: -128px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-person { background-position: -144px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-print { background-position: -160px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-trash { background-position: -176px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-locked { background-position: -192px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-tag { background-position: -240px -96px; }
|
||||
.acf-ui-datepicker .ui-icon-home { background-position: 0 -112px; }
|
||||
.acf-ui-datepicker .ui-icon-flag { background-position: -16px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-calendar { background-position: -32px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-cart { background-position: -48px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-pencil { background-position: -64px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-clock { background-position: -80px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-disk { background-position: -96px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-calculator { background-position: -112px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-search { background-position: -160px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-wrench { background-position: -176px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-gear { background-position: -192px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-heart { background-position: -208px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-star { background-position: -224px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-link { background-position: -240px -112px; }
|
||||
.acf-ui-datepicker .ui-icon-cancel { background-position: 0 -128px; }
|
||||
.acf-ui-datepicker .ui-icon-plus { background-position: -16px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-minus { background-position: -48px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-close { background-position: -80px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-closethick { background-position: -96px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-key { background-position: -112px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-scissors { background-position: -144px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-copy { background-position: -176px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-contact { background-position: -192px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-image { background-position: -208px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-video { background-position: -224px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-script { background-position: -240px -128px; }
|
||||
.acf-ui-datepicker .ui-icon-alert { background-position: 0 -144px; }
|
||||
.acf-ui-datepicker .ui-icon-info { background-position: -16px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-notice { background-position: -32px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-help { background-position: -48px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-check { background-position: -64px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-bullet { background-position: -80px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-radio-on { background-position: -96px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-radio-off { background-position: -112px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.acf-ui-datepicker .ui-icon-play { background-position: 0 -160px; }
|
||||
.acf-ui-datepicker .ui-icon-pause { background-position: -16px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.acf-ui-datepicker .ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-stop { background-position: -96px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-eject { background-position: -112px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.acf-ui-datepicker .ui-icon-power { background-position: 0 -176px; }
|
||||
.acf-ui-datepicker .ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.acf-ui-datepicker .ui-icon-signal { background-position: -32px -176px; }
|
||||
.acf-ui-datepicker .ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.acf-ui-datepicker .ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.acf-ui-datepicker .ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.acf-ui-datepicker .ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.acf-ui-datepicker .ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.acf-ui-datepicker .ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.acf-ui-datepicker .ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.acf-ui-datepicker .ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.acf-ui-datepicker .ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.acf-ui-datepicker .ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.acf-ui-datepicker .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.acf-ui-datepicker .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.acf-ui-datepicker .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.acf-ui-datepicker .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.acf-ui-datepicker .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.acf-ui-datepicker .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.acf-ui-datepicker .ui-corner-all,
|
||||
.acf-ui-datepicker .ui-corner-top,
|
||||
.acf-ui-datepicker .ui-corner-left,
|
||||
.acf-ui-datepicker .ui-corner-tl {
|
||||
border-top-left-radius: 3;
|
||||
}
|
||||
.acf-ui-datepicker .ui-corner-all,
|
||||
.acf-ui-datepicker .ui-corner-top,
|
||||
.acf-ui-datepicker .ui-corner-right,
|
||||
.acf-ui-datepicker .ui-corner-tr {
|
||||
border-top-right-radius: 3;
|
||||
}
|
||||
.acf-ui-datepicker .ui-corner-all,
|
||||
.acf-ui-datepicker .ui-corner-bottom,
|
||||
.acf-ui-datepicker .ui-corner-left,
|
||||
.acf-ui-datepicker .ui-corner-bl {
|
||||
border-bottom-left-radius: 3;
|
||||
}
|
||||
.acf-ui-datepicker .ui-corner-all,
|
||||
.acf-ui-datepicker .ui-corner-bottom,
|
||||
.acf-ui-datepicker .ui-corner-right,
|
||||
.acf-ui-datepicker .ui-corner-br {
|
||||
border-bottom-right-radius: 3;
|
||||
}
|
||||
|
||||
/* Overlays */
|
||||
.acf-ui-datepicker .ui-widget-overlay {
|
||||
background: #ffffff;
|
||||
opacity: .3;
|
||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
||||
}
|
||||
.acf-ui-datepicker .ui-widget-shadow {
|
||||
margin: -8px 0 0 -8px;
|
||||
padding: 8px;
|
||||
background: #aaaaaa;
|
||||
opacity: .3;
|
||||
filter: Alpha(Opacity=30); /* support: IE8 */
|
||||
border-radius: 8px;
|
||||
}
|
||||
7
wp-content/plugins/advanced-custom-fields/assets/inc/datepicker/jquery-ui.min.css
vendored
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
704
wp-content/plugins/advanced-custom-fields/assets/inc/select2/3/select2.css
vendored
Executable file
@@ -0,0 +1,704 @@
|
||||
/*
|
||||
Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
|
||||
*/
|
||||
.select2-container {
|
||||
margin: 0;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
/* inline-block for ie7 */
|
||||
zoom: 1;
|
||||
*display: inline;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.select2-container,
|
||||
.select2-drop,
|
||||
.select2-search,
|
||||
.select2-search input {
|
||||
/*
|
||||
Force border-box so that % widths fit the parent
|
||||
container without overlap because of margin/padding.
|
||||
More Info : http://www.quirksmode.org/css/box.html
|
||||
*/
|
||||
-webkit-box-sizing: border-box; /* webkit */
|
||||
-moz-box-sizing: border-box; /* firefox */
|
||||
box-sizing: border-box; /* css3 */
|
||||
}
|
||||
|
||||
.select2-container .select2-choice {
|
||||
display: block;
|
||||
height: 26px;
|
||||
padding: 0 0 0 8px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
border: 1px solid #aaa;
|
||||
white-space: nowrap;
|
||||
line-height: 26px;
|
||||
color: #444;
|
||||
text-decoration: none;
|
||||
|
||||
border-radius: 4px;
|
||||
|
||||
background-clip: padding-box;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
|
||||
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
|
||||
background-image: linear-gradient(to top, #eee 0%, #fff 50%);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice {
|
||||
padding: 0 8px 0 0;
|
||||
}
|
||||
|
||||
.select2-container.select2-drop-above .select2-choice {
|
||||
border-bottom-color: #aaa;
|
||||
|
||||
border-radius: 0 0 4px 4px;
|
||||
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
|
||||
background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
|
||||
background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
|
||||
background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
|
||||
}
|
||||
|
||||
.select2-container.select2-allowclear .select2-choice .select2-chosen {
|
||||
margin-right: 42px;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice > .select2-chosen {
|
||||
margin-right: 26px;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
|
||||
white-space: nowrap;
|
||||
|
||||
text-overflow: ellipsis;
|
||||
float: none;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
|
||||
margin-left: 26px;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice abbr {
|
||||
display: none;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
position: absolute;
|
||||
right: 24px;
|
||||
top: 8px;
|
||||
|
||||
font-size: 1px;
|
||||
text-decoration: none;
|
||||
|
||||
border: 0;
|
||||
background: url('select2.png') right top no-repeat;
|
||||
cursor: pointer;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.select2-container.select2-allowclear .select2-choice abbr {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice abbr:hover {
|
||||
background-position: right -11px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.select2-drop-mask {
|
||||
border: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: fixed;
|
||||
left: 0;
|
||||
top: 0;
|
||||
min-height: 100%;
|
||||
min-width: 100%;
|
||||
height: auto;
|
||||
width: auto;
|
||||
opacity: 0;
|
||||
z-index: 9998;
|
||||
/* styles required for IE to work */
|
||||
background-color: #fff;
|
||||
filter: alpha(opacity=0);
|
||||
}
|
||||
|
||||
.select2-drop {
|
||||
width: 100%;
|
||||
margin-top: -1px;
|
||||
position: absolute;
|
||||
z-index: 9999;
|
||||
top: 100%;
|
||||
|
||||
background: #fff;
|
||||
color: #000;
|
||||
border: 1px solid #aaa;
|
||||
border-top: 0;
|
||||
|
||||
border-radius: 0 0 4px 4px;
|
||||
|
||||
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above {
|
||||
margin-top: 1px;
|
||||
border-top: 1px solid #aaa;
|
||||
border-bottom: 0;
|
||||
|
||||
border-radius: 4px 4px 0 0;
|
||||
|
||||
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
|
||||
}
|
||||
|
||||
.select2-drop-active {
|
||||
border: 1px solid #5897fb;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above.select2-drop-active {
|
||||
border-top: 1px solid #5897fb;
|
||||
}
|
||||
|
||||
.select2-drop-auto-width {
|
||||
border-top: 1px solid #aaa;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.select2-drop-auto-width .select2-search {
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice .select2-arrow {
|
||||
display: inline-block;
|
||||
width: 18px;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
|
||||
border-left: 1px solid #aaa;
|
||||
border-radius: 0 4px 4px 0;
|
||||
|
||||
background-clip: padding-box;
|
||||
|
||||
background: #ccc;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
|
||||
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
|
||||
background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
|
||||
left: 0;
|
||||
right: auto;
|
||||
|
||||
border-left: none;
|
||||
border-right: 1px solid #aaa;
|
||||
border-radius: 4px 0 0 4px;
|
||||
}
|
||||
|
||||
.select2-container .select2-choice .select2-arrow b {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: url('select2.png') no-repeat 0 1px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
|
||||
background-position: 2px 1px;
|
||||
}
|
||||
|
||||
.select2-search {
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
min-height: 26px;
|
||||
margin: 0;
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
|
||||
position: relative;
|
||||
z-index: 10000;
|
||||
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.select2-search input {
|
||||
width: 100%;
|
||||
height: auto !important;
|
||||
min-height: 26px;
|
||||
padding: 4px 20px 4px 5px;
|
||||
margin: 0;
|
||||
|
||||
outline: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 0;
|
||||
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
|
||||
background: #fff url('select2.png') no-repeat 100% -22px;
|
||||
background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||
background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-search input {
|
||||
padding: 4px 5px 4px 20px;
|
||||
|
||||
background: #fff url('select2.png') no-repeat -37px -22px;
|
||||
background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||
background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||
}
|
||||
|
||||
.select2-drop.select2-drop-above .select2-search input {
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.select2-search input.select2-active {
|
||||
background: #fff url('select2-spinner.gif') no-repeat 100%;
|
||||
background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
|
||||
background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
|
||||
background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
|
||||
}
|
||||
|
||||
.select2-container-active .select2-choice,
|
||||
.select2-container-active .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
outline: none;
|
||||
|
||||
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
}
|
||||
|
||||
.select2-dropdown-open .select2-choice {
|
||||
border-bottom-color: transparent;
|
||||
-webkit-box-shadow: 0 1px 0 #fff inset;
|
||||
box-shadow: 0 1px 0 #fff inset;
|
||||
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
|
||||
background-color: #eee;
|
||||
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
|
||||
background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
|
||||
background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
|
||||
background-image: linear-gradient(to top, #fff 0%, #eee 50%);
|
||||
}
|
||||
|
||||
.select2-dropdown-open.select2-drop-above .select2-choice,
|
||||
.select2-dropdown-open.select2-drop-above .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
border-top-color: transparent;
|
||||
|
||||
background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
|
||||
background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
|
||||
background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
|
||||
background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
|
||||
}
|
||||
|
||||
.select2-dropdown-open .select2-choice .select2-arrow {
|
||||
background: transparent;
|
||||
border-left: none;
|
||||
filter: none;
|
||||
}
|
||||
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
|
||||
border-right: none;
|
||||
}
|
||||
|
||||
.select2-dropdown-open .select2-choice .select2-arrow b {
|
||||
background-position: -18px 1px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
|
||||
background-position: -16px 1px;
|
||||
}
|
||||
|
||||
.select2-hidden-accessible {
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
/* results */
|
||||
.select2-results {
|
||||
max-height: 200px;
|
||||
padding: 0 0 0 4px;
|
||||
margin: 4px 4px 4px 0;
|
||||
position: relative;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-results {
|
||||
padding: 0 4px 0 0;
|
||||
margin: 4px 0 4px 4px;
|
||||
}
|
||||
|
||||
.select2-results ul.select2-result-sub {
|
||||
margin: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.select2-results li {
|
||||
list-style: none;
|
||||
display: list-item;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
.select2-results li.select2-result-with-children > .select2-result-label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.select2-results .select2-result-label {
|
||||
padding: 3px 7px 4px;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
|
||||
min-height: 1em;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.select2-results-dept-1 .select2-result-label { padding-left: 20px }
|
||||
.select2-results-dept-2 .select2-result-label { padding-left: 40px }
|
||||
.select2-results-dept-3 .select2-result-label { padding-left: 60px }
|
||||
.select2-results-dept-4 .select2-result-label { padding-left: 80px }
|
||||
.select2-results-dept-5 .select2-result-label { padding-left: 100px }
|
||||
.select2-results-dept-6 .select2-result-label { padding-left: 110px }
|
||||
.select2-results-dept-7 .select2-result-label { padding-left: 120px }
|
||||
|
||||
.select2-results .select2-highlighted {
|
||||
background: #3875d7;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.select2-results li em {
|
||||
background: #feffde;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.select2-results .select2-highlighted em {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.select2-results .select2-highlighted ul {
|
||||
background: #fff;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.select2-results .select2-no-results,
|
||||
.select2-results .select2-searching,
|
||||
.select2-results .select2-ajax-error,
|
||||
.select2-results .select2-selection-limit {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
disabled look for disabled choices in the results dropdown
|
||||
*/
|
||||
.select2-results .select2-disabled.select2-highlighted {
|
||||
color: #666;
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
cursor: default;
|
||||
}
|
||||
.select2-results .select2-disabled {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-results .select2-selected {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-more-results.select2-active {
|
||||
background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
|
||||
}
|
||||
|
||||
.select2-results .select2-ajax-error {
|
||||
background: rgba(255, 50, 50, .2);
|
||||
}
|
||||
|
||||
.select2-more-results {
|
||||
background: #f4f4f4;
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/* disabled styles */
|
||||
|
||||
.select2-container.select2-container-disabled .select2-choice {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border: 1px solid #ddd;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-container.select2-container-disabled .select2-choice .select2-arrow {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border-left: 0;
|
||||
}
|
||||
|
||||
.select2-container.select2-container-disabled .select2-choice abbr {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* multiselect */
|
||||
|
||||
.select2-container-multi .select2-choices {
|
||||
height: auto !important;
|
||||
height: 1%;
|
||||
margin: 0;
|
||||
padding: 0 5px 0 0;
|
||||
position: relative;
|
||||
|
||||
border: 1px solid #aaa;
|
||||
cursor: text;
|
||||
overflow: hidden;
|
||||
|
||||
background-color: #fff;
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
|
||||
background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
|
||||
background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
|
||||
background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container-multi .select2-choices {
|
||||
padding: 0 0 0 5px;
|
||||
}
|
||||
|
||||
.select2-locked {
|
||||
padding: 3px 5px 3px 5px !important;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices {
|
||||
min-height: 26px;
|
||||
}
|
||||
|
||||
.select2-container-multi.select2-container-active .select2-choices {
|
||||
border: 1px solid #5897fb;
|
||||
outline: none;
|
||||
|
||||
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, .3);
|
||||
}
|
||||
.select2-container-multi .select2-choices li {
|
||||
float: left;
|
||||
list-style: none;
|
||||
}
|
||||
html[dir="rtl"] .select2-container-multi .select2-choices li
|
||||
{
|
||||
float: right;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-field {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-field input {
|
||||
padding: 5px;
|
||||
margin: 1px 0;
|
||||
|
||||
font-family: sans-serif;
|
||||
font-size: 100%;
|
||||
color: #666;
|
||||
outline: 0;
|
||||
border: 0;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-field input.select2-active {
|
||||
background: #fff url('select2-spinner.gif') no-repeat 100% !important;
|
||||
}
|
||||
|
||||
.select2-default {
|
||||
color: #999 !important;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-choice {
|
||||
padding: 3px 5px 3px 18px;
|
||||
margin: 3px 0 3px 5px;
|
||||
position: relative;
|
||||
|
||||
line-height: 13px;
|
||||
color: #333;
|
||||
cursor: default;
|
||||
border: 1px solid #aaaaaa;
|
||||
|
||||
border-radius: 3px;
|
||||
|
||||
-webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
||||
box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
|
||||
|
||||
background-clip: padding-box;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
|
||||
background-color: #e4e4e4;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
|
||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
|
||||
background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||
background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||
background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
|
||||
}
|
||||
html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
|
||||
{
|
||||
margin: 3px 5px 3px 0;
|
||||
padding: 3px 18px 3px 5px;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
|
||||
cursor: default;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-choice-focus {
|
||||
background: #d4d4d4;
|
||||
}
|
||||
|
||||
.select2-search-choice-close {
|
||||
display: block;
|
||||
width: 12px;
|
||||
height: 13px;
|
||||
position: absolute;
|
||||
right: 3px;
|
||||
top: 4px;
|
||||
|
||||
font-size: 1px;
|
||||
outline: none;
|
||||
background: url('select2.png') right top no-repeat;
|
||||
}
|
||||
html[dir="rtl"] .select2-search-choice-close {
|
||||
right: auto;
|
||||
left: 3px;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-search-choice-close {
|
||||
left: 3px;
|
||||
}
|
||||
|
||||
html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
|
||||
left: auto;
|
||||
right: 2px;
|
||||
}
|
||||
|
||||
.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
|
||||
background-position: right -11px;
|
||||
}
|
||||
.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
|
||||
background-position: right -11px;
|
||||
}
|
||||
|
||||
/* disabled styles */
|
||||
.select2-container-multi.select2-container-disabled .select2-choices {
|
||||
background-color: #f4f4f4;
|
||||
background-image: none;
|
||||
border: 1px solid #ddd;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
|
||||
padding: 3px 5px 3px 5px;
|
||||
border: 1px solid #ddd;
|
||||
background-image: none;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
|
||||
background: none;
|
||||
}
|
||||
/* end multiselect */
|
||||
|
||||
|
||||
.select2-result-selectable .select2-match,
|
||||
.select2-result-unselectable .select2-match {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.select2-offscreen, .select2-offscreen:focus {
|
||||
clip: rect(0 0 0 0) !important;
|
||||
width: 1px !important;
|
||||
height: 1px !important;
|
||||
border: 0 !important;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
overflow: hidden !important;
|
||||
position: absolute !important;
|
||||
outline: 0 !important;
|
||||
left: 0px !important;
|
||||
top: 0px !important;
|
||||
}
|
||||
|
||||
.select2-display-none {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-measure-scrollbar {
|
||||
position: absolute;
|
||||
top: -10000px;
|
||||
left: -10000px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
overflow: scroll;
|
||||
}
|
||||
|
||||
/* Retina-ize icons */
|
||||
|
||||
@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
|
||||
.select2-search input,
|
||||
.select2-search-choice-close,
|
||||
.select2-container .select2-choice abbr,
|
||||
.select2-container .select2-choice .select2-arrow b {
|
||||
background-image: url('select2x2.png') !important;
|
||||
background-repeat: no-repeat !important;
|
||||
background-size: 60px 40px !important;
|
||||
}
|
||||
|
||||
.select2-search input {
|
||||
background-position: 100% -21px !important;
|
||||
}
|
||||
}
|
||||