Extends the CF7 autofill/memory to include select menus and checkboxes#2098
Extends the CF7 autofill/memory to include select menus and checkboxes#2098patphg wants to merge 4 commits intochrisblakley:mainfrom
Conversation
Select menus were plug and play. Checkboxes were also similarly simple to add/retrieve. I did *not* investigate the "update matching form fields on other windows/tabs" feature as I don't fully understand how it triggers/works.
|
Hold on for this, I discovered that my local storage entries were cached in, so I need to write a bit more to get them setting properly the initial page visit. I must have had it working at some point or else the entries wouldn't exist to be changed... few more edits I guess. |
This reverts commit f7d130f.
|
I went down a whole rabbithole and I'm starting over, so next time I push code take a look at it fresh, basically. |
|
This has been rewritten to add checkboxes and radio buttons now. I'll try to explain the general idea of what's happening: On interaction, radios, text, selects, checkboxes, etc. are stored as their To sum it up, on page load, logic happens and radio buttons and checkboxes are set to Multi-window/multi-tab updating is working for these input types, too. The AJAX submit fail condition is also updated. This new script removes some Finally, this now adds a class |
chrisblakley
left a comment
There was a problem hiding this comment.
My notes– just minor stuff.
| jQuery(this).val(thisLocalStorageVal).trigger('keyup'); | ||
| if ( thisLocalStorageVal !== null ){ | ||
| if ( jQuery(this).attr('type') === 'checkbox' || jQuery(this).attr('type') === 'radio' ){ | ||
| jQuery(this).prop('checked', (jQuery(this).val() === thisLocalStorageVal)); |
There was a problem hiding this comment.
I'm not a huge fan of the conditional within the setting part of this itself. Let's set a variable for that with a comment explanation.
| if ( !jQuery(this).hasClass('do-not-store') && !jQuery(this).hasClass('.wpcf7-captchar') && thisLocalStorageVal && thisLocalStorageVal !== 'undefined' && thisLocalStorageVal !== '' ){ | ||
| if ( jQuery(this).val() === '' ){ //Don't overwrite a field that already has text in it! | ||
| jQuery(this).val(thisLocalStorageVal).trigger('keyup'); | ||
| if ( thisLocalStorageVal !== null ){ |
There was a problem hiding this comment.
We're checking if thisLocalStorageVal is not null, undefined, or an empty string above (line 2734). Is this conditional redundant?
| if ( thisLocalStorageVal !== null ){ | ||
| if ( jQuery(this).attr('type') === 'checkbox' || jQuery(this).attr('type') === 'radio' ){ | ||
| jQuery(this).prop('checked', (jQuery(this).val() === thisLocalStorageVal)); | ||
| } else { |
There was a problem hiding this comment.
I'd love if we could find a way to not need this else... it seems tantalizingly close, but it may be necessary.
| if ( !jQuery(this).hasClass('do-not-store') && !jQuery(this).hasClass('.wpcf7-captchar') ){ | ||
| jQuery(this).val(localStorage.getItem('cf7_' + jQuery(this).attr('name'))).trigger('keyup'); | ||
| var thisLocalStorageVal = localStorage.getItem('cf7_' + jQuery(this).attr('name')); | ||
| if ( thisLocalStorageVal !== null ){ |
There was a problem hiding this comment.
Could this simply be:
| if ( thisLocalStorageVal !== null ){ | |
| if ( thisLocalStorageVal ){ |
| var thisLocalStorageVal = localStorage.getItem('cf7_' + jQuery(this).attr('name')); | ||
| if ( thisLocalStorageVal !== null ){ | ||
| if ( jQuery(this).attr('type') === 'checkbox' || jQuery(this).attr('type') === 'radio' ){ | ||
| jQuery(this).prop('checked', (jQuery(this).val() === thisLocalStorageVal)); |
There was a problem hiding this comment.
Same note as above, let's throw the string to boolean conversion into a variable (with comment explanation) instead of doing it all inline. We're going to forget what this does after a while.
| if ( jQuery(this).attr('type') === 'checkbox' || jQuery(this).attr('type') === 'radio' ){ | ||
| jQuery(this).prop('checked', (jQuery(this).val() === thisLocalStorageVal)); | ||
| } else { | ||
| jQuery(this).val( thisLocalStorageVal ); |
There was a problem hiding this comment.
Just to be consistent with the rest of Nebula:
| jQuery(this).val( thisLocalStorageVal ); | |
| jQuery(this).val(thisLocalStorageVal); |
| if ( window.location.hash.indexOf('wpcf7') > 0 ){ | ||
| if ( jQuery(escape(window.location.hash) + ' .wpcf7-mail-sent-ok').length ){ | ||
| jQuery(escape(window.location.hash) + ' .wpcf7-textarea, ' + escape(window.location.hash) + ' .wpcf7-text').each(function(){ | ||
| jQuery(escape(window.location.hash) + ' .wpcf7-textarea, ' + escape(window.location.hash) + ' .wpcf7-text, ' + escape(window.location.hash) + ' .wpcf7-checkbox input, ' + escape(window.location.hash) + ' .wpcf7-radio input, ' + escape(window.location.hash) + ' .wpcf7-select, ').each(function(){ |
There was a problem hiding this comment.
Since we're adding the escape() a bunch, let's set it to a variable above 2780 and then use that variable as needed.
Select menu inputs were plug and play.
Checkbox inputs require a different approach but are also simple to add/retrieve.
I did not investigate the "update matching form fields on other windows/tabs" feature as I don't fully understand how it triggers/works...