Changeset 1459144
- Timestamp:
- 07/22/2016 05:24:54 PM (10 years ago)
- Location:
- hellotoken/trunk
- Files:
-
- 1 added
- 1 deleted
- 7 edited
- 1 moved
-
admin/settings.php (modified) (2 diffs)
-
admin/settings6.js (modified) (12 diffs)
-
admin/settingsForm.php (added)
-
form/form.css (modified) (2 diffs)
-
form/form6.js (modified) (11 diffs)
-
form/settingsForm.php (deleted)
-
hellotoken.php (modified) (6 diffs)
-
hellotoken/hellotoken48.js (moved) (moved from hellotoken/trunk/hellotoken/hellotoken47.js) (1 diff)
-
hellotoken/style1.css (modified) (1 diff)
-
readme.txt (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
hellotoken/trunk/admin/settings.php
r1454923 r1459144 16 16 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. 17 17 </div> 18 <div class="hellotoken-form- errors" style="display: none;">18 <div class="hellotoken-form-id-errors" style="display: none;"> 19 19 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>). 20 20 </div> 21 <div class="hellotoken-form-errors" style="display: none;"> 22 </div> 23 21 24 22 25 <ul class="hellotoken-tabs"> … … 30 33 31 34 <div id="hellotoken_form"> 32 <?php require __DIR__.'/../form/settingsForm.php' ?>35 <?php require_once dirname(__FILE__).'/settingsForm.php' ?> 33 36 </div> 34 37 -
hellotoken/trunk/admin/settings6.js
r1454923 r1459144 11 11 var pathName = window.location.pathname + "?page=HelloToken"; 12 12 13 function helloTokenAppendMessage(msg) {14 if (msg !== undefined) {15 $('.hellotoken-append-message').show().html(msg); // display message from Ruby16 }17 }18 19 function helloTokenShowAmount(msg) {20 $('.hellotoken-show-amount').show().html(msg);21 }22 23 13 // init settings form 24 14 $form.HelloTokenForm({ … … 27 17 }); 28 18 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 } 39 40 40 41 // save settings … … 65 66 "version": version // check version of plugin 66 67 }, 68 timeout: 10000, 67 69 success: function(data) { 68 70 var msg, pub_cash; … … 78 80 console.log("HT: Url Mismatch. Action aborted."); 79 81 // Append message if it is available from the Ruby backend 80 helloTokenAppendMessage(msg );82 helloTokenAppendMessage(msg, true); 81 83 } else if (data[1] == 3) { 82 84 $form.HelloTokenForm('helloTokenAnnounceIDFailure'); … … 84 86 console.log("HT: Bad ClientID. Action aborted."); 85 87 // Append message if it is available from the Ruby backend 86 helloTokenAppendMessage(msg );88 helloTokenAppendMessage(msg, true); 87 89 } 88 90 } else { … … 96 98 console.log("HT: Url Mismatch. Action aborted."); 97 99 // Append message if it is available from the Ruby backend 98 helloTokenAppendMessage(msg );100 helloTokenAppendMessage(msg, true); 99 101 } else if (data[0] == 3) { 100 102 $form.HelloTokenForm('helloTokenAnnounceIDFailure'); … … 102 104 console.log("HT: Bad ClientID. Action aborted."); 103 105 // Append message if it is available from the Ruby backend 104 helloTokenAppendMessage(msg );106 helloTokenAppendMessage(msg, true); 105 107 } 106 108 } 107 109 }, 108 110 error: function(data){ 111 $form.HelloTokenForm('helloTokenDisplayErrors', 112 'Error connecting to HelloToken servers. Please try again later.'); 109 113 console.log("HT: Couldn't verify client ID. Action aborted."); 110 114 } … … 118 122 $allDisableButton.addClass('disabled'); 119 123 } 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 }); 120 135 121 136 $allEnableButton.on('click', function(e) { … … 131 146 helloTokenAppendMessage('HelloToken successfully enabled on all posts.'); 132 147 return true; 133 }).error(function() { 148 }).fail(function() { 149 $form.HelloTokenForm('helloTokenDisplayErrors', 150 'Error updating Wordpress database. Action aborted.'); 134 151 helloTokenShowLoader(false); 135 152 return false; … … 149 166 helloTokenAppendMessage('HelloToken successfully disabled on all posts.'); 150 167 return true; 151 }).error(function() { 168 }).fail(function() { 169 $form.HelloTokenForm('helloTokenDisplayErrors', 170 'Error updating Wordpress database. Action aborted.'); 152 171 helloTokenShowLoader(false); 153 172 return false; … … 177 196 // Append message if it is available from the Ruby backend 178 197 if ('msg' in data) 179 helloTokenAppendMessage(data.msg );198 helloTokenAppendMessage(data.msg, true); 180 199 181 200 // allow the toggle buttons to be used now … … 186 205 } 187 206 else { 188 helloTokenAppendMessage("Wordpress authentication failure."); 207 $form.HelloTokenForm('helloTokenDisplayErrors', 208 'Wordpress authentication failure. Please check your credentials and try again.'); 189 209 return false; 190 210 } 191 }).error(function() { 211 }).fail(function() { 212 $form.HelloTokenForm('helloTokenDisplayErrors', 213 'Error updating Wordpress database. Action aborted.'); 192 214 helloTokenShowLoader(false); 193 215 return false; -
hellotoken/trunk/form/form.css
r1454923 r1459144 117 117 /* added for tabs */ 118 118 /* colors from bootstrap */ 119 .hellotoken-form-id-errors, 120 .hellotoken-form-url-errors, 119 121 .hellotoken-form-errors, 120 .hellotoken-form-url-errors,121 122 .hellotoken-form-success, 122 123 .hellotoken-form-demo, … … 173 174 } 174 175 175 div.hellotoken-button-red { 176 /** need to override the WP colors **/ 176 /*div.hellotoken-button-red { 177 177 background-color: pink !important; 178 178 cursor: not-allowed; 179 } 179 }*/ 180 180 181 181 div.hellotoken-button-red:hover { 182 /** need to override the WP colors **/183 182 background-color: pink !important; 184 183 } 185 184 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 }*/ 190 188 191 189 div.hellotoken-button-green:hover { -
hellotoken/trunk/form/form6.js
r1454923 r1459144 20 20 redirect_type: 0, 21 21 redirect_url: '', 22 default_enable: 1 22 default_enable: 1, 23 homepage_enable: 0 23 24 }; 24 25 … … 62 63 63 64 this.options.onInit.call(this); 64 65 this.helloTokenFillOtherSettings();66 65 } 67 66 … … 71 70 // variables 72 71 var helloTokenVersion = HelloToken.version; 73 74 // fill in all the settings that aren't nice inputs and text boxes75 proto.helloTokenFillOtherSettings = function() {76 form = this;77 // checkboxes78 $("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 };90 72 91 73 proto.helloTokenMakeTemplate = function() { … … 132 114 133 115 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 135 129 } 136 130 … … 159 153 160 154 for (var i in settings) { 161 if (i =="choices" && this.form.hasOwnProperty(i)) {162 155 if (i == "choices" && this.form.hasOwnProperty(i)) { 156 // deprecated! 163 157 } 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); 166 173 } 167 174 }; … … 172 179 173 180 for (var i in this.default_settings) { 174 settings[i] = this. form[i].val();181 settings[i] = this.helloTokenGetSetting($(this.form[i])); 175 182 } 176 183 177 184 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 } 178 202 }; 179 203 … … 187 211 188 212 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(); 192 216 $('.hellotoken-show-amount').show(); 193 $('.hellotoken- form-success').hide();217 $('.hellotoken-append-message').not(":eq(0)").remove(); 194 218 $('.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 // } 200 232 } 201 233 }; … … 211 243 }; 212 244 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) { 214 254 var errors = this.errors; 215 255 216 if (errors.length > 0 ) {256 if (errors.length > 0 || errorMsg) { 217 257 $('html, body').animate({ scrollTop: this.el.offset().top }); 218 258 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')){ 220 268 $('.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); 228 275 $('.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();242 276 } 243 277 } else { 278 $('.hellotoken-form-id-errors').hide(); 279 $('.hellotoken-form-url-errors').hide(); 280 $('.hellotoken-form-errors').text(""); 244 281 $('.hellotoken-form-errors').hide(); 245 $('.hellotoken-form-url-errors').hide();246 $('.hellotoken-append-message').hide();247 282 } 248 283 }; … … 252 287 this.errors = []; 253 288 var errors = this.errors; 254 var that = this;255 289 256 290 var free_content_count = this.form.free_content_count.val(); … … 261 295 if (show_delay < 0 || isNaN(show_delay) || show_delay > 20) 262 296 errors.push('show_delay'); 263 264 // Checkboxes have value checked on validation265 // --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 unchecked270 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 });279 297 280 298 this.helloTokenDisplayErrors(); … … 291 309 // if valid instance then perform calls on the class 292 310 if (inst && options) { 293 if (inst[options]) 311 if (inst[options]){ 294 312 return inst[options].apply(inst, Array.prototype.slice.call(arguments, 1)); 313 } 295 314 296 315 return inst; -
hellotoken/trunk/hellotoken.php
r1454923 r1459144 1 1 <?php 2 define('HELLOTOKEN_VERSION', 1.4 7);2 define('HELLOTOKEN_VERSION', 1.48); 3 3 4 4 // Plugin Name: HelloToken 5 5 // Plugin URI: http://wordpress.org/plugins/hellotoken/ 6 6 // Description: Beautifully ask readers questions and/or earn cold hard cash for each user that visits your site. 7 // Version: 1.4 77 // Version: 1.48 8 8 // Author: hellotoken.com 9 9 // Author URI: http://hellotoken.com … … 33 33 // default settings definition, will be used as initial settings 34 34 $this->default_settings = array( 35 // crucial options 35 36 'homepage_url' => get_site_url(), 36 37 'company_name' => '', 37 38 'company_logo' => '', 38 39 'client_id' => '', 39 'free_content_count' => '0',40 40 'question' => '', 41 'show_delay' => 0,42 'is_demo' => 0,43 41 44 42 // 0 - do nothing, 1 - home page, 2 - custom url … … 48 46 // 0 - new articles auto disabled, 1 - auto enabled 49 47 '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 50 55 ); 51 56 … … 187 192 188 193 // hellotoken 189 wp_enqueue_script(__class__.'_hellotoken', $this->_url.'/hellotoken/hellotoken4 7.js', array('jquery'), self::version, false);194 wp_enqueue_script(__class__.'_hellotoken', $this->_url.'/hellotoken/hellotoken48.js', array('jquery'), self::version, false); 190 195 wp_enqueue_script(__class__.'_analytics', $this->_url.'/3rdparty/analytics.js', array('jquery'), self::version, false); 191 196 … … 274 279 break; 275 280 case "default_enable": 276 if (!in_array($val, array("0", "1")))277 return false;278 break;279 281 case "is_demo": 282 case "homepage_enable": 280 283 if (!in_array($val, array("0", "1"))) 281 284 return false; … … 439 442 440 443 // 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); 450 455 wp_enqueue_style(__class__.'_style', $this->_url.'/hellotoken/style1.css', array(), self::version, false); 451 456 wp_enqueue_script(__class__.'_analytics', $this->_url.'/3rdparty/analytics.js', array('jquery'), self::version, false); -
hellotoken/trunk/hellotoken/hellotoken48.js
r1454923 r1459144 473 473 style.setProperty('height', '100%', 'important'); 474 474 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'); 477 477 } 478 478 }; -
hellotoken/trunk/hellotoken/style1.css
r1454301 r1459144 10 10 11 11 #hellotoken-dialog iframe { 12 position: absolute;12 position: fixed; 13 13 top: 0; 14 14 bottom: 0; -
hellotoken/trunk/readme.txt
r1454272 r1459144 9 9 License URI: http://www.gnu.org/licenses/gpl-2.0.html 10 10 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.11 HelloToken is a clean and easy way to monetize your website. HelloToken works by asking your readers a question in exchange for article access. 12 12 13 13 == Description == 14 14 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.15 HelloToken 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! 16 16 17 17 We only ask one question at a time and you can customize the reader experience: 18 18 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. 19 Add your own logo, blog name and color to the question box (via our website). 20 Select exactly which articles HelloToken questions show up on. 21 Choose how much content readers can access before seeing a question. 22 Pick whether the question is mandatory or optional for your readers. 22 23 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.24 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 readers interact with HelloToken on your website. 24 25 25 26 == Installation == … … 27 28 1. Upload the plugin files to the `/wp-content/plugins/hellotoken` directory, or install the plugin through the WordPress plugins screen directly. 28 29 2. Activate the plugin through the 'Plugins' screen in WordPress 29 3. Use the Settings->HelloToken screen to configure the plugin and add your Clien dID (obtained from your HelloToken.com profile page)30 4. Activate HelloToken on thedesired posts and pages through the WordPress bulk edit feature.30 3. Use the Settings->HelloToken screen to configure the plugin and add your Client ID (obtained from your HelloToken.com profile page) 31 4. Activate HelloToken on desired posts and pages through the WordPress bulk edit feature. 31 32 32 33 == Frequently Asked Questions == … … 38 39 = So how do I use this thing? = 39 40 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. 41 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. (See this page for more details: http://blog.hellotoken.com/2015/04/06/26/) 41 42 42 43 = The most important question: how do I get paid? = … … 64 65 1. Activate the plugin 65 66 66 67 67 2. 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. 68 68 … … 75 75 == Changelog == 76 76 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 77 86 = 1.47 = 78 87 * Some code optimizing … … 82 91 83 92 == Upgrade Notice == 93 94 = 1.48 = 95 This version adds more functionality to the plugin. 84 96 85 97 = 1.47 =
Note: See TracChangeset
for help on using the changeset viewer.