PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / plugin-search / plugin-search.js
jetpack / modules / plugin-search Last commit date
plugin-search.css 2 months ago plugin-search.js 2 months ago psh-128.png 1 year ago psh-256.png 1 year ago psh.svg 1 year ago
plugin-search.js
244 lines
1 /**
2 * Handles the activation of a Jetpack feature, dismissing the card, and replacing the bottom row
3 * of the card with customized content.
4 */
5
6 /* global jetpackPluginSearch, jpTracksAJAX */
7
8 var JetpackPSH = {};
9
10 ( function ( $, jpsh ) {
11 JetpackPSH = {
12 $pluginFilter: $( '#plugin-filter' ),
13
14 /**
15 * Get parent search hint element.
16 * @return {Element | null}
17 */
18 getCard: function () {
19 return document.querySelector( '.plugin-card-jetpack-plugin-search' );
20 },
21
22 /**
23 * Track user event such as a click on a button or a link.
24 *
25 * @param {string} eventName Event identifier.
26 * @param {object} feature Identifier of feature involved in the event.
27 * @param {object} target Object where action was performed.
28 */
29 trackEvent: function ( eventName, feature, target ) {
30 jpTracksAJAX
31 .record_ajax_event( eventName, 'click', { feature: feature } )
32 .always( function () {
33 if ( 'undefined' !== typeof target && !! target.getAttribute( 'href' ) ) {
34 // If it has an href, follow it.
35 window.location = target.getAttribute( 'href' );
36 }
37 } );
38 },
39
40 /**
41 * Replace bottom row of the card to insert logo, text and link to dismiss the card.
42 */
43 replaceCardBottom: function () {
44 var hint = JetpackPSH.getCard();
45 if ( 'object' === typeof hint && null !== hint ) {
46 hint.querySelector( '.plugin-card-bottom' ).outerHTML =
47 '<div class="jetpack-plugin-search__bottom"><img src="' +
48 jetpackPluginSearch.logo +
49 '" width="32" />' +
50 '<p class="jetpack-plugin-search__text">' +
51 jetpackPluginSearch.legend +
52 ' <a class="jetpack-plugin-search__support_link" href="' +
53 jetpackPluginSearch.supportLink +
54 '" target="_blank" rel="noopener noreferrer" data-track="support_link" >' +
55 jetpackPluginSearch.supportText +
56 '</a>' +
57 '</p>' +
58 '</div>';
59
60 // Remove link and parent li from action links and move it to bottom row
61 var dismissLink = document.querySelector( '.jetpack-plugin-search__dismiss' );
62 dismissLink.parentNode.parentNode.removeChild( dismissLink.parentNode );
63 document.querySelector( '.jetpack-plugin-search__bottom' ).appendChild( dismissLink );
64 }
65 },
66
67 /**
68 * Check if plugin card list nodes changed. If there's a Jetpack PSH card, replace the bottom row.
69 * @param {array} mutationsList
70 */
71 replaceOnNewResults: function ( mutationsList ) {
72 mutationsList.forEach( function ( mutation ) {
73 if (
74 'childList' === mutation.type &&
75 1 === document.querySelectorAll( '.plugin-card-jetpack-plugin-search' ).length
76 ) {
77 JetpackPSH.replaceCardBottom();
78 }
79 } );
80 },
81
82 dismiss: function ( moduleName ) {
83 document.getElementById( 'the-list' ).removeChild( JetpackPSH.getCard() );
84 $.ajax( {
85 url: jpsh.base_rest_url + '/hints',
86 method: 'post',
87 beforeSend: function ( xhr ) {
88 xhr.setRequestHeader( 'X-WP-Nonce', jpsh.nonce );
89 },
90 data: JSON.stringify( {
91 hint: moduleName,
92 } ),
93 contentType: 'application/json',
94 dataType: 'json',
95 } ).done( function () {
96 JetpackPSH.trackEvent( 'wpa_plugin_search_dismiss', moduleName );
97 } );
98 },
99
100 ajaxActivateModule: function ( moduleName ) {
101 var $moduleBtn = JetpackPSH.$pluginFilter.find( '#plugin-select-activate' );
102 $moduleBtn.toggleClass( 'install-now updating-message' );
103 $moduleBtn.prop( 'disabled', true );
104 $moduleBtn.text( jpsh.activating );
105 var data = {};
106 data[ moduleName ] = true;
107 $.ajax( {
108 url: jpsh.base_rest_url + '/settings',
109 method: 'post',
110 beforeSend: function ( xhr ) {
111 xhr.setRequestHeader( 'X-WP-Nonce', jpsh.nonce );
112 },
113 data: JSON.stringify( data ),
114 contentType: 'application/json',
115 dataType: 'json',
116 } )
117 .done( function () {
118 JetpackPSH.updateButton( moduleName );
119 JetpackPSH.trackEvent( 'wpa_plugin_search_activate', moduleName );
120 } )
121 .error( function () {
122 $moduleBtn.toggleClass( 'install-now updating-message' );
123 } );
124 },
125
126 // Remove onclick handler, disable loading spinner, update button to redirect to module settings.
127 updateButton: function ( moduleName ) {
128 $.ajax( {
129 url: jpsh.base_rest_url + '/module/' + moduleName,
130 method: 'get',
131 beforeSend: function ( xhr ) {
132 xhr.setRequestHeader( 'X-WP-Nonce', jpsh.nonce );
133 },
134 dataType: 'json',
135 } ).done( function ( response ) {
136 var $moduleBtn = JetpackPSH.$pluginFilter.find( '#plugin-select-activate' );
137 $moduleBtn.prop( 'onclick', null ).off( 'click' );
138 $moduleBtn.toggleClass( 'install-now updating-message' );
139 $moduleBtn.text( jpsh.activated );
140 setTimeout( function () {
141 var url = 'https://jetpack.com/redirect/?source=plugin-hint-learn-' + moduleName,
142 label = jpsh.getStarted,
143 classes = 'jetpack-plugin-search__primary button',
144 track = 'configure';
145
146 // If the feature has options in Jetpack admin UI, link to them.
147 if ( response.options && 0 < Object.keys( response.options ).length ) {
148 url = $moduleBtn.data( 'configure-url' );
149 label = jpsh.manageSettings;
150 classes += ' jetpack-plugin-search__configure';
151 } else {
152 // If it has no options, the Get started button will be displayed so remove the Learn more link if it's there.
153 var learnMore = document.querySelector( '.jetpack-plugin-search__learn-more' );
154 learnMore.parentNode.removeChild( learnMore );
155 classes += ' jetpack-plugin-search__get-started';
156 track = 'get_started';
157 }
158 $moduleBtn.replaceWith(
159 '<a id="plugin-select-settings" class="' +
160 classes +
161 '" href="' +
162 url +
163 '" data-module="' +
164 moduleName +
165 '" data-track="' +
166 track +
167 '">' +
168 label +
169 '</a>'
170 );
171 }, 1000 );
172 } );
173 },
174
175 /**
176 * Start suggesting.
177 */
178 init: function () {
179 if ( JetpackPSH.$pluginFilter.length < 1 ) {
180 return;
181 }
182
183 // Replace PSH bottom row on page load
184 JetpackPSH.replaceCardBottom();
185
186 // Listen for changes in plugin search results
187 var resultsObserver = new MutationObserver( JetpackPSH.replaceOnNewResults );
188 resultsObserver.observe( document.getElementById( 'plugin-filter' ), { childList: true } );
189
190 JetpackPSH.$pluginFilter
191 .on( 'click', '.jetpack-plugin-search__dismiss', function ( event ) {
192 event.preventDefault();
193 JetpackPSH.dismiss( $( this ).data( 'module' ) );
194 } )
195 .on( 'click', 'button#plugin-select-activate', function ( event ) {
196 event.preventDefault();
197 JetpackPSH.ajaxActivateModule( $( this ).data( 'module' ) );
198 } )
199 .on( 'click', '.jetpack-plugin-search__primary', function ( event ) {
200 var $this = $( this );
201 var opensInNewTab = '_blank' === $this.attr( 'target' );
202 if ( ! opensInNewTab ) {
203 event.preventDefault();
204 }
205 if ( $this.data( 'track' ) ) {
206 // This catches Purchase, Configure, and Get started. Feature activation is tracked when it ends successfully, in its callback.
207 JetpackPSH.trackEvent(
208 'wpa_plugin_search_' + $this.data( 'track' ),
209 $this.data( 'module' ),
210 // only redirect if not opening in a new tab
211 opensInNewTab ? undefined : $this.get( 0 )
212 );
213 }
214 } )
215 .on( 'click', '.jetpack-plugin-search__learn-more', function ( event ) {
216 var $this = $( this );
217 var opensInNewTab = '_blank' === $this.attr( 'target' );
218 if ( ! opensInNewTab ) {
219 event.preventDefault();
220 }
221 JetpackPSH.trackEvent(
222 'wpa_plugin_search_learn_more',
223 $this.data( 'module' ),
224 opensInNewTab ? undefined : $this.get( 0 )
225 );
226 } )
227 .on( 'click', '.jetpack-plugin-search__support_link', function ( event ) {
228 var $this = $( this );
229 var opensInNewTab = '_blank' === $this.attr( 'target' );
230 if ( ! opensInNewTab ) {
231 event.preventDefault();
232 }
233 JetpackPSH.trackEvent(
234 'wpa_plugin_search_support_link',
235 $this.data( 'module' ),
236 opensInNewTab ? undefined : $this.get( 0 )
237 );
238 } );
239 },
240 };
241
242 JetpackPSH.init();
243 } )( jQuery, jetpackPluginSearch );
244