Plugin Directory

Changeset 1459144


Ignore:
Timestamp:
07/22/2016 05:24:54 PM (10 years ago)
Author:
HelloToken
Message:

updating plugin to 1.48

Location:
hellotoken/trunk
Files:
1 added
1 deleted
7 edited
1 moved

Legend:

Unmodified
Added
Removed
  • hellotoken/trunk/admin/settings.php

    r1454923 r1459144  
    1616    Wait! Your connection is not active. This blog URL does not match the URL in your  <a href = "https://www.hellotoken.com/publishers/edit" target = "_blank">HelloToken account</a>. Please update your profile.
    1717  </div>
    18   <div class="hellotoken-form-errors" style="display: none;">
     18  <div class="hellotoken-form-id-errors" style="display: none;">
    1919    Wait! Your connection is not active. Please verify your Client ID (get it from your <a href = "https://www.hellotoken.com/publishers/edit" target = "_blank">HelloToken profile</a>).
    2020  </div>
     21  <div class="hellotoken-form-errors" style="display: none;">
     22  </div>
     23
    2124
    2225  <ul class="hellotoken-tabs">
     
    3033
    3134  <div id="hellotoken_form">
    32     <?php require __DIR__.'/../form/settingsForm.php' ?>   
     35    <?php require_once dirname(__FILE__).'/settingsForm.php' ?>
    3336  </div>
    3437
  • hellotoken/trunk/admin/settings6.js

    r1454923 r1459144  
    1111  var pathName = window.location.pathname + "?page=HelloToken";
    1212
    13   function helloTokenAppendMessage(msg) {
    14     if (msg !== undefined) {
    15       $('.hellotoken-append-message').show().html(msg); // display message from Ruby
    16     }
    17   }
    18 
    19   function helloTokenShowAmount(msg) {
    20     $('.hellotoken-show-amount').show().html(msg);
    21   }
    22 
    2313  // init settings form
    2414  $form.HelloTokenForm({
     
    2717  });
    2818
    29   $('body').on('click', '.hellotoken-tab', function(e) {
    30     e.preventDefault();
    31 
    32     $('.hellotoken-tab').removeClass('hellotoken-active-tab');
    33     $(this).addClass('hellotoken-active-tab');
    34 
    35     $('.hellotoken-tab-content').hide();
    36     var loc = $(this).data('for');
    37     $('.hellotoken-tab-content[data-section="' + loc + '"]').show();
    38   });
     19  function helloTokenAppendMessage(msg, perm) {
     20    if (msg !== undefined) {
     21      var permMsg = typeof perm !== 'undefined' ? perm : false;
     22      var $msgDisplay = $('.hellotoken-append-message').last();
     23      if ($msgDisplay.is(':visible')){
     24        $msgDisplay.clone()
     25          .html(msg)
     26          .show().insertAfter($msgDisplay);
     27      } else {
     28        $msgDisplay.show().html(msg);
     29      }
     30      if (!permMsg){
     31        $form.HelloTokenForm('helloTokenFadeMessage',
     32                             $('.hellotoken-append-message').last());
     33      }
     34    }
     35  }
     36
     37  function helloTokenShowAmount(msg) {
     38    $('.hellotoken-show-amount').show().html(msg);
     39  }
    3940
    4041  // save settings
     
    6566        "version": version // check version of plugin
    6667      },
     68      timeout: 10000,
    6769      success: function(data) {
    6870        var msg, pub_cash;
     
    7880            console.log("HT: Url Mismatch. Action aborted.");
    7981            // Append message if it is available from the Ruby backend
    80             helloTokenAppendMessage(msg);
     82            helloTokenAppendMessage(msg, true);
    8183          } else if (data[1] == 3) {
    8284            $form.HelloTokenForm('helloTokenAnnounceIDFailure');
     
    8486            console.log("HT: Bad ClientID. Action aborted.");
    8587            // Append message if it is available from the Ruby backend
    86             helloTokenAppendMessage(msg);
     88            helloTokenAppendMessage(msg, true);
    8789          }
    8890        } else {
     
    9698            console.log("HT: Url Mismatch. Action aborted.");
    9799            // Append message if it is available from the Ruby backend
    98             helloTokenAppendMessage(msg);
     100            helloTokenAppendMessage(msg, true);
    99101          } else if (data[0] == 3) {
    100102            $form.HelloTokenForm('helloTokenAnnounceIDFailure');
     
    102104            console.log("HT: Bad ClientID. Action aborted.");
    103105            // Append message if it is available from the Ruby backend
    104             helloTokenAppendMessage(msg);
     106            helloTokenAppendMessage(msg, true);
    105107          }
    106108        }
    107109      },
    108110      error: function(data){
     111        $form.HelloTokenForm('helloTokenDisplayErrors',
     112          'Error connecting to HelloToken servers. Please try again later.');
    109113        console.log("HT: Couldn't verify client ID. Action aborted.");
    110114      }
     
    118122    $allDisableButton.addClass('disabled');
    119123  }
     124
     125  $('body').on('click', '.hellotoken-tab', function(e) {
     126    e.preventDefault();
     127
     128    $('.hellotoken-tab').removeClass('hellotoken-active-tab');
     129    $(this).addClass('hellotoken-active-tab');
     130
     131    $('.hellotoken-tab-content').hide();
     132    var loc = $(this).data('for');
     133    $('.hellotoken-tab-content[data-section="' + loc + '"]').show();
     134  });
    120135
    121136  $allEnableButton.on('click', function(e) {
     
    131146      helloTokenAppendMessage('HelloToken successfully enabled on all posts.');
    132147      return true;
    133     }).error(function() {
     148    }).fail(function() {
     149      $form.HelloTokenForm('helloTokenDisplayErrors',
     150        'Error updating Wordpress database. Action aborted.');
    134151      helloTokenShowLoader(false);
    135152      return false;
     
    149166      helloTokenAppendMessage('HelloToken successfully disabled on all posts.');
    150167      return true;
    151     }).error(function() {
     168    }).fail(function() {
     169      $form.HelloTokenForm('helloTokenDisplayErrors',
     170        'Error updating Wordpress database. Action aborted.');
    152171      helloTokenShowLoader(false);
    153172      return false;
     
    177196          // Append message if it is available from the Ruby backend
    178197          if ('msg' in data)
    179             helloTokenAppendMessage(data.msg);
     198            helloTokenAppendMessage(data.msg, true);
    180199
    181200          // allow the toggle buttons to be used now
     
    186205        }
    187206        else {
    188           helloTokenAppendMessage("Wordpress authentication failure.");
     207          $form.HelloTokenForm('helloTokenDisplayErrors',
     208            'Wordpress authentication failure. Please check your credentials and try again.');
    189209          return false;
    190210        }
    191       }).error(function() {
     211      }).fail(function() {
     212        $form.HelloTokenForm('helloTokenDisplayErrors',
     213          'Error updating Wordpress database. Action aborted.');
    192214        helloTokenShowLoader(false);
    193215        return false;
  • hellotoken/trunk/form/form.css

    r1454923 r1459144  
    117117/* added for tabs */
    118118/* colors from bootstrap */
     119.hellotoken-form-id-errors,
     120.hellotoken-form-url-errors,
    119121.hellotoken-form-errors,
    120 .hellotoken-form-url-errors,
    121122.hellotoken-form-success,
    122123.hellotoken-form-demo,
     
    173174}
    174175
    175 div.hellotoken-button-red {
    176   /** need to override the WP colors **/
     176/*div.hellotoken-button-red {
    177177  background-color: pink !important;
    178178  cursor: not-allowed;
    179 }
     179}*/
    180180
    181181div.hellotoken-button-red:hover {
    182   /** need to override the WP colors **/
    183182  background-color: pink !important;
    184183}
    185184
    186 /*div.hellotoken-button-green {*/
    187   /** need to override the WP colors **/
    188   /*background-color: lightgreen !important;*/
    189 /*}*/
     185/*div.hellotoken-button-green {
     186  background-color: lightgreen !important;
     187}*/
    190188
    191189div.hellotoken-button-green:hover {
  • hellotoken/trunk/form/form6.js

    r1454923 r1459144  
    2020      redirect_type: 0,
    2121      redirect_url: '',
    22       default_enable: 1
     22      default_enable: 1,
     23      homepage_enable: 0
    2324    };
    2425
     
    6263
    6364    this.options.onInit.call(this);
    64 
    65     this.helloTokenFillOtherSettings();
    6665  }
    6766
     
    7170  // variables
    7271  var helloTokenVersion = HelloToken.version;
    73 
    74   // fill in all the settings that aren't nice inputs and text boxes
    75   proto.helloTokenFillOtherSettings = function() {
    76     form = this;
    77     // checkboxes
    78     $("input[type='checkbox']").each(function(index, value) {
    79       var ele = $('#' + this.id);
    80       var v = ele.val();
    81       if(v == 1) ele.prop('checked', true);
    82     });
    83 
    84     // ONLY default activation settings radio buttons (you'll have to rewrite to add others)
    85     $("input[type='radio']").each(function(index, value) {
    86       var ele = $('#' + this.id);
    87       if(ele.val() == form.options.settings.default_enable) ele.prop('checked', true);
    88     });
    89   };
    9072
    9173  proto.helloTokenMakeTemplate = function() {
     
    132114
    133115    for (var i in this.default_settings) {
    134       this.form[i] = $('#hellotoken_' + i, $form);
     116      // adding cases for different form element types as we go
     117      // see also the SetSettings and GetSettings methods
     118      // TODO: standardize this to be agnostic of form type
     119      if ($('#hellotoken_' + i, $form).length > 0){
     120        this.form[i] = $('#hellotoken_' + i, $form);
     121      } else if ($('#hellotoken-' + i, $form).length > 0) {
     122        this.form[i] = $('#hellotoken-' + i, $form);
     123      } else if ($('.hellotoken_' + i, $form).length > 0) {
     124        this.form[i] = $('.hellotoken_' + i, $form);
     125      } else {
     126        this.form[i] = $([]);
     127      }
     128
    135129    }
    136130
     
    159153
    160154    for (var i in settings) {
    161       if (i=="choices" && this.form.hasOwnProperty(i)) {
    162 
     155      if (i == "choices" && this.form.hasOwnProperty(i)) {
     156        // deprecated!
    163157      } else if (this.form.hasOwnProperty(i)) {
    164         this.form[i].val(settings[i]);
    165       }
     158        this.helloTokenSetSetting($(this.form[i]), settings[i]);
     159      }
     160    }
     161  };
     162
     163  proto.helloTokenSetSetting = function(el, val) {
     164    if (el.is("input[type='checkbox']")) {
     165      el.prop("checked", val == 1);
     166    } else if (el.children().is("input[type='radio']")) {
     167      el.children("input[type='radio']").each(function(index, radio) {
     168        if($(radio).val() == val)
     169          $(radio).prop('checked', true);
     170      });
     171    } else {
     172      el.val(val);
    166173    }
    167174  };
     
    172179
    173180    for (var i in this.default_settings) {
    174       settings[i] = this.form[i].val();
     181      settings[i] = this.helloTokenGetSetting($(this.form[i]));
    175182    }
    176183
    177184    return settings;
     185  };
     186
     187  proto.helloTokenGetSetting = function(el) {
     188    if (el.is("input[type='checkbox']")) {
     189      return el.prop("checked") ? 1 : 0;
     190    }
     191    else if (el.children().is("input[type='radio']")) {
     192      var checkedRadio = $(el.children()[0]);
     193      el.children("input[type='radio']").each(function(index, radio) {
     194        if($(radio).prop('checked'))
     195          checkedRadio = $(radio);
     196      });
     197      return checkedRadio.val();
     198    }
     199    else {
     200      return el.val();
     201    }
    178202  };
    179203
     
    187211
    188212  proto.helloTokenAnnounceSuccess = function() {
    189     if(this.errors.length === 0 && $('#hellotoken_is_demo').is(":checked")) {
    190       console.log('demo mode enabled');
    191       $('.hellotoken-form-demo').show();
     213    if(this.errors.length === 0) {
     214      $('.hellotoken-form-success').show();
     215      $('.hellotoken-form-demo').hide();
    192216      $('.hellotoken-show-amount').show();
    193       $('.hellotoken-form-success').hide();
     217      $('.hellotoken-append-message').not(":eq(0)").remove();
    194218      $('.hellotoken-append-message').hide();
    195     } else if(this.errors.length === 0) {
    196       $('.hellotoken-form-success').show();
    197       $('.hellotoken-show-amount').show();
    198       $('.hellotoken-form-demo').hide();
    199       $('.hellotoken-append-message').hide();
     219      if ($('#hellotoken_is_demo').prop("checked")) {
     220        console.log('HT: Demo mode enabled');
     221        $('.hellotoken-form-success').hide();
     222        $('.hellotoken-form-demo').show();
     223      }
     224      // if ($('#hellotoken-homepage_enable').prop("checked")){
     225      //   console.log('hi');
     226      //   $('.hellotoken-append-message').text(
     227      //     "You currently have HelloToken enabled on your homepage."
     228      //   );
     229      //   $('.hellotoken-append-message').show();
     230      //   this.helloTokenFadeMessage($('.hellotoken-append-message'));
     231      // }
    200232    }
    201233  };
     
    211243  };
    212244
    213   proto.helloTokenDisplayErrors = function() {
     245  proto.helloTokenFadeMessage = function($el) {
     246    setTimeout(function() {
     247      $el.fadeOut('fast', function(){
     248        $el.remove();
     249      });
     250    }, 10000);
     251  };
     252
     253  proto.helloTokenDisplayErrors = function(errorMsg) {
    214254    var errors = this.errors;
    215255
    216     if (errors.length > 0) {
     256    if (errors.length > 0 || errorMsg) {
    217257      $('html, body').animate({ scrollTop: this.el.offset().top });
    218258
    219       if (errors.indexOf('homepage_url') > -1 && errors.indexOf('client_id') == -1) {
     259      $('.hellotoken-form-id-errors').hide();
     260      $('.hellotoken-form-url-errors').hide();
     261      $('.hellotoken-form-errors').hide();
     262      $('.hellotoken-form-success').hide();
     263      $('.hellotoken-show-amount').hide();
     264      $('.hellotoken-form-demo').hide();
     265      $('.hellotoken-append-message').hide();
     266
     267      if (errors.includes('homepage_url')){
    220268        $('.hellotoken-form-url-errors').show();
    221         $('.hellotoken-form-errors').hide();
    222         $('.hellotoken-form-success').hide();
    223         $('.hellotoken-show-amount').hide();
    224         $('.hellotoken-form-demo').hide();
    225         $('.hellotoken-append-message').hide();
    226       }
    227       if (errors.indexOf('client_id') > -1  && errors.indexOf('homepage_url') == -1) {
     269      }
     270      if (errors.includes('client_id')){
     271        $('.hellotoken-form-id-errors').show();
     272      }
     273      if (errorMsg) {
     274        $('.hellotoken-form-errors').text(errorMsg);
    228275        $('.hellotoken-form-errors').show();
    229         $('.hellotoken-form-url-errors').hide();
    230         $('.hellotoken-form-success').hide();
    231         $('.hellotoken-show-amount').hide();
    232         $('.hellotoken-form-demo').hide();
    233         $('.hellotoken-append-message').hide();
    234       }
    235       if (errors.includes('homepage_url') && errors.includes('client_id')) {
    236         $('.hellotoken-form-url-errors').show();
    237         $('.hellotoken-form-errors').show();
    238         $('.hellotoken-form-success').hide();
    239         $('.hellotoken-show-amount').hide();
    240         $('.hellotoken-form-demo').hide();
    241         $('.hellotoken-append-message').hide();
    242276      }
    243277    } else {
     278      $('.hellotoken-form-id-errors').hide();
     279      $('.hellotoken-form-url-errors').hide();
     280      $('.hellotoken-form-errors').text("");
    244281      $('.hellotoken-form-errors').hide();
    245       $('.hellotoken-form-url-errors').hide();
    246       $('.hellotoken-append-message').hide();
    247282    }
    248283  };
     
    252287    this.errors = [];
    253288    var errors = this.errors;
    254     var that = this;
    255289
    256290    var free_content_count = this.form.free_content_count.val();
     
    261295    if (show_delay < 0 || isNaN(show_delay) || show_delay > 20)
    262296      errors.push('show_delay');
    263 
    264     // Checkboxes have value checked on validation
    265     // --Only checking 1 specific checkbox at moment to fix a bug. Will have to update this if we add more checkboxes later--
    266     $("input[name='hellotoken_is_demo']").each(function(index, value) {
    267       var ele = $('#' + this.id);
    268 
    269       // Switch value to checked or unchecked
    270       var v = (ele.is(':checked')) ? 1 : 0;
    271       that.form[this.id.substr(11)].val(v);
    272     });
    273 
    274     $("input[name='hellotoken_default_enable']").each(function(index, value) {
    275       if (this.checked) {
    276         that.form[this.name.substr(11)].val(this.value);
    277       }
    278     });
    279297
    280298    this.helloTokenDisplayErrors();
     
    291309      // if valid instance then perform calls on the class
    292310      if (inst && options) {
    293         if (inst[options])
     311        if (inst[options]){
    294312          return inst[options].apply(inst, Array.prototype.slice.call(arguments, 1));
     313        }
    295314
    296315        return inst;
  • hellotoken/trunk/hellotoken.php

    r1454923 r1459144  
    11<?php
    2 define('HELLOTOKEN_VERSION', 1.47);
     2define('HELLOTOKEN_VERSION', 1.48);
    33
    44// Plugin Name: HelloToken
    55// Plugin URI: http://wordpress.org/plugins/hellotoken/
    66// Description: Beautifully ask readers questions and/or earn cold hard cash for each user that visits your site.
    7 // Version: 1.47
     7// Version: 1.48
    88// Author: hellotoken.com
    99// Author URI: http://hellotoken.com
     
    3333    // default settings definition, will be used as initial settings
    3434    $this->default_settings = array(
     35      // crucial options
    3536      'homepage_url' => get_site_url(),
    3637      'company_name' => '',
    3738      'company_logo' => '',
    3839      'client_id' => '',
    39       'free_content_count' => '0',
    4040      'question' => '',
    41       'show_delay' => 0,
    42       'is_demo' => 0,
    4341
    4442      // 0 - do nothing, 1 - home page, 2 - custom url
     
    4846      // 0 - new articles auto disabled, 1 - auto enabled
    4947      'default_enable' => '1',
     48
     49      // advanced options
     50      'homepage_enable' => '0',
     51      'free_content_count' => '0',
     52      'show_delay' => 0,
     53      'is_demo' => 0,
     54
    5055    );
    5156
     
    187192
    188193      // hellotoken
    189       wp_enqueue_script(__class__.'_hellotoken', $this->_url.'/hellotoken/hellotoken47.js', array('jquery'), self::version, false);
     194      wp_enqueue_script(__class__.'_hellotoken', $this->_url.'/hellotoken/hellotoken48.js', array('jquery'), self::version, false);
    190195      wp_enqueue_script(__class__.'_analytics', $this->_url.'/3rdparty/analytics.js', array('jquery'), self::version, false);
    191196
     
    274279          break;
    275280        case "default_enable":
    276           if (!in_array($val, array("0", "1")))
    277             return false;
    278           break;
    279281        case "is_demo":
     282        case "homepage_enable":
    280283          if (!in_array($val, array("0", "1")))
    281284            return false;
     
    439442
    440443    // Don't show by default, but do if activated
    441     if (is_home() || // Don't show on home page
    442       (!is_single() && !is_page()) || // Don't show on non posts/pages
    443       (is_single() && get_post_meta($post->ID, '_hellotoken', true) !== "1") || // Don't show by default, but do if activated
    444       (is_page() && get_post_meta($post->ID, '_hellotoken', true) !== "1")
    445     ) {
    446       return;
    447     }
    448 
    449     wp_enqueue_script(__class__.'_hellotoken', $this->_url.'/hellotoken/hellotoken47.js', array('jquery'), self::version, false);
     444    $show_hellotoken = false;
     445    if (is_home() && $this->getSetting('homepage_enable') == "1") {
     446      $show_hellotoken = true;
     447    } elseif ((is_single() || is_page()) &&
     448              (get_post_meta($post->ID, '_hellotoken', true) === "1")) {
     449      $show_hellotoken = true;
     450    }
     451
     452    if (!$show_hellotoken) { return; }
     453
     454    wp_enqueue_script(__class__.'_hellotoken', $this->_url.'/hellotoken/hellotoken48.js', array('jquery'), self::version, false);
    450455    wp_enqueue_style(__class__.'_style', $this->_url.'/hellotoken/style1.css', array(), self::version, false);
    451456    wp_enqueue_script(__class__.'_analytics', $this->_url.'/3rdparty/analytics.js', array('jquery'), self::version, false);
  • hellotoken/trunk/hellotoken/hellotoken48.js

    r1454923 r1459144  
    473473            style.setProperty('height', '100%', 'important');
    474474            style.setProperty('width', '100%', 'important');
    475             style.setProperty('position', 'fixed', 'important');
    476             style.setProperty('overflow', 'hidden', 'important');
     475            // style.setProperty('position', 'fixed', 'important');
     476            // style.setProperty('overflow', 'hidden', 'important');
    477477        }
    478478    };
  • hellotoken/trunk/hellotoken/style1.css

    r1454301 r1459144  
    1010
    1111#hellotoken-dialog iframe {
    12    position: absolute;
     12   position: fixed;
    1313   top: 0;
    1414   bottom: 0;
  • hellotoken/trunk/readme.txt

    r1454272 r1459144  
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
    1010
    11 HelloToken is a clean and easy way to monetize your website. HelloToken works by asking a question to your readers when they browse your website.
     11HelloToken is a clean and easy way to monetize your website. HelloToken works by asking your readers a question in exchange for article access.
    1212
    1313== Description ==
    1414
    15 HelloToken is a clean and easy way to monetize your website. HelloToken works by asking a question to readers when they access posts or pages on your website. When one of your readers answers a question, you earn 3 cents.
     15HelloToken is a clean and easy way to monetize your website. HelloToken works by asking your readers a question in exchange for article access. Anytime one of your readers answers a question, you earn 3 cents. It's FREE to use; in fact, we pay you!
    1616
    1717We only ask one question at a time and you can customize the reader experience:
    1818
    19 -Add your own logo, blog name and color to the question box (via your account on our website).
    20 -Choose which articles HelloToken questions show up on from the WordPress bulk edit page.
    21 -Choose how much content readers can access before seeing a question on the plugin settings page.
     19Add your own logo, blog name and color to the question box (via our website).
     20Select exactly which articles HelloToken questions show up on.
     21Choose how much content readers can access before seeing a question.
     22Pick whether the question is mandatory or optional for your readers.
    2223
    23 After you install the plugin, head to our website and create an account. HelloToken is currently in a closed beta, so once you create an account, you will be added to a waitlist. Our team is hard at work approving publishers and will be in touch with you after you sign up. Once the process is complete, you will be able to see analytics on how users interact with HelloToken on your website.
     24After you install the plugin, head to our website and create an account. HelloToken is currently in a closed beta, so once you create an account, you will be added to a waitlist. Our team is hard at work approving publishers and will be in touch with you after you sign up. Once the process is complete, you will be able to see analytics on how readers interact with HelloToken on your website.
    2425
    2526== Installation ==
     
    27281. Upload the plugin files to the `/wp-content/plugins/hellotoken` directory, or install the plugin through the WordPress plugins screen directly.
    28292. Activate the plugin through the 'Plugins' screen in WordPress
    29 3. Use the Settings->HelloToken screen to configure the plugin and add your Cliend ID (obtained from your HelloToken.com profile page)
    30 4. Activate HelloToken on the desired posts and pages through the WordPress bulk edit feature.
     303. Use the Settings->HelloToken screen to configure the plugin and add your Client ID (obtained from your HelloToken.com profile page)
     314. Activate HelloToken on desired posts and pages through the WordPress bulk edit feature.
    3132
    3233== Frequently Asked Questions ==
     
    3839= So how do I use this thing? =
    3940
    40 Once you're a verified account, you'll a receive a client ID in your account settings. Use it and closely follow this guide to set up HelloToken on your WordPress site. Fill out your domain in your account settings (and optionally provide a site logo), and you should start seeing questions appear on your site! You can track the number of responses for your articles by visiting your dashboard.
     41Once you're a verified account, you'll a receive a client ID in your account settings. Use it and closely follow this guide to set up HelloToken on your WordPress site. Fill out your domain in your account settings (and optionally provide a site logo), and you should start seeing questions appear on your site! You can track the number of responses for your articles by visiting your dashboard. (See this page for more details: http://blog.hellotoken.com/2015/04/06/26/)
    4142
    4243= The most important question: how do I get paid? =
     
    64651. Activate the plugin
    6566
    66 
    67672. HelloToken settings page. If you see this red banner, then there is something wrong with your ID. Double check that you entered everything correctly until you see the green banner.
    6868
     
    7575== Changelog ==
    7676
     77= 1.48 =
     78* Added option to enable HelloToken on home page
     79
     80* Updated settings page messaging system
     81
     82* Fixed bug related to settings page form not rendering for some users
     83
     84* Code optimization
     85
    7786= 1.47 =
    7887* Some code optimizing
     
    8291
    8392== Upgrade Notice ==
     93
     94= 1.48 =
     95This version adds more functionality to the plugin.
    8496
    8597= 1.47 =
Note: See TracChangeset for help on using the changeset viewer.