From 16666817c3a98c7a4056592a1f61bbb7d2c22646 Mon Sep 17 00:00:00 2001 From: Norcross Date: Sat, 18 Jul 2015 18:02:43 -0400 Subject: [PATCH] changed ALL THE THINGS. --- LICENSE | 21 -- LICENSE-MIT | 22 ++ README.md | 9 +- gravity-tooltips.php | 218 +++++------------ lib/admin.php | 429 +++++++++++++++++++++------------- lib/css/gf.tooltips.front.css | 29 --- lib/css/gftips.front.css | 29 --- lib/css/gftips.front.min.css | 1 - lib/css/hint.css | 355 ++++++++++++++++++++++++++++ lib/css/hint.min.css | 7 + lib/front.php | 323 ++++++++++++------------- lib/helper.php | 101 ++++++++ lib/img/tooltip-icon.png | Bin 728 -> 0 bytes lib/js/gftips.admin.js | 3 +- readme.txt | 37 --- screenshot-1.png | Bin 11822 -> 0 bytes screenshot-2.png | Bin 10568 -> 0 bytes 17 files changed, 986 insertions(+), 598 deletions(-) delete mode 100644 LICENSE create mode 100644 LICENSE-MIT delete mode 100644 lib/css/gf.tooltips.front.css delete mode 100644 lib/css/gftips.front.css delete mode 100644 lib/css/gftips.front.min.css create mode 100644 lib/css/hint.css create mode 100644 lib/css/hint.min.css create mode 100644 lib/helper.php delete mode 100644 lib/img/tooltip-icon.png delete mode 100644 readme.txt delete mode 100644 screenshot-1.png delete mode 100644 screenshot-2.png diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 382ab79..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Norcross - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..22a27a0 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2013 Andrew Norcross + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 6354c2e..04fc9df 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ Gravity Tooltips ================ -Adds a custom field to each form element for tooltips +Add custom tooltips in Gravity Forms. + +**Note:** Version 2.0.0 has numerous changes from previous versions, including a switch to using the [hint.css library by Kushagra Gour](http://kushagragour.in/lab/hint/ "hint.css library by Kushagra Gour") and removing all JS requirements. It may not be compatible with current implementations, please backup and test before updating any production sites. + + +## License +Copyright (c) 2013 Andrew Norcross +Licensed under the [MIT license](http://opensource.org/licenses/MIT). \ No newline at end of file diff --git a/gravity-tooltips.php b/gravity-tooltips.php index 75889cb..5b0b247 100644 --- a/gravity-tooltips.php +++ b/gravity-tooltips.php @@ -4,7 +4,7 @@ Plugin URI: http://andrewnorcross.com/plugins/gravity-tooltips/ Description: Add custom tooltips in Gravity Forms. Author: Andrew Norcross -Version: 1.0.1 +Version: 2.0.0 Requires at least: 3.8 Author URI: http://andrewnorcross.com */ @@ -30,203 +30,105 @@ } if( ! defined( 'GFT_VER' ) ) { - define( 'GFT_VER', '1.0.1' ); + define( 'GFT_VER', '2.0.0' ); } class GF_Tooltips { /** - * This is our constructor - * - * @return GF_Tooltips + * Static property to hold our singleton instance + * @var instance */ - public function __construct() { - add_action ( 'plugins_loaded', array( $this, 'textdomain' ) ); - add_action ( 'plugins_loaded', array( $this, 'load_files' ) ); - } + static $instance = false; /** - * load textdomain + * This is our constructor * - * @return string load_plugin_textdomain - */ - - public function textdomain() { - - load_plugin_textdomain( 'gravity-tooltips', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); - - } - - /** - * [load_files description] - * @return [type] [description] - */ - public function load_files() { - - require_once( 'lib/admin.php' ); - require_once( 'lib/front.php' ); - - } - - /** - * [show_field_item_types description] - * @return [type] [description] + * @return GF_Tooltips */ - static function show_field_item_types() { - - $defaults = array( - 'text', - 'creditcard', - 'website', - 'phone', - 'number', - 'date', - 'time', - 'textarea', - 'select', - 'multiselect', - 'checkbox', - 'radio', - 'name', - 'address', - 'fileupload', - 'email', - 'post_title', - 'post_content', - 'post_excerpt', - 'post_tags', - 'post_category', - 'post_image', - 'captcha', - 'product', - 'singleproduct', - 'calculation', - 'price', - 'hiddenproduct', - 'list', - 'shipping', - 'singleshipping', - 'option', - 'quantity', - 'donation', - 'total', - 'post_custom_field', - 'password' - ); - - $defaults = apply_filters( 'gf_tooltips_allowed_fields', $defaults ); - - return $defaults; + private function __construct() { + add_action( 'plugins_loaded', array( $this, 'textdomain' ) ); + add_action( 'plugins_loaded', array( $this, 'load_files' ) ); + // activation hooks + register_activation_hook( __FILE__, array( $this, 'set_options' ) ); } /** - * [get_qtip_placement description] - * @param [type] $current [description] - * @return [type] [description] + * If an instance exists, this returns it. If not, it creates one and + * retuns it. + * + * @return */ - static function get_qtip_placement( $current ) { - - $options = array( - 'topLeft' => __( 'Top Left', 'gravity-tooltips' ), - 'topMiddle' => __( 'Top Middle', 'gravity-tooltips' ), - 'topRight' => __( 'Top Right', 'gravity-tooltips' ), - 'rightTop' => __( 'Right Top', 'gravity-tooltips' ), - 'rightMiddle' => __( 'Right Middle', 'gravity-tooltips' ), - 'rightBottom' => __( 'Right Bottom', 'gravity-tooltips' ), - 'bottomRight' => __( 'Bottom Right', 'gravity-tooltips' ), - 'bottomMiddle' => __( 'Bottom Middle', 'gravity-tooltips' ), - 'bottomLeft' => __( 'Bottom Left', 'gravity-tooltips' ), - 'leftBottom' => __( 'Left Bottom', 'gravity-tooltips' ), - 'leftMiddle' => __( 'Left Middle', 'gravity-tooltips' ), - 'leftTop' => __( 'Left Top', 'gravity-tooltips' ) - ); - - $dropdown = ''; - - foreach ( $options as $key => $label ) : - - $dropdown .= ''; + public static function getInstance() { - endforeach; - - return $dropdown; + // check for an instance of the class before loading + if ( ! self::$instance ) { + self::$instance = new self; + } + // return the instance + return self::$instance; } /** - * [get_qtip_designs description] - * @param [type] $current [description] - * @return [type] [description] + * load textdomain + * + * @return string load_plugin_textdomain */ - static function get_qtip_designs( $current ) { - - $options = array( - 'cream' => __( 'Cream', 'gravity-tooltips' ), - 'dark' => __( 'Dark', 'gravity-tooltips' ), - 'green' => __( 'Green', 'gravity-tooltips' ), - 'light' => __( 'Light', 'gravity-tooltips' ), - 'red' => __( 'Red', 'gravity-tooltips' ), - 'blue' => __( 'Blue', 'gravity-tooltips' ) - ); - - $dropdown = ''; - - foreach ( $options as $key => $label ) : - - $dropdown .= ''; - - endforeach; - - return $dropdown; - + public function textdomain() { + load_plugin_textdomain( 'gravity-tooltips', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); } /** - * [get_tooltip_icon_img description] + * load our files + * * @return [type] [description] */ - static function get_tooltip_icon_img() { + public function load_files() { - // set the default with a filter - $icon = apply_filters( 'gf_tooltips_icon_img', plugins_url( 'lib/img/tooltip-icon.png', __FILE__) ); + // load our admin setup + if ( is_admin() ) { + require_once( 'lib/admin.php' ); + } - // return without markup i.e. the URL of the icon - return esc_url( $icon ); + // load our front end setup + if ( ! is_admin() ) { + require_once( 'lib/front.php' ); + } + // load our helper + require_once( 'lib/helper.php' ); } /** - * do a string replace on the first instance only - * @param [type] $search [description] - * @param [type] $replace [description] - * @param [type] $string [description] - * @param integer $limit [description] - * @return [type] [description] + * set our options if */ - static function str_replace_limit( $search, $replace, $string, $limit = 1 ) { + public function set_options() { - if ( is_bool( $pos = ( strpos( $string, $search ) ) ) ) { - return $string; - } + // check for data first + $exist = get_option( 'gf-tooltips' ); - $length = strlen( $search ); - - for ( $i = 0; $i < $limit; $i++ ) { - - $string = substr_replace( $string, $replace, $pos, $length ); - - if ( is_bool( $pos = ( strpos( $string, $search ) ) ) ) { - break; - } + // we have it. leave it alone + if ( ! empty( $exist ) ) { + return; } - return $string; - } + // set a data array + $data = array( + 'type' => 'icon', + 'design' => 'light', + 'target' => 'right', + ); + // add the option + update_option( 'gf-tooltips', $data, 'no' ); + } /// end class } -new GF_Tooltips(); +// Instantiate our class +$GF_Tooltips = GF_Tooltips::getInstance(); + diff --git a/lib/admin.php b/lib/admin.php index 71cf06c..93ca546 100644 --- a/lib/admin.php +++ b/lib/admin.php @@ -1,95 +1,147 @@ self::show_field_item_types() + ) + ); + } + + /** + * register our settings for later + * @return void + */ + public function reg_settings() { + register_setting( 'gf-tooltips', 'gf-tooltips'); + } /** * check that GF is active before loading + * * @return void */ public function active_check() { + // bail without our function + if ( ! function_exists( 'get_current_screen' ) ) { + return; + } + + // fetch the screen $screen = get_current_screen(); - if ( $screen->parent_file !== 'plugins.php' ) { + // bail if we don't match up + if ( ! is_object( $screen ) || empty( $screen->parent_file ) || $screen->parent_file !== 'plugins.php' ) { return; } + // if we don't have our class, show it if ( ! class_exists( 'GFForms' ) ) { - echo '

'.__( 'This plugin requires Gravity Forms to function.', 'gravity-tooltips' ).'

'; + echo '

' . __( 'This plugin requires Gravity Forms to function.', 'gravity-tooltips' ) . '

'; // hide activation method unset( $_GET['activate'] ); // deactivate YOURSELF deactivate_plugins( plugin_basename( __FILE__ ) ); - } + // and just return return; - } - /** * register the admin script with Gravity Forms so that it gets enqueued when running on no-conflict mode + * * @param [type] $scripts [description] + * * @return [type] [description] */ public function register_admin_script( $scripts ){ + // add it $scripts[] = 'gftips-admin'; + // return them return $scripts; - - } - - /** - * load JS for fields - * @param [type] $hook [description] - * @return [type] [description] - */ - public function scripts_styles( $hook ) { - - if( ! RGForms::is_gravity_page() ) { - return; - } - - wp_enqueue_script( 'gftips-admin', plugins_url( '/js/gftips.admin.js', __FILE__ ), array( 'jquery' ), GFT_VER, true ); - wp_localize_script( 'gftips-admin', 'gftipsAdmin', array( - 'fieldtypes' => GF_Tooltips::show_field_item_types() - ) - ); - - } /** * show settings link on plugins page + * * @param [type] $links [description] * @param [type] $file [description] + * * @return [type] [description] */ public function quick_link( $links, $file ) { @@ -101,44 +153,55 @@ public function quick_link( $links, $file ) { } // check to make sure we are on the correct plugin - if ( $file != $this_plugin ) + if ( $file != $this_plugin ) { return $links; + } - $settings_link = ''.__( 'Settings', 'gravity-tooltips' ).''; + // make our link + $setup = '' . __( 'Settings', 'gravity-tooltips' ) . ''; - array_unshift( $links, $settings_link ); + // add it to the array + array_unshift( $links, $setup ); + // return it return $links; - } /** * add tooltip settings to main GF admin menu + * * @param [type] $menu_items [description] + * * @return [type] [description] */ public function create_menu( $menu_items ) { + // set up the item $menu_items[] = array( 'name' => 'gf-tooltips', 'label' => __( 'Tooltips', 'gravity-tooltips' ), - 'callback' => array( $this, 'settings_page' ) + 'callback' => array( __class__, 'settings_page' ) ); + // return the items return $menu_items; } /** * add the new textfield to the form builder on the advanced tab in GF + * * @param [type] $position [description] + * * @param [type] $form_id [description] */ public function add_form_builder_field( $position, $form_id ) { + // only run this on our preferred position if ( $position != 50 ) { return; } + // add the tooltip for the tooltips echo '
  • '; echo '
  • '; - } /** * add the tooltip text to the GF form field item + * * @param [type] $tooltips [description] */ public function add_form_builder_tooltip( $tooltips ) { // the title of the tooltip - $title = '
    '.__( 'Custom Tooltip', 'gravity-tooltips' ).'
    '; + $title = '
    ' . __( 'Custom Tooltip', 'gravity-tooltips' ) . '
    '; // the text - $text = __( 'Enter the content you want to appear in the tooltip for this field.', 'gravity-tooltips' ); + $text = __( 'Enter the content you want to appear in the tooltip for this field.', 'gravity-tooltips' ); - $tooltips['custom_tooltip_tip'] = $title.$text; + $tooltips['custom_tooltip_tip'] = $title . $text; + // return the actual tooltip return $tooltips; } - - /** - * register our settings for later - * @return void - */ - public function reg_settings() { - - register_setting( 'gf-tooltips', 'gf-tooltips'); - - } - /** * display message on saved settings + * * @return [HTML] message above page */ public function settings_saved() { // first check to make sure we're on our settings - if ( ! isset( $_REQUEST['page'] ) || isset( $_REQUEST['page'] ) && $_REQUEST['page'] !== 'gf-tooltips' ) + if ( empty( $_GET['page'] ) || $_GET['page'] !== 'gf-tooltips' ) { return; + } // make sure we have our updated prompt - if ( ! isset( $_REQUEST['settings-updated'] ) || isset( $_REQUEST['settings-updated'] ) && $_REQUEST['settings-updated'] !== 'true' ) + if ( empty( $_GET['settings-updated'] ) ) { return; + } - echo '
    '; - echo '

    '.__( 'Settings have been saved.', 'gravity-tooltips' ).'

    '; + // show our update messages + echo '
    '; + echo '

    ' . __( 'Settings have been saved.', 'gravity-tooltips' ) . '

    '; echo '
    '; + // and return return; } /** * Display main options page structure + * * @return [mixed HTML] the settings page */ - public function settings_page() { + public static function settings_page() { - if ( ! current_user_can( 'manage_options' ) ) + // bail without caps + if ( ! current_user_can( 'manage_options' ) ) { return; + } + // set up our form wrapper echo '
    '; - echo '

    '. __( 'Gravity Forms Tooltips', 'gravity-tooltips' ) . '

    '; - - echo '
    '; - echo self::settings_side(); - echo self::settings_open(); + // title it + echo '

    '. __( 'Gravity Forms Tooltips', 'gravity-tooltips' ) . '

    '; + // wrap it echo '
    '; - settings_fields( 'gf-tooltips' ); - $data = get_option( 'gf-tooltips' ); + + // fetch the data + $data = GF_Tooltips_Helper::get_tooltip_data(); // option index checks - $style = isset( $data['style'] ) ? $data['style'] : 'icon'; - $design = isset( $data['design'] ) ? $data['design'] : 'light'; - $target = isset( $data['target'] ) ? $data['target'] : 'topRight'; - $location = isset( $data['location'] ) ? $data['location'] : 'bottomLeft'; + $type = ! empty( $data['type'] ) ? $data['type'] : 'icon'; + $design = ! empty( $data['design'] ) ? $data['design'] : 'light'; + $target = ! empty( $data['target'] ) ? $data['target'] : 'right'; + + // our nonce and whatnot + settings_fields( 'gf-tooltips' ); echo ''; echo ''; - echo ''; + echo ''; echo ''; @@ -254,7 +317,7 @@ public function settings_page() { echo ''; echo ''; echo ''; @@ -263,22 +326,12 @@ public function settings_page() { echo ''; echo ''; echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
    ' . __( 'Style', 'gravity-tooltips' ) . '' . __( 'Layout Type', 'gravity-tooltips' ) . ''; echo '

    '; - echo ''; - echo ''; + echo ''; + echo ''; echo '

    '; echo '

    '; - echo ''; - echo ''; + echo ''; + echo ''; echo '

    '; echo '

    '; - echo ''; - echo ''; + echo ''; + echo ''; echo '

    '; echo '
    ' . __( 'Design Style', 'gravity-tooltips' ) . ''; echo ''; echo '
    ' . __( 'Target', 'gravity-tooltips' ) . ''; echo ''; echo '

    ' . __( 'The placement of the tooltip box in relation to the label / icon.', 'gravity-tooltips' ) . '

    '; echo '
    ' . __( 'Location', 'gravity-tooltips' ) . ''; - echo ''; - echo '

    ' . __( 'The location on the label / icon for the tooltip box to affix to.', 'gravity-tooltips' ) . '

    '; - echo '
    '; echo '

    '; @@ -286,81 +339,135 @@ public function settings_page() { echo '
    '; echo '

    '; - echo sprintf( __( 'A more detailed explanation about how the tooltip placement and location can be found here.', 'gravity-tooltips' ), 'http://craigsworks.com/projects/qtip/docs/tutorials/#position' ); + echo sprintf( __( 'A more detailed explanation about how the tooltip placement and design choices can be found here.', 'gravity-tooltips' ), 'http://kushagragour.in/lab/hint/' ); echo '

    '; - echo self::settings_close(); - echo '
    '; echo '
    '; + } + + /** + * set up all the possible field types + * + * @return array all the field types + */ + public static function show_field_item_types() { + + // set the array + $defaults = array( + 'text', + 'creditcard', + 'website', + 'phone', + 'number', + 'date', + 'time', + 'textarea', + 'select', + 'multiselect', + 'checkbox', + 'radio', + 'name', + 'address', + 'fileupload', + 'email', + 'post_title', + 'post_content', + 'post_excerpt', + 'post_tags', + 'post_category', + 'post_image', + 'captcha', + 'product', + 'singleproduct', + 'calculation', + 'price', + 'hiddenproduct', + 'list', + 'shipping', + 'singleshipping', + 'option', + 'quantity', + 'donation', + 'total', + 'post_custom_field', + 'password' + ); + // return the types, filtered + return apply_filters( 'gf_tooltips_allowed_fields', $defaults ); } /** - * Some extra stuff for the settings page - * this is just to keep the area cleaner + * get the placemend descriptions * - * @return [mixed HTML] sidebar stuff on settings page + * @param string $current the current selection (if it exists) + * + * @return mixed/HTML */ - static function settings_side() { ?> - -
    -
    -
    -

    -
    -

    Talk to @norcross on twitter or visit the plugin support form for bugs or feature requests.

    -

    Enjoy the plugin?') ?>
    -

    -

    Donate: A lot of hard work goes into building plugins - support your open source developers. Include your twitter username and I\'ll send you a shout out for your generosity. Thank you!') ?>
    -

    - - - - -

    -
    -
    -
    - - -
    - - - -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    - - __( 'Top', 'gravity-tooltips' ), + 'right' => __( 'Right', 'gravity-tooltips' ), + 'bottom' => __( 'Bottom', 'gravity-tooltips' ), + 'left' => __( 'Left', 'gravity-tooltips' ), + ); + + // set an empty + $drop = ''; + + // loop them and make a dropdown + foreach ( $options as $key => $label ) { + $drop .= ''; + } + + // return it + return $drop; + } + + /** + * get the dropdown for the design + * + * @param string $current [description] + * + * @return mixed/HTML + */ + public static function get_admin_designs( $current = '' ) { + + // set our array + $options = array( + 'light' => __( 'Light', 'gravity-tooltips' ), + 'dark' => __( 'Dark', 'gravity-tooltips' ), + 'success' => __( 'Green', 'gravity-tooltips' ), + 'info' => __( 'Blue', 'gravity-tooltips' ), + 'error' => __( 'Red', 'gravity-tooltips' ), + 'warning' => __( 'Orange', 'gravity-tooltips' ) + ); + + // filter the design options + $options = apply_filters( 'gf_tooltips_design_options', $options ); + + // set an empty + $drop = ''; + + // loop them and make a dropdown + foreach ( $options as $key => $label ) { + $drop .= ''; + } + + // return it + return $drop; + } + + +// end class +} + +// end exists check } -new GF_Tooltips_Admin(); \ No newline at end of file +// Instantiate our class +$GF_Tooltips_Admin = new GF_Tooltips_Admin(); +$GF_Tooltips_Admin->init(); diff --git a/lib/css/gf.tooltips.front.css b/lib/css/gf.tooltips.front.css deleted file mode 100644 index bbd2ae6..0000000 --- a/lib/css/gf.tooltips.front.css +++ /dev/null @@ -1,29 +0,0 @@ -ul.gform_fields li.gf-tooltip-label label:hover { - cursor: help; -} - -ul.gform_fields li.gf-tooltip-single img.gf-tooltip-icon-img, -ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img { - height: 16px; - width: 16px; - text-decoration: none; - cursor: help; - zoom: 1; - filter: alpha(opacity=65); - opacity: 0.65; - -webkit-transition: all 0.5s ease-in-out; - -moz-transition: all 0.5s ease-in-out; - -ms-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; -} - -ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img { - margin: 0 0 0 5px; -} - -ul.gform_fields li.gf-tooltip-single img.gf-tooltip-icon-img:hover, -ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img:hover { - filter: alpha(opacity=100); - opacity: 1; -} \ No newline at end of file diff --git a/lib/css/gftips.front.css b/lib/css/gftips.front.css deleted file mode 100644 index bbd2ae6..0000000 --- a/lib/css/gftips.front.css +++ /dev/null @@ -1,29 +0,0 @@ -ul.gform_fields li.gf-tooltip-label label:hover { - cursor: help; -} - -ul.gform_fields li.gf-tooltip-single img.gf-tooltip-icon-img, -ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img { - height: 16px; - width: 16px; - text-decoration: none; - cursor: help; - zoom: 1; - filter: alpha(opacity=65); - opacity: 0.65; - -webkit-transition: all 0.5s ease-in-out; - -moz-transition: all 0.5s ease-in-out; - -ms-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; -} - -ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img { - margin: 0 0 0 5px; -} - -ul.gform_fields li.gf-tooltip-single img.gf-tooltip-icon-img:hover, -ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img:hover { - filter: alpha(opacity=100); - opacity: 1; -} \ No newline at end of file diff --git a/lib/css/gftips.front.min.css b/lib/css/gftips.front.min.css deleted file mode 100644 index 55eeb86..0000000 --- a/lib/css/gftips.front.min.css +++ /dev/null @@ -1 +0,0 @@ -ul.gform_fields li.gf-tooltip-label label:hover{cursor:help}ul.gform_fields li.gf-tooltip-single img.gf-tooltip-icon-img,ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img{height:16px;width:16px;text-decoration:none;cursor:help;zoom:1;filter:alpha(opacity=65);opacity:.65;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out}ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img{margin:0 0 0 5px}ul.gform_fields li.gf-tooltip-single img.gf-tooltip-icon-img:hover,ul.gform_fields li.gf-tooltip-icon img.gf-tooltip-icon-img:hover{filter:alpha(opacity=100);opacity:1} \ No newline at end of file diff --git a/lib/css/hint.css b/lib/css/hint.css new file mode 100644 index 0000000..cfcb281 --- /dev/null +++ b/lib/css/hint.css @@ -0,0 +1,355 @@ +/*! Hint.css - v1.3.5 - 2015-06-16 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2015 Kushagra Gour; Licensed MIT */ + +/*-------------------------------------*\ + HINT.css - A CSS tooltip library +\*-------------------------------------*/ +/** + * HINT.css is a tooltip library made in pure CSS. + * + * Source: https://github.com/chinchang/hint.css + * Demo: http://kushagragour.in/lab/hint/ + * + * Release under The MIT License + * + */ +/** + * source: hint-core.scss + * + * Defines the basic styling for the tooltip. + * Each tooltip is made of 2 parts: + * 1) body (:after) + * 2) arrow (:before) + * + * Classes added: + * 1) hint + */ +.hint, [data-hint] { + position: relative; + display: inline-block; + /** + * tooltip arrow + */ + /** + * tooltip body + */ } + .hint:before, .hint:after, [data-hint]:before, [data-hint]:after { + position: absolute; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + visibility: hidden; + opacity: 0; + z-index: 1000000; + pointer-events: none; + -webkit-transition: 0.3s ease; + -moz-transition: 0.3s ease; + transition: 0.3s ease; + -webkit-transition-delay: 0ms; + -moz-transition-delay: 0ms; + transition-delay: 0ms; } + .hint:hover:before, .hint:hover:after, .hint:focus:before, .hint:focus:after, [data-hint]:hover:before, [data-hint]:hover:after, [data-hint]:focus:before, [data-hint]:focus:after { + visibility: visible; + opacity: 1; } + .hint:hover:before, .hint:hover:after, [data-hint]:hover:before, [data-hint]:hover:after { + -webkit-transition-delay: 100ms; + -moz-transition-delay: 100ms; + transition-delay: 100ms; } + .hint:before, [data-hint]:before { + content: ''; + position: absolute; + background: transparent; + border: 6px solid transparent; + z-index: 1000001; } + .hint:after, [data-hint]:after { + content: attr(data-hint); + background: #383838; + color: white; + font-weight: normal; + padding: 8px 10px; + font-size: 12px; + line-height: 12px; + white-space: nowrap; } + +/** + * source: hint-position.scss + * + * Defines the positoning logic for the tooltips. + * + * Classes added: + * 1) hint--top + * 2) hint--bottom + * 3) hint--left + * 4) hint--right + */ +/** + * set default color for tooltip arrows + */ +.hint--top:before { + border-top-color: #383838; } + +.hint--bottom:before { + border-bottom-color: #383838; } + +.hint--left:before { + border-left-color: #383838; } + +.hint--right:before { + border-right-color: #383838; } + +/** + * top tooltip + */ +.hint--top:before { + margin-bottom: -12px; } +.hint--top:after { + margin-left: -18px; } +.hint--top:before, .hint--top:after { + bottom: 100%; + left: 50%; } +.hint--top:hover:after, .hint--top:hover:before, .hint--top:focus:after, .hint--top:focus:before { + -webkit-transform: translateY(-8px); + -moz-transform: translateY(-8px); + transform: translateY(-8px); } + +/** + * bottom tooltip + */ +.hint--bottom:before { + margin-top: -12px; } +.hint--bottom:after { + margin-left: -18px; } +.hint--bottom:before, .hint--bottom:after { + top: 100%; + left: 50%; } +.hint--bottom:hover:after, .hint--bottom:hover:before, .hint--bottom:focus:after, .hint--bottom:focus:before { + -webkit-transform: translateY(8px); + -moz-transform: translateY(8px); + transform: translateY(8px); } + +/** + * right tooltip + */ +.hint--right:before { + margin-left: -12px; + margin-bottom: -6px; } +.hint--right:after { + margin-bottom: -14px; } +.hint--right:before, .hint--right:after { + left: 100%; + bottom: 50%; } +.hint--right:hover:after, .hint--right:hover:before, .hint--right:focus:after, .hint--right:focus:before { + -webkit-transform: translateX(8px); + -moz-transform: translateX(8px); + transform: translateX(8px); } + +/** + * left tooltip + */ +.hint--left:before { + margin-right: -12px; + margin-bottom: -6px; } +.hint--left:after { + margin-bottom: -14px; } +.hint--left:before, .hint--left:after { + right: 100%; + bottom: 50%; } +.hint--left:hover:after, .hint--left:hover:before, .hint--left:focus:after, .hint--left:focus:before { + -webkit-transform: translateX(-8px); + -moz-transform: translateX(-8px); + transform: translateX(-8px); } + +/** + * source: hint-theme.scss + * + * Defines basic theme for tooltips. + * + */ +.hint, [data-hint] { + /** + * tooltip body + */ } + .hint:after, [data-hint]:after { + text-shadow: 0 -1px 0px black; + box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.3); } + +/** + * source: hint-color-types.scss + * + * Contains tooltips of various types based on color differences. + * + * Classes added: + * 1) hint--error + * 2) hint--warning + * 3) hint--info + * 4) hint--success + * + */ + +/** + * Light + */ +.hint--light:after { + background-color: #efefef; + color: #383838; + text-shadow: 0 -1px 0px #dedede; } +.hint--light.hint--top:before { + border-top-color: #efefef; } +.hint--light.hint--bottom:before { + border-bottom-color: #efefef; } +.hint--light.hint--left:before { + border-left-color: #efefef; } +.hint--light.hint--right:before { + border-right-color: #efefef; } + +/** + * Error + */ +.hint--error:after { + background-color: #b34e4d; + text-shadow: 0 -1px 0px #592726; } +.hint--error.hint--top:before { + border-top-color: #b34e4d; } +.hint--error.hint--bottom:before { + border-bottom-color: #b34e4d; } +.hint--error.hint--left:before { + border-left-color: #b34e4d; } +.hint--error.hint--right:before { + border-right-color: #b34e4d; } + +/** + * Warning + */ +.hint--warning:after { + background-color: #c09854; + text-shadow: 0 -1px 0px #6c5328; } +.hint--warning.hint--top:before { + border-top-color: #c09854; } +.hint--warning.hint--bottom:before { + border-bottom-color: #c09854; } +.hint--warning.hint--left:before { + border-left-color: #c09854; } +.hint--warning.hint--right:before { + border-right-color: #c09854; } + +/** + * Info + */ +.hint--info:after { + background-color: #3986ac; + text-shadow: 0 -1px 0px #193b4d; } +.hint--info.hint--top:before { + border-top-color: #3986ac; } +.hint--info.hint--bottom:before { + border-bottom-color: #3986ac; } +.hint--info.hint--left:before { + border-left-color: #3986ac; } +.hint--info.hint--right:before { + border-right-color: #3986ac; } + +/** + * Success + */ +.hint--success:after { + background-color: #458746; + text-shadow: 0 -1px 0px #1a321a; } +.hint--success.hint--top:before { + border-top-color: #458746; } +.hint--success.hint--bottom:before { + border-bottom-color: #458746; } +.hint--success.hint--left:before { + border-left-color: #458746; } +.hint--success.hint--right:before { + border-right-color: #458746; } + +/** + * source: hint-always.scss + * + * Defines a persisted tooltip which shows always. + * + * Classes added: + * 1) hint--always + * + */ +.hint--always:after, .hint--always:before { + opacity: 1; + visibility: visible; } +.hint--always.hint--top:after, .hint--always.hint--top:before { + -webkit-transform: translateY(-8px); + -moz-transform: translateY(-8px); + transform: translateY(-8px); } +.hint--always.hint--bottom:after, .hint--always.hint--bottom:before { + -webkit-transform: translateY(8px); + -moz-transform: translateY(8px); + transform: translateY(8px); } +.hint--always.hint--left:after, .hint--always.hint--left:before { + -webkit-transform: translateX(-8px); + -moz-transform: translateX(-8px); + transform: translateX(-8px); } +.hint--always.hint--right:after, .hint--always.hint--right:before { + -webkit-transform: translateX(8px); + -moz-transform: translateX(8px); + transform: translateX(8px); } + +/** + * source: hint-rounded.scss + * + * Defines rounded corner tooltips. + * + * Classes added: + * 1) hint--rounded + * + */ +.hint--rounded:after { + border-radius: 4px; } + +/** + * source: hint-effects.scss + * + * Defines various transition effects for the tooltips. + * + * Classes added: + * 1) hint--no-animate + * 2) hint--bounce + * + */ +.hint--no-animate:before, .hint--no-animate:after { + -webkit-transition-duration: 0ms; + -moz-transition-duration: 0ms; + transition-duration: 0ms; } + +.hint--bounce:before, .hint--bounce:after { + -webkit-transition: opacity 0.3s ease, visibility 0.3s ease, -webkit-transform 0.3s cubic-bezier(0.71, 1.7, 0.77, 1.24); + -moz-transition: opacity 0.3s ease, visibility 0.3s ease, -moz-transform 0.3s cubic-bezier(0.71, 1.7, 0.77, 1.24); + transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s cubic-bezier(0.71, 1.7, 0.77, 1.24); } + + +span.gf-icon { + font-size: 16px; + line-height: 1; + display: inline-block; + vertical-align: top; + margin: 0; + padding: 0 0.375em; +} + +span.gf-icon .fa { + margin: 0; + background-color: transparent; + box-shadow: none; + color: #565656; + -webkit-transition: all 0.3s ease; + -moz-transition: all 0.3s ease; + -ms-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; +} + +span.gf-icon:hover .fa, +span.gf-icon:focus .fa { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + filter: alpha(opacity=50); + opacity: 0.5; + cursor: help; +} \ No newline at end of file diff --git a/lib/css/hint.min.css b/lib/css/hint.min.css new file mode 100644 index 0000000..943dc3f --- /dev/null +++ b/lib/css/hint.min.css @@ -0,0 +1,7 @@ +/*! Hint.css - v1.3.5 - 2015-06-16 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2015 Kushagra Gour; Licensed MIT */ + +/*! Hint.css - v1.3.5 - 2015-06-16 +* http://kushagragour.in/lab/hint/ +* Copyright (c) 2015 Kushagra Gour; Licensed MIT */.hint,[data-hint]{position:relative;display:inline-block}.hint:after,.hint:before,[data-hint]:after,[data-hint]:before{position:absolute;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;-webkit-transition:.3s ease;-moz-transition:.3s ease;transition:.3s ease;-webkit-transition-delay:0ms;-moz-transition-delay:0ms;transition-delay:0ms}.hint--always:after,.hint--always:before,.hint:focus:after,.hint:focus:before,.hint:hover:after,.hint:hover:before,[data-hint]:focus:after,[data-hint]:focus:before,[data-hint]:hover:after,[data-hint]:hover:before{opacity:1;visibility:visible}.hint:hover:after,.hint:hover:before,[data-hint]:hover:after,[data-hint]:hover:before{-webkit-transition-delay:100ms;-moz-transition-delay:100ms;transition-delay:100ms}.hint:before,[data-hint]:before{content:'';position:absolute;background:0 0;border:6px solid transparent;z-index:1000001}.hint:after,[data-hint]:after{content:attr(data-hint);background:#383838;color:#fff;font-weight:400;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;text-shadow:0 -1px 0 #000;box-shadow:4px 4px 8px rgba(0,0,0,.3)}.hint--top:before{border-top-color:#383838;margin-bottom:-12px}.hint--bottom:before{border-bottom-color:#383838;margin-top:-12px}.hint--top:after{margin-left:-18px}.hint--top:after,.hint--top:before{bottom:100%;left:50%}.hint--top:focus:after,.hint--top:focus:before,.hint--top:hover:after,.hint--top:hover:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--bottom:after{margin-left:-18px}.hint--bottom:after,.hint--bottom:before{top:100%;left:50%}.hint--bottom:focus:after,.hint--bottom:focus:before,.hint--bottom:hover:after,.hint--bottom:hover:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--right:before{border-right-color:#383838;margin-left:-12px;margin-bottom:-6px}.hint--right:after{margin-bottom:-14px}.hint--right:after,.hint--right:before{left:100%;bottom:50%}.hint--right:focus:after,.hint--right:focus:before,.hint--right:hover:after,.hint--right:hover:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--left:before{border-left-color:#383838;margin-right:-12px;margin-bottom:-6px}.hint--left:after{margin-bottom:-14px}.hint--left:after,.hint--left:before{right:100%;bottom:50%}.hint--left:focus:after,.hint--left:focus:before,.hint--left:hover:after,.hint--left:hover:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--light:after{background-color:#efefef;color:#383838;text-shadow:0 -1px 0 #dedede}.hint--light.hint--top:before{border-top-color:#efefef}.hint--light.hint--bottom:before{border-bottom-color:#efefef}.hint--light.hint--left:before{border-left-color:#efefef}.hint--light.hint--right:before{border-right-color:#efefef}.hint--error:after{background-color:#b34e4d;text-shadow:0 -1px 0 #592726}.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{background-color:#c09854;text-shadow:0 -1px 0 #6c5328}.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{background-color:#3986ac;text-shadow:0 -1px 0 #193b4d}.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{background-color:#458746;text-shadow:0 -1px 0 #1a321a}.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always.hint--top:after,.hint--always.hint--top:before{-webkit-transform:translateY(-8px);-moz-transform:translateY(-8px);transform:translateY(-8px)}.hint--always.hint--bottom:after,.hint--always.hint--bottom:before{-webkit-transform:translateY(8px);-moz-transform:translateY(8px);transform:translateY(8px)}.hint--always.hint--left:after,.hint--always.hint--left:before{-webkit-transform:translateX(-8px);-moz-transform:translateX(-8px);transform:translateX(-8px)}.hint--always.hint--right:after,.hint--always.hint--right:before{-webkit-transform:translateX(8px);-moz-transform:translateX(8px);transform:translateX(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:after,.hint--no-animate:before{-webkit-transition-duration:0ms;-moz-transition-duration:0ms;transition-duration:0ms}.hint--bounce:after,.hint--bounce:before{-webkit-transition:opacity .3s ease,visibility .3s ease,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s ease,visibility .3s ease,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s ease,visibility .3s ease,transform .3s cubic-bezier(.71,1.7,.77,1.24)}span.gf-icon{font-size:16px;line-height:1;display:inline-block;vertical-align:top;margin:0;padding:0 .375em}span.gf-icon .fa{margin:0;background-color:transparent;box-shadow:none;color:#565656;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;-o-transition:all .3s ease;transition:all .3s ease}span.gf-icon:focus .fa,span.gf-icon:hover .fa{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);opacity:.5;cursor:help;} \ No newline at end of file diff --git a/lib/front.php b/lib/front.php index 365bf78..28162c2 100644 --- a/lib/front.php +++ b/lib/front.php @@ -1,93 +1,84 @@ ' . $icon . ''; - } + // render it + $render = GF_Tooltips_Helper::str_replace_limit( '', $setup . '', $render ); + } - /** - * [render_tooltip_icon description] - * @param [type] $content [description] - * @param [type] $tooltip [description] - * @return [type] [description] - */ - static function render_tooltip_icon( $content, $tooltip ) { + // build out single version + if ( $type == 'single' ) { - $img = GF_Tooltips::get_tooltip_icon_img( false ); + // get my icon + $icon = self::get_tooltip_icon(); - $icon = ''; + // build the markup + $setup = '' . $icon . ''; - // drop our tooltip on there - return GF_Tooltips::str_replace_limit( '', $icon . '', $content ); + // render it + $render = GF_Tooltips_Helper::str_replace_limit( '
    ', '' . $setup, $render ); + } + // return field content with new tooltip + return apply_filters( 'gf_tooltips_filter_display', $render, $type, $field, $form_id ); } /** - * [render_tooltip_single description] - * @param [type] $content [description] - * @param [type] $tooltip [description] - * @return [type] [description] + * load our CSS files + * + * @return [type] [description] */ - static function render_tooltip_single( $content, $tooltip ) { - - $img = GF_Tooltips::get_tooltip_icon_img( false ); + public function scripts_styles( $form, $is_ajax ) { - $icon = ''; + // make sure we want fontawesome + if ( false !== $fontawesome = apply_filters( 'gf_tooltips_use_fontawesome', true ) ) { + wp_enqueue_style( 'fontawesome', '//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css', array(), '4.3.0', 'all' ); + } - // drop our tooltip on there - return GF_Tooltips::str_replace_limit( '', '' . $icon, $content ); + // set our filename based on debug + $file = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? 'hint.css' : 'hint.min.css'; + // and the actual hint class + wp_enqueue_style( 'gf-tooltips', plugins_url( '/css/' . $file, __FILE__ ), array(), '1.3.5', 'all' ); } /** - * [get_tooltip_customs description] - * @param boolean $option [description] - * @return [type] [description] + * generate and return the CSS class + * + * @param string $design [description] + * @param string $target [description] + * @param string $type [description] + * + * @return [type] [description] */ - static function get_tooltip_customs( $option = false ) { + public static function get_tooltip_class( $design = '', $target = '', $type = '' ) { - $showdelay = apply_filters( 'gf_tooltips_show_delay', 700 ); - $showsolo = apply_filters( 'gf_tooltips_show_solo', true ); + // set an empty + $class = ''; - $hidedelay = apply_filters( 'gf_tooltips_hide_delay', 300 ); + // set the base class + $class .= 'hint--' . esc_attr( $design ) . ' hint--' . esc_attr( $target ); - $data = array( - 'showdelay' => (int) $showdelay, - 'showsolo' => (bool) $showsolo, - 'hidedelay' => (int) $hidedelay, - ); + // check for bounce + if ( false !== $bounce = apply_filters( 'gf_tooltips_bounce', true ) ) { + $class .= ' hint--bounce'; + } - // return the whole array - if ( ! $option ) { - return $data; + // check for rounded + if ( false !== $rounded = apply_filters( 'gf_tooltips_rounded', true ) ) { + $class .= ' hint--rounded'; } - // return the specified option - return $data[ $option ]; + // check for no animation (bounce can't also be used) + if ( false !== $animate = apply_filters( 'gf_tooltips_no_animated', false ) ) { + $class .= ' hint--no-animate'; + } + // check for static + if ( false !== $static = apply_filters( 'gf_tooltips_static', false ) ) { + $class .= ' hint--always'; + } + + // return it filtered + return apply_filters( 'gf_tooltips_class', $class, $design, $target, $type ); } /** - * [scripts_styles description] + * set the default with a filter and return + * * @return [type] [description] */ - public function scripts_styles( $form, $is_ajax ) { + public static function get_tooltip_icon() { - if( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) : - // load non-minified version and debug script with cache breaking timestamp if set - wp_enqueue_style( 'gf-tooltips', plugins_url( '/css/gftips.front.css', __FILE__ ), array(), GFT_VER, 'all' ); - wp_enqueue_script( 'qtip-tips', plugins_url( '/js/jquery.qtip.js', __FILE__ ), array( 'jquery' ), time(), true ); - wp_enqueue_script( 'qtip-debug', plugins_url( '/js/jquery.qtip.debug.js', __FILE__ ), array( 'jquery' ), time(), true ); - wp_enqueue_script( 'gf-tooltips', plugins_url( '/js/gftips.front.js', __FILE__ ), array( 'jquery' ), GFT_VER, true ); - else: - // load the normal minified - wp_enqueue_style( 'gf-tooltips', plugins_url( '/css/gftips.front.min.css', __FILE__ ), array(), GFT_VER, 'all' ); - wp_enqueue_script( 'qtip-tips', plugins_url( '/js/jquery.qtip.min.js', __FILE__ ), array( 'jquery' ), '1.0', true ); - wp_enqueue_script( 'gf-tooltips', plugins_url( '/js/gftips.front.min.js', __FILE__ ), array( 'jquery' ), GFT_VER, true ); - endif; - - - // set up variables for later use - wp_localize_script( 'gf-tooltips', 'ttVars', array( - 'target' => self::get_tooltip_data( 'target', 'topRight' ), - 'location' => self::get_tooltip_data( 'location', 'bottomLeft' ), - 'design' => self::get_tooltip_data( 'design', 'light' ), - 'showdelay' => self::get_tooltip_customs( 'showdelay' ), - 'showsolo' => self::get_tooltip_customs( 'showsolo' ), - 'hidedelay' => self::get_tooltip_customs( 'hidedelay' ), - ) - ); + // set the icon class + $class = apply_filters( 'gf_tooltips_icon_class', 'fa fa-question-circle' ); + // return it + return apply_filters( 'gf_tooltips_icon', '' ); } -/// end class + +// end class +} + +// end exists check } -new GF_Tooltips_Front(); \ No newline at end of file +// Instantiate our class +$GF_Tooltips_Front = new GF_Tooltips_Front(); +$GF_Tooltips_Front->init(); \ No newline at end of file diff --git a/lib/helper.php b/lib/helper.php new file mode 100644 index 0000000..3bc3c04 --- /dev/null +++ b/lib/helper.php @@ -0,0 +1,101 @@ +XQ3zVFLUj#m&=@$&*vkM zdnS|VxdMQd52&h~OuDzWd*uAIPY~fr%M;gzH_u-@m{C$Z@KEb#=uPXJ-YZ{sB-H?Ck8q%*+DcBX9x`1Oc!k z^e^!K;0LurMHMKBRvL*!5^}j5oSb}C_GzLA(C_zQG#W{q0aljCD1*VE1pZn9_V;)B z{`5j|531EFosUtnsGj!uYqQw|yg*8_JdciEQYDx&EH7<>l9M-fwSVdwcsCRzKX_+`L1*o}ZuR^h>1@H#3n)jF8Q% z^YinAzdk0f*SmsJo?zkz$`CMty3xm0Ta diff --git a/lib/js/gftips.admin.js b/lib/js/gftips.admin.js index 3c1531c..50ed3f8 100644 --- a/lib/js/gftips.admin.js +++ b/lib/js/gftips.admin.js @@ -1,7 +1,6 @@ //*************************************************************** // start the engine //*************************************************************** - jQuery( document ).ready( function($) { if ( typeof fieldSettings === 'undefined' ) { @@ -9,7 +8,7 @@ jQuery( document ).ready( function($) { } // pull in our allowed types - var allowed = gftipsAdmin.fieldtypes; + var allowed = gftipsAdmin.fldTypes; // loop through each possible field type and add our new field jQuery.each( fieldSettings, function( type, items ) { diff --git a/readme.txt b/readme.txt deleted file mode 100644 index ddfa7a6..0000000 --- a/readme.txt +++ /dev/null @@ -1,37 +0,0 @@ -=== Gravity Forms Tooltips === -Contributors: norcross -Donate link: http://andrewnorcross.com/donate -Tags: gravity forms, forms, tooltips -Requires at least: 3.8 -Tested up to: 3.9 -Stable tag: 1.0.1 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html - -Add custom tooltips in Gravity Forms. - -== Description == - -Add custom tooltips in Gravity Forms. Creates a new input field under the 'advanced' tab for each field item. - - -== Installation == -1. Upload the `gravity-tooltips` folder and all its contents to the `/wp-content/plugins/` directory -1. Activate the plugin through the 'Plugins' menu in WordPress -1. Add tooltips on individual fields under the 'advanced' tab - -== Frequently Asked Questions == - -= What is this for? = - -There are times when you want to add more information to a field to help prompt a user, but don't want to overfill the space. - -== Screenshots == - -1. The menu item for the options -2. A displayed tooltip - -== Changelog == - -= 1.0.0 = -* Initial release diff --git a/screenshot-1.png b/screenshot-1.png deleted file mode 100644 index 1bb790747c135e6e7a536b9bb98da7fc473610df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11822 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 diff --git a/screenshot-2.png b/screenshot-2.png deleted file mode 100644 index 96105a95d19593ea44660d84f9c6e26068a026f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10568 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